1
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
52
53
54
55
56
57
60
61
81
82
83
84
85
86
87
88
89
91
92
93
94
95
96
97
98
99
100
101
104
105
106
107
109
110
111
112
113
114
115
118
119
120
121
123
124
125
129
130
131
132
136
137
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
174
175
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
204
205
208
209
210
211
212
213
214
221
222
223
224
225
226
227
228
229
230
231
232
233
243
244
245
246
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
279
282
285
286
287
288
289
290
291
292
293
294
295
296
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
338
339
340
341
342
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
376
377
378
379
380
/* ... */
/* ... */
#include "lwip/opt.h"
#if LWIP_NETIF_API
#include "lwip/etharp.h"
#include "lwip/netifapi.h"
#include "lwip/memp.h"
#include "lwip/priv/tcpip_priv.h"
#include <string.h>
5 includes
#define NETIFAPI_VAR_REF(name) API_VAR_REF(name)
#define NETIFAPI_VAR_DECLARE(name) API_VAR_DECLARE(struct netifapi_msg, name)
#define NETIFAPI_VAR_ALLOC(name) API_VAR_ALLOC(struct netifapi_msg, MEMP_NETIFAPI_MSG, name, ERR_MEM)
#define NETIFAPI_VAR_FREE(name) API_VAR_FREE(MEMP_NETIFAPI_MSG, name)
/* ... */
static err_t
netifapi_do_netif_add(struct tcpip_api_call_data *m)
{
/* ... */
struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
if (!netif_add( msg->netif,
#if LWIP_IPV4
API_EXPR_REF(msg->msg.add.ipaddr),
API_EXPR_REF(msg->msg.add.netmask),
API_EXPR_REF(msg->msg.add.gw),/* ... */
#endif
msg->msg.add.state,
msg->msg.add.init,
msg->msg.add.input)) {
return ERR_IF;
}if (!netif_add( msg->netif, #if LWIP_IPV4 API_EXPR_REF(msg->msg.add.ipaddr), API_EXPR_REF(msg->msg.add.netmask), API_EXPR_REF(msg->msg.add.gw), #endif /* LWIP_IPV4 */ msg->msg.add.state, msg->msg.add.init, msg->msg.add.input)) { ... } else {
return ERR_OK;
}else { ... }
}netifapi_do_netif_add (struct tcpip_api_call_data *m) { ... }
#if LWIP_IPV4
/* ... */
static err_t
netifapi_do_netif_set_addr(struct tcpip_api_call_data *m)
{
/* ... */
struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
netif_set_addr( msg->netif,
API_EXPR_REF(msg->msg.add.ipaddr),
API_EXPR_REF(msg->msg.add.netmask),
API_EXPR_REF(msg->msg.add.gw));
return ERR_OK;
}netifapi_do_netif_set_addr (struct tcpip_api_call_data *m) { ... }
/* ... */#endif
/* ... */
static err_t
netifapi_do_name_to_index(struct tcpip_api_call_data *m)
{
/* ... */
struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
msg->msg.ifs.index = netif_name_to_index(msg->msg.ifs.name);
return ERR_OK;
}netifapi_do_name_to_index (struct tcpip_api_call_data *m) { ... }
/* ... */
static err_t
netifapi_do_index_to_name(struct tcpip_api_call_data *m)
{
/* ... */
struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
if (!netif_index_to_name(msg->msg.ifs.index, msg->msg.ifs.name)) {
msg->msg.ifs.name[0] = '\0';
}if (!netif_index_to_name(msg->msg.ifs.index, msg->msg.ifs.name)) { ... }
return ERR_OK;
}netifapi_do_index_to_name (struct tcpip_api_call_data *m) { ... }
/* ... */
static err_t
netifapi_do_netif_common(struct tcpip_api_call_data *m)
{
/* ... */
struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m;
if (msg->msg.common.errtfunc != NULL) {
return msg->msg.common.errtfunc(msg->netif);
}if (msg->msg.common.errtfunc != NULL) { ... } else {
msg->msg.common.voidfunc(msg->netif);
return ERR_OK;
}else { ... }
}netifapi_do_netif_common (struct tcpip_api_call_data *m) { ... }
#if LWIP_ARP && LWIP_IPV4
/* ... */
err_t
netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type)
{
err_t err;
LWIP_UNUSED_ARG(type);
#if ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING
LOCK_TCPIP_CORE();
err = etharp_add_static_entry(ipaddr, ethaddr);
UNLOCK_TCPIP_CORE();/* ... */
#else
LWIP_UNUSED_ARG(ipaddr);
LWIP_UNUSED_ARG(ethaddr);
err = ERR_VAL;/* ... */
#endif
return err;
}netifapi_arp_add (const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type) { ... }
/* ... */
err_t
netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type)
{
err_t err;
LWIP_UNUSED_ARG(type);
#if ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING
LOCK_TCPIP_CORE();
err = etharp_remove_static_entry(ipaddr);
UNLOCK_TCPIP_CORE();/* ... */
#else
LWIP_UNUSED_ARG(ipaddr);
err = ERR_VAL;/* ... */
#endif
return err;
}netifapi_arp_remove (const ip4_addr_t *ipaddr, enum netifapi_arp_entry type) { ... }
/* ... */#endif
/* ... */
err_t
netifapi_netif_add(struct netif *netif,
#if LWIP_IPV4
const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,
#endif
void *state, netif_init_fn init, netif_input_fn input)
{
err_t err;
NETIFAPI_VAR_DECLARE(msg);
NETIFAPI_VAR_ALLOC(msg);
#if LWIP_IPV4
if (ipaddr == NULL) {
ipaddr = IP4_ADDR_ANY4;
}if (ipaddr == NULL) { ... }
if (netmask == NULL) {
netmask = IP4_ADDR_ANY4;
}if (netmask == NULL) { ... }
if (gw == NULL) {
gw = IP4_ADDR_ANY4;
}if (gw == NULL) { ... }
/* ... */#endif
NETIFAPI_VAR_REF(msg).netif = netif;
#if LWIP_IPV4
NETIFAPI_VAR_REF(msg).msg.add.ipaddr = NETIFAPI_VAR_REF(ipaddr);
NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);
NETIFAPI_VAR_REF(msg).msg.add.gw = NETIFAPI_VAR_REF(gw);/* ... */
#endif
NETIFAPI_VAR_REF(msg).msg.add.state = state;
NETIFAPI_VAR_REF(msg).msg.add.init = init;
NETIFAPI_VAR_REF(msg).msg.add.input = input;
err = tcpip_api_call(netifapi_do_netif_add, &API_VAR_REF(msg).call);
NETIFAPI_VAR_FREE(msg);
return err;
}netifapi_netif_add (struct netif *netif, #if LWIP_IPV4 const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, #endif /* LWIP_IPV4 */ void *state, netif_init_fn init, netif_input_fn input) { ... }
#if LWIP_IPV4
/* ... */
err_t
netifapi_netif_set_addr(struct netif *netif,
const ip4_addr_t *ipaddr,
const ip4_addr_t *netmask,
const ip4_addr_t *gw)
{
err_t err;
NETIFAPI_VAR_DECLARE(msg);
NETIFAPI_VAR_ALLOC(msg);
if (ipaddr == NULL) {
ipaddr = IP4_ADDR_ANY4;
}if (ipaddr == NULL) { ... }
if (netmask == NULL) {
netmask = IP4_ADDR_ANY4;
}if (netmask == NULL) { ... }
if (gw == NULL) {
gw = IP4_ADDR_ANY4;
}if (gw == NULL) { ... }
NETIFAPI_VAR_REF(msg).netif = netif;
NETIFAPI_VAR_REF(msg).msg.add.ipaddr = NETIFAPI_VAR_REF(ipaddr);
NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);
NETIFAPI_VAR_REF(msg).msg.add.gw = NETIFAPI_VAR_REF(gw);
err = tcpip_api_call(netifapi_do_netif_set_addr, &API_VAR_REF(msg).call);
NETIFAPI_VAR_FREE(msg);
return err;
}netifapi_netif_set_addr (struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw) { ... }
/* ... */#endif
/* ... */
err_t
netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,
netifapi_errt_fn errtfunc)
{
err_t err;
NETIFAPI_VAR_DECLARE(msg);
NETIFAPI_VAR_ALLOC(msg);
NETIFAPI_VAR_REF(msg).netif = netif;
NETIFAPI_VAR_REF(msg).msg.common.voidfunc = voidfunc;
NETIFAPI_VAR_REF(msg).msg.common.errtfunc = errtfunc;
err = tcpip_api_call(netifapi_do_netif_common, &API_VAR_REF(msg).call);
NETIFAPI_VAR_FREE(msg);
return err;
}netifapi_netif_common (struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc) { ... }
/* ... */
err_t
netifapi_netif_name_to_index(const char *name, u8_t *idx)
{
err_t err;
NETIFAPI_VAR_DECLARE(msg);
NETIFAPI_VAR_ALLOC(msg);
*idx = 0;
#if LWIP_MPU_COMPATIBLE
strncpy(NETIFAPI_VAR_REF(msg).msg.ifs.name, name, NETIF_NAMESIZE - 1);
NETIFAPI_VAR_REF(msg).msg.ifs.name[NETIF_NAMESIZE - 1] = '\0';/* ... */
#else
NETIFAPI_VAR_REF(msg).msg.ifs.name = LWIP_CONST_CAST(char *, name);
#endif
err = tcpip_api_call(netifapi_do_name_to_index, &API_VAR_REF(msg).call);
if (!err) {
*idx = NETIFAPI_VAR_REF(msg).msg.ifs.index;
}if (!err) { ... }
NETIFAPI_VAR_FREE(msg);
return err;
}netifapi_netif_name_to_index (const char *name, u8_t *idx) { ... }
/* ... */
err_t
netifapi_netif_index_to_name(u8_t idx, char *name)
{
err_t err;
NETIFAPI_VAR_DECLARE(msg);
NETIFAPI_VAR_ALLOC(msg);
NETIFAPI_VAR_REF(msg).msg.ifs.index = idx;
#if !LWIP_MPU_COMPATIBLE
NETIFAPI_VAR_REF(msg).msg.ifs.name = name;
#endif
err = tcpip_api_call(netifapi_do_index_to_name, &API_VAR_REF(msg).call);
#if LWIP_MPU_COMPATIBLE
if (!err) {
strncpy(name, NETIFAPI_VAR_REF(msg).msg.ifs.name, NETIF_NAMESIZE - 1);
name[NETIF_NAMESIZE - 1] = '\0';
}if (!err) { ... }
/* ... */#endif
NETIFAPI_VAR_FREE(msg);
return err;
}netifapi_netif_index_to_name (u8_t idx, char *name) { ... }
/* ... */
#endif