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