xref: /minix3/minix/lib/liblwip/dist/doc/doxygen/main_page.h (revision 5d5fbe79c1b60734f34c69330aec5496644e8651)
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