diff --git a/boards.txt b/boards.txt index a6e43c8247..90ec0bd91a 100644 --- a/boards.txt +++ b/boards.txt @@ -321,19 +321,27 @@ generic.menu.led.15.build.led=-DLED_BUILTIN=15 generic.menu.ip.lm2f=v2 Lower Memory generic.menu.ip.lm2f.build.lwip_include=lwip2/include generic.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -generic.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +generic.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 generic.menu.ip.hb2f=v2 Higher Bandwidth generic.menu.ip.hb2f.build.lwip_include=lwip2/include generic.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -generic.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +generic.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 generic.menu.ip.lm2n=v2 Lower Memory (no features) generic.menu.ip.lm2n.build.lwip_include=lwip2/include generic.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -generic.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +generic.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 generic.menu.ip.hb2n=v2 Higher Bandwidth (no features) generic.menu.ip.hb2n.build.lwip_include=lwip2/include generic.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -generic.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +generic.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +generic.menu.ip.lm6f=v2 IPv6 Lower Memory +generic.menu.ip.lm6f.build.lwip_include=lwip2/include +generic.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +generic.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +generic.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +generic.menu.ip.hb6f.build.lwip_include=lwip2/include +generic.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +generic.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 generic.menu.ip.hb1=v1.4 Higher Bandwidth generic.menu.ip.hb1.build.lwip_lib=-llwip_gcc generic.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -572,19 +580,27 @@ esp8285.menu.led.15.build.led=-DLED_BUILTIN=15 esp8285.menu.ip.lm2f=v2 Lower Memory esp8285.menu.ip.lm2f.build.lwip_include=lwip2/include esp8285.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -esp8285.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +esp8285.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 esp8285.menu.ip.hb2f=v2 Higher Bandwidth esp8285.menu.ip.hb2f.build.lwip_include=lwip2/include esp8285.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -esp8285.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +esp8285.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 esp8285.menu.ip.lm2n=v2 Lower Memory (no features) esp8285.menu.ip.lm2n.build.lwip_include=lwip2/include esp8285.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -esp8285.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +esp8285.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 esp8285.menu.ip.hb2n=v2 Higher Bandwidth (no features) esp8285.menu.ip.hb2n.build.lwip_include=lwip2/include esp8285.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -esp8285.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +esp8285.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +esp8285.menu.ip.lm6f=v2 IPv6 Lower Memory +esp8285.menu.ip.lm6f.build.lwip_include=lwip2/include +esp8285.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +esp8285.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +esp8285.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +esp8285.menu.ip.hb6f.build.lwip_include=lwip2/include +esp8285.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +esp8285.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 esp8285.menu.ip.hb1=v1.4 Higher Bandwidth esp8285.menu.ip.hb1.build.lwip_lib=-llwip_gcc esp8285.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -749,19 +765,27 @@ espduino.menu.eesz.4M3M.build.spiffs_blocksize=8192 espduino.menu.ip.lm2f=v2 Lower Memory espduino.menu.ip.lm2f.build.lwip_include=lwip2/include espduino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -espduino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +espduino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espduino.menu.ip.hb2f=v2 Higher Bandwidth espduino.menu.ip.hb2f.build.lwip_include=lwip2/include espduino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -espduino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +espduino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espduino.menu.ip.lm2n=v2 Lower Memory (no features) espduino.menu.ip.lm2n.build.lwip_include=lwip2/include espduino.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -espduino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +espduino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 espduino.menu.ip.hb2n=v2 Higher Bandwidth (no features) espduino.menu.ip.hb2n.build.lwip_include=lwip2/include espduino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -espduino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +espduino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +espduino.menu.ip.lm6f=v2 IPv6 Lower Memory +espduino.menu.ip.lm6f.build.lwip_include=lwip2/include +espduino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +espduino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +espduino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +espduino.menu.ip.hb6f.build.lwip_include=lwip2/include +espduino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +espduino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 espduino.menu.ip.hb1=v1.4 Higher Bandwidth espduino.menu.ip.hb1.build.lwip_lib=-llwip_gcc espduino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -918,19 +942,27 @@ huzzah.menu.eesz.4M3M.build.spiffs_blocksize=8192 huzzah.menu.ip.lm2f=v2 Lower Memory huzzah.menu.ip.lm2f.build.lwip_include=lwip2/include huzzah.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -huzzah.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +huzzah.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 huzzah.menu.ip.hb2f=v2 Higher Bandwidth huzzah.menu.ip.hb2f.build.lwip_include=lwip2/include huzzah.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -huzzah.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +huzzah.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 huzzah.menu.ip.lm2n=v2 Lower Memory (no features) huzzah.menu.ip.lm2n.build.lwip_include=lwip2/include huzzah.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -huzzah.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +huzzah.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 huzzah.menu.ip.hb2n=v2 Higher Bandwidth (no features) huzzah.menu.ip.hb2n.build.lwip_include=lwip2/include huzzah.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -huzzah.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +huzzah.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +huzzah.menu.ip.lm6f=v2 IPv6 Lower Memory +huzzah.menu.ip.lm6f.build.lwip_include=lwip2/include +huzzah.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +huzzah.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +huzzah.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +huzzah.menu.ip.hb6f.build.lwip_include=lwip2/include +huzzah.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +huzzah.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 huzzah.menu.ip.hb1=v1.4 Higher Bandwidth huzzah.menu.ip.hb1.build.lwip_lib=-llwip_gcc huzzah.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -1087,19 +1119,27 @@ inventone.menu.eesz.4M3M.build.spiffs_blocksize=8192 inventone.menu.ip.lm2f=v2 Lower Memory inventone.menu.ip.lm2f.build.lwip_include=lwip2/include inventone.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -inventone.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +inventone.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 inventone.menu.ip.hb2f=v2 Higher Bandwidth inventone.menu.ip.hb2f.build.lwip_include=lwip2/include inventone.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -inventone.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +inventone.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 inventone.menu.ip.lm2n=v2 Lower Memory (no features) inventone.menu.ip.lm2n.build.lwip_include=lwip2/include inventone.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -inventone.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +inventone.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 inventone.menu.ip.hb2n=v2 Higher Bandwidth (no features) inventone.menu.ip.hb2n.build.lwip_include=lwip2/include inventone.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -inventone.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +inventone.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +inventone.menu.ip.lm6f=v2 IPv6 Lower Memory +inventone.menu.ip.lm6f.build.lwip_include=lwip2/include +inventone.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +inventone.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +inventone.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +inventone.menu.ip.hb6f.build.lwip_include=lwip2/include +inventone.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +inventone.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 inventone.menu.ip.hb1=v1.4 Higher Bandwidth inventone.menu.ip.hb1.build.lwip_lib=-llwip_gcc inventone.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -1259,19 +1299,27 @@ cw01.menu.eesz.4M3M.build.spiffs_blocksize=8192 cw01.menu.ip.lm2f=v2 Lower Memory cw01.menu.ip.lm2f.build.lwip_include=lwip2/include cw01.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -cw01.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +cw01.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 cw01.menu.ip.hb2f=v2 Higher Bandwidth cw01.menu.ip.hb2f.build.lwip_include=lwip2/include cw01.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -cw01.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +cw01.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 cw01.menu.ip.lm2n=v2 Lower Memory (no features) cw01.menu.ip.lm2n.build.lwip_include=lwip2/include cw01.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -cw01.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +cw01.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 cw01.menu.ip.hb2n=v2 Higher Bandwidth (no features) cw01.menu.ip.hb2n.build.lwip_include=lwip2/include cw01.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -cw01.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +cw01.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +cw01.menu.ip.lm6f=v2 IPv6 Lower Memory +cw01.menu.ip.lm6f.build.lwip_include=lwip2/include +cw01.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +cw01.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +cw01.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +cw01.menu.ip.hb6f.build.lwip_include=lwip2/include +cw01.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +cw01.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 cw01.menu.ip.hb1=v1.4 Higher Bandwidth cw01.menu.ip.hb1.build.lwip_lib=-llwip_gcc cw01.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -1431,19 +1479,27 @@ espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu espresso_lite_v1.menu.ip.lm2f=v2 Lower Memory espresso_lite_v1.menu.ip.lm2f.build.lwip_include=lwip2/include espresso_lite_v1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -espresso_lite_v1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +espresso_lite_v1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espresso_lite_v1.menu.ip.hb2f=v2 Higher Bandwidth espresso_lite_v1.menu.ip.hb2f.build.lwip_include=lwip2/include espresso_lite_v1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -espresso_lite_v1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +espresso_lite_v1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espresso_lite_v1.menu.ip.lm2n=v2 Lower Memory (no features) espresso_lite_v1.menu.ip.lm2n.build.lwip_include=lwip2/include espresso_lite_v1.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -espresso_lite_v1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +espresso_lite_v1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 espresso_lite_v1.menu.ip.hb2n=v2 Higher Bandwidth (no features) espresso_lite_v1.menu.ip.hb2n.build.lwip_include=lwip2/include espresso_lite_v1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -espresso_lite_v1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +espresso_lite_v1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +espresso_lite_v1.menu.ip.lm6f=v2 IPv6 Lower Memory +espresso_lite_v1.menu.ip.lm6f.build.lwip_include=lwip2/include +espresso_lite_v1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +espresso_lite_v1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +espresso_lite_v1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +espresso_lite_v1.menu.ip.hb6f.build.lwip_include=lwip2/include +espresso_lite_v1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +espresso_lite_v1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 espresso_lite_v1.menu.ip.hb1=v1.4 Higher Bandwidth espresso_lite_v1.menu.ip.hb1.build.lwip_lib=-llwip_gcc espresso_lite_v1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -1603,19 +1659,27 @@ espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu espresso_lite_v2.menu.ip.lm2f=v2 Lower Memory espresso_lite_v2.menu.ip.lm2f.build.lwip_include=lwip2/include espresso_lite_v2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -espresso_lite_v2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +espresso_lite_v2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espresso_lite_v2.menu.ip.hb2f=v2 Higher Bandwidth espresso_lite_v2.menu.ip.hb2f.build.lwip_include=lwip2/include espresso_lite_v2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -espresso_lite_v2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +espresso_lite_v2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espresso_lite_v2.menu.ip.lm2n=v2 Lower Memory (no features) espresso_lite_v2.menu.ip.lm2n.build.lwip_include=lwip2/include espresso_lite_v2.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -espresso_lite_v2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +espresso_lite_v2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 espresso_lite_v2.menu.ip.hb2n=v2 Higher Bandwidth (no features) espresso_lite_v2.menu.ip.hb2n.build.lwip_include=lwip2/include espresso_lite_v2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -espresso_lite_v2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +espresso_lite_v2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +espresso_lite_v2.menu.ip.lm6f=v2 IPv6 Lower Memory +espresso_lite_v2.menu.ip.lm6f.build.lwip_include=lwip2/include +espresso_lite_v2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +espresso_lite_v2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +espresso_lite_v2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +espresso_lite_v2.menu.ip.hb6f.build.lwip_include=lwip2/include +espresso_lite_v2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +espresso_lite_v2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 espresso_lite_v2.menu.ip.hb1=v1.4 Higher Bandwidth espresso_lite_v2.menu.ip.hb1.build.lwip_lib=-llwip_gcc espresso_lite_v2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -1775,19 +1839,27 @@ phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu phoenix_v1.menu.ip.lm2f=v2 Lower Memory phoenix_v1.menu.ip.lm2f.build.lwip_include=lwip2/include phoenix_v1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -phoenix_v1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +phoenix_v1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 phoenix_v1.menu.ip.hb2f=v2 Higher Bandwidth phoenix_v1.menu.ip.hb2f.build.lwip_include=lwip2/include phoenix_v1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -phoenix_v1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +phoenix_v1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 phoenix_v1.menu.ip.lm2n=v2 Lower Memory (no features) phoenix_v1.menu.ip.lm2n.build.lwip_include=lwip2/include phoenix_v1.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -phoenix_v1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +phoenix_v1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 phoenix_v1.menu.ip.hb2n=v2 Higher Bandwidth (no features) phoenix_v1.menu.ip.hb2n.build.lwip_include=lwip2/include phoenix_v1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -phoenix_v1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +phoenix_v1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +phoenix_v1.menu.ip.lm6f=v2 IPv6 Lower Memory +phoenix_v1.menu.ip.lm6f.build.lwip_include=lwip2/include +phoenix_v1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +phoenix_v1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +phoenix_v1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +phoenix_v1.menu.ip.hb6f.build.lwip_include=lwip2/include +phoenix_v1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +phoenix_v1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 phoenix_v1.menu.ip.hb1=v1.4 Higher Bandwidth phoenix_v1.menu.ip.hb1.build.lwip_lib=-llwip_gcc phoenix_v1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -1947,19 +2019,27 @@ phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu phoenix_v2.menu.ip.lm2f=v2 Lower Memory phoenix_v2.menu.ip.lm2f.build.lwip_include=lwip2/include phoenix_v2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -phoenix_v2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +phoenix_v2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 phoenix_v2.menu.ip.hb2f=v2 Higher Bandwidth phoenix_v2.menu.ip.hb2f.build.lwip_include=lwip2/include phoenix_v2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -phoenix_v2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +phoenix_v2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 phoenix_v2.menu.ip.lm2n=v2 Lower Memory (no features) phoenix_v2.menu.ip.lm2n.build.lwip_include=lwip2/include phoenix_v2.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -phoenix_v2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +phoenix_v2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 phoenix_v2.menu.ip.hb2n=v2 Higher Bandwidth (no features) phoenix_v2.menu.ip.hb2n.build.lwip_include=lwip2/include phoenix_v2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -phoenix_v2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +phoenix_v2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +phoenix_v2.menu.ip.lm6f=v2 IPv6 Lower Memory +phoenix_v2.menu.ip.lm6f.build.lwip_include=lwip2/include +phoenix_v2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +phoenix_v2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +phoenix_v2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +phoenix_v2.menu.ip.hb6f.build.lwip_include=lwip2/include +phoenix_v2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +phoenix_v2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 phoenix_v2.menu.ip.hb1=v1.4 Higher Bandwidth phoenix_v2.menu.ip.hb1.build.lwip_lib=-llwip_gcc phoenix_v2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -2116,19 +2196,27 @@ nodemcu.menu.eesz.4M3M.build.spiffs_blocksize=8192 nodemcu.menu.ip.lm2f=v2 Lower Memory nodemcu.menu.ip.lm2f.build.lwip_include=lwip2/include nodemcu.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -nodemcu.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +nodemcu.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 nodemcu.menu.ip.hb2f=v2 Higher Bandwidth nodemcu.menu.ip.hb2f.build.lwip_include=lwip2/include nodemcu.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -nodemcu.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +nodemcu.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 nodemcu.menu.ip.lm2n=v2 Lower Memory (no features) nodemcu.menu.ip.lm2n.build.lwip_include=lwip2/include nodemcu.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -nodemcu.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +nodemcu.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 nodemcu.menu.ip.hb2n=v2 Higher Bandwidth (no features) nodemcu.menu.ip.hb2n.build.lwip_include=lwip2/include nodemcu.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -nodemcu.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +nodemcu.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +nodemcu.menu.ip.lm6f=v2 IPv6 Lower Memory +nodemcu.menu.ip.lm6f.build.lwip_include=lwip2/include +nodemcu.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +nodemcu.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +nodemcu.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +nodemcu.menu.ip.hb6f.build.lwip_include=lwip2/include +nodemcu.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +nodemcu.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 nodemcu.menu.ip.hb1=v1.4 Higher Bandwidth nodemcu.menu.ip.hb1.build.lwip_lib=-llwip_gcc nodemcu.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -2285,19 +2373,27 @@ nodemcuv2.menu.eesz.4M3M.build.spiffs_blocksize=8192 nodemcuv2.menu.ip.lm2f=v2 Lower Memory nodemcuv2.menu.ip.lm2f.build.lwip_include=lwip2/include nodemcuv2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -nodemcuv2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +nodemcuv2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 nodemcuv2.menu.ip.hb2f=v2 Higher Bandwidth nodemcuv2.menu.ip.hb2f.build.lwip_include=lwip2/include nodemcuv2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -nodemcuv2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +nodemcuv2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 nodemcuv2.menu.ip.lm2n=v2 Lower Memory (no features) nodemcuv2.menu.ip.lm2n.build.lwip_include=lwip2/include nodemcuv2.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -nodemcuv2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +nodemcuv2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 nodemcuv2.menu.ip.hb2n=v2 Higher Bandwidth (no features) nodemcuv2.menu.ip.hb2n.build.lwip_include=lwip2/include nodemcuv2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -nodemcuv2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +nodemcuv2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +nodemcuv2.menu.ip.lm6f=v2 IPv6 Lower Memory +nodemcuv2.menu.ip.lm6f.build.lwip_include=lwip2/include +nodemcuv2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +nodemcuv2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +nodemcuv2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +nodemcuv2.menu.ip.hb6f.build.lwip_include=lwip2/include +nodemcuv2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +nodemcuv2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 nodemcuv2.menu.ip.hb1=v1.4 Higher Bandwidth nodemcuv2.menu.ip.hb1.build.lwip_lib=-llwip_gcc nodemcuv2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -2444,19 +2540,27 @@ modwifi.menu.eesz.2M1M.build.spiffs_blocksize=8192 modwifi.menu.ip.lm2f=v2 Lower Memory modwifi.menu.ip.lm2f.build.lwip_include=lwip2/include modwifi.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -modwifi.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +modwifi.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 modwifi.menu.ip.hb2f=v2 Higher Bandwidth modwifi.menu.ip.hb2f.build.lwip_include=lwip2/include modwifi.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -modwifi.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +modwifi.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 modwifi.menu.ip.lm2n=v2 Lower Memory (no features) modwifi.menu.ip.lm2n.build.lwip_include=lwip2/include modwifi.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -modwifi.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +modwifi.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 modwifi.menu.ip.hb2n=v2 Higher Bandwidth (no features) modwifi.menu.ip.hb2n.build.lwip_include=lwip2/include modwifi.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -modwifi.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +modwifi.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +modwifi.menu.ip.lm6f=v2 IPv6 Lower Memory +modwifi.menu.ip.lm6f.build.lwip_include=lwip2/include +modwifi.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +modwifi.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +modwifi.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +modwifi.menu.ip.hb6f.build.lwip_include=lwip2/include +modwifi.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +modwifi.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 modwifi.menu.ip.hb1=v1.4 Higher Bandwidth modwifi.menu.ip.hb1.build.lwip_lib=-llwip_gcc modwifi.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -2613,19 +2717,27 @@ thing.menu.eesz.512K128.build.spiffs_blocksize=4096 thing.menu.ip.lm2f=v2 Lower Memory thing.menu.ip.lm2f.build.lwip_include=lwip2/include thing.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -thing.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +thing.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 thing.menu.ip.hb2f=v2 Higher Bandwidth thing.menu.ip.hb2f.build.lwip_include=lwip2/include thing.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -thing.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +thing.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 thing.menu.ip.lm2n=v2 Lower Memory (no features) thing.menu.ip.lm2n.build.lwip_include=lwip2/include thing.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -thing.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +thing.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 thing.menu.ip.hb2n=v2 Higher Bandwidth (no features) thing.menu.ip.hb2n.build.lwip_include=lwip2/include thing.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -thing.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +thing.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +thing.menu.ip.lm6f=v2 IPv6 Lower Memory +thing.menu.ip.lm6f.build.lwip_include=lwip2/include +thing.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +thing.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +thing.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +thing.menu.ip.hb6f.build.lwip_include=lwip2/include +thing.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +thing.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 thing.menu.ip.hb1=v1.4 Higher Bandwidth thing.menu.ip.hb1.build.lwip_lib=-llwip_gcc thing.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -2782,19 +2894,27 @@ thingdev.menu.eesz.512K128.build.spiffs_blocksize=4096 thingdev.menu.ip.lm2f=v2 Lower Memory thingdev.menu.ip.lm2f.build.lwip_include=lwip2/include thingdev.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -thingdev.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +thingdev.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 thingdev.menu.ip.hb2f=v2 Higher Bandwidth thingdev.menu.ip.hb2f.build.lwip_include=lwip2/include thingdev.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -thingdev.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +thingdev.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 thingdev.menu.ip.lm2n=v2 Lower Memory (no features) thingdev.menu.ip.lm2n.build.lwip_include=lwip2/include thingdev.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -thingdev.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +thingdev.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 thingdev.menu.ip.hb2n=v2 Higher Bandwidth (no features) thingdev.menu.ip.hb2n.build.lwip_include=lwip2/include thingdev.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -thingdev.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +thingdev.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +thingdev.menu.ip.lm6f=v2 IPv6 Lower Memory +thingdev.menu.ip.lm6f.build.lwip_include=lwip2/include +thingdev.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +thingdev.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +thingdev.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +thingdev.menu.ip.hb6f.build.lwip_include=lwip2/include +thingdev.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +thingdev.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 thingdev.menu.ip.hb1=v1.4 Higher Bandwidth thingdev.menu.ip.hb1.build.lwip_lib=-llwip_gcc thingdev.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -2951,19 +3071,27 @@ esp210.menu.eesz.4M3M.build.spiffs_blocksize=8192 esp210.menu.ip.lm2f=v2 Lower Memory esp210.menu.ip.lm2f.build.lwip_include=lwip2/include esp210.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -esp210.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +esp210.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 esp210.menu.ip.hb2f=v2 Higher Bandwidth esp210.menu.ip.hb2f.build.lwip_include=lwip2/include esp210.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -esp210.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +esp210.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 esp210.menu.ip.lm2n=v2 Lower Memory (no features) esp210.menu.ip.lm2n.build.lwip_include=lwip2/include esp210.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -esp210.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +esp210.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 esp210.menu.ip.hb2n=v2 Higher Bandwidth (no features) esp210.menu.ip.hb2n.build.lwip_include=lwip2/include esp210.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -esp210.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +esp210.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +esp210.menu.ip.lm6f=v2 IPv6 Lower Memory +esp210.menu.ip.lm6f.build.lwip_include=lwip2/include +esp210.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +esp210.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +esp210.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +esp210.menu.ip.hb6f.build.lwip_include=lwip2/include +esp210.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +esp210.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 esp210.menu.ip.hb1=v1.4 Higher Bandwidth esp210.menu.ip.hb1.build.lwip_lib=-llwip_gcc esp210.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -3120,19 +3248,27 @@ d1_mini.menu.eesz.4M3M.build.spiffs_blocksize=8192 d1_mini.menu.ip.lm2f=v2 Lower Memory d1_mini.menu.ip.lm2f.build.lwip_include=lwip2/include d1_mini.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -d1_mini.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +d1_mini.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 d1_mini.menu.ip.hb2f=v2 Higher Bandwidth d1_mini.menu.ip.hb2f.build.lwip_include=lwip2/include d1_mini.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -d1_mini.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +d1_mini.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 d1_mini.menu.ip.lm2n=v2 Lower Memory (no features) d1_mini.menu.ip.lm2n.build.lwip_include=lwip2/include d1_mini.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -d1_mini.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +d1_mini.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 d1_mini.menu.ip.hb2n=v2 Higher Bandwidth (no features) d1_mini.menu.ip.hb2n.build.lwip_include=lwip2/include d1_mini.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -d1_mini.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +d1_mini.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +d1_mini.menu.ip.lm6f=v2 IPv6 Lower Memory +d1_mini.menu.ip.lm6f.build.lwip_include=lwip2/include +d1_mini.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +d1_mini.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +d1_mini.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +d1_mini.menu.ip.hb6f.build.lwip_include=lwip2/include +d1_mini.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +d1_mini.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 d1_mini.menu.ip.hb1=v1.4 Higher Bandwidth d1_mini.menu.ip.hb1.build.lwip_lib=-llwip_gcc d1_mini.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -3272,19 +3408,27 @@ d1_mini_pro.menu.eesz.16M15M.build.spiffs_blocksize=8192 d1_mini_pro.menu.ip.lm2f=v2 Lower Memory d1_mini_pro.menu.ip.lm2f.build.lwip_include=lwip2/include d1_mini_pro.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -d1_mini_pro.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +d1_mini_pro.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 d1_mini_pro.menu.ip.hb2f=v2 Higher Bandwidth d1_mini_pro.menu.ip.hb2f.build.lwip_include=lwip2/include d1_mini_pro.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -d1_mini_pro.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +d1_mini_pro.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 d1_mini_pro.menu.ip.lm2n=v2 Lower Memory (no features) d1_mini_pro.menu.ip.lm2n.build.lwip_include=lwip2/include d1_mini_pro.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -d1_mini_pro.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +d1_mini_pro.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 d1_mini_pro.menu.ip.hb2n=v2 Higher Bandwidth (no features) d1_mini_pro.menu.ip.hb2n.build.lwip_include=lwip2/include d1_mini_pro.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -d1_mini_pro.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +d1_mini_pro.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +d1_mini_pro.menu.ip.lm6f=v2 IPv6 Lower Memory +d1_mini_pro.menu.ip.lm6f.build.lwip_include=lwip2/include +d1_mini_pro.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +d1_mini_pro.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +d1_mini_pro.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +d1_mini_pro.menu.ip.hb6f.build.lwip_include=lwip2/include +d1_mini_pro.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +d1_mini_pro.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 d1_mini_pro.menu.ip.hb1=v1.4 Higher Bandwidth d1_mini_pro.menu.ip.hb1.build.lwip_lib=-llwip_gcc d1_mini_pro.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -3481,19 +3625,27 @@ d1_mini_lite.menu.eesz.1M512.build.spiffs_blocksize=4096 d1_mini_lite.menu.ip.lm2f=v2 Lower Memory d1_mini_lite.menu.ip.lm2f.build.lwip_include=lwip2/include d1_mini_lite.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -d1_mini_lite.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +d1_mini_lite.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 d1_mini_lite.menu.ip.hb2f=v2 Higher Bandwidth d1_mini_lite.menu.ip.hb2f.build.lwip_include=lwip2/include d1_mini_lite.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -d1_mini_lite.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +d1_mini_lite.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 d1_mini_lite.menu.ip.lm2n=v2 Lower Memory (no features) d1_mini_lite.menu.ip.lm2n.build.lwip_include=lwip2/include d1_mini_lite.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -d1_mini_lite.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +d1_mini_lite.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 d1_mini_lite.menu.ip.hb2n=v2 Higher Bandwidth (no features) d1_mini_lite.menu.ip.hb2n.build.lwip_include=lwip2/include d1_mini_lite.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -d1_mini_lite.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +d1_mini_lite.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +d1_mini_lite.menu.ip.lm6f=v2 IPv6 Lower Memory +d1_mini_lite.menu.ip.lm6f.build.lwip_include=lwip2/include +d1_mini_lite.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +d1_mini_lite.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +d1_mini_lite.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +d1_mini_lite.menu.ip.hb6f.build.lwip_include=lwip2/include +d1_mini_lite.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +d1_mini_lite.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 d1_mini_lite.menu.ip.hb1=v1.4 Higher Bandwidth d1_mini_lite.menu.ip.hb1.build.lwip_lib=-llwip_gcc d1_mini_lite.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -3650,19 +3802,27 @@ d1.menu.eesz.4M3M.build.spiffs_blocksize=8192 d1.menu.ip.lm2f=v2 Lower Memory d1.menu.ip.lm2f.build.lwip_include=lwip2/include d1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -d1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +d1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 d1.menu.ip.hb2f=v2 Higher Bandwidth d1.menu.ip.hb2f.build.lwip_include=lwip2/include d1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -d1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +d1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 d1.menu.ip.lm2n=v2 Lower Memory (no features) d1.menu.ip.lm2n.build.lwip_include=lwip2/include d1.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -d1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +d1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 d1.menu.ip.hb2n=v2 Higher Bandwidth (no features) d1.menu.ip.hb2n.build.lwip_include=lwip2/include d1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -d1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +d1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +d1.menu.ip.lm6f=v2 IPv6 Lower Memory +d1.menu.ip.lm6f.build.lwip_include=lwip2/include +d1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +d1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +d1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +d1.menu.ip.hb6f.build.lwip_include=lwip2/include +d1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +d1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 d1.menu.ip.hb1=v1.4 Higher Bandwidth d1.menu.ip.hb1.build.lwip_lib=-llwip_gcc d1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -3822,19 +3982,27 @@ espino.menu.eesz.4M3M.build.spiffs_blocksize=8192 espino.menu.ip.lm2f=v2 Lower Memory espino.menu.ip.lm2f.build.lwip_include=lwip2/include espino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -espino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +espino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espino.menu.ip.hb2f=v2 Higher Bandwidth espino.menu.ip.hb2f.build.lwip_include=lwip2/include espino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -espino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +espino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espino.menu.ip.lm2n=v2 Lower Memory (no features) espino.menu.ip.lm2n.build.lwip_include=lwip2/include espino.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -espino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +espino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 espino.menu.ip.hb2n=v2 Higher Bandwidth (no features) espino.menu.ip.hb2n.build.lwip_include=lwip2/include espino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -espino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +espino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +espino.menu.ip.lm6f=v2 IPv6 Lower Memory +espino.menu.ip.lm6f.build.lwip_include=lwip2/include +espino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +espino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +espino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +espino.menu.ip.hb6f.build.lwip_include=lwip2/include +espino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +espino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 espino.menu.ip.hb1=v1.4 Higher Bandwidth espino.menu.ip.hb1.build.lwip_lib=-llwip_gcc espino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -3991,19 +4159,27 @@ espinotee.menu.eesz.4M3M.build.spiffs_blocksize=8192 espinotee.menu.ip.lm2f=v2 Lower Memory espinotee.menu.ip.lm2f.build.lwip_include=lwip2/include espinotee.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -espinotee.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +espinotee.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espinotee.menu.ip.hb2f=v2 Higher Bandwidth espinotee.menu.ip.hb2f.build.lwip_include=lwip2/include espinotee.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -espinotee.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +espinotee.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 espinotee.menu.ip.lm2n=v2 Lower Memory (no features) espinotee.menu.ip.lm2n.build.lwip_include=lwip2/include espinotee.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -espinotee.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +espinotee.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 espinotee.menu.ip.hb2n=v2 Higher Bandwidth (no features) espinotee.menu.ip.hb2n.build.lwip_include=lwip2/include espinotee.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -espinotee.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +espinotee.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +espinotee.menu.ip.lm6f=v2 IPv6 Lower Memory +espinotee.menu.ip.lm6f.build.lwip_include=lwip2/include +espinotee.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +espinotee.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +espinotee.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +espinotee.menu.ip.hb6f.build.lwip_include=lwip2/include +espinotee.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +espinotee.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 espinotee.menu.ip.hb1=v1.4 Higher Bandwidth espinotee.menu.ip.hb1.build.lwip_lib=-llwip_gcc espinotee.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -4220,19 +4396,27 @@ wifinfo.menu.eesz.1M512.build.spiffs_blocksize=4096 wifinfo.menu.ip.lm2f=v2 Lower Memory wifinfo.menu.ip.lm2f.build.lwip_include=lwip2/include wifinfo.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -wifinfo.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +wifinfo.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 wifinfo.menu.ip.hb2f=v2 Higher Bandwidth wifinfo.menu.ip.hb2f.build.lwip_include=lwip2/include wifinfo.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -wifinfo.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +wifinfo.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 wifinfo.menu.ip.lm2n=v2 Lower Memory (no features) wifinfo.menu.ip.lm2n.build.lwip_include=lwip2/include wifinfo.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -wifinfo.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +wifinfo.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 wifinfo.menu.ip.hb2n=v2 Higher Bandwidth (no features) wifinfo.menu.ip.hb2n.build.lwip_include=lwip2/include wifinfo.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -wifinfo.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +wifinfo.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +wifinfo.menu.ip.lm6f=v2 IPv6 Lower Memory +wifinfo.menu.ip.lm6f.build.lwip_include=lwip2/include +wifinfo.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +wifinfo.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +wifinfo.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +wifinfo.menu.ip.hb6f.build.lwip_include=lwip2/include +wifinfo.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +wifinfo.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 wifinfo.menu.ip.hb1=v1.4 Higher Bandwidth wifinfo.menu.ip.hb1.build.lwip_lib=-llwip_gcc wifinfo.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -4401,19 +4585,27 @@ arduino-esp8266.menu.eesz.4M3M.build.spiffs_blocksize=8192 arduino-esp8266.menu.ip.lm2f=v2 Lower Memory arduino-esp8266.menu.ip.lm2f.build.lwip_include=lwip2/include arduino-esp8266.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -arduino-esp8266.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +arduino-esp8266.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 arduino-esp8266.menu.ip.hb2f=v2 Higher Bandwidth arduino-esp8266.menu.ip.hb2f.build.lwip_include=lwip2/include arduino-esp8266.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -arduino-esp8266.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +arduino-esp8266.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 arduino-esp8266.menu.ip.lm2n=v2 Lower Memory (no features) arduino-esp8266.menu.ip.lm2n.build.lwip_include=lwip2/include arduino-esp8266.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -arduino-esp8266.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +arduino-esp8266.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 arduino-esp8266.menu.ip.hb2n=v2 Higher Bandwidth (no features) arduino-esp8266.menu.ip.hb2n.build.lwip_include=lwip2/include arduino-esp8266.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -arduino-esp8266.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +arduino-esp8266.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +arduino-esp8266.menu.ip.lm6f=v2 IPv6 Lower Memory +arduino-esp8266.menu.ip.lm6f.build.lwip_include=lwip2/include +arduino-esp8266.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +arduino-esp8266.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +arduino-esp8266.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +arduino-esp8266.menu.ip.hb6f.build.lwip_include=lwip2/include +arduino-esp8266.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +arduino-esp8266.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 arduino-esp8266.menu.ip.hb1=v1.4 Higher Bandwidth arduino-esp8266.menu.ip.hb1.build.lwip_lib=-llwip_gcc arduino-esp8266.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -4571,19 +4763,27 @@ gen4iod.menu.eesz.512K128.build.spiffs_blocksize=4096 gen4iod.menu.ip.lm2f=v2 Lower Memory gen4iod.menu.ip.lm2f.build.lwip_include=lwip2/include gen4iod.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -gen4iod.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +gen4iod.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 gen4iod.menu.ip.hb2f=v2 Higher Bandwidth gen4iod.menu.ip.hb2f.build.lwip_include=lwip2/include gen4iod.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -gen4iod.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +gen4iod.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 gen4iod.menu.ip.lm2n=v2 Lower Memory (no features) gen4iod.menu.ip.lm2n.build.lwip_include=lwip2/include gen4iod.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -gen4iod.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +gen4iod.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 gen4iod.menu.ip.hb2n=v2 Higher Bandwidth (no features) gen4iod.menu.ip.hb2n.build.lwip_include=lwip2/include gen4iod.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -gen4iod.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +gen4iod.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +gen4iod.menu.ip.lm6f=v2 IPv6 Lower Memory +gen4iod.menu.ip.lm6f.build.lwip_include=lwip2/include +gen4iod.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +gen4iod.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +gen4iod.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +gen4iod.menu.ip.hb6f.build.lwip_include=lwip2/include +gen4iod.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +gen4iod.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 gen4iod.menu.ip.hb1=v1.4 Higher Bandwidth gen4iod.menu.ip.hb1.build.lwip_lib=-llwip_gcc gen4iod.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -4741,19 +4941,27 @@ oak.menu.eesz.4M3M.build.spiffs_blocksize=8192 oak.menu.ip.lm2f=v2 Lower Memory oak.menu.ip.lm2f.build.lwip_include=lwip2/include oak.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -oak.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +oak.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 oak.menu.ip.hb2f=v2 Higher Bandwidth oak.menu.ip.hb2f.build.lwip_include=lwip2/include oak.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -oak.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +oak.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 oak.menu.ip.lm2n=v2 Lower Memory (no features) oak.menu.ip.lm2n.build.lwip_include=lwip2/include oak.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -oak.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +oak.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 oak.menu.ip.hb2n=v2 Higher Bandwidth (no features) oak.menu.ip.hb2n.build.lwip_include=lwip2/include oak.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -oak.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +oak.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +oak.menu.ip.lm6f=v2 IPv6 Lower Memory +oak.menu.ip.lm6f.build.lwip_include=lwip2/include +oak.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +oak.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +oak.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +oak.menu.ip.hb6f.build.lwip_include=lwip2/include +oak.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +oak.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 oak.menu.ip.hb1=v1.4 Higher Bandwidth oak.menu.ip.hb1.build.lwip_lib=-llwip_gcc oak.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -4910,19 +5118,27 @@ wifiduino.menu.eesz.4M3M.build.spiffs_blocksize=8192 wifiduino.menu.ip.lm2f=v2 Lower Memory wifiduino.menu.ip.lm2f.build.lwip_include=lwip2/include wifiduino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -wifiduino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +wifiduino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 wifiduino.menu.ip.hb2f=v2 Higher Bandwidth wifiduino.menu.ip.hb2f.build.lwip_include=lwip2/include wifiduino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -wifiduino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +wifiduino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 wifiduino.menu.ip.lm2n=v2 Lower Memory (no features) wifiduino.menu.ip.lm2n.build.lwip_include=lwip2/include wifiduino.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -wifiduino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +wifiduino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 wifiduino.menu.ip.hb2n=v2 Higher Bandwidth (no features) wifiduino.menu.ip.hb2n.build.lwip_include=lwip2/include wifiduino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -wifiduino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +wifiduino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +wifiduino.menu.ip.lm6f=v2 IPv6 Lower Memory +wifiduino.menu.ip.lm6f.build.lwip_include=lwip2/include +wifiduino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +wifiduino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +wifiduino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +wifiduino.menu.ip.hb6f.build.lwip_include=lwip2/include +wifiduino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +wifiduino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 wifiduino.menu.ip.hb1=v1.4 Higher Bandwidth wifiduino.menu.ip.hb1.build.lwip_lib=-llwip_gcc wifiduino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -5156,19 +5372,27 @@ wifi_slot.menu.eesz.2M1M.build.spiffs_blocksize=8192 wifi_slot.menu.ip.lm2f=v2 Lower Memory wifi_slot.menu.ip.lm2f.build.lwip_include=lwip2/include wifi_slot.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -wifi_slot.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +wifi_slot.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 wifi_slot.menu.ip.hb2f=v2 Higher Bandwidth wifi_slot.menu.ip.hb2f.build.lwip_include=lwip2/include wifi_slot.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -wifi_slot.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +wifi_slot.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 wifi_slot.menu.ip.lm2n=v2 Lower Memory (no features) wifi_slot.menu.ip.lm2n.build.lwip_include=lwip2/include wifi_slot.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -wifi_slot.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +wifi_slot.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 wifi_slot.menu.ip.hb2n=v2 Higher Bandwidth (no features) wifi_slot.menu.ip.hb2n.build.lwip_include=lwip2/include wifi_slot.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -wifi_slot.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +wifi_slot.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +wifi_slot.menu.ip.lm6f=v2 IPv6 Lower Memory +wifi_slot.menu.ip.lm6f.build.lwip_include=lwip2/include +wifi_slot.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +wifi_slot.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +wifi_slot.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +wifi_slot.menu.ip.hb6f.build.lwip_include=lwip2/include +wifi_slot.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +wifi_slot.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 wifi_slot.menu.ip.hb1=v1.4 Higher Bandwidth wifi_slot.menu.ip.hb1.build.lwip_lib=-llwip_gcc wifi_slot.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC @@ -5325,19 +5549,27 @@ wiolink.menu.eesz.4M3M.build.spiffs_blocksize=8192 wiolink.menu.ip.lm2f=v2 Lower Memory wiolink.menu.ip.lm2f.build.lwip_include=lwip2/include wiolink.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -wiolink.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 +wiolink.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 wiolink.menu.ip.hb2f=v2 Higher Bandwidth wiolink.menu.ip.hb2f.build.lwip_include=lwip2/include wiolink.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -wiolink.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 +wiolink.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 wiolink.menu.ip.lm2n=v2 Lower Memory (no features) wiolink.menu.ip.lm2n.build.lwip_include=lwip2/include wiolink.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -wiolink.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 +wiolink.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 wiolink.menu.ip.hb2n=v2 Higher Bandwidth (no features) wiolink.menu.ip.hb2n.build.lwip_include=lwip2/include wiolink.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -wiolink.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 +wiolink.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +wiolink.menu.ip.lm6f=v2 IPv6 Lower Memory +wiolink.menu.ip.lm6f.build.lwip_include=lwip2/include +wiolink.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +wiolink.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +wiolink.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +wiolink.menu.ip.hb6f.build.lwip_include=lwip2/include +wiolink.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +wiolink.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 wiolink.menu.ip.hb1=v1.4 Higher Bandwidth wiolink.menu.ip.hb1.build.lwip_lib=-llwip_gcc wiolink.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC diff --git a/cores/esp8266/AddrList.h b/cores/esp8266/AddrList.h new file mode 100644 index 0000000000..68329f87c2 --- /dev/null +++ b/cores/esp8266/AddrList.h @@ -0,0 +1,168 @@ +/* + AddrList.h - cycle through lwIP netif's ip addresses like a c++ list + Copyright (c) 2018 david gauchard. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + This class allows to explore all configured IP addresses + in lwIP netifs, with that kind of c++ loop: + + for (auto a: ifList) + out.printf("IF='%s' index=%d legacy=%d IPv4=%d local=%d hostname='%s' addr= %s\n", + a->iface().c_str(), + a->number(), + a->addr().isLegacy(), + a->addr().isV4(), + a->addr().isLocal(), + a->hostname().c_str(), + a->addr().toString().c_str()); + + This loop: + + while (WiFi.status() != WL_CONNECTED()) { + Serial.print('.'); + delay(500); + } + + can be replaced by: + + for (bool configured = false; !configured; ) { + for (auto iface: ifList) + if ((configured = !iface->addr().isLocal()) + break; + Serial.print('.'); + delay(500); + } + + waiting for an IPv6 global address: + + for (bool configured = false; !configured; ) { + for (auto iface: ifList) + if ((configured = ( !iface->addr()->isV4() + && !iface->addr().isLocal()))) + break; + Serial.print('.'); + delay(500); + } + + waiting for an IPv6 global address, on a specific interface: + + for (bool configured = false; !configured; ) { + for (auto iface: ifList) + if ((configured = ( !iface->addr()->isV4() + && !iface->addr().isLocal() + && iface->number() == STATION_IF))) + break; + Serial.print('.'); + delay(500); + } +*/ + +#ifndef __ADDRLIST_H +#define __ADDRLIST_H + +#include +#include + +#if LWIP_IPV6 +#define IF_NUM_ADDRESSES (1 + LWIP_IPV6_NUM_ADDRESSES) +#else +#define IF_NUM_ADDRESSES (1) +#endif + + +class AddrListClass { + + // no member in this class + // lwIP's global 'struct netif* netif_list' is used + // designed to be used with 'for (auto x: ifList)' + + public: + + class const_iterator { + + public: + + // iterator operations: + + const_iterator (bool begin = true): _netif(begin? netif_list: nullptr), _num(-1) { ++*this; } + const_iterator (const const_iterator& o): _netif(o._netif), _num(o._num) { } + const_iterator& operator= (const const_iterator& o) { _netif = o._netif; _num = o._num; return *this; } + + bool operator!= (const const_iterator& o) { return !equal(o); } + bool operator== (const const_iterator& o) { return equal(o); } + + const_iterator operator++(int) { + const_iterator ret = *this; + ++(*this); + return ret; + } + + const_iterator& operator++() { + while (_netif) { + if (++_num == IF_NUM_ADDRESSES) { + _num = -1; + _netif = _netif->next; + continue; + } + if (!ip_addr_isany(_ip_from_netif_num())) + break; + } + return *this; + } + + // (*iterator) emulation: + + const const_iterator& operator* () const { return *this; } + const const_iterator* operator-> () const { return this; } + + bool isLegacy() const { return _num == 0; } + bool isLocal() const { return addr().isLocal(); } + IPAddress addr () const { return _ip_from_netif_num(); } + IPAddress netmask () const { return _netif->netmask; } + IPAddress gw () const { return _netif->gw; } + String iface () const { return String(_netif->name[0]) + _netif->name[1]; } + const char* hostname () const { return _netif->hostname?: emptyString.c_str(); } + const char* mac () const { return (const char*)_netif->hwaddr; } + int number () const { return _netif->num; } + + protected: + + bool equal (const const_iterator& o) { + return _netif == o._netif + && (!_netif || _num == o._num); + } + + const ip_addr_t* _ip_from_netif_num () const { +#if LWIP_IPV6 + return _num? &_netif->ip6_addr[_num - 1]: &_netif->ip_addr; +#else + return &_netif->ip_addr; +#endif + } + + netif* _netif; + int _num; // address index (0 is legacy, _num-1 is ip6_addr[]'s index) + }; + + const const_iterator begin () const { return const_iterator(true); } + const const_iterator end () const { return const_iterator(false); } +}; + +extern AddrListClass addrList; + +#endif // __ADDRLIST_H diff --git a/cores/esp8266/Client.h b/cores/esp8266/Client.h index 3cab9f2d69..cbdd6ae0b0 100644 --- a/cores/esp8266/Client.h +++ b/cores/esp8266/Client.h @@ -26,7 +26,7 @@ class Client: public Stream { public: - virtual int connect(IPAddress ip, uint16_t port) =0; + virtual int connect(CONST IPAddress& ip, uint16_t port) =0; virtual int connect(const char *host, uint16_t port) =0; virtual size_t write(uint8_t) =0; virtual size_t write(const uint8_t *buf, size_t size) =0; @@ -39,7 +39,7 @@ class Client: public Stream { virtual uint8_t connected() = 0; virtual operator bool() = 0; protected: - uint8_t* rawIPAddress(IPAddress& addr) { + CONST uint8_t* rawIPAddress(CONST IPAddress& addr) { return addr.raw_address(); } ; diff --git a/cores/esp8266/Esp-version.cpp b/cores/esp8266/Esp-version.cpp index 866d5d2974..7c4ea859f4 100644 --- a/cores/esp8266/Esp-version.cpp +++ b/cores/esp8266/Esp-version.cpp @@ -29,9 +29,6 @@ #define STR(x) STRHELPER(x) // stringifier static const char arduino_esp8266_git_ver [] PROGMEM = STR(ARDUINO_ESP8266_GIT_DESC); -#if LWIP_VERSION_MAJOR != 1 -static const char lwip2_version [] PROGMEM = "/lwIP:" STR(LWIP_VERSION_MAJOR) "." STR(LWIP_VERSION_MINOR) "." STR(LWIP_VERSION_REVISION); -#endif static const char bearssl_version [] PROGMEM = "/BearSSL:" STR(BEARSSL_GIT); String EspClass::getFullVersion() @@ -40,17 +37,18 @@ String EspClass::getFullVersion() + F("/Core:") + FPSTR(arduino_esp8266_git_ver) #if LWIP_VERSION_MAJOR == 1 + F("/lwIP:") + String(LWIP_VERSION_MAJOR) + "." + String(LWIP_VERSION_MINOR) + "." + String(LWIP_VERSION_REVISION) -#else - + FPSTR(lwip2_version) -#endif #if LWIP_VERSION_IS_DEVELOPMENT + F("-dev") #endif #if LWIP_VERSION_IS_RC + F("rc") + String(LWIP_VERSION_RC) #endif -#ifdef LWIP_HASH_STR - + "(" + F(LWIP_HASH_STR) + ")" +#else // LWIP_VERSION_MAJOR != 1 + + F("/lwIP:") +#if LWIP_IPV6 + + F("IPv6+") +#endif + + F(LWIP_HASH_STR) #endif + FPSTR(bearssl_version) ; diff --git a/cores/esp8266/IPAddress.cpp b/cores/esp8266/IPAddress.cpp index ab051bfe38..563409e163 100644 --- a/cores/esp8266/IPAddress.cpp +++ b/cores/esp8266/IPAddress.cpp @@ -20,28 +20,47 @@ #include #include #include +#include IPAddress::IPAddress() { - _address.dword = 0; + _ip = *IP_ANY_TYPE; // lwIP's v4-or-v6 generic address +} + +bool IPAddress::isSet () const { + return !ip_addr_isany(&_ip); } IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) { - _address.bytes[0] = first_octet; - _address.bytes[1] = second_octet; - _address.bytes[2] = third_octet; - _address.bytes[3] = fourth_octet; + setV4(); + (*this)[0] = first_octet; + (*this)[1] = second_octet; + (*this)[2] = third_octet; + (*this)[3] = fourth_octet; } IPAddress::IPAddress(uint32_t address) { - _address.dword = address; + setV4(); + v4() = address; } IPAddress::IPAddress(const uint8_t *address) { - memcpy(_address.bytes, address, sizeof(_address.bytes)); + setV4(); + v4() = *reinterpret_cast(address); } bool IPAddress::fromString(const char *address) { - // TODO: add support for "a", "a.b", "a.b.c" formats + if (!fromString4(address)) { +#if LWIP_IPV6 + return fromString6(address); +#else + return false; +#endif + } + return true; +} + +bool IPAddress::fromString4(const char *address) { + // TODO: (IPv4) add support for "a", "a.b", "a.b.c" formats uint16_t acc = 0; // Accumulator uint8_t dots = 0; @@ -63,7 +82,7 @@ bool IPAddress::fromString(const char *address) { // Too much dots (there must be 3 dots) return false; } - _address.bytes[dots++] = acc; + (*this)[dots++] = acc; acc = 0; } else @@ -77,39 +96,72 @@ bool IPAddress::fromString(const char *address) { // Too few dots (there must be 3 dots) return false; } - _address.bytes[3] = acc; + (*this)[3] = acc; + + setV4(); return true; } IPAddress& IPAddress::operator=(const uint8_t *address) { - memcpy(_address.bytes, address, sizeof(_address.bytes)); + setV4(); + v4() = *reinterpret_cast(address); return *this; } IPAddress& IPAddress::operator=(uint32_t address) { - _address.dword = address; + setV4(); + v4() = address; return *this; } bool IPAddress::operator==(const uint8_t* addr) const { - return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0; + return isV4() && v4() == *reinterpret_cast(addr); } size_t IPAddress::printTo(Print& p) const { size_t n = 0; - for(int i = 0; i < 3; i++) { - n += p.print(_address.bytes[i], DEC); - n += p.print('.'); + + if (!isSet()) + return p.print(F("(IP unset)")); + +#if LWIP_IPV6 + if (isV6()) { + int count0 = 0; + for (int i = 0; i < 8; i++) { + uint16_t bit = PP_NTOHS(raw6()[i]); + if (bit || count0 < 0) { + n += p.printf("%x", bit); + if (count0 > 0) + // no more hiding 0 + count0 = -8; + } else + count0++; + if ((i != 7 && count0 < 2) || count0 == 7) + n += p.print(':'); + } + return n; + } +#endif + + for(int i = 0; i < 4; i++) { + n += p.print((*this)[i], DEC); + if (i != 3) + n += p.print('.'); } - n += p.print(_address.bytes[3], DEC); return n; } String IPAddress::toString() const { - char szRet[16]; - sprintf(szRet,"%u.%u.%u.%u", _address.bytes[0], _address.bytes[1], _address.bytes[2], _address.bytes[3]); - return String(szRet); + StreamString sstr; +#if LWIP_IPV6 + if (isV6()) + sstr.reserve(40); // 8 shorts x 4 chars each + 7 colons + nullterm + else +#endif + sstr.reserve(16); // 4 bytes with 3 chars max + 3 dots + nullterm, or '(IP unset)' + printTo(sstr); + return sstr; } bool IPAddress::isValid(const String& arg) { @@ -120,4 +172,63 @@ bool IPAddress::isValid(const char* arg) { return IPAddress().fromString(arg); } -const IPAddress INADDR_NONE(0, 0, 0, 0); +CONST IPAddress IPNoAddress; // generic "0.0.0.0" for v4 & v6 + +/**************************************/ + +#if LWIP_IPV6 + +bool IPAddress::fromString6(const char *address) { + // TODO: test test test + + uint32_t acc = 0; // Accumulator + int dots = 0, doubledots = -1; + + while (*address) + { + char c = tolower(*address++); + if (isalnum(c)) { + if (c >= 'a') + c -= 'a' - '0' - 10; + acc = acc * 16 + (c - '0'); + if (acc > 0xffff) + // Value out of range + return false; + } + else if (c == ':') { + if (*address == ':') { + if (doubledots >= 0) + // :: allowed once + return false; + // remember location + doubledots = dots + !!acc; + address++; + } + if (dots == 7) + // too many separators + return false; + raw6()[dots++] = PP_HTONS(acc); + acc = 0; + } + else + // Invalid char + return false; + } + + if (doubledots == -1 && dots != 7) + // Too few separators + return false; + raw6()[dots++] = PP_HTONS(acc); + + if (doubledots != -1) { + for (int i = dots - doubledots - 1; i >= 0; i--) + raw6()[8 - dots + doubledots + i] = raw6()[doubledots + i]; + for (int i = doubledots; i < 8 - dots + doubledots; i++) + raw6()[i] = 0; + } + + setV6(); + return true; +} + +#endif diff --git a/cores/esp8266/IPAddress.h b/cores/esp8266/IPAddress.h index 0ef1eba725..925054e239 100644 --- a/cores/esp8266/IPAddress.h +++ b/cores/esp8266/IPAddress.h @@ -24,21 +24,44 @@ #include #include +#include +#include + +#if LWIP_VERSION_MAJOR == 1 +// compatibility macros to make lwIP-v1 compiling lwIP-v2 API +#define LWIP_IPV6_NUM_ADDRESSES 0 +#define ip_2_ip4(x) (x) +#define ipv4_addr ip_addr +#define IP_IS_V4_VAL(x) (1) +#define IP_SET_TYPE_VAL(x,y) do { (void)0; } while (0) +#define IP_ANY_TYPE (&ip_addr_any) +#define IP4_ADDR_ANY4 IPADDR_ANY +#define IPADDR4_INIT(x) { x } +#define CONST /* nothing: lwIP-v1 does not use const */ +#else +#define CONST const +#endif + // A class to make it easier to handle and pass around IP addresses +// IPv6 update: +// IPAddress is now a decorator class for lwIP's ip_addr_t +// fully backward compatible with legacy IPv4-only Arduino's +// with unchanged footprint when IPv6 is disabled class IPAddress: public Printable { private: - union { - uint8_t bytes[4]; // IPv4 address - uint32_t dword; - } _address; + + ip_addr_t _ip; // Access the raw byte array containing the address. Because this returns a pointer // to the internal structure rather than a copy of the address this function should only // be used when you know that the usage of the returned uint8_t* will be transient and not // stored. uint8_t* raw_address() { - return _address.bytes; + return reinterpret_cast(&v4()); + } + const uint8_t* raw_address() const { + return reinterpret_cast(&v4()); } public: @@ -54,22 +77,37 @@ class IPAddress: public Printable { // Overloaded cast operator to allow IPAddress objects to be used where a pointer // to a four-byte uint8_t array is expected operator uint32_t() const { - return _address.dword; + return isV4()? v4(): (uint32_t)0; } + + // the above uint32_t() cast can be ambiguous + // if gcc complains, use instead isSet() or v4() according to what's relevant + bool isSet () const; + // generic IPv4 wrapper to uint32-view like arduino loves to see it + const u32_t& v4() const { return ip_2_ip4(&_ip)->addr; } // for raw_address(const) + u32_t& v4() { return ip_2_ip4(&_ip)->addr; } + bool operator==(const IPAddress& addr) const { - return _address.dword == addr._address.dword; + return ip_addr_cmp(&_ip, &addr._ip); + } + bool operator!=(const IPAddress& addr) const { + return !ip_addr_cmp(&_ip, &addr._ip); } bool operator==(uint32_t addr) const { - return _address.dword == addr; + return isV4() && v4() == addr; + } + bool operator!=(uint32_t addr) const { + return !(isV4() && v4() == addr); } bool operator==(const uint8_t* addr) const; // Overloaded index operator to allow getting and setting individual octets of the address uint8_t operator[](int index) const { - return _address.bytes[index]; + return isV4()? *(raw_address() + index): 0; } uint8_t& operator[](int index) { - return _address.bytes[index]; + setV4(); + return *(raw_address() + index); } // Overloaded copy operators to allow initialisation of IPAddress objects from other types @@ -79,13 +117,13 @@ class IPAddress: public Printable { virtual size_t printTo(Print& p) const; String toString() const; - /* - check if input string(arg) is a valid IPV4 address or not. - return true on valid. - return false on invalid. - */ - static bool isValid(const String& arg); - static bool isValid(const char* arg); + /* + check if input string(arg) is a valid IPV4 address or not. + return true on valid. + return false on invalid. + */ + static bool isValid(const String& arg); + static bool isValid(const char* arg); friend class EthernetClass; friend class UDP; @@ -93,8 +131,68 @@ class IPAddress: public Printable { friend class Server; friend class DhcpClass; friend class DNSClient; + + /* + lwIP address compatibility + */ + IPAddress(const ipv4_addr* fw_addr) { setV4(); v4() = fw_addr->addr; } + IPAddress(const ip_addr_t& lwip_addr) { _ip = lwip_addr; } + +#if LWIP_VERSION_MAJOR != 1 + IPAddress(ipv4_addr fw_addr) { setV4(); v4() = fw_addr.addr; } + IPAddress(const ip_addr_t* lwip_addr) { _ip = *lwip_addr; } +#endif + + operator ip_addr_t () const { return _ip; } + operator const ip_addr_t*() const { return &_ip; } + operator ip_addr_t*() { return &_ip; } + + bool isV4() const { return IP_IS_V4_VAL(_ip); } + void setV4() { IP_SET_TYPE_VAL(_ip, IPADDR_TYPE_V4); } + + bool isLocal () const { return ip_addr_islinklocal(&_ip); } + +#if LWIP_IPV6 + + uint16_t* raw6() + { + setV6(); + return reinterpret_cast(ip_2_ip6(&_ip)); + } + + const uint16_t* raw6() const + { + return isV6()? reinterpret_cast(ip_2_ip6(&_ip)): nullptr; + } + + // when not IPv6, ip_addr_t == ip4_addr_t so this one would be ambiguous + // required otherwise + operator const ip4_addr_t*() const { return isV4()? ip_2_ip4(&_ip): nullptr; } + + bool isV6() const { return IP_IS_V6_VAL(_ip); } + void setV6() { IP_SET_TYPE_VAL(_ip, IPADDR_TYPE_V6); } + + protected: + bool fromString6(const char *address); + +#else + + // allow portable code when IPv6 is not enabled + + uint16_t* raw6() { return nullptr; } + const uint16_t* raw6() const { return nullptr; } + bool isV6() const { return false; } + void setV6() { } + +#endif + + protected: + bool fromString4(const char *address); + }; -extern const IPAddress INADDR_NONE; +extern CONST IPAddress IPNoAddress; + +#include #endif diff --git a/cores/esp8266/Udp.h b/cores/esp8266/Udp.h index baf70781ac..8223c098ab 100644 --- a/cores/esp8266/Udp.h +++ b/cores/esp8266/Udp.h @@ -78,11 +78,11 @@ class UDP: public Stream { virtual void flush() =0; // Finish reading the current packet // Return the IP address of the host who sent the current incoming packet - virtual IPAddress remoteIP() =0; + virtual IPAddress remoteIP() const =0; // Return the port of the host who sent the current incoming packet - virtual uint16_t remotePort() =0; + virtual uint16_t remotePort() const =0; protected: - uint8_t* rawIPAddress(IPAddress& addr) { + CONST uint8_t* rawIPAddress(CONST IPAddress& addr) { return addr.raw_address(); } }; diff --git a/libraries/ArduinoOTA/ArduinoOTA.cpp b/libraries/ArduinoOTA/ArduinoOTA.cpp index b6d1a915e6..295401fad6 100644 --- a/libraries/ArduinoOTA/ArduinoOTA.cpp +++ b/libraries/ArduinoOTA/ArduinoOTA.cpp @@ -124,7 +124,7 @@ void ArduinoOTAClass::begin() { _udp_ota = new UdpContext; _udp_ota->ref(); - if(!_udp_ota->listen(*IP_ADDR_ANY, _port)) + if(!_udp_ota->listen(IP_ADDR_ANY, _port)) return; _udp_ota->onRx(std::bind(&ArduinoOTAClass::_onRx, this)); MDNS.begin(_hostname.c_str()); @@ -172,7 +172,7 @@ String ArduinoOTAClass::readStringUntil(char end){ void ArduinoOTAClass::_onRx(){ if(!_udp_ota->next()) return; - ip_addr_t ota_ip; + IPAddress ota_ip; if (_state == OTA_IDLE) { int cmd = parseInt(); @@ -189,7 +189,7 @@ void ArduinoOTAClass::_onRx(){ if(_md5.length() != 32) return; - ota_ip.addr = (uint32_t)_ota_ip; + ota_ip = _ota_ip; if (_password.length()){ MD5Builder nonce_md5; @@ -201,7 +201,7 @@ void ArduinoOTAClass::_onRx(){ char auth_req[38]; sprintf(auth_req, "AUTH %s", _nonce.c_str()); _udp_ota->append((const char *)auth_req, strlen(auth_req)); - _udp_ota->send(&ota_ip, _ota_udp_port); + _udp_ota->send(ota_ip, _ota_udp_port); _state = OTA_WAITAUTH; return; } else { @@ -228,12 +228,12 @@ void ArduinoOTAClass::_onRx(){ _challengemd5.calculate(); String result = _challengemd5.toString(); - ota_ip.addr = (uint32_t)_ota_ip; + ota_ip = _ota_ip; if(result.equalsConstantTime(response)) { _state = OTA_RUNUPDATE; } else { _udp_ota->append("Authentication Failed", 21); - _udp_ota->send(&ota_ip, _ota_udp_port); + _udp_ota->send(ota_ip, _ota_udp_port); if (_error_callback) _error_callback(OTA_AUTH_ERROR); _state = OTA_IDLE; } @@ -243,8 +243,7 @@ void ArduinoOTAClass::_onRx(){ } void ArduinoOTAClass::_runUpdate() { - ip_addr_t ota_ip; - ota_ip.addr = (uint32_t)_ota_ip; + IPAddress ota_ip = _ota_ip; if (!Update.begin(_size, _cmd)) { #ifdef OTA_DEBUG @@ -258,14 +257,14 @@ void ArduinoOTAClass::_runUpdate() { Update.printError(ss); _udp_ota->append("ERR: ", 5); _udp_ota->append(ss.c_str(), ss.length()); - _udp_ota->send(&ota_ip, _ota_udp_port); + _udp_ota->send(ota_ip, _ota_udp_port); delay(100); - _udp_ota->listen(*IP_ADDR_ANY, _port); + _udp_ota->listen(IP_ADDR_ANY, _port); _state = OTA_IDLE; return; } _udp_ota->append("OK", 2); - _udp_ota->send(&ota_ip, _ota_udp_port); + _udp_ota->send(ota_ip, _ota_udp_port); delay(100); Update.setMD5(_md5.c_str()); @@ -284,7 +283,7 @@ void ArduinoOTAClass::_runUpdate() { #ifdef OTA_DEBUG OTA_DEBUG.printf("Connect Failed\n"); #endif - _udp_ota->listen(*IP_ADDR_ANY, _port); + _udp_ota->listen(IP_ADDR_ANY, _port); if (_error_callback) { _error_callback(OTA_CONNECT_ERROR); } @@ -302,7 +301,7 @@ void ArduinoOTAClass::_runUpdate() { #ifdef OTA_DEBUG OTA_DEBUG.printf("Receive Failed\n"); #endif - _udp_ota->listen(*IP_ADDR_ANY, _port); + _udp_ota->listen(IP_ADDR_ANY, _port); if (_error_callback) { _error_callback(OTA_RECEIVE_ERROR); } @@ -337,7 +336,7 @@ void ArduinoOTAClass::_runUpdate() { ESP.restart(); } } else { - _udp_ota->listen(*IP_ADDR_ANY, _port); + _udp_ota->listen(IP_ADDR_ANY, _port); if (_error_callback) { _error_callback(OTA_END_ERROR); } diff --git a/libraries/ESP8266LLMNR/ESP8266LLMNR.cpp b/libraries/ESP8266LLMNR/ESP8266LLMNR.cpp index e48cc1610e..ac8582c579 100644 --- a/libraries/ESP8266LLMNR/ESP8266LLMNR.cpp +++ b/libraries/ESP8266LLMNR/ESP8266LLMNR.cpp @@ -65,7 +65,9 @@ extern "C" { #define _conn_read8() _conn->read() #define _conn_readS(b, l) _conn->read((b), (l)); -static const IPAddress LLMNR_MULTICAST_ADDR(224, 0, 0, 252); +// llmnr ipv6 is FF02:0:0:0:0:0:1:3 +// lwip-v2's igmp_joingroup only supports IPv4 +#define LLMNR_MULTICAST_ADDR 224, 0, 0, 252 static const int LLMNR_MULTICAST_TTL = 1; static const int LLMNR_PORT = 5355; @@ -109,21 +111,20 @@ bool LLMNRResponder::_restart() { _conn = 0; } - ip_addr_t multicast_addr; - multicast_addr.addr = (uint32_t)LLMNR_MULTICAST_ADDR; + IPAddress llmnr(LLMNR_MULTICAST_ADDR); - if (igmp_joingroup(IP_ADDR_ANY, &multicast_addr) != ERR_OK) + if (igmp_joingroup(IP4_ADDR_ANY4, llmnr) != ERR_OK) return false; _conn = new UdpContext; _conn->ref(); - if (!_conn->listen(*IP_ADDR_ANY, LLMNR_PORT)) + if (!_conn->listen(IP_ADDR_ANY, LLMNR_PORT)) return false; _conn->setMulticastTTL(LLMNR_MULTICAST_TTL); _conn->onRx(std::bind(&LLMNRResponder::_process_packet, this)); - _conn->connect(multicast_addr, LLMNR_PORT); + _conn->connect(llmnr, LLMNR_PORT); return true; } @@ -229,15 +230,16 @@ void LLMNRResponder::_process_packet() { Serial.println("(no matching RRs)"); #endif - ip_addr_t remote_ip; - remote_ip.addr = _conn->getRemoteAddress(); + IPAddress remote_ip = _conn->getRemoteAddress(); struct ip_info ip_info; bool match_ap = false; if (wifi_get_opmode() & SOFTAP_MODE) { wifi_get_ip_info(SOFTAP_IF, &ip_info); - if (ip_info.ip.addr && ip_addr_netcmp(&remote_ip, &ip_info.ip, &ip_info.netmask)) - match_ap = true; + IPAddress infoIp(ip_info.ip); + IPAddress infoMask(ip_info.netmask); + if (ip_info.ip.addr && ip_addr_netcmp((const ip_addr_t*)remote_ip, (const ip_addr_t*)infoIp, ip_2_ip4((const ip_addr_t*)infoMask))) + match_ap = true; } if (!match_ap) wifi_get_ip_info(STATION_IF, &ip_info); @@ -277,7 +279,7 @@ void LLMNRResponder::_process_packet() { _conn->append(reinterpret_cast(rr), sizeof(rr)); } _conn->setMulticastInterface(remote_ip); - _conn->send(&remote_ip, _conn->getRemotePort()); + _conn->send(remote_ip, _conn->getRemotePort()); } #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_LLMNR) diff --git a/libraries/ESP8266NetBIOS/ESP8266NetBIOS.cpp b/libraries/ESP8266NetBIOS/ESP8266NetBIOS.cpp old mode 100755 new mode 100644 index 896e031fdd..0174e450a8 --- a/libraries/ESP8266NetBIOS/ESP8266NetBIOS.cpp +++ b/libraries/ESP8266NetBIOS/ESP8266NetBIOS.cpp @@ -174,11 +174,7 @@ void ESP8266NetBIOS::end() } } -#if LWIP_VERSION_MAJOR == 1 -void ESP8266NetBIOS::_recv(udp_pcb *upcb, pbuf *pb, ip_addr_t *addr, uint16_t port) -#else -void ESP8266NetBIOS::_recv(udp_pcb *upcb, pbuf *pb, const ip_addr_t *addr, uint16_t port) -#endif +void ESP8266NetBIOS::_recv(udp_pcb *upcb, pbuf *pb, CONST ip_addr_t *addr, uint16_t port) { (void)upcb; (void)addr; @@ -269,11 +265,7 @@ void ESP8266NetBIOS::_recv(udp_pcb *upcb, pbuf *pb, const ip_addr_t *addr, uint1 } } -#if LWIP_VERSION_MAJOR == 1 -void ESP8266NetBIOS::_s_recv(void *arg, udp_pcb *upcb, pbuf *p, struct ip_addr *addr, uint16_t port) -#else -void ESP8266NetBIOS::_s_recv(void *arg, udp_pcb *upcb, pbuf *p, const ip_addr_t *addr, uint16_t port) -#endif +void ESP8266NetBIOS::_s_recv(void *arg, udp_pcb *upcb, pbuf *p, CONST ip_addr_t *addr, uint16_t port) { reinterpret_cast(arg)->_recv(upcb, p, addr, port); } diff --git a/libraries/ESP8266NetBIOS/ESP8266NetBIOS.h b/libraries/ESP8266NetBIOS/ESP8266NetBIOS.h old mode 100755 new mode 100644 index 1c5b1d9699..1ce8f79ccb --- a/libraries/ESP8266NetBIOS/ESP8266NetBIOS.h +++ b/libraries/ESP8266NetBIOS/ESP8266NetBIOS.h @@ -28,13 +28,9 @@ class ESP8266NetBIOS void _getnbname(char *nbname, char *name, uint8_t maxlen); void _makenbname(char *name, char *nbname, uint8_t outlen); -#if LWIP_VERSION_MAJOR == 1 - void _recv(udp_pcb *upcb, pbuf *pb, struct ip_addr *addr, uint16_t port); - static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, struct ip_addr *addr, uint16_t port); -#else - void _recv(udp_pcb *upcb, pbuf *pb, const ip_addr_t *addr, uint16_t port); - static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, const ip_addr_t *addr, uint16_t port); -#endif + void _recv(udp_pcb *upcb, pbuf *pb, CONST ip_addr_t *addr, uint16_t port); + static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, CONST ip_addr_t *addr, uint16_t port); + public: ESP8266NetBIOS(); ~ESP8266NetBIOS(); diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.cpp b/libraries/ESP8266SSDP/ESP8266SSDP.cpp index 66c2ac9489..06843b1199 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.cpp +++ b/libraries/ESP8266SSDP/ESP8266SSDP.cpp @@ -53,7 +53,10 @@ extern "C" { #define SSDP_URI_SIZE 2 #define SSDP_BUFFER_SIZE 64 #define SSDP_MULTICAST_TTL 2 -static const IPAddress SSDP_MULTICAST_ADDR(239, 255, 255, 250); + +// ssdp ipv6 is FF05::C +// lwip-v2's igmp_joingroup only supports IPv4 +#define SSDP_MULTICAST_ADDR 239, 255, 255, 250 static const char _ssdp_response_template[] PROGMEM = "HTTP/1.1 200 OK\r\n" @@ -172,23 +175,22 @@ bool SSDPClass::begin() { _server = new UdpContext; _server->ref(); - ip_addr_t ifaddr; - ifaddr.addr = WiFi.localIP(); - ip_addr_t multicast_addr; - multicast_addr.addr = (uint32_t) SSDP_MULTICAST_ADDR; - if (igmp_joingroup(&ifaddr, &multicast_addr) != ERR_OK ) { + IPAddress local = WiFi.localIP(); + IPAddress mcast(SSDP_MULTICAST_ADDR); + + if (igmp_joingroup(local, mcast) != ERR_OK ) { DEBUGV("SSDP failed to join igmp group"); return false; } - if (!_server->listen(*IP_ADDR_ANY, SSDP_PORT)) { + if (!_server->listen(IP_ADDR_ANY, SSDP_PORT)) { return false; } - _server->setMulticastInterface(ifaddr); + _server->setMulticastInterface(local); _server->setMulticastTTL(_ttl); _server->onRx(std::bind(&SSDPClass::_update, this)); - if (!_server->connect(multicast_addr, SSDP_PORT)) { + if (!_server->connect(mcast, SSDP_PORT)) { return false; } @@ -209,7 +211,7 @@ void SSDPClass::_send(ssdp_method_t method) { valueBuffer, SSDP_INTERVAL, _modelName, - _modelNumber, + _modelNumber, _uuid, (method == NONE) ? "ST" : "NT", _deviceType, @@ -218,28 +220,28 @@ void SSDPClass::_send(ssdp_method_t method) { _server->append(buffer, len); - ip_addr_t remoteAddr; + IPAddress remoteAddr; uint16_t remotePort; if (method == NONE) { - remoteAddr.addr = _respondToAddr; + remoteAddr = _respondToAddr; remotePort = _respondToPort; #ifdef DEBUG_SSDP DEBUG_SSDP.print("Sending Response to "); #endif } else { - remoteAddr.addr = SSDP_MULTICAST_ADDR; + remoteAddr = IPAddress(SSDP_MULTICAST_ADDR); remotePort = SSDP_PORT; #ifdef DEBUG_SSDP DEBUG_SSDP.println("Sending Notify to "); #endif } #ifdef DEBUG_SSDP - DEBUG_SSDP.print(IPAddress(remoteAddr.addr)); + DEBUG_SSDP.print(IPAddress(remoteAddr)); DEBUG_SSDP.print(":"); DEBUG_SSDP.println(remotePort); #endif - _server->send(&remoteAddr, remotePort); + _server->send(remoteAddr, remotePort); } void SSDPClass::schema(WiFiClient client) { diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp index 9d1ba5ea09..e93ff7b247 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiAP.cpp @@ -201,10 +201,19 @@ bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPA } bool ret = true; + if ( !local_ip.isV4() + || !subnet.isV4() +#if LWIP_IPV6 + // uninitialized gateway is valid + || gateway.isV6() +#endif + ) { + return false; + } struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); + info.ip.addr = local_ip.v4(); + info.gw.addr = gateway.v4(); + info.netmask.addr = subnet.v4(); if(!wifi_softap_dhcps_stop()) { DEBUG_WIFI("[APConfig] wifi_softap_dhcps_stop failed!\n"); @@ -218,11 +227,11 @@ bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPA struct dhcps_lease dhcp_lease; IPAddress ip = local_ip; ip[3] += 99; - dhcp_lease.start_ip.addr = static_cast(ip); + dhcp_lease.start_ip.addr = ip.v4(); DEBUG_WIFI("[APConfig] DHCP IP start: %s\n", ip.toString().c_str()); ip[3] += 100; - dhcp_lease.end_ip.addr = static_cast(ip); + dhcp_lease.end_ip.addr = ip.v4(); DEBUG_WIFI("[APConfig] DHCP IP end: %s\n", ip.toString().c_str()); if(!wifi_softap_set_dhcps_lease(&dhcp_lease)) { @@ -252,7 +261,7 @@ bool ESP8266WiFiAPClass::softAPConfig(IPAddress local_ip, IPAddress gateway, IPA if(info.ip.addr == 0x00000000) { DEBUG_WIFI("[APConfig] IP config Invalid?!\n"); ret = false; - } else if(local_ip != info.ip.addr) { + } else if(local_ip.v4() != info.ip.addr) { ip = info.ip.addr; DEBUG_WIFI("[APConfig] IP config not set correct?! new IP: %s\n", ip.toString().c_str()); ret = false; diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp index 631aa381d2..2e3f4043c9 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp @@ -510,11 +510,7 @@ bool ESP8266WiFiGenericClass::isSleepLevelMax () { // ------------------------------------------------ Generic Network function --------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- -#if LWIP_VERSION_MAJOR == 1 -void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg); -#else -void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg); -#endif +void wifi_dns_found_callback(const char *name, CONST ip_addr_t *ipaddr, void *callback_arg); static bool _dns_lookup_pending = false; @@ -545,13 +541,13 @@ int ESP8266WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResul DEBUG_WIFI_GENERIC("[hostByName] request IP for: %s\n", aHostname); err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult); if(err == ERR_OK) { - aResult = addr.addr; + aResult = IPAddress(&addr); } else if(err == ERR_INPROGRESS) { _dns_lookup_pending = true; delay(timeout_ms); _dns_lookup_pending = false; // will return here when dns_found_callback fires - if(aResult != 0) { + if(aResult.isSet()) { err = ERR_OK; } } @@ -571,18 +567,14 @@ int ESP8266WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResul * @param ipaddr * @param callback_arg */ -#if LWIP_VERSION_MAJOR == 1 -void wifi_dns_found_callback(const char *name, ip_addr_t *ipaddr, void *callback_arg) -#else -void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg) -#endif +void wifi_dns_found_callback(const char *name, CONST ip_addr_t *ipaddr, void *callback_arg) { (void) name; if (!_dns_lookup_pending) { return; } if(ipaddr) { - (*reinterpret_cast(callback_arg)) = ipaddr->addr; + (*reinterpret_cast(callback_arg)) = IPAddress(ipaddr); } esp_schedule(); // resume the hostByName function } diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp index c172b2f3f3..ba6a5eb65a 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiSTA.cpp @@ -38,6 +38,9 @@ extern "C" { #include "lwip/err.h" #include "lwip/dns.h" #include "lwip/init.h" // LWIP_VERSION_ +#if LWIP_IPV6 +#include "lwip/netif.h" // struct netif +#endif } #include "debug.h" @@ -117,7 +120,7 @@ wl_status_t ESP8266WiFiSTAClass::begin(const char* ssid, const char *passphrase, struct station_config conf; strcpy(reinterpret_cast(conf.ssid), ssid); - + conf.threshold.authmode = AUTH_OPEN; if(passphrase) { @@ -244,15 +247,20 @@ bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress arg1, IPAddress a dns1 = arg1; } + // check whether all is IPv4 (or gateway not set) + if (!(local_ip.isV4() && subnet.isV4() && (!gateway.isSet() || gateway.isV4()))) { + return false; + } + //ip and gateway must be in the same subnet - if((local_ip & subnet) != (gateway & subnet)) { + if((local_ip.v4() & subnet.v4()) != (gateway.v4() & subnet.v4())) { return false; } struct ip_info info; - info.ip.addr = static_cast(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); + info.ip.addr = local_ip.v4(); + info.gw.addr = gateway.v4(); + info.netmask.addr = subnet.v4(); wifi_station_dhcpc_stop(); if(wifi_set_ip_info(STATION_IF, &info)) { @@ -260,18 +268,15 @@ bool ESP8266WiFiSTAClass::config(IPAddress local_ip, IPAddress arg1, IPAddress a } else { return false; } - ip_addr_t d; - if(dns1 != (uint32_t)0x00000000) { + if(dns1.isSet()) { // Set DNS1-Server - d.addr = static_cast(dns1); - dns_setserver(0, &d); + dns_setserver(0, dns1); } - if(dns2 != (uint32_t)0x00000000) { + if(dns2.isSet()) { // Set DNS2-Server - d.addr = static_cast(dns2); - dns_setserver(1, &d); + dns_setserver(1, dns2); } return true; @@ -392,7 +397,6 @@ IPAddress ESP8266WiFiSTAClass::localIP() { return IPAddress(ip.ip.addr); } - /** * Get the station interface MAC address. * @param mac pointer to uint8_t array with length WL_MAC_ADDR_LENGTH @@ -446,8 +450,7 @@ IPAddress ESP8266WiFiSTAClass::dnsIP(uint8_t dns_no) { ip_addr_t dns_ip = dns_getserver(dns_no); return IPAddress(dns_ip.addr); #else - const ip_addr_t* dns_ip = dns_getserver(dns_no); - return IPAddress(dns_ip->addr); + return IPAddress(dns_getserver(dns_no)); #endif } diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 5ee6261b32..39bbb85088 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -137,22 +137,19 @@ int WiFiClient::connect(const String& host, uint16_t port) return connect(host.c_str(), port); } -int WiFiClient::connect(IPAddress ip, uint16_t port) +int WiFiClient::connect(CONST IPAddress& ip, uint16_t port) { - ip_addr_t addr; - addr.addr = ip; - if (_client) { stop(); _client->unref(); _client = nullptr; } +#if LWIP_VERSION_MAJOR == 1 // if the default interface is down, tcp_connect exits early without // ever calling tcp_err // http://lists.gnu.org/archive/html/lwip-devel/2010-05/msg00001.html -#if LWIP_VERSION_MAJOR == 1 - netif* interface = ip_route(&addr); + netif* interface = ip_route(ip); if (!interface) { DEBUGV("no route to host\r\n"); return 0; @@ -170,7 +167,7 @@ int WiFiClient::connect(IPAddress ip, uint16_t port) _client = new ClientContext(pcb, nullptr, nullptr); _client->ref(); _client->setTimeout(_timeout); - int res = _client->connect(&addr, port); + int res = _client->connect(ip, port); if (res == 0) { _client->unref(); _client = nullptr; diff --git a/libraries/ESP8266WiFi/src/WiFiClient.h b/libraries/ESP8266WiFi/src/WiFiClient.h index 9bffc56792..cd83fcbcbd 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.h +++ b/libraries/ESP8266WiFi/src/WiFiClient.h @@ -53,7 +53,7 @@ class WiFiClient : public Client, public SList { WiFiClient& operator=(const WiFiClient&); uint8_t status(); - virtual int connect(IPAddress ip, uint16_t port); + virtual int connect(CONST IPAddress& ip, uint16_t port); virtual int connect(const char *host, uint16_t port); virtual int connect(const String& host, uint16_t port); virtual size_t write(uint8_t); diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp index b47d7c21e6..84be20b53a 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.cpp @@ -95,7 +95,7 @@ WiFiClientSecure::WiFiClientSecure(ClientContext* client, bool usePMEM, _ssl->connectServer(client, _timeout); } -int WiFiClientSecure::connect(IPAddress ip, uint16_t port) +int WiFiClientSecure::connect(CONST IPAddress& ip, uint16_t port) { if (!WiFiClient::connect(ip, port)) { return 0; diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.h b/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.h index bf653b1140..d7fa94e807 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.h +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureAxTLS.h @@ -35,7 +35,7 @@ class WiFiClientSecure : public WiFiClient { WiFiClientSecure(); ~WiFiClientSecure() override; - int connect(IPAddress ip, uint16_t port) override; + int connect(CONST IPAddress& ip, uint16_t port) override; int connect(const String& host, uint16_t port) override; int connect(const char* name, uint16_t port) override; diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp index fb180e5955..dd65c8714c 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp @@ -200,7 +200,7 @@ bool WiFiClientSecure::flush(unsigned int maxWaitMs) { return WiFiClient::flush(maxWaitMs); } -int WiFiClientSecure::connect(IPAddress ip, uint16_t port) { +int WiFiClientSecure::connect(CONST IPAddress& ip, uint16_t port) { if (!WiFiClient::connect(ip, port)) { return 0; } diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h index 028af0a855..43117cf099 100644 --- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h +++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.h @@ -36,7 +36,7 @@ class WiFiClientSecure : public WiFiClient { WiFiClientSecure(); ~WiFiClientSecure() override; - int connect(IPAddress ip, uint16_t port) override; + int connect(CONST IPAddress& ip, uint16_t port) override; int connect(const String& host, uint16_t port) override; int connect(const char* name, uint16_t port) override; diff --git a/libraries/ESP8266WiFi/src/WiFiServer.cpp b/libraries/ESP8266WiFi/src/WiFiServer.cpp index 9e63da5054..d9d47657df 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.cpp +++ b/libraries/ESP8266WiFi/src/WiFiServer.cpp @@ -37,7 +37,7 @@ extern "C" { #include "lwip/inet.h" #include -WiFiServer::WiFiServer(IPAddress addr, uint16_t port) +WiFiServer::WiFiServer(const IPAddress& addr, uint16_t port) : _port(port) , _addr(addr) , _pcb(nullptr) @@ -48,7 +48,7 @@ WiFiServer::WiFiServer(IPAddress addr, uint16_t port) WiFiServer::WiFiServer(uint16_t port) : _port(port) -, _addr((uint32_t) IPADDR_ANY) +, _addr(IP_ANY_TYPE) , _pcb(nullptr) , _unclaimed(nullptr) , _discarded(nullptr) @@ -61,16 +61,16 @@ void WiFiServer::begin() { void WiFiServer::begin(uint16_t port) { close(); - _port = port; + _port = port; err_t err; tcp_pcb* pcb = tcp_new(); if (!pcb) return; - ip_addr_t local_addr; - local_addr.addr = (uint32_t) _addr; pcb->so_options |= SOF_REUSEADDR; - err = tcp_bind(pcb, &local_addr, _port); + + // (IPAddress _addr) operator-converted to (const ip_addr_t*) + err = tcp_bind(pcb, _addr, _port); if (err != ERR_OK) { tcp_close(pcb); diff --git a/libraries/ESP8266WiFi/src/WiFiServer.h b/libraries/ESP8266WiFi/src/WiFiServer.h index 95e7e5a904..81f2e9ab44 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.h +++ b/libraries/ESP8266WiFi/src/WiFiServer.h @@ -46,7 +46,7 @@ class WiFiServer : public Server { enum { _ndDefault, _ndFalse, _ndTrue } _noDelay = _ndDefault; public: - WiFiServer(IPAddress addr, uint16_t port); + WiFiServer(const IPAddress& addr, uint16_t port); WiFiServer(uint16_t port); virtual ~WiFiServer() {} WiFiClient available(uint8_t* status = NULL); diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.cpp b/libraries/ESP8266WiFi/src/WiFiUdp.cpp index 9be50c1342..b2c9beefae 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.cpp +++ b/libraries/ESP8266WiFi/src/WiFiUdp.cpp @@ -40,7 +40,6 @@ extern "C" #include "lwip/mem.h" #include - template<> WiFiUDP* SList::_s_first = 0; @@ -83,9 +82,7 @@ uint8_t WiFiUDP::begin(uint16_t port) _ctx = new UdpContext; _ctx->ref(); - ip_addr_t addr; - addr.addr = INADDR_ANY; - return (_ctx->listen(addr, port)) ? 1 : 0; + return (_ctx->listen(IPAddress(), port)) ? 1 : 0; } uint8_t WiFiUDP::beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port) @@ -95,20 +92,14 @@ uint8_t WiFiUDP::beginMulticast(IPAddress interfaceAddr, IPAddress multicast, ui _ctx = 0; } - ip_addr_t ifaddr; - ifaddr.addr = (uint32_t) interfaceAddr; - ip_addr_t multicast_addr; - multicast_addr.addr = (uint32_t) multicast; - - if (igmp_joingroup(&ifaddr, &multicast_addr)!= ERR_OK) { + if (igmp_joingroup(interfaceAddr, multicast)!= ERR_OK) { return 0; } _ctx = new UdpContext; _ctx->ref(); - ip_addr_t addr; - addr.addr = INADDR_ANY; - if (!_ctx->listen(addr, port)) { + ip_addr_t addr = IPADDR4_INIT(INADDR_ANY); + if (!_ctx->listen(&addr, port)) { return 0; } @@ -155,32 +146,24 @@ int WiFiUDP::beginPacket(const char *host, uint16_t port) int WiFiUDP::beginPacket(IPAddress ip, uint16_t port) { - ip_addr_t addr; - addr.addr = ip; - if (!_ctx) { _ctx = new UdpContext; _ctx->ref(); } - return (_ctx->connect(addr, port)) ? 1 : 0; + return (_ctx->connect(ip, port)) ? 1 : 0; } int WiFiUDP::beginPacketMulticast(IPAddress multicastAddress, uint16_t port, IPAddress interfaceAddress, int ttl) { - ip_addr_t mcastAddr; - mcastAddr.addr = multicastAddress; - ip_addr_t ifaceAddr; - ifaceAddr.addr = interfaceAddress; - if (!_ctx) { _ctx = new UdpContext; _ctx->ref(); } - if (!_ctx->connect(mcastAddr, port)) { + if (!_ctx->connect(multicastAddress, port)) { return 0; } - _ctx->setMulticastInterface(ifaceAddr); + _ctx->setMulticastInterface(interfaceAddress); _ctx->setMulticastTTL(ttl); return 1; } @@ -248,15 +231,15 @@ void WiFiUDP::flush() endPacket(); } -IPAddress WiFiUDP::remoteIP() +IPAddress WiFiUDP::remoteIP() const { if (!_ctx) - return IPAddress(0U); + return IPNoAddress; - return IPAddress(_ctx->getRemoteAddress()); + return _ctx->getRemoteAddress(); } -uint16_t WiFiUDP::remotePort() +uint16_t WiFiUDP::remotePort() const { if (!_ctx) return 0; @@ -264,18 +247,15 @@ uint16_t WiFiUDP::remotePort() return _ctx->getRemotePort(); } -IPAddress WiFiUDP::destinationIP() +IPAddress WiFiUDP::destinationIP() const { - IPAddress addr; - if (!_ctx) - return addr; + return IPNoAddress; - addr = _ctx->getDestAddress(); - return addr; + return _ctx->getDestAddress(); } -uint16_t WiFiUDP::localPort() +uint16_t WiFiUDP::localPort() const { if (!_ctx) return 0; diff --git a/libraries/ESP8266WiFi/src/WiFiUdp.h b/libraries/ESP8266WiFi/src/WiFiUdp.h index 011de2e64f..b336a47480 100644 --- a/libraries/ESP8266WiFi/src/WiFiUdp.h +++ b/libraries/ESP8266WiFi/src/WiFiUdp.h @@ -47,7 +47,7 @@ class WiFiUDP : public UDP, public SList { // Finish with the UDP connetion virtual void stop(); // join a multicast group and listen on the given port - uint8_t beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port); + uint8_t beginMulticast(IPAddress interfaceAddr, IPAddress multicast, uint16_t port); // Sending UDP packets @@ -63,9 +63,9 @@ class WiFiUDP : public UDP, public SList { // use WiFi.localIP() or WiFi.softAPIP() depending on the interface you need // ttl - multicast packet TTL (default is 1) // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port - virtual int beginPacketMulticast(IPAddress multicastAddress, + virtual int beginPacketMulticast(IPAddress multicastAddress, uint16_t port, - IPAddress interfaceAddress, + IPAddress interfaceAddress, int ttl = 1); // Finish off this packet and send it // Returns 1 if the packet was sent successfully, 0 if there was an error @@ -95,14 +95,14 @@ class WiFiUDP : public UDP, public SList { virtual void flush(); // Finish reading the current packet // Return the IP address of the host who sent the current incoming packet - virtual IPAddress remoteIP(); + virtual IPAddress remoteIP() const; // Return the port of the host who sent the current incoming packet - virtual uint16_t remotePort(); + virtual uint16_t remotePort() const; // Return the destination address for incoming packets, // useful to distinguish multicast and ordinary packets - IPAddress destinationIP(); + IPAddress destinationIP() const; // Return the local port for outgoing packets - uint16_t localPort(); + uint16_t localPort() const; static void stopAll(); static void stopAllExcept(WiFiUDP * exC); diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h index 01ac0ff6a8..5be690f247 100644 --- a/libraries/ESP8266WiFi/src/include/ClientContext.h +++ b/libraries/ESP8266WiFi/src/include/ClientContext.h @@ -122,7 +122,7 @@ class ClientContext } } - int connect(ip_addr_t* addr, uint16_t port) + int connect(CONST ip_addr_t* addr, uint16_t port) { err_t err = tcp_connect(_pcb, addr, port, &ClientContext::_s_connected); if (err != ERR_OK) { @@ -145,7 +145,7 @@ class ClientContext return 1; } - size_t availableForWrite() + size_t availableForWrite() const { return _pcb? tcp_sndbuf(_pcb): 0; } @@ -180,13 +180,13 @@ class ClientContext return _timeout_ms; } - uint32_t getRemoteAddress() const + const ip_addr_t* getRemoteAddress() const { if(!_pcb) { return 0; } - return _pcb->remote_ip.addr; + return &_pcb->remote_ip; } uint16_t getRemotePort() const @@ -198,13 +198,13 @@ class ClientContext return _pcb->remote_port; } - uint32_t getLocalAddress() const + const ip_addr_t* getLocalAddress() const { if(!_pcb) { return 0; } - return _pcb->local_ip.addr; + return &_pcb->local_ip; } uint16_t getLocalPort() const diff --git a/libraries/ESP8266WiFi/src/include/UdpContext.h b/libraries/ESP8266WiFi/src/include/UdpContext.h index 6503affad0..65d429c34e 100644 --- a/libraries/ESP8266WiFi/src/include/UdpContext.h +++ b/libraries/ESP8266WiFi/src/include/UdpContext.h @@ -30,9 +30,7 @@ void esp_schedule(); #include } - -#define GET_IP_HDR(pb) reinterpret_cast(((uint8_t*)((pb)->payload)) - UDP_HLEN - IP_HLEN); -#define GET_UDP_HDR(pb) reinterpret_cast(((uint8_t*)((pb)->payload)) - UDP_HLEN); +#define GET_UDP_HDR(pb) (reinterpret_cast(((uint8_t*)((pb)->payload)) - UDP_HLEN)) class UdpContext { @@ -90,17 +88,17 @@ class UdpContext } } - bool connect(ip_addr_t addr, uint16_t port) + bool connect(const ip_addr_t* addr, uint16_t port) { - ip_addr_copy(_pcb->remote_ip, addr); + _pcb->remote_ip = *addr; _pcb->remote_port = port; return true; } - bool listen(ip_addr_t addr, uint16_t port) + bool listen(CONST ip_addr_t* addr, uint16_t port) { udp_recv(_pcb, &_s_recv, (void *) this); - err_t err = udp_bind(_pcb, &addr, port); + err_t err = udp_bind(_pcb, addr, port); return err == ERR_OK; } @@ -110,14 +108,14 @@ class UdpContext } #if LWIP_VERSION_MAJOR == 1 - void setMulticastInterface(ip_addr_t addr) + void setMulticastInterface(const ip_addr_t addr) { udp_set_multicast_netif_addr(_pcb, addr); } #else - void setMulticastInterface(const ip_addr_t& addr) + void setMulticastInterface(const ip_addr_t* addr) { - udp_set_multicast_netif_addr(_pcb, &addr); + udp_set_multicast_netif_addr(_pcb, ip_2_ip4(addr)); } #endif @@ -159,16 +157,12 @@ class UdpContext return (pos <= _rx_buf->len); } - uint32_t getRemoteAddress() + CONST IPAddress& getRemoteAddress() CONST { - if (!_rx_buf) - return 0; - - ip_hdr* iphdr = GET_IP_HDR(_rx_buf); - return iphdr->src.addr; + return _src_addr; } - uint16_t getRemotePort() + uint16_t getRemotePort() const { if (!_rx_buf) return 0; @@ -177,20 +171,15 @@ class UdpContext return lwip_ntohs(udphdr->src); } - uint32_t getDestAddress() + const IPAddress& getDestAddress() const { - if (!_rx_buf) - return 0; - - ip_hdr* iphdr = GET_IP_HDR(_rx_buf); - return iphdr->dest.addr; + return _dst_addr; } - uint16_t getLocalPort() + uint16_t getLocalPort() const { if (!_pcb) return 0; - return _pcb->local_port; } @@ -242,7 +231,7 @@ class UdpContext return size; } - int peek() + int peek() const { if (!_rx_buf || _rx_buf_offset == _rx_buf->len) return -1; @@ -259,7 +248,6 @@ class UdpContext _consume(_rx_buf->len - _rx_buf_offset); } - size_t append(const char* data, size_t size) { if (!_tx_buf_head || _tx_buf_head->tot_len < _tx_buf_offset + size) @@ -292,7 +280,7 @@ class UdpContext return size; } - bool send(ip_addr_t* addr = 0, uint16_t port = 0) + bool send(CONST ip_addr_t* addr = 0, uint16_t port = 0) { size_t data_size = _tx_buf_offset; pbuf* tx_copy = pbuf_alloc(PBUF_TRANSPORT, data_size, PBUF_RAM); @@ -403,21 +391,33 @@ class UdpContext _rx_buf = pb; _rx_buf_offset = 0; } + + // --> Arduino's UDP is a stream but UDP is not <-- + // When IPv6 is enabled, we store addresses from here + // because lwIP's macro are valid only in this callback + // (there's no easy way to safely guess whether packet + // is from v4 or v6 when we have only access to payload) + // Because of this stream-ed way this is inacurate when + // user does not swallow data quickly enough (the former + // IPv4-only way suffers from the exact same issue. + +#if LWIP_VERSION_MAJOR == 1 + _src_addr = current_iphdr_src; + _dst_addr = current_iphdr_dest; +#else + _src_addr = ip_data.current_iphdr_src; + _dst_addr = ip_data.current_iphdr_dest; +#endif + if (_on_rx) { _on_rx(); } } -#if LWIP_VERSION_MAJOR == 1 static void _s_recv(void *arg, udp_pcb *upcb, pbuf *p, - ip_addr_t *addr, u16_t port) -#else - static void _s_recv(void *arg, - udp_pcb *upcb, pbuf *p, - const ip_addr_t *addr, u16_t port) -#endif + CONST ip_addr_t *addr, u16_t port) { reinterpret_cast(arg)->_recv(upcb, p, addr, port); } @@ -435,6 +435,7 @@ class UdpContext #ifdef LWIP_MAYBE_XCC uint16_t _mcast_ttl; #endif + IPAddress _src_addr, _dst_addr; }; diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.cpp b/libraries/ESP8266mDNS/ESP8266mDNS.cpp index 9662b8bb8e..1f4613ef35 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.cpp +++ b/libraries/ESP8266mDNS/ESP8266mDNS.cpp @@ -192,22 +192,22 @@ bool MDNSResponder::_listen() { #ifdef DEBUG_ESP_MDNS_RX DEBUG_ESP_PORT.println("MDNS listening"); #endif - ip_addr_t multicast_addr; - multicast_addr.addr = (uint32_t) MDNS_MULTICAST_ADDR; - if (igmp_joingroup(IP_ADDR_ANY, &multicast_addr)!= ERR_OK) { + IPAddress mdns(MDNS_MULTICAST_ADDR); + + if (igmp_joingroup(IP4_ADDR_ANY4, mdns)!= ERR_OK) { return false; } _conn = new UdpContext; _conn->ref(); - if (!_conn->listen(*IP_ADDR_ANY, MDNS_PORT)) { + if (!_conn->listen(IP_ADDR_ANY, MDNS_PORT)) { return false; } _conn->setMulticastTTL(MDNS_MULTICAST_TTL); _conn->onRx(std::bind(&MDNSResponder::update, this)); - _conn->connect(multicast_addr, MDNS_PORT); + _conn->connect(mdns, MDNS_PORT); } return true; } @@ -332,13 +332,11 @@ int MDNSResponder::queryService(char *service, char *proto) { _waitingForAnswers = true; for (int itfn = 0; itfn < 2; itfn++) { struct ip_info ip_info; - ip_addr_t ifaddr; wifi_get_ip_info((!itfn) ? SOFTAP_IF : STATION_IF, &ip_info); if (!ip_info.ip.addr) continue; - ifaddr.addr = ip_info.ip.addr; - _conn->setMulticastInterface(ifaddr); + _conn->setMulticastInterface(IPAddress(ip_info.ip.addr)); // Write the header _conn->flush(); @@ -464,10 +462,11 @@ IPAddress MDNSResponder::_getRequestMulticastInterface(){ struct ip_info ip_info; bool match_ap = false; if (wifi_get_opmode() & SOFTAP_MODE) { - struct ip_info remote_ip_info; - remote_ip_info.ip.addr = _conn->getRemoteAddress(); + const IPAddress& remote_ip = _conn->getRemoteAddress(); wifi_get_ip_info(SOFTAP_IF, &ip_info); - if (ip_info.ip.addr && ip_addr_netcmp(&remote_ip_info.ip, &ip_info.ip, &ip_info.netmask)) + IPAddress infoIp(ip_info.ip); + IPAddress infoMask(ip_info.netmask); + if (ip_info.ip.addr && ip_addr_netcmp((const ip_addr_t*)remote_ip, (const ip_addr_t*)infoIp, ip_2_ip4((const ip_addr_t*)infoMask))) match_ap = true; } if (!match_ap) @@ -1056,9 +1055,7 @@ void MDNSResponder::_replyToTypeEnumRequest(IPAddress multicastInterface) { _conn->append(reinterpret_cast(localName), localNameLen); // "local" _conn->append(reinterpret_cast(&terminator), 1); // terminator - ip_addr_t ifaddr; - ifaddr.addr = multicastInterface; - _conn->setMulticastInterface(ifaddr); + _conn->setMulticastInterface(multicastInterface); _conn->send(); } } @@ -1263,9 +1260,7 @@ void MDNSResponder::_replyToInstanceRequest(uint8_t questionMask, uint8_t respon } } - ip_addr_t ifaddr; - ifaddr.addr = multicastInterface; - _conn->setMulticastInterface(ifaddr); + _conn->setMulticastInterface(multicastInterface); _conn->send(); } diff --git a/libraries/Ethernet/src/Dns.cpp b/libraries/Ethernet/src/Dns.cpp index db74b01f50..365058fc6d 100644 --- a/libraries/Ethernet/src/Dns.cpp +++ b/libraries/Ethernet/src/Dns.cpp @@ -127,7 +127,7 @@ int DNSClient::getHostByName(const char* aHostname, IPAddress& aResult) } // Check we've got a valid DNS server to use - if (iDNSServer == INADDR_NONE) + if (iDNSServer == IPNoAddress) { return INVALID_SERVER; } diff --git a/libraries/Ethernet/src/EthernetClient.cpp b/libraries/Ethernet/src/EthernetClient.cpp index 7e9dc9abbd..b03e2c495a 100644 --- a/libraries/Ethernet/src/EthernetClient.cpp +++ b/libraries/Ethernet/src/EthernetClient.cpp @@ -35,7 +35,7 @@ int EthernetClient::connect(const char* host, uint16_t port) { } } -int EthernetClient::connect(IPAddress ip, uint16_t port) { +int EthernetClient::connect(CONST IPAddress& ip, uint16_t port) { if (_sock != MAX_SOCK_NUM) return 0; diff --git a/libraries/Ethernet/src/EthernetClient.h b/libraries/Ethernet/src/EthernetClient.h index ff4198ff17..0ea3f6ca0c 100644 --- a/libraries/Ethernet/src/EthernetClient.h +++ b/libraries/Ethernet/src/EthernetClient.h @@ -12,7 +12,7 @@ class EthernetClient : public Client { EthernetClient(uint8_t sock); uint8_t status(); - virtual int connect(IPAddress ip, uint16_t port); + virtual int connect(CONST IPAddress& ip, uint16_t port); virtual int connect(const char *host, uint16_t port); virtual size_t write(uint8_t); virtual size_t write(const uint8_t *buf, size_t size); diff --git a/libraries/Ethernet/src/EthernetUdp.h b/libraries/Ethernet/src/EthernetUdp.h index 1e928d88a4..d4feb41afa 100644 --- a/libraries/Ethernet/src/EthernetUdp.h +++ b/libraries/Ethernet/src/EthernetUdp.h @@ -94,9 +94,9 @@ class EthernetUDP : public UDP { virtual void flush(); // Finish reading the current packet // Return the IP address of the host who sent the current incoming packet - virtual IPAddress remoteIP() { return _remoteIP; }; + virtual IPAddress remoteIP() const { return _remoteIP; }; // Return the port of the host who sent the current incoming packet - virtual uint16_t remotePort() { return _remotePort; }; + virtual uint16_t remotePort() const { return _remotePort; }; }; #endif diff --git a/libraries/Ethernet/src/utility/socket.cpp b/libraries/Ethernet/src/utility/socket.cpp index c49a280c97..29c20ca2c2 100644 --- a/libraries/Ethernet/src/utility/socket.cpp +++ b/libraries/Ethernet/src/utility/socket.cpp @@ -75,7 +75,7 @@ uint8_t listen(SOCKET s) * * @return 1 for success else 0. */ -uint8_t connect(SOCKET s, uint8_t * addr, uint16_t port) +uint8_t connect(SOCKET s, const uint8_t * addr, uint16_t port) { if ( @@ -420,7 +420,7 @@ uint16_t bufferData(SOCKET s, uint16_t offset, const uint8_t* buf, uint16_t len) return ret; } -int startUDP(SOCKET s, uint8_t* addr, uint16_t port) +int startUDP(SOCKET s, const uint8_t* addr, uint16_t port) { if ( diff --git a/libraries/Ethernet/src/utility/socket.h b/libraries/Ethernet/src/utility/socket.h index 37ba854247..4b191e24e5 100644 --- a/libraries/Ethernet/src/utility/socket.h +++ b/libraries/Ethernet/src/utility/socket.h @@ -6,7 +6,7 @@ extern uint8_t socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag); // Opens a socket(TCP or UDP or IP_RAW mode) extern uint8_t socketStatus(SOCKET s); extern void close(SOCKET s); // Close socket -extern uint8_t connect(SOCKET s, uint8_t * addr, uint16_t port); // Establish TCP connection (Active connection) +extern uint8_t connect(SOCKET s, const uint8_t * addr, uint16_t port); // Establish TCP connection (Active connection) extern void disconnect(SOCKET s); // disconnect the connection extern uint8_t listen(SOCKET s); // Establish TCP connection (Passive connection) extern uint16_t send(SOCKET s, const uint8_t * buf, uint16_t len); // Send data (TCP) @@ -26,7 +26,7 @@ extern uint16_t igmpsend(SOCKET s, const uint8_t * buf, uint16_t len); or more calls to bufferData and then finally sent with sendUDP. @return 1 if the datagram was successfully set up, or 0 if there was an error */ -extern int startUDP(SOCKET s, uint8_t* addr, uint16_t port); +extern int startUDP(SOCKET s, const uint8_t* addr, uint16_t port); /* @brief This function copies up to len bytes of data from buf into a UDP datagram to be sent later by sendUDP. Allows datagrams to be built up from a series of bufferData calls. diff --git a/libraries/Ethernet/src/utility/util.h b/libraries/Ethernet/src/utility/util.h index 33d32a97e7..b5d9f70063 100644 --- a/libraries/Ethernet/src/utility/util.h +++ b/libraries/Ethernet/src/utility/util.h @@ -1,14 +1,24 @@ #ifndef UTIL_H #define UTIL_H +#ifndef htons #define htons(x) ( ((x)<< 8 & 0xFF00) | \ ((x)>> 8 & 0x00FF) ) +#endif + +#ifndef ntohs #define ntohs(x) htons(x) +#endif +#ifndef htonl #define htonl(x) ( ((x)<<24 & 0xFF000000UL) | \ ((x)<< 8 & 0x00FF0000UL) | \ ((x)>> 8 & 0x0000FF00UL) | \ ((x)>>24 & 0x000000FFUL) ) +#endif + +#ifndef ntohl #define ntohl(x) htonl(x) +#endif #endif diff --git a/libraries/Ethernet/src/utility/w5100.h b/libraries/Ethernet/src/utility/w5100.h index 298db414ac..6d3fa6d07f 100644 --- a/libraries/Ethernet/src/utility/w5100.h +++ b/libraries/Ethernet/src/utility/w5100.h @@ -260,7 +260,7 @@ class W5100Class { static inline uint8_t readSn(SOCKET _s, uint16_t _addr); static inline uint8_t writeSn(SOCKET _s, uint16_t _addr, uint8_t _data); static inline uint16_t readSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t len); - static inline uint16_t writeSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t len); + static inline uint16_t writeSn(SOCKET _s, uint16_t _addr, const uint8_t *_buf, uint16_t len); static const uint16_t CH_BASE = 0x0400; static const uint16_t CH_SIZE = 0x0100; @@ -286,7 +286,7 @@ class W5100Class { return res; \ } #define __SOCKET_REGISTER_N(name, address, size) \ - static uint16_t write##name(SOCKET _s, uint8_t *_buff) { \ + static uint16_t write##name(SOCKET _s, const uint8_t *_buff) { \ return writeSn(_s, address, _buff, size); \ } \ static uint16_t read##name(SOCKET _s, uint8_t *_buff) { \ @@ -371,7 +371,7 @@ uint16_t W5100Class::readSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t _ return read(CH_BASE + _s * CH_SIZE + _addr, _buf, _len); } -uint16_t W5100Class::writeSn(SOCKET _s, uint16_t _addr, uint8_t *_buf, uint16_t _len) { +uint16_t W5100Class::writeSn(SOCKET _s, uint16_t _addr, const uint8_t *_buf, uint16_t _len) { return write(CH_BASE + _s * CH_SIZE + _addr, _buf, _len); } diff --git a/libraries/esp8266/examples/IPv6/IPv6.ino b/libraries/esp8266/examples/IPv6/IPv6.ino new file mode 100644 index 0000000000..fae40460d5 --- /dev/null +++ b/libraries/esp8266/examples/IPv6/IPv6.ino @@ -0,0 +1,183 @@ + +/* + arduino IPv6 example + released to public domain + + output is like: + + SDK:2.2.1(cfd48f3)/Core:2.4.2-141-g4f97603/lwIP:IPv6+STABLE-2_1_0_RC1/glue:arduino-2.4.2-30-ga53619c/BearSSL:6d1cefc + dns0=10.43.1.254 + Try me at these addresses: + (with 'telnet or 'nc -u 23') + IF='st'(0) IPv6=0 local=0 hostname='ipv6test' addr= 10.43.1.244 / mask:255.255.255.0 / gw:10.43.1.254 + IF='st'(0) IPv6=1 local=1 hostname='ipv6test' addr= fe80::1afe:34ff:fed1:cec7 + IF='st'(0) IPV6=1 local=0 hostname='ipv6test' addr= 2xxx:xxxx:xxxx:xxxx:1afe:34ff:fed1:cec7 + resolving www.google.com: 216.58.205.100 + resolving ipv6.google.com: 2a00:1450:4002:808::200e +*/ + +#include +#include +#include +#include + +#ifndef STASSID + #define STASSID "your-ssid" + #define STAPSK "your-password" +#endif + +#define FQDN F("www.google.com") // with both IPv4 & IPv6 addresses +#define FQDN6 F("ipv6.google.com") // does not resolve in IPv4 +#define STATUSDELAY_MS 10000 +#define TCP_PORT 23 +#define UDP_PORT 23 + +WiFiServer statusServer(TCP_PORT); +WiFiUDP udp; +esp8266::polledTimeout::periodic statusPeriod(STATUSDELAY_MS); + +void fqdn(Print& out, const String& fqdn) { + out.print(F("resolving ")); + out.print(fqdn); + out.print(F(": ")); + IPAddress result; + if (WiFi.hostByName(fqdn.c_str(), result)) { + result.printTo(out); + out.println(); + } else { + out.println(F("timeout or not found")); + } +} + +void status(Print& out) { + out.println(F("------------------------------")); + out.println(ESP.getFullVersion()); + + dns_setserver(DNS_MAX_SERVERS - 1, IPAddress(8, 8, 8, 8)); + + for (int i = 0; i < DNS_MAX_SERVERS; i++) { + IPAddress dns = WiFi.dnsIP(i); + if (dns.isSet()) { + out.printf("dns%d: %s\n", i, dns.toString().c_str()); + } + } + + out.println(F("Try me at these addresses:")); + out.println(F("(with 'telnet or 'nc -u 23')")); + for (auto a : addrList) { + out.printf("IF='%s' IPv6=%d local=%d hostname='%s' addr= %s", + a->iface().c_str(), + !a->addr().isV4(), + a->addr().isLocal(), + a->hostname(), + a->addr().toString().c_str()); + + if (a->isLegacy()) { + out.printf(" / mask:%s / gw:%s", + a->netmask().toString().c_str(), + a->gw().toString().c_str()); + } + + out.println(); + } + + // lwIP's dns client will ask for IPv4 first (by default) + // an example is provided with a fqdn which does not resolve with IPv4 + fqdn(out, FQDN); + fqdn(out, FQDN6); + + out.println(F("------------------------------")); +} + +void setup() { + WiFi.hostname("ipv6test"); + + Serial.begin(115200); + Serial.println(); + Serial.println(ESP.getFullVersion()); + + WiFi.mode(WIFI_STA); + WiFi.begin(STASSID, STAPSK); + + status(Serial); + + #if 0 + + // legacy loop (still valid with IPv4 only) + + while (WiFi.status() != WL_CONNECTED) { + Serial.print('.'); + delay(500); + } + + #else + + // Use this loop instead to wait for an IPv6 routable address + + // addr->isLocal() (meaning "not routable on internet") is true with: + // - IPV4 DHCP autoconfigured address 169.254.x.x + // (false for any other including 192.168./16 and 10./24 since NAT may be in the equation) + // - IPV6 link-local addresses (fe80::/64) + + for (bool configured = false; !configured;) { + for (auto addr : addrList) + if ((configured = !addr->isLocal() + // && addr->isV6() // uncomment when IPv6 is mandatory + // && addr->ifnumber() == STATION_IF + )) { + break; + } + Serial.print('.'); + delay(500); + } + + #endif + + Serial.println(F("connected: ")); + + statusServer.begin(); + udp.begin(UDP_PORT); + + Serial.print(F("TCP server on port ")); + Serial.print(TCP_PORT); + Serial.print(F(" - UDP server on port ")); + Serial.println(UDP_PORT); + + statusPeriod.reset(); +} + +unsigned long statusTimeMs = 0; + +void loop() { + + if (statusServer.hasClient()) { + WiFiClient cli = statusServer.available(); + status(cli); + } + + // if there's data available, read a packet + int packetSize = udp.parsePacket(); + if (packetSize) { + Serial.print(F("udp received ")); + Serial.print(packetSize); + Serial.print(F(" bytes from ")); + udp.remoteIP().printTo(Serial); + Serial.print(F(" :")); + Serial.println(udp.remotePort()); + int c; + while ((c = udp.read()) >= 0) { + Serial.write(c); + } + + // send a reply, to the IP address and port that sent us the packet we received + udp.beginPacket(udp.remoteIP(), udp.remotePort()); + status(udp); + udp.endPacket(); + } + + + if (statusPeriod) { + status(Serial); + } + +} diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 82d899c7e1..24c92c596c 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -951,19 +951,27 @@ ( '.menu.ip.lm2f', 'v2 Lower Memory' ), ( '.menu.ip.lm2f.build.lwip_include', 'lwip2/include' ), ( '.menu.ip.lm2f.build.lwip_lib', '-llwip2-536-feat' ), - ( '.menu.ip.lm2f.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1' ), + ( '.menu.ip.lm2f.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0' ), ( '.menu.ip.hb2f', 'v2 Higher Bandwidth' ), ( '.menu.ip.hb2f.build.lwip_include', 'lwip2/include' ), ( '.menu.ip.hb2f.build.lwip_lib', '-llwip2-1460-feat' ), - ( '.menu.ip.hb2f.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1' ), + ( '.menu.ip.hb2f.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0' ), ( '.menu.ip.lm2n', 'v2 Lower Memory (no features)' ), ( '.menu.ip.lm2n.build.lwip_include', 'lwip2/include' ), ( '.menu.ip.lm2n.build.lwip_lib', '-llwip2-536' ), - ( '.menu.ip.lm2n.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0' ), + ( '.menu.ip.lm2n.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0' ), ( '.menu.ip.hb2n', 'v2 Higher Bandwidth (no features)' ), ( '.menu.ip.hb2n.build.lwip_include', 'lwip2/include' ), ( '.menu.ip.hb2n.build.lwip_lib', '-llwip2-1460' ), - ( '.menu.ip.hb2n.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0' ), + ( '.menu.ip.hb2n.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0' ), + ( '.menu.ip.lm6f', 'v2 IPv6 Lower Memory' ), + ( '.menu.ip.lm6f.build.lwip_include', 'lwip2/include' ), + ( '.menu.ip.lm6f.build.lwip_lib', '-llwip6-536-feat' ), + ( '.menu.ip.lm6f.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1' ), + ( '.menu.ip.hb6f', 'v2 IPv6 Higher Bandwidth' ), + ( '.menu.ip.hb6f.build.lwip_include', 'lwip2/include' ), + ( '.menu.ip.hb6f.build.lwip_lib', '-llwip6-1460-feat' ), + ( '.menu.ip.hb6f.build.lwip_flags', '-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1' ), ]), 'lwip': collections.OrderedDict([ diff --git a/tools/platformio-build.py b/tools/platformio-build.py index 51339bd074..5f62c17695 100644 --- a/tools/platformio-build.py +++ b/tools/platformio-build.py @@ -140,28 +140,40 @@ def scons_patched_match_splitext(path, suffixes=None): CPPPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lwip", "include")], LIBS=["lwip_gcc"] ) +elif "PIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_LOW_MEMORY" in flatten_cppdefines: + env.Append( + CPPDEFINES=[("TCP_MSS", 536), ("LWIP_FEATURES", 1), ("LWIP_IPV6", 1)], + CPPPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lwip2", "include")], + LIBS=["lwip6-536-feat"] + ) +elif "PIO_FRAMEWORK_ARDUINO_LWIP2_IPV6_HIGHER_BANDWIDTH" in flatten_cppdefines: + env.Append( + CPPDEFINES=[("TCP_MSS", 1460), ("LWIP_FEATURES", 1), ("LWIP_IPV6", 1)], + CPPPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lwip2", "include")], + LIBS=["lwip6-1460-feat"] + ) elif "PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH" in flatten_cppdefines: env.Append( - CPPDEFINES=[("TCP_MSS", 1460), ("LWIP_FEATURES", 1)], + CPPDEFINES=[("TCP_MSS", 1460), ("LWIP_FEATURES", 1), ("LWIP_IPV6", 0)], CPPPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lwip2", "include")], LIBS=["lwip2-1460-feat"] ) elif "PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY_LOW_FLASH" in flatten_cppdefines: env.Append( - CPPDEFINES=[("TCP_MSS", 536), ("LWIP_FEATURES", 0)], + CPPDEFINES=[("TCP_MSS", 536), ("LWIP_FEATURES", 0), ("LWIP_IPV6", 0)], CPPPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lwip2", "include")], LIBS=["lwip2-536"] ) elif "PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH" in flatten_cppdefines: env.Append( - CPPDEFINES=[("TCP_MSS", 1460), ("LWIP_FEATURES", 0)], + CPPDEFINES=[("TCP_MSS", 1460), ("LWIP_FEATURES", 0), ("LWIP_IPV6", 0)], CPPPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lwip2", "include")], LIBS=["lwip2-1460"] ) # PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY (default) else: env.Append( - CPPDEFINES=[("TCP_MSS", 536), ("LWIP_FEATURES", 1)], + CPPDEFINES=[("TCP_MSS", 536), ("LWIP_FEATURES", 1), ("LWIP_IPV6", 0)], CPPPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lwip2", "include")], LIBS=["lwip2-536-feat"] ) diff --git a/tools/sdk/include/espconn.h b/tools/sdk/include/espconn.h index 0c1a81bdec..31bbf6a9b1 100644 --- a/tools/sdk/include/espconn.h +++ b/tools/sdk/include/espconn.h @@ -432,21 +432,21 @@ sint8 espconn_get_keepalive(struct espconn *espconn, uint8 level, void *optarg); * TypedefName : dns_found_callback * Description : Callback which is invoked when a hostname is found. * Parameters : name -- pointer to the name that was looked up. - * ipaddr -- pointer to an ip_addr_t containing the IP address of + * ipaddr -- pointer to an ipv4_addr_t containing the IP address of * the hostname, or NULL if the name could not be found (or on any * other error). * callback_arg -- a user-specified callback argument passed to * dns_gethostbyname *******************************************************************************/ -typedef void (*dns_found_callback)(const char *name, ip_addr_t *ipaddr, void *callback_arg); +typedef void (*dns_found_callback)(const char *name, ipv4_addr_t *ipaddr, void *callback_arg); /****************************************************************************** * FunctionName : espconn_gethostbyname * Description : Resolve a hostname (string) into an IP address. * Parameters : pespconn -- espconn to resolve a hostname * hostname -- the hostname that is to be queried - * addr -- pointer to a ip_addr_t where to store the address if + * addr -- pointer to a ipv4_addr_t where to store the address if * it is already cached in the dns_table (only valid if ESPCONN_OK * is returned!) * found -- a callback function to be called on success, failure @@ -459,7 +459,7 @@ typedef void (*dns_found_callback)(const char *name, ip_addr_t *ipaddr, void *ca * - ESPCONN_ARG: dns client not initialized or invalid hostname *******************************************************************************/ -err_t espconn_gethostbyname(struct espconn *pespconn, const char *hostname, ip_addr_t *addr, dns_found_callback found); +err_t espconn_gethostbyname(struct espconn *pespconn, const char *hostname, ipv4_addr_t *addr, dns_found_callback found); /****************************************************************************** * FunctionName : espconn_abort @@ -623,7 +623,7 @@ sint8 espconn_secure_delete(struct espconn *espconn); * multicast_ip -- multicast ip given by user * Returns : none *******************************************************************************/ -sint8 espconn_igmp_join(ip_addr_t *host_ip, ip_addr_t *multicast_ip); +sint8 espconn_igmp_join(ipv4_addr_t *host_ip, ipv4_addr_t *multicast_ip); /****************************************************************************** * FunctionName : espconn_igmp_leave @@ -632,7 +632,7 @@ sint8 espconn_igmp_join(ip_addr_t *host_ip, ip_addr_t *multicast_ip); * multicast_ip -- multicast ip given by user * Returns : none *******************************************************************************/ -sint8 espconn_igmp_leave(ip_addr_t *host_ip, ip_addr_t *multicast_ip); +sint8 espconn_igmp_leave(ipv4_addr_t *host_ip, ipv4_addr_t *multicast_ip); /****************************************************************************** * FunctionName : espconn_recv_hold @@ -738,7 +738,7 @@ void espconn_mdns_enable(void); * dnsserver -- IP address of the DNS server to set * Returns : none *******************************************************************************/ -void espconn_dns_setserver(uint8 numdns, ip_addr_t *dnsserver); +void espconn_dns_setserver(uint8 numdns, ipv4_addr_t *dnsserver); /****************************************************************************** * FunctionName : espconn_dns_getserver * Description : get dns server. @@ -746,7 +746,7 @@ void espconn_dns_setserver(uint8 numdns, ip_addr_t *dnsserver); * be < DNS_MAX_SERVERS = 2 * Returns : dnsserver -- IP address of the DNS server to set *******************************************************************************/ -ip_addr_t espconn_dns_getserver(uint8 numdns); +ipv4_addr_t espconn_dns_getserver(uint8 numdns); #ifdef __cplusplus diff --git a/tools/sdk/include/ip_addr.h b/tools/sdk/include/ip_addr.h index 6efc412a88..2e58051416 100644 --- a/tools/sdk/include/ip_addr.h +++ b/tools/sdk/include/ip_addr.h @@ -31,16 +31,16 @@ extern "C" { #endif -struct ip_addr { +struct ipv4_addr { uint32 addr; }; -typedef struct ip_addr ip_addr_t; +typedef struct ipv4_addr ipv4_addr_t; struct ip_info { - struct ip_addr ip; - struct ip_addr netmask; - struct ip_addr gw; + struct ipv4_addr ip; + struct ipv4_addr netmask; + struct ipv4_addr gw; }; /** @@ -51,7 +51,7 @@ struct ip_info { * @arg mask network identifier mask * @return !0 if the network identifiers of both address match */ -#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ +#define ipv4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ (mask)->addr) == \ ((addr2)->addr & \ (mask)->addr)) @@ -64,15 +64,15 @@ struct ip_info { ((uint32)((b) & 0xff) << 8) | \ (uint32)((a) & 0xff) -#define ip4_addr1(ipaddr) (((uint8*)(ipaddr))[0]) -#define ip4_addr2(ipaddr) (((uint8*)(ipaddr))[1]) -#define ip4_addr3(ipaddr) (((uint8*)(ipaddr))[2]) -#define ip4_addr4(ipaddr) (((uint8*)(ipaddr))[3]) +#define ipv4_addr1(ipaddr) (((uint8*)(ipaddr))[0]) +#define ipv4_addr2(ipaddr) (((uint8*)(ipaddr))[1]) +#define ipv4_addr3(ipaddr) (((uint8*)(ipaddr))[2]) +#define ipv4_addr4(ipaddr) (((uint8*)(ipaddr))[3]) -#define ip4_addr1_16(ipaddr) ((uint16)ip4_addr1(ipaddr)) -#define ip4_addr2_16(ipaddr) ((uint16)ip4_addr2(ipaddr)) -#define ip4_addr3_16(ipaddr) ((uint16)ip4_addr3(ipaddr)) -#define ip4_addr4_16(ipaddr) ((uint16)ip4_addr4(ipaddr)) +#define ipv4_addr1_16(ipaddr) ((uint16)ipv4_addr1(ipaddr)) +#define ipv4_addr2_16(ipaddr) ((uint16)ipv4_addr2(ipaddr)) +#define ipv4_addr3_16(ipaddr) ((uint16)ipv4_addr3(ipaddr)) +#define ipv4_addr4_16(ipaddr) ((uint16)ipv4_addr4(ipaddr)) /** 255.255.255.255 */ @@ -81,10 +81,10 @@ struct ip_info { #define IPADDR_ANY ((uint32)0x00000000UL) uint32 ipaddr_addr(const char *cp); -#define IP2STR(ipaddr) ip4_addr1_16(ipaddr), \ - ip4_addr2_16(ipaddr), \ - ip4_addr3_16(ipaddr), \ - ip4_addr4_16(ipaddr) +#define IP2STR(ipaddr) ipv4_addr1_16(ipaddr), \ + ipv4_addr2_16(ipaddr), \ + ipv4_addr3_16(ipaddr), \ + ipv4_addr4_16(ipaddr) #define IPSTR "%d.%d.%d.%d" diff --git a/tools/sdk/include/mesh.h b/tools/sdk/include/mesh.h deleted file mode 100644 index 47a259104c..0000000000 --- a/tools/sdk/include/mesh.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - * ESPRESSIF MIT License - * - * Copyright (c) 2015 - * - * Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case, - * it is free of charge, to any person obtaining a copy of this software and associated - * documentation files (the "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or - * substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ -#ifndef __LWIP_API_MESH_H__ -#define __LWIP_API_MESH_H__ - -#include "ip_addr.h" -#include "user_interface.h" -#include "espconn.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ESP_MESH_GROUP_ID_LEN (6) - -typedef void (* espconn_mesh_callback)(); -typedef void (* espconn_mesh_scan_callback)(void *arg, int8_t status); - -enum mesh_type { - MESH_CLOSE = 0, - MESH_LOCAL, - MESH_ONLINE, - MESH_NONE = 0xFF -}; -/** \defgroup Mesh_APIs Mesh APIs - * @brief Mesh APIs - * - * - * - */ - -/** @addtogroup Mesh_APIs - * @{ - */ - -enum mesh_status { - MESH_DISABLE = 0, - MESH_WIFI_CONN, - MESH_NET_CONN, - MESH_LOCAL_AVAIL, - MESH_ONLINE_AVAIL -}; - -enum mesh_node_type { - MESH_NODE_PARENT = 0, - MESH_NODE_CHILD, - MESH_NODE_ALL -}; - -struct mesh_scan_para_type { - espconn_mesh_scan_callback usr_scan_cb; // scan done callback - uint8_t grp_id[ESP_MESH_GROUP_ID_LEN]; // group id - bool grp_set; // group set -}; - - -/** - * @brief Check whether the IP address is mesh local IP address or not. - * - * @attention 1. The range of mesh local IP address is 2.255.255.* ~ max_hop.255.255.*. - * @attention 2. IP pointer should not be NULL. If the IP pointer is NULL, it will return false. - * - * @param struct ip_addr *ip : IP address - * - * @return true : the IP address is mesh local IP address - * @return false : the IP address is not mesh local IP address - */ -bool espconn_mesh_local_addr(struct ip_addr *ip); - -/** - * @brief Get the information of router used by mesh network. - * - * @attention 1. The function should be called after mesh_enable_done - * - * @param struct station_config *router: router inforamtion - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_get_router(struct station_config *router); - -/** - * @brief Set the information of router used by mesh network. - * - * @attention The function must be called before espconn_mesh_enable. - * - * @param struct station_config *router: router information. - * user should initialize the ssid and password. - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_set_router(struct station_config *router); - -/** - * @brief Set server setup by user. - * - * @attention If users wants to use themself server, they use the function. - * but the function must be called before espconn_mesh_enable. - * at the same time, users need to implement the server. - * - * @param struct ip_addr *ip : ip address of server. - * @param uint16_t port : port used by server. - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_server_init(struct ip_addr *ip, uint16_t port); - -/** - * @brief Get the information of mesh node. - * - * @param enum mesh_node_type typ : mesh node type. - * @param uint8_t **info : the information will be saved in *info. - * @param uint8_t *count : the node count in *info. - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_get_node_info(enum mesh_node_type type, - uint8_t **info, uint8_t *count); - -/** - * @brief Set WiFi cryption algrithm and password for mesh node. - * - * @attention The function must be called before espconn_mesh_enable. - * - * @param AUTH_MODE mode : cryption algrithm (WPA/WAP2/WPA_WPA2). - * @param uint8_t *passwd : password of WiFi. - * @param uint8_t passwd_len : length of password (8 <= passwd_len <= 64). - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_encrypt_init(AUTH_MODE mode, uint8_t *passwd, uint8_t passwd_len); -/** - * @brief Set prefix of SSID for mesh node. - * - * @attention The function must be called before espconn_mesh_enable. - * - * @param uint8_t *prefix : prefix of SSID. - * @param uint8_t prefix_len : length of prefix (0 < passwd_len <= 22). - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_set_ssid_prefix(uint8_t *prefix, uint8_t prefix_len); - -/** - * @brief Set max hop for mesh network. - * - * @attention The function must be called before espconn_mesh_enable. - * - * @param uint8_t max_hops : max hop of mesh network (1 <= max_hops < 10, 4 is recommended). - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_set_max_hops(uint8_t max_hops); - -/** - * @brief Set group ID of mesh node. - * - * @attention The function must be called before espconn_mesh_enable. - * - * @param uint8_t *grp_id : group ID. - * @param uint16_t gid_len: length of group ID, now gid_len = 6. - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_group_id_init(uint8_t *grp_id, uint16_t gid_len); - -/** - * @brief Set the curent device type. - * - * @param uint8_t dev_type : device type of mesh node - * - * @return true : succeed - * @return false : fail - */ -bool espconn_mesh_set_dev_type(uint8_t dev_type); -/** - * @brief Get the curent device type. - * - * @param none - * - * @return device type - */ -uint8_t espconn_mesh_get_dev_type(); - -/** - * @brief Try to establish mesh connection to server. - * - * @attention If espconn_mesh_connect fail, returns non-0 value, there is no connection, so it - * won't enter any espconn callback. - * - * @param struct espconn *usr_esp : the network connection structure, the usr_esp to - * listen to the connection - * - * @return 0 : succeed - * @return Non-0 : error code - * - ESPCONN_RTE - Routing Problem - * - ESPCONN_MEM - Out of memory - * - ESPCONN_ISCONN - Already connected - * - ESPCONN_ARG - Illegal argument, can't find the corresponding connection - * according to structure espconn - */ -int8_t espconn_mesh_connect(struct espconn *usr_esp); - -/** - * @brief Disconnect a mesh connection. - * - * @attention Do not call this API in any espconn callback. If needed, please use system - * task to trigger espconn_mesh_disconnect. - * - * @param struct espconn *usr_esp : the network connection structure - * - * @return 0 : succeed - * @return Non-0 : error code - * - ESPCONN_ARG - illegal argument, can't find the corresponding TCP connection - * according to structure espconn - */ - -int8_t espconn_mesh_disconnect(struct espconn *usr_esp); - -/** - * @brief Get current mesh status. - * - * @param null - * - * @return the current mesh status, please refer to enum mesh_status. - */ -int8_t espconn_mesh_get_status(); - -/** - * @brief Send data through mesh network. - * - * @attention Please call espconn_mesh_sent after espconn_sent_callback of the pre-packet. - * - * @param struct espconn *usr_esp : the network connection structure - * @param uint8 *pdata : pointer of data - * @param uint16 len : data length - * - * @return 0 : succeed - * @return Non-0 : error code - * - ESPCONN_MEM - out of memory - * - ESPCONN_ARG - illegal argument, can't find the corresponding network transmission - * according to structure espconn - * - ESPCONN_MAXNUM - buffer of sending data is full - * - ESPCONN_IF - send UDP data fail - */ -int8_t espconn_mesh_sent(struct espconn *usr_esp, uint8 *pdata, uint16 len); - -/** - * @brief Get max hop of mesh network. - * - * @param null. - * - * @return the current max hop of mesh - */ -uint8_t espconn_mesh_get_max_hops(); - -/** - * @brief To enable mesh network. - * - * @attention 1. the function should be called in user_init. - * @attention 2. if mesh node can not scan the mesh AP, it will be isolate node without trigger enable_cb. - * user can use espconn_mesh_get_status to get current status of node. - * @attention 3. if user try to enable online mesh, but node fails to establish mesh connection - * the node will work with local mesh. - * - * @param espconn_mesh_callback enable_cb : callback function of mesh-enable - * @param enum mesh_type type : type of mesh, local or online. - * - * @return null - */ -void espconn_mesh_enable(espconn_mesh_callback enable_cb, enum mesh_type type); - -/** - * @brief To disable mesh network. - * - * @attention When mesh network is disabed, the system will trigger disable_cb. - * - * @param espconn_mesh_callback disable_cb : callback function of mesh-disable - * @param enum mesh_type type : type of mesh, local or online. - * - * @return null - */ -void espconn_mesh_disable(espconn_mesh_callback disable_cb); - -/** - * @brief To print version of mesh. - * - * @param null - * - * @return null - */ -void espconn_mesh_print_ver(); - -/** - * @brief To get AP around node. - * - * @attention User can get normal AP or mesh AP using the function. - * If user plans to get normal AP, he/she needs to clear grp_set flag in para. - * If user plans to get mesh AP, he/she needs to set grp_set and grp_id; - * - * @param struct mesh_scan_para_type *para : callback function of mesh-disable - * - * @return null - */ -void espconn_mesh_scan(struct mesh_scan_para_type *para); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/sdk/include/sntp.h b/tools/sdk/include/sntp.h index 18dd0f5311..4e842d7432 100644 --- a/tools/sdk/include/sntp.h +++ b/tools/sdk/include/sntp.h @@ -2,10 +2,14 @@ #define __SNTP_H__ #include "os_type.h" -#ifdef LWIP_OPEN_SRC + +#include "lwip/init.h" #include "lwip/ip_addr.h" + +#if LWIP_VERSION_MAJOR == 1 +#define ipv4_addr_t ip_addr_t #else -#include "ip_addr.h" +typedef struct ip4_addr ipv4_addr_t; #endif #ifdef __cplusplus @@ -43,15 +47,15 @@ void sntp_stop(void); * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS * @param dnsserver IP address of the NTP server to set */ -void sntp_setserver(unsigned char idx, ip_addr_t *addr); +void sntp_setserver(unsigned char idx, ipv4_addr_t *addr); /** * Obtain one of the currently configured by IP address (or DHCP) NTP servers * * @param numdns the index of the NTP server - * @return IP address of the indexed NTP server or "ip_addr_any" if the NTP + * @return IP address of the indexed NTP server or "ipv4_addr_any" if the NTP * server has not been configured by address (or at all). */ -ip_addr_t sntp_getserver(unsigned char idx); +ipv4_addr_t sntp_getserver(unsigned char idx); /** * Initialize one of the NTP servers by name * diff --git a/tools/sdk/include/user_interface.h b/tools/sdk/include/user_interface.h index 33b6573d7c..b9a6c1e369 100644 --- a/tools/sdk/include/user_interface.h +++ b/tools/sdk/include/user_interface.h @@ -27,9 +27,18 @@ #include "os_type.h" #ifdef LWIP_OPEN_SRC + +#include "lwip/init.h" +#if LWIP_VERSION_MAJOR == 1 +#define ipv4_addr ip_addr +#endif #include "lwip/ip_addr.h" +#if LWIP_VERSION_MAJOR != 1 +typedef struct ip4_addr ipv4_addr_t; +#endif + #else -#include "ip_addr.h" +#error LWIP_OPEN_SRC must be defined #endif #include "queue.h" @@ -356,13 +365,13 @@ struct station_info { STAILQ_ENTRY(station_info) next; uint8 bssid[6]; - struct ip_addr ip; + struct ipv4_addr ip; }; struct dhcps_lease { bool enable; - struct ip_addr start_ip; - struct ip_addr end_ip; + struct ipv4_addr start_ip; + struct ipv4_addr end_ip; }; enum dhcps_offer_option{ @@ -519,9 +528,9 @@ typedef struct { } Event_StaMode_AuthMode_Change_t; typedef struct { - struct ip_addr ip; - struct ip_addr mask; - struct ip_addr gw; + struct ipv4_addr ip; + struct ipv4_addr mask; + struct ipv4_addr gw; } Event_StaMode_Got_IP_t; typedef struct { @@ -531,7 +540,7 @@ typedef struct { typedef struct { uint8 mac[6]; - struct ip_addr ip; + struct ipv4_addr ip; uint8 aid; } Event_SoftAPMode_Distribute_Sta_IP_t; diff --git a/tools/sdk/ld/eagle.app.v6.common.ld.h b/tools/sdk/ld/eagle.app.v6.common.ld.h index 67355536ea..0a1a7c22e7 100644 --- a/tools/sdk/ld/eagle.app.v6.common.ld.h +++ b/tools/sdk/ld/eagle.app.v6.common.ld.h @@ -114,6 +114,8 @@ SECTIONS *liblwip2-1460.a:(.literal .text .literal.* .text.*) *liblwip2-536-feat.a:(.literal .text .literal.* .text.*) *liblwip2-1460-feat.a:(.literal .text .literal.* .text.*) + *liblwip6-536-feat.a:(.literal .text .literal.* .text.*) + *liblwip6-1460-feat.a:(.literal .text .literal.* .text.*) *libbearssl.a:(.literal .text .literal.* .text.*) *libaxtls.a:(.literal .text .literal.* .text.*) *libat.a:(.literal.* .text.*) diff --git a/tools/sdk/lib/liblwip2-1460-feat.a b/tools/sdk/lib/liblwip2-1460-feat.a index 64a5ab9e5c..6d5651d7d3 100644 Binary files a/tools/sdk/lib/liblwip2-1460-feat.a and b/tools/sdk/lib/liblwip2-1460-feat.a differ diff --git a/tools/sdk/lib/liblwip2-1460.a b/tools/sdk/lib/liblwip2-1460.a index f7a1900112..087d25b720 100644 Binary files a/tools/sdk/lib/liblwip2-1460.a and b/tools/sdk/lib/liblwip2-1460.a differ diff --git a/tools/sdk/lib/liblwip2-536-feat.a b/tools/sdk/lib/liblwip2-536-feat.a index db8c578c5c..78042d6e0a 100644 Binary files a/tools/sdk/lib/liblwip2-536-feat.a and b/tools/sdk/lib/liblwip2-536-feat.a differ diff --git a/tools/sdk/lib/liblwip2-536.a b/tools/sdk/lib/liblwip2-536.a index 41d0c49aa1..aead45fc51 100644 Binary files a/tools/sdk/lib/liblwip2-536.a and b/tools/sdk/lib/liblwip2-536.a differ diff --git a/tools/sdk/lib/liblwip6-1460-feat.a b/tools/sdk/lib/liblwip6-1460-feat.a new file mode 100644 index 0000000000..8fda8a6c7b Binary files /dev/null and b/tools/sdk/lib/liblwip6-1460-feat.a differ diff --git a/tools/sdk/lib/liblwip6-536-feat.a b/tools/sdk/lib/liblwip6-536-feat.a new file mode 100644 index 0000000000..e18be57e41 Binary files /dev/null and b/tools/sdk/lib/liblwip6-536-feat.a differ diff --git a/tools/sdk/lwip2/builder b/tools/sdk/lwip2/builder index 80224f017d..fab2c912f3 160000 --- a/tools/sdk/lwip2/builder +++ b/tools/sdk/lwip2/builder @@ -1 +1 @@ -Subproject commit 80224f017dd83d0d88dd82ccd5d896313c90a234 +Subproject commit fab2c912f3e419ac0b218664f6ee9820e699f973 diff --git a/tools/sdk/lwip2/include/arch/cc.h b/tools/sdk/lwip2/include/arch/cc.h index b1c21697b0..686ad71cb7 100644 --- a/tools/sdk/lwip2/include/arch/cc.h +++ b/tools/sdk/lwip2/include/arch/cc.h @@ -90,14 +90,14 @@ typedef uint32_t sys_prot_t; // not really used ip4_addr3_16(ipaddr), \ ip4_addr4_16(ipaddr) -// ip_addr / ip_info: do not exist in lwip2 (only in lwip1.4) -struct ip_addr { +// ipv4_addr / ip_info: do not exist in lwip2 (only in lwip1.4) +struct ipv4_addr { uint32_t addr; }; struct ip_info { - struct ip_addr ip; - struct ip_addr netmask; - struct ip_addr gw; + struct ipv4_addr ip; + struct ipv4_addr netmask; + struct ipv4_addr gw; }; /////////////////////////////// diff --git a/tools/sdk/lwip2/include/gluedebug.h b/tools/sdk/lwip2/include/gluedebug.h index 2c40c65500..a16479805a 100644 --- a/tools/sdk/lwip2/include/gluedebug.h +++ b/tools/sdk/lwip2/include/gluedebug.h @@ -24,8 +24,8 @@ #if ULWIPDEBUG //#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT) -//#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) -#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON) +#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH) +//#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON) #endif ///////////////////////////////////////////////////////////////////////////// diff --git a/tools/sdk/lwip2/include/lwip-git-hash.h b/tools/sdk/lwip2/include/lwip-git-hash.h index 2000c44d59..ffa20ec0e8 100644 --- a/tools/sdk/lwip2/include/lwip-git-hash.h +++ b/tools/sdk/lwip2/include/lwip-git-hash.h @@ -1,5 +1,5 @@ // generated by makefiles/make-lwip2-hash #ifndef LWIP_HASH_H #define LWIP_HASH_H -#define LWIP_HASH_STR "STABLE-2_1_0_RELEASE/glue:arduino-2.4.2-13-g80224f0" +#define LWIP_HASH_STR "STABLE-2_1_2_RELEASE/glue:1.0" #endif // LWIP_HASH_H diff --git a/tools/sdk/lwip2/include/lwip/def.h b/tools/sdk/lwip2/include/lwip/def.h index 3d6e107e32..dfb266d181 100644 --- a/tools/sdk/lwip2/include/lwip/def.h +++ b/tools/sdk/lwip2/include/lwip/def.h @@ -83,14 +83,14 @@ extern "C" { #endif #if BYTE_ORDER == BIG_ENDIAN -#define lwip_htons(x) (x) -#define lwip_ntohs(x) (x) -#define lwip_htonl(x) (x) -#define lwip_ntohl(x) (x) -#define PP_HTONS(x) (x) -#define PP_NTOHS(x) (x) -#define PP_HTONL(x) (x) -#define PP_NTOHL(x) (x) +#define lwip_htons(x) ((u16_t)(x)) +#define lwip_ntohs(x) ((u16_t)(x)) +#define lwip_htonl(x) ((u32_t)(x)) +#define lwip_ntohl(x) ((u32_t)(x)) +#define PP_HTONS(x) ((u16_t)(x)) +#define PP_NTOHS(x) ((u16_t)(x)) +#define PP_HTONL(x) ((u32_t)(x)) +#define PP_NTOHL(x) ((u32_t)(x)) #else /* BYTE_ORDER != BIG_ENDIAN */ #ifndef lwip_htons u16_t lwip_htons(u16_t x); diff --git a/tools/sdk/lwip2/include/lwip/err.h b/tools/sdk/lwip2/include/lwip/err.h index 7773098770..887d9b3fd8 100644 --- a/tools/sdk/lwip2/include/lwip/err.h +++ b/tools/sdk/lwip2/include/lwip/err.h @@ -49,14 +49,6 @@ extern "C" { * @{ */ -/** Define LWIP_ERR_T in cc.h if you want to use - * a different type for your platform (must be signed). */ -#ifdef LWIP_ERR_T -typedef LWIP_ERR_T err_t; -#else /* LWIP_ERR_T */ -typedef s8_t err_t; -#endif /* LWIP_ERR_T*/ - /** Definitions for error constants. */ typedef enum { /** No error, everything OK. */ @@ -96,6 +88,14 @@ typedef enum { ERR_ARG = -16 } err_enum_t; +/** Define LWIP_ERR_T in cc.h if you want to use + * a different type for your platform (must be signed). */ +#ifdef LWIP_ERR_T +typedef LWIP_ERR_T err_t; +#else /* LWIP_ERR_T */ +typedef s8_t err_t; +#endif /* LWIP_ERR_T*/ + /** * @} */ diff --git a/tools/sdk/lwip2/include/lwip/init.h b/tools/sdk/lwip2/include/lwip/init.h index 951b08e6ed..a149be1848 100644 --- a/tools/sdk/lwip2/include/lwip/init.h +++ b/tools/sdk/lwip2/include/lwip/init.h @@ -54,7 +54,7 @@ extern "C" { /** x.X.x: Minor version of the stack */ #define LWIP_VERSION_MINOR 1 /** x.x.X: Revision of the stack */ -#define LWIP_VERSION_REVISION 0 +#define LWIP_VERSION_REVISION 2 /** For release candidates, this is set to 1..254 * For official releases, this is set to 255 (LWIP_RC_RELEASE) * For development versions (Git), this is set to 0 (LWIP_RC_DEVELOPMENT) */ diff --git a/tools/sdk/lwip2/include/lwipopts.h b/tools/sdk/lwip2/include/lwipopts.h index 302ef64f68..5e1b5a1c1f 100644 --- a/tools/sdk/lwip2/include/lwipopts.h +++ b/tools/sdk/lwip2/include/lwipopts.h @@ -2378,7 +2378,7 @@ * LWIP_IPV6==1: Enable IPv6 */ #if !defined LWIP_IPV6 || defined __DOXYGEN__ -#define LWIP_IPV6 0 +#error LWIP_IPV6 must be defined #endif /** @@ -3531,7 +3531,7 @@ */ #ifndef LWIP_FEATURES -#error LWIP_FEATURES is not defined +#error LWIP_FEATURES must be defined #endif /*