summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-06-15 10:51:24 +0900
committerGitHub <noreply@github.com>2021-06-15 10:51:24 +0900
commit9868493e174c3d32b78318170bc98622c0c48f0b (patch)
tree052bb949b6ae4ec0675365f2ba27a15199c70164
parent05a2166a068f54d59d68590a81369768c2eb657b (diff)
parent710fa1b3fb679556d980759f5812ededac70a99d (diff)
downloadsystemd-9868493e174c3d32b78318170bc98622c0c48f0b.tar.gz
Merge pull request #19913 from yuwata/network-fix-counter
network: add missing increment of Link::set_flags_messages
-rw-r--r--src/network/networkd-link-bus.c2
-rw-r--r--src/network/networkd-link.c29
-rw-r--r--src/network/networkd-manager-bus.c2
-rw-r--r--src/network/networkd-setlink.c11
-rw-r--r--src/network/networkd-wifi.c30
5 files changed, 46 insertions, 28 deletions
diff --git a/src/network/networkd-link-bus.c b/src/network/networkd-link-bus.c
index 7be333eac6..50c3f60080 100644
--- a/src/network/networkd-link-bus.c
+++ b/src/network/networkd-link-bus.c
@@ -667,7 +667,7 @@ int bus_link_method_reconfigure(sd_bus_message *message, void *userdata, sd_bus_
if (r == 0)
return 1; /* Polkit will call us back */
- r = link_reconfigure(l, true);
+ r = link_reconfigure(l, /* force = */ true);
if (r < 0)
return r;
if (r > 0) {
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 5e014baa50..a3a2fb8aac 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1199,7 +1199,7 @@ static int link_get_network(Link *link, Network **ret) {
return -ENOENT;
}
-static int link_reconfigure_internal(Link *link, bool force) {
+static int link_reconfigure_impl(Link *link, bool force) {
Network *network;
int r;
@@ -1267,7 +1267,7 @@ static int link_reconfigure_handler_internal(sd_netlink *rtnl, sd_netlink_messag
if (r <= 0)
return r;
- r = link_reconfigure_internal(link, force);
+ r = link_reconfigure_impl(link, force);
if (r < 0)
link_enter_failed(link);
@@ -1497,15 +1497,6 @@ static int link_carrier_gained(Link *link) {
/* let's shortcut things for CAN which doesn't need most of what's done below. */
return 0;
- r = wifi_get_info(link);
- if (r < 0)
- return r;
- if (r > 0) {
- r = link_reconfigure_internal(link, false);
- if (r != 0)
- return r;
- }
-
if (IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) {
r = link_acquire_dynamic_conf(link);
if (r < 0)
@@ -1830,7 +1821,7 @@ void link_update_operstate(Link *link, bool also_update_master) {
: "")
static int link_update_flags(Link *link, sd_netlink_message *message) {
- bool link_was_admin_up, had_carrier;
+ bool link_was_lower_up, link_was_admin_up, had_carrier;
uint8_t operstate;
unsigned flags;
int r;
@@ -1892,6 +1883,7 @@ static int link_update_flags(Link *link, sd_netlink_message *message) {
log_link_debug(link, "Unknown link flags lost, ignoring: %#.5x", unknown_flags_removed);
}
+ link_was_lower_up = link->flags & IFF_LOWER_UP;
link_was_admin_up = link->flags & IFF_UP;
had_carrier = link_has_carrier(link);
@@ -1900,6 +1892,19 @@ static int link_update_flags(Link *link, sd_netlink_message *message) {
link_update_operstate(link, true);
+ if (!link_was_lower_up && (link->flags & IFF_LOWER_UP)) {
+ r = wifi_get_info(link);
+ if (r < 0)
+ return r;
+ if (r > 0) {
+ /* All link information is up-to-date. So, it is not necessary to call
+ * RTM_GETLINK netlink method again. */
+ r = link_reconfigure_impl(link, /* force = */ false);
+ if (r < 0)
+ return r;
+ }
+ }
+
if (!link_was_admin_up && (link->flags & IFF_UP)) {
log_link_info(link, "Link UP");
diff --git a/src/network/networkd-manager-bus.c b/src/network/networkd-manager-bus.c
index 4be09d98d8..a1520240d7 100644
--- a/src/network/networkd-manager-bus.c
+++ b/src/network/networkd-manager-bus.c
@@ -216,7 +216,7 @@ static int bus_method_reload(sd_bus_message *message, void *userdata, sd_bus_err
return r;
HASHMAP_FOREACH(link, manager->links) {
- r = link_reconfigure(link, false);
+ r = link_reconfigure(link, /* force = */ false);
if (r < 0)
return r;
}
diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c
index 43519beab7..dea353dfbb 100644
--- a/src/network/networkd-setlink.c
+++ b/src/network/networkd-setlink.c
@@ -920,7 +920,16 @@ static int link_up_or_down(Link *link, bool up, link_netlink_message_handler_t c
}
int link_down(Link *link) {
- return link_up_or_down(link, false, link_down_handler);
+ int r;
+
+ assert(link);
+
+ r = link_up_or_down(link, false, link_down_handler);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Failed to bring down interface: %m");
+
+ link->set_flags_messages++;
+ return 0;
}
static bool link_is_ready_to_activate(Link *link) {
diff --git a/src/network/networkd-wifi.c b/src/network/networkd-wifi.c
index 49f2f011f1..37700afb81 100644
--- a/src/network/networkd-wifi.c
+++ b/src/network/networkd-wifi.c
@@ -18,8 +18,9 @@
int wifi_get_info(Link *link) {
_cleanup_free_ char *ssid = NULL;
enum nl80211_iftype iftype;
+ bool updated = false;
const char *type;
- int r, s = 0;
+ int r;
assert(link);
@@ -38,23 +39,26 @@ int wifi_get_info(Link *link) {
r = wifi_get_interface(link->manager->genl, link->ifindex, &iftype, &ssid);
if (r < 0)
return r;
- if (r > 0 && link->wlan_iftype == iftype && streq_ptr(link->ssid, ssid))
- r = 0;
+ if (r == 0)
+ iftype = link->wlan_iftype; /* Assume iftype is not changed. */
- link->wlan_iftype = iftype;
- free_and_replace(link->ssid, ssid);
+ if (iftype == NL80211_IFTYPE_STATION) {
+ struct ether_addr bssid;
- if (link->wlan_iftype == NL80211_IFTYPE_STATION) {
- struct ether_addr old_bssid = link->bssid;
+ r = wifi_get_station(link->manager->genl, link->ifindex, &bssid);
+ if (r < 0)
+ return r;
- s = wifi_get_station(link->manager->genl, link->ifindex, &link->bssid);
- if (s < 0)
- return s;
- if (s > 0 && memcmp(&old_bssid, &link->bssid, sizeof old_bssid) == 0)
- s = 0;
+ updated = !ether_addr_equal(&link->bssid, &bssid);
+ link->bssid = bssid;
}
- if (r > 0 || s > 0) {
+ updated = updated || link->wlan_iftype != iftype;
+ link->wlan_iftype = iftype;
+ updated = updated || !streq_ptr(link->ssid, ssid);
+ free_and_replace(link->ssid, ssid);
+
+ if (updated) {
if (link->wlan_iftype == NL80211_IFTYPE_STATION && link->ssid)
log_link_info(link, "Connected WiFi access point: %s (%s)",
link->ssid, ETHER_ADDR_TO_STR(&link->bssid));