[ipv6] Change return code handling from router solicits
[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 struct job_interface;
15
16 #define NDP_STATE_INVALID 0
17 #define NDP_STATE_INCOMPLETE 1
18 #define NDP_STATE_REACHABLE 2
19 #define NDP_STATE_DELAY 3
20 #define NDP_STATE_PROBE 4
21 #define NDP_STATE_STALE 5
22
23 #define RSOLICIT_STATE_INVALID  0
24 #define RSOLICIT_STATE_PENDING  1
25 #define RSOLICIT_STATE_COMPLETE 2
26 #define RSOLICIT_STATE_ALMOST   3
27
28 #define RSOLICIT_CODE_NONE      0
29 #define RSOLICIT_CODE_MANAGED   1
30 #define RSOLICIT_CODE_OTHERCONF 2
31
32 #define NDP_OPTION_SOURCE_LL        1
33 #define NDP_OPTION_TARGET_LL        2
34 #define NDP_OPTION_PREFIX_INFO      3
35 #define NDP_OPTION_REDIRECT         4
36 #define NDP_OPTION_MTU              5
37
38 struct rsolicit_info {
39         struct in6_addr router;
40         struct in6_addr prefix;
41         int prefix_length;
42         int no_address; /* No address assignment takes place via this adv. */
43         int flags; /* RSOLICIT_CODE_* flags. */
44 };
45
46 struct neighbour_solicit {
47         uint8_t type;
48         uint8_t code;
49         uint16_t csum;
50         uint32_t reserved;
51         struct in6_addr target;
52 };
53
54 struct neighbour_advert {
55         uint8_t type;
56         uint8_t code;
57         uint16_t csum;
58         uint8_t flags;
59         uint8_t reserved;
60         struct in6_addr target;
61 };
62
63 struct router_solicit {
64         uint8_t type;
65         uint8_t code;
66         uint16_t csum;
67         uint32_t reserved;
68 };
69
70 struct router_advert {
71         uint8_t type;
72         uint8_t code;
73         uint16_t csum;
74         uint8_t hop_limit;
75         uint8_t rsvd_flags;
76         uint16_t lifetime;
77         uint32_t reachable_time;
78         uint32_t retrans_time;
79 };
80
81 struct ndp_option
82 {
83         uint8_t type;
84         uint8_t length;
85 };
86
87 struct ll_option
88 {
89         uint8_t type;
90         uint8_t length;
91         uint8_t address[6];
92 };
93
94 struct prefix_option
95 {
96         uint8_t type;
97         uint8_t length;
98         uint8_t prefix_len;
99         uint8_t flags_rsvd;
100         uint32_t lifetime;
101         uint32_t pref_lifetime;
102         uint32_t rsvd2;
103         uint8_t prefix[16];
104 };
105
106 #define RADVERT_MANAGED         ( 1 << 7 )
107 #define RADVERT_OTHERCONF       ( 1 << 6 )
108
109 int ndp_resolve ( struct net_device *netdev, struct in6_addr *src,
110                   struct in6_addr *dest, void *dest_ll_addr );
111
112 int ndp_send_rsolicit ( struct net_device *netdev,
113                         struct job_interface *job,
114                         struct rsolicit_info *meta );
115
116 int ndp_process_radvert ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
117                           struct sockaddr_tcpip *st_dest, struct net_device *netdev,
118                           struct icmp6_net_protocol *net_protocol );
119
120 int ndp_process_nadvert ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
121                           struct sockaddr_tcpip *st_dest,
122                           struct icmp6_net_protocol *net_protocol );
123
124 int ndp_process_nsolicit ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
125                            struct sockaddr_tcpip *st_dest, struct net_device *netdev,
126                            struct icmp6_net_protocol *net_protocol );
127
128 #endif
129