Skip to content

update AddrList and examples #5422

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 3, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 64 additions & 40 deletions cores/esp8266/AddrList.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
for (auto a: addrList)
out.printf("IF='%s' index=%d legacy=%d IPv4=%d local=%d hostname='%s' addr= %s\n",
a.iface().c_str(),
a.number(),
a.ifnumber(),
a.addr().isLegacy(),
a.addr().isV4(),
a.addr().isLocal(),
Expand Down Expand Up @@ -65,7 +65,7 @@
for (auto iface: addrList)
if ((configured = ( !iface.addr().isV4()
&& !iface.addr().isLocal()
&& iface.number() == STATION_IF)))
&& iface.ifnumber() == STATION_IF)))
break;
Serial.print('.');
delay(500);
Expand Down Expand Up @@ -94,28 +94,40 @@ namespace AddressListImplementation

struct netifWrapper
{
netifWrapper(netif * netif) : _netif(netif), _num(-1) {}
netifWrapper(const netifWrapper & o) : _netif(o._netif), _num(o._num) {}
netifWrapper (netif* netif) : _netif(netif), _num(-1) {}
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);
}


bool isLegacy() const { return _num == 0; }
bool isLocal() const { return addr().isLocal(); }
IPAddress addr () const { return ipFromNetifNum(); }
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
// 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(); }

// related to legacy address (_num=0, ipv4)
IPAddress netmask () const { return _netif->netmask; }
IPAddress gw () const { return _netif->gw; }

// 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
return _num ? &_netif->ip6_addr[_num - 1] : &_netif->ip_addr;
Expand All @@ -124,44 +136,57 @@ struct netifWrapper
#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;
};



class AddressListIterator
{
public:
AddressListIterator(const netifWrapper &o) : netIf(o) {}
AddressListIterator(netif * netif) : netIf(netif) {}
AddressListIterator (const netifWrapper& o) : netIf(o) {}
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;
++(*this);
(void)operator++();
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;
}
if (!ip_addr_isany(netIf.ipFromNetifNum()))
// found an initialized address
break;
}
return *this;
Expand All @@ -171,24 +196,23 @@ class AddressListIterator
};



class AddressList
{
public:
using const_iterator = const AddressListIterator;

const_iterator begin() const {return const_iterator(netif_list);}
const_iterator end() const {return const_iterator(nullptr);}
const_iterator begin () const { return const_iterator(netif_list); }
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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ void status(Print& out) {
out.println(F("(with 'telnet <addr> or 'nc -u <addr> 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());
a.ifname().c_str(),
a.isV6(),
a.isLocal(),
a.ifhostname(),
a.toString().c_str());

if (a.isLegacy()) {
out.printf(" / mask:%s / gw:%s",
Expand All @@ -79,6 +79,7 @@ void status(Print& out) {
}

out.println();

}

// lwIP's dns client will ask for IPv4 first (by default)
Expand All @@ -96,12 +97,14 @@ void setup() {
Serial.println();
Serial.println(ESP.getFullVersion());

Serial.printf("IPV6 is%s enabled\n", LWIP_IPV6 ? emptyString.c_str() : " NOT");

WiFi.mode(WIFI_STA);
WiFi.begin(STASSID, STAPSK);

status(Serial);

#if 0
#if 0 // 0: legacy connecting loop - 1: wait for IPv6

// legacy loop (still valid with IPv4 only)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

ESP8266WiFiMulti WiFiMulti;

#define MANUAL_SIGNING 0
Expand Down Expand Up @@ -66,7 +71,7 @@ void setup() {
}

WiFi.mode(WIFI_STA);
WiFiMulti.addAP("SSID", "PASS");
WiFiMulti.addAP(STASSID, STAPSK);

#if MANUAL_SIGNING
signPubKey = new BearSSL::PublicKey(pubkey);
Expand Down
4 changes: 2 additions & 2 deletions tests/common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
fi
# 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.cpp.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 -DLWIP_IPV6=0 $debug_flags" >> esp8266/platform.local.txt
echo -e "\n----platform.local.txt----"
cat esp8266/platform.local.txt
echo -e "\n----\n"
Expand Down
2 changes: 1 addition & 1 deletion tests/run_CI_locally.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ if [ -d ${TMPCI} ]; then
echo ""
echo " -- updating CI directory in ${TMPCI} --"
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
echo ""
echo " -- installing CI directory in ${TMPCI} --"
Expand Down