ipv6.h
Go to the documentation of this file.
1 /**
2  * @file ipv6.h
3  * @brief IPv6 (Internet Protocol Version 6)
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneTCP Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.4.0
29  **/
30 
31 #ifndef _IPV6_H
32 #define _IPV6_H
33 
34 //Forward declaration of structures
35 struct _Ipv6Header;
36 #define Ipv6Header struct _Ipv6Header
37 
38 struct _Ipv6FragmentHeader;
39 #define Ipv6FragmentHeader struct _Ipv6FragmentHeader
40 
41 struct _Ipv6PseudoHeader;
42 #define Ipv6PseudoHeader struct _Ipv6PseudoHeader
43 
44 //Dependencies
45 #include "core/net.h"
46 #include "core/ethernet.h"
47 #include "ipv6/ipv6_frag.h"
48 
49 //IPv6 support
50 #ifndef IPV6_SUPPORT
51  #define IPV6_SUPPORT DISABLED
52 #elif (IPV6_SUPPORT != ENABLED && IPV6_SUPPORT != DISABLED)
53  #error IPV6_SUPPORT parameter is not valid
54 #endif
55 
56 //Default IPv6 Hop Limit field
57 #ifndef IPV6_DEFAULT_HOP_LIMIT
58  #define IPV6_DEFAULT_HOP_LIMIT 64
59 #elif (IPV6_DEFAULT_HOP_LIMIT < 1)
60  #error IPV6_DEFAULT_HOP_LIMIT parameter is not valid
61 #endif
62 
63 //Maximum number of IPv6 unicast addresses
64 #ifndef IPV6_ADDR_LIST_SIZE
65  #define IPV6_ADDR_LIST_SIZE 3
66 #elif (IPV6_ADDR_LIST_SIZE < 2)
67  #error IPV6_ADDR_LIST_SIZE parameter is not valid
68 #endif
69 
70 //Maximum number of IPv6 anycast addresses
71 #ifndef IPV6_ANYCAST_ADDR_LIST_SIZE
72  #define IPV6_ANYCAST_ADDR_LIST_SIZE 1
73 #elif (IPV6_ANYCAST_ADDR_LIST_SIZE < 1)
74  #error IPV6_ANYCAST_ADDR_LIST_SIZE parameter is not valid
75 #endif
76 
77 //Size of the prefix list
78 #ifndef IPV6_PREFIX_LIST_SIZE
79  #define IPV6_PREFIX_LIST_SIZE 2
80 #elif (IPV6_PREFIX_LIST_SIZE < 1)
81  #error IPV6_PREFIX_LIST_SIZE parameter is not valid
82 #endif
83 
84 //Maximum number number of default routers
85 #ifndef IPV6_ROUTER_LIST_SIZE
86  #define IPV6_ROUTER_LIST_SIZE 2
87 #elif (IPV6_ROUTER_LIST_SIZE < 1)
88  #error IPV6_ROUTER_LIST_SIZE parameter is not valid
89 #endif
90 
91 //Maximum number of DNS servers
92 #ifndef IPV6_DNS_SERVER_LIST_SIZE
93  #define IPV6_DNS_SERVER_LIST_SIZE 2
94 #elif (IPV6_DNS_SERVER_LIST_SIZE < 1)
95  #error IPV6_DNS_SERVER_LIST_SIZE parameter is not valid
96 #endif
97 
98 //Size of the IPv6 multicast filter
99 #ifndef IPV6_MULTICAST_FILTER_SIZE
100  #define IPV6_MULTICAST_FILTER_SIZE 8
101 #elif (IPV6_MULTICAST_FILTER_SIZE < 1)
102  #error IPV6_MULTICAST_FILTER_SIZE parameter is not valid
103 #endif
104 
105 //Version number for IPv6
106 #define IPV6_VERSION 6
107 //Minimum MTU that routers and physical links are required to handle
108 #define IPV6_DEFAULT_MTU 1280
109 
110 //Macro used for defining an IPv6 address
111 #define IPV6_ADDR(a, b, c, d, e, f, g, h) {{{ \
112  MSB(a), LSB(a), MSB(b), LSB(b), MSB(c), LSB(c), MSB(d), LSB(d), \
113  MSB(e), LSB(e), MSB(f), LSB(f), MSB(g), LSB(g), MSB(h), LSB(h)}}}
114 
115 //Copy IPv6 address
116 #define ipv6CopyAddr(destIpAddr, srcIpAddr) \
117  osMemcpy(destIpAddr, srcIpAddr, sizeof(Ipv6Addr))
118 
119 //Compare IPv6 addresses
120 #define ipv6CompAddr(ipAddr1, ipAddr2) \
121  (!osMemcmp(ipAddr1, ipAddr2, sizeof(Ipv6Addr)))
122 
123 //Determine whether an IPv6 address is a link-local unicast address
124 #define ipv6IsLinkLocalUnicastAddr(ipAddr) \
125  ((ipAddr)->b[0] == 0xFE && ((ipAddr)->b[1] & 0xC0) == 0x80)
126 
127 //Determine whether an IPv6 address is a site-local unicast address
128 #define ipv6IsSiteLocalUnicastAddr(ipAddr) \
129  ((ipAddr)->b[0] == 0xFE && ((ipAddr)->b[1] & 0xC0) == 0xC0)
130 
131 //Determine whether an IPv6 address is a multicast address
132 #define ipv6IsMulticastAddr(ipAddr) \
133  ((ipAddr)->b[0] == 0xFF)
134 
135 //Determine whether an IPv6 address is a solicited-node address
136 #define ipv6IsSolicitedNodeAddr(ipAddr) \
137  ipv6CompPrefix(ipAddr, &IPV6_SOLICITED_NODE_ADDR_PREFIX, 104)
138 
139 //C++ guard
140 #ifdef __cplusplus
141 extern "C" {
142 #endif
143 
144 
145 /**
146  * @brief IPv6 address scopes
147  **/
148 
149 typedef enum
150 {
158 
159 
160 /**
161  * @brief IPv6 address state
162  **/
163 
164 typedef enum
165 {
166  IPV6_ADDR_STATE_INVALID = 0, ///<An address that is not assigned to any interface
167  IPV6_ADDR_STATE_TENTATIVE = 1, ///<An address whose uniqueness on a link is being verified
168  IPV6_ADDR_STATE_PREFERRED = 2, ///<An address assigned to an interface whose use is unrestricted
169  IPV6_ADDR_STATE_DEPRECATED = 3 ///<An address assigned to an interface whose use is discouraged
171 
172 
173 /**
174  * @brief IPv6 Next Header types
175  **/
176 
177 typedef enum
178 {
190 
191 
192 /**
193  * @brief IPv6 fragment offset field
194  **/
195 
196 typedef enum
197 {
199  IPV6_FLAG_RES1 = 0x0004,
200  IPV6_FLAG_RES2 = 0x0002,
201  IPV6_FLAG_M = 0x0001
203 
204 
205 /**
206  * @brief IPv6 option types
207  **/
208 
209 typedef enum
210 {
213  IPV6_OPTION_TYPE_PADN = 0x01
215 
216 
217 /**
218  * @brief Actions to be taken for unrecognized options
219  **/
220 
221 typedef enum
222 {
229 
230 
231 //CC-RX, CodeWarrior or Win32 compiler?
232 #if defined(__CCRX__)
233  #pragma pack
234 #elif defined(__CWCC__) || defined(_WIN32)
235  #pragma pack(push, 1)
236 #endif
237 
238 
239 /**
240  * @brief IPv6 network address
241  **/
242 
244 {
245  __packed_union
246  {
247  uint8_t b[16];
248  uint16_t w[8];
249  uint32_t dw[4];
250  };
252 
253 
254 /**
255  * @brief IPv6 header
256  **/
257 
259 {
260 #if defined(_CPU_BIG_ENDIAN) && !defined(__ICCRX__)
261  uint8_t version : 4; //0
262  uint8_t trafficClassH : 4;
263  uint8_t trafficClassL : 4; //1
264  uint8_t flowLabelH : 4;
265 #else
266  uint8_t trafficClassH : 4; //0
267  uint8_t version : 4;
268  uint8_t flowLabelH : 4; //1
269  uint8_t trafficClassL : 4;
270 #endif
271  uint16_t flowLabelL; //2-3
272  uint16_t payloadLen; //4-5
273  uint8_t nextHeader; //6
274  uint8_t hopLimit; //7
277  uint8_t payload[]; //40
278 };
279 
280 
281 /**
282  * @brief IPv6 Hop-by-Hop Options header
283  **/
284 
285 typedef __packed_struct
286 {
287  uint8_t nextHeader; //0
288  uint8_t hdrExtLen; //1
289  uint8_t options[]; //2
291 
292 
293 /**
294  * @brief IPv6 Destination Options header
295  **/
296 
297 typedef __packed_struct
298 {
299  uint8_t nextHeader; //0
300  uint8_t hdrExtLen; //1
301  uint8_t options[]; //2
303 
304 
305 /**
306  * @brief IPv6 Type 0 Routing header
307  **/
308 
309 typedef __packed_struct
310 {
311  uint8_t nextHeader; //0
312  uint8_t hdrExtLen; //1
313  uint8_t routingType; //2
314  uint8_t segmentsLeft; //3
315  uint32_t reserved; //4-7
318 
319 
320 /**
321  * @brief IPv6 Fragment header
322  **/
323 
325 {
326  uint8_t nextHeader; //0
327  uint8_t reserved; //1
328  uint16_t fragmentOffset; //2-3
329  uint32_t identification; //4-7
330 };
331 
332 
333 /**
334  * @brief IPv6 Authentication header
335  **/
336 
337 typedef __packed_struct
338 {
339  uint8_t nextHeader; //0
340  uint8_t payloadLen; //1
341  uint16_t reserved; //2-3
342  uint32_t securityParamIndex; //4-7
343  uint32_t sequenceNumber; //8-11
344  uint8_t authData[]; //12
346 
347 
348 /**
349  * @brief IPv6 Encapsulating Security Payload header
350  **/
351 
352 typedef __packed_struct
353 {
354  uint32_t securityParamIndex; //0-3
355  uint32_t sequenceNumber; //4-7
356  uint8_t payloadData[]; //8
358 
359 
360 /**
361  * @brief IPv6 option
362  **/
363 
364 typedef __packed_struct
365 {
366  uint8_t type; //0
367  uint8_t length; //1
368  uint8_t data[]; //2
370 
371 
372 /**
373  * @brief IPv6 pseudo header
374  **/
375 
377 {
378  Ipv6Addr srcAddr; //0-15
379  Ipv6Addr destAddr; //16-31
380  uint32_t length; //32-35
381  uint8_t reserved[3]; //36-38
382  uint8_t nextHeader; //39
383 };
384 
385 
386 //CC-RX, CodeWarrior or Win32 compiler?
387 #if defined(__CCRX__)
388  #pragma unpack
389 #elif defined(__CWCC__) || defined(_WIN32)
390  #pragma pack(pop)
391 #endif
392 
393 
394 /**
395  * @brief IPv6 address entry
396  **/
397 
398 typedef struct
399 {
400  Ipv6Addr addr; ///<IPv6 address
401  Ipv6AddrState state; ///<IPv6 address state
402  bool_t duplicate; ///<The address is a duplicate
403  systime_t validLifetime; ///<Valid lifetime
404  systime_t preferredLifetime; ///<Preferred lifetime
405  bool_t permanent; ///<Permanently assigned address
406  systime_t timestamp; ///<Timestamp to manage entry lifetime
407  systime_t dadTimeout; ///<Timeout value for Duplicate Address Detection
408  uint_t dadRetransmitCount; ///<Retransmission counter for Duplicate Address Detection
409 } Ipv6AddrEntry;
410 
411 
412 /**
413  * @brief Prefix list entry
414  **/
415 
416 typedef struct
417 {
418  Ipv6Addr prefix; ///<IPv6 prefix information
419  uint8_t prefixLen; ///<IPv6 prefix length
420  bool_t onLinkFlag; ///<On-link flag
421  bool_t autonomousFlag; ///<Autonomous flag
422  systime_t validLifetime; ///<Valid lifetime
423  systime_t preferredLifetime; ///<Preferred lifetime
424  bool_t permanent; ///<Permanently assigned prefix
425  systime_t timestamp; ///<Timestamp to manage entry lifetime
427 
428 
429 /**
430  * @brief Default router list entry
431  **/
432 
433 typedef struct
434 {
435  Ipv6Addr addr; ///<Router address
436  systime_t lifetime; ///<Router lifetime
437  uint8_t preference; ///<Preference value
438  bool_t permanent; ///<Permanently assigned router
439  systime_t timestamp; ///<Timestamp to manage entry lifetime
441 
442 
443 /**
444  * @brief IPv6 multicast filter entry
445  **/
446 
447 typedef struct
448 {
449  Ipv6Addr addr; ///<Multicast address
450  uint_t refCount; ///<Reference count for the current entry
451  uint_t state; ///<MLD node state
452  bool_t flag; ///<MLD flag
453  systime_t timer; ///<Delay timer
455 
456 
457 /**
458  * @brief IPv6 context
459  **/
460 
461 typedef struct
462 {
463  size_t linkMtu; ///<Maximum transmission unit
464  bool_t isRouter; ///<A flag indicating whether routing is enabled on this interface
465  uint8_t defaultHopLimit; ///<Default Hop Limit value
466  uint8_t curHopLimit; ///<Current Hop Limit value
467  bool_t enableEchoReq; ///<Support for ICMPv6 Echo Request messages
468  bool_t enableMulticastEchoReq; ///<Support for multicast ICMPv6 Echo Request messages
469  Ipv6AddrEntry addrList[IPV6_ADDR_LIST_SIZE]; ///<IPv6 unicast address list
470  Ipv6Addr anycastAddrList[IPV6_ANYCAST_ADDR_LIST_SIZE]; ///<IPv6 anycast address list
471  Ipv6PrefixEntry prefixList[IPV6_PREFIX_LIST_SIZE]; ///<Prefix list
472  Ipv6RouterEntry routerList[IPV6_ROUTER_LIST_SIZE]; ///<Default router list
473  Ipv6Addr dnsServerList[IPV6_DNS_SERVER_LIST_SIZE]; ///<DNS servers
474  Ipv6FilterEntry multicastFilter[IPV6_MULTICAST_FILTER_SIZE]; ///<Multicast filter table
475 #if (IPV6_FRAG_SUPPORT == ENABLED)
476  uint32_t identification; ///<IPv6 fragment identification field
477  Ipv6FragDesc fragQueue[IPV6_MAX_FRAG_DATAGRAMS]; ///<IPv6 fragment reassembly queue
478 #endif
479 } Ipv6Context;
480 
481 
482 //IPv6 related constants
483 extern const Ipv6Addr IPV6_UNSPECIFIED_ADDR;
484 extern const Ipv6Addr IPV6_LOOPBACK_ADDR;
489 
490 //IPv6 related functions
491 error_t ipv6Init(NetInterface *interface);
492 
493 error_t ipv6SetMtu(NetInterface *interface, size_t mtu);
494 error_t ipv6GetMtu(NetInterface *interface, size_t *mtu);
495 
497 
501 
502 error_t ipv6SetGlobalAddr(NetInterface *interface, uint_t index, const Ipv6Addr *addr);
505 
506 error_t ipv6SetAnycastAddr(NetInterface *interface, uint_t index, const Ipv6Addr *addr);
508 
510  uint_t index, const Ipv6Addr *prefix, uint_t length);
511 
513  uint_t index, Ipv6Addr *prefix, uint_t *length);
514 
515 error_t ipv6SetDefaultRouter(NetInterface *interface, uint_t index, const Ipv6Addr *addr);
517 
518 error_t ipv6SetDnsServer(NetInterface *interface, uint_t index, const Ipv6Addr *addr);
520 
521 void ipv6LinkChangeEvent(NetInterface *interface);
522 
524  size_t ipPacketOffset, NetRxAncillary *ancillary);
525 
527  size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset);
528 
530  size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset);
531 
533  size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset);
534 
536  size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset);
537 
539  size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset);
540 
542  size_t ipPacketOffset, size_t optionOffset, size_t optionLen);
543 
545  const Ipv6PseudoHeader *pseudoHeader, NetBuffer *buffer, size_t offset,
546  NetTxAncillary *ancillary);
547 
549  const Ipv6PseudoHeader *pseudoHeader, uint32_t fragId, size_t fragOffset,
550  NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary);
551 
554 
557 
558 void ipv6DumpHeader(const Ipv6Header *ipHeader);
559 
560 //C++ guard
561 #ifdef __cplusplus
562 }
563 #endif
564 
565 #endif
uint8_t type
Definition: coap_common.h:176
unsigned int uint_t
Definition: compiler_port.h:50
char char_t
Definition: compiler_port.h:48
int bool_t
Definition: compiler_port.h:53
Ipv6Addr prefix
uint8_t fragOffset[3]
Definition: dtls_misc.h:192
error_t
Error codes.
Definition: error.h:43
Ethernet.
uint32_t mtu
Definition: icmpv6.h:175
Ipv4Addr groupAddr
Definition: igmp_common.h:171
Ipv4Addr ipAddr
Definition: ipcp.h:105
Ipv6Addr
Definition: ipv6.h:251
uint8_t flowLabelH
Definition: ipv6.h:268
const Ipv6Addr IPV6_SOLICITED_NODE_ADDR_PREFIX
Definition: ipv6.c:85
Ipv6Option
Definition: ipv6.h:369
error_t ipv6GetAnycastAddr(NetInterface *interface, uint_t index, Ipv6Addr *addr)
Retrieve anycast address.
Definition: ipv6.c:548
error_t ipv6SetDefaultHopLimit(NetInterface *interface, uint8_t hopLimit)
Set default Hop Limit value for outgoing IPv6 packets.
Definition: ipv6.c:219
error_t ipv6GetGlobalAddr(NetInterface *interface, uint_t index, Ipv6Addr *addr)
Retrieve global address.
Definition: ipv6.c:392
error_t ipv6SetPrefix(NetInterface *interface, uint_t index, const Ipv6Addr *prefix, uint_t length)
Configure IPv6 prefix.
Definition: ipv6.c:583
error_t ipv6ParseDestOptHeader(NetInterface *interface, const NetBuffer *ipPacket, size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset)
Parse Destination Options header.
Definition: ipv6.c:1367
Ipv6Addr address[]
Definition: ipv6.h:316
error_t ipv6ParseEspHeader(NetInterface *interface, const NetBuffer *ipPacket, size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset)
Parse ESP header.
Definition: ipv6.c:1521
uint32_t sequenceNumber
Definition: ipv6.h:343
uint8_t hopLimit
Definition: ipv6.h:274
error_t ipv6GetPrefix(NetInterface *interface, uint_t index, Ipv6Addr *prefix, uint_t *length)
Retrieve IPv6 prefix.
Definition: ipv6.c:647
void ipv6ProcessPacket(NetInterface *interface, NetBuffer *ipPacket, size_t ipPacketOffset, NetRxAncillary *ancillary)
Incoming IPv6 packet processing.
Definition: ipv6.c:968
uint16_t flowLabelL
Definition: ipv6.h:271
error_t ipv6SetGlobalAddr(NetInterface *interface, uint_t index, const Ipv6Addr *addr)
Assign global address.
Definition: ipv6.c:353
uint8_t payloadData[]
Definition: ipv6.h:356
uint8_t hdrExtLen
Definition: ipv6.h:288
error_t ipv6Init(NetInterface *interface)
IPv6 related initialization.
Definition: ipv6.c:95
Ipv6NextHeaderType
IPv6 Next Header types.
Definition: ipv6.h:178
@ IPV6_ROUTING_HEADER
Definition: ipv6.h:182
@ IPV6_ICMPV6_HEADER
Definition: ipv6.h:186
@ IPV6_UDP_HEADER
Definition: ipv6.h:181
@ IPV6_DEST_OPT_HEADER
Definition: ipv6.h:188
@ IPV6_HOP_BY_HOP_OPT_HEADER
Definition: ipv6.h:179
@ IPV6_TCP_HEADER
Definition: ipv6.h:180
@ IPV6_ESP_HEADER
Definition: ipv6.h:184
@ IPV6_FRAGMENT_HEADER
Definition: ipv6.h:183
@ IPV6_NO_NEXT_HEADER
Definition: ipv6.h:187
@ IPV6_AH_HEADER
Definition: ipv6.h:185
uint32_t identification
Definition: ipv6.h:329
uint8_t data[]
Definition: ipv6.h:368
error_t ipv6GetMtu(NetInterface *interface, size_t *mtu)
Retrieve the MTU for the specified interface.
Definition: ipv6.c:194
Ipv6RoutingHeader
Definition: ipv6.h:317
#define Ipv6PseudoHeader
Definition: ipv6.h:42
uint8_t trafficClassL
Definition: ipv6.h:269
__packed_struct _Ipv6FragmentHeader
IPv6 Fragment header.
Definition: ipv6.h:325
uint8_t payload[]
Definition: ipv6.h:277
Ipv6AddrState ipv6GetGlobalAddrState(NetInterface *interface, uint_t index)
Get the state of the specified global address.
Definition: ipv6.c:443
uint8_t routingType
Definition: ipv6.h:313
uint8_t nextHeader
Definition: ipv6.h:273
#define IPV6_MULTICAST_FILTER_SIZE
Definition: ipv6.h:100
uint8_t options[]
Definition: ipv6.h:289
uint8_t authData[]
Definition: ipv6.h:344
error_t ipv6GetDefaultRouter(NetInterface *interface, uint_t index, Ipv6Addr *addr)
Retrieve default router.
Definition: ipv6.c:759
#define IPV6_DNS_SERVER_LIST_SIZE
Definition: ipv6.h:93
error_t ipv6LeaveMulticastGroup(NetInterface *interface, const Ipv6Addr *groupAddr)
Leave an IPv6 multicast group.
Definition: ipv6.c:2145
Ipv6DestOptHeader
Definition: ipv6.h:302
error_t ipv6StringToAddr(const char_t *str, Ipv6Addr *ipAddr)
Convert a string representation of an IPv6 address to a binary IPv6 address.
Definition: ipv6.c:2221
Ipv6AddrScope
IPv6 address scopes.
Definition: ipv6.h:150
@ IPV6_ADDR_SCOPE_LINK_LOCAL
Definition: ipv6.h:152
@ IPV6_ADDR_SCOPE_INTERFACE_LOCAL
Definition: ipv6.h:151
@ IPV6_ADDR_SCOPE_ORGANIZATION_LOCAL
Definition: ipv6.h:155
@ IPV6_ADDR_SCOPE_ADMIN_LOCAL
Definition: ipv6.h:153
@ IPV6_ADDR_SCOPE_SITE_LOCAL
Definition: ipv6.h:154
@ IPV6_ADDR_SCOPE_GLOBAL
Definition: ipv6.h:156
const Ipv6Addr IPV6_LINK_LOCAL_ALL_NODES_ADDR
Definition: ipv6.c:73
Ipv6OptionType
IPv6 option types.
Definition: ipv6.h:210
@ IPV6_OPTION_TYPE_PAD1
Definition: ipv6.h:212
@ IPV6_OPTION_TYPE_MASK
Definition: ipv6.h:211
@ IPV6_OPTION_TYPE_PADN
Definition: ipv6.h:213
Ipv6Actions
Actions to be taken for unrecognized options.
Definition: ipv6.h:222
@ IPV6_ACTION_DISCARD_PACKET
Definition: ipv6.h:225
@ IPV6_ACTION_SEND_ICMP_ERROR_UNI
Definition: ipv6.h:227
@ IPV6_ACTION_SKIP_OPTION
Definition: ipv6.h:224
@ IPV6_ACTION_SEND_ICMP_ERROR_ALL
Definition: ipv6.h:226
@ IPV6_ACTION_MASK
Definition: ipv6.h:223
Ipv6HopByHopOptHeader
Definition: ipv6.h:290
#define IPV6_PREFIX_LIST_SIZE
Definition: ipv6.h:79
error_t ipv6SetLinkLocalAddr(NetInterface *interface, const Ipv6Addr *addr)
Assign link-local address.
Definition: ipv6.c:247
char_t * ipv6AddrToString(const Ipv6Addr *ipAddr, char_t *str)
Convert a binary IPv6 address to a string representation.
Definition: ipv6.c:2376
error_t ipv6ParseRoutingHeader(NetInterface *interface, const NetBuffer *ipPacket, size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset)
Parse Routing header.
Definition: ipv6.c:1430
const Ipv6Addr IPV6_LINK_LOCAL_ADDR_PREFIX
Definition: ipv6.c:81
error_t ipv6ParseOptions(NetInterface *interface, const NetBuffer *ipPacket, size_t ipPacketOffset, size_t optionOffset, size_t optionLen)
Parse IPv6 options.
Definition: ipv6.c:1541
const Ipv6Addr IPV6_UNSPECIFIED_ADDR
Definition: ipv6.c:65
const Ipv6Addr IPV6_LINK_LOCAL_ALL_ROUTERS_ADDR
Definition: ipv6.c:77
#define IPV6_ADDR_LIST_SIZE
Definition: ipv6.h:65
error_t ipv6SetMtu(NetInterface *interface, size_t mtu)
Change the MTU of a network interface.
Definition: ipv6.c:149
error_t ipv6SendDatagram(NetInterface *interface, const Ipv6PseudoHeader *pseudoHeader, NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary)
Send an IPv6 datagram.
Definition: ipv6.c:1667
error_t ipv6SetDefaultRouter(NetInterface *interface, uint_t index, const Ipv6Addr *addr)
Configure default router.
Definition: ipv6.c:702
#define IPV6_ANYCAST_ADDR_LIST_SIZE
Definition: ipv6.h:72
Ipv6Addr destAddr
Definition: ipv6.h:276
uint8_t version
Definition: ipv6.h:267
uint8_t segmentsLeft
Definition: ipv6.h:314
error_t ipv6JoinMulticastGroup(NetInterface *interface, const Ipv6Addr *groupAddr)
Join an IPv6 multicast group.
Definition: ipv6.c:2035
Ipv6Addr srcAddr
Definition: ipv6.h:275
Ipv6FragmentOffset
IPv6 fragment offset field.
Definition: ipv6.h:197
@ IPV6_FLAG_RES2
Definition: ipv6.h:200
@ IPV6_OFFSET_MASK
Definition: ipv6.h:198
@ IPV6_FLAG_RES1
Definition: ipv6.h:199
@ IPV6_FLAG_M
Definition: ipv6.h:201
error_t ipv6SetDnsServer(NetInterface *interface, uint_t index, const Ipv6Addr *addr)
Configure DNS server.
Definition: ipv6.c:810
__packed_struct _Ipv6Header
IPv6 header.
Definition: ipv6.h:259
typedef __packed_struct
IPv6 network address.
Definition: ipv6.h:244
Ipv6EspHeader
Definition: ipv6.h:357
void ipv6LinkChangeEvent(NetInterface *interface)
Callback function for link change event.
Definition: ipv6.c:876
Ipv6AddrState
IPv6 address state.
Definition: ipv6.h:165
@ IPV6_ADDR_STATE_DEPRECATED
An address assigned to an interface whose use is discouraged.
Definition: ipv6.h:169
@ IPV6_ADDR_STATE_PREFERRED
An address assigned to an interface whose use is unrestricted.
Definition: ipv6.h:168
@ IPV6_ADDR_STATE_INVALID
An address that is not assigned to any interface.
Definition: ipv6.h:166
@ IPV6_ADDR_STATE_TENTATIVE
An address whose uniqueness on a link is being verified.
Definition: ipv6.h:167
__packed_struct _Ipv6PseudoHeader
IPv6 pseudo header.
Definition: ipv6.h:377
const Ipv6Addr IPV6_LOOPBACK_ADDR
Definition: ipv6.c:69
void ipv6DumpHeader(const Ipv6Header *ipHeader)
Dump IPv6 header for debugging purpose.
Definition: ipv6.c:2447
uint32_t reserved
Definition: ipv6.h:315
#define Ipv6Header
Definition: ipv6.h:36
error_t ipv6GetLinkLocalAddr(NetInterface *interface, Ipv6Addr *addr)
Retrieve link-local address.
Definition: ipv6.c:285
error_t ipv6ParseHopByHopOptHeader(NetInterface *interface, const NetBuffer *ipPacket, size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset)
Parse Hop-by-Hop Options header.
Definition: ipv6.c:1289
error_t ipv6ParseAhHeader(NetInterface *interface, const NetBuffer *ipPacket, size_t ipPacketOffset, size_t *headerOffset, size_t *nextHeaderOffset)
Parse AH header.
Definition: ipv6.c:1501
error_t ipv6GetDnsServer(NetInterface *interface, uint_t index, Ipv6Addr *addr)
Retrieve DNS server.
Definition: ipv6.c:844
error_t ipv6SendPacket(NetInterface *interface, const Ipv6PseudoHeader *pseudoHeader, uint32_t fragId, size_t fragOffset, NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary)
Send an IPv6 packet.
Definition: ipv6.c:1745
uint16_t fragmentOffset
Definition: ipv6.h:328
Ipv6AddrState ipv6GetLinkLocalAddrState(NetInterface *interface)
Get the state of the link-local address.
Definition: ipv6.c:326
uint16_t payloadLen
Definition: ipv6.h:272
uint8_t length
Definition: ipv6.h:367
error_t ipv6SetAnycastAddr(NetInterface *interface, uint_t index, const Ipv6Addr *addr)
Assign anycast address.
Definition: ipv6.c:470
Ipv6AuthHeader
Definition: ipv6.h:345
#define IPV6_ROUTER_LIST_SIZE
Definition: ipv6.h:86
uint32_t securityParamIndex
Definition: ipv6.h:342
IPv6 fragmentation and reassembly.
#define IPV6_MAX_FRAG_DATAGRAMS
Definition: ipv6_frag.h:62
uint8_t b
Definition: nbns_common.h:104
Ipv4Addr addr
Definition: nbns_common.h:123
uint8_t ipPacket[]
Definition: ndp.h:431
TCP/IP stack core.
#define NetInterface
Definition: net.h:36
#define NetRxAncillary
Definition: net_misc.h:40
#define NetTxAncillary
Definition: net_misc.h:36
uint32_t systime_t
System time.
IPv6 address entry.
Definition: ipv6.h:399
systime_t timestamp
Timestamp to manage entry lifetime.
Definition: ipv6.h:406
bool_t permanent
Permanently assigned address.
Definition: ipv6.h:405
bool_t duplicate
The address is a duplicate.
Definition: ipv6.h:402
Ipv6AddrState state
IPv6 address state.
Definition: ipv6.h:401
systime_t preferredLifetime
Preferred lifetime.
Definition: ipv6.h:404
systime_t validLifetime
Valid lifetime.
Definition: ipv6.h:403
uint_t dadRetransmitCount
Retransmission counter for Duplicate Address Detection.
Definition: ipv6.h:408
systime_t dadTimeout
Timeout value for Duplicate Address Detection.
Definition: ipv6.h:407
Ipv6Addr addr
IPv6 address.
Definition: ipv6.h:400
IPv6 context.
Definition: ipv6.h:462
bool_t isRouter
A flag indicating whether routing is enabled on this interface.
Definition: ipv6.h:464
uint32_t identification
IPv6 fragment identification field.
Definition: ipv6.h:476
bool_t enableEchoReq
Support for ICMPv6 Echo Request messages.
Definition: ipv6.h:467
uint8_t curHopLimit
Current Hop Limit value.
Definition: ipv6.h:466
uint8_t defaultHopLimit
Default Hop Limit value.
Definition: ipv6.h:465
bool_t enableMulticastEchoReq
Support for multicast ICMPv6 Echo Request messages.
Definition: ipv6.h:468
size_t linkMtu
Maximum transmission unit.
Definition: ipv6.h:463
IPv6 multicast filter entry.
Definition: ipv6.h:448
uint_t state
MLD node state.
Definition: ipv6.h:451
bool_t flag
MLD flag.
Definition: ipv6.h:452
systime_t timer
Delay timer.
Definition: ipv6.h:453
uint_t refCount
Reference count for the current entry.
Definition: ipv6.h:450
Ipv6Addr addr
Multicast address.
Definition: ipv6.h:449
Fragmented packet descriptor.
Definition: ipv6_frag.h:135
Prefix list entry.
Definition: ipv6.h:417
systime_t timestamp
Timestamp to manage entry lifetime.
Definition: ipv6.h:425
bool_t permanent
Permanently assigned prefix.
Definition: ipv6.h:424
systime_t preferredLifetime
Preferred lifetime.
Definition: ipv6.h:423
systime_t validLifetime
Valid lifetime.
Definition: ipv6.h:422
Ipv6Addr prefix
IPv6 prefix information.
Definition: ipv6.h:418
bool_t onLinkFlag
On-link flag.
Definition: ipv6.h:420
uint8_t prefixLen
IPv6 prefix length.
Definition: ipv6.h:419
bool_t autonomousFlag
Autonomous flag.
Definition: ipv6.h:421
Default router list entry.
Definition: ipv6.h:434
systime_t timestamp
Timestamp to manage entry lifetime.
Definition: ipv6.h:439
bool_t permanent
Permanently assigned router.
Definition: ipv6.h:438
systime_t lifetime
Router lifetime.
Definition: ipv6.h:436
uint8_t preference
Preference value.
Definition: ipv6.h:437
Ipv6Addr addr
Router address.
Definition: ipv6.h:435
Structure describing a buffer that spans multiple chunks.
Definition: net_mem.h:89