1*5d5fbe79SDavid van Moolenbroek /** 2*5d5fbe79SDavid van Moolenbroek * @defgroup lwip lwIP 3*5d5fbe79SDavid van Moolenbroek * 4*5d5fbe79SDavid van Moolenbroek * @defgroup infrastructure Infrastructure 5*5d5fbe79SDavid van Moolenbroek * 6*5d5fbe79SDavid van Moolenbroek * @defgroup callbackstyle_api Callback-style APIs 7*5d5fbe79SDavid van Moolenbroek * Non thread-safe APIs, callback style for maximum performance and minimum 8*5d5fbe79SDavid van Moolenbroek * memory footprint. 9*5d5fbe79SDavid van Moolenbroek * 10*5d5fbe79SDavid van Moolenbroek * @defgroup sequential_api Sequential-style APIs 11*5d5fbe79SDavid van Moolenbroek * Sequential-style APIs, blocking functions. More overhead, but can be called 12*5d5fbe79SDavid van Moolenbroek * from any thread except TCPIP thread. 13*5d5fbe79SDavid van Moolenbroek * 14*5d5fbe79SDavid van Moolenbroek * @defgroup addons Addons 15*5d5fbe79SDavid van Moolenbroek * 16*5d5fbe79SDavid van Moolenbroek * @defgroup apps Applications 17*5d5fbe79SDavid van Moolenbroek */ 18*5d5fbe79SDavid van Moolenbroek 19*5d5fbe79SDavid van Moolenbroek /** 20*5d5fbe79SDavid van Moolenbroek * @mainpage Overview 21*5d5fbe79SDavid van Moolenbroek * @verbinclude "README" 22*5d5fbe79SDavid van Moolenbroek */ 23*5d5fbe79SDavid van Moolenbroek 24*5d5fbe79SDavid van Moolenbroek /** 25*5d5fbe79SDavid van Moolenbroek * @page upgrading Upgrading 26*5d5fbe79SDavid van Moolenbroek * @verbinclude "UPGRADING" 27*5d5fbe79SDavid van Moolenbroek */ 28*5d5fbe79SDavid van Moolenbroek 29*5d5fbe79SDavid van Moolenbroek /** 30*5d5fbe79SDavid van Moolenbroek * @page changelog Changelog 31*5d5fbe79SDavid van Moolenbroek * @verbinclude "CHANGELOG" 32*5d5fbe79SDavid van Moolenbroek */ 33*5d5fbe79SDavid van Moolenbroek 34*5d5fbe79SDavid van Moolenbroek /** 35*5d5fbe79SDavid van Moolenbroek * @page contrib How to contribute to lwIP 36*5d5fbe79SDavid van Moolenbroek * @verbinclude "contrib.txt" 37*5d5fbe79SDavid van Moolenbroek */ 38*5d5fbe79SDavid van Moolenbroek 39*5d5fbe79SDavid van Moolenbroek /** 40*5d5fbe79SDavid van Moolenbroek * @page pitfalls Common pitfalls 41*5d5fbe79SDavid van Moolenbroek * 42*5d5fbe79SDavid van Moolenbroek * Multiple Execution Contexts in lwIP code 43*5d5fbe79SDavid van Moolenbroek * ======================================== 44*5d5fbe79SDavid van Moolenbroek * 45*5d5fbe79SDavid van Moolenbroek * The most common source of lwIP problems is to have multiple execution contexts 46*5d5fbe79SDavid van Moolenbroek * inside the lwIP code. 47*5d5fbe79SDavid van Moolenbroek * 48*5d5fbe79SDavid van Moolenbroek * lwIP can be used in two basic modes: @ref lwip_nosys (no OS/RTOS 49*5d5fbe79SDavid van Moolenbroek * running on target system) or @ref lwip_os (there is an OS running 50*5d5fbe79SDavid van Moolenbroek * on the target system). 51*5d5fbe79SDavid van Moolenbroek * 52*5d5fbe79SDavid van Moolenbroek * Mainloop Mode 53*5d5fbe79SDavid van Moolenbroek * ------------- 54*5d5fbe79SDavid van Moolenbroek * In mainloop mode, only @ref callbackstyle_api can be used. 55*5d5fbe79SDavid van Moolenbroek * The user has two possibilities to ensure there is only one 56*5d5fbe79SDavid van Moolenbroek * exection context at a time in lwIP: 57*5d5fbe79SDavid van Moolenbroek * 58*5d5fbe79SDavid van Moolenbroek * 1) Deliver RX ethernet packets directly in interrupt context to lwIP 59*5d5fbe79SDavid van Moolenbroek * by calling netif->input directly in interrupt. This implies all lwIP 60*5d5fbe79SDavid van Moolenbroek * callback functions are called in IRQ context, which may cause further 61*5d5fbe79SDavid van Moolenbroek * problems in application code: IRQ is blocked for a long time, multiple 62*5d5fbe79SDavid van Moolenbroek * execution contexts in application code etc. When the application wants 63*5d5fbe79SDavid van Moolenbroek * to call lwIP, it only needs to disable interrupts during the call. 64*5d5fbe79SDavid van Moolenbroek * If timers are involved, even more locking code is needed to lock out 65*5d5fbe79SDavid van Moolenbroek * timer IRQ and ethernet IRQ from each other, assuming these may be nested. 66*5d5fbe79SDavid van Moolenbroek * 67*5d5fbe79SDavid van Moolenbroek * 2) Run lwIP in a mainloop. There is example code here: @ref lwip_nosys. 68*5d5fbe79SDavid van Moolenbroek * lwIP is _ONLY_ called from mainloop callstacks here. The ethernet IRQ 69*5d5fbe79SDavid van Moolenbroek * has to put received telegrams into a queue which is polled in the 70*5d5fbe79SDavid van Moolenbroek * mainloop. Ensure lwIP is _NEVER_ called from an interrupt, e.g. 71*5d5fbe79SDavid van Moolenbroek * some SPI IRQ wants to forward data to udp_send() or tcp_write()! 72*5d5fbe79SDavid van Moolenbroek * 73*5d5fbe79SDavid van Moolenbroek * OS Mode 74*5d5fbe79SDavid van Moolenbroek * ------- 75*5d5fbe79SDavid van Moolenbroek * In OS mode, @ref callbackstyle_api AND @ref sequential_api can be used. 76*5d5fbe79SDavid van Moolenbroek * @ref sequential_api are designed to be called from threads other than 77*5d5fbe79SDavid van Moolenbroek * the TCPIP thread, so there is nothing to consider here. 78*5d5fbe79SDavid van Moolenbroek * But @ref callbackstyle_api functions must _ONLY_ be called from 79*5d5fbe79SDavid van Moolenbroek * TCPIP thread. It is a common error to call these from other threads 80*5d5fbe79SDavid van Moolenbroek * or from IRQ contexts. Ethernet RX needs to deliver incoming packets 81*5d5fbe79SDavid van Moolenbroek * in the correct way by sending a message to TCPIP thread, this is 82*5d5fbe79SDavid van Moolenbroek * implemented in tcpip_input(). 83*5d5fbe79SDavid van Moolenbroek * Again, ensure lwIP is _NEVER_ called from an interrupt, e.g. 84*5d5fbe79SDavid van Moolenbroek * some SPI IRQ wants to forward data to udp_send() or tcp_write()! 85*5d5fbe79SDavid van Moolenbroek * 86*5d5fbe79SDavid van Moolenbroek * 1) tcpip_callback() can be used get called back from TCPIP thread, 87*5d5fbe79SDavid van Moolenbroek * it is safe to call any @ref callbackstyle_api from there. 88*5d5fbe79SDavid van Moolenbroek * 89*5d5fbe79SDavid van Moolenbroek * 2) Use @ref LWIP_TCPIP_CORE_LOCKING. All @ref callbackstyle_api 90*5d5fbe79SDavid van Moolenbroek * functions can be called when lwIP core lock is aquired, see 91*5d5fbe79SDavid van Moolenbroek * @ref LOCK_TCPIP_CORE() and @ref UNLOCK_TCPIP_CORE(). 92*5d5fbe79SDavid van Moolenbroek * These macros cannot be used in an interrupt context! 93*5d5fbe79SDavid van Moolenbroek * Note the OS must correctly handle priority inversion for this. 94*5d5fbe79SDavid van Moolenbroek */ 95*5d5fbe79SDavid van Moolenbroek 96*5d5fbe79SDavid van Moolenbroek /** 97*5d5fbe79SDavid van Moolenbroek * @page bugs Reporting bugs 98*5d5fbe79SDavid van Moolenbroek * Please report bugs in the lwIP bug tracker at savannah.\n 99*5d5fbe79SDavid van Moolenbroek * BEFORE submitting, please check if the bug has already been reported!\n 100*5d5fbe79SDavid van Moolenbroek * https://savannah.nongnu.org/bugs/?group=lwip 101*5d5fbe79SDavid van Moolenbroek */ 102*5d5fbe79SDavid van Moolenbroek 103*5d5fbe79SDavid van Moolenbroek /** 104*5d5fbe79SDavid van Moolenbroek * @defgroup lwip_nosys Mainloop mode ("NO_SYS") 105*5d5fbe79SDavid van Moolenbroek * @ingroup lwip 106*5d5fbe79SDavid van Moolenbroek * Use this mode if you do not run an OS on your system. \#define NO_SYS to 1. 107*5d5fbe79SDavid van Moolenbroek * Feed incoming packets to netif->input(pbuf, netif) function from mainloop, 108*5d5fbe79SDavid van Moolenbroek * *not* *from* *interrupt* *context*. You can allocate a @ref pbuf in interrupt 109*5d5fbe79SDavid van Moolenbroek * context and put them into a queue which is processed from mainloop.\n 110*5d5fbe79SDavid van Moolenbroek * Call sys_check_timeouts() periodically in the mainloop.\n 111*5d5fbe79SDavid van Moolenbroek * Porting: implement all functions in @ref sys_time, @ref sys_prot and 112*5d5fbe79SDavid van Moolenbroek * @ref compiler_abstraction.\n 113*5d5fbe79SDavid van Moolenbroek * You can only use @ref callbackstyle_api in this mode.\n 114*5d5fbe79SDavid van Moolenbroek * Sample code:\n 115*5d5fbe79SDavid van Moolenbroek * @include NO_SYS_SampleCode.c 116*5d5fbe79SDavid van Moolenbroek */ 117*5d5fbe79SDavid van Moolenbroek 118*5d5fbe79SDavid van Moolenbroek /** 119*5d5fbe79SDavid van Moolenbroek * @defgroup lwip_os OS mode (TCPIP thread) 120*5d5fbe79SDavid van Moolenbroek * @ingroup lwip 121*5d5fbe79SDavid van Moolenbroek * Use this mode if you run an OS on your system. It is recommended to 122*5d5fbe79SDavid van Moolenbroek * use an RTOS that correctly handles priority inversion and 123*5d5fbe79SDavid van Moolenbroek * to use @ref LWIP_TCPIP_CORE_LOCKING.\n 124*5d5fbe79SDavid van Moolenbroek * Porting: implement all functions in @ref sys_layer.\n 125*5d5fbe79SDavid van Moolenbroek * You can use @ref callbackstyle_api together with @ref tcpip_callback, 126*5d5fbe79SDavid van Moolenbroek * and all @ref sequential_api. 127*5d5fbe79SDavid van Moolenbroek */ 128*5d5fbe79SDavid van Moolenbroek 129*5d5fbe79SDavid van Moolenbroek /** 130*5d5fbe79SDavid van Moolenbroek * @page raw_api lwIP API 131*5d5fbe79SDavid van Moolenbroek * @verbinclude "rawapi.txt" 132*5d5fbe79SDavid van Moolenbroek */ 133