e6f6ccd80c59206aac2b1d18cc3dabbea43cf78b
[people/meteger/gpxe.git] / src / include / gpxe / icmp6.h
1 #ifndef _GPXE_ICMP6_H
2 #define _GPXE_ICMP6_H
3
4 /** @file
5  *
6  * ICMP6 protocol
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 #include <gpxe/ip6.h>
13 #include <gpxe/ndp.h>
14
15 #include <gpxe/tables.h>
16
17 struct net_device;
18 struct net_protocol;
19
20 /** A network-layer protocol that relies upon ICMPv6 */
21 struct icmp6_net_protocol {
22         /** Network-layer protocol */
23         struct net_protocol *net_protocol;
24         /** Check existence of address
25          *
26          * @v netdev    Network device
27          * @v net_addr  Network-layer address
28          * @ret rc      Return status code
29          */
30         int ( * check ) ( struct net_device *netdev,
31                           const void *net_addr );
32 };
33
34 /** ICMPv6 protocol table */
35 #define ICMP6_NET_PROTOCOLS \
36         __table ( struct icmp6_net_protocol, "icmp6_net_protocols" )
37
38 /** Declare an ICMPv6 protocol */
39 #define __icmp6_net_protocol __table_entry ( ICMP6_NET_PROTOCOLS, 01 )
40
41 #define ICMP6_NSOLICIT 135
42 #define ICMP6_NADVERT 136
43
44 extern struct tcpip_protocol icmp6_protocol;
45
46 struct icmp6_header {
47         uint8_t type;
48         uint8_t code;
49         uint16_t csum;
50         /* Message body */
51 };
52
53 struct neighbour_solicit {
54         uint8_t type;
55         uint8_t code;
56         uint16_t csum;
57         uint32_t reserved;
58         struct in6_addr target;
59         /* "Compulsory" options */
60         uint8_t opt_type;
61         uint8_t opt_len;
62   /* FIXME:  hack alert */
63         uint8_t opt_ll_addr[6];
64 };
65
66 struct neighbour_advert {
67         uint8_t type;
68         uint8_t code;
69         uint16_t csum;
70         uint8_t flags;
71         uint8_t reserved;
72         struct in6_addr target;
73         uint8_t opt_type;
74         uint8_t opt_len;
75   /* FIXME:  hack alert */
76         uint8_t opt_ll_addr[6];
77 };
78
79 #define ICMP6_FLAGS_ROUTER 0x80
80 #define ICMP6_FLAGS_SOLICITED 0x40
81 #define ICMP6_FLAGS_OVERRIDE 0x20
82
83 int icmp6_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
84                struct sockaddr_tcpip *st_dest, struct net_device *netdev,
85                uint16_t pshdr_csum );
86
87 int icmp6_send_solicit ( struct net_device *netdev, struct in6_addr *src, struct in6_addr *dest );
88
89 #endif /* _GPXE_ICMP6_H */