ReactOS 0.4.16-dev-329-g9223134
tcpip.c
Go to the documentation of this file.
1
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 */
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/* wait for a message with timers disabled (e.g. pass a timer-check trigger into tcpip_thread) */
72#define TCPIP_MBOX_FETCH(mbox, msg) sys_mbox_fetch(mbox, msg)
73#else /* !LWIP_TIMERS */
74/* wait for a message, timeouts are processed while waiting */
75#define TCPIP_MBOX_FETCH(mbox, msg) tcpip_timeouts_mbox_fetch(mbox, msg)
83static void
84tcpip_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)
85{
86 u32_t sleeptime, res;
87
88again:
90
91 sleeptime = sys_timeouts_sleeptime();
92 if (sleeptime == SYS_TIMEOUTS_SLEEPTIME_INFINITE) {
94 sys_arch_mbox_fetch(mbox, msg, 0);
96 return;
97 } else if (sleeptime == 0) {
98 sys_check_timeouts();
99 /* We try again to fetch a message from the mbox. */
100 goto again;
101 }
102
104 res = sys_arch_mbox_fetch(mbox, msg, sleeptime);
106 if (res == SYS_ARCH_TIMEOUT) {
107 /* If a SYS_ARCH_TIMEOUT value is returned, a timeout occurred
108 before a message could be fetched. */
109 sys_check_timeouts();
110 /* We try again to fetch a message from the mbox. */
111 goto again;
112 }
113}
114#endif /* !LWIP_TIMERS */
115
126static void
128{
129 struct tcpip_msg *msg;
131
133
135 if (tcpip_init_done != NULL) {
137 }
138
139 while (1) { /* MAIN Loop */
141 /* wait for a message, timeouts are processed while waiting */
142 TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg);
143 if (msg == NULL) {
144 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));
145 LWIP_ASSERT("tcpip_thread: invalid message", 0);
146 continue;
147 }
149 }
150}
151
152/* Handle a single tcpip_msg
153 * This is in its own function for access by tests only.
154 */
155static void
157{
158 switch (msg->type) {
159#if !LWIP_TCPIP_CORE_LOCKING
160 case TCPIP_MSG_API:
161 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
162 msg->msg.api_msg.function(msg->msg.api_msg.msg);
163 break;
165 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API CALL message %p\n", (void *)msg));
166 msg->msg.api_call.arg->err = msg->msg.api_call.function(msg->msg.api_call.arg);
167 sys_sem_signal(msg->msg.api_call.sem);
168 break;
170 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK WAIT message %p\n", (void *)msg));
171 msg->msg.cb_wait.function(msg->msg.cb_wait.ctx);
172 sys_sem_signal(msg->msg.cb_wait.sem);
173 break;
174#endif /* !LWIP_TCPIP_CORE_LOCKING */
175
176#if !LWIP_TCPIP_CORE_LOCKING_INPUT
177 case TCPIP_MSG_INPKT:
178 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg));
179 if (msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif) != ERR_OK) {
180 pbuf_free(msg->msg.inp.p);
181 }
182 memp_free(MEMP_TCPIP_MSG_INPKT, msg);
183 break;
184#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */
185
186#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS
187 case TCPIP_MSG_TIMEOUT:
188 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg));
189 sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
190 memp_free(MEMP_TCPIP_MSG_API, msg);
191 break;
192 case TCPIP_MSG_UNTIMEOUT:
193 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: UNTIMEOUT %p\n", (void *)msg));
194 sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg);
195 memp_free(MEMP_TCPIP_MSG_API, msg);
196 break;
197#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */
198
200 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
201 msg->msg.cb.function(msg->msg.cb.ctx);
202 memp_free(MEMP_TCPIP_MSG_API, msg);
203 break;
204
206 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg));
207 msg->msg.cb.function(msg->msg.cb.ctx);
208 break;
209
210 default:
211 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: %d\n", msg->type));
212 LWIP_ASSERT("tcpip_thread: invalid message", 0);
213 break;
214 }
215}
216
217#ifdef TCPIP_THREAD_TEST
219int
220tcpip_thread_poll_one(void)
221{
222 int ret = 0;
223 struct tcpip_msg *msg;
224
227 if (msg != NULL) {
229 ret = 1;
230 }
232 }
233 return ret;
234}
235#endif
236
244err_t
246{
247#if LWIP_TCPIP_CORE_LOCKING_INPUT
248 err_t ret;
249 LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_inpkt: PACKET %p/%p\n", (void *)p, (void *)inp));
251 ret = input_fn(p, inp);
253 return ret;
254#else /* LWIP_TCPIP_CORE_LOCKING_INPUT */
255 struct tcpip_msg *msg;
256
257 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
258
259 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);
260 if (msg == NULL) {
261 return ERR_MEM;
262 }
263
264 msg->type = TCPIP_MSG_INPKT;
265 msg->msg.inp.p = p;
266 msg->msg.inp.netif = inp;
267 msg->msg.inp.input_fn = input_fn;
269 memp_free(MEMP_TCPIP_MSG_INPKT, msg);
270 return ERR_MEM;
271 }
272 return ERR_OK;
273#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
274}
275
287err_t
288tcpip_input(struct pbuf *p, struct netif *inp)
289{
290#if LWIP_ETHERNET
291 if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
292 return tcpip_inpkt(p, inp, ethernet_input);
293 } else
294#endif /* LWIP_ETHERNET */
295 return tcpip_inpkt(p, inp, ip_input);
296}
297
313err_t
315{
316 struct tcpip_msg *msg;
317
318 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
319
320 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
321 if (msg == NULL) {
322 return ERR_MEM;
323 }
324
325 msg->type = TCPIP_MSG_CALLBACK;
326 msg->msg.cb.function = function;
327 msg->msg.cb.ctx = ctx;
328
330 return ERR_OK;
331}
332
349err_t
351{
352 struct tcpip_msg *msg;
353
354 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
355
356 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
357 if (msg == NULL) {
358 return ERR_MEM;
359 }
360
361 msg->type = TCPIP_MSG_CALLBACK;
362 msg->msg.cb.function = function;
363 msg->msg.cb.ctx = ctx;
364
366 memp_free(MEMP_TCPIP_MSG_API, msg);
367 return ERR_MEM;
368 }
369 return ERR_OK;
370}
371
372#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS
381err_t
382tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
383{
384 struct tcpip_msg *msg;
385
386 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
387
388 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
389 if (msg == NULL) {
390 return ERR_MEM;
391 }
392
393 msg->type = TCPIP_MSG_TIMEOUT;
394 msg->msg.tmo.msecs = msecs;
395 msg->msg.tmo.h = h;
396 msg->msg.tmo.arg = arg;
398 return ERR_OK;
399}
400
408err_t
409tcpip_untimeout(sys_timeout_handler h, void *arg)
410{
411 struct tcpip_msg *msg;
412
413 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
414
415 msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
416 if (msg == NULL) {
417 return ERR_MEM;
418 }
419
420 msg->type = TCPIP_MSG_UNTIMEOUT;
421 msg->msg.tmo.h = h;
422 msg->msg.tmo.arg = arg;
424 return ERR_OK;
425}
426#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */
427
428
441err_t
443{
444#if LWIP_TCPIP_CORE_LOCKING
447 fn(apimsg);
449 return ERR_OK;
450#else /* LWIP_TCPIP_CORE_LOCKING */
452
453 LWIP_ASSERT("semaphore not initialized", sys_sem_valid(sem));
454 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
455
458 TCPIP_MSG_VAR_REF(msg).msg.api_msg.function = fn;
459 TCPIP_MSG_VAR_REF(msg).msg.api_msg.msg = apimsg;
463 return ERR_OK;
464#endif /* LWIP_TCPIP_CORE_LOCKING */
465}
466
477err_t
479{
480#if LWIP_TCPIP_CORE_LOCKING
481 err_t err;
483 err = fn(call);
485 return err;
486#else /* LWIP_TCPIP_CORE_LOCKING */
488
489#if !LWIP_NETCONN_SEM_PER_THREAD
490 err_t err = sys_sem_new(&call->sem, 0);
491 if (err != ERR_OK) {
492 return err;
493 }
494#endif /* LWIP_NETCONN_SEM_PER_THREAD */
495
496 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
497
500 TCPIP_MSG_VAR_REF(msg).msg.api_call.arg = call;
501 TCPIP_MSG_VAR_REF(msg).msg.api_call.function = fn;
502#if LWIP_NETCONN_SEM_PER_THREAD
504#else /* LWIP_NETCONN_SEM_PER_THREAD */
505 TCPIP_MSG_VAR_REF(msg).msg.api_call.sem = &call->sem;
506#endif /* LWIP_NETCONN_SEM_PER_THREAD */
508 sys_arch_sem_wait(TCPIP_MSG_VAR_REF(msg).msg.api_call.sem, 0);
510
511#if !LWIP_NETCONN_SEM_PER_THREAD
512 sys_sem_free(&call->sem);
513#endif /* LWIP_NETCONN_SEM_PER_THREAD */
514
515 return call->err;
516#endif /* LWIP_TCPIP_CORE_LOCKING */
517}
518
535struct tcpip_callback_msg *
537{
538 struct tcpip_msg *msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);
539 if (msg == NULL) {
540 return NULL;
541 }
543 msg->msg.cb.function = function;
544 msg->msg.cb.ctx = ctx;
545 return (struct tcpip_callback_msg *)msg;
546}
547
556void
557tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg)
558{
559 memp_free(MEMP_TCPIP_MSG_API, msg);
560}
561
571err_t
572tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg)
573{
574 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
576}
577
590err_t
592{
593 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
595}
596
609err_t
611{
612#if LWIP_TCPIP_CORE_LOCKING
614 function(ctx);
616 return ERR_OK;
617#else /* LWIP_TCPIP_CORE_LOCKING */
618 err_t err;
620 struct tcpip_msg msg;
621
622 LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));
623
624 err = sys_sem_new(&sem, 0);
625 if (err != ERR_OK) {
626 return err;
627 }
628
630 msg.msg.cb_wait.function = function;
631 msg.msg.cb_wait.ctx = ctx;
632 msg.msg.cb_wait.sem = &sem;
636 return ERR_OK;
637#endif /* LWIP_TCPIP_CORE_LOCKING */
638}
639
649void
651{
652 lwip_init();
653
654 tcpip_init_done = initfunc;
657 LWIP_ASSERT("failed to create tcpip_thread mbox", 0);
658 }
659#if LWIP_TCPIP_CORE_LOCKING
660 if (sys_mutex_new(&lock_tcpip_core) != ERR_OK) {
661 LWIP_ASSERT("failed to create lock_tcpip_core", 0);
662 }
663#endif /* LWIP_TCPIP_CORE_LOCKING */
664
666}
667
674static void
676{
677 struct pbuf *q = (struct pbuf *)p;
678 pbuf_free(q);
679}
680
687err_t
689{
691}
692
700err_t
702{
704}
705
706#endif /* !NO_SYS */
#define msg(x)
Definition: auth_time.c:54
#define mem_free(ptr, bsize)
Definition: types.h:124
#define NULL
Definition: types.h:112
#define LWIP_DEBUGF(debug, message)
Definition: debug.h:158
#define LWIP_ASSERT(message, assertion)
Definition: debug.h:116
void(* tcpip_callback_fn)(void *ctx)
Definition: tcpip.h:72
#define LOCK_TCPIP_CORE()
Definition: tcpip.h:62
void(* tcpip_init_done_fn)(void *arg)
Definition: tcpip.h:70
#define UNLOCK_TCPIP_CORE()
Definition: tcpip.h:63
#define ERR_MEM
Definition: fontsub.h:52
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLuint res
Definition: glext.h:9613
GLfloat GLfloat p
Definition: glext.h:8902
const GLfloat * m
Definition: glext.h:10848
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
uint32_t u32_t
Definition: arch.h:129
#define LWIP_UNUSED_ARG(x)
Definition: arch.h:373
s8_t err_t
Definition: err.h:96
@ ERR_OK
Definition: err.h:55
void lwip_init(void)
Definition: init.c:339
#define TCPIP_DEBUG
Definition: opt.h:3512
#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:1807
#define TCPIP_THREAD_PRIO
Definition: opt.h:1825
#define LWIP_TCPIP_THREAD_ALIVE()
Definition: opt.h:1842
#define TCPIP_MBOX_SIZE
Definition: opt.h:1834
#define TCPIP_THREAD_STACKSIZE
Definition: opt.h:1816
struct tcpip_callback_msg * tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx)
Definition: tcpip.c:536
void tcpip_init(tcpip_init_done_fn initfunc, void *arg)
Definition: tcpip.c:650
err_t tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg)
Definition: tcpip.c:591
err_t tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg)
Definition: tcpip.c:572
err_t tcpip_callback(tcpip_callback_fn function, void *ctx)
Definition: tcpip.c:314
void tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg)
Definition: tcpip.c:557
err_t tcpip_input(struct pbuf *p, struct netif *inp)
Definition: tcpip.c:288
err_t tcpip_try_callback(tcpip_callback_fn function, void *ctx)
Definition: tcpip.c:350
#define NETIF_FLAG_ETHERNET
Definition: netif.h:101
#define NETIF_FLAG_ETHARP
Definition: netif.h:97
u8_t pbuf_free(struct pbuf *p)
Definition: pbuf.c:727
u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
Definition: sys_arch.c:177
void sys_mbox_post(sys_mbox_t *mbox, void *msg)
Definition: sys_arch.c:160
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
Definition: sys_arch.c:247
err_t sys_mbox_new(sys_mbox_t *mbox, int size)
Definition: sys_arch.c:128
u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
Definition: sys_arch.c:238
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
Definition: sys_arch.c:275
err_t sys_mutex_new(sys_mutex_t *mutex)
Definition: sys_arch.c:149
void sys_sem_free(sys_sem_t *sem)
Definition: sys_arch.c:72
u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
Definition: sys_arch.c:86
void sys_sem_signal(sys_sem_t *sem)
Definition: sys_arch.c:80
err_t sys_sem_new(sys_sem_t *sem, u8_t count)
Definition: sys_arch.c:46
#define sys_mbox_trypost_fromisr
Definition: sys_arch.h:31
int sys_mutex_t
Definition: sys_arch.h:38
#define LWIP_NETCONN_THREAD_SEM_GET()
Definition: sys_arch.h:74
#define sys_sem_valid(sema)
Definition: sys_arch.h:36
void * memp_malloc(memp_t type)
Definition: memp.c:337
void memp_free(memp_t type, void *mem)
Definition: memp.c:420
static HANDLE sem
Definition: sync.c:674
err_t(* netif_input_fn)(struct pbuf *p, struct netif *inp)
Definition: netif.h:181
#define err(...)
Definition: netif.h:269
Definition: pbuf.h:186
struct tcpip_msg::@1054::@1058 inp
netif_input_fn input_fn
Definition: tcpip_priv.h:153
void * ctx
Definition: tcpip_priv.h:145
tcpip_callback_fn function
Definition: tcpip_priv.h:135
#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
static void tcpip_thread_handle_msg(struct tcpip_msg *msg)
Definition: tcpip.c:156
err_t tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem)
Definition: tcpip.c:442
#define TCPIP_MSG_VAR_ALLOC(name)
Definition: tcpip.c:55
err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call)
Definition: tcpip.c:478
#define TCPIP_MBOX_FETCH(mbox, msg)
Definition: tcpip.c:72
err_t mem_free_callback(void *m)
Definition: tcpip.c:701
err_t pbuf_free_callback(struct pbuf *p)
Definition: tcpip.c:688
static void tcpip_thread(void *arg)
Definition: tcpip.c:127
err_t tcpip_callback_wait(tcpip_callback_fn function, void *ctx)
Definition: tcpip.c:610
err_t tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
Definition: tcpip.c:245
static tcpip_init_done_fn tcpip_init_done
Definition: tcpip.c:59
static sys_mbox_t tcpip_mbox
Definition: tcpip.c:61
#define TCPIP_MSG_VAR_FREE(name)
Definition: tcpip.c:56
static void pbuf_free_int(void *p)
Definition: tcpip.c:675
#define TCPIP_MSG_VAR_REF(name)
Definition: tcpip.c:53
#define TCPIP_MSG_VAR_DECLARE(name)
Definition: tcpip.c:54
static void * tcpip_init_done_arg
Definition: tcpip.c:60
@ TCPIP_MSG_CALLBACK_STATIC
Definition: tcpip_priv.h:126
@ TCPIP_MSG_CALLBACK
Definition: tcpip_priv.h:125
@ TCPIP_MSG_CALLBACK_STATIC_WAIT
Definition: tcpip_priv.h:127
@ TCPIP_MSG_INPKT
Definition: tcpip_priv.h:119
@ TCPIP_MSG_API
Definition: tcpip_priv.h:115
@ TCPIP_MSG_API_CALL
Definition: tcpip_priv.h:116
err_t(* tcpip_api_call_fn)(struct tcpip_api_call_data *call)
Definition: tcpip_priv.h:110
#define SYS_TIMEOUTS_SLEEPTIME_INFINITE
Definition: timeouts.h:62
int ret
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
void * arg
Definition: msvc.h:10