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)
60static void *tcpip_init_done_arg;
61static sys_mbox_t tcpip_mbox;
63#if LWIP_TCPIP_CORE_LOCKING
65sys_mutex_t lock_tcpip_core;
68static void tcpip_thread_handle_msg(
struct tcpip_msg *msg);
74tcpip_mbox_fetch(sys_mbox_t*
mbox,
void** msg)
79 sys_mbox_fetch(
mbox, msg);
93tcpip_mbox_fetch(sys_mbox_t *
mbox,
void **msg)
100 sleeptime = sys_timeouts_sleeptime();
106 }
else if (sleeptime == 0) {
107 sys_check_timeouts();
118 sys_check_timeouts();
136tcpip_thread(
void *arg)
144 if (tcpip_init_done != NULL) {
145 tcpip_init_done(tcpip_init_done_arg);
151 tcpip_mbox_fetch(&tcpip_mbox, (
void **)&msg);
153 LWIP_DEBUGF(
TCPIP_DEBUG, (
"tcpip_thread: invalid message: NULL\n"));
154 LWIP_ASSERT(
"tcpip_thread: invalid message", 0);
157 tcpip_thread_handle_msg(msg);
165tcpip_thread_handle_msg(
struct tcpip_msg *msg)
168#if !LWIP_TCPIP_CORE_LOCKING
170 LWIP_DEBUGF(
TCPIP_DEBUG, (
"tcpip_thread: API message %p\n", (
void *)msg));
171 msg->msg.api_msg.function(msg->msg.api_msg.msg);
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);
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);
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) {
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);
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);
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);
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);
220 LWIP_DEBUGF(
TCPIP_DEBUG, (
"tcpip_thread: invalid message: %d\n", msg->type));
221 LWIP_ASSERT(
"tcpip_thread: invalid message", 0);
226#ifdef TCPIP_THREAD_TEST
229tcpip_thread_poll_one(
void)
237 tcpip_thread_handle_msg(msg);
256#if LWIP_TCPIP_CORE_LOCKING_INPUT
258 LWIP_DEBUGF(
TCPIP_DEBUG, (
"tcpip_inpkt: PACKET %p/%p\n", (
void *)p, (
void *)inp));
260 ret = input_fn(p, inp);
273 msg->type = TCPIP_MSG_INPKT;
275 msg->msg.inp.netif = inp;
276 msg->msg.inp.input_fn = input_fn;
334 msg->type = TCPIP_MSG_CALLBACK;
335 msg->msg.cb.function = function;
336 msg->msg.cb.ctx = ctx;
370 msg->type = TCPIP_MSG_CALLBACK;
371 msg->msg.cb.function = function;
372 msg->msg.cb.ctx = ctx;
381#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS
391tcpip_timeout(u32_t msecs, sys_timeout_handler h,
void *arg)
402 msg->type = TCPIP_MSG_TIMEOUT;
403 msg->msg.tmo.msecs = msecs;
405 msg->msg.tmo.arg = arg;
418tcpip_untimeout(sys_timeout_handler h,
void *arg)
429 msg->type = TCPIP_MSG_UNTIMEOUT;
431 msg->msg.tmo.arg = arg;
453#if LWIP_TCPIP_CORE_LOCKING
460 TCPIP_MSG_VAR_DECLARE(msg);
462 LWIP_ASSERT(
"semaphore not initialized",
sys_sem_valid(sem));
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;
471 TCPIP_MSG_VAR_FREE(msg);
489#if LWIP_TCPIP_CORE_LOCKING
496 TCPIP_MSG_VAR_DECLARE(msg);
498#if !LWIP_NETCONN_SEM_PER_THREAD
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();
514 TCPIP_MSG_VAR_REF(msg).msg.api_call.sem = &call->sem;
518 TCPIP_MSG_VAR_FREE(msg);
520#if !LWIP_NETCONN_SEM_PER_THREAD
544struct tcpip_callback_msg *
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;
621#if LWIP_TCPIP_CORE_LOCKING
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;
663 tcpip_init_done = initfunc;
664 tcpip_init_done_arg = arg;
666 LWIP_ASSERT(
"failed to create tcpip_thread mbox", 0);
668#if LWIP_TCPIP_CORE_LOCKING
670 LWIP_ASSERT(
"failed to create lock_tcpip_core", 0);
684pbuf_free_int(
void *p)
err_t(*) netif_input_fn(struct pbuf *p, struct netif *inp)
#define LWIP_UNUSED_ARG(x)
struct tcpip_callback_msg * tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx)
void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg)
err_t tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg)
err_t tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg)
err_t tcpip_callback(tcpip_callback_fn function, void *ctx)
void tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg)
err_t tcpip_input(struct pbuf *p, struct netif *inp)
err_t tcpip_try_callback(tcpip_callback_fn function, void *ctx)
#define LWIP_ASSERT_CORE_LOCKED()
#define LWIP_MARK_TCPIP_THREAD()
#define TCPIP_THREAD_NAME
#define LWIP_TCPIP_THREAD_ALIVE()
#define NETIF_FLAG_ETHERNET
#define NETIF_FLAG_ETHARP
u8 pbuf_free(struct pbuf *p)
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg)
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
err_t sys_mutex_new(sys_mutex_t *mutex)
int sys_sem_valid(sys_sem_t *sem)
void sys_sem_free(sys_sem_t *sem)
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
void sys_sem_signal(sys_sem_t *sem)
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
void * memp_malloc(memp_t type)
void memp_free(memp_t type, void *mem)
#define TCPIP_THREAD_PRIO
#define TCPIP_THREAD_STACKSIZE
void(*) tcpip_callback_fn(void *ctx)
void(*) tcpip_init_done_fn(void *arg)
err_t mem_free_callback(void *m)
err_t pbuf_free_callback(struct pbuf *p)
err_t tcpip_callback_wait(tcpip_callback_fn function, void *ctx)
err_t tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
#define sys_mbox_valid_val(mbox)
err_t tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem)
err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call)
#define SYS_TIMEOUTS_SLEEPTIME_INFINITE