1*5d5fbe79SDavid van Moolenbroek /**
2*5d5fbe79SDavid van Moolenbroek * @file
3*5d5fbe79SDavid van Moolenbroek * Network Interface Sequential API module
4*5d5fbe79SDavid van Moolenbroek *
5*5d5fbe79SDavid van Moolenbroek * @defgroup netifapi NETIF API
6*5d5fbe79SDavid van Moolenbroek * @ingroup sequential_api
7*5d5fbe79SDavid van Moolenbroek * Thread-safe functions to be called from non-TCPIP threads
8*5d5fbe79SDavid van Moolenbroek *
9*5d5fbe79SDavid van Moolenbroek * @defgroup netifapi_netif NETIF related
10*5d5fbe79SDavid van Moolenbroek * @ingroup netifapi
11*5d5fbe79SDavid van Moolenbroek * To be called from non-TCPIP threads
12*5d5fbe79SDavid van Moolenbroek */
13*5d5fbe79SDavid van Moolenbroek
14*5d5fbe79SDavid van Moolenbroek /*
15*5d5fbe79SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without modification,
16*5d5fbe79SDavid van Moolenbroek * are permitted provided that the following conditions are met:
17*5d5fbe79SDavid van Moolenbroek *
18*5d5fbe79SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright notice,
19*5d5fbe79SDavid van Moolenbroek * this list of conditions and the following disclaimer.
20*5d5fbe79SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright notice,
21*5d5fbe79SDavid van Moolenbroek * this list of conditions and the following disclaimer in the documentation
22*5d5fbe79SDavid van Moolenbroek * and/or other materials provided with the distribution.
23*5d5fbe79SDavid van Moolenbroek * 3. The name of the author may not be used to endorse or promote products
24*5d5fbe79SDavid van Moolenbroek * derived from this software without specific prior written permission.
25*5d5fbe79SDavid van Moolenbroek *
26*5d5fbe79SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
27*5d5fbe79SDavid van Moolenbroek * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
28*5d5fbe79SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
29*5d5fbe79SDavid van Moolenbroek * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30*5d5fbe79SDavid van Moolenbroek * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
31*5d5fbe79SDavid van Moolenbroek * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32*5d5fbe79SDavid van Moolenbroek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33*5d5fbe79SDavid van Moolenbroek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
34*5d5fbe79SDavid van Moolenbroek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
35*5d5fbe79SDavid van Moolenbroek * OF SUCH DAMAGE.
36*5d5fbe79SDavid van Moolenbroek *
37*5d5fbe79SDavid van Moolenbroek * This file is part of the lwIP TCP/IP stack.
38*5d5fbe79SDavid van Moolenbroek *
39*5d5fbe79SDavid van Moolenbroek */
40*5d5fbe79SDavid van Moolenbroek
41*5d5fbe79SDavid van Moolenbroek #include "lwip/opt.h"
42*5d5fbe79SDavid van Moolenbroek
43*5d5fbe79SDavid van Moolenbroek #if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
44*5d5fbe79SDavid van Moolenbroek
45*5d5fbe79SDavid van Moolenbroek #include "lwip/netifapi.h"
46*5d5fbe79SDavid van Moolenbroek #include "lwip/memp.h"
47*5d5fbe79SDavid van Moolenbroek #include "lwip/priv/tcpip_priv.h"
48*5d5fbe79SDavid van Moolenbroek
49*5d5fbe79SDavid van Moolenbroek #include <string.h> /* strncpy */
50*5d5fbe79SDavid van Moolenbroek
51*5d5fbe79SDavid van Moolenbroek #define NETIFAPI_VAR_REF(name) API_VAR_REF(name)
52*5d5fbe79SDavid van Moolenbroek #define NETIFAPI_VAR_DECLARE(name) API_VAR_DECLARE(struct netifapi_msg, name)
53*5d5fbe79SDavid van Moolenbroek #define NETIFAPI_VAR_ALLOC(name) API_VAR_ALLOC(struct netifapi_msg, MEMP_NETIFAPI_MSG, name, ERR_MEM)
54*5d5fbe79SDavid van Moolenbroek #define NETIFAPI_VAR_FREE(name) API_VAR_FREE(MEMP_NETIFAPI_MSG, name)
55*5d5fbe79SDavid van Moolenbroek
56*5d5fbe79SDavid van Moolenbroek /**
57*5d5fbe79SDavid van Moolenbroek * Call netif_add() inside the tcpip_thread context.
58*5d5fbe79SDavid van Moolenbroek */
59*5d5fbe79SDavid van Moolenbroek static err_t
netifapi_do_netif_add(struct tcpip_api_call_data * m)60*5d5fbe79SDavid van Moolenbroek netifapi_do_netif_add(struct tcpip_api_call_data *m)
61*5d5fbe79SDavid van Moolenbroek {
62*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
63*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct netifapi_msg */
64*5d5fbe79SDavid van Moolenbroek struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;
65*5d5fbe79SDavid van Moolenbroek
66*5d5fbe79SDavid van Moolenbroek if (!netif_add( msg->netif,
67*5d5fbe79SDavid van Moolenbroek #if LWIP_IPV4
68*5d5fbe79SDavid van Moolenbroek API_EXPR_REF(msg->msg.add.ipaddr),
69*5d5fbe79SDavid van Moolenbroek API_EXPR_REF(msg->msg.add.netmask),
70*5d5fbe79SDavid van Moolenbroek API_EXPR_REF(msg->msg.add.gw),
71*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_IPV4 */
72*5d5fbe79SDavid van Moolenbroek msg->msg.add.state,
73*5d5fbe79SDavid van Moolenbroek msg->msg.add.init,
74*5d5fbe79SDavid van Moolenbroek msg->msg.add.input)) {
75*5d5fbe79SDavid van Moolenbroek return ERR_IF;
76*5d5fbe79SDavid van Moolenbroek } else {
77*5d5fbe79SDavid van Moolenbroek return ERR_OK;
78*5d5fbe79SDavid van Moolenbroek }
79*5d5fbe79SDavid van Moolenbroek }
80*5d5fbe79SDavid van Moolenbroek
81*5d5fbe79SDavid van Moolenbroek #if LWIP_IPV4
82*5d5fbe79SDavid van Moolenbroek /**
83*5d5fbe79SDavid van Moolenbroek * Call netif_set_addr() inside the tcpip_thread context.
84*5d5fbe79SDavid van Moolenbroek */
85*5d5fbe79SDavid van Moolenbroek static err_t
netifapi_do_netif_set_addr(struct tcpip_api_call_data * m)86*5d5fbe79SDavid van Moolenbroek netifapi_do_netif_set_addr(struct tcpip_api_call_data *m)
87*5d5fbe79SDavid van Moolenbroek {
88*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
89*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct netifapi_msg */
90*5d5fbe79SDavid van Moolenbroek struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;
91*5d5fbe79SDavid van Moolenbroek
92*5d5fbe79SDavid van Moolenbroek netif_set_addr( msg->netif,
93*5d5fbe79SDavid van Moolenbroek API_EXPR_REF(msg->msg.add.ipaddr),
94*5d5fbe79SDavid van Moolenbroek API_EXPR_REF(msg->msg.add.netmask),
95*5d5fbe79SDavid van Moolenbroek API_EXPR_REF(msg->msg.add.gw));
96*5d5fbe79SDavid van Moolenbroek return ERR_OK;
97*5d5fbe79SDavid van Moolenbroek }
98*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_IPV4 */
99*5d5fbe79SDavid van Moolenbroek
100*5d5fbe79SDavid van Moolenbroek /**
101*5d5fbe79SDavid van Moolenbroek * Call netif_name_to_index() inside the tcpip_thread context.
102*5d5fbe79SDavid van Moolenbroek */
103*5d5fbe79SDavid van Moolenbroek static err_t
netifapi_do_name_to_index(struct tcpip_api_call_data * m)104*5d5fbe79SDavid van Moolenbroek netifapi_do_name_to_index(struct tcpip_api_call_data *m)
105*5d5fbe79SDavid van Moolenbroek {
106*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
107*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct netifapi_msg */
108*5d5fbe79SDavid van Moolenbroek struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;
109*5d5fbe79SDavid van Moolenbroek
110*5d5fbe79SDavid van Moolenbroek msg->msg.ifs.index = netif_name_to_index(msg->msg.ifs.name);
111*5d5fbe79SDavid van Moolenbroek return ERR_OK;
112*5d5fbe79SDavid van Moolenbroek }
113*5d5fbe79SDavid van Moolenbroek
114*5d5fbe79SDavid van Moolenbroek /**
115*5d5fbe79SDavid van Moolenbroek * Call netif_index_to_name() inside the tcpip_thread context.
116*5d5fbe79SDavid van Moolenbroek */
117*5d5fbe79SDavid van Moolenbroek static err_t
netifapi_do_index_to_name(struct tcpip_api_call_data * m)118*5d5fbe79SDavid van Moolenbroek netifapi_do_index_to_name(struct tcpip_api_call_data *m)
119*5d5fbe79SDavid van Moolenbroek {
120*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
121*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct netifapi_msg */
122*5d5fbe79SDavid van Moolenbroek struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;
123*5d5fbe79SDavid van Moolenbroek
124*5d5fbe79SDavid van Moolenbroek if (!netif_index_to_name(msg->msg.ifs.index, msg->msg.ifs.name)) {
125*5d5fbe79SDavid van Moolenbroek /* return failure via empty name */
126*5d5fbe79SDavid van Moolenbroek msg->msg.ifs.name[0] = '\0';
127*5d5fbe79SDavid van Moolenbroek }
128*5d5fbe79SDavid van Moolenbroek return ERR_OK;
129*5d5fbe79SDavid van Moolenbroek }
130*5d5fbe79SDavid van Moolenbroek
131*5d5fbe79SDavid van Moolenbroek /**
132*5d5fbe79SDavid van Moolenbroek * Call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) inside the
133*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
134*5d5fbe79SDavid van Moolenbroek */
135*5d5fbe79SDavid van Moolenbroek static err_t
netifapi_do_netif_common(struct tcpip_api_call_data * m)136*5d5fbe79SDavid van Moolenbroek netifapi_do_netif_common(struct tcpip_api_call_data *m)
137*5d5fbe79SDavid van Moolenbroek {
138*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
139*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct netifapi_msg */
140*5d5fbe79SDavid van Moolenbroek struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;
141*5d5fbe79SDavid van Moolenbroek
142*5d5fbe79SDavid van Moolenbroek if (msg->msg.common.errtfunc != NULL) {
143*5d5fbe79SDavid van Moolenbroek return msg->msg.common.errtfunc(msg->netif);
144*5d5fbe79SDavid van Moolenbroek } else {
145*5d5fbe79SDavid van Moolenbroek msg->msg.common.voidfunc(msg->netif);
146*5d5fbe79SDavid van Moolenbroek return ERR_OK;
147*5d5fbe79SDavid van Moolenbroek }
148*5d5fbe79SDavid van Moolenbroek }
149*5d5fbe79SDavid van Moolenbroek
150*5d5fbe79SDavid van Moolenbroek /**
151*5d5fbe79SDavid van Moolenbroek * @ingroup netifapi_netif
152*5d5fbe79SDavid van Moolenbroek * Call netif_add() in a thread-safe way by running that function inside the
153*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
154*5d5fbe79SDavid van Moolenbroek *
155*5d5fbe79SDavid van Moolenbroek * @note for params @see netif_add()
156*5d5fbe79SDavid van Moolenbroek */
157*5d5fbe79SDavid van Moolenbroek err_t
netifapi_netif_add(struct netif * netif,const ip4_addr_t * ipaddr,const ip4_addr_t * netmask,const ip4_addr_t * gw,void * state,netif_init_fn init,netif_input_fn input)158*5d5fbe79SDavid van Moolenbroek netifapi_netif_add(struct netif *netif,
159*5d5fbe79SDavid van Moolenbroek #if LWIP_IPV4
160*5d5fbe79SDavid van Moolenbroek const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,
161*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_IPV4 */
162*5d5fbe79SDavid van Moolenbroek void *state, netif_init_fn init, netif_input_fn input)
163*5d5fbe79SDavid van Moolenbroek {
164*5d5fbe79SDavid van Moolenbroek err_t err;
165*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_DECLARE(msg);
166*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_ALLOC(msg);
167*5d5fbe79SDavid van Moolenbroek
168*5d5fbe79SDavid van Moolenbroek #if LWIP_IPV4
169*5d5fbe79SDavid van Moolenbroek if (ipaddr == NULL) {
170*5d5fbe79SDavid van Moolenbroek ipaddr = IP4_ADDR_ANY4;
171*5d5fbe79SDavid van Moolenbroek }
172*5d5fbe79SDavid van Moolenbroek if (netmask == NULL) {
173*5d5fbe79SDavid van Moolenbroek netmask = IP4_ADDR_ANY4;
174*5d5fbe79SDavid van Moolenbroek }
175*5d5fbe79SDavid van Moolenbroek if (gw == NULL) {
176*5d5fbe79SDavid van Moolenbroek gw = IP4_ADDR_ANY4;
177*5d5fbe79SDavid van Moolenbroek }
178*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_IPV4 */
179*5d5fbe79SDavid van Moolenbroek
180*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).netif = netif;
181*5d5fbe79SDavid van Moolenbroek #if LWIP_IPV4
182*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.ipaddr = NETIFAPI_VAR_REF(ipaddr);
183*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);
184*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.gw = NETIFAPI_VAR_REF(gw);
185*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_IPV4 */
186*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.state = state;
187*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.init = init;
188*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.input = input;
189*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(netifapi_do_netif_add, &API_VAR_REF(msg).call);
190*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_FREE(msg);
191*5d5fbe79SDavid van Moolenbroek return err;
192*5d5fbe79SDavid van Moolenbroek }
193*5d5fbe79SDavid van Moolenbroek
194*5d5fbe79SDavid van Moolenbroek #if LWIP_IPV4
195*5d5fbe79SDavid van Moolenbroek /**
196*5d5fbe79SDavid van Moolenbroek * @ingroup netifapi_netif
197*5d5fbe79SDavid van Moolenbroek * Call netif_set_addr() in a thread-safe way by running that function inside the
198*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
199*5d5fbe79SDavid van Moolenbroek *
200*5d5fbe79SDavid van Moolenbroek * @note for params @see netif_set_addr()
201*5d5fbe79SDavid van Moolenbroek */
202*5d5fbe79SDavid van Moolenbroek err_t
netifapi_netif_set_addr(struct netif * netif,const ip4_addr_t * ipaddr,const ip4_addr_t * netmask,const ip4_addr_t * gw)203*5d5fbe79SDavid van Moolenbroek netifapi_netif_set_addr(struct netif *netif,
204*5d5fbe79SDavid van Moolenbroek const ip4_addr_t *ipaddr,
205*5d5fbe79SDavid van Moolenbroek const ip4_addr_t *netmask,
206*5d5fbe79SDavid van Moolenbroek const ip4_addr_t *gw)
207*5d5fbe79SDavid van Moolenbroek {
208*5d5fbe79SDavid van Moolenbroek err_t err;
209*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_DECLARE(msg);
210*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_ALLOC(msg);
211*5d5fbe79SDavid van Moolenbroek
212*5d5fbe79SDavid van Moolenbroek if (ipaddr == NULL) {
213*5d5fbe79SDavid van Moolenbroek ipaddr = IP4_ADDR_ANY4;
214*5d5fbe79SDavid van Moolenbroek }
215*5d5fbe79SDavid van Moolenbroek if (netmask == NULL) {
216*5d5fbe79SDavid van Moolenbroek netmask = IP4_ADDR_ANY4;
217*5d5fbe79SDavid van Moolenbroek }
218*5d5fbe79SDavid van Moolenbroek if (gw == NULL) {
219*5d5fbe79SDavid van Moolenbroek gw = IP4_ADDR_ANY4;
220*5d5fbe79SDavid van Moolenbroek }
221*5d5fbe79SDavid van Moolenbroek
222*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).netif = netif;
223*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.ipaddr = NETIFAPI_VAR_REF(ipaddr);
224*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);
225*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.add.gw = NETIFAPI_VAR_REF(gw);
226*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(netifapi_do_netif_set_addr, &API_VAR_REF(msg).call);
227*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_FREE(msg);
228*5d5fbe79SDavid van Moolenbroek return err;
229*5d5fbe79SDavid van Moolenbroek }
230*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_IPV4 */
231*5d5fbe79SDavid van Moolenbroek
232*5d5fbe79SDavid van Moolenbroek /**
233*5d5fbe79SDavid van Moolenbroek * call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) in a thread-safe
234*5d5fbe79SDavid van Moolenbroek * way by running that function inside the tcpip_thread context.
235*5d5fbe79SDavid van Moolenbroek *
236*5d5fbe79SDavid van Moolenbroek * @note use only for functions where there is only "netif" parameter.
237*5d5fbe79SDavid van Moolenbroek */
238*5d5fbe79SDavid van Moolenbroek err_t
netifapi_netif_common(struct netif * netif,netifapi_void_fn voidfunc,netifapi_errt_fn errtfunc)239*5d5fbe79SDavid van Moolenbroek netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,
240*5d5fbe79SDavid van Moolenbroek netifapi_errt_fn errtfunc)
241*5d5fbe79SDavid van Moolenbroek {
242*5d5fbe79SDavid van Moolenbroek err_t err;
243*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_DECLARE(msg);
244*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_ALLOC(msg);
245*5d5fbe79SDavid van Moolenbroek
246*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).netif = netif;
247*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.common.voidfunc = voidfunc;
248*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.common.errtfunc = errtfunc;
249*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(netifapi_do_netif_common, &API_VAR_REF(msg).call);
250*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_FREE(msg);
251*5d5fbe79SDavid van Moolenbroek return err;
252*5d5fbe79SDavid van Moolenbroek }
253*5d5fbe79SDavid van Moolenbroek
254*5d5fbe79SDavid van Moolenbroek /**
255*5d5fbe79SDavid van Moolenbroek * @ingroup netifapi_netif
256*5d5fbe79SDavid van Moolenbroek * Call netif_name_to_index() in a thread-safe way by running that function inside the
257*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
258*5d5fbe79SDavid van Moolenbroek *
259*5d5fbe79SDavid van Moolenbroek * @param name the interface name of the netif
260*5d5fbe79SDavid van Moolenbroek * @param idx output index of the found netif
261*5d5fbe79SDavid van Moolenbroek */
262*5d5fbe79SDavid van Moolenbroek err_t
netifapi_netif_name_to_index(const char * name,u8_t * idx)263*5d5fbe79SDavid van Moolenbroek netifapi_netif_name_to_index(const char *name, u8_t *idx)
264*5d5fbe79SDavid van Moolenbroek {
265*5d5fbe79SDavid van Moolenbroek err_t err;
266*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_DECLARE(msg);
267*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_ALLOC(msg);
268*5d5fbe79SDavid van Moolenbroek
269*5d5fbe79SDavid van Moolenbroek *idx = 0;
270*5d5fbe79SDavid van Moolenbroek
271*5d5fbe79SDavid van Moolenbroek #if LWIP_MPU_COMPATIBLE
272*5d5fbe79SDavid van Moolenbroek strncpy(NETIFAPI_VAR_REF(msg).msg.ifs.name, name, NETIF_NAMESIZE - 1);
273*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.ifs.name[NETIF_NAMESIZE - 1] = '\0';
274*5d5fbe79SDavid van Moolenbroek #else
275*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.ifs.name = LWIP_CONST_CAST(char*, name);
276*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_MPU_COMPATIBLE */
277*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(netifapi_do_name_to_index, &API_VAR_REF(msg).call);
278*5d5fbe79SDavid van Moolenbroek if (!err) {
279*5d5fbe79SDavid van Moolenbroek *idx = NETIFAPI_VAR_REF(msg).msg.ifs.index;
280*5d5fbe79SDavid van Moolenbroek }
281*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_FREE(msg);
282*5d5fbe79SDavid van Moolenbroek return err;
283*5d5fbe79SDavid van Moolenbroek }
284*5d5fbe79SDavid van Moolenbroek
285*5d5fbe79SDavid van Moolenbroek /**
286*5d5fbe79SDavid van Moolenbroek * @ingroup netifapi_netif
287*5d5fbe79SDavid van Moolenbroek * Call netif_index_to_name() in a thread-safe way by running that function inside the
288*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
289*5d5fbe79SDavid van Moolenbroek *
290*5d5fbe79SDavid van Moolenbroek * @param idx the interface index of the netif
291*5d5fbe79SDavid van Moolenbroek * @param name output name of the found netif, empty '\0' string if netif not found.
292*5d5fbe79SDavid van Moolenbroek * name should be of at least NETIF_NAMESIZE bytes
293*5d5fbe79SDavid van Moolenbroek */
294*5d5fbe79SDavid van Moolenbroek err_t
netifapi_netif_index_to_name(u8_t idx,char * name)295*5d5fbe79SDavid van Moolenbroek netifapi_netif_index_to_name(u8_t idx, char *name)
296*5d5fbe79SDavid van Moolenbroek {
297*5d5fbe79SDavid van Moolenbroek err_t err;
298*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_DECLARE(msg);
299*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_ALLOC(msg);
300*5d5fbe79SDavid van Moolenbroek
301*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.ifs.index = idx;
302*5d5fbe79SDavid van Moolenbroek #if !LWIP_MPU_COMPATIBLE
303*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_REF(msg).msg.ifs.name = name;
304*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_MPU_COMPATIBLE */
305*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(netifapi_do_index_to_name, &API_VAR_REF(msg).call);
306*5d5fbe79SDavid van Moolenbroek #if LWIP_MPU_COMPATIBLE
307*5d5fbe79SDavid van Moolenbroek if (!err) {
308*5d5fbe79SDavid van Moolenbroek strncpy(name, NETIFAPI_VAR_REF(msg).msg.ifs.name, NETIF_NAMESIZE - 1);
309*5d5fbe79SDavid van Moolenbroek name[NETIF_NAMESIZE - 1] = '\0';
310*5d5fbe79SDavid van Moolenbroek }
311*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_MPU_COMPATIBLE */
312*5d5fbe79SDavid van Moolenbroek NETIFAPI_VAR_FREE(msg);
313*5d5fbe79SDavid van Moolenbroek return err;
314*5d5fbe79SDavid van Moolenbroek }
315*5d5fbe79SDavid van Moolenbroek
316*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_NETIF_API */
317