summaryrefslogtreecommitdiff
path: root/common/src/nx_icmpv6_validate_ra.c
blob: ef024868967e91942238bb8c7044ec4fdcde89a9 (plain)
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/***************************************************************************
 * 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 Control Message Protocol (ICMP)                            */
/**                                                                       */
/**************************************************************************/
/**************************************************************************/

#define NX_SOURCE_CODE
/* Include necessary system files.  */

#include "nx_api.h"
#include "nx_ipv6.h"
#include "nx_icmpv6.h"

#ifdef FEATURE_NX_IPV6


#ifndef NX_DISABLE_ICMPV6_ROUTER_ADVERTISEMENT_PROCESS

/**************************************************************************/
/*                                                                        */
/*  FUNCTION                                               RELEASE        */
/*                                                                        */
/*    _nx_icmpv6_validate_ra                              PORTABLE C      */
/*                                                           6.4.3        */
/*  AUTHOR                                                                */
/*                                                                        */
/*    Yuxin Zhou, Microsoft Corporation                                   */
/*                                                                        */
/*  DESCRIPTION                                                           */
/*                                                                        */
/*    This function validates incoming router advertisement messages.     */
/*                                                                        */
/*  INPUT                                                                 */
/*                                                                        */
/*    packet_ptr                            ICMP packet pointer           */
/*                                                                        */
/*  OUTPUT                                                                */
/*                                                                        */
/*    NX_SUCCESS                            Successful completion (no     */
/*                                            option fields to validate)  */
/*    NX_NOT_SUCCESSFUL                     Invalid ICMP header data      */
/*                                                                        */
/*  CALLS                                                                 */
/*                                                                        */
/*    IPv6_Address_Type                     Find IP address type.         */
/*    _nx_icmpv6_validate_options           Validate option field.        */
/*                                                                        */
/*  CALLED BY                                                             */
/*                                                                        */
/*    _nx_icmpv6_process_ra                 Main ICMP packet pocess       */
/*                                                                        */
/**************************************************************************/
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;


    /* Set a pointer to he ICMP message header.  */
    /*lint -e{927} -e{826} suppress cast of pointer to pointer, since it is necessary  */
    header_ptr =  (NX_ICMPV6_RA *)packet_ptr -> nx_packet_prepend_ptr;

    /* Set a pointer to the IPv6 header. */
    /*lint -e{927} -e{826} suppress cast of pointer to pointer, since it is necessary  */
    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);

    /* Validate the IP header information. */

    /*  The source address must be the link local router address. RFC2461 4.2 */
    if ((source_address_type & IPV6_ADDRESS_LINKLOCAL) != IPV6_ADDRESS_LINKLOCAL)
    {

        return(NX_NOT_SUCCESSFUL);
    }

    /* IP destination address must be multicast address or solicited sender link local address. */
    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);
    }

    /*  The IP header hop limit must be 255 */
    if ((ipv6_header -> nx_ip_header_word_1 & 0xFF) != 0xFF)
    {

        return(NX_NOT_SUCCESSFUL);
    }

    /* Validate ICMP fields */
    if (header_ptr -> nx_icmpv6_ra_icmpv6_header.nx_icmpv6_header_code != 0)
    {

        return(NX_NOT_SUCCESSFUL);
    }

    /* Locate the option field. */
    /*lint -e{923} suppress cast between pointer and ULONG, since it is necessary  */
    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));

    /* Check for options (if there is a non zero option length ICMPv6 header field). */
    if (option_length)
    {

        /* Validate option field(s). */
        return(_nx_icmpv6_validate_options(option_ptr, option_length, NX_NULL));
    }

    return(NX_SUCCESS);
}


#endif /* NX_DISABLE_ICMPV6_ROUTER_ADVERTISEMENT_PROCESS */

#endif /* FEATURE_NX_IPV6 */