network: Handle ip route priority
When there's a new default route with higher priority, switch to it.
This commit is contained in:
parent
ce97df34e6
commit
efaac20d82
|
@ -72,6 +72,7 @@ class Network : public ALabel {
|
|||
int32_t signal_strength_dbm_;
|
||||
uint8_t signal_strength_;
|
||||
uint32_t frequency_;
|
||||
uint32_t route_priority;
|
||||
|
||||
util::SleeperThread thread_;
|
||||
util::SleeperThread thread_timer_;
|
||||
|
|
|
@ -573,11 +573,7 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
|||
bool has_gateway = false;
|
||||
bool has_destination = false;
|
||||
int temp_idx = -1;
|
||||
|
||||
/* If we found the correct answer, skip parsing the attributes. */
|
||||
if (!is_del_event && net->ifid_ != -1) {
|
||||
return NL_OK;
|
||||
}
|
||||
uint32_t priority = 0;
|
||||
|
||||
/* Find the message(s) concerting the main routing table, each message
|
||||
* corresponds to a single routing table entry.
|
||||
|
@ -621,6 +617,9 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
|||
/* The output interface index. */
|
||||
temp_idx = *static_cast<int *>(RTA_DATA(attr));
|
||||
break;
|
||||
case RTA_PRIORITY:
|
||||
priority = *(uint32_t*)RTA_DATA(attr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -628,10 +627,16 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
|||
|
||||
// Check if we have a default route.
|
||||
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->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 */
|
||||
struct ifinfomsg ifinfo_hdr = {
|
||||
|
@ -653,9 +658,10 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
|||
net->want_addr_dump_ = true;
|
||||
net->askForStateDump();
|
||||
net->thread_timer_.wake_up();
|
||||
} else if (is_del_event && temp_idx == net->ifid_) {
|
||||
spdlog::debug("network: default route deleted {}/if{}",
|
||||
net->ifname_, temp_idx);
|
||||
} else if (is_del_event && temp_idx == net->ifid_
|
||||
&& net->route_priority == priority) {
|
||||
spdlog::debug("network: default route deleted {}/if{} metric {}",
|
||||
net->ifname_, temp_idx, priority);
|
||||
|
||||
net->clearIface();
|
||||
net->dp.emit();
|
||||
|
|
Loading…
Reference in New Issue