From c1427ff8072aa9573a09941fbaa1c45af5005d89 Mon Sep 17 00:00:00 2001 From: Anthony PERARD Date: Sat, 15 May 2021 16:38:00 +0100 Subject: [PATCH] network: Handle carrier information IFLA_CARRIER allows to know when a cable is plugged to the Ethernet card or when the WiFi is connected. If there's no carrier, the interface will be considered disconnected. --- include/modules/network.hpp | 1 + src/modules/network.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/include/modules/network.hpp b/include/modules/network.hpp index 964597ab..2523dc22 100644 --- a/include/modules/network.hpp +++ b/include/modules/network.hpp @@ -64,6 +64,7 @@ class Network : public ALabel { std::string state_; std::string essid_; + bool carrier_; std::string ifname_; std::string ipaddr_; std::string netmask_; diff --git a/src/modules/network.cpp b/src/modules/network.cpp index 508af910..6102a43c 100644 --- a/src/modules/network.cpp +++ b/src/modules/network.cpp @@ -292,6 +292,7 @@ const std::string waybar::modules::Network::getNetworkState() const { #endif return "disconnected"; } + if (!carrier_) return "disconnected"; if (ipaddr_.empty()) return "linked"; if (essid_.empty()) return "ethernet"; return "wifi"; @@ -402,6 +403,7 @@ void waybar::modules::Network::clearIface() { essid_.clear(); ipaddr_.clear(); netmask_.clear(); + carrier_ = false; cidr_ = 0; signal_strength_dbm_ = 0; signal_strength_ = 0; @@ -423,6 +425,7 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) { struct rtattr *ifla = IFLA_RTA(ifi); const char *ifname = NULL; size_t ifname_len = 0; + bool carrier = false; if (net->ifid_ != -1 && ifi->ifi_index != net->ifid_) { return NL_OK; @@ -434,6 +437,10 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) { ifname = static_cast(RTA_DATA(ifla)); ifname_len = RTA_PAYLOAD(ifla) - 1; // minus \0 break; + case IFLA_CARRIER: { + carrier = *(char*)RTA_DATA(ifla) == 1; + break; + } } } @@ -443,6 +450,7 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) { std::string new_ifname (ifname, ifname_len); net->ifname_ = new_ifname; } + net->carrier_ = carrier; } else if (!is_del_event && net->ifid_ == -1) { // Checking if it's an interface we care about. std::string new_ifname (ifname, ifname_len); @@ -451,6 +459,7 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) { net->ifname_ = new_ifname; net->ifid_ = ifi->ifi_index; + net->carrier_ = carrier; net->thread_timer_.wake_up(); /* An address for this new interface should be received via an * RTM_NEWADDR event either because we ask for a dump of both links