fix(IPaddress): IPv6 restore zone id (#10546)
* IPv6 restore zone id
This PR restores the IPv6 zone-id in String representation of IPv6 address as well as parsing. This follows 20a28b58bc that disabled it due to a crash in `netif_index_to_name()`.
The fixed code scans through `netif_list` to find the `netif` name and id.
Note: zone-id are incremented by 1 compared to `netif` id.
For example internal zoneid value `3` actually translates to `%st2`
* ci(pre-commit): Apply automatic fixes
---------
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
This commit is contained in:
parent
de93e6e176
commit
a80b03e017
1 changed files with 20 additions and 1 deletions
|
|
@ -201,7 +201,13 @@ bool IPAddress::fromString6(const char *address) {
|
||||||
colons++;
|
colons++;
|
||||||
acc = 0;
|
acc = 0;
|
||||||
} else if (c == '%') {
|
} else if (c == '%') {
|
||||||
_zone = netif_name_to_index(address);
|
// netif_index_to_name crashes on latest esp-idf
|
||||||
|
// _zone = netif_name_to_index(address);
|
||||||
|
// in the interim, we parse the suffix as a zone number
|
||||||
|
while ((*address != '\0') && (!isdigit(*address))) { // skip all non-digit after '%'
|
||||||
|
address++;
|
||||||
|
}
|
||||||
|
_zone = atol(address) + 1; // increase by one by convention, so we can have zone '0'
|
||||||
while (*address != '\0') {
|
while (*address != '\0') {
|
||||||
address++;
|
address++;
|
||||||
}
|
}
|
||||||
|
|
@ -351,6 +357,19 @@ size_t IPAddress::printTo(Print &p, bool includeZone) const {
|
||||||
// netif_index_to_name(_zone, if_name);
|
// netif_index_to_name(_zone, if_name);
|
||||||
// n += p.print(if_name);
|
// n += p.print(if_name);
|
||||||
// }
|
// }
|
||||||
|
// In the interim, we just output the index number
|
||||||
|
if (_zone > 0 && includeZone) {
|
||||||
|
n += p.print('%');
|
||||||
|
// look for the interface name
|
||||||
|
for (netif *intf = netif_list; intf != nullptr; intf = intf->next) {
|
||||||
|
if (_zone - 1 == intf->num) {
|
||||||
|
n += p.print(intf->name[0]);
|
||||||
|
n += p.print(intf->name[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
n += p.print(_zone - 1);
|
||||||
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue