[dns] Handle AAAA records
[people/meteger/gpxe.git] / src / include / gpxe / ndp.h
1 #ifndef _GPXE_NDP_H
2 #define _GPXE_NDP_H
3
4 #include <stdint.h>
5 #include <byteswap.h>
6 #include <string.h>
7 #include <gpxe/icmp6.h>
8 #include <gpxe/ip6.h>
9 #include <gpxe/in.h>
10 #include <gpxe/netdevice.h>
11 #include <gpxe/iobuf.h>
12 #include <gpxe/tcpip.h>
13
14 #define NDP_STATE_INVALID 0
15 #define NDP_STATE_INCOMPLETE 1
16 #define NDP_STATE_REACHABLE 2
17 #define NDP_STATE_DELAY 3
18 #define NDP_STATE_PROBE 4
19 #define NDP_STATE_STALE 5
20
21 #define NDP_OPTION_SOURCE_LL        1
22 #define NDP_OPTION_TARGET_LL        2
23 #define NDP_OPTION_PREFIX_INFO      3
24 #define NDP_OPTION_REDIRECT         4
25 #define NDP_OPTION_MTU              5
26
27 struct neighbour_solicit {
28         uint8_t type;
29         uint8_t code;
30         uint16_t csum;
31         uint32_t reserved;
32         struct in6_addr target;
33 };
34
35 struct neighbour_advert {
36         uint8_t type;
37         uint8_t code;
38         uint16_t csum;
39         uint8_t flags;
40         uint8_t reserved;
41         struct in6_addr target;
42 };
43
44 struct router_solicit {
45         uint8_t type;
46         uint8_t code;
47         uint16_t csum;
48         uint32_t reserved;
49 };
50
51 struct router_advert {
52         uint8_t type;
53         uint8_t code;
54         uint16_t csum;
55         uint16_t lifetime;
56         uint16_t hops_flags;
57         uint32_t reachable_time;
58         uint32_t retrans_time;
59 };
60
61 struct ndp_option
62 {
63         uint8_t type;
64         uint8_t length;
65 };
66
67 struct ll_option
68 {
69         uint8_t type;
70         uint8_t length;
71         uint8_t address[6];
72 };
73
74 struct prefix_option
75 {
76         uint8_t type;
77         uint8_t length;
78         uint8_t prefix_len;
79         uint8_t flags_rsvd;
80         uint32_t lifetime;
81         uint32_t pref_lifetime;
82         uint32_t rsvd2;
83         uint8_t prefix[16];
84 };
85
86 #define RADVERT_MANAGED         0x100
87 #define RADVERT_OTHERCONF       0x101
88
89 int ndp_resolve ( struct net_device *netdev, struct in6_addr *src,
90                   struct in6_addr *dest, void *dest_ll_addr );
91
92 int ndp_process_radvert ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
93                           struct sockaddr_tcpip *st_dest, struct net_device *netdev,
94                           struct icmp6_net_protocol *net_protocol );
95
96 int ndp_process_nadvert ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
97                           struct sockaddr_tcpip *st_dest,
98                           struct icmp6_net_protocol *net_protocol );
99
100 int ndp_process_nsolicit ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
101                            struct sockaddr_tcpip *st_dest, struct net_device *netdev,
102                            struct icmp6_net_protocol *net_protocol );
103
104 #endif
105