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
141
142
143
|
/***************************************************************************
* 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 */
/** */
/** Reverse Address Resolution Protocol (RARP) */
/** */
/**************************************************************************/
/**************************************************************************/
#define NX_SOURCE_CODE
/* Include necessary system files. */
#include "nx_api.h"
#include "nx_rarp.h"
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _nx_rarp_enable PORTABLE C */
/* 6.4.3 */
/* AUTHOR */
/* */
/* Yuxin Zhou, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function enables the RARP management component for the */
/* specified IP instance. For a multi-homed device, RARP is enabled */
/* on all attahced interfaces, as long as the interface IP address */
/* is not configured yet. */
/* */
/* INPUT */
/* */
/* ip_ptr IP instance pointer */
/* */
/* OUTPUT */
/* */
/* status Completion status */
/* */
/* CALLS */
/* */
/* None */
/* */
/* CALLED BY */
/* */
/* Application Code */
/* */
/**************************************************************************/
UINT _nx_rarp_enable(NX_IP *ip_ptr)
{
#ifndef NX_DISABLE_IPV4
TX_INTERRUPT_SAVE_AREA
UINT i, rarp_enable;
/* If trace is enabled, insert this event into the trace buffer. */
NX_TRACE_IN_LINE_INSERT(NX_TRACE_RARP_ENABLE, ip_ptr, 0, 0, 0, NX_TRACE_RARP_EVENTS, 0, 0);
/* Disable interrupts. */
TX_DISABLE
/* Initialize the outcome to cancelling RARP enable. */
rarp_enable = NX_FALSE;
/* Loop through all the interfaces. */
for (i = 0; i < NX_MAX_PHYSICAL_INTERFACES; i++)
{
/* Skip the interfaces that are not initialized or is not Ethernet-like.*/
if ((ip_ptr -> nx_ip_interface[i].nx_interface_valid == 0) ||
(ip_ptr -> nx_ip_interface[i].nx_interface_address_mapping_needed == 0))
{
continue;
}
/* Does this interface need a valid IP address? */
if (ip_ptr -> nx_ip_interface[i].nx_interface_ip_address == 0)
{
/* Yes, reset to the flag to enable RARP. */
rarp_enable = NX_TRUE;
break;
}
}
if (rarp_enable == NX_FALSE)
{
/* Error, all host interfaces already have a valid IP address (non-zero). */
/* Restore interrupts. */
TX_RESTORE
/* Return to caller. */
return(NX_IP_ADDRESS_ERROR);
}
/* Check to see if RARP has been enabled already. */
if (ip_ptr -> nx_ip_rarp_periodic_update)
{
/* Error, IP instance already has RARP enabled. */
/* Restore interrupts. */
TX_RESTORE
/* Return to caller. */
return(NX_ALREADY_ENABLED);
}
/* Setup the RARP periodic update routine. */
ip_ptr -> nx_ip_rarp_periodic_update = _nx_rarp_periodic_update;
/* Restore interrupts. */
TX_RESTORE
/* Return successful completion. */
return(NX_SUCCESS);
#else /* NX_DISABLE_IPV4 */
NX_PARAMETER_NOT_USED(ip_ptr);
return(NX_NOT_SUPPORTED);
#endif /* !NX_DISABLE_IPV4 */
}
|