1
10
11
12
13
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
105
106
107
113
114
115
120
121
122
127
128
129
130
131
132
133
134
140
141
142
143
144
145
146
147
148
...
...
#define NX_SOURCE_CODE
#include "nx_api.h"
#include "nx_ipv6.h"
#include "nx_icmpv6.h"
#ifdef FEATURE_NX_IPV6
#ifndef NX_DISABLE_ICMPV6_ROUTER_ADVERTISEMENT_PROCESS
...
UINT _nx_icmpv6_validate_ra(NX_PACKET *packet_ptr)
{
NX_IPV6_HEADER *ipv6_header;
NX_ICMPV6_RA *header_ptr;
NX_ICMPV6_OPTION *option_ptr;
INT option_length;
ULONG source_address_type, dest_address_type;
header_ptr = (NX_ICMPV6_RA *)packet_ptr -> nx_packet_prepend_ptr;
ipv6_header = (NX_IPV6_HEADER *)packet_ptr -> nx_packet_ip_header;
source_address_type = IPv6_Address_Type(ipv6_header -> nx_ip_header_source_ip);
dest_address_type = IPv6_Address_Type(ipv6_header -> nx_ip_header_destination_ip);
if ((source_address_type & IPV6_ADDRESS_LINKLOCAL) != IPV6_ADDRESS_LINKLOCAL)
{
return(NX_NOT_SUCCESSFUL);
}if ((source_address_type & IPV6_ADDRESS_LINKLOCAL) != IPV6_ADDRESS_LINKLOCAL) { ... }
if ((dest_address_type != (ULONG)(IPV6_ADDRESS_LINKLOCAL | IPV6_ADDRESS_UNICAST)) &&
(dest_address_type != (ULONG)(IPV6_ALL_NODE_MCAST | IPV6_ADDRESS_MULTICAST)))
{
return(NX_NOT_SUCCESSFUL);
}if ((dest_address_type != (ULONG)(IPV6_ADDRESS_LINKLOCAL | IPV6_ADDRESS_UNICAST)) && (dest_address_type != (ULONG)(IPV6_ALL_NODE_MCAST | IPV6_ADDRESS_MULTICAST))) { ... }
if ((ipv6_header -> nx_ip_header_word_1 & 0xFF) != 0xFF)
{
return(NX_NOT_SUCCESSFUL);
}if ((ipv6_header -> nx_ip_header_word_1 & 0xFF) != 0xFF) { ... }
if (header_ptr -> nx_icmpv6_ra_icmpv6_header.nx_icmpv6_header_code != 0)
{
return(NX_NOT_SUCCESSFUL);
}if (header_ptr -> nx_icmpv6_ra_icmpv6_header.nx_icmpv6_header_code != 0) { ... }
option_ptr = (NX_ICMPV6_OPTION *)NX_UCHAR_POINTER_ADD(header_ptr, sizeof(NX_ICMPV6_RA));
option_length = (INT)(packet_ptr -> nx_packet_length - sizeof(NX_ICMPV6_RA));
if (option_length)
{
return(_nx_icmpv6_validate_options(option_ptr, option_length, NX_NULL));
}if (option_length) { ... }
return(NX_SUCCESS);
}_nx_icmpv6_validate_ra (NX_PACKET *packet_ptr) { ... }
/* ... */
#endif
/* ... */
#endif