network: Fix one case where default route is deleted without notification
When an interface's state is change to "down", all the route associated with it are deleted without an RTM_DELROUTE event. So when this happen, reset the module to start looking for a new external interface / default route. Fixes #1117
This commit is contained in:
		
							parent
							
								
									efaac20d82
								
							
						
					
					
						commit
						33617b67f0
					
				|  | @ -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> | ||||||
|  | @ -432,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: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue