1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/***************************************************************************
* Copyright (c) 2024 Microsoft Corporation
* Copyright (c) 2025-present Eclipse ThreadX Contributors
*
* This program and the accompanying materials are made available under the
* terms of the MIT License which is available at
* https://opensource.org/licenses/MIT.
*
* SPDX-License-Identifier: MIT
**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** NetX Component */
/** */
/** Internet Protocol (IP) */
/** */
/**************************************************************************/
/**************************************************************************/
#define NX_SOURCE_CODE
/* Include necessary system files. */
#include "nx_api.h"
#include "nx_ipv6.h"
#include "nx_icmpv6.h"
#ifdef FEATURE_NX_IPV6
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _nx_ipv6_process_routing_option PORTABLE C */
/* 6.4.3 */
/* AUTHOR */
/* */
/* Yuxin Zhou, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function processes the Routing Option header. */
/* */
/* INPUT */
/* */
/* ip_ptr Pointer to IP control block */
/* packet_ptr Pointer to packet to process */
/* */
/* OUTPUT */
/* */
/* NX_SUCCESS Successful completion */
/* NX_OPTION_HEADER_ERROR Error parsing router option */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* _nx_ipv6_packet_receive */
/* */
/**************************************************************************/
UINT _nx_ipv6_process_routing_option(NX_IP *ip_ptr, NX_PACKET *packet_ptr)
{
NX_IPV6_HEADER_ROUTING_OPTION *option;
#ifndef NX_DISABLE_ICMPV6_ERROR_MESSAGE
UINT base_offset;
#endif
/* Add debug information. */
NX_PACKET_DEBUG(__FILE__, __LINE__, packet_ptr);
/* Check packet length is at least sizeof(NX_IPV6_HEADER_ROUTING_OPTION). */
if (packet_ptr -> nx_packet_length < sizeof(NX_IPV6_HEADER_ROUTING_OPTION))
{
return(NX_OPTION_HEADER_ERROR);
}
/* Set a pointer to the routing header. */
/*lint -e{927} -e{826} suppress cast of pointer to pointer, since it is necessary */
option = (NX_IPV6_HEADER_ROUTING_OPTION *)(packet_ptr -> nx_packet_prepend_ptr);
if (option -> nx_ipv6_header_routing_option_segments_left == 0)
{
/* Skip the rest of the routing header and continue processing this packet. */
return(NX_SUCCESS);
}
/* According to RFC 5095, Routing Header 0 (described in RFC 2460) has been
deprecated. Therefore discard the packet that has segments left, and send
an ICMP Parameter Problem if such feature is enabled. */
#ifndef NX_DISABLE_ICMPV6_ERROR_MESSAGE
/*lint -e{946} -e{947} suppress pointer subtraction, since it is necessary. */
base_offset = (UINT)(packet_ptr -> nx_packet_prepend_ptr - packet_ptr -> nx_packet_ip_header);
/*lint -e{835} -e{845} suppress operating on zero. */
NX_ICMPV6_SEND_PARAMETER_PROBLEM(ip_ptr, packet_ptr, 0, base_offset + 2);
#else
NX_PARAMETER_NOT_USED(ip_ptr);
#endif
/* Return error status, so the caller knows to free the packet. */
return(NX_OPTION_HEADER_ERROR);
}
#endif /* FEATURE_NX_IPV6 */
|