Merge pull request #1126 from tperard/fix-network-auto-detection

Fix network interface auto detection
This commit is contained in:
Alex 2021-06-05 18:06:30 +02:00 committed by GitHub
commit 9e34be7b16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 64 additions and 44 deletions

View File

@ -72,6 +72,7 @@ class Network : public ALabel {
int32_t signal_strength_dbm_; int32_t signal_strength_dbm_;
uint8_t signal_strength_; uint8_t signal_strength_;
uint32_t frequency_; uint32_t frequency_;
uint32_t route_priority;
util::SleeperThread thread_; util::SleeperThread thread_;
util::SleeperThread thread_timer_; util::SleeperThread thread_timer_;

View File

@ -1,6 +1,7 @@
#include "modules/network.hpp" #include "modules/network.hpp"
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include <sys/eventfd.h> #include <sys/eventfd.h>
#include <linux/if.h>
#include <fstream> #include <fstream>
#include <cassert> #include <cassert>
#include <optional> #include <optional>
@ -400,6 +401,7 @@ bool waybar::modules::Network::checkInterface(std::string name) {
void waybar::modules::Network::clearIface() { void waybar::modules::Network::clearIface() {
ifid_ = -1; ifid_ = -1;
ifname_.clear();
essid_.clear(); essid_.clear();
ipaddr_.clear(); ipaddr_.clear();
netmask_.clear(); netmask_.clear();
@ -431,6 +433,20 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
return NL_OK; return NL_OK;
} }
// Check if the interface goes "down" and if we want to detect the
// external interface.
if (net->ifid_ != -1 && !(ifi->ifi_flags & IFF_UP)
&& !net->config_["interface"].isString()) {
// The current interface is now down, all the routes associated with
// it have been deleted, so start looking for a new default route.
spdlog::debug("network: if{} down", net->ifid_);
net->clearIface();
net->dp.emit();
net->want_route_dump_ = true;
net->askForStateDump();
return NL_OK;
}
for (; RTA_OK(ifla, attrlen); ifla = RTA_NEXT(ifla, attrlen)) { for (; RTA_OK(ifla, attrlen); ifla = RTA_NEXT(ifla, attrlen)) {
switch (ifla->rta_type) { switch (ifla->rta_type) {
case IFLA_IFNAME: case IFLA_IFNAME:
@ -572,11 +588,7 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
bool has_gateway = false; bool has_gateway = false;
bool has_destination = false; bool has_destination = false;
int temp_idx = -1; int temp_idx = -1;
uint32_t priority = 0;
/* If we found the correct answer, skip parsing the attributes. */
if (!is_del_event && net->ifid_ != -1) {
return NL_OK;
}
/* Find the message(s) concerting the main routing table, each message /* Find the message(s) concerting the main routing table, each message
* corresponds to a single routing table entry. * corresponds to a single routing table entry.
@ -620,18 +632,26 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
/* The output interface index. */ /* The output interface index. */
temp_idx = *static_cast<int *>(RTA_DATA(attr)); temp_idx = *static_cast<int *>(RTA_DATA(attr));
break; break;
case RTA_PRIORITY:
priority = *(uint32_t*)RTA_DATA(attr);
break;
default: default:
break; break;
} }
}
/* If this is the default route, and we know the interface index, // Check if we have a default route.
* we can stop parsing this message.
*/
if (has_gateway && !has_destination && temp_idx != -1) { if (has_gateway && !has_destination && temp_idx != -1) {
if (!is_del_event) { // Check if this is the first default route we see, or if this new
// route have a higher priority.
if (!is_del_event && ((net->ifid_ == -1) || (priority < net->route_priority))) {
// Clear if's state for the case were there is a higher priority
// route on a different interface.
net->clearIface();
net->ifid_ = temp_idx; net->ifid_ = temp_idx;
net->route_priority = priority;
spdlog::debug("network: new default route via if{}", temp_idx); spdlog::debug("network: new default route via if{} metric {}", temp_idx, priority);
/* Ask ifname associated with temp_idx as well as carrier status */ /* Ask ifname associated with temp_idx as well as carrier status */
struct ifinfomsg ifinfo_hdr = { struct ifinfomsg ifinfo_hdr = {
@ -653,11 +673,11 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
net->want_addr_dump_ = true; net->want_addr_dump_ = true;
net->askForStateDump(); net->askForStateDump();
net->thread_timer_.wake_up(); net->thread_timer_.wake_up();
} else if (is_del_event && temp_idx == net->ifid_) { } else if (is_del_event && temp_idx == net->ifid_
spdlog::debug("network: default route deleted {}/if{}", && net->route_priority == priority) {
net->ifname_, temp_idx); spdlog::debug("network: default route deleted {}/if{} metric {}",
net->ifname_, temp_idx, priority);
net->ifname_.clear();
net->clearIface(); net->clearIface();
net->dp.emit(); net->dp.emit();
/* Ask for a dump of all routes in case another one is already /* Ask for a dump of all routes in case another one is already
@ -667,7 +687,6 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
net->askForStateDump(); net->askForStateDump();
} }
} }
}
break; break;
} }
} }