fix(network): retry around all getExternalInterface
This commit is contained in:
parent
9b89fc6470
commit
b05d4cd413
|
@ -519,8 +519,15 @@ bool waybar::modules::Network::checkInterface(struct ifinfomsg *rtif, std::strin
|
||||||
return config_["interface"].asString() == name ||
|
return config_["interface"].asString() == name ||
|
||||||
wildcardMatch(config_["interface"].asString(), name);
|
wildcardMatch(config_["interface"].asString(), name);
|
||||||
}
|
}
|
||||||
auto external_iface = getExternalInterface();
|
// getExternalInterface may need some delay to detect external interface
|
||||||
return external_iface == rtif->ifi_index;
|
for (uint8_t tries = 0; tries < MAX_RETRY; tries += 1) {
|
||||||
|
auto external_iface = getExternalInterface();
|
||||||
|
if (external_iface > 0) {
|
||||||
|
return external_iface == rtif->ifi_index;
|
||||||
|
}
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int waybar::modules::Network::getPreferredIface(int skip_idx) const {
|
int waybar::modules::Network::getPreferredIface(int skip_idx) const {
|
||||||
|
@ -550,9 +557,13 @@ int waybar::modules::Network::getPreferredIface(int skip_idx) const {
|
||||||
return ifid;
|
return ifid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ifid = getExternalInterface(skip_idx);
|
// getExternalInterface may need some delay to detect external interface
|
||||||
if (ifid > 0) {
|
for (uint8_t tries = 0; tries < MAX_RETRY; tries += 1) {
|
||||||
return ifid;
|
ifid = getExternalInterface(skip_idx);
|
||||||
|
if (ifid > 0) {
|
||||||
|
return ifid;
|
||||||
|
}
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -597,23 +608,25 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
||||||
net->clearIface();
|
net->clearIface();
|
||||||
// Check for a new interface and get info
|
// Check for a new interface and get info
|
||||||
net->checkNewInterface(ifi);
|
net->checkNewInterface(ifi);
|
||||||
|
} else {
|
||||||
|
net->dp.emit();
|
||||||
}
|
}
|
||||||
net->dp.emit();
|
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
}
|
}
|
||||||
} else if (nh->nlmsg_type == RTM_NEWLINK || nh->nlmsg_type == RTM_DELLINK) {
|
} else if (nh->nlmsg_type == RTM_NEWLINK || nh->nlmsg_type == RTM_DELLINK) {
|
||||||
char ifname[IF_NAMESIZE];
|
char ifname[IF_NAMESIZE];
|
||||||
if_indextoname(ifi->ifi_index, ifname);
|
if_indextoname(ifi->ifi_index, ifname);
|
||||||
// Check for valid interface
|
// Check for valid interface
|
||||||
if ((net->ifid_ == -1 || ifi->ifi_index != net->ifid_) && net->checkInterface(ifi, ifname)) {
|
if (ifi->ifi_index != net->ifid_ && net->checkInterface(ifi, ifname)) {
|
||||||
net->ifname_ = ifname;
|
net->ifname_ = ifname;
|
||||||
net->ifid_ = ifi->ifi_index;
|
net->ifid_ = ifi->ifi_index;
|
||||||
// Get Iface and WIFI info
|
// Get Iface and WIFI info
|
||||||
net->getInterfaceAddress();
|
net->getInterfaceAddress();
|
||||||
net->thread_timer_.wake_up();
|
net->thread_timer_.wake_up();
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
} else if (ifi->ifi_index == net->ifid_ && (!(ifi->ifi_flags & IFF_RUNNING) ||
|
} else if (ifi->ifi_index == net->ifid_ &&
|
||||||
!(ifi->ifi_flags & IFF_UP) || !net->checkInterface(ifi, ifname))) {
|
(!(ifi->ifi_flags & IFF_RUNNING) || !(ifi->ifi_flags & IFF_UP) ||
|
||||||
|
!net->checkInterface(ifi, ifname))) {
|
||||||
net->clearIface();
|
net->clearIface();
|
||||||
// Check for a new interface and get info
|
// Check for a new interface and get info
|
||||||
net->checkNewInterface(ifi);
|
net->checkNewInterface(ifi);
|
||||||
|
@ -623,20 +636,13 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
||||||
char ifname[IF_NAMESIZE];
|
char ifname[IF_NAMESIZE];
|
||||||
if_indextoname(ifi->ifi_index, ifname);
|
if_indextoname(ifi->ifi_index, ifname);
|
||||||
// Auto detected network can also be assigned here
|
// Auto detected network can also be assigned here
|
||||||
if (net->ifid_ == -1 || ifi->ifi_index != net->ifid_) {
|
if (ifi->ifi_index != net->ifid_ && net->checkInterface(ifi, ifname)) {
|
||||||
// checkInterface may need some delay to detect external interface
|
// If iface is different, clear data
|
||||||
for (uint8_t tries = 0; tries < MAX_RETRY; tries += 1) {
|
if (ifi->ifi_index != net->ifid_) {
|
||||||
if (net->checkInterface(ifi, ifname)) {
|
net->clearIface();
|
||||||
// If iface is different, clear data
|
|
||||||
if (ifi->ifi_index != net->ifid_) {
|
|
||||||
net->clearIface();
|
|
||||||
}
|
|
||||||
net->ifname_ = ifname;
|
|
||||||
net->ifid_ = ifi->ifi_index;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
|
||||||
}
|
}
|
||||||
|
net->ifname_ = ifname;
|
||||||
|
net->ifid_ = ifi->ifi_index;
|
||||||
}
|
}
|
||||||
// Check for valid interface
|
// Check for valid interface
|
||||||
if (ifi->ifi_index == net->ifid_) {
|
if (ifi->ifi_index == net->ifid_) {
|
||||||
|
|
Loading…
Reference in New Issue