summaryrefslogtreecommitdiff
path: root/src/network/networkd-wiphy.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-07-22 08:48:55 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-07-23 20:55:02 +0900
commitc49d5362956d7f77e21889a9994076cc8ebe39c5 (patch)
treef459afeba7a2b2e55bba86299d1352740b3b39c0 /src/network/networkd-wiphy.c
parentfc85b3230273b2bac05faf653d67629d68a889af (diff)
downloadsystemd-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.c72
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);
+}