diff --git a/CHANGELOG b/CHANGELOG index 73bb33b3..06c7dc49 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -23,6 +23,11 @@ HISTORY ++ New features: + 2007-04-06 Frédéric Bernon, Simon Goldschmidt + * opt.h, tcpip.h, tcpip.c, netifapi.h, netifapi.c: New configuration option LWIP_NETIF_API + allow to use thread-safe functions to add/remove netif in list, and to start/stop dhcp + clients, using new functions from netifapi.h. Disable as default (no port change to do). + 2007-04-05 Frédéric Bernon * sockets.c: remplace ENOBUFS errors on alloc_socket by ENFILE to be more BSD compliant. diff --git a/src/api/netifapi.c b/src/api/netifapi.c new file mode 100644 index 00000000..8ca3d79e --- /dev/null +++ b/src/api/netifapi.c @@ -0,0 +1,118 @@ +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "lwip/opt.h" +#include "lwip/arch.h" +#include "lwip/netifapi.h" +#include "lwip/tcpip.h" + +#if LWIP_NETIF_API + +err_t +netifapi_netif_add( struct netif *netif, + struct ip_addr *ipaddr, + struct ip_addr *netmask, + struct ip_addr *gw, + void *state, + err_t (* init)(struct netif *netif), + err_t (* input)(struct pbuf *p, struct netif *netif) ) +{ struct netifapi_msg msg; + msg.type = NETIFAPI_MSG_NETIF_ADD; + msg.netif = netif; + msg.msg.add.ipaddr = ipaddr; + msg.msg.add.netmask = netmask; + msg.msg.add.gw = gw; + msg.msg.add.state = state; + msg.msg.add.init = init; + msg.msg.add.input = input; + netifapi_msg_post(&msg); + return msg.err; +} + +err_t +netifapi_netif_remove( struct netif *netif) +{ struct netifapi_msg msg; + msg.type = NETIFAPI_MSG_NETIF_REMOVE; + msg.netif = netif; + netifapi_msg_post(&msg); + return msg.err; +} + +err_t +netifapi_dhcp_start( struct netif *netif) +{ struct netifapi_msg msg; + msg.type = NETIFAPI_MSG_DHCP_START; + msg.netif = netif; + netifapi_msg_post(&msg); + return msg.err; +} + +err_t +netifapi_dhcp_stop( struct netif *netif) +{ struct netifapi_msg msg; + msg.type = NETIFAPI_MSG_DHCP_STOP; + msg.netif = netif; + netifapi_msg_post(&msg); + return msg.err; +} + +void +netifapi_msg_input( struct netifapi_msg *msg) +{ msg->err = ERR_OK; + switch (msg->type) { + case NETIFAPI_MSG_NETIF_ADD: { + if (!netif_add( msg->netif, + msg->msg.add.ipaddr, + msg->msg.add.netmask, + msg->msg.add.gw, + msg->msg.add.state, + msg->msg.add.init, + msg->msg.add.input)) + msg->err = ERR_IF; + break; + } + case NETIFAPI_MSG_NETIF_REMOVE: + netif_remove(msg->netif); + break; +#if LWIP_DHCP + case NETIFAPI_MSG_DHCP_START: + msg->err = dhcp_start(msg->netif); + break; + case NETIFAPI_MSG_DHCP_STOP: + dhcp_stop(msg->netif); + break; +#endif /* LWIP_DHCP */ + } + sys_sem_signal(msg->sem); +} + +err_t +netifapi_msg_post( struct netifapi_msg *msg) +{ return tcpip_netifapi(msg); +} + +#endif /* LWIP_NETIF_API */ diff --git a/src/api/tcpip.c b/src/api/tcpip.c index 1b4f1504..c349d52b 100644 --- a/src/api/tcpip.c +++ b/src/api/tcpip.c @@ -198,6 +198,7 @@ tcpip_thread(void *arg) case TCPIP_MSG_INPUT: LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: IP packet %p\n", (void *)msg)); ip_input(msg->msg.inp.p, msg->msg.inp.netif); + memp_free(MEMP_TCPIP_MSG, msg); break; #endif /* ETHARP_TCPIP_INPUT */ @@ -205,20 +206,25 @@ tcpip_thread(void *arg) case TCPIP_MSG_ETHINPUT: LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: Ethernet packet %p\n", (void *)msg)); ethernet_input(msg->msg.inp.p, msg->msg.inp.netif); + memp_free(MEMP_TCPIP_MSG, msg); break; #endif /* ETHARP_TCPIP_ETHINPUT */ +#if LWIP_NETIF_API + case TCPIP_MSG_NETIFAPI: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: Netif API message %p\n", (void *)msg)); + netifapi_msg_input(msg->msg.netifapimsg); + break; +#endif /* LWIP_NETIF_API */ + case TCPIP_MSG_CALLBACK: LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg)); msg->msg.cb.f(msg->msg.cb.ctx); + memp_free(MEMP_TCPIP_MSG, msg); break; default: break; } - - if (msg->type!=TCPIP_MSG_API) { - memp_free(MEMP_TCPIP_MSG, msg); - } } } @@ -303,6 +309,29 @@ tcpip_apimsg(struct api_msg *apimsg) return ERR_VAL; } +#if LWIP_NETIF_API +err_t tcpip_netifapi(struct netifapi_msg* netifapimsg) +{ + struct tcpip_msg msg; + + if (mbox != SYS_MBOX_NULL) { + netifapimsg->sem = sys_sem_new(0); + if (netifapimsg->sem == SYS_SEM_NULL) { + netifapimsg->err = ERR_MEM; + return netifapimsg->err; + } + + msg.type = TCPIP_MSG_NETIFAPI; + msg.msg.netifapimsg = netifapimsg; + sys_mbox_post(mbox, &msg); + sys_sem_wait(netifapimsg->sem); + sys_sem_free(netifapimsg->sem); + return netifapimsg->err; + } + return ERR_VAL; +} +#endif /* LWIP_NETIF_API */ + void tcpip_init(void (* initfunc)(void *), void *arg) { diff --git a/src/include/lwip/netifapi.h b/src/include/lwip/netifapi.h new file mode 100644 index 00000000..dfe7b0ef --- /dev/null +++ b/src/include/lwip/netifapi.h @@ -0,0 +1,87 @@ +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __LWIP_NETIFAPI_H__ +#define __LWIP_NETIFAPI_H__ + +#include "lwip/opt.h" +#include "lwip/sys.h" +#include "lwip/netif.h" +#include "lwip/dhcp.h" + +#if LWIP_NETIF_API + +enum netifapi_msg_type { + NETIFAPI_MSG_NETIF_ADD, + NETIFAPI_MSG_NETIF_REMOVE, +#if LWIP_DHCP + NETIFAPI_MSG_DHCP_START, + NETIFAPI_MSG_DHCP_STOP +#endif /* LWIP_DHCP */ +}; + +struct netifapi_msg { + enum netifapi_msg_type type; + sys_sem_t sem; + err_t err; + struct netif *netif; + union { + struct { + struct ip_addr *ipaddr; + struct ip_addr *netmask; + struct ip_addr *gw; + void *state; + err_t (* init)(struct netif *netif); + err_t (* input)(struct pbuf *p, struct netif *netif); + } add; + } msg; +}; + + +/* API for application */ +err_t netifapi_netif_add ( struct netif *netif, + struct ip_addr *ipaddr, + struct ip_addr *netmask, + struct ip_addr *gw, + void *state, + err_t (* init)(struct netif *netif), + err_t (* input)(struct pbuf *p, struct netif *netif) ); + +err_t netifapi_netif_remove( struct netif *netif); + +err_t netifapi_dhcp_start ( struct netif *netif); + +err_t netifapi_dhcp_stop ( struct netif *netif); + + +/* API for tcpip_thread */ +void netifapi_msg_input(struct netifapi_msg *msg); +err_t netifapi_msg_post (struct netifapi_msg *msg); + +#endif /* LWIP_NETIF_API */ + +#endif /* __LWIP_NETIFAPI_H__ */ diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h index 42d1182d..eafb72fe 100644 --- a/src/include/lwip/opt.h +++ b/src/include/lwip/opt.h @@ -393,6 +393,11 @@ a lot of data that needs to be copied, this should be set high. */ #define LWIP_NETIF_HOSTNAME 0 #endif +/* Support network interface API */ +#ifndef LWIP_NETIF_API +#define LWIP_NETIF_API 0 +#endif + /* Support network interface callbacks */ #ifndef LWIP_NETIF_CALLBACK #define LWIP_NETIF_CALLBACK 0 diff --git a/src/include/lwip/tcpip.h b/src/include/lwip/tcpip.h index f3ce388d..ed7fbea0 100644 --- a/src/include/lwip/tcpip.h +++ b/src/include/lwip/tcpip.h @@ -33,6 +33,7 @@ #define __LWIP_TCPIP_H__ #include "lwip/api_msg.h" +#include "lwip/netifapi.h" #include "lwip/pbuf.h" void tcpip_init(void (* tcpip_init_done)(void *), void *arg); @@ -43,10 +44,11 @@ err_t tcpip_input(struct pbuf *p, struct netif *inp); #if ETHARP_TCPIP_ETHINPUT err_t tcpip_ethinput(struct pbuf *p, struct netif *inp); #endif /* ETHARP_TCPIP_ETHINPUT */ +#if LWIP_NETIF_API +err_t tcpip_netifapi(struct netifapi_msg* netifapimsg); +#endif /* LWIP_NETIF_API */ err_t tcpip_callback(void (*f)(void *ctx), void *ctx); -void tcpip_tcp_timer_needed(void); - enum tcpip_msg_type { TCPIP_MSG_API, #if ETHARP_TCPIP_INPUT @@ -55,6 +57,9 @@ enum tcpip_msg_type { #if ETHARP_TCPIP_ETHINPUT TCPIP_MSG_ETHINPUT, #endif /* ETHARP_TCPIP_ETHINPUT */ +#if LWIP_NETIF_API + TCPIP_MSG_NETIFAPI, +#endif /* LWIP_NETIF_API */ TCPIP_MSG_CALLBACK }; @@ -63,6 +68,9 @@ struct tcpip_msg { sys_sem_t *sem; union { struct api_msg *apimsg; +#if LWIP_NETIF_API + struct netifapi_msg *netifapimsg; +#endif /* LWIP_NETIF_API */ struct { struct pbuf *p; struct netif *netif;