]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev/net: make Link object take reference to UdevEvent 35625/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 4 Dec 2024 18:12:42 +0000 (03:12 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 15 Dec 2024 00:21:46 +0000 (09:21 +0900)
No functional change, just refactoring.

src/udev/net/link-config.c
src/udev/net/link-config.h
src/udev/udev-builtin-net_setup_link.c

index 55eeb9de81f36e48adbb543ad9e740d96be8c887..7d4e334503daf89f9b3162a7f98966b30cf58587 100644 (file)
@@ -376,21 +376,18 @@ Link* link_free(Link *link) {
         if (!link)
                 return NULL;
 
-        sd_device_unref(link->device);
-        sd_device_unref(link->device_db_clone);
+        udev_event_unref(link->event);
         free(link->kind);
-        strv_free(link->altnames);
         return mfree(link);
 }
 
-int link_new(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, sd_device *device_db_clone, Link **ret) {
+int link_new(LinkConfigContext *ctx, UdevEvent *event, Link **ret) {
+        sd_device *dev = ASSERT_PTR(ASSERT_PTR(event)->dev);
         _cleanup_(link_freep) Link *link = NULL;
         int r;
 
         assert(ctx);
-        assert(rtnl);
-        assert(device);
-        assert(device_db_clone);
+        assert(event);
         assert(ret);
 
         link = new(Link, 1);
@@ -398,31 +395,30 @@ int link_new(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, sd_de
                 return -ENOMEM;
 
         *link = (Link) {
-                .device = sd_device_ref(device),
-                .device_db_clone = sd_device_ref(device_db_clone),
+                .event = udev_event_ref(event),
         };
 
-        r = sd_device_get_sysname(device, &link->ifname);
+        r = sd_device_get_sysname(dev, &link->ifname);
         if (r < 0)
                 return r;
 
-        r = sd_device_get_ifindex(device, &link->ifindex);
+        r = sd_device_get_ifindex(dev, &link->ifindex);
         if (r < 0)
                 return r;
 
-        r = sd_device_get_action(device, &link->action);
+        r = sd_device_get_action(dev, &link->action);
         if (r < 0)
                 return r;
 
-        r = device_unsigned_attribute(device, "name_assign_type", &link->name_assign_type);
+        r = device_unsigned_attribute(dev, "name_assign_type", &link->name_assign_type);
         if (r < 0)
                 log_link_debug_errno(link, r, "Failed to get \"name_assign_type\" attribute, ignoring: %m");
 
-        r = device_unsigned_attribute(device, "addr_assign_type", &link->addr_assign_type);
+        r = device_unsigned_attribute(dev, "addr_assign_type", &link->addr_assign_type);
         if (r < 0)
                 log_link_debug_errno(link, r, "Failed to get \"addr_assign_type\" attribute, ignoring: %m");
 
-        r = rtnl_get_link_info(rtnl, link->ifindex, &link->iftype, &link->flags,
+        r = rtnl_get_link_info(&event->rtnl, link->ifindex, &link->iftype, &link->flags,
                                &link->kind, &link->hw_addr, &link->permanent_hw_addr);
         if (r < 0)
                 return r;
@@ -433,7 +429,7 @@ int link_new(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, sd_de
                         log_link_debug_errno(link, r, "Failed to get permanent hardware address, ignoring: %m");
         }
 
-        r = sd_device_get_property_value(link->device, "ID_NET_DRIVER", &link->driver);
+        r = sd_device_get_property_value(dev, "ID_NET_DRIVER", &link->driver);
         if (r < 0 && r != -ENOENT)
                 log_link_debug_errno(link, r, "Failed to get driver, ignoring: %m");
 
@@ -454,7 +450,7 @@ int link_get_config(LinkConfigContext *ctx, Link *link) {
         LIST_FOREACH(configs, config, ctx->configs) {
                 r = net_match_config(
                                 &config->match,
-                                link->device,
+                                link->event->dev,
                                 &link->hw_addr,
                                 &link->permanent_hw_addr,
                                 link->driver,
@@ -483,23 +479,19 @@ int link_get_config(LinkConfigContext *ctx, Link *link) {
         return -ENOENT;
 }
 
-static int link_apply_ethtool_settings(Link *link, int *ethtool_fd, EventMode mode) {
-        LinkConfig *config;
-        const char *name;
+static int link_apply_ethtool_settings(Link *link, int *ethtool_fd) {
+        LinkConfig *config = ASSERT_PTR(ASSERT_PTR(link)->config);
+        const char *name = ASSERT_PTR(link->ifname);
         int r;
 
-        assert(link);
-        assert(link->config);
+        assert(link->event);
         assert(ethtool_fd);
 
-        if (mode != EVENT_UDEV_WORKER) {
+        if (link->event->event_mode != EVENT_UDEV_WORKER) {
                 log_link_debug(link, "Running in test mode, skipping application of ethtool settings.");
                 return 0;
         }
 
-        config = link->config;
-        name = link->ifname;
-
         r = ethtool_set_glinksettings(ethtool_fd, name,
                                       config->autonegotiation, config->advertise,
                                       config->speed, config->duplex, config->port, config->mdi);
@@ -589,7 +581,8 @@ static int link_generate_new_hw_addr(Link *link, struct hw_addr_data *ret) {
 
         assert(link);
         assert(link->config);
-        assert(link->device);
+        assert(link->event);
+        assert(link->event->dev);
         assert(ret);
 
         if (link->hw_addr.length == 0)
@@ -655,7 +648,7 @@ static int link_generate_new_hw_addr(Link *link, struct hw_addr_data *ret) {
         else {
                 uint64_t result;
 
-                r = net_get_unique_predictable_data(link->device,
+                r = net_get_unique_predictable_data(link->event->dev,
                                                     naming_scheme_has(NAMING_STABLE_VIRTUAL_MACS),
                                                     &result);
                 if (r < 0)
@@ -689,25 +682,21 @@ finalize:
         return 0;
 }
 
-static int link_apply_rtnl_settings(Link *link, sd_netlink **rtnl, EventMode mode) {
+static int link_apply_rtnl_settings(Link *link) {
         struct hw_addr_data hw_addr = {};
-        LinkConfig *config;
+        LinkConfig *config = ASSERT_PTR(ASSERT_PTR(link)->config);
         int r;
 
-        assert(link);
-        assert(link->config);
-        assert(rtnl);
+        assert(link->event);
 
-        if (mode != EVENT_UDEV_WORKER) {
+        if (link->event->event_mode != EVENT_UDEV_WORKER) {
                 log_link_debug(link, "Running in test mode, skipping application of rtnl settings.");
                 return 0;
         }
 
-        config = link->config;
-
         (void) link_generate_new_hw_addr(link, &hw_addr);
 
-        r = rtnl_set_link_properties(rtnl, link->ifindex, config->alias, &hw_addr,
+        r = rtnl_set_link_properties(&link->event->rtnl, link->ifindex, config->alias, &hw_addr,
                                      config->txqueues, config->rxqueues, config->txqueuelen,
                                      config->mtu, config->gso_max_size, config->gso_max_segments);
         if (r < 0)
@@ -741,15 +730,8 @@ static bool enable_name_policy(void) {
 }
 
 static int link_generate_new_name(Link *link) {
-        LinkConfig *config;
-        sd_device *device;
-
-        assert(link);
-        assert(link->config);
-        assert(link->device);
-
-        config = link->config;
-        device = link->device;
+        LinkConfig *config = ASSERT_PTR(ASSERT_PTR(link)->config);;
+        sd_device *device = ASSERT_PTR(ASSERT_PTR(link->event)->dev);
 
         if (link->action != SD_DEVICE_ADD) {
                 log_link_debug(link, "Not applying Name= and NamePolicy= on '%s' uevent.",
@@ -822,14 +804,11 @@ no_rename:
 
 static int link_generate_alternative_names(Link *link) {
         _cleanup_strv_free_ char **altnames = NULL;
-        LinkConfig *config;
-        sd_device *device;
+        LinkConfig *config = ASSERT_PTR(ASSERT_PTR(link)->config);
+        sd_device *device = ASSERT_PTR(ASSERT_PTR(link->event)->dev);
         int r;
 
-        assert(link);
-        config = ASSERT_PTR(link->config);
-        device = ASSERT_PTR(link->device);
-        assert(!link->altnames);
+        assert(!ASSERT_PTR(link->event)->altnames);
 
         if (link->action != SD_DEVICE_ADD) {
                 log_link_debug(link, "Not applying AlternativeNames= and AlternativeNamesPolicy= on '%s' uevent.",
@@ -873,7 +852,7 @@ static int link_generate_alternative_names(Link *link) {
                         }
                 }
 
-        link->altnames = TAKE_PTR(altnames);
+        link->event->altnames = TAKE_PTR(altnames);
         return 0;
 }
 
@@ -906,28 +885,28 @@ static int sr_iov_configure(Link *link, sd_netlink **rtnl, SRIOV *sr_iov) {
         return 0;
 }
 
-static int link_apply_sr_iov_config(Link *link, sd_netlink **rtnl, EventMode mode) {
+static int link_apply_sr_iov_config(Link *link) {
         SRIOV *sr_iov;
         uint32_t n;
         int r;
 
         assert(link);
         assert(link->config);
-        assert(link->device);
+        assert(ASSERT_PTR(link->event)->dev);
 
-        if (mode != EVENT_UDEV_WORKER) {
+        if (link->event->event_mode != EVENT_UDEV_WORKER) {
                 log_link_debug(link, "Running in test mode, skipping application of SR-IOV settings.");
                 return 0;
         }
 
-        r = sr_iov_set_num_vfs(link->device, link->config->sr_iov_num_vfs, link->config->sr_iov_by_section);
+        r = sr_iov_set_num_vfs(link->event->dev, link->config->sr_iov_num_vfs, link->config->sr_iov_by_section);
         if (r < 0)
                 log_link_warning_errno(link, r, "Failed to set the number of SR-IOV virtual functions, ignoring: %m");
 
         if (ordered_hashmap_isempty(link->config->sr_iov_by_section))
                 return 0;
 
-        r = sr_iov_get_num_vfs(link->device, &n);
+        r = sr_iov_get_num_vfs(link->event->dev, &n);
         if (r < 0) {
                 log_link_warning_errno(link, r, "Failed to get the number of SR-IOV virtual functions, ignoring [SR-IOV] sections: %m");
                 return 0;
@@ -943,7 +922,7 @@ static int link_apply_sr_iov_config(Link *link, sd_netlink **rtnl, EventMode mod
                         continue;
                 }
 
-                r = sr_iov_configure(link, rtnl, sr_iov);
+                r = sr_iov_configure(link, &link->event->rtnl, sr_iov);
                 if (r < 0)
                         log_link_warning_errno(link, r,
                                                "Failed to configure SR-IOV virtual function %"PRIu32", ignoring: %m",
@@ -953,15 +932,15 @@ static int link_apply_sr_iov_config(Link *link, sd_netlink **rtnl, EventMode mod
         return 0;
 }
 
-static int link_apply_rps_cpu_mask(Link *link, EventMode mode) {
+static int link_apply_rps_cpu_mask(Link *link) {
         _cleanup_free_ char *mask_str = NULL;
         LinkConfig *config;
         int r;
 
-        assert(link);
-        config = ASSERT_PTR(link->config);
+        config = ASSERT_PTR(ASSERT_PTR(link)->config);
+        assert(ASSERT_PTR(link->event)->dev);
 
-        if (mode != EVENT_UDEV_WORKER) {
+        if (link->event->event_mode != EVENT_UDEV_WORKER) {
                 log_link_debug(link, "Running in test mode, skipping application of RPS setting.");
                 return 0;
         }
@@ -977,7 +956,7 @@ static int link_apply_rps_cpu_mask(Link *link, EventMode mode) {
         log_link_debug(link, "Applying RPS CPU mask: %s", mask_str);
 
         /* Currently, this will set CPU mask to all rx queue of matched device. */
-        FOREACH_DEVICE_SYSATTR(link->device, attr) {
+        FOREACH_DEVICE_SYSATTR(link->event->dev, attr) {
                 const char *c;
 
                 c = path_startswith(attr, "queues/");
@@ -993,7 +972,7 @@ static int link_apply_rps_cpu_mask(Link *link, EventMode mode) {
                 if (!path_equal(c, "/rps_cpus"))
                         continue;
 
-                r = sd_device_set_sysattr_value(link->device, attr, mask_str);
+                r = sd_device_set_sysattr_value(link->event->dev, attr, mask_str);
                 if (r < 0)
                         log_link_warning_errno(link, r, "Failed to write %s sysfs attribute, ignoring: %m", attr);
         }
@@ -1001,12 +980,9 @@ static int link_apply_rps_cpu_mask(Link *link, EventMode mode) {
         return 0;
 }
 
-static int link_apply_udev_properties(Link *link, UdevEvent *event) {
-        LinkConfig *config;
-
-        assert(link);
-
-        config = ASSERT_PTR(link->config);
+static int link_apply_udev_properties(Link *link) {
+        LinkConfig *config = ASSERT_PTR(ASSERT_PTR(link)->config);
+        UdevEvent *event = ASSERT_PTR(link->event);
 
         /* 1. apply ImportProperty=. */
         STRV_FOREACH(p, config->import_properties)
@@ -1055,19 +1031,17 @@ static int link_apply_udev_properties(Link *link, UdevEvent *event) {
         return 0;
 }
 
-int link_apply_config(LinkConfigContext *ctx, sd_netlink **rtnl, Link *link, UdevEvent *event) {
+int link_apply_config(LinkConfigContext *ctx, Link *link) {
         int r;
 
         assert(ctx);
-        assert(rtnl);
         assert(link);
-        assert(event);
 
-        r = link_apply_ethtool_settings(link, &ctx->ethtool_fd, event->event_mode);
+        r = link_apply_ethtool_settings(link, &ctx->ethtool_fd);
         if (r < 0)
                 return r;
 
-        r = link_apply_rtnl_settings(link, rtnl, event->event_mode);
+        r = link_apply_rtnl_settings(link);
         if (r < 0)
                 return r;
 
@@ -1079,15 +1053,15 @@ int link_apply_config(LinkConfigContext *ctx, sd_netlink **rtnl, Link *link, Ude
         if (r < 0)
                 return r;
 
-        r = link_apply_sr_iov_config(link, rtnl, event->event_mode);
+        r = link_apply_sr_iov_config(link);
         if (r < 0)
                 return r;
 
-        r = link_apply_rps_cpu_mask(link, event->event_mode);
+        r = link_apply_rps_cpu_mask(link);
         if (r < 0)
                 return r;
 
-        return link_apply_udev_properties(link, event);
+        return link_apply_udev_properties(link);
 }
 
 int config_parse_udev_property(
index a60e183e4b115d24012e0dc0745f61086928ac4f..fd796bbaa537d6da65ffdb7f238fd0b6ec666bf1 100644 (file)
@@ -26,16 +26,15 @@ typedef enum MACAddressPolicy {
 } MACAddressPolicy;
 
 typedef struct Link {
-        int ifindex;
-        const char *ifname;
-        const char *new_name;
-        char **altnames;
-
+        UdevEvent *event;
         LinkConfig *config;
-        sd_device *device;
-        sd_device *device_db_clone;
+
+        /* from sd_device */
+        const char *ifname;
+        int ifindex;
         sd_device_action_t action;
 
+        /* from rtnl */
         char *kind;
         const char *driver;
         uint16_t iftype;
@@ -44,6 +43,9 @@ typedef struct Link {
         struct hw_addr_data permanent_hw_addr;
         unsigned name_assign_type;
         unsigned addr_assign_type;
+
+        /* generated name */
+        const char *new_name;
 } Link;
 
 struct LinkConfig {
@@ -102,12 +104,12 @@ int link_load_one(LinkConfigContext *ctx, const char *filename);
 int link_config_load(LinkConfigContext *ctx);
 bool link_config_should_reload(LinkConfigContext *ctx);
 
-int link_new(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, sd_device *device_db_clone, Link **ret);
+int link_new(LinkConfigContext *ctx, UdevEvent *event, Link **ret);
 Link* link_free(Link *link);
 DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_free);
 
 int link_get_config(LinkConfigContext *ctx, Link *link);
-int link_apply_config(LinkConfigContext *ctx, sd_netlink **rtnl, Link *link, UdevEvent *event);
+int link_apply_config(LinkConfigContext *ctx, Link *link);
 
 const char* mac_address_policy_to_string(MACAddressPolicy p) _const_;
 MACAddressPolicy mac_address_policy_from_string(const char *p) _pure_;
index 4500a69c68e5c47316b00d6a60aa0124a92a34d3..572e171e07a84a85d26c806bd833ab876c2bf02f 100644 (file)
@@ -41,7 +41,7 @@ static int builtin_net_setup_link(UdevEvent *event, int argc, char **argv) {
                 return 0;
         }
 
-        r = link_new(ctx, &event->rtnl, dev, event->dev_db_clone, &link);
+        r = link_new(ctx, event, &link);
         if (r == -ENODEV) {
                 log_device_debug_errno(dev, r, "Link vanished while getting information, ignoring.");
                 return 0;
@@ -59,14 +59,12 @@ static int builtin_net_setup_link(UdevEvent *event, int argc, char **argv) {
                 return log_device_error_errno(dev, r, "Failed to get link config: %m");
         }
 
-        r = link_apply_config(ctx, &event->rtnl, link, event);
+        r = link_apply_config(ctx, link);
         if (r == -ENODEV)
                 log_device_debug_errno(dev, r, "Link vanished while applying configuration, ignoring.");
         else if (r < 0)
                 log_device_warning_errno(dev, r, "Could not apply link configuration, ignoring: %m");
 
-        event->altnames = TAKE_PTR(link->altnames);
-
         return 0;
 }