Home | History | Annotate | Download | only in lwip
      1 /*
      2  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without modification,
      6  * are permitted provided that the following conditions are met:
      7  *
      8  * 1. Redistributions of source code must retain the above copyright notice,
      9  *    this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright notice,
     11  *    this list of conditions and the following disclaimer in the documentation
     12  *    and/or other materials provided with the distribution.
     13  * 3. The name of the author may not be used to endorse or promote products
     14  *    derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
     19  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
     21  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
     25  * OF SUCH DAMAGE.
     26  *
     27  * This file is part of the lwIP TCP/IP stack.
     28  *
     29  * Author: Adam Dunkels <adam (at) sics.se>
     30  *
     31  */
     32 #ifndef __LWIP_TCPIP_H__
     33 #define __LWIP_TCPIP_H__
     34 
     35 #include "lwip/opt.h"
     36 
     37 #if !NO_SYS /* don't build if not configured for use in lwipopts.h */
     38 
     39 #include "lwip/api_msg.h"
     40 #include "lwip/netifapi.h"
     41 #include "lwip/pbuf.h"
     42 #include "lwip/api.h"
     43 #include "lwip/sys.h"
     44 #include "lwip/timers.h"
     45 #include "lwip/netif.h"
     46 
     47 #ifdef __cplusplus
     48 extern "C" {
     49 #endif
     50 
     51 /** Define this to something that triggers a watchdog. This is called from
     52  * tcpip_thread after processing a message. */
     53 #ifndef LWIP_TCPIP_THREAD_ALIVE
     54 #define LWIP_TCPIP_THREAD_ALIVE()
     55 #endif
     56 
     57 #if LWIP_TCPIP_CORE_LOCKING
     58 /** The global semaphore to lock the stack. */
     59 extern sys_mutex_t lock_tcpip_core;
     60 #define LOCK_TCPIP_CORE()     sys_mutex_lock(&lock_tcpip_core)
     61 #define UNLOCK_TCPIP_CORE()   sys_mutex_unlock(&lock_tcpip_core)
     62 #define TCPIP_APIMSG(m)       tcpip_apimsg_lock(m)
     63 #define TCPIP_APIMSG_ACK(m)
     64 #define TCPIP_NETIFAPI(m)     tcpip_netifapi_lock(m)
     65 #define TCPIP_NETIFAPI_ACK(m)
     66 #else /* LWIP_TCPIP_CORE_LOCKING */
     67 #define LOCK_TCPIP_CORE()
     68 #define UNLOCK_TCPIP_CORE()
     69 #define TCPIP_APIMSG(m)       tcpip_apimsg(m)
     70 #define TCPIP_APIMSG_ACK(m)   sys_sem_signal(&m->conn->op_completed)
     71 #define TCPIP_NETIFAPI(m)     tcpip_netifapi(m)
     72 #define TCPIP_NETIFAPI_ACK(m) sys_sem_signal(&m->sem)
     73 #endif /* LWIP_TCPIP_CORE_LOCKING */
     74 
     75 /** Function prototype for the init_done function passed to tcpip_init */
     76 typedef void (*tcpip_init_done_fn)(void *arg);
     77 /** Function prototype for functions passed to tcpip_callback() */
     78 typedef void (*tcpip_callback_fn)(void *ctx);
     79 
     80 void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg);
     81 
     82 #if LWIP_NETCONN
     83 err_t tcpip_apimsg(struct api_msg *apimsg);
     84 #if LWIP_TCPIP_CORE_LOCKING
     85 err_t tcpip_apimsg_lock(struct api_msg *apimsg);
     86 #endif /* LWIP_TCPIP_CORE_LOCKING */
     87 #endif /* LWIP_NETCONN */
     88 
     89 err_t tcpip_input(struct pbuf *p, struct netif *inp);
     90 
     91 #if LWIP_NETIF_API
     92 err_t tcpip_netifapi(struct netifapi_msg *netifapimsg);
     93 #if LWIP_TCPIP_CORE_LOCKING
     94 err_t tcpip_netifapi_lock(struct netifapi_msg *netifapimsg);
     95 #endif /* LWIP_TCPIP_CORE_LOCKING */
     96 #endif /* LWIP_NETIF_API */
     97 
     98 err_t tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block);
     99 #define tcpip_callback(f, ctx)              tcpip_callback_with_block(f, ctx, 1)
    100 
    101 /* free pbufs or heap memory from another context without blocking */
    102 err_t pbuf_free_callback(struct pbuf *p);
    103 err_t mem_free_callback(void *m);
    104 
    105 #if LWIP_TCPIP_TIMEOUT
    106 err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg);
    107 err_t tcpip_untimeout(sys_timeout_handler h, void *arg);
    108 #endif /* LWIP_TCPIP_TIMEOUT */
    109 
    110 enum tcpip_msg_type {
    111 #if LWIP_NETCONN
    112   TCPIP_MSG_API,
    113 #endif /* LWIP_NETCONN */
    114   TCPIP_MSG_INPKT,
    115 #if LWIP_NETIF_API
    116   TCPIP_MSG_NETIFAPI,
    117 #endif /* LWIP_NETIF_API */
    118 #if LWIP_TCPIP_TIMEOUT
    119   TCPIP_MSG_TIMEOUT,
    120   TCPIP_MSG_UNTIMEOUT,
    121 #endif /* LWIP_TCPIP_TIMEOUT */
    122   TCPIP_MSG_CALLBACK
    123 };
    124 
    125 struct tcpip_msg {
    126   enum tcpip_msg_type type;
    127   sys_sem_t *sem;
    128   union {
    129 #if LWIP_NETCONN
    130     struct api_msg *apimsg;
    131 #endif /* LWIP_NETCONN */
    132 #if LWIP_NETIF_API
    133     struct netifapi_msg *netifapimsg;
    134 #endif /* LWIP_NETIF_API */
    135     struct {
    136       struct pbuf *p;
    137       struct netif *netif;
    138     } inp;
    139     struct {
    140       tcpip_callback_fn function;
    141       void *ctx;
    142     } cb;
    143 #if LWIP_TCPIP_TIMEOUT
    144     struct {
    145       u32_t msecs;
    146       sys_timeout_handler h;
    147       void *arg;
    148     } tmo;
    149 #endif /* LWIP_TCPIP_TIMEOUT */
    150   } msg;
    151 };
    152 
    153 #ifdef __cplusplus
    154 }
    155 #endif
    156 
    157 #endif /* !NO_SYS */
    158 
    159 #endif /* __LWIP_TCPIP_H__ */
    160