35 #if (!defined(LWIP_IPV4) && !defined(LWIP_IPV6))
47 #define MEMP_NUM_UDP_PCB 4
48 #define MEMP_NUM_TCP_PCB 5
49 #define MEMP_NUM_NETCONN (MEMP_NUM_TCP_PCB+MEMP_NUM_UDP_PCB)
50 #define LWIP_NETIF_STATUS_CALLBACK 0
51 #define LWIP_NETIF_LINK_CALLBACK 0
53 #define LWIP_NETIF_HOSTNAME 0
56 #define LWIP_NETIF_HWADDRHINT 0
57 #define LWIP_LOOPBACK_MAX_PBUFS 0
58 #define LWIP_NUM_NETIF_CLIENT_DATA 0
59 #define LWIP_SOCKET_OFFSET 0
60 #define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
61 #define DNS_MAX_SERVERS 2
99 #define PBUF_TRANSPORT_HLEN 20
101 #define PBUF_IP_HLEN 40
103 #define PBUF_IP_HLEN 20
211 #define IPADDR_NONE ((u32)0xffffffffUL)
213 #define IPADDR_LOOPBACK ((u32)0x7f000001UL)
215 #define IPADDR_ANY ((u32)0x00000000UL)
217 #define IPADDR_BROADCAST ((u32)0xffffffffUL)
223 #define IP_CLASSA(a) ((((u32)(a)) & 0x80000000UL) == 0)
224 #define IP_CLASSA_NET 0xff000000
225 #define IP_CLASSA_NSHIFT 24
226 #define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET)
227 #define IP_CLASSA_MAX 128
229 #define IP_CLASSB(a) ((((u32)(a)) & 0xc0000000UL) == 0x80000000UL)
230 #define IP_CLASSB_NET 0xffff0000
231 #define IP_CLASSB_NSHIFT 16
232 #define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET)
233 #define IP_CLASSB_MAX 65536
235 #define IP_CLASSC(a) ((((u32)(a)) & 0xe0000000UL) == 0xc0000000UL)
236 #define IP_CLASSC_NET 0xffffff00
237 #define IP_CLASSC_NSHIFT 8
238 #define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET)
240 #define IP_CLASSD(a) (((u32)(a) & 0xf0000000UL) == 0xe0000000UL)
241 #define IP_CLASSD_NET 0xf0000000
242 #define IP_CLASSD_NSHIFT 28
243 #define IP_CLASSD_HOST 0x0fffffff
244 #define IP_MULTICAST(a) IP_CLASSD(a)
246 #define IP_EXPERIMENTAL(a) (((u32)(a) & 0xf0000000UL) == 0xf0000000UL)
247 #define IP_BADCLASS(a) (((u32)(a) & 0xf0000000UL) == 0xf0000000UL)
249 #define IP_LOOPBACKNET 127
254 #define IP4_ADDR(ipaddr, a,b,c,d) \
255 (ipaddr)->addr = ((u32)((d) & 0xff) << 24) | \
256 ((u32)((c) & 0xff) << 16) | \
257 ((u32)((b) & 0xff) << 8) | \
264 #define IPADDR2_COPY(dest, src) memcpy(dest, src, sizeof(ip4_addr_t))
268 #define ip4_addr_copy(dest, src) ((dest).addr = (src).addr)
270 #define ip4_addr_set(dest, src) ((dest)->addr = \
271 ((src) == NULL ? 0 : \
274 #define ip4_addr_set_zero(ipaddr) ((ipaddr)->addr = 0)
276 #define ip4_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY)
278 #define ip4_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK))
280 #define ip4_addr_isloopback(ipaddr) (((ipaddr)->addr & PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32)IP_LOOPBACKNET) << 24))
283 #define ip4_addr_set_hton(dest, src) ((dest)->addr = \
285 lwip_htonl((src)->addr)))
287 #define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))
289 #define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr)
292 #define ip4_addr_get_network(target, host, netmask) do { ((target)->addr = ((host)->addr) & ((netmask)->addr)); } while(0)
302 #define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
306 #define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
308 #define ip4_addr_isany_val(addr1) ((addr1).addr == IPADDR_ANY)
309 #define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1)))
311 #define ip4_addr_isbroadcast(addr1, netif) ip4_addr_isbroadcast_u32((addr1)->addr, netif)
313 #define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr)
315 #define ip4_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL))
317 #define ip4_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL))
319 #define ip4_addr_debug_print_parts(debug, a, b, c, d) \
320 LWIP_DEBUGF(debug, ("%" U16_F ".%" U16_F ".%" U16_F ".%" U16_F, a, b, c, d))
321 #define ip4_addr_debug_print(debug, ipaddr) \
322 ip4_addr_debug_print_parts(debug, \
323 (u16)((ipaddr) != NULL ? ip4_addr1_16(ipaddr) : 0), \
324 (u16)((ipaddr) != NULL ? ip4_addr2_16(ipaddr) : 0), \
325 (u16)((ipaddr) != NULL ? ip4_addr3_16(ipaddr) : 0), \
326 (u16)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0))
327 #define ip4_addr_debug_print_val(debug, ipaddr) \
328 ip4_addr_debug_print_parts(debug, \
329 ip4_addr1_16(&(ipaddr)), \
330 ip4_addr2_16(&(ipaddr)), \
331 ip4_addr3_16(&(ipaddr)), \
332 ip4_addr4_16(&(ipaddr)))
335 #define ip4_addr1(ipaddr) (((const u8*)(&(ipaddr)->addr))[0])
336 #define ip4_addr2(ipaddr) (((const u8*)(&(ipaddr)->addr))[1])
337 #define ip4_addr3(ipaddr) (((const u8*)(&(ipaddr)->addr))[2])
338 #define ip4_addr4(ipaddr) (((const u8*)(&(ipaddr)->addr))[3])
341 #define ip4_addr1_16(ipaddr) ((u16)ip4_addr1(ipaddr))
342 #define ip4_addr2_16(ipaddr) ((u16)ip4_addr2(ipaddr))
343 #define ip4_addr3_16(ipaddr) ((u16)ip4_addr3(ipaddr))
344 #define ip4_addr4_16(ipaddr) ((u16)ip4_addr4(ipaddr))
346 #define IP4ADDR_STRLEN_MAX 16
361 #define IP6_ADDR_PART(ip6addr, index, a,b,c,d) \
362 (ip6addr)->addr[index] = ((u32)((d) & 0xff) << 24) | \
363 ((u32)((c) & 0xff) << 16) | \
364 ((u32)((b) & 0xff) << 8) | \
369 #define IP6_ADDR(ip6addr, idx0, idx1, idx2, idx3) do { \
370 (ip6addr)->addr[0] = idx0; \
371 (ip6addr)->addr[1] = idx1; \
372 (ip6addr)->addr[2] = idx2; \
373 (ip6addr)->addr[3] = idx3; } while(0)
376 #define IP6_ADDR_BLOCK1(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff))
378 #define IP6_ADDR_BLOCK2(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[0])) & 0xffff))
380 #define IP6_ADDR_BLOCK3(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[1]) >> 16) & 0xffff))
382 #define IP6_ADDR_BLOCK4(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[1])) & 0xffff))
384 #define IP6_ADDR_BLOCK5(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[2]) >> 16) & 0xffff))
386 #define IP6_ADDR_BLOCK6(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[2])) & 0xffff))
388 #define IP6_ADDR_BLOCK7(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[3]) >> 16) & 0xffff))
390 #define IP6_ADDR_BLOCK8(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[3])) & 0xffff))
393 #define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \
394 (dest).addr[1] = (src).addr[1]; \
395 (dest).addr[2] = (src).addr[2]; \
396 (dest).addr[3] = (src).addr[3];}while(0)
398 #define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \
399 (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \
400 (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \
401 (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0)
404 #define ip6_addr_set_zero(ip6addr) do{(ip6addr)->addr[0] = 0; \
405 (ip6addr)->addr[1] = 0; \
406 (ip6addr)->addr[2] = 0; \
407 (ip6addr)->addr[3] = 0;}while(0)
410 #define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr)
412 #define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \
413 (ip6addr)->addr[1] = 0; \
414 (ip6addr)->addr[2] = 0; \
415 (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)
418 #define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \
419 (dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \
420 (dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \
421 (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]);}while(0)
431 #define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
432 ((addr1)->addr[1] == (addr2)->addr[1]))
434 #define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
435 ((addr1)->addr[1] == (addr2)->addr[1]) && \
436 ((addr1)->addr[2] == (addr2)->addr[2]) && \
437 ((addr1)->addr[3] == (addr2)->addr[3]))
439 #define ip6_get_subnet_id(ip6addr) (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL)
441 #define ip6_addr_isany_val(ip6addr) (((ip6addr).addr[0] == 0) && \
442 ((ip6addr).addr[1] == 0) && \
443 ((ip6addr).addr[2] == 0) && \
444 ((ip6addr).addr[3] == 0))
445 #define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || ip6_addr_isany_val(*(ip6addr)))
447 #define ip6_addr_isloopback(ip6addr) (((ip6addr)->addr[0] == 0UL) && \
448 ((ip6addr)->addr[1] == 0UL) && \
449 ((ip6addr)->addr[2] == 0UL) && \
450 ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
452 #define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL))
454 #define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL))
456 #define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL))
458 #define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL))
460 #define ip6_addr_isipv6mappedipv4(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL)))
462 #define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL))
463 #define ip6_addr_multicast_transient_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL))
464 #define ip6_addr_multicast_prefix_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL))
465 #define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL))
466 #define ip6_addr_multicast_scope(ip6addr) ((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xf)
467 #define IP6_MULTICAST_SCOPE_RESERVED 0x0
468 #define IP6_MULTICAST_SCOPE_RESERVED0 0x0
469 #define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL 0x1
470 #define IP6_MULTICAST_SCOPE_LINK_LOCAL 0x2
471 #define IP6_MULTICAST_SCOPE_RESERVED3 0x3
472 #define IP6_MULTICAST_SCOPE_ADMIN_LOCAL 0x4
473 #define IP6_MULTICAST_SCOPE_SITE_LOCAL 0x5
474 #define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL 0x8
475 #define IP6_MULTICAST_SCOPE_GLOBAL 0xe
476 #define IP6_MULTICAST_SCOPE_RESERVEDF 0xf
477 #define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff010000UL))
478 #define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff020000UL))
479 #define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff040000UL))
480 #define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff050000UL))
481 #define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL))
482 #define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL))
485 #define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \
486 ((ip6addr)->addr[1] == 0UL) && \
487 ((ip6addr)->addr[2] == 0UL) && \
488 ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
490 #define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
491 ((ip6addr)->addr[1] == 0UL) && \
492 ((ip6addr)->addr[2] == 0UL) && \
493 ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
494 #define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
495 (ip6addr)->addr[1] = 0; \
496 (ip6addr)->addr[2] = 0; \
497 (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)
499 #define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
500 ((ip6addr)->addr[1] == 0UL) && \
501 ((ip6addr)->addr[2] == 0UL) && \
502 ((ip6addr)->addr[3] == PP_HTONL(0x00000002UL)))
503 #define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
504 (ip6addr)->addr[1] = 0; \
505 (ip6addr)->addr[2] = 0; \
506 (ip6addr)->addr[3] = PP_HTONL(0x00000002UL);}while(0)
508 #define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
509 ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
510 (((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) )
512 #define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
513 (ip6addr)->addr[1] = 0; \
514 (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \
515 (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id));}while(0)
517 #define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
518 ((ip6addr)->addr[1] == 0) && \
519 ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
520 ((ip6addr)->addr[3] == (PP_HTONL(0xff000000UL) | (sn_addr)->addr[3])))
523 #define IP6_ADDR_INVALID 0x00
524 #define IP6_ADDR_TENTATIVE 0x08
525 #define IP6_ADDR_TENTATIVE_1 0x09
526 #define IP6_ADDR_TENTATIVE_2 0x0a
527 #define IP6_ADDR_TENTATIVE_3 0x0b
528 #define IP6_ADDR_TENTATIVE_4 0x0c
529 #define IP6_ADDR_TENTATIVE_5 0x0d
530 #define IP6_ADDR_TENTATIVE_6 0x0e
531 #define IP6_ADDR_TENTATIVE_7 0x0f
532 #define IP6_ADDR_VALID 0x10
533 #define IP6_ADDR_PREFERRED 0x30
534 #define IP6_ADDR_DEPRECATED 0x10
536 #define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07
538 #define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID)
539 #define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE)
540 #define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID)
541 #define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED)
542 #define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED)
544 #define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \
545 LWIP_DEBUGF(debug, ("%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F, \
546 a, b, c, d, e, f, g, h))
547 #define ip6_addr_debug_print(debug, ipaddr) \
548 ip6_addr_debug_print_parts(debug, \
549 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0), \
550 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0), \
551 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0), \
552 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0), \
553 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0), \
554 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0), \
555 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0), \
556 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0))
557 #define ip6_addr_debug_print_val(debug, ipaddr) \
558 ip6_addr_debug_print_parts(debug, \
559 IP6_ADDR_BLOCK1(&(ipaddr)), \
560 IP6_ADDR_BLOCK2(&(ipaddr)), \
561 IP6_ADDR_BLOCK3(&(ipaddr)), \
562 IP6_ADDR_BLOCK4(&(ipaddr)), \
563 IP6_ADDR_BLOCK5(&(ipaddr)), \
564 IP6_ADDR_BLOCK6(&(ipaddr)), \
565 IP6_ADDR_BLOCK7(&(ipaddr)), \
566 IP6_ADDR_BLOCK8(&(ipaddr)))
568 #define IP6ADDR_STRLEN_MAX 46
585 #if LWIP_IPV4 && LWIP_IPV6
591 typedef struct _ip_addr {
603 #define IPADDR4_INIT(u32val) { { { { u32val, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_V4 }
605 #define IPADDR6_INIT(a, b, c, d) { { { { a, b, c, d } } }, IPADDR_TYPE_V6 }
608 #define IP_IS_ANY_TYPE_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)
610 #define IPADDR_ANY_TYPE_INIT { { { { 0ul, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_ANY }
613 #define IP_IS_V4_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4)
615 #define IP_IS_V6_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6)
617 #define IP_IS_V4(ipaddr) (((ipaddr) == NULL) || IP_IS_V4_VAL(*(ipaddr)))
619 #define IP_IS_V6(ipaddr) (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr)))
621 #define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0)
622 #define IP_SET_TYPE(ipaddr, iptype) do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0)
623 #define IP_GET_TYPE(ipaddr) ((ipaddr)->type)
625 #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr))
626 #define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr))
631 #define ip_2_ip6(ipaddr) (&((ipaddr)->uaddr.ip6))
635 #define ip_2_ip4(ipaddr) (&((ipaddr)->uaddr.ip4))
638 #define IP_ADDR4(ipaddr,a,b,c,d) do { IP4_ADDR(ip_2_ip4(ipaddr),a,b,c,d); \
639 IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); } while(0)
641 #define IP_ADDR6(ipaddr,i0,i1,i2,i3) do { IP6_ADDR(ip_2_ip6(ipaddr),i0,i1,i2,i3); \
642 IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); } while(0)
645 #define ip_addr_copy(dest, src) do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \
646 ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \
647 ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); }}while(0)
649 #define ip_addr_copy_from_ip6(dest, src) do{ \
650 ip6_addr_copy(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0)
652 #define ip_addr_copy_from_ip4(dest, src) do{ \
653 ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); }while(0)
655 #define ip_addr_set_ip4_u32(ipaddr, val) do{if(ipaddr){ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \
656 IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
658 #define ip_addr_get_ip4_u32(ipaddr) (((ipaddr) && IP_IS_V4(ipaddr)) ? \
659 ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0)
661 #define ip_addr_set(dest, src) do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \
662 ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \
663 ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); }}while(0)
665 #define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src)
667 #define ip_addr_set_zero(ipaddr) do{ \
668 ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0)
670 #define ip_addr_set_zero_ip4(ipaddr) do{ \
671 ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }while(0)
673 #define ip_addr_set_zero_ip6(ipaddr) do{ \
674 ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }while(0)
676 #define ip_addr_set_any(is_ipv6, ipaddr) do{if(is_ipv6){ \
677 ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
678 ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
680 #define ip_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \
681 ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \
682 ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)
684 #define ip_addr_set_hton(dest, src) do{if(IP_IS_V6(src)){ \
685 ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \
686 ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0)
688 #define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \
689 ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \
690 ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); IP_SET_TYPE(target, IPADDR_TYPE_V4); }}while(0)
692 #define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
694 ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
696 #define ip_addr_cmp(addr1, addr2) ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \
697 ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \
698 ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
700 #define ip_addr_isany(ipaddr) ((IP_IS_V6(ipaddr)) ? \
701 ip6_addr_isany(ip_2_ip6(ipaddr)) : \
702 ip4_addr_isany(ip_2_ip4(ipaddr)))
704 #define ip_addr_isany_val(ipaddr) ((IP_IS_V6_VAL(ipaddr)) ? \
705 ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
706 ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))
708 #define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \
710 ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))
712 #define ip_addr_ismulticast(ipaddr) ((IP_IS_V6(ipaddr)) ? \
713 ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \
714 ip4_addr_ismulticast(ip_2_ip4(ipaddr)))
716 #define ip_addr_isloopback(ipaddr) ((IP_IS_V6(ipaddr)) ? \
717 ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \
718 ip4_addr_isloopback(ip_2_ip4(ipaddr)))
720 #define ip_addr_islinklocal(ipaddr) ((IP_IS_V6(ipaddr)) ? \
721 ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \
722 ip4_addr_islinklocal(ip_2_ip4(ipaddr)))
723 #define ip_addr_debug_print(debug, ipaddr) do { if(IP_IS_V6(ipaddr)) { \
724 ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); } else { \
725 ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); }}while(0)
726 #define ip_addr_debug_print_val(debug, ipaddr) do { if(IP_IS_V6_VAL(ipaddr)) { \
727 ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); } else { \
728 ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); }}while(0)
730 #define ipaddr_ntoa(addr) (((addr) == NULL) ? "NULL" : \
731 ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr))))
733 #define ipaddr_ntoa_r(addr, buf, buflen) (((addr) == NULL) ? "NULL" : \
734 ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen)))
738 #define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX
742 #define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1
743 #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1
748 #define IPADDR4_INIT(u32val) { u32val }
749 #define IP_IS_V4_VAL(ipaddr) 1
750 #define IP_IS_V6_VAL(ipaddr) 0
751 #define IP_IS_V4(ipaddr) 1
752 #define IP_IS_V6(ipaddr) 0
753 #define IP_IS_ANY_TYPE_VAL(ipaddr) 0
754 #define IP_SET_TYPE_VAL(ipaddr, iptype)
755 #define IP_SET_TYPE(ipaddr, iptype)
756 #define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V4
757 #define ip_2_ip4(ipaddr) (ipaddr)
758 #define IP_ADDR4(ipaddr,a,b,c,d) IP4_ADDR(ipaddr,a,b,c,d)
760 #define ip_addr_copy(dest, src) ip4_addr_copy(dest, src)
761 #define ip_addr_copy_from_ip4(dest, src) ip4_addr_copy(dest, src)
762 #define ip_addr_set_ip4_u32(ipaddr, val) ip4_addr_set_u32(ip_2_ip4(ipaddr), val)
763 #define ip_addr_get_ip4_u32(ipaddr) ip4_addr_get_u32(ip_2_ip4(ipaddr))
764 #define ip_addr_set(dest, src) ip4_addr_set(dest, src)
765 #define ip_addr_set_ipaddr(dest, src) ip4_addr_set(dest, src)
766 #define ip_addr_set_zero(ipaddr) ip4_addr_set_zero(ipaddr)
767 #define ip_addr_set_zero_ip4(ipaddr) ip4_addr_set_zero(ipaddr)
768 #define ip_addr_set_any(is_ipv6, ipaddr) ip4_addr_set_any(ipaddr)
769 #define ip_addr_set_loopback(is_ipv6, ipaddr) ip4_addr_set_loopback(ipaddr)
770 #define ip_addr_set_hton(dest, src) ip4_addr_set_hton(dest, src)
771 #define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask)
772 #define ip_addr_netcmp(addr1, addr2, mask) ip4_addr_netcmp(addr1, addr2, mask)
773 #define ip_addr_cmp(addr1, addr2) ip4_addr_cmp(addr1, addr2)
774 #define ip_addr_isany(ipaddr) ip4_addr_isany(ipaddr)
775 #define ip_addr_isany_val(ipaddr) ip4_addr_isany_val(ipaddr)
776 #define ip_addr_isloopback(ipaddr) ip4_addr_isloopback(ipaddr)
777 #define ip_addr_islinklocal(ipaddr) ip4_addr_islinklocal(ipaddr)
778 #define ip_addr_isbroadcast(addr, netif) ip4_addr_isbroadcast(addr, netif)
779 #define ip_addr_ismulticast(ipaddr) ip4_addr_ismulticast(ipaddr)
780 #define ip_addr_debug_print(debug, ipaddr) ip4_addr_debug_print(debug, ipaddr)
781 #define ip_addr_debug_print_val(debug, ipaddr) ip4_addr_debug_print_val(debug, ipaddr)
782 #define ipaddr_ntoa(ipaddr) ip4addr_ntoa(ipaddr)
783 #define ipaddr_ntoa_r(ipaddr, buf, buflen) ip4addr_ntoa_r(ipaddr, buf, buflen)
784 #define ipaddr_aton(cp, addr) ip4addr_aton(cp, addr)
786 #define IPADDR_STRLEN_MAX IP4ADDR_STRLEN_MAX
791 #define IPADDR6_INIT(a, b, c, d) { { a, b, c, d } }
792 #define IP_IS_V4_VAL(ipaddr) 0
793 #define IP_IS_V6_VAL(ipaddr) 1
794 #define IP_IS_V4(ipaddr) 0
795 #define IP_IS_V6(ipaddr) 1
796 #define IP_IS_ANY_TYPE_VAL(ipaddr) 0
797 #define IP_SET_TYPE_VAL(ipaddr, iptype)
798 #define IP_SET_TYPE(ipaddr, iptype)
799 #define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V6
800 #define ip_2_ip6(ipaddr) (ipaddr)
801 #define IP_ADDR6(ipaddr,i0,i1,i2,i3) IP6_ADDR(ipaddr,i0,i1,i2,i3)
803 #define ip_addr_copy(dest, src) ip6_addr_copy(dest, src)
804 #define ip_addr_copy_from_ip6(dest, src) ip6_addr_copy(dest, src)
805 #define ip_addr_set(dest, src) ip6_addr_set(dest, src)
806 #define ip_addr_set_ipaddr(dest, src) ip6_addr_set(dest, src)
807 #define ip_addr_set_zero(ipaddr) ip6_addr_set_zero(ipaddr)
808 #define ip_addr_set_zero_ip6(ipaddr) ip6_addr_set_zero(ipaddr)
809 #define ip_addr_set_any(is_ipv6, ipaddr) ip6_addr_set_any(ipaddr)
810 #define ip_addr_set_loopback(is_ipv6, ipaddr) ip6_addr_set_loopback(ipaddr)
811 #define ip_addr_set_hton(dest, src) ip6_addr_set_hton(dest, src)
812 #define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target)
813 #define ip_addr_netcmp(addr1, addr2, mask) 0
814 #define ip_addr_cmp(addr1, addr2) ip6_addr_cmp(addr1, addr2)
815 #define ip_addr_isany(ipaddr) ip6_addr_isany(ipaddr)
816 #define ip_addr_isany_val(ipaddr) ip6_addr_isany_val(ipaddr)
817 #define ip_addr_isloopback(ipaddr) ip6_addr_isloopback(ipaddr)
818 #define ip_addr_islinklocal(ipaddr) ip6_addr_islinklocal(ipaddr)
819 #define ip_addr_isbroadcast(addr, netif) 0
820 #define ip_addr_ismulticast(ipaddr) ip6_addr_ismulticast(ipaddr)
821 #define ip_addr_debug_print(debug, ipaddr) ip6_addr_debug_print(debug, ipaddr)
822 #define ip_addr_debug_print_val(debug, ipaddr) ip6_addr_debug_print_val(debug, ipaddr)
823 #define ipaddr_ntoa(ipaddr) ip6addr_ntoa(ipaddr)
824 #define ipaddr_ntoa_r(ipaddr, buf, buflen) ip6addr_ntoa_r(ipaddr, buf, buflen)
825 #define ipaddr_aton(cp, addr) ip6addr_aton(cp, addr)
827 #define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX
841 #define IP_ADDR_ANY IP4_ADDR_ANY
847 #define IP4_ADDR_ANY (&ip_addr_any)
853 #define IP4_ADDR_ANY4 (ip_2_ip4(&ip_addr_any))
856 #define IP_ADDR_BROADCAST (&ip_addr_broadcast)
858 #define IP4_ADDR_BROADCAST (ip_2_ip4(&ip_addr_broadcast))
871 #define IP6_ADDR_ANY (&ip6_addr_any)
877 #define IP6_ADDR_ANY6 (ip_2_ip6(&ip6_addr_any))
881 #define IP_ADDR_ANY IP6_ADDR_ANY
886 #if LWIP_IPV4 && LWIP_IPV6
888 #define IP_ANY_TYPE (&ip_addr_any_type)
890 #define IP_ANY_TYPE IP_ADDR_ANY
902 #ifndef NETIF_MAX_HWADDR_LEN
903 #define NETIF_MAX_HWADDR_LEN 6U
918 #define NETIF_FLAG_UP 0x01U
921 #define NETIF_FLAG_BROADCAST 0x02U
927 #define NETIF_FLAG_LINK_UP 0x04U
931 #define NETIF_FLAG_ETHARP 0x08U
935 #define NETIF_FLAG_ETHERNET 0x10U
938 #define NETIF_FLAG_IGMP 0x20U
941 #define NETIF_FLAG_MLD6 0x40U
953 LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP,
956 LWIP_NETIF_CLIENT_DATA_INDEX_IGMP,
959 LWIP_NETIF_CLIENT_DATA_INDEX_MLD6,
964 #if LWIP_CHECKSUM_CTRL_PER_NETIF
965 #define NETIF_CHECKSUM_GEN_IP 0x0001
966 #define NETIF_CHECKSUM_GEN_UDP 0x0002
967 #define NETIF_CHECKSUM_GEN_TCP 0x0004
968 #define NETIF_CHECKSUM_GEN_ICMP 0x0008
969 #define NETIF_CHECKSUM_GEN_ICMP6 0x0010
970 #define NETIF_CHECKSUM_CHECK_IP 0x0100
971 #define NETIF_CHECKSUM_CHECK_UDP 0x0200
972 #define NETIF_CHECKSUM_CHECK_TCP 0x0400
973 #define NETIF_CHECKSUM_CHECK_ICMP 0x0800
974 #define NETIF_CHECKSUM_CHECK_ICMP6 0x1000
975 #define NETIF_CHECKSUM_ENABLE_ALL 0xFFFF
976 #define NETIF_CHECKSUM_DISABLE_ALL 0x0000
1014 const ip4_addr_t *ipaddr);
1027 const ip6_addr_t *ipaddr);
1039 #if LWIP_IPV4 && LWIP_IGMP
1044 #if LWIP_IPV6 && LWIP_IPV6_MLD
1050 #if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || (LWIP_NUM_NETIF_CLIENT_DATA > 0)
1055 #define netif_set_client_data(netif, id, data) netif_get_client_data(netif, id) = (data)
1059 #define netif_get_client_data(netif, id) (netif)->client_data[(id)]
1080 u8 ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
1101 netif_output_ip6_fn output_ip6;
1103 #if LWIP_NETIF_STATUS_CALLBACK
1108 #if LWIP_NETIF_LINK_CALLBACK
1113 #if LWIP_NETIF_REMOVE_CALLBACK
1120 #ifdef netif_get_client_data
1123 #if LWIP_IPV6_AUTOCONFIG
1125 u8 ip6_autoconfig_enabled;
1127 #if LWIP_IPV6_SEND_ROUTER_SOLICIT
1131 #if LWIP_NETIF_HOSTNAME
1135 #if LWIP_CHECKSUM_CTRL_PER_NETIF
1158 struct stats_mib2_netif_ctrs mib2_counters;
1160 #if LWIP_IPV4 && LWIP_IGMP
1163 netif_igmp_mac_filter_fn igmp_mac_filter;
1165 #if LWIP_IPV6 && LWIP_IPV6_MLD
1168 netif_mld_mac_filter_fn mld_mac_filter;
1170 #if LWIP_NETIF_HWADDRHINT
1175 struct pbuf *loop_first;
1176 struct pbuf *loop_last;
1177 #if LWIP_LOOPBACK_MAX_PBUFS
1178 u16 loop_cnt_current;
1183 #if LWIP_CHECKSUM_CTRL_PER_NETIF
1184 #define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags) do { \
1185 (netif)->chksum_flags = chksumflags; } while(0)
1186 #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) if (((netif) == NULL) || (((netif)->chksum_flags & (chksumflag)) != 0))
1188 #define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags)
1189 #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag)
1199 #define netif_ip4_addr(netif) ((const ip4_addr_t*)ip_2_ip4(&((netif)->ip_addr)))
1201 #define netif_ip4_netmask(netif) ((const ip4_addr_t*)ip_2_ip4(&((netif)->netmask)))
1203 #define netif_ip4_gw(netif) ((const ip4_addr_t*)ip_2_ip4(&((netif)->gw)))
1205 #define netif_ip_addr4(netif) ((const ip_addr_t*)&((netif)->ip_addr))
1207 #define netif_ip_netmask4(netif) ((const ip_addr_t*)&((netif)->netmask))
1209 #define netif_ip_gw4(netif) ((const ip_addr_t*)&((netif)->gw))
1215 #define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8)1 : (u8)0)
1218 #define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8)1 : (u8)0)
1220 #if LWIP_NETIF_HOSTNAME
1222 #define netif_set_hostname(netif, name) do { if((netif) != NULL) { (netif)->hostname = name; }}while(0)
1224 #define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL)
1229 #define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0)
1230 #define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL)
1233 #if LWIP_IPV6 && LWIP_IPV6_MLD
1235 #define netif_set_mld_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->mld_mac_filter = function; }}while(0)
1236 #define netif_get_mld_mac_filter(netif) (((netif) != NULL) ? ((netif)->mld_mac_filter) : NULL)
1237 #define netif_mld_mac_filter(netif, addr, action) do { if((netif) && (netif)->mld_mac_filter) { (netif)->mld_mac_filter((netif), (addr), (action)); }}while(0)
1242 #define netif_ip_addr6(netif, i) ((const ip_addr_t*)(&((netif)->ip6_addr[i])))
1244 #define netif_ip6_addr(netif, i) ((const ip6_addr_t*)ip_2_ip6(&((netif)->ip6_addr[i])))
1245 void netif_ip6_addr_set(
struct netif *
netif,
s8_t addr_idx,
const ip6_addr_t *addr6);
1247 #define netif_ip6_addr_state(netif, i) ((netif)->ip6_addr_state[i])
1248 #define netif_set_ip6_autoconfig_enabled(netif, action) do { if(netif) { (netif)->ip6_autoconfig_enabled = (action); }}while(0)
1251 #if LWIP_NETIF_HWADDRHINT
1252 #define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint))
1254 #define NETIF_SET_HWADDRHINT(netif, hint)
1286 #define s6_addr un.u8_addr
1290 #define INADDR_NONE IPADDR_NONE
1292 #define INADDR_LOOPBACK IPADDR_LOOPBACK
1294 #define INADDR_ANY IPADDR_ANY
1296 #define INADDR_BROADCAST IPADDR_BROADCAST
1300 #if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
1305 #if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED)
1316 #define SIN_ZERO_LEN 8
1322 struct sockaddr_in6 {
1349 #define SOCKLEN_T_DEFINED 1
1353 #define SOCK_STREAM 1
1354 #define SOCK_DGRAM 2
1360 #define SO_REUSEADDR 0x0004
1361 #define SO_KEEPALIVE 0x0008
1362 #define SO_BROADCAST 0x0020
1368 #define SO_DEBUG 0x0001
1369 #define SO_ACCEPTCONN 0x0002
1370 #define SO_DONTROUTE 0x0010
1371 #define SO_USELOOPBACK 0x0040
1372 #define SO_LINGER 0x0080
1373 #define SO_DONTLINGER ((int)(~SO_LINGER))
1374 #define SO_OOBINLINE 0x0100
1375 #define SO_REUSEPORT 0x0200
1376 #define SO_SNDBUF 0x1001
1377 #define SO_RCVBUF 0x1002
1378 #define SO_SNDLOWAT 0x1003
1379 #define SO_RCVLOWAT 0x1004
1380 #define SO_SNDTIMEO 0x1005
1381 #define SO_RCVTIMEO 0x1006
1382 #define SO_ERROR 0x1007
1383 #define SO_TYPE 0x1008
1384 #define SO_CONTIMEO 0x1009
1385 #define SO_NO_CHECK 0x100a
1390 #define SOL_SOCKET 0xfff
1397 #define AF_INET6 AF_UNSPEC
1399 #define PF_INET AF_INET
1400 #define PF_INET6 AF_INET6
1401 #define PF_UNSPEC AF_UNSPEC
1403 #define IPPROTO_IP 0
1404 #define IPPROTO_ICMP 1
1405 #define IPPROTO_TCP 6
1406 #define IPPROTO_UDP 17
1408 #define IPPROTO_IPV6 41
1409 #define IPPROTO_ICMPV6 58
1411 #define IPPROTO_UDPLITE 136
1412 #define IPPROTO_RAW 255
1415 #define MSG_PEEK 0x01
1416 #define MSG_WAITALL 0x02
1417 #define MSG_OOB 0x04
1418 #define MSG_DONTWAIT 0x08
1419 #define MSG_MORE 0x10
1431 #define TCP_NODELAY 0x01
1432 #define TCP_KEEPALIVE 0x02
1433 #define TCP_KEEPIDLE 0x03
1434 #define TCP_KEEPINTVL 0x04
1435 #define TCP_KEEPCNT 0x05
1442 #define IPV6_CHECKSUM 7
1443 #define IPV6_V6ONLY 27
1446 #if LWIP_UDP && LWIP_UDPLITE
1450 #define UDPLITE_SEND_CSCOV 0x01
1451 #define UDPLITE_RECV_CSCOV 0x02
1455 #if LWIP_MULTICAST_TX_OPTIONS
1459 #define IP_MULTICAST_TTL 5
1460 #define IP_MULTICAST_IF 6
1461 #define IP_MULTICAST_LOOP 7
1468 #define IP_ADD_MEMBERSHIP 3
1469 #define IP_DROP_MEMBERSHIP 4
1471 typedef struct ip_mreq {
1493 #define IPTOS_TOS_MASK 0x1E
1494 #define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
1495 #define IPTOS_LOWDELAY 0x10
1496 #define IPTOS_THROUGHPUT 0x08
1497 #define IPTOS_RELIABILITY 0x04
1498 #define IPTOS_LOWCOST 0x02
1499 #define IPTOS_MINCOST IPTOS_LOWCOST
1510 #define IPTOS_PREC_MASK 0xe0
1511 #define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK)
1512 #define IPTOS_PREC_NETCONTROL 0xe0
1513 #define IPTOS_PREC_INTERNETCONTROL 0xc0
1514 #define IPTOS_PREC_CRITIC_ECP 0xa0
1515 #define IPTOS_PREC_FLASHOVERRIDE 0x80
1516 #define IPTOS_PREC_FLASH 0x60
1517 #define IPTOS_PREC_IMMEDIATE 0x40
1518 #define IPTOS_PREC_PRIORITY 0x20
1519 #define IPTOS_PREC_ROUTINE 0x00
1532 #if !defined(FIONREAD) || !defined(FIONBIO)
1533 #define IOCPARM_MASK 0x7fU
1534 #define IOC_VOID 0x20000000UL
1535 #define IOC_OUT 0x40000000UL
1536 #define IOC_IN 0x80000000UL
1537 #define IOC_INOUT (IOC_IN|IOC_OUT)
1540 #define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
1542 #define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
1544 #define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
1548 #define FIONREAD _IOR('f', 127, unsigned long)
1551 #define FIONBIO _IOW('f', 126, unsigned long)
1556 #define SIOCSHIWAT _IOW('s', 0, unsigned long)
1557 #define SIOCGHIWAT _IOR('s', 1, unsigned long)
1558 #define SIOCSLOWAT _IOW('s', 2, unsigned long)
1559 #define SIOCGLOWAT _IOR('s', 3, unsigned long)
1560 #define SIOCATMARK _IOR('s', 7, unsigned long)
1574 #define O_NONBLOCK 1
1590 #define FD_SETSIZE MEMP_NUM_NETCONN
1591 #define FDSETSAFESET(n, code) do { \
1592 if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \
1594 #define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\
1596 #define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |= (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1597 #define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1598 #define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] & (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1599 #define FD_ZERO(p) memset((void*)(p), 0, sizeof(*(p)))
1606 #elif LWIP_SOCKET_OFFSET
1607 #error LWIP_SOCKET_OFFSET does not work with external FD_SET!
1608 #elif FD_SETSIZE < MEMP_NUM_NETCONN
1609 #error "external FD_SETSIZE too small for number of sockets"
1614 #define DNS_TMR_INTERVAL 1000
1617 #define LWIP_DNS_ADDRTYPE_IPV4 0
1618 #define LWIP_DNS_ADDRTYPE_IPV6 1
1619 #define LWIP_DNS_ADDRTYPE_IPV4_IPV6 2
1620 #define LWIP_DNS_ADDRTYPE_IPV6_IPV4 3
1621 #if LWIP_IPV4 && LWIP_IPV6
1622 #ifndef LWIP_DNS_ADDRTYPE_DEFAULT
1623 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV4_IPV6
1625 #elif defined(LWIP_IPV4)
1626 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV4
1628 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV6
1631 #if DNS_LOCAL_HOSTLIST
1633 struct local_hostlist_entry {
1638 struct local_hostlist_entry *next;
1640 #if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
1641 #ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN
1642 #define DNS_LOCAL_HOSTLIST_MAX_NAMELEN DNS_MAX_NAME_LENGTH
1644 #define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1))
1660 #ifndef LWIP_DNS_API_DECLARE_H_ERRNO
1661 #define LWIP_DNS_API_DECLARE_H_ERRNO 1
1664 #ifndef LWIP_DNS_API_DEFINE_ERRORS
1665 #define LWIP_DNS_API_DEFINE_ERRORS 1
1668 #ifndef LWIP_DNS_API_DEFINE_FLAGS
1669 #define LWIP_DNS_API_DEFINE_FLAGS 1
1672 #ifndef LWIP_DNS_API_DECLARE_STRUCTS
1673 #define LWIP_DNS_API_DECLARE_STRUCTS 1
1676 #if LWIP_DNS_API_DEFINE_ERRORS
1678 #define EAI_NONAME 200
1679 #define EAI_SERVICE 201
1680 #define EAI_FAIL 202
1681 #define EAI_MEMORY 203
1682 #define EAI_FAMILY 204
1684 #define HOST_NOT_FOUND 210
1686 #define NO_RECOVERY 212
1687 #define TRY_AGAIN 213
1690 #if LWIP_DNS_API_DEFINE_FLAGS
1692 #define AI_PASSIVE 0x01
1693 #define AI_CANONNAME 0x02
1694 #define AI_NUMERICHOST 0x04
1695 #define AI_NUMERICSERV 0x08
1696 #define AI_V4MAPPED 0x10
1698 #define AI_ADDRCONFIG 0x40
1701 #if LWIP_DNS_API_DECLARE_STRUCTS
1710 #define h_addr h_addr_list[0]
1725 #define NETDB_ELEM_SIZE (sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + DNS_MAX_NAME_LENGTH + 1)
1728 #define htons(x) lwip_htons(x)
1729 #define ntohs(x) lwip_ntohs(x)
1730 #define htonl(x) lwip_htonl(x)
1731 #define ntohl(x) lwip_ntohl(x)
1733 #define lwip_htons(x) PP_HTONS(x)
1734 #define lwip_ntohs(x) PP_NTOHS(x)
1735 #define lwip_htonl(x) PP_HTONL(x)
1736 #define lwip_ntohl(x) PP_NTOHL(x)
1741 #define PP_HTONS(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))
1742 #define PP_NTOHS(x) PP_HTONS(x)
1743 #define PP_HTONL(x) ((((x) & 0xff) << 24) | \
1744 (((x) & 0xff00) << 8) | \
1745 (((x) & 0xff0000UL) >> 8) | \
1746 (((x) & 0xff000000UL) >> 24))
1747 #define PP_NTOHL(x) PP_HTONL(x)
struct sockaddr * ai_addr
struct addrinfo * ai_next
unsigned char fd_bits[(FD_SETSIZE+7)/8]
void * client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX+LWIP_NUM_NETIF_CLIENT_DATA]
netif_linkoutput_fn linkoutput
u8 hwaddr[NETIF_MAX_HWADDR_LEN]
char sin_zero[SIN_ZERO_LEN]
struct netif * netif_list
err_t(* netif_init_fn)(struct netif *netif)
struct netif * netif_default
void(* netif_status_callback_fn)(struct netif *netif)
lwip_internal_netif_client_data_index
@ LWIP_NETIF_CLIENT_DATA_INDEX_MAX
@ LWIP_NETIF_CLIENT_DATA_INDEX_DHCP
const ip_addr_t ip_addr_any
err_t(* netif_output_fn)(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)
#define LWIP_NUM_NETIF_CLIENT_DATA
#define ipaddr_aton(cp, addr)
err_t(* netif_input_fn)(struct pbuf *p, struct netif *inp)
void(* dns_found_callback)(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
err_t(* netif_linkoutput_fn)(struct netif *netif, struct pbuf *p)
#define NETIF_MAX_HWADDR_LEN
struct ip4_addr_packed ip4_addr_p_t
struct ip6_addr_packed ip6_addr_p_t
u8 netif_alloc_client_data_id(void)
const ip_addr_t ip_addr_broadcast