1/**
2 * @file
3 * Network Interface Sequential API module
4 *
5 */
6
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/tcpip.h"
40
41/**
42 * Call netif_add() inside the tcpip_thread context.
43 */
44void do_netifapi_netif_add(struct netifapi_msg_msg *msg)
45{
46    if (!netif_add(msg->netif,
47                   msg->msg.add.ipaddr,
48                   msg->msg.add.netmask,
49                   msg->msg.add.gw,
50                   msg->msg.add.state, msg->msg.add.init, msg->msg.add.input)) {
51        msg->err = ERR_IF;
52    } else {
53        msg->err = ERR_OK;
54    }
55    TCPIP_NETIFAPI_ACK(msg);
56}
57
58/**
59 * Call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) inside the
60 * tcpip_thread context.
61 */
62void do_netifapi_netif_common(struct netifapi_msg_msg *msg)
63{
64    if (msg->msg.common.errtfunc != NULL) {
65        msg->err = msg->msg.common.errtfunc(msg->netif);
66    } else {
67        msg->err = ERR_OK;
68        msg->msg.common.voidfunc(msg->netif);
69    }
70    TCPIP_NETIFAPI_ACK(msg);
71}
72
73/**
74 * Call netif_add() in a thread-safe way by running that function inside the
75 * tcpip_thread context.
76 *
77 * @note for params @see netif_add()
78 */
79err_t
80netifapi_netif_add(struct netif *netif,
81                   struct ip_addr *ipaddr,
82                   struct ip_addr *netmask,
83                   struct ip_addr *gw,
84                   void *state,
85                   err_t(*init) (struct netif * netif),
86                   err_t(*input) (struct pbuf * p, struct netif * netif))
87{
88    struct netifapi_msg msg;
89
90    msg.function = do_netifapi_netif_add;
91    msg.msg.netif = netif;
92    msg.msg.msg.add.ipaddr = ipaddr;
93    msg.msg.msg.add.netmask = netmask;
94    msg.msg.msg.add.gw = gw;
95    msg.msg.msg.add.state = state;
96    msg.msg.msg.add.init = init;
97    msg.msg.msg.add.input = input;
98    TCPIP_NETIFAPI(&msg);
99    return msg.msg.err;
100}
101
102/**
103 * call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) in a thread-safe
104 * way by running that function inside the tcpip_thread context.
105 *
106 * @note use only for functions where there is only "netif" parameter.
107 */
108err_t
109netifapi_netif_common(struct netif * netif,
110                      void (*voidfunc) (struct netif * netif),
111                      err_t(*errtfunc) (struct netif * netif))
112{
113    struct netifapi_msg msg;
114
115    msg.function = do_netifapi_netif_common;
116    msg.msg.netif = netif;
117    msg.msg.msg.common.voidfunc = voidfunc;
118    msg.msg.msg.common.errtfunc = errtfunc;
119    TCPIP_NETIFAPI(&msg);
120    return msg.msg.err;
121}
122
123#endif                          /* LWIP_NETIF_API */
124