[dns] Handle AAAA records
[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 #include <gpxe/tcpip.h>
15
16 #include <gpxe/tables.h>
17
18 struct net_device;
19 struct net_protocol;
20
21 /** A network-layer protocol that relies upon ICMPv6 */
22 struct icmp6_net_protocol {
23         /** Network-layer protocol */
24         struct net_protocol *net_protocol;
25         /** Check existence of address
26          *
27          * @v netdev    Network device
28          * @v net_addr  Network-layer address
29          * @ret rc      Return status code
30          */
31         int ( * check ) ( struct net_device *netdev,
32                           const void *net_addr );
33 };
34
35 /** ICMPv6 protocol table */
36 #define ICMP6_NET_PROTOCOLS \
37         __table ( struct icmp6_net_protocol, "icmp6_net_protocols" )
38
39 /** Declare an ICMPv6 protocol */
40 #define __icmp6_net_protocol __table_entry ( ICMP6_NET_PROTOCOLS, 01 )
41
42 #define ICMP6_ECHO_REQUEST      128
43 #define ICMP6_ECHO_RESPONSE     129
44 #define ICMP6_ROUTER_SOLICIT    133
45 #define ICMP6_ROUTER_ADVERT     134
46 #define ICMP6_NSOLICIT          135
47 #define ICMP6_NADVERT           136
48
49 extern struct tcpip_protocol icmp6_protocol;
50
51 struct icmp6_header {
52         uint8_t type;
53         uint8_t code;
54         uint16_t csum;
55         /* Message body */
56 };
57
58 #define ICMP6_FLAGS_ROUTER 0x80
59 #define ICMP6_FLAGS_SOLICITED 0x40
60 #define ICMP6_FLAGS_OVERRIDE 0x20
61
62 int icmp6_rx ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
63                struct sockaddr_tcpip *st_dest, struct net_device *netdev,
64                uint16_t pshdr_csum );
65
66 int icmp6_send_solicit ( struct net_device *netdev, struct in6_addr *src, struct in6_addr *dest );
67
68 int icmp6_send_advert ( struct net_device *netdev, struct in6_addr *src, struct in6_addr *dest );
69
70 #endif /* _GPXE_ICMP6_H */