22 #include <sys/select.h>
43 #define LWIP_IPV6_MLD 0
45 #ifndef LWIP_CHECKSUM_CTRL_PER_NETIF
46 #define LWIP_CHECKSUM_CTRL_PER_NETIF 0
48 #ifndef LWIP_NETIF_REMOVE_CALLBACK
49 #define LWIP_NETIF_REMOVE_CALLBACK 0
51 #ifndef LWIP_IPV6_AUTOCONFIG
52 #define LWIP_IPV6_AUTOCONFIG 0
54 #ifndef LWIP_MULTICAST_TX_OPTIONS
55 #define LWIP_MULTICAST_TX_OPTIONS 0
67 #define LWIP_UDPLITE 0
72 #ifndef ENABLE_LOOPBACK
73 #define ENABLE_LOOPBACK 0
75 #ifndef DNS_LOCAL_HOSTLIST
76 #define DNS_LOCAL_HOSTLIST 0
81 #ifndef MEMP_NUM_UDP_PCB
82 #define MEMP_NUM_UDP_PCB 4
84 #ifndef MEMP_NUM_TCP_PCB
85 #define MEMP_NUM_TCP_PCB 5
87 #ifndef MEMP_NUM_NETCONN
88 #define MEMP_NUM_NETCONN (MEMP_NUM_TCP_PCB + MEMP_NUM_UDP_PCB)
90 #ifndef LWIP_NETIF_STATUS_CALLBACK
91 #define LWIP_NETIF_STATUS_CALLBACK 0
93 #ifndef LWIP_NETIF_LINK_CALLBACK
94 #define LWIP_NETIF_LINK_CALLBACK 0
99 #ifndef LWIP_NETIF_HOSTNAME
100 #define LWIP_NETIF_HOSTNAME 0
108 #ifndef LWIP_NETIF_HWADDRHINT
109 #define LWIP_NETIF_HWADDRHINT 0
111 #ifndef LWIP_LOOPBACK_MAX_PBUFS
112 #define LWIP_LOOPBACK_MAX_PBUFS 0
114 #ifndef LWIP_NUM_NETIF_CLIENT_DATA
115 #define LWIP_NUM_NETIF_CLIENT_DATA 0
117 #ifndef LWIP_SOCKET_OFFSET
118 #define LWIP_SOCKET_OFFSET 0
120 #ifndef LWIP_IPV6_SEND_ROUTER_SOLICIT
121 #define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
123 #ifndef DNS_MAX_SERVERS
124 #define DNS_MAX_SERVERS 2
159 typedef signed char err_t;
163 #define PBUF_TRANSPORT_HLEN 20
165 #define PBUF_IP_HLEN 40
167 #define PBUF_IP_HLEN 20
274 typedef struct ip4_addr_packed ip4_addr_p_t;
277 #define IPADDR_NONE ((u32)0xffffffffUL)
279 #define IPADDR_LOOPBACK ((u32)0x7f000001UL)
281 #define IPADDR_ANY ((u32)0x00000000UL)
283 #define IPADDR_BROADCAST ((u32)0xffffffffUL)
289 #define IP_CLASSA(a) ((((u32)(a)) & 0x80000000UL) == 0)
290 #define IP_CLASSA_NET 0xff000000
291 #define IP_CLASSA_NSHIFT 24
292 #define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET)
293 #define IP_CLASSA_MAX 128
295 #define IP_CLASSB(a) ((((u32)(a)) & 0xc0000000UL) == 0x80000000UL)
296 #define IP_CLASSB_NET 0xffff0000
297 #define IP_CLASSB_NSHIFT 16
298 #define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET)
299 #define IP_CLASSB_MAX 65536
301 #define IP_CLASSC(a) ((((u32)(a)) & 0xe0000000UL) == 0xc0000000UL)
302 #define IP_CLASSC_NET 0xffffff00
303 #define IP_CLASSC_NSHIFT 8
304 #define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET)
306 #define IP_CLASSD(a) (((u32)(a)&0xf0000000UL) == 0xe0000000UL)
307 #define IP_CLASSD_NET 0xf0000000
308 #define IP_CLASSD_NSHIFT 28
309 #define IP_CLASSD_HOST 0x0fffffff
310 #define IP_MULTICAST(a) IP_CLASSD(a)
312 #define IP_EXPERIMENTAL(a) (((u32)(a)&0xf0000000UL) == 0xf0000000UL)
313 #define IP_BADCLASS(a) (((u32)(a)&0xf0000000UL) == 0xf0000000UL)
315 #define IP_LOOPBACKNET 127
320 #define IP4_ADDR(ipaddr, a, b, c, d) \
321 (ipaddr)->addr = ((u32)((d)&0xff) << 24) | \
322 ((u32)((c)&0xff) << 16) | \
323 ((u32)((b)&0xff) << 8) | \
330 #define IPADDR2_COPY(dest, src) memcpy(dest, src, sizeof(ip4_addr_t))
334 #define ip4_addr_copy(dest, src) ((dest).addr = (src).addr)
336 #define ip4_addr_set(dest, src) ((dest)->addr = \
337 ((src) == NULL ? 0 : \
340 #define ip4_addr_set_zero(ipaddr) ((ipaddr)->addr = 0)
342 #define ip4_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY)
344 #define ip4_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK))
346 #define ip4_addr_isloopback(ipaddr) (((ipaddr)->addr & PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32)IP_LOOPBACKNET) << 24))
349 #define ip4_addr_set_hton(dest, src) ((dest)->addr = \
350 ((src) == NULL ? 0 : \
351 lwip_htonl((src)->addr)))
353 #define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))
355 #define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr)
358 #define ip4_addr_get_network(target, host, netmask) \
360 ((target)->addr = ((host)->addr) & ((netmask)->addr)); \
371 #define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
375 #define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
377 #define ip4_addr_isany_val(addr1) ((addr1).addr == IPADDR_ANY)
378 #define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1)))
380 #define ip4_addr_isbroadcast(addr1, netif) ip4_addr_isbroadcast_u32((addr1)->addr, netif)
382 #define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr)
384 #define ip4_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL))
386 #define ip4_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL))
388 #define ip4_addr_debug_print_parts(debug, a, b, c, d) \
389 LWIP_DEBUGF(debug, ("%" U16_F ".%" U16_F ".%" U16_F ".%" U16_F, a, b, c, d))
390 #define ip4_addr_debug_print(debug, ipaddr) \
391 ip4_addr_debug_print_parts(debug, \
392 (u16)((ipaddr) != NULL ? ip4_addr1_16(ipaddr) : 0), \
393 (u16)((ipaddr) != NULL ? ip4_addr2_16(ipaddr) : 0), \
394 (u16)((ipaddr) != NULL ? ip4_addr3_16(ipaddr) : 0), \
395 (u16)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0))
396 #define ip4_addr_debug_print_val(debug, ipaddr) \
397 ip4_addr_debug_print_parts(debug, \
398 ip4_addr1_16(&(ipaddr)), \
399 ip4_addr2_16(&(ipaddr)), \
400 ip4_addr3_16(&(ipaddr)), \
401 ip4_addr4_16(&(ipaddr)))
404 #define ip4_addr1(ipaddr) (((const u8 *)(&(ipaddr)->addr))[0])
405 #define ip4_addr2(ipaddr) (((const u8 *)(&(ipaddr)->addr))[1])
406 #define ip4_addr3(ipaddr) (((const u8 *)(&(ipaddr)->addr))[2])
407 #define ip4_addr4(ipaddr) (((const u8 *)(&(ipaddr)->addr))[3])
410 #define ip4_addr1_16(ipaddr) ((u16)ip4_addr1(ipaddr))
411 #define ip4_addr2_16(ipaddr) ((u16)ip4_addr2(ipaddr))
412 #define ip4_addr3_16(ipaddr) ((u16)ip4_addr3(ipaddr))
413 #define ip4_addr4_16(ipaddr) ((u16)ip4_addr4(ipaddr))
415 #define IP4ADDR_STRLEN_MAX 16
427 typedef struct ip6_addr_packed ip6_addr_p_t;
431 #define IP6_ADDR_PART(ip6addr, index, a, b, c, d) \
432 (ip6addr)->addr[index] = ((u32)((d)&0xff) << 24) | \
433 ((u32)((c)&0xff) << 16) | \
434 ((u32)((b)&0xff) << 8) | \
439 #define IP6_ADDR(ip6addr, idx0, idx1, idx2, idx3) \
441 (ip6addr)->addr[0] = idx0; \
442 (ip6addr)->addr[1] = idx1; \
443 (ip6addr)->addr[2] = idx2; \
444 (ip6addr)->addr[3] = idx3; \
448 #define IP6_ADDR_BLOCK1(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff))
450 #define IP6_ADDR_BLOCK2(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[0])) & 0xffff))
452 #define IP6_ADDR_BLOCK3(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[1]) >> 16) & 0xffff))
454 #define IP6_ADDR_BLOCK4(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[1])) & 0xffff))
456 #define IP6_ADDR_BLOCK5(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[2]) >> 16) & 0xffff))
458 #define IP6_ADDR_BLOCK6(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[2])) & 0xffff))
460 #define IP6_ADDR_BLOCK7(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[3]) >> 16) & 0xffff))
462 #define IP6_ADDR_BLOCK8(ip6addr) ((u16)((lwip_htonl((ip6addr)->addr[3])) & 0xffff))
465 #define ip6_addr_copy(dest, src) \
467 (dest).addr[0] = (src).addr[0]; \
468 (dest).addr[1] = (src).addr[1]; \
469 (dest).addr[2] = (src).addr[2]; \
470 (dest).addr[3] = (src).addr[3]; \
473 #define ip6_addr_set(dest, src) \
475 (dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \
476 (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \
477 (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \
478 (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3]; \
482 #define ip6_addr_set_zero(ip6addr) \
484 (ip6addr)->addr[0] = 0; \
485 (ip6addr)->addr[1] = 0; \
486 (ip6addr)->addr[2] = 0; \
487 (ip6addr)->addr[3] = 0; \
491 #define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr)
493 #define ip6_addr_set_loopback(ip6addr) \
495 (ip6addr)->addr[0] = 0; \
496 (ip6addr)->addr[1] = 0; \
497 (ip6addr)->addr[2] = 0; \
498 (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \
502 #define ip6_addr_set_hton(dest, src) \
504 (dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \
505 (dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \
506 (dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \
507 (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]); \
518 #define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
519 ((addr1)->addr[1] == (addr2)->addr[1]))
521 #define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
522 ((addr1)->addr[1] == (addr2)->addr[1]) && \
523 ((addr1)->addr[2] == (addr2)->addr[2]) && \
524 ((addr1)->addr[3] == (addr2)->addr[3]))
526 #define ip6_get_subnet_id(ip6addr) (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL)
528 #define ip6_addr_isany_val(ip6addr) (((ip6addr).addr[0] == 0) && \
529 ((ip6addr).addr[1] == 0) && \
530 ((ip6addr).addr[2] == 0) && \
531 ((ip6addr).addr[3] == 0))
532 #define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || ip6_addr_isany_val(*(ip6addr)))
534 #define ip6_addr_isloopback(ip6addr) (((ip6addr)->addr[0] == 0UL) && \
535 ((ip6addr)->addr[1] == 0UL) && \
536 ((ip6addr)->addr[2] == 0UL) && \
537 ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
539 #define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL))
541 #define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL))
543 #define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL))
545 #define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL))
547 #define ip6_addr_isipv6mappedipv4(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL)))
549 #define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL))
550 #define ip6_addr_multicast_transient_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL))
551 #define ip6_addr_multicast_prefix_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL))
552 #define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL))
553 #define ip6_addr_multicast_scope(ip6addr) ((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xf)
554 #define IP6_MULTICAST_SCOPE_RESERVED 0x0
555 #define IP6_MULTICAST_SCOPE_RESERVED0 0x0
556 #define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL 0x1
557 #define IP6_MULTICAST_SCOPE_LINK_LOCAL 0x2
558 #define IP6_MULTICAST_SCOPE_RESERVED3 0x3
559 #define IP6_MULTICAST_SCOPE_ADMIN_LOCAL 0x4
560 #define IP6_MULTICAST_SCOPE_SITE_LOCAL 0x5
561 #define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL 0x8
562 #define IP6_MULTICAST_SCOPE_GLOBAL 0xe
563 #define IP6_MULTICAST_SCOPE_RESERVEDF 0xf
564 #define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff010000UL))
565 #define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff020000UL))
566 #define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff040000UL))
567 #define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff050000UL))
568 #define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL))
569 #define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL))
572 #define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \
573 ((ip6addr)->addr[1] == 0UL) && \
574 ((ip6addr)->addr[2] == 0UL) && \
575 ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
577 #define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
578 ((ip6addr)->addr[1] == 0UL) && \
579 ((ip6addr)->addr[2] == 0UL) && \
580 ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))
581 #define ip6_addr_set_allnodes_linklocal(ip6addr) \
583 (ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
584 (ip6addr)->addr[1] = 0; \
585 (ip6addr)->addr[2] = 0; \
586 (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \
589 #define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
590 ((ip6addr)->addr[1] == 0UL) && \
591 ((ip6addr)->addr[2] == 0UL) && \
592 ((ip6addr)->addr[3] == PP_HTONL(0x00000002UL)))
593 #define ip6_addr_set_allrouters_linklocal(ip6addr) \
595 (ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
596 (ip6addr)->addr[1] = 0; \
597 (ip6addr)->addr[2] = 0; \
598 (ip6addr)->addr[3] = PP_HTONL(0x00000002UL); \
601 #define ip6_addr_issolicitednode(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
602 ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
603 (((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)))
605 #define ip6_addr_set_solicitednode(ip6addr, if_id) \
607 (ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
608 (ip6addr)->addr[1] = 0; \
609 (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \
610 (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id)); \
613 #define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
614 ((ip6addr)->addr[1] == 0) && \
615 ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
616 ((ip6addr)->addr[3] == (PP_HTONL(0xff000000UL) | (sn_addr)->addr[3])))
619 #define IP6_ADDR_INVALID 0x00
620 #define IP6_ADDR_TENTATIVE 0x08
621 #define IP6_ADDR_TENTATIVE_1 0x09
622 #define IP6_ADDR_TENTATIVE_2 0x0a
623 #define IP6_ADDR_TENTATIVE_3 0x0b
624 #define IP6_ADDR_TENTATIVE_4 0x0c
625 #define IP6_ADDR_TENTATIVE_5 0x0d
626 #define IP6_ADDR_TENTATIVE_6 0x0e
627 #define IP6_ADDR_TENTATIVE_7 0x0f
628 #define IP6_ADDR_VALID 0x10
629 #define IP6_ADDR_PREFERRED 0x30
630 #define IP6_ADDR_DEPRECATED 0x10
632 #define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07
634 #define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID)
635 #define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE)
636 #define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID)
637 #define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED)
638 #define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED)
640 #define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \
641 LWIP_DEBUGF(debug, ("%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F, \
642 a, b, c, d, e, f, g, h))
643 #define ip6_addr_debug_print(debug, ipaddr) \
644 ip6_addr_debug_print_parts(debug, \
645 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0), \
646 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0), \
647 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0), \
648 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0), \
649 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0), \
650 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0), \
651 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0), \
652 (u16)((ipaddr) != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0))
653 #define ip6_addr_debug_print_val(debug, ipaddr) \
654 ip6_addr_debug_print_parts(debug, \
655 IP6_ADDR_BLOCK1(&(ipaddr)), \
656 IP6_ADDR_BLOCK2(&(ipaddr)), \
657 IP6_ADDR_BLOCK3(&(ipaddr)), \
658 IP6_ADDR_BLOCK4(&(ipaddr)), \
659 IP6_ADDR_BLOCK5(&(ipaddr)), \
660 IP6_ADDR_BLOCK6(&(ipaddr)), \
661 IP6_ADDR_BLOCK7(&(ipaddr)), \
662 IP6_ADDR_BLOCK8(&(ipaddr)))
664 #define IP6ADDR_STRLEN_MAX 46
681 #if LWIP_IPV4 && LWIP_IPV6
687 typedef struct _ip_addr
701 #define IPADDR4_INIT(u32val) \
703 {{{u32val, 0ul, 0ul, 0ul}}}, IPADDR_TYPE_V4 \
706 #define IPADDR6_INIT(a, b, c, d) \
708 {{{a, b, c, d}}}, IPADDR_TYPE_V6 \
712 #define IP_IS_ANY_TYPE_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)
714 #define IPADDR_ANY_TYPE_INIT \
716 {{{0ul, 0ul, 0ul, 0ul}}}, IPADDR_TYPE_ANY \
720 #define IP_IS_V4_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4)
722 #define IP_IS_V6_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6)
724 #define IP_IS_V4(ipaddr) (((ipaddr) == NULL) || IP_IS_V4_VAL(*(ipaddr)))
726 #define IP_IS_V6(ipaddr) (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr)))
728 #define IP_SET_TYPE_VAL(ipaddr, iptype) \
730 (ipaddr).type = (iptype); \
732 #define IP_SET_TYPE(ipaddr, iptype) \
734 if ((ipaddr) != NULL) { \
735 IP_SET_TYPE_VAL(*(ipaddr), iptype); \
738 #define IP_GET_TYPE(ipaddr) ((ipaddr)->type)
740 #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr))
741 #define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr))
746 #define ip_2_ip6(ipaddr) (&((ipaddr)->uaddr.ip6))
750 #define ip_2_ip4(ipaddr) (&((ipaddr)->uaddr.ip4))
753 #define IP_ADDR4(ipaddr, a, b, c, d) \
755 IP4_ADDR(ip_2_ip4(ipaddr), a, b, c, d); \
756 IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); \
759 #define IP_ADDR6(ipaddr, i0, i1, i2, i3) \
761 IP6_ADDR(ip_2_ip6(ipaddr), i0, i1, i2, i3); \
762 IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); \
766 #define ip_addr_copy(dest, src) \
768 IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); \
769 if (IP_IS_V6_VAL(src)) { \
770 ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); \
772 ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); \
776 #define ip_addr_copy_from_ip6(dest, src) \
778 ip6_addr_copy(*ip_2_ip6(&(dest)), src); \
779 IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); \
782 #define ip_addr_copy_from_ip4(dest, src) \
784 ip4_addr_copy(*ip_2_ip4(&(dest)), src); \
785 IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); \
788 #define ip_addr_set_ip4_u32(ipaddr, val) \
791 ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \
792 IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); \
796 #define ip_addr_get_ip4_u32(ipaddr) (((ipaddr) && IP_IS_V4(ipaddr)) ? \
797 ip4_addr_get_u32(ip_2_ip4(ipaddr)) : \
800 #define ip_addr_set(dest, src) \
802 IP_SET_TYPE(dest, IP_GET_TYPE(src)); \
803 if (IP_IS_V6(src)) { \
804 ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); \
806 ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); \
810 #define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src)
812 #define ip_addr_set_zero(ipaddr) \
814 ip6_addr_set_zero(ip_2_ip6(ipaddr)); \
815 IP_SET_TYPE(ipaddr, 0); \
818 #define ip_addr_set_zero_ip4(ipaddr) \
820 ip6_addr_set_zero(ip_2_ip6(ipaddr)); \
821 IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); \
824 #define ip_addr_set_zero_ip6(ipaddr) \
826 ip6_addr_set_zero(ip_2_ip6(ipaddr)); \
827 IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); \
830 #define ip_addr_set_any(is_ipv6, ipaddr) \
833 ip6_addr_set_any(ip_2_ip6(ipaddr)); \
834 IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); \
836 ip4_addr_set_any(ip_2_ip4(ipaddr)); \
837 IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); \
841 #define ip_addr_set_loopback(is_ipv6, ipaddr) \
844 ip6_addr_set_loopback(ip_2_ip6(ipaddr)); \
845 IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); \
847 ip4_addr_set_loopback(ip_2_ip4(ipaddr)); \
848 IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); \
852 #define ip_addr_set_hton(dest, src) \
854 if (IP_IS_V6(src)) { \
855 ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); \
856 IP_SET_TYPE(dest, IPADDR_TYPE_V6); \
858 ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); \
859 IP_SET_TYPE(dest, IPADDR_TYPE_V4); \
863 #define ip_addr_get_network(target, host, netmask) \
865 if (IP_IS_V6(host)) { \
866 ip4_addr_set_zero(ip_2_ip4(target)); \
867 IP_SET_TYPE(target, IPADDR_TYPE_V6); \
869 ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); \
870 IP_SET_TYPE(target, IPADDR_TYPE_V4); \
874 #define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \
876 ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))
878 #define ip_addr_cmp(addr1, addr2) ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))
880 #define ip_addr_isany(ipaddr) ((IP_IS_V6(ipaddr)) ? \
881 ip6_addr_isany(ip_2_ip6(ipaddr)) : \
882 ip4_addr_isany(ip_2_ip4(ipaddr)))
884 #define ip_addr_isany_val(ipaddr) ((IP_IS_V6_VAL(ipaddr)) ? \
885 ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \
886 ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))
888 #define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \
890 ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))
892 #define ip_addr_ismulticast(ipaddr) ((IP_IS_V6(ipaddr)) ? \
893 ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \
894 ip4_addr_ismulticast(ip_2_ip4(ipaddr)))
896 #define ip_addr_isloopback(ipaddr) ((IP_IS_V6(ipaddr)) ? \
897 ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \
898 ip4_addr_isloopback(ip_2_ip4(ipaddr)))
900 #define ip_addr_islinklocal(ipaddr) ((IP_IS_V6(ipaddr)) ? \
901 ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \
902 ip4_addr_islinklocal(ip_2_ip4(ipaddr)))
903 #define ip_addr_debug_print(debug, ipaddr) \
905 if (IP_IS_V6(ipaddr)) { \
906 ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); \
908 ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); \
911 #define ip_addr_debug_print_val(debug, ipaddr) \
913 if (IP_IS_V6_VAL(ipaddr)) { \
914 ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); \
916 ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); \
920 #define ipaddr_ntoa(addr) (((addr) == NULL) ? "NULL" : \
921 ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr))))
923 #define ipaddr_ntoa_r(addr, buf, buflen) (((addr) == NULL) ? "NULL" : \
924 ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen)))
925 int ipaddr_aton(
const char *cp,
ip_addr_t *addr);
928 #define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX
932 #define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1
933 #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1
938 #define IPADDR4_INIT(u32val) \
942 #define IP_IS_V4_VAL(ipaddr) 1
943 #define IP_IS_V6_VAL(ipaddr) 0
944 #define IP_IS_V4(ipaddr) 1
945 #define IP_IS_V6(ipaddr) 0
946 #define IP_IS_ANY_TYPE_VAL(ipaddr) 0
947 #define IP_SET_TYPE_VAL(ipaddr, iptype)
948 #define IP_SET_TYPE(ipaddr, iptype)
949 #define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V4
950 #define ip_2_ip4(ipaddr) (ipaddr)
951 #define IP_ADDR4(ipaddr, a, b, c, d) IP4_ADDR(ipaddr, a, b, c, d)
953 #define ip_addr_copy(dest, src) ip4_addr_copy(dest, src)
954 #define ip_addr_copy_from_ip4(dest, src) ip4_addr_copy(dest, src)
955 #define ip_addr_set_ip4_u32(ipaddr, val) ip4_addr_set_u32(ip_2_ip4(ipaddr), val)
956 #define ip_addr_get_ip4_u32(ipaddr) ip4_addr_get_u32(ip_2_ip4(ipaddr))
957 #define ip_addr_set(dest, src) ip4_addr_set(dest, src)
958 #define ip_addr_set_ipaddr(dest, src) ip4_addr_set(dest, src)
959 #define ip_addr_set_zero(ipaddr) ip4_addr_set_zero(ipaddr)
960 #define ip_addr_set_zero_ip4(ipaddr) ip4_addr_set_zero(ipaddr)
961 #define ip_addr_set_any(is_ipv6, ipaddr) ip4_addr_set_any(ipaddr)
962 #define ip_addr_set_loopback(is_ipv6, ipaddr) ip4_addr_set_loopback(ipaddr)
963 #define ip_addr_set_hton(dest, src) ip4_addr_set_hton(dest, src)
964 #define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask)
965 #define ip_addr_netcmp(addr1, addr2, mask) ip4_addr_netcmp(addr1, addr2, mask)
966 #define ip_addr_cmp(addr1, addr2) ip4_addr_cmp(addr1, addr2)
967 #define ip_addr_isany(ipaddr) ip4_addr_isany(ipaddr)
968 #define ip_addr_isany_val(ipaddr) ip4_addr_isany_val(ipaddr)
969 #define ip_addr_isloopback(ipaddr) ip4_addr_isloopback(ipaddr)
970 #define ip_addr_islinklocal(ipaddr) ip4_addr_islinklocal(ipaddr)
971 #define ip_addr_isbroadcast(addr, netif) ip4_addr_isbroadcast(addr, netif)
972 #define ip_addr_ismulticast(ipaddr) ip4_addr_ismulticast(ipaddr)
973 #define ip_addr_debug_print(debug, ipaddr) ip4_addr_debug_print(debug, ipaddr)
974 #define ip_addr_debug_print_val(debug, ipaddr) ip4_addr_debug_print_val(debug, ipaddr)
975 #define ipaddr_ntoa(ipaddr) ip4addr_ntoa(ipaddr)
976 #define ipaddr_ntoa_r(ipaddr, buf, buflen) ip4addr_ntoa_r(ipaddr, buf, buflen)
977 #define ipaddr_aton(cp, addr) ip4addr_aton(cp, addr)
979 #define IPADDR_STRLEN_MAX IP4ADDR_STRLEN_MAX
984 #define IPADDR6_INIT(a, b, c, d) \
990 #define IP_IS_V4_VAL(ipaddr) 0
991 #define IP_IS_V6_VAL(ipaddr) 1
992 #define IP_IS_V4(ipaddr) 0
993 #define IP_IS_V6(ipaddr) 1
994 #define IP_IS_ANY_TYPE_VAL(ipaddr) 0
995 #define IP_SET_TYPE_VAL(ipaddr, iptype)
996 #define IP_SET_TYPE(ipaddr, iptype)
997 #define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V6
998 #define ip_2_ip6(ipaddr) (ipaddr)
999 #define IP_ADDR6(ipaddr, i0, i1, i2, i3) IP6_ADDR(ipaddr, i0, i1, i2, i3)
1001 #define ip_addr_copy(dest, src) ip6_addr_copy(dest, src)
1002 #define ip_addr_copy_from_ip6(dest, src) ip6_addr_copy(dest, src)
1003 #define ip_addr_set(dest, src) ip6_addr_set(dest, src)
1004 #define ip_addr_set_ipaddr(dest, src) ip6_addr_set(dest, src)
1005 #define ip_addr_set_zero(ipaddr) ip6_addr_set_zero(ipaddr)
1006 #define ip_addr_set_zero_ip6(ipaddr) ip6_addr_set_zero(ipaddr)
1007 #define ip_addr_set_any(is_ipv6, ipaddr) ip6_addr_set_any(ipaddr)
1008 #define ip_addr_set_loopback(is_ipv6, ipaddr) ip6_addr_set_loopback(ipaddr)
1009 #define ip_addr_set_hton(dest, src) ip6_addr_set_hton(dest, src)
1010 #define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target)
1011 #define ip_addr_netcmp(addr1, addr2, mask) 0
1012 #define ip_addr_cmp(addr1, addr2) ip6_addr_cmp(addr1, addr2)
1013 #define ip_addr_isany(ipaddr) ip6_addr_isany(ipaddr)
1014 #define ip_addr_isany_val(ipaddr) ip6_addr_isany_val(ipaddr)
1015 #define ip_addr_isloopback(ipaddr) ip6_addr_isloopback(ipaddr)
1016 #define ip_addr_islinklocal(ipaddr) ip6_addr_islinklocal(ipaddr)
1017 #define ip_addr_isbroadcast(addr, netif) 0
1018 #define ip_addr_ismulticast(ipaddr) ip6_addr_ismulticast(ipaddr)
1019 #define ip_addr_debug_print(debug, ipaddr) ip6_addr_debug_print(debug, ipaddr)
1020 #define ip_addr_debug_print_val(debug, ipaddr) ip6_addr_debug_print_val(debug, ipaddr)
1021 #define ipaddr_ntoa(ipaddr) ip6addr_ntoa(ipaddr)
1022 #define ipaddr_ntoa_r(ipaddr, buf, buflen) ip6addr_ntoa_r(ipaddr, buf, buflen)
1023 #define ipaddr_aton(cp, addr) ip6addr_aton(cp, addr)
1025 #define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX
1033 extern const ip_addr_t ip_addr_broadcast;
1039 #define IP_ADDR_ANY IP4_ADDR_ANY
1045 #define IP4_ADDR_ANY (&ip_addr_any)
1051 #define IP4_ADDR_ANY4 (ip_2_ip4(&ip_addr_any))
1054 #define IP_ADDR_BROADCAST (&ip_addr_broadcast)
1056 #define IP4_ADDR_BROADCAST (ip_2_ip4(&ip_addr_broadcast))
1069 #define IP6_ADDR_ANY (&ip6_addr_any)
1075 #define IP6_ADDR_ANY6 (ip_2_ip6(&ip6_addr_any))
1079 #define IP_ADDR_ANY IP6_ADDR_ANY
1084 #if LWIP_IPV4 && LWIP_IPV6
1086 #define IP_ANY_TYPE (&ip_addr_any_type)
1088 #define IP_ANY_TYPE IP_ADDR_ANY
1100 #ifndef NETIF_MAX_HWADDR_LEN
1101 #define NETIF_MAX_HWADDR_LEN 6U
1116 #define NETIF_FLAG_UP 0x01U
1119 #define NETIF_FLAG_BROADCAST 0x02U
1125 #define NETIF_FLAG_LINK_UP 0x04U
1129 #define NETIF_FLAG_ETHARP 0x08U
1133 #define NETIF_FLAG_ETHERNET 0x10U
1136 #define NETIF_FLAG_IGMP 0x20U
1139 #define NETIF_FLAG_MLD6 0x40U
1145 enum lwip_internal_netif_client_data_index {
1147 LWIP_NETIF_CLIENT_DATA_INDEX_DHCP,
1150 LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP,
1153 LWIP_NETIF_CLIENT_DATA_INDEX_IGMP,
1156 LWIP_NETIF_CLIENT_DATA_INDEX_MLD6,
1158 LWIP_NETIF_CLIENT_DATA_INDEX_MAX
1161 #if LWIP_CHECKSUM_CTRL_PER_NETIF
1162 #define NETIF_CHECKSUM_GEN_IP 0x0001
1163 #define NETIF_CHECKSUM_GEN_UDP 0x0002
1164 #define NETIF_CHECKSUM_GEN_TCP 0x0004
1165 #define NETIF_CHECKSUM_GEN_ICMP 0x0008
1166 #define NETIF_CHECKSUM_GEN_ICMP6 0x0010
1167 #define NETIF_CHECKSUM_CHECK_IP 0x0100
1168 #define NETIF_CHECKSUM_CHECK_UDP 0x0200
1169 #define NETIF_CHECKSUM_CHECK_TCP 0x0400
1170 #define NETIF_CHECKSUM_CHECK_ICMP 0x0800
1171 #define NETIF_CHECKSUM_CHECK_ICMP6 0x1000
1172 #define NETIF_CHECKSUM_ENABLE_ALL 0xFFFF
1173 #define NETIF_CHECKSUM_DISABLE_ALL 0x0000
1223 typedef err_t (*netif_output_ip6_fn)(
struct netif *
netif,
struct pbuf *p,
1236 #if LWIP_IPV4 && LWIP_IGMP
1238 typedef err_t (*netif_igmp_mac_filter_fn)(
struct netif *
netif,
1241 #if LWIP_IPV6 && LWIP_IPV6_MLD
1243 typedef err_t (*netif_mld_mac_filter_fn)(
struct netif *
netif,
1247 #if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || (LWIP_NUM_NETIF_CLIENT_DATA > 0)
1248 u8 netif_alloc_client_data_id(
void);
1252 #define netif_set_client_data(netif, id, data) netif_get_client_data(netif, id) = (data)
1256 #define netif_get_client_data(netif, id) (netif)->client_data[(id)]
1278 u8 ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
1299 netif_output_ip6_fn output_ip6;
1301 #if LWIP_NETIF_STATUS_CALLBACK
1306 #if LWIP_NETIF_LINK_CALLBACK
1311 #if LWIP_NETIF_REMOVE_CALLBACK
1318 #ifdef netif_get_client_data
1319 void *client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + LWIP_NUM_NETIF_CLIENT_DATA];
1321 #if LWIP_IPV6_AUTOCONFIG
1323 u8 ip6_autoconfig_enabled;
1325 #if LWIP_IPV6_SEND_ROUTER_SOLICIT
1329 #if LWIP_NETIF_HOSTNAME
1331 const char *hostname;
1333 #if LWIP_CHECKSUM_CTRL_PER_NETIF
1356 struct stats_mib2_netif_ctrs mib2_counters;
1358 #if LWIP_IPV4 && LWIP_IGMP
1361 netif_igmp_mac_filter_fn igmp_mac_filter;
1363 #if LWIP_IPV6 && LWIP_IPV6_MLD
1366 netif_mld_mac_filter_fn mld_mac_filter;
1368 #if LWIP_NETIF_HWADDRHINT
1373 struct pbuf *loop_first;
1374 struct pbuf *loop_last;
1375 #if LWIP_LOOPBACK_MAX_PBUFS
1376 u16 loop_cnt_current;
1381 #if LWIP_CHECKSUM_CTRL_PER_NETIF
1382 #define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags) \
1384 (netif)->chksum_flags = chksumflags; \
1386 #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) if (((netif) == NULL) || (((netif)->chksum_flags & (chksumflag)) != 0))
1388 #define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags)
1389 #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag)
1399 #define netif_ip4_addr(netif) ((const ip4_addr_t *)ip_2_ip4(&((netif)->ip_addr)))
1401 #define netif_ip4_netmask(netif) ((const ip4_addr_t *)ip_2_ip4(&((netif)->netmask)))
1403 #define netif_ip4_gw(netif) ((const ip4_addr_t *)ip_2_ip4(&((netif)->gw)))
1405 #define netif_ip_addr4(netif) ((const ip_addr_t *)&((netif)->ip_addr))
1407 #define netif_ip_netmask4(netif) ((const ip_addr_t *)&((netif)->netmask))
1409 #define netif_ip_gw4(netif) ((const ip_addr_t *)&((netif)->gw))
1415 #define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8)1 : (u8)0)
1418 #define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8)1 : (u8)0)
1420 #if LWIP_NETIF_HOSTNAME
1422 #define netif_set_hostname(netif, name) \
1424 if ((netif) != NULL) { \
1425 (netif)->hostname = name; \
1429 #define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL)
1434 #define netif_set_igmp_mac_filter(netif, function) \
1436 if ((netif) != NULL) { \
1437 (netif)->igmp_mac_filter = function; \
1440 #define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL)
1443 #if LWIP_IPV6 && LWIP_IPV6_MLD
1445 #define netif_set_mld_mac_filter(netif, function) \
1447 if ((netif) != NULL) { \
1448 (netif)->mld_mac_filter = function; \
1451 #define netif_get_mld_mac_filter(netif) (((netif) != NULL) ? ((netif)->mld_mac_filter) : NULL)
1452 #define netif_mld_mac_filter(netif, addr, action) \
1454 if ((netif) && (netif)->mld_mac_filter) { \
1455 (netif)->mld_mac_filter((netif), (addr), (action)); \
1462 #define netif_ip_addr6(netif, i) ((const ip_addr_t *)(&((netif)->ip6_addr[i])))
1464 #define netif_ip6_addr(netif, i) ((const ip6_addr_t *)ip_2_ip6(&((netif)->ip6_addr[i])))
1466 void netif_ip6_addr_set_parts(
struct netif *
netif, s8_t addr_idx, u32 i0, u32 i1, u32 i2, u32 i3);
1467 #define netif_ip6_addr_state(netif, i) ((netif)->ip6_addr_state[i])
1468 #define netif_set_ip6_autoconfig_enabled(netif, action) \
1471 (netif)->ip6_autoconfig_enabled = (action); \
1476 #if LWIP_NETIF_HWADDRHINT
1477 #define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint))
1479 #define NETIF_SET_HWADDRHINT(netif, hint)
1486 DHCP_STATE_REQUESTING = 1,
1487 DHCP_STATE_INIT = 2,
1488 DHCP_STATE_REBOOTING = 3,
1489 DHCP_STATE_REBINDING = 4,
1490 DHCP_STATE_RENEWING = 5,
1491 DHCP_STATE_SELECTING = 6,
1492 DHCP_STATE_INFORMING = 7,
1493 DHCP_STATE_CHECKING = 8,
1494 DHCP_STATE_PERMANENT = 9,
1495 DHCP_STATE_BOUND = 10,
1496 DHCP_STATE_RELEASING = 11,
1497 DHCP_STATE_BACKING_OFF = 12
1498 } dhcp_state_enum_t;
1514 #define s6_addr un.u8_addr
1518 #define INADDR_NONE IPADDR_NONE
1520 #define INADDR_LOOPBACK IPADDR_LOOPBACK
1522 #define INADDR_ANY IPADDR_ANY
1524 #define INADDR_BROADCAST IPADDR_BROADCAST
1528 #if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
1529 typedef u8 sa_family_t;
1533 #if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED)
1534 typedef u16 in_port_t;
1542 sa_family_t sin_family;
1545 #define SIN_ZERO_LEN 8
1546 char sin_zero[SIN_ZERO_LEN];
1554 sa_family_t sin6_family;
1555 in_port_t sin6_port;
1565 sa_family_t sa_family;
1572 sa_family_t ss_family;
1581 #define SOCKLEN_T_DEFINED 1
1582 typedef int socklen_t;
1585 #define SOCK_STREAM 1
1586 #define SOCK_DGRAM 2
1592 #define SO_REUSEADDR 0x0004
1593 #define SO_KEEPALIVE 0x0008
1594 #define SO_BROADCAST 0x0020
1600 #define SO_DEBUG 0x0001
1601 #define SO_ACCEPTCONN 0x0002
1602 #define SO_DONTROUTE 0x0010
1603 #define SO_USELOOPBACK 0x0040
1604 #define SO_LINGER 0x0080
1605 #define SO_DONTLINGER ((int)(~SO_LINGER))
1606 #define SO_OOBINLINE 0x0100
1607 #define SO_REUSEPORT 0x0200
1608 #define SO_SNDBUF 0x1001
1609 #define SO_RCVBUF 0x1002
1610 #define SO_SNDLOWAT 0x1003
1611 #define SO_RCVLOWAT 0x1004
1612 #define SO_SNDTIMEO 0x1005
1613 #define SO_RCVTIMEO 0x1006
1614 #define SO_ERROR 0x1007
1615 #define SO_TYPE 0x1008
1616 #define SO_CONTIMEO 0x1009
1617 #define SO_NO_CHECK 0x100a
1622 #define SOL_SOCKET 0xfff
1629 #define AF_INET6 AF_UNSPEC
1631 #define PF_INET AF_INET
1632 #define PF_INET6 AF_INET6
1633 #define PF_UNSPEC AF_UNSPEC
1635 #define IPPROTO_IP 0
1636 #define IPPROTO_ICMP 1
1637 #define IPPROTO_TCP 6
1638 #define IPPROTO_UDP 17
1640 #define IPPROTO_IPV6 41
1641 #define IPPROTO_ICMPV6 58
1643 #define IPPROTO_UDPLITE 136
1644 #define IPPROTO_RAW 255
1647 #define MSG_PEEK 0x01
1648 #define MSG_WAITALL 0x02
1649 #define MSG_OOB 0x04
1650 #define MSG_DONTWAIT 0x08
1651 #define MSG_MORE 0x10
1663 #define TCP_NODELAY 0x01
1664 #define TCP_KEEPALIVE 0x02
1665 #define TCP_KEEPIDLE 0x03
1666 #define TCP_KEEPINTVL 0x04
1667 #define TCP_KEEPCNT 0x05
1674 #define IPV6_CHECKSUM 7
1675 #define IPV6_V6ONLY 27
1678 #if LWIP_UDP && LWIP_UDPLITE
1682 #define UDPLITE_SEND_CSCOV 0x01
1683 #define UDPLITE_RECV_CSCOV 0x02
1687 #if LWIP_MULTICAST_TX_OPTIONS
1691 #define IP_MULTICAST_TTL 5
1692 #define IP_MULTICAST_IF 6
1693 #define IP_MULTICAST_LOOP 7
1700 #define IP_ADD_MEMBERSHIP 3
1701 #define IP_DROP_MEMBERSHIP 4
1703 typedef struct ip_mreq
1726 #define IPTOS_TOS_MASK 0x1E
1727 #define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK)
1728 #define IPTOS_LOWDELAY 0x10
1729 #define IPTOS_THROUGHPUT 0x08
1730 #define IPTOS_RELIABILITY 0x04
1731 #define IPTOS_LOWCOST 0x02
1732 #define IPTOS_MINCOST IPTOS_LOWCOST
1743 #define IPTOS_PREC_MASK 0xe0
1744 #define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK)
1745 #define IPTOS_PREC_NETCONTROL 0xe0
1746 #define IPTOS_PREC_INTERNETCONTROL 0xc0
1747 #define IPTOS_PREC_CRITIC_ECP 0xa0
1748 #define IPTOS_PREC_FLASHOVERRIDE 0x80
1749 #define IPTOS_PREC_FLASH 0x60
1750 #define IPTOS_PREC_IMMEDIATE 0x40
1751 #define IPTOS_PREC_PRIORITY 0x20
1752 #define IPTOS_PREC_ROUTINE 0x00
1765 #if !defined(FIONREAD) || !defined(FIONBIO)
1766 #define IOCPARM_MASK 0x7fU
1767 #define IOC_VOID 0x20000000UL
1768 #define IOC_OUT 0x40000000UL
1769 #define IOC_IN 0x80000000UL
1770 #define IOC_INOUT (IOC_IN | IOC_OUT)
1773 #define _IO(x, y) (IOC_VOID | ((x) << 8) | (y))
1775 #define _IOR(x, y, t) (IOC_OUT | (((long)sizeof(t) & IOCPARM_MASK) << 16) | ((x) << 8) | (y))
1777 #define _IOW(x, y, t) (IOC_IN | (((long)sizeof(t) & IOCPARM_MASK) << 16) | ((x) << 8) | (y))
1781 #define FIONREAD _IOR('f', 127, unsigned long)
1784 #define FIONBIO _IOW('f', 126, unsigned long)
1789 #define SIOCSHIWAT _IOW('s', 0, unsigned long)
1790 #define SIOCGHIWAT _IOR('s', 1, unsigned long)
1791 #define SIOCSLOWAT _IOW('s', 2, unsigned long)
1792 #define SIOCGLOWAT _IOR('s', 3, unsigned long)
1793 #define SIOCATMARK _IOR('s', 7, unsigned long)
1807 #define O_NONBLOCK 1
1823 #define FD_SETSIZE MEMP_NUM_NETCONN
1824 #define FDSETSAFESET(n, code) \
1826 if (((n)-LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n)-LWIP_SOCKET_OFFSET) >= 0)) { \
1830 #define FDSETSAFEGET(n, code) (((n)-LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n)-LWIP_SOCKET_OFFSET) >= 0) ? \
1833 #define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET) / 8] |= (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1834 #define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET) / 8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1835 #define FD_ISSET(n, p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET) / 8] & (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
1836 #define FD_ZERO(p) memset((void *)(p), 0, sizeof(*(p)))
1840 unsigned char fd_bits[(FD_SETSIZE + 7) / 8];
1843 #elif LWIP_SOCKET_OFFSET
1844 #error LWIP_SOCKET_OFFSET does not work with external FD_SET!
1845 #elif FD_SETSIZE < MEMP_NUM_NETCONN
1846 #error "external FD_SETSIZE too small for number of sockets"
1851 #define DNS_TMR_INTERVAL 1000
1854 #define LWIP_DNS_ADDRTYPE_IPV4 0
1855 #define LWIP_DNS_ADDRTYPE_IPV6 1
1856 #define LWIP_DNS_ADDRTYPE_IPV4_IPV6 2
1857 #define LWIP_DNS_ADDRTYPE_IPV6_IPV4 3
1858 #if LWIP_IPV4 && LWIP_IPV6
1859 #ifndef LWIP_DNS_ADDRTYPE_DEFAULT
1860 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV4_IPV6
1862 #elif defined(LWIP_IPV4)
1863 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV4
1865 #define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV6
1868 #if DNS_LOCAL_HOSTLIST
1870 struct local_hostlist_entry
1876 struct local_hostlist_entry *next;
1878 #if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
1879 #ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN
1880 #define DNS_LOCAL_HOSTLIST_MAX_NAMELEN DNS_MAX_NAME_LENGTH
1882 #define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1))
1898 #ifndef LWIP_DNS_API_DECLARE_H_ERRNO
1899 #define LWIP_DNS_API_DECLARE_H_ERRNO 1
1902 #ifndef LWIP_DNS_API_DEFINE_ERRORS
1903 #define LWIP_DNS_API_DEFINE_ERRORS 1
1906 #ifndef LWIP_DNS_API_DEFINE_FLAGS
1907 #define LWIP_DNS_API_DEFINE_FLAGS 1
1910 #ifndef LWIP_DNS_API_DECLARE_STRUCTS
1911 #define LWIP_DNS_API_DECLARE_STRUCTS 1
1914 #if LWIP_DNS_API_DEFINE_ERRORS
1916 #define EAI_NONAME 200
1917 #define EAI_SERVICE 201
1918 #define EAI_FAIL 202
1919 #define EAI_MEMORY 203
1920 #define EAI_FAMILY 204
1922 #define HOST_NOT_FOUND 210
1924 #define NO_RECOVERY 212
1925 #define TRY_AGAIN 213
1928 #if LWIP_DNS_API_DEFINE_FLAGS
1930 #define AI_PASSIVE 0x01
1931 #define AI_CANONNAME 0x02
1932 #define AI_NUMERICHOST 0x04
1933 #define AI_NUMERICSERV 0x08
1934 #define AI_V4MAPPED 0x10
1936 #define AI_ADDRCONFIG 0x40
1939 #if LWIP_DNS_API_DECLARE_STRUCTS
1949 #define h_addr h_addr_list[0]
1958 socklen_t ai_addrlen;
1965 #define NETDB_ELEM_SIZE (sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + DNS_MAX_NAME_LENGTH + 1)
1968 #define htons(x) lwip_htons(x)
1969 #define ntohs(x) lwip_ntohs(x)
1970 #define htonl(x) lwip_htonl(x)
1971 #define ntohl(x) lwip_ntohl(x)
1973 #define lwip_htons(x) PP_HTONS(x)
1974 #define lwip_ntohs(x) PP_NTOHS(x)
1975 #define lwip_htonl(x) PP_HTONL(x)
1976 #define lwip_ntohl(x) PP_NTOHL(x)
1981 #define PP_HTONS(x) ((((x)&0xff) << 8) | (((x)&0xff00) >> 8))
1982 #define PP_NTOHS(x) PP_HTONS(x)
1983 #define PP_HTONL(x) ((((x)&0xff) << 24) | \
1984 (((x)&0xff00) << 8) | \
1985 (((x)&0xff0000UL) >> 8) | \
1986 (((x)&0xff000000UL) >> 24))
1987 #define PP_NTOHL(x) PP_HTONL(x)