diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-07-22 08:48:55 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-07-23 20:55:02 +0900 |
commit | c49d5362956d7f77e21889a9994076cc8ebe39c5 (patch) | |
tree | f459afeba7a2b2e55bba86299d1352740b3b39c0 /src/network/networkd-wiphy.c | |
parent | fc85b3230273b2bac05faf653d67629d68a889af (diff) | |
download | systemd-c49d5362956d7f77e21889a9994076cc8ebe39c5.tar.gz |
network: assign corresponding sd-device object to Wiphy object
As an analogy for Link object, let's each Wiphy object has the
corresponding sd-device object. The sd-device object will be used in
later commits.
Diffstat (limited to 'src/network/networkd-wiphy.c')
-rw-r--r-- | src/network/networkd-wiphy.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/network/networkd-wiphy.c b/src/network/networkd-wiphy.c index 41ce071edc..113b671479 100644 --- a/src/network/networkd-wiphy.c +++ b/src/network/networkd-wiphy.c @@ -2,10 +2,12 @@ #include <linux/nl80211.h> +#include "device-private.h" #include "device-util.h" #include "networkd-manager.h" #include "networkd-wiphy.h" #include "parse-util.h" +#include "udev-util.h" #include "wifi-util.h" Wiphy *wiphy_free(Wiphy *w) { @@ -18,6 +20,8 @@ Wiphy *wiphy_free(Wiphy *w) { hashmap_remove_value(w->manager->wiphy_by_name, w->name, w); } + sd_device_unref(w->dev); + free(w->name); return mfree(w); } @@ -129,6 +133,48 @@ static int wiphy_update_name(Wiphy *w, sd_netlink_message *message) { return 1; /* updated */ } +static int wiphy_update_device(Wiphy *w) { + _cleanup_(sd_device_unrefp) sd_device *dev = NULL; + int r; + + assert(w); + assert(w->name); + + if (!udev_available()) + return 0; + + w->dev = sd_device_unref(w->dev); + + r = sd_device_new_from_subsystem_sysname(&dev, "ieee80211", w->name); + if (r < 0) { + /* The corresponding syspath may not exist yet, and may appear later. */ + log_wiphy_debug_errno(w, r, "Failed to get wiphy device, ignoring: %m"); + return 0; + } + + if (DEBUG_LOGGING) { + const char *s = NULL; + + (void) sd_device_get_syspath(dev, &s); + log_wiphy_debug(w, "Found device: %s", strna(s)); + } + + w->dev = TAKE_PTR(dev); + return 0; +} + +static int wiphy_update(Wiphy *w) { + int r; + + assert(w); + + r = wiphy_update_device(w); + if (r < 0) + return log_wiphy_debug_errno(w, r, "Failed to update wiphy device: %m"); + + return 0; +} + int manager_genl_process_nl80211_wiphy(sd_netlink *genl, sd_netlink_message *message, Manager *manager) { const char *family; uint32_t index; @@ -192,6 +238,10 @@ int manager_genl_process_nl80211_wiphy(sd_netlink *genl, sd_netlink_message *mes return 0; } + r = wiphy_update(w); + if (r < 0) + log_wiphy_warning_errno(w, r, "Failed to update wiphy, ignoring: %m"); + break; } case NL80211_CMD_DEL_WIPHY: @@ -212,3 +262,25 @@ int manager_genl_process_nl80211_wiphy(sd_netlink *genl, sd_netlink_message *mes return 0; } + +int manager_udev_process_wiphy(Manager *m, sd_device *device, sd_device_action_t action) { + const char *name; + Wiphy *w; + int r; + + assert(m); + assert(device); + + r = sd_device_get_sysname(device, &name); + if (r < 0) + return log_device_debug_errno(device, r, "Failed to get sysname: %m"); + + r = wiphy_get_by_name(m, name, &w); + if (r < 0) { + /* This error is not critical, as the corresponding genl message may be received later. */ + log_device_debug_errno(device, r, "Failed to get Wiphy object, ignoring: %m"); + return 0; + } + + return device_unref_and_replace(w->dev, action == SD_DEVICE_REMOVE ? NULL : device); +} |