1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-23 19:21:59 +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)
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(),
@ -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);
@ -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);
}
// 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; }
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; }
// related to legacy address (_num=0, ipv4)
IPAddress netmask () const { return _netif->netmask; }
IPAddress gw () const { return _netif->gw; }
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
return _num ? &_netif->ip6_addr[_num - 1] : &_netif->ip_addr;
@ -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;
@ -171,24 +196,23 @@ public:
};
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;