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:
@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user