sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
tcpip.c
Go to the documentation of this file.
1
6
7/*
8 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without modification,
12 * are permitted provided that the following conditions are met:
13 *
14 * 1. Redistributions of source code must retain the above copyright notice,
15 * this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright notice,
17 * this list of conditions and the following disclaimer in the documentation
18 * and/or other materials provided with the distribution.
19 * 3. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
25 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
27 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
31 * OF SUCH DAMAGE.
32 *
33 * This file is part of the lwIP TCP/IP stack.
34 *
35 * Author: Adam Dunkels <adam@sics.se>
36 *
37 */
38
39#include "lwip/opt.h"
40
41#if !NO_SYS /* don't build if not configured for use in lwipopts.h */
42
44#include "lwip/sys.h"
45#include "lwip/memp.h"
46#include "lwip/mem.h"
47#include "lwip/init.h"
48#include "lwip/ip.h"
49#include "lwip/pbuf.h"
50#include "lwip/etharp.h"
51#include "netif/ethernet.h"
52
53#define TCPIP_MSG_VAR_REF(name) API_VAR_REF(name)
54#define TCPIP_MSG_VAR_DECLARE(name) API_VAR_DECLARE(struct tcpip_msg, name)
55#define TCPIP_MSG_VAR_ALLOC(name) API_VAR_ALLOC(struct tcpip_msg, MEMP_TCPIP_MSG_API, name, ERR_MEM)
56#define TCPIP_MSG_VAR_FREE(name) API_VAR_FREE(MEMP_TCPIP_MSG_API, name)
57
58/* global variables */
59static tcpip_init_done_fn tcpip_init_done;
60static void *tcpip_init_done_arg;
61static sys_mbox_t tcpip_mbox;
62
63#if LWIP_TCPIP_CORE_LOCKING
65sys_mutex_t lock_tcpip_core;
66#endif /* LWIP_TCPIP_CORE_LOCKING */
67
68static void tcpip_thread_handle_msg(struct tcpip_msg *msg);
69
70#if !LWIP_TIMERS
71
73static void
74tcpip_mbox_fetch(sys_mbox_t* mbox, void** msg)
75{
77
78 UNLOCK_TCPIP_CORE();
79 sys_mbox_fetch(mbox, msg);
80 LOCK_TCPIP_CORE();
81}
82
83#else /* !LWIP_TIMERS */
84
92static void
93tcpip_mbox_fetch(sys_mbox_t *mbox, void **msg)
94{
95 u32_t sleeptime, res;
96
97again:
99
100 sleeptime = sys_timeouts_sleeptime();
101 if (sleeptime == SYS_TIMEOUTS_SLEEPTIME_INFINITE) {
102 UNLOCK_TCPIP_CORE();
103 sys_arch_mbox_fetch(mbox, msg, 0);
104 LOCK_TCPIP_CORE();
105 return;
106 } else if (sleeptime == 0) {
107 sys_check_timeouts();
108 /* We try again to fetch a message from the mbox. */
109 goto again;
110 }
111
112 UNLOCK_TCPIP_CORE();
113 res = sys_arch_mbox_fetch(mbox, msg, sleeptime);
114 LOCK_TCPIP_CORE();
115 if (res == SYS_ARCH_TIMEOUT) {
116 /* If a SYS_ARCH_TIMEOUT value is returned, a timeout occurred
117 before a message could be fetched. */
118 sys_check_timeouts();
119 /* We try again to fetch a message from the mbox. */
120 goto again;
121 }
122}
123#endif /* !LWIP_TIMERS */
124
135static void
136tcpip_thread(void *arg)
137{
138 struct tcpip_msg *msg;
139 LWIP_UNUSED_ARG(arg);
140
142
143 LOCK_TCPIP_CORE();
144 if (tcpip_init_done != NULL) {
145 tcpip_init_done(tcpip_init_done_arg);
146 }
147
148 while (1) { /* MAIN Loop */
150 /* wait for a message, timeouts are processed while waiting */
151 tcpip_mbox_fetch(&tcpip_mbox, (void **)&msg);
152 if (msg == NULL) {
153 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));
154 LWIP_ASSERT("tcpip_thread: invalid message", 0);
155 continue;
156 }
157 tcpip_thread_handle_msg(msg);
158 }
159}
160
161/* Handle a single tcpip_msg
162 * This is in its own function for access by tests only.
163 */
164static void
165tcpip_thread_handle_msg(struct tcpip_msg *msg)
166{
167 switch (msg->type) {
168#if !LWIP_TCPIP_CORE_LOCKING
169 case TCPIP_MSG_API:
170 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
171 msg->msg.api_msg.function(msg->msg.api_msg.msg);
172 break;
173 case TCPIP_MSG_API_CALL:
174 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API CALL message %p\n", (void *)msg));
175 msg->msg.api_call.arg->err = msg->msg.api_call.function(msg->msg.api_call.arg);
176 sys_sem_signal(msg->msg.api_call.sem);
177 break;
178 case TCPIP_MSG_CALLBACK_STATIC_WAIT:
179 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK WAIT message %p\n", (void *)msg));
180 msg->msg.cb_wait.function(msg->msg.cb_wait.ctx);
181 sys_sem_signal(msg->msg.cb_wait.sem);
182 break;
183#endif /* !LWIP_TCPIP_CORE_LOCKING */
184
185#if !LWIP_TCPIP_CORE_LOCKING_INPUT
186 case TCPIP_MSG_INPKT:
187 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
188 if (msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif) != ERR_OK) {
189 pbuf_free(msg->msg.inp.p);
190 }
191 memp_free(MEMP_TCPIP_MSG_INPKT, msg);
192 break;
193#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */
194
195#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS
196 case TCPIP_MSG_TIMEOUT:
197 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg));
198 sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
199 memp_free(MEMP_TCPIP_MSG_API, msg);
200 break;
201 case TCPIP_MSG_UNTIMEOUT:
202 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: UNTIMEOUT %p\n", (void *)msg));
203 sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg);
204 memp_free(MEMP_TCPIP_MSG_API, msg);
205 break;
206#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */
207
208 case TCPIP_MSG_CALLBACK:
209 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
210 msg->msg.cb.function(msg->msg.cb.ctx);
211 memp_free(MEMP_TCPIP_MSG_API, msg);
212 break;
213
214 case TCPIP_MSG_CALLBACK_STATIC:
215 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg));
216 msg->msg.cb.function(msg->msg.cb.ctx);
217 break;
218
219 default:
220 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: %d\n", msg->type));
221 LWIP_ASSERT("tcpip_thread: invalid message", 0);
222 break;
223 }
224}
225
226#ifdef TCPIP_THREAD_TEST
228int
229tcpip_thread_poll_one(void)
230{
231 int ret = 0;
232 struct tcpip_msg *msg;
233
234 if (sys_arch_mbox_tryfetch(&tcpip_mbox, (void **)&msg) != SYS_MBOX_EMPTY) {
235 LOCK_TCPIP_CORE();
236 if (msg != NULL) {
237 tcpip_thread_handle_msg(msg);
238 ret = 1;
239 }
240 UNLOCK_TCPIP_CORE();
241 }
242 return ret;
243}
244#endif
245
253err_t
254tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
255{
256#if LWIP_TCPIP_CORE_LOCKING_INPUT
257 err_t ret;
258 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_inpkt: PACKET %p/%p\n", (void *)p, (void *)inp));
259 LOCK_TCPIP_CORE();
260 ret = input_fn(p, inp);
261 UNLOCK_TCPIP_CORE();
262 return ret;
263#else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
264 struct tcpip_msg *msg;
265
266 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
267
268 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
269 if (msg == NULL) {
270 return ERR_MEM;
271 }
272
273 msg->type = TCPIP_MSG_INPKT;
274 msg->msg.inp.p = p;
275 msg->msg.inp.netif = inp;
276 msg->msg.inp.input_fn = input_fn;
277 if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) {
278 memp_free(MEMP_TCPIP_MSG_INPKT, msg);
279 return ERR_MEM;
280 }
281 return ERR_OK;
282#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
283}
284
296err_t
297tcpip_input(struct pbuf *p, struct netif *inp)
298{
299#if LWIP_ETHERNET
301 return tcpip_inpkt(p, inp, ethernet_input);
302 } else
303#endif /* LWIP_ETHERNET */
304 return tcpip_inpkt(p, inp, ip_input);
305}
306
322err_t
324{
325 struct tcpip_msg *msg;
326
327 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
328
329 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
330 if (msg == NULL) {
331 return ERR_MEM;
332 }
333
334 msg->type = TCPIP_MSG_CALLBACK;
335 msg->msg.cb.function = function;
336 msg->msg.cb.ctx = ctx;
337
338 sys_mbox_post(&tcpip_mbox, msg);
339 return ERR_OK;
340}
341
358err_t
360{
361 struct tcpip_msg *msg;
362
363 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
364
365 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
366 if (msg == NULL) {
367 return ERR_MEM;
368 }
369
370 msg->type = TCPIP_MSG_CALLBACK;
371 msg->msg.cb.function = function;
372 msg->msg.cb.ctx = ctx;
373
374 if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) {
375 memp_free(MEMP_TCPIP_MSG_API, msg);
376 return ERR_MEM;
377 }
378 return ERR_OK;
379}
380
381#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS
390err_t
391tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
392{
393 struct tcpip_msg *msg;
394
395 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
396
397 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
398 if (msg == NULL) {
399 return ERR_MEM;
400 }
401
402 msg->type = TCPIP_MSG_TIMEOUT;
403 msg->msg.tmo.msecs = msecs;
404 msg->msg.tmo.h = h;
405 msg->msg.tmo.arg = arg;
406 sys_mbox_post(&tcpip_mbox, msg);
407 return ERR_OK;
408}
409
417err_t
418tcpip_untimeout(sys_timeout_handler h, void *arg)
419{
420 struct tcpip_msg *msg;
421
422 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
423
424 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
425 if (msg == NULL) {
426 return ERR_MEM;
427 }
428
429 msg->type = TCPIP_MSG_UNTIMEOUT;
430 msg->msg.tmo.h = h;
431 msg->msg.tmo.arg = arg;
432 sys_mbox_post(&tcpip_mbox, msg);
433 return ERR_OK;
434}
435#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */
436
437
450err_t
451tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem)
452{
453#if LWIP_TCPIP_CORE_LOCKING
454 LWIP_UNUSED_ARG(sem);
455 LOCK_TCPIP_CORE();
456 fn(apimsg);
457 UNLOCK_TCPIP_CORE();
458 return ERR_OK;
459#else /* LWIP_TCPIP_CORE_LOCKING */
460 TCPIP_MSG_VAR_DECLARE(msg);
461
462 LWIP_ASSERT("semaphore not initialized", sys_sem_valid(sem));
463 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
464
465 TCPIP_MSG_VAR_ALLOC(msg);
466 TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API;
467 TCPIP_MSG_VAR_REF(msg).msg.api_msg.function = fn;
468 TCPIP_MSG_VAR_REF(msg).msg.api_msg.msg = apimsg;
469 sys_mbox_post(&tcpip_mbox, &TCPIP_MSG_VAR_REF(msg));
470 sys_arch_sem_wait(sem, 0);
471 TCPIP_MSG_VAR_FREE(msg);
472 return ERR_OK;
473#endif /* LWIP_TCPIP_CORE_LOCKING */
474}
475
486err_t
487tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call)
488{
489#if LWIP_TCPIP_CORE_LOCKING
490 err_t err;
491 LOCK_TCPIP_CORE();
492 err = fn(call);
493 UNLOCK_TCPIP_CORE();
494 return err;
495#else /* LWIP_TCPIP_CORE_LOCKING */
496 TCPIP_MSG_VAR_DECLARE(msg);
497
498#if !LWIP_NETCONN_SEM_PER_THREAD
499 err_t err = sys_sem_new(&call->sem, 0);
500 if (err != ERR_OK) {
501 return err;
502 }
503#endif /* LWIP_NETCONN_SEM_PER_THREAD */
504
505 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
506
507 TCPIP_MSG_VAR_ALLOC(msg);
508 TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API_CALL;
509 TCPIP_MSG_VAR_REF(msg).msg.api_call.arg = call;
510 TCPIP_MSG_VAR_REF(msg).msg.api_call.function = fn;
511#if LWIP_NETCONN_SEM_PER_THREAD
512 TCPIP_MSG_VAR_REF(msg).msg.api_call.sem = LWIP_NETCONN_THREAD_SEM_GET();
513#else /* LWIP_NETCONN_SEM_PER_THREAD */
514 TCPIP_MSG_VAR_REF(msg).msg.api_call.sem = &call->sem;
515#endif /* LWIP_NETCONN_SEM_PER_THREAD */
516 sys_mbox_post(&tcpip_mbox, &TCPIP_MSG_VAR_REF(msg));
517 sys_arch_sem_wait(TCPIP_MSG_VAR_REF(msg).msg.api_call.sem, 0);
518 TCPIP_MSG_VAR_FREE(msg);
519
520#if !LWIP_NETCONN_SEM_PER_THREAD
521 sys_sem_free(&call->sem);
522#endif /* LWIP_NETCONN_SEM_PER_THREAD */
523
524 return call->err;
525#endif /* LWIP_TCPIP_CORE_LOCKING */
526}
527
544struct tcpip_callback_msg *
546{
547 struct tcpip_msg *msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
548 if (msg == NULL) {
549 return NULL;
550 }
551 msg->type = TCPIP_MSG_CALLBACK_STATIC;
552 msg->msg.cb.function = function;
553 msg->msg.cb.ctx = ctx;
554 return (struct tcpip_callback_msg *)msg;
555}
556
565void
566tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg)
567{
568 memp_free(MEMP_TCPIP_MSG_API, msg);
569}
570
580err_t
581tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg)
582{
583 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
584 return sys_mbox_trypost(&tcpip_mbox, msg);
585}
586
599err_t
600tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg)
601{
602 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
603 return sys_mbox_trypost_fromisr(&tcpip_mbox, msg);
604}
605
618err_t
620{
621#if LWIP_TCPIP_CORE_LOCKING
622 LOCK_TCPIP_CORE();
623 function(ctx);
624 UNLOCK_TCPIP_CORE();
625 return ERR_OK;
626#else /* LWIP_TCPIP_CORE_LOCKING */
627 err_t err;
628 sys_sem_t sem;
629 struct tcpip_msg msg;
630
631 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
632
633 err = sys_sem_new(&sem, 0);
634 if (err != ERR_OK) {
635 return err;
636 }
637
638 msg.type = TCPIP_MSG_CALLBACK_STATIC_WAIT;
639 msg.msg.cb_wait.function = function;
640 msg.msg.cb_wait.ctx = ctx;
641 msg.msg.cb_wait.sem = &sem;
642 sys_mbox_post(&tcpip_mbox, &msg);
643 sys_arch_sem_wait(&sem, 0);
644 sys_sem_free(&sem);
645 return ERR_OK;
646#endif /* LWIP_TCPIP_CORE_LOCKING */
647}
648
658void
659tcpip_init(tcpip_init_done_fn initfunc, void *arg)
660{
661 lwip_init();
662
663 tcpip_init_done = initfunc;
664 tcpip_init_done_arg = arg;
665 if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) {
666 LWIP_ASSERT("failed to create tcpip_thread mbox", 0);
667 }
668#if LWIP_TCPIP_CORE_LOCKING
669 if (sys_mutex_new(&lock_tcpip_core) != ERR_OK) {
670 LWIP_ASSERT("failed to create lock_tcpip_core", 0);
671 }
672#endif /* LWIP_TCPIP_CORE_LOCKING */
673
675}
676
683static void
684pbuf_free_int(void *p)
685{
686 struct pbuf *q = (struct pbuf *)p;
687 pbuf_free(q);
688}
689
696err_t
698{
699 return tcpip_try_callback(pbuf_free_int, p);
700}
701
709err_t
711{
712 return tcpip_try_callback(mem_free, m);
713}
714
715#endif /* !NO_SYS */
err_t(*) netif_input_fn(struct pbuf *p, struct netif *inp)
Definition tcpip.h:1207
#define LWIP_UNUSED_ARG(x)
Definition arch.h:373
struct tcpip_callback_msg * tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx)
Definition tcpip.c:545
void lwip_init(void)
Definition lwip_init.c:342
void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg)
Definition tcpip.c:659
err_t tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg)
Definition tcpip.c:600
err_t tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg)
Definition tcpip.c:581
err_t tcpip_callback(tcpip_callback_fn function, void *ctx)
Definition tcpip.c:323
void tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg)
Definition tcpip.c:566
err_t tcpip_input(struct pbuf *p, struct netif *inp)
Definition tcpip.c:297
err_t tcpip_try_callback(tcpip_callback_fn function, void *ctx)
Definition tcpip.c:359
@ ERR_OK
Definition err.h:55
@ ERR_MEM
Definition err.h:57
#define TCPIP_DEBUG
Definition opt.h:3542
#define LWIP_ASSERT_CORE_LOCKED()
Definition opt.h:227
#define LWIP_MARK_TCPIP_THREAD()
Definition sys.h:431
#define TCPIP_THREAD_NAME
Definition opt.h:1837
#define LWIP_TCPIP_THREAD_ALIVE()
Definition opt.h:1872
#define TCPIP_MBOX_SIZE
Definition opt.h:1864
#define NETIF_FLAG_ETHERNET
Definition tcpip.h:1141
#define NETIF_FLAG_ETHARP
Definition tcpip.h:1137
u8 pbuf_free(struct pbuf *p)
Definition pbuf.c:729
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
Definition sys_arch.c:254
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
Definition sys_arch.c:192
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
Definition sys_arch.c:171
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
Definition sys_arch.c:141
err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg)
Definition sys_arch.c:188
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
Definition sys_arch.c:259
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
Definition sys_arch.c:110
err_t sys_mutex_new(sys_mutex_t *mutex)
int sys_sem_valid(sys_sem_t *sem)
Definition sys_arch.c:281
void sys_sem_free(sys_sem_t *sem)
Definition sys_arch.c:334
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
Definition sys_arch.c:289
void sys_sem_signal(sys_sem_t *sem)
Definition sys_arch.c:329
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
Definition sys_arch.c:263
void mem_free(void *mem)
Definition mem.c:604
void * memp_malloc(memp_t type)
Definition memp.c:337
void memp_free(memp_t type, void *mem)
Definition memp.c:420
#define TCPIP_THREAD_PRIO
Definition lwipopts.h:52
#define TCPIP_THREAD_STACKSIZE
Definition lwipopts.h:45
void(*) tcpip_callback_fn(void *ctx)
Definition ps2ip.h:74
void(*) tcpip_init_done_fn(void *arg)
Definition tcpip.h:70
err_t mem_free_callback(void *m)
Definition tcpip.c:710
err_t pbuf_free_callback(struct pbuf *p)
Definition tcpip.c:697
err_t tcpip_callback_wait(tcpip_callback_fn function, void *ctx)
Definition tcpip.c:619
err_t tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
Definition tcpip.c:254
u8 flags
Definition tcpip.h:1351
Definition tcpip.h:234
#define sys_mbox_valid_val(mbox)
Definition sys.h:395
#define SYS_MBOX_EMPTY
Definition sys.h:92
#define SYS_ARCH_TIMEOUT
Definition sys.h:87
err_t tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem)
Definition tcpip.c:451
err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call)
Definition tcpip.c:487
#define SYS_TIMEOUTS_SLEEPTIME_INFINITE
Definition timeouts.h:63