mirror of
https://github.com/esp8266/Arduino.git
synced 2025-07-27 18:02:17 +03:00
update to lwIP-2.1.0: partial SACK support by default (de-selectable in menu) (#5126)
* update to lwIP-2.1.0rc1: partial SACK support fix #4176 * hash fix * get some flash back due to mistake in conf (fragmentation & reassembly was incorrectly enabled) (ahah I scared you) * add missing include files * update to lwip-2.1.0(release) + remove unused lwIP's include files * lwIP release 2.1.0, SACK is now default, bigger, no-SACK is selectable * fix ldscript * pio * rename 'sack' option to 'feat'ure option, + IP fragmentation/reassembly * merge, fix pio * change internal/hidden string * pio: more lwip2 configuration: + without sack for no change in flash footprint
This commit is contained in:
@ -47,6 +47,7 @@
|
||||
|
||||
#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
|
||||
|
||||
#include "lwip/ip6_zone.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -57,6 +58,9 @@ extern "C" {
|
||||
used as local variable, on the stack, etc. */
|
||||
struct ip6_addr {
|
||||
u32_t addr[4];
|
||||
#if LWIP_IPV6_SCOPES
|
||||
u8_t zone;
|
||||
#endif /* LWIP_IPV6_SCOPES */
|
||||
};
|
||||
|
||||
/** IPv6 address */
|
||||
@ -72,7 +76,8 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
(ip6addr)->addr[0] = idx0; \
|
||||
(ip6addr)->addr[1] = idx1; \
|
||||
(ip6addr)->addr[2] = idx2; \
|
||||
(ip6addr)->addr[3] = idx3; } while(0)
|
||||
(ip6addr)->addr[3] = idx3; \
|
||||
ip6_addr_clear_zone(ip6addr); } while(0)
|
||||
|
||||
/** Access address in 16-bit block */
|
||||
#define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff))
|
||||
@ -95,18 +100,34 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
#define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \
|
||||
(dest).addr[1] = (src).addr[1]; \
|
||||
(dest).addr[2] = (src).addr[2]; \
|
||||
(dest).addr[3] = (src).addr[3];}while(0)
|
||||
(dest).addr[3] = (src).addr[3]; \
|
||||
ip6_addr_copy_zone((dest), (src)); }while(0)
|
||||
/** Safely copy one IPv6 address to another (src may be NULL) */
|
||||
#define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \
|
||||
(dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \
|
||||
(dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \
|
||||
(dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0)
|
||||
(dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3]; \
|
||||
ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src)); }while(0)
|
||||
|
||||
/** Copy packed IPv6 address to unpacked IPv6 address; zone is not set */
|
||||
#define ip6_addr_copy_from_packed(dest, src) do{(dest).addr[0] = (src).addr[0]; \
|
||||
(dest).addr[1] = (src).addr[1]; \
|
||||
(dest).addr[2] = (src).addr[2]; \
|
||||
(dest).addr[3] = (src).addr[3]; \
|
||||
ip6_addr_clear_zone(&dest); }while(0)
|
||||
|
||||
/** Copy unpacked IPv6 address to packed IPv6 address; zone is lost */
|
||||
#define ip6_addr_copy_to_packed(dest, src) do{(dest).addr[0] = (src).addr[0]; \
|
||||
(dest).addr[1] = (src).addr[1]; \
|
||||
(dest).addr[2] = (src).addr[2]; \
|
||||
(dest).addr[3] = (src).addr[3]; }while(0)
|
||||
|
||||
/** Set complete address to zero */
|
||||
#define ip6_addr_set_zero(ip6addr) do{(ip6addr)->addr[0] = 0; \
|
||||
(ip6addr)->addr[1] = 0; \
|
||||
(ip6addr)->addr[2] = 0; \
|
||||
(ip6addr)->addr[3] = 0;}while(0)
|
||||
(ip6addr)->addr[3] = 0; \
|
||||
ip6_addr_clear_zone(ip6addr);}while(0)
|
||||
|
||||
/** Set address to ipv6 'any' (no need for lwip_htonl()) */
|
||||
#define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr)
|
||||
@ -114,29 +135,57 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
#define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \
|
||||
(ip6addr)->addr[1] = 0; \
|
||||
(ip6addr)->addr[2] = 0; \
|
||||
(ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)
|
||||
(ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \
|
||||
ip6_addr_clear_zone(ip6addr);}while(0)
|
||||
/** Safely copy one IPv6 address to another and change byte order
|
||||
* from host- to network-order. */
|
||||
#define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \
|
||||
(dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \
|
||||
(dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \
|
||||
(dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]);}while(0)
|
||||
(dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]); \
|
||||
ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src));}while(0)
|
||||
|
||||
|
||||
/** Compare IPv6 networks, ignoring zone information. To be used sparingly! */
|
||||
#define ip6_addr_netcmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
|
||||
((addr1)->addr[1] == (addr2)->addr[1]))
|
||||
|
||||
/**
|
||||
* Determine if two IPv6 address are on the same network.
|
||||
*
|
||||
* @arg addr1 IPv6 address 1
|
||||
* @arg addr2 IPv6 address 2
|
||||
* @return !0 if the network identifiers of both address match
|
||||
* @param addr1 IPv6 address 1
|
||||
* @param addr2 IPv6 address 2
|
||||
* @return 1 if the network identifiers of both address match, 0 if not
|
||||
*/
|
||||
#define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
|
||||
((addr1)->addr[1] == (addr2)->addr[1]))
|
||||
#define ip6_addr_netcmp(addr1, addr2) (ip6_addr_netcmp_zoneless((addr1), (addr2)) && \
|
||||
ip6_addr_cmp_zone((addr1), (addr2)))
|
||||
|
||||
#define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
|
||||
/* Exact-host comparison *after* ip6_addr_netcmp() succeeded, for efficiency. */
|
||||
#define ip6_addr_nethostcmp(addr1, addr2) (((addr1)->addr[2] == (addr2)->addr[2]) && \
|
||||
((addr1)->addr[3] == (addr2)->addr[3]))
|
||||
|
||||
/** Compare IPv6 addresses, ignoring zone information. To be used sparingly! */
|
||||
#define ip6_addr_cmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \
|
||||
((addr1)->addr[1] == (addr2)->addr[1]) && \
|
||||
((addr1)->addr[2] == (addr2)->addr[2]) && \
|
||||
((addr1)->addr[3] == (addr2)->addr[3]))
|
||||
/**
|
||||
* Determine if two IPv6 addresses are the same. In particular, the address
|
||||
* part of both must be the same, and the zone must be compatible.
|
||||
*
|
||||
* @param addr1 IPv6 address 1
|
||||
* @param addr2 IPv6 address 2
|
||||
* @return 1 if the addresses are considered equal, 0 if not
|
||||
*/
|
||||
#define ip6_addr_cmp(addr1, addr2) (ip6_addr_cmp_zoneless((addr1), (addr2)) && \
|
||||
ip6_addr_cmp_zone((addr1), (addr2)))
|
||||
|
||||
/** Compare IPv6 address to packed address and zone */
|
||||
#define ip6_addr_cmp_packed(ip6addr, paddr, zone_idx) (((ip6addr)->addr[0] == (paddr)->addr[0]) && \
|
||||
((ip6addr)->addr[1] == (paddr)->addr[1]) && \
|
||||
((ip6addr)->addr[2] == (paddr)->addr[2]) && \
|
||||
((ip6addr)->addr[3] == (paddr)->addr[3]) && \
|
||||
ip6_addr_equals_zone((ip6addr), (zone_idx)))
|
||||
|
||||
#define ip6_get_subnet_id(ip6addr) (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL)
|
||||
|
||||
@ -183,7 +232,13 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
#define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL))
|
||||
#define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL))
|
||||
|
||||
/* @todo define get/set for well-know multicast addresses, e.g. ff02::1 */
|
||||
/* Scoping note: while interface-local and link-local multicast addresses do
|
||||
* have a scope (i.e., they are meaningful only in the context of a particular
|
||||
* interface), the following functions are not assigning or comparing zone
|
||||
* indices. The reason for this is backward compatibility. Any call site that
|
||||
* produces a non-global multicast address must assign a multicast address as
|
||||
* appropriate itself. */
|
||||
|
||||
#define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \
|
||||
((ip6addr)->addr[1] == 0UL) && \
|
||||
((ip6addr)->addr[2] == 0UL) && \
|
||||
@ -196,7 +251,8 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
#define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
|
||||
(ip6addr)->addr[1] = 0; \
|
||||
(ip6addr)->addr[2] = 0; \
|
||||
(ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)
|
||||
(ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \
|
||||
ip6_addr_clear_zone(ip6addr); }while(0)
|
||||
|
||||
#define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
|
||||
((ip6addr)->addr[1] == 0UL) && \
|
||||
@ -205,7 +261,8 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
#define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
|
||||
(ip6addr)->addr[1] = 0; \
|
||||
(ip6addr)->addr[2] = 0; \
|
||||
(ip6addr)->addr[3] = PP_HTONL(0x00000002UL);}while(0)
|
||||
(ip6addr)->addr[3] = PP_HTONL(0x00000002UL); \
|
||||
ip6_addr_clear_zone(ip6addr); }while(0)
|
||||
|
||||
#define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
|
||||
((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \
|
||||
@ -214,7 +271,8 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
#define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \
|
||||
(ip6addr)->addr[1] = 0; \
|
||||
(ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \
|
||||
(ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id));}while(0)
|
||||
(ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id)); \
|
||||
ip6_addr_clear_zone(ip6addr); }while(0)
|
||||
|
||||
#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \
|
||||
((ip6addr)->addr[1] == 0) && \
|
||||
@ -234,6 +292,7 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
#define IP6_ADDR_VALID 0x10 /* This bit marks an address as valid (preferred or deprecated) */
|
||||
#define IP6_ADDR_PREFERRED 0x30
|
||||
#define IP6_ADDR_DEPRECATED 0x10 /* Same as VALID (valid but not preferred) */
|
||||
#define IP6_ADDR_DUPLICATED 0x40 /* Failed DAD test, not valid */
|
||||
|
||||
#define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07 /* 1-7 probes sent */
|
||||
|
||||
@ -242,6 +301,14 @@ typedef struct ip6_addr ip6_addr_t;
|
||||
#define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */
|
||||
#define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED)
|
||||
#define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED)
|
||||
#define ip6_addr_isduplicated(addr_state) (addr_state == IP6_ADDR_DUPLICATED)
|
||||
|
||||
#if LWIP_IPV6_ADDRESS_LIFETIMES
|
||||
#define IP6_ADDR_LIFE_STATIC (0)
|
||||
#define IP6_ADDR_LIFE_INFINITE (0xffffffffUL)
|
||||
#define ip6_addr_life_isstatic(addr_life) ((addr_life) == IP6_ADDR_LIFE_STATIC)
|
||||
#define ip6_addr_life_isinfinite(addr_life) ((addr_life) == IP6_ADDR_LIFE_INFINITE)
|
||||
#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */
|
||||
|
||||
#define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \
|
||||
LWIP_DEBUGF(debug, ("%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F, \
|
||||
|
Reference in New Issue
Block a user