]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network,udev/net: add Kind= settings in [Match] section 22545/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 17 Feb 2022 12:06:12 +0000 (21:06 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 17 Feb 2022 14:10:26 +0000 (23:10 +0900)
This may be useful for writing .network or .link files matching with
virtual interfaces.

Closes #22541.

14 files changed:
man/systemd.link.xml
man/systemd.network.xml
src/libsystemd/sd-netlink/netlink-util.c
src/libsystemd/sd-netlink/netlink-util.h
src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/shared/net-condition.c
src/shared/net-condition.h
src/udev/net/link-config-gperf.gperf
src/udev/net/link-config.c
src/udev/net/link-config.h
src/udev/udev-event.c
test/fuzz/fuzz-link-parser/directives.link
test/fuzz/fuzz-network-parser/directives.network

index 55ca597c97a2d35bd69d006a50669c0a1b632191..1eaf8e14cbceebf1c1f8414596da0383dd445004 100644 (file)
         </listitem>
       </varlistentry>
 
+      <varlistentry id='kind'>
+        <term><varname>Kind=</varname></term>
+        <listitem>
+          <para>A whitespace-separated list of shell-style globs matching the device kind, as exposed by
+          <command>networkctl status <replaceable>INTERFACE</replaceable></command> or
+          <command>ip -d link show <replaceable>INTERFACE</replaceable></command>. If the list is
+          prefixed with a "!", the test is inverted. Some valid values are <literal>bond</literal>,
+          <literal>bridge</literal>, <literal>gre</literal>, <literal>tun</literal>,
+          <literal>veth</literal>. Valid kinds are given by netlink's <literal>IFLA_INFO_KIND</literal>
+          attribute, so this is not comprehensive.
+          </para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry id='property'>
         <term><varname>Property=</varname></term>
         <listitem>
index 52d017bb78374e5597669f71053e676f58b37845..3e8d9affd967e945cc7f78eb293ecd0294c603a0 100644 (file)
@@ -85,6 +85,7 @@
       <xi:include href="systemd.link.xml" xpointer="path" />
       <xi:include href="systemd.link.xml" xpointer="driver" />
       <xi:include href="systemd.link.xml" xpointer="type" />
+      <xi:include href="systemd.link.xml" xpointer="kind" />
       <xi:include href="systemd.link.xml" xpointer="property" />
 
       <varlistentry>
index 8b4ed44790aa291f92c0ab0af614bbafc772ebac..ce2c4f3b5407c1635094d1a514a00b539ac91c2c 100644 (file)
@@ -366,11 +366,13 @@ int rtnl_get_link_info(
                 int ifindex,
                 unsigned short *ret_iftype,
                 unsigned *ret_flags,
+                char **ret_kind,
                 struct hw_addr_data *ret_hw_addr,
                 struct hw_addr_data *ret_permanent_hw_addr) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL, *reply = NULL;
         struct hw_addr_data addr = HW_ADDR_NULL, perm_addr = HW_ADDR_NULL;
+        _cleanup_free_ char *kind = NULL;
         unsigned short iftype;
         unsigned flags;
         int r;
@@ -409,6 +411,19 @@ int rtnl_get_link_info(
                         return r;
         }
 
+        if (ret_kind) {
+                r = sd_netlink_message_enter_container(reply, IFLA_LINKINFO);
+                if (r >= 0) {
+                        r = sd_netlink_message_read_string_strdup(reply, IFLA_INFO_KIND, &kind);
+                        if (r < 0 && r != -ENODATA)
+                                return r;
+
+                        r = sd_netlink_message_exit_container(reply);
+                        if (r < 0)
+                                return r;
+                }
+        }
+
         if (ret_hw_addr) {
                 r = netlink_message_read_hw_addr(reply, IFLA_ADDRESS, &addr);
                 if (r < 0 && r != -ENODATA)
@@ -425,6 +440,8 @@ int rtnl_get_link_info(
                 *ret_iftype = iftype;
         if (ret_flags)
                 *ret_flags = flags;
+        if (ret_kind)
+                *ret_kind = TAKE_PTR(kind);
         if (ret_hw_addr)
                 *ret_hw_addr = addr;
         if (ret_permanent_hw_addr)
index 097483c4351348b4e9db0cdd9f70634bafab8dde..fee450cdc2a646fc9f785c0ea64120ed49d7b5dd 100644 (file)
@@ -94,6 +94,7 @@ int rtnl_get_link_info(
                 int ifindex,
                 unsigned short *ret_iftype,
                 unsigned *ret_flags,
+                char **ret_kind,
                 struct hw_addr_data *ret_hw_addr,
                 struct hw_addr_data *ret_permanent_hw_addr);
 
index 238b68579c5b72f415dc2dc9afdeb3963fce393e..fe90bc4da54db23abf54fc9b0598ef71d98e396d 100644 (file)
@@ -1169,6 +1169,7 @@ static int link_get_network(Link *link, Network **ret) {
                                 &link->permanent_hw_addr,
                                 link->driver,
                                 link->iftype,
+                                link->kind,
                                 link->ifname,
                                 link->alternative_names,
                                 link->wlan_iftype,
index c3de7d723909c4064d00aeff8f7ca68555ffbc96..edce61996adc3357546084173b7c54672b4130a2 100644 (file)
@@ -52,6 +52,7 @@ Match.PermanentMACAddress,                   config_parse_hw_addrs,
 Match.Path,                                  config_parse_match_strv,                                  0,                             offsetof(Network, match.path)
 Match.Driver,                                config_parse_match_strv,                                  0,                             offsetof(Network, match.driver)
 Match.Type,                                  config_parse_match_strv,                                  0,                             offsetof(Network, match.iftype)
+Match.Kind,                                  config_parse_match_strv,                                  0,                             offsetof(Network, match.kind)
 Match.WLANInterfaceType,                     config_parse_match_strv,                                  0,                             offsetof(Network, match.wlan_iftype)
 Match.SSID,                                  config_parse_match_strv,                                  0,                             offsetof(Network, match.ssid)
 Match.BSSID,                                 config_parse_ether_addrs,                                 0,                             offsetof(Network, match.bssid)
index 006676d973e146b62a0ad35aabf342044e5cf3bf..b96cb60064979455d53a36e8b965733b9737c31d 100644 (file)
@@ -22,6 +22,7 @@ void net_match_clear(NetMatch *match) {
         match->path = strv_free(match->path);
         match->driver = strv_free(match->driver);
         match->iftype = strv_free(match->iftype);
+        match->kind = strv_free(match->kind);
         match->ifname = strv_free(match->ifname);
         match->property = strv_free(match->property);
         match->wlan_iftype = strv_free(match->wlan_iftype);
@@ -38,6 +39,7 @@ bool net_match_is_empty(const NetMatch *match) {
                 strv_isempty(match->path) &&
                 strv_isempty(match->driver) &&
                 strv_isempty(match->iftype) &&
+                strv_isempty(match->kind) &&
                 strv_isempty(match->ifname) &&
                 strv_isempty(match->property) &&
                 strv_isempty(match->wlan_iftype) &&
@@ -126,6 +128,7 @@ int net_match_config(
                 const struct hw_addr_data *permanent_hw_addr,
                 const char *driver,
                 unsigned short iftype,
+                const char *kind,
                 const char *ifname,
                 char * const *alternative_names,
                 enum nl80211_iftype wlan_iftype,
@@ -160,6 +163,9 @@ int net_match_config(
         if (!net_condition_test_strv(match->iftype, iftype_str))
                 return false;
 
+        if (!net_condition_test_strv(match->kind, kind))
+                return false;
+
         if (!net_condition_test_ifname(match->ifname, ifname, alternative_names))
                 return false;
 
index e767439335d532bc522cc62508622d7892b4780d..0884d43f4604f5c98b9e397c64a81df94f94eb54 100644 (file)
@@ -15,7 +15,8 @@ typedef struct NetMatch {
         Set *permanent_hw_addr;
         char **path;
         char **driver;
-        char **iftype;
+        char **iftype; /* udev's DEVTYPE field or ARPHRD_XXX, e.g. ether, wlan. */
+        char **kind;   /* IFLA_INFO_KIND attribute, e.g. gre, gretap, erspan. */
         char **ifname;
         char **property;
         char **wlan_iftype;
@@ -33,6 +34,7 @@ int net_match_config(
                 const struct hw_addr_data *permanent_hw_addr,
                 const char *driver,
                 unsigned short iftype,
+                const char *kind,
                 const char *ifname,
                 char * const *alternative_names,
                 enum nl80211_iftype wlan_iftype,
index 17b3697077ce18bff8adb94341e0440d52431b59..96280148c7bc78e4867a40e746f4fc42bfb811e3 100644 (file)
@@ -28,6 +28,7 @@ Match.OriginalName,                        config_parse_match_ifnames,
 Match.Path,                                config_parse_match_strv,               0,                             offsetof(LinkConfig, match.path)
 Match.Driver,                              config_parse_match_strv,               0,                             offsetof(LinkConfig, match.driver)
 Match.Type,                                config_parse_match_strv,               0,                             offsetof(LinkConfig, match.iftype)
+Match.Kind,                                config_parse_match_strv,               0,                             offsetof(LinkConfig, match.kind)
 Match.Property,                            config_parse_match_property,           0,                             offsetof(LinkConfig, match.property)
 Match.Host,                                config_parse_net_condition,            CONDITION_HOST,                offsetof(LinkConfig, conditions)
 Match.Virtualization,                      config_parse_net_condition,            CONDITION_VIRTUALIZATION,      offsetof(LinkConfig, conditions)
index 29e960acc04adb44b3999a78be9f9c8e1d1f5e57..9b51025c6a79a5fb234676089a845572bf0811bb 100644 (file)
@@ -361,6 +361,7 @@ Link *link_free(Link *link) {
                 return NULL;
 
         sd_device_unref(link->device);
+        free(link->kind);
         free(link->driver);
         return mfree(link);
 }
@@ -402,7 +403,8 @@ int link_new(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, Link
         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, &link->hw_addr, &link->permanent_hw_addr);
+        r = rtnl_get_link_info(rtnl, link->ifindex, &link->iftype, &link->flags,
+                               &link->kind, &link->hw_addr, &link->permanent_hw_addr);
         if (r < 0)
                 return r;
 
@@ -439,6 +441,7 @@ int link_get_config(LinkConfigContext *ctx, Link *link) {
                                 &link->permanent_hw_addr,
                                 link->driver,
                                 link->iftype,
+                                link->kind,
                                 link->ifname,
                                 /* alternative_names = */ NULL,
                                 /* wlan_iftype = */ 0,
index 90cb438e4b62ae23da6fe31834cdf628ef2daff0..ea9f560f45ee6c3bbb0a772d7eb9701a7e635f92 100644 (file)
@@ -32,6 +32,7 @@ typedef struct Link {
         sd_device *device;
         sd_device_action_t action;
 
+        char *kind;
         char *driver;
         uint16_t iftype;
         uint32_t flags;
index aa7d229816bca1683faa0503e3c6ab1cc0b91769..85f89fadd8dafb03db11327a174e64c2c65adc24 100644 (file)
@@ -900,7 +900,7 @@ static int rename_netif(UdevEvent *event) {
                 return 0;
         }
 
-        r = rtnl_get_link_info(&event->rtnl, ifindex, NULL, &flags, NULL, NULL);
+        r = rtnl_get_link_info(&event->rtnl, ifindex, NULL, &flags, NULL, NULL, NULL);
         if (r < 0)
                 return log_device_warning_errno(dev, r, "Failed to get link flags: %m");
 
index eae76749eb6715f14acbc00c32013c778d90a9d4..d6c6cc6f2effb54da39ff021e099df13fad7c564 100644 (file)
@@ -5,6 +5,7 @@ OriginalName=
 Path=
 Driver=
 Type=
+Kind=
 Property=
 Host=
 Virtualization=
index 10a40d26649cef3fe00c117f4f2272a5c08f5fc9..ef302dca7b74b05e6eeac93ad0965d79ab057958 100644 (file)
@@ -17,6 +17,7 @@ MulticastRouter=
 [Match]
 KernelVersion=
 Type=
+Kind=
 Driver=
 Architecture=
 Firmware=