STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
netifapi.c
Go to the documentation of this file.
1 
7 /*
8  * Redistribution and use in source and binary forms, with or without modification,
9  * are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright notice,
12  * this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions and the following disclaimer in the documentation
15  * and/or other materials provided with the distribution.
16  * 3. The name of the author may not be used to endorse or promote products
17  * derived from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
20  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
22  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
28  * OF SUCH DAMAGE.
29  *
30  * This file is part of the lwIP TCP/IP stack.
31  *
32  */
33 
34 #include "lwip/opt.h"
35 
36 #if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */
37 
38 #include "lwip/netifapi.h"
39 #include "lwip/memp.h"
40 #include "lwip/priv/tcpip_priv.h"
41 
42 #define NETIFAPI_VAR_REF(name) API_VAR_REF(name)
43 #define NETIFAPI_VAR_DECLARE(name) API_VAR_DECLARE(struct netifapi_msg, name)
44 #define NETIFAPI_VAR_ALLOC(name) API_VAR_ALLOC(struct netifapi_msg, MEMP_NETIFAPI_MSG, name)
45 #define NETIFAPI_VAR_FREE(name) API_VAR_FREE(MEMP_NETIFAPI_MSG, name)
46 
50 static void
51 netifapi_do_netif_add(struct netifapi_msg_msg *msg)
52 {
53  if (!netif_add( msg->netif,
54 #if LWIP_IPV4
55  API_EXPR_REF(msg->msg.add.ipaddr),
56  API_EXPR_REF(msg->msg.add.netmask),
57  API_EXPR_REF(msg->msg.add.gw),
58 #endif /* LWIP_IPV4 */
59  msg->msg.add.state,
60  msg->msg.add.init,
61  msg->msg.add.input)) {
62  msg->err = ERR_IF;
63  } else {
64  msg->err = ERR_OK;
65  }
66  TCPIP_NETIFAPI_ACK(msg);
67 }
68 
69 #if LWIP_IPV4
70 
73 static void
74 netifapi_do_netif_set_addr(struct netifapi_msg_msg *msg)
75 {
76  netif_set_addr( msg->netif,
77  API_EXPR_REF(msg->msg.add.ipaddr),
78  API_EXPR_REF(msg->msg.add.netmask),
79  API_EXPR_REF(msg->msg.add.gw));
80  msg->err = ERR_OK;
81  TCPIP_NETIFAPI_ACK(msg);
82 }
83 #endif /* LWIP_IPV4 */
84 
89 static void
90 netifapi_do_netif_common(struct netifapi_msg_msg *msg)
91 {
92  if (msg->msg.common.errtfunc != NULL) {
93  msg->err = msg->msg.common.errtfunc(msg->netif);
94  } else {
95  msg->err = ERR_OK;
96  msg->msg.common.voidfunc(msg->netif);
97  }
98  TCPIP_NETIFAPI_ACK(msg);
99 }
100 
107 err_t
108 netifapi_netif_add(struct netif *netif,
109 #if LWIP_IPV4
110  const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,
111 #endif /* LWIP_IPV4 */
112  void *state, netif_init_fn init, netif_input_fn input)
113 {
114  err_t err;
115  NETIFAPI_VAR_DECLARE(msg);
116  NETIFAPI_VAR_ALLOC(msg);
117 #if LWIP_MPU_COMPATIBLE
118  if (ipaddr == NULL) {
119  ipaddr = IP4_ADDR_ANY;
120  }
121  if (netmask == NULL) {
122  netmask = IP4_ADDR_ANY;
123  }
124  if (gw == NULL) {
125  gw = IP4_ADDR_ANY;
126  }
127 #endif /* LWIP_MPU_COMPATIBLE */
128  NETIFAPI_VAR_REF(msg).function = netifapi_do_netif_add;
129  NETIFAPI_VAR_REF(msg).msg.netif = netif;
130 #if LWIP_IPV4
131  NETIFAPI_VAR_REF(msg).msg.msg.add.ipaddr = NETIFAPI_VAR_REF(ipaddr);
132  NETIFAPI_VAR_REF(msg).msg.msg.add.netmask = NETIFAPI_VAR_REF(netmask);
133  NETIFAPI_VAR_REF(msg).msg.msg.add.gw = NETIFAPI_VAR_REF(gw);
134 #endif /* LWIP_IPV4 */
135  NETIFAPI_VAR_REF(msg).msg.msg.add.state = state;
136  NETIFAPI_VAR_REF(msg).msg.msg.add.init = init;
137  NETIFAPI_VAR_REF(msg).msg.msg.add.input = input;
139 
140  err = NETIFAPI_VAR_REF(msg).msg.err;
141  NETIFAPI_VAR_FREE(msg);
142  return err;
143 }
144 
145 #if LWIP_IPV4
146 
152 err_t
153 netifapi_netif_set_addr(struct netif *netif,
154  const ip4_addr_t *ipaddr,
155  const ip4_addr_t *netmask,
156  const ip4_addr_t *gw)
157 {
158  err_t err;
159  NETIFAPI_VAR_DECLARE(msg);
160  NETIFAPI_VAR_ALLOC(msg);
161 #if LWIP_MPU_COMPATIBLE
162  if (ipaddr == NULL) {
163  ipaddr = IP4_ADDR_ANY;
164  }
165  if (netmask == NULL) {
166  netmask = IP4_ADDR_ANY;
167  }
168  if (gw == NULL) {
169  gw = IP4_ADDR_ANY;
170  }
171 #endif /* LWIP_MPU_COMPATIBLE */
172  NETIFAPI_VAR_REF(msg).function = netifapi_do_netif_set_addr;
173  NETIFAPI_VAR_REF(msg).msg.netif = netif;
174  NETIFAPI_VAR_REF(msg).msg.msg.add.ipaddr = NETIFAPI_VAR_REF(ipaddr);
175  NETIFAPI_VAR_REF(msg).msg.msg.add.netmask = NETIFAPI_VAR_REF(netmask);
176  NETIFAPI_VAR_REF(msg).msg.msg.add.gw = NETIFAPI_VAR_REF(gw);
178 
179  err = NETIFAPI_VAR_REF(msg).msg.err;
180  NETIFAPI_VAR_FREE(msg);
181  return err;
182 }
183 #endif /* LWIP_IPV4 */
184 
191 err_t
192 netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,
193  netifapi_errt_fn errtfunc)
194 {
195  err_t err;
196  NETIFAPI_VAR_DECLARE(msg);
197  NETIFAPI_VAR_ALLOC(msg);
198 
199  NETIFAPI_VAR_REF(msg).function = netifapi_do_netif_common;
200  NETIFAPI_VAR_REF(msg).msg.netif = netif;
201  NETIFAPI_VAR_REF(msg).msg.msg.common.voidfunc = voidfunc;
202  NETIFAPI_VAR_REF(msg).msg.msg.common.errtfunc = errtfunc;
204 
205  err = NETIFAPI_VAR_REF(msg).msg.err;
206  NETIFAPI_VAR_FREE(msg);
207  return err;
208 }
209 
210 #endif /* LWIP_NETIF_API */
211 
err_t(* netif_input_fn)(struct pbuf *p, struct netif *inp)
Definition: netif.h:131
#define LWIP_IPV4
Definition: opt.h:549
#define API_EXPR_REF(expr)
Definition: tcpip_priv.h:130
#define API_VAR_REF(name)
Definition: tcpip_priv.h:125
#define TCPIP_NETIFAPI(m)
Definition: tcpip_priv.h:96
#define NULL
Definition: usbd_def.h:53
#define TCPIP_NETIFAPI_ACK(m)
Definition: tcpip_priv.h:97
#define ERR_OK
Definition: err.h:52
#define ERR_IF
Definition: err.h:73
s8_t err_t
Definition: err.h:47
Definition: netif.h:182
err_t(* netif_init_fn)(struct netif *netif)
Definition: netif.h:124
struct netif * netif_add(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input)
Definition: netif.c:184