1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-25 06:22:11 +03:00

update AddrList and examples (#5422)

This commit is contained in:
david gauchard
2018-12-03 19:15:50 +01:00
committed by Develo
parent 31bee50102
commit 50cbdc0b92
6 changed files with 80 additions and 48 deletions

View File

@ -24,7 +24,7 @@
for (auto a: addrList) for (auto a: addrList)
out.printf("IF='%s' index=%d legacy=%d IPv4=%d local=%d hostname='%s' addr= %s\n", out.printf("IF='%s' index=%d legacy=%d IPv4=%d local=%d hostname='%s' addr= %s\n",
a.iface().c_str(), a.iface().c_str(),
a.number(), a.ifnumber(),
a.addr().isLegacy(), a.addr().isLegacy(),
a.addr().isV4(), a.addr().isV4(),
a.addr().isLocal(), a.addr().isLocal(),
@ -65,7 +65,7 @@
for (auto iface: addrList) for (auto iface: addrList)
if ((configured = ( !iface.addr().isV4() if ((configured = ( !iface.addr().isV4()
&& !iface.addr().isLocal() && !iface.addr().isLocal()
&& iface.number() == STATION_IF))) && iface.ifnumber() == STATION_IF)))
break; break;
Serial.print('.'); Serial.print('.');
delay(500); delay(500);
@ -94,28 +94,40 @@ namespace AddressListImplementation
struct netifWrapper struct netifWrapper
{ {
netifWrapper(netif * netif) : _netif(netif), _num(-1) {} netifWrapper (netif* netif) : _netif(netif), _num(-1) {}
netifWrapper(const netifWrapper & o) : _netif(o._netif), _num(o._num) {} netifWrapper (const netifWrapper& o) : _netif(o._netif), _num(o._num) {}
netifWrapper& operator=(const netifWrapper & o) {_netif = o._netif; _num = o._num; return *this;} netifWrapper& operator= (const netifWrapper& o)
{
_netif = o._netif;
_num = o._num;
return *this;
}
bool equal (const netifWrapper & o) bool equal(const netifWrapper& o)
{ {
return _netif == o._netif && (!_netif || _num == o._num); return _netif == o._netif && (!_netif || _num == o._num);
} }
// address properties
IPAddress addr () const { return ipFromNetifNum(); }
bool isLegacy () const { return _num == 0; }
bool isLocal () const { return addr().isLocal(); }
bool isV4 () const { return addr().isV4(); }
bool isV6 () const { return !addr().isV4(); }
String toString() const { return addr().toString(); }
bool isLegacy() const { return _num == 0; } // related to legacy address (_num=0, ipv4)
bool isLocal() const { return addr().isLocal(); } IPAddress netmask () const { return _netif->netmask; }
IPAddress addr () const { return ipFromNetifNum(); } IPAddress gw () const { return _netif->gw; }
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; }
const ip_addr_t* ipFromNetifNum () const // common to all addresses of this interface
String ifname () const { return String(_netif->name[0]) + _netif->name[1]; }
const char* ifhostname () const { return _netif->hostname?: emptyString.c_str(); }
const char* ifmac () const { return (const char*)_netif->hwaddr; }
int ifnumber () const { return _netif->num; }
const ip_addr_t* ipFromNetifNum () const
{ {
#if LWIP_IPV6 #if LWIP_IPV6
return _num ? &_netif->ip6_addr[_num - 1] : &_netif->ip_addr; return _num ? &_netif->ip6_addr[_num - 1] : &_netif->ip_addr;
@ -124,44 +136,57 @@ struct netifWrapper
#endif #endif
} }
// lwIP interface
netif* _netif;
netif * _netif; // address index within interface
// 0: legacy address (IPv4)
// n>0: (_num-1) is IPv6 index for netif->ip6_addr[]
int _num; int _num;
}; };
class AddressListIterator class AddressListIterator
{ {
public: public:
AddressListIterator(const netifWrapper &o) : netIf(o) {} AddressListIterator (const netifWrapper& o) : netIf(o) {}
AddressListIterator(netif * netif) : netIf(netif) {} AddressListIterator (netif* netif) : netIf(netif)
{
// This constructor is called with lwIP's global netif_list, or
// nullptr. operator++() is designed to loop through _configured_
// addresses. That's why netIf's _num is initialized to -1 to allow
// returning the first usable address to AddressList::begin().
(void)operator++();
}
const netifWrapper& operator* () const {return netIf;} const netifWrapper& operator* () const { return netIf; }
const netifWrapper* operator->() const {return &netIf;} const netifWrapper* operator-> () const { return &netIf; }
bool operator==(AddressListIterator & o) {return netIf.equal(*o);} bool operator== (AddressListIterator& o) { return netIf.equal(*o); }
bool operator!=(AddressListIterator & o) {return !netIf.equal(*o);} bool operator!= (AddressListIterator& o) { return !netIf.equal(*o); }
AddressListIterator & operator= (const AddressListIterator& o) {netIf = o.netIf; return *this; } AddressListIterator& operator= (const AddressListIterator& o) { netIf = o.netIf; return *this; }
AddressListIterator operator++(int) AddressListIterator operator++ (int)
{ {
AddressListIterator ret = *this; AddressListIterator ret = *this;
++(*this); (void)operator++();
return ret; return ret;
} }
AddressListIterator & operator++() AddressListIterator& operator++ ()
{ {
while (netIf._netif) while (netIf._netif)
{ {
if (++netIf._num == IF_NUM_ADDRESSES) if (++netIf._num == IF_NUM_ADDRESSES)
{ {
netIf = netifWrapper(netIf._netif->next); //num is inited to -1 // all addresses from current interface were iterated,
// switching to next interface
netIf = netifWrapper(netIf._netif->next);
continue; continue;
} }
if (!ip_addr_isany(netIf.ipFromNetifNum())) if (!ip_addr_isany(netIf.ipFromNetifNum()))
// found an initialized address
break; break;
} }
return *this; return *this;
@ -171,24 +196,23 @@ public:
}; };
class AddressList class AddressList
{ {
public: public:
using const_iterator = const AddressListIterator; using const_iterator = const AddressListIterator;
const_iterator begin() const {return const_iterator(netif_list);} const_iterator begin () const { return const_iterator(netif_list); }
const_iterator end() const {return const_iterator(nullptr);} const_iterator end () const { return const_iterator(nullptr); }
}; };
inline AddressList::const_iterator begin (const AddressList& a) { return a.begin(); }
inline AddressList::const_iterator end (const AddressList& a) { return a.end(); }
inline AddressList::const_iterator begin(const AddressList &a) {return a.begin();}
inline AddressList::const_iterator end(const AddressList &a) {return a.end();}
} //AddressListImplementation } // AddressListImplementation
} //esp8266 } // esp8266
extern esp8266::AddressListImplementation::AddressList addrList; extern esp8266::AddressListImplementation::AddressList addrList;

View File

@ -66,11 +66,11 @@ void status(Print& out) {
out.println(F("(with 'telnet <addr> or 'nc -u <addr> 23')")); out.println(F("(with 'telnet <addr> or 'nc -u <addr> 23')"));
for (auto a : addrList) { for (auto a : addrList) {
out.printf("IF='%s' IPv6=%d local=%d hostname='%s' addr= %s", out.printf("IF='%s' IPv6=%d local=%d hostname='%s' addr= %s",
a.iface().c_str(), a.ifname().c_str(),
!a.addr().isV4(), a.isV6(),
a.addr().isLocal(), a.isLocal(),
a.hostname(), a.ifhostname(),
a.addr().toString().c_str()); a.toString().c_str());
if (a.isLegacy()) { if (a.isLegacy()) {
out.printf(" / mask:%s / gw:%s", out.printf(" / mask:%s / gw:%s",
@ -79,6 +79,7 @@ void status(Print& out) {
} }
out.println(); out.println();
} }
// lwIP's dns client will ask for IPv4 first (by default) // lwIP's dns client will ask for IPv4 first (by default)
@ -96,12 +97,14 @@ void setup() {
Serial.println(); Serial.println();
Serial.println(ESP.getFullVersion()); Serial.println(ESP.getFullVersion());
Serial.printf("IPV6 is%s enabled\n", LWIP_IPV6 ? emptyString.c_str() : " NOT");
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
WiFi.begin(STASSID, STAPSK); WiFi.begin(STASSID, STAPSK);
status(Serial); status(Serial);
#if 0 #if 0 // 0: legacy connecting loop - 1: wait for IPv6
// legacy loop (still valid with IPv4 only) // legacy loop (still valid with IPv4 only)

View File

@ -21,6 +21,11 @@
#include <ESP8266HTTPClient.h> #include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h> #include <ESP8266httpUpdate.h>
#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif
ESP8266WiFiMulti WiFiMulti; ESP8266WiFiMulti WiFiMulti;
#define MANUAL_SIGNING 0 #define MANUAL_SIGNING 0
@ -66,7 +71,7 @@ void setup() {
} }
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
WiFiMulti.addAP("SSID", "PASS"); WiFiMulti.addAP(STASSID, STAPSK);
#if MANUAL_SIGNING #if MANUAL_SIGNING
signPubKey = new BearSSL::PublicKey(pubkey); signPubKey = new BearSSL::PublicKey(pubkey);

View File

@ -116,8 +116,8 @@ function install_ide()
debug_flags="-DDEBUG_ESP_PORT=Serial -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM" debug_flags="-DDEBUG_ESP_PORT=Serial -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM"
fi fi
# Set custom warnings for all builds (i.e. could add -Wextra at some point) # Set custom warnings for all builds (i.e. could add -Wextra at some point)
echo "compiler.c.extra_flags=-Wall -Wextra -Werror $debug_flags" > esp8266/platform.local.txt echo "compiler.c.extra_flags=-Wall -Wextra -Werror -DLWIP_IPV6=0 $debug_flags" > esp8266/platform.local.txt
echo "compiler.cpp.extra_flags=-Wall -Wextra -Werror $debug_flags" >> esp8266/platform.local.txt echo "compiler.cpp.extra_flags=-Wall -Wextra -Werror -DLWIP_IPV6=0 $debug_flags" >> esp8266/platform.local.txt
echo -e "\n----platform.local.txt----" echo -e "\n----platform.local.txt----"
cat esp8266/platform.local.txt cat esp8266/platform.local.txt
echo -e "\n----\n" echo -e "\n----\n"

View File

@ -33,7 +33,7 @@ if [ -d ${TMPCI} ]; then
echo "" echo ""
echo " -- updating CI directory in ${TMPCI} --" echo " -- updating CI directory in ${TMPCI} --"
echo "" echo ""
(cd ${TMPCI}; git checkout ${branch}; git pull) (cd ${TMPCI}; git checkout master; git branch -D ${branch} || true; git checkout -b ${branch}; git pull origin ${branch})
else else
echo "" echo ""
echo " -- installing CI directory in ${TMPCI} --" echo " -- installing CI directory in ${TMPCI} --"