]>
Commit | Line | Data |
---|---|---|
33b5066a VM |
1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* | |
3 | * Copyright (C) 2013 Allied Telesis Labs NZ | |
4 | * Chris Packham, <[email protected]> | |
5 | * | |
6 | * Copyright (C) 2022 YADRO | |
7 | * Viacheslav Mitrofanov <[email protected]> | |
8 | */ | |
9 | ||
10 | #ifndef __NET6_H__ | |
11 | #define __NET6_H__ | |
12 | ||
13 | #include <net.h> | |
14 | #include <linux/ctype.h> | |
15 | ||
16 | /* struct in6_addr - 128 bits long IPv6 address */ | |
17 | struct in6_addr { | |
18 | union { | |
19 | u8 u6_addr8[16]; | |
20 | __be16 u6_addr16[8]; | |
21 | __be32 u6_addr32[4]; | |
22 | } in6_u; | |
23 | ||
24 | #define s6_addr in6_u.u6_addr8 | |
25 | #define s6_addr16 in6_u.u6_addr16 | |
26 | #define s6_addr32 in6_u.u6_addr32 | |
27 | }; | |
28 | ||
29 | #define IN6ADDRSZ sizeof(struct in6_addr) | |
30 | #define INETHADDRSZ sizeof(net_ethaddr) | |
31 | ||
32 | #define PROT_IP6 0x86DD /* IPv6 protocol */ | |
33 | #define PROT_ICMPV6 58 /* ICMPv6 protocol*/ | |
34 | ||
35 | #define IPV6_ADDRSCOPE_INTF 0x01 | |
36 | #define IPV6_ADDRSCOPE_LINK 0x02 | |
37 | #define IPV6_ADDRSCOPE_AMDIN 0x04 | |
38 | #define IPV6_ADDRSCOPE_SITE 0x05 | |
39 | #define IPV6_ADDRSCOPE_ORG 0x08 | |
40 | #define IPV6_ADDRSCOPE_GLOBAL 0x0E | |
41 | ||
42 | #define USE_IP6_CMD_PARAM "-ipv6" | |
43 | ||
44 | /** | |
45 | * struct ipv6hdr - Internet Protocol V6 (IPv6) header. | |
46 | * | |
47 | * IPv6 packet header as defined in RFC 2460. | |
48 | */ | |
49 | struct ip6_hdr { | |
50 | #if defined(__LITTLE_ENDIAN_BITFIELD) | |
51 | u8 priority:4, | |
52 | version:4; | |
53 | #elif defined(__BIG_ENDIAN_BITFIELD) | |
54 | u8 version:4, | |
55 | priority:4; | |
56 | #else | |
57 | #error "Please fix <asm/byteorder.h>" | |
58 | #endif | |
59 | u8 flow_lbl[3]; | |
60 | __be16 payload_len; | |
61 | u8 nexthdr; | |
62 | u8 hop_limit; | |
63 | struct in6_addr saddr; | |
64 | struct in6_addr daddr; | |
65 | }; | |
66 | #define IP6_HDR_SIZE (sizeof(struct ip6_hdr)) | |
67 | ||
68 | /* struct udp_hdr - User Datagram Protocol header */ | |
69 | struct udp_hdr { | |
70 | u16 udp_src; /* UDP source port */ | |
71 | u16 udp_dst; /* UDP destination port */ | |
72 | u16 udp_len; /* Length of UDP packet */ | |
73 | u16 udp_xsum; /* Checksum */ | |
74 | } __packed; | |
75 | ||
76 | /* | |
77 | * Handy for static initialisations of struct in6_addr, atlhough the | |
78 | * c99 '= { 0 }' idiom might work depending on you compiler. | |
79 | */ | |
80 | #define ZERO_IPV6_ADDR { { { 0x00, 0x00, 0x00, 0x00, \ | |
81 | 0x00, 0x00, 0x00, 0x00, \ | |
82 | 0x00, 0x00, 0x00, 0x00, \ | |
83 | 0x00, 0x00, 0x00, 0x00 } } } | |
84 | ||
85 | #define IPV6_LINK_LOCAL_PREFIX 0xfe80 | |
86 | ||
87 | /* hop limit for neighbour discovery packets */ | |
88 | #define IPV6_NDISC_HOPLIMIT 255 | |
89 | #define NDISC_TIMEOUT 5000UL | |
90 | #define NDISC_TIMEOUT_COUNT 3 | |
91 | ||
92 | /* struct icmp6hdr - Internet Control Message Protocol header for IPV6 */ | |
93 | struct icmp6hdr { | |
94 | u8 icmp6_type; | |
95 | #define IPV6_ICMP_ECHO_REQUEST 128 | |
96 | #define IPV6_ICMP_ECHO_REPLY 129 | |
97 | #define IPV6_NDISC_ROUTER_SOLICITATION 133 | |
98 | #define IPV6_NDISC_ROUTER_ADVERTISEMENT 134 | |
99 | #define IPV6_NDISC_NEIGHBOUR_SOLICITATION 135 | |
100 | #define IPV6_NDISC_NEIGHBOUR_ADVERTISEMENT 136 | |
101 | #define IPV6_NDISC_REDIRECT 137 | |
102 | u8 icmp6_code; | |
103 | __be16 icmp6_cksum; | |
104 | ||
105 | /* ICMPv6 data */ | |
106 | union { | |
107 | __be32 un_data32[1]; | |
108 | __be16 un_data16[2]; | |
109 | u8 un_data8[4]; | |
110 | ||
111 | /* struct icmpv6_echo - echo request/reply message format */ | |
112 | struct icmpv6_echo { | |
113 | __be16 identifier; | |
114 | __be16 sequence; | |
115 | } u_echo; | |
116 | ||
117 | /* struct icmpv6_nd_advt - Neighbor Advertisement format */ | |
118 | struct icmpv6_nd_advt { | |
119 | #if defined(__LITTLE_ENDIAN_BITFIELD) | |
120 | __be32 reserved:5, | |
121 | override:1, | |
122 | solicited:1, | |
123 | router:1, | |
124 | reserved2:24; | |
125 | #elif defined(__BIG_ENDIAN_BITFIELD) | |
126 | __be32 router:1, | |
127 | solicited:1, | |
128 | override:1, | |
129 | reserved:29; | |
130 | #else | |
131 | #error "Please fix <asm/byteorder.h>" | |
132 | #endif | |
133 | } u_nd_advt; | |
134 | ||
135 | /* struct icmpv6_nd_ra - Router Advertisement format */ | |
136 | struct icmpv6_nd_ra { | |
137 | u8 hop_limit; | |
138 | #if defined(__LITTLE_ENDIAN_BITFIELD) | |
139 | u8 reserved:6, | |
140 | other:1, | |
141 | managed:1; | |
142 | ||
143 | #elif defined(__BIG_ENDIAN_BITFIELD) | |
144 | u8 managed:1, | |
145 | other:1, | |
146 | reserved:6; | |
147 | #else | |
148 | #error "Please fix <asm/byteorder.h>" | |
149 | #endif | |
150 | __be16 rt_lifetime; | |
151 | } u_nd_ra; | |
152 | } icmp6_dataun; | |
153 | #define icmp6_identifier icmp6_dataun.u_echo.identifier | |
154 | #define icmp6_sequence icmp6_dataun.u_echo.sequence | |
155 | #define icmp6_pointer icmp6_dataun.un_data32[0] | |
156 | #define icmp6_mtu icmp6_dataun.un_data32[0] | |
157 | #define icmp6_unused icmp6_dataun.un_data32[0] | |
158 | #define icmp6_maxdelay icmp6_dataun.un_data16[0] | |
159 | #define icmp6_router icmp6_dataun.u_nd_advt.router | |
160 | #define icmp6_solicited icmp6_dataun.u_nd_advt.solicited | |
161 | #define icmp6_override icmp6_dataun.u_nd_advt.override | |
162 | #define icmp6_ndiscreserved icmp6_dataun.u_nd_advt.reserved | |
163 | #define icmp6_hop_limit icmp6_dataun.u_nd_ra.hop_limit | |
164 | #define icmp6_addrconf_managed icmp6_dataun.u_nd_ra.managed | |
165 | #define icmp6_addrconf_other icmp6_dataun.u_nd_ra.other | |
166 | #define icmp6_rt_lifetime icmp6_dataun.u_nd_ra.rt_lifetime | |
167 | }; | |
168 | ||
169 | extern struct in6_addr const net_null_addr_ip6; /* NULL IPv6 address */ | |
170 | extern struct in6_addr net_gateway6; /* Our gateways IPv6 address */ | |
171 | extern struct in6_addr net_ip6; /* Our IPv6 addr (0 = unknown) */ | |
172 | extern struct in6_addr net_link_local_ip6; /* Our link local IPv6 addr */ | |
173 | extern u32 net_prefix_length; /* Our prefixlength (0 = unknown) */ | |
174 | extern struct in6_addr net_server_ip6; /* Server IPv6 addr (0 = unknown) */ | |
175 | extern bool use_ip6; | |
176 | ||
177 | /** | |
178 | * string_to_ip6() - Convert IPv6 string addr to inner IPV6 addr format | |
179 | * | |
180 | * Examples of valid strings: | |
181 | * 2001:db8::0:1234:1 | |
182 | * 2001:0db8:0000:0000:0000:0000:1234:0001 | |
183 | * ::1 | |
184 | * ::ffff:192.168.1.1 | |
185 | * | |
186 | * Examples of invalid strings | |
187 | * 2001:db8::0::0 (:: can only appear once) | |
188 | * 2001:db8:192.168.1.1::1 (v4 part can only appear at the end) | |
189 | * 192.168.1.1 (we don't implicity map v4) | |
190 | * | |
191 | * @s: IPv6 string addr format | |
192 | * @len: IPv6 string addr length | |
193 | * @addr: converted IPv6 addr | |
194 | * Return: 0 if conversion successful, -EINVAL if fail | |
195 | */ | |
196 | static inline int | |
197 | string_to_ip6(const char *s, size_t len, struct in6_addr *addr) | |
198 | { | |
199 | return -EINVAL; | |
200 | } | |
201 | ||
202 | /** | |
203 | * ip6_is_unspecified_addr() - Check if IPv6 addr is not set i.e. is zero | |
204 | * | |
205 | * @addr: IPv6 addr | |
206 | * Return: 0 if addr is not set, -1 if is set | |
207 | */ | |
208 | static inline int ip6_is_unspecified_addr(struct in6_addr *addr) | |
209 | { | |
210 | return -1; | |
211 | } | |
212 | ||
213 | /** | |
214 | * ip6_is_our_addr() - Check if IPv6 addr belongs to our host addr | |
215 | * | |
216 | * We have 2 addresses that we should respond to. A link local address and a | |
217 | * global address. This returns true if the specified address matches either | |
218 | * of these. | |
219 | * | |
220 | * @addr: addr to check | |
221 | * Return: 0 if addr is our, -1 otherwise | |
222 | */ | |
223 | static inline int ip6_is_our_addr(struct in6_addr *addr) | |
224 | { | |
225 | return -1; | |
226 | } | |
227 | ||
228 | /** | |
229 | * ip6_addr_in_subnet() - Check if two IPv6 addresses are in the same subnet | |
230 | * | |
231 | * @our_addr: first IPv6 addr | |
232 | * @neigh_addr: second IPv6 addr | |
233 | * @prefix_length: network mask length | |
234 | * Return: 0 if two addresses in the same subnet, -1 otherwise | |
235 | */ | |
236 | static inline int | |
237 | ip6_addr_in_subnet(struct in6_addr *our_addr, struct in6_addr *neigh_addr, | |
238 | u32 prefix_length) | |
239 | { | |
240 | return -1; | |
241 | } | |
242 | ||
243 | /** | |
244 | * ip6_make_lladd() - rMake up IPv6 Link Local address | |
245 | * | |
246 | * @lladdr: formed IPv6 Link Local address | |
247 | * @enetaddr: MAC addr of a device | |
248 | */ | |
249 | static inline void | |
250 | ip6_make_lladdr(struct in6_addr *lladdr, unsigned char const enetaddr[6]) | |
251 | { | |
252 | } | |
253 | ||
254 | /** | |
255 | * ip6_make_snma() - aMake up Solicited Node Multicast Address from IPv6 addr | |
256 | * | |
257 | * @mcast_addr: formed SNMA addr | |
258 | * @ip6_addr: base IPv6 addr | |
259 | */ | |
260 | static inline void | |
261 | ip6_make_snma(struct in6_addr *mcast_addr, struct in6_addr *ip6_addr) | |
262 | { | |
263 | } | |
264 | ||
265 | /** | |
266 | * ip6_make_mult_ethdstaddr() - Make up IPv6 multicast addr | |
267 | * | |
268 | * @enetaddr: MAC addr of a device | |
269 | * @mcast_addr: formed IPv6 multicast addr | |
270 | */ | |
271 | static inline void | |
272 | ip6_make_mult_ethdstaddr(unsigned char enetaddr[6], | |
273 | struct in6_addr *mcast_addr) | |
274 | { | |
275 | } | |
276 | ||
277 | /** | |
278 | * csum_partial() - Compute an internet checksum | |
279 | * | |
280 | * @buff: buffer to be checksummed | |
281 | * @len: length of buffer | |
282 | * @sum: initial sum to be added in | |
283 | * Return: internet checksum of the buffer | |
284 | */ | |
285 | static inline unsigned int | |
286 | csum_partial(const unsigned char *buff, int len, unsigned int sum) | |
287 | { | |
288 | return 0; | |
289 | } | |
290 | ||
291 | /** | |
292 | * csum_ipv6_magic() - Compute checksum of IPv6 "psuedo-header" per RFC2460 section 8.1 | |
293 | * | |
294 | * @saddr: source IPv6 addr | |
295 | * @daddr: destination IPv6 add | |
296 | * @len: data length to be checksummed | |
297 | * @proto: IPv6 above protocol code | |
298 | * @csum: upper layer checksum | |
299 | * Return: computed checksum | |
300 | */ | |
301 | static inline unsigned short | |
302 | csum_ipv6_magic(struct in6_addr *saddr, | |
303 | struct in6_addr *daddr, u16 len, | |
304 | unsigned short proto, unsigned int csum) | |
305 | { | |
306 | return 0; | |
307 | } | |
308 | ||
309 | /** | |
310 | * ip6_add_hdr() - Make up IPv6 header | |
311 | * | |
312 | * @xip: pointer to IPv6 header to be formed | |
313 | * @src: source IPv6 addr | |
314 | * @dest: destination IPv6 addr | |
315 | * @nextheader: next header type | |
316 | * @hoplimit: hop limit | |
317 | * @payload_len: payload length | |
318 | * Return: IPv6 header length | |
319 | */ | |
320 | static inline unsigned int | |
321 | ip6_add_hdr(uchar *xip, struct in6_addr *src, struct in6_addr *dest, | |
322 | int nextheader, int hoplimit, int payload_len) | |
323 | { | |
324 | return 0; | |
325 | } | |
326 | ||
327 | /** | |
328 | * net_send_udp_packet6() - Make up UDP packet and send it | |
329 | * | |
330 | * @ether: destination MAC addr | |
331 | * @dest: destination IPv6 addr | |
332 | * @dport: destination port | |
333 | * @sport: source port | |
334 | * @len: UDP packet length | |
335 | * Return: 0 if send successfully, -1 otherwise | |
336 | */ | |
337 | static inline int | |
338 | net_send_udp_packet6(uchar *ether, struct in6_addr *dest, | |
339 | int dport, int sport, int len) | |
340 | { | |
341 | return -1; | |
342 | } | |
343 | ||
344 | /** | |
345 | * net_ip6_handler() - Handle IPv6 packet | |
346 | * | |
347 | * @et: pointer to the beginning of the packet | |
348 | * @ip6: pointer to the beginning of IPv6 protocol | |
349 | * @len: incoming packet len | |
350 | * Return: 0 if handle packet successfully, -EINVAL in case of invalid protocol | |
351 | */ | |
352 | static inline int | |
353 | net_ip6_handler(struct ethernet_hdr *et, struct ip6_hdr *ip6, | |
354 | int len) | |
355 | { | |
356 | return -EINVAL; | |
357 | } | |
358 | ||
359 | /** | |
360 | * net_copy_ip6() - Copy IPv6 addr | |
361 | * | |
362 | * @to: destination IPv6 addr | |
363 | * @from: source IPv6 addr | |
364 | */ | |
365 | static inline void net_copy_ip6(void *to, const void *from) | |
366 | { | |
367 | } | |
368 | ||
369 | #endif /* __NET6_H__ */ |