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
|
/***************************************************************************
* 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_ip.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _nx_ip_gateway_address_set PORTABLE C */
/* 6.4.3 */
/* AUTHOR */
/* */
/* Yuxin Zhou, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function sets the IP gateway address that will be used for */
/* sending IP packets with addresses not in the local network. */
/* */
/* Note 1: An input gateway address of zero is handled as an error. */
/* Use nx_ip_gateway_address_clear to remove an existing gateway. */
/* */
/* Note 2: For a gateway address is non zero, the IP gateway address */
/* and gateway interface pointer must be non null, or this function */
/* will return an error status. */
/* */
/* INPUT */
/* */
/* ip_ptr IP control block pointer */
/* ip_address Gateway IP address */
/* */
/* OUTPUT */
/* */
/* status Completion status */
/* */
/* CALLS */
/* */
/* tx_mutex_get Obtain protection mutex */
/* tx_mutex_put Release protection mutex */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* */
/**************************************************************************/
UINT _nx_ip_gateway_address_set(NX_IP *ip_ptr, ULONG ip_address)
{
#ifndef NX_DISABLE_IPV4
INT i;
TX_INTERRUPT_SAVE_AREA
NX_INTERFACE *ip_interface_ptr = NX_NULL;
/* If trace is enabled, insert this event into the trace buffer. */
NX_TRACE_IN_LINE_INSERT(NX_TRACE_IP_GATEWAY_ADDRESS_SET, ip_ptr, ip_address, 0, 0, NX_TRACE_IP_EVENTS, 0, 0);
/* Obtain the IP internal mutex so the Gateway IP address can be setup. */
tx_mutex_get(&(ip_ptr -> nx_ip_protection), TX_WAIT_FOREVER);
/* Loop through all the interfaces to find the one for the input gateway address. */
for (i = 0; i < NX_MAX_PHYSICAL_INTERFACES; i++)
{
/* Must be a valid interface. Match the network subnet of the interface and input address. */
if ((ip_ptr -> nx_ip_interface[i].nx_interface_valid) &&
((ip_address & (ip_ptr -> nx_ip_interface[i].nx_interface_ip_network_mask)) ==
ip_ptr -> nx_ip_interface[i].nx_interface_ip_network))
{
/* This is the interface for the gateway. */
ip_interface_ptr = &(ip_ptr -> nx_ip_interface[i]);
/* Break out of the search. */
break;
}
}
/* Check if we found an interface. */
if (ip_interface_ptr == NX_NULL)
{
/* None found. Unlock the mutex, and return the error status. */
tx_mutex_put(&(ip_ptr -> nx_ip_protection));
return(NX_IP_ADDRESS_ERROR);
}
/* Disable interrupts. */
TX_DISABLE
/* Setup the Gateway IP address. */
ip_ptr -> nx_ip_gateway_address = ip_address;
ip_ptr -> nx_ip_gateway_interface = ip_interface_ptr;
/* Restore interrupts. */
TX_RESTORE
/* Release the protection mutex. */
tx_mutex_put(&(ip_ptr -> nx_ip_protection));
/* Return completion status. */
return(NX_SUCCESS);
#else /* NX_DISABLE_IPV4 */
NX_PARAMETER_NOT_USED(ip_ptr);
NX_PARAMETER_NOT_USED(ip_address);
return(NX_NOT_SUPPORTED);
#endif /* !NX_DISABLE_IPV4 */
}
|