mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-25 06:03:40 +03:00
network,udev/net: add Kind= settings in [Match] section
This may be useful for writing .network or .link files matching with virtual interfaces. Closes #22541.
This commit is contained in:
parent
430f07f4f8
commit
65022cd7ab
@ -178,6 +178,20 @@
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</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'>
|
<varlistentry id='property'>
|
||||||
<term><varname>Property=</varname></term>
|
<term><varname>Property=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -85,6 +85,7 @@
|
|||||||
<xi:include href="systemd.link.xml" xpointer="path" />
|
<xi:include href="systemd.link.xml" xpointer="path" />
|
||||||
<xi:include href="systemd.link.xml" xpointer="driver" />
|
<xi:include href="systemd.link.xml" xpointer="driver" />
|
||||||
<xi:include href="systemd.link.xml" xpointer="type" />
|
<xi:include href="systemd.link.xml" xpointer="type" />
|
||||||
|
<xi:include href="systemd.link.xml" xpointer="kind" />
|
||||||
<xi:include href="systemd.link.xml" xpointer="property" />
|
<xi:include href="systemd.link.xml" xpointer="property" />
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
|
@ -366,11 +366,13 @@ int rtnl_get_link_info(
|
|||||||
int ifindex,
|
int ifindex,
|
||||||
unsigned short *ret_iftype,
|
unsigned short *ret_iftype,
|
||||||
unsigned *ret_flags,
|
unsigned *ret_flags,
|
||||||
|
char **ret_kind,
|
||||||
struct hw_addr_data *ret_hw_addr,
|
struct hw_addr_data *ret_hw_addr,
|
||||||
struct hw_addr_data *ret_permanent_hw_addr) {
|
struct hw_addr_data *ret_permanent_hw_addr) {
|
||||||
|
|
||||||
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL, *reply = NULL;
|
_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;
|
struct hw_addr_data addr = HW_ADDR_NULL, perm_addr = HW_ADDR_NULL;
|
||||||
|
_cleanup_free_ char *kind = NULL;
|
||||||
unsigned short iftype;
|
unsigned short iftype;
|
||||||
unsigned flags;
|
unsigned flags;
|
||||||
int r;
|
int r;
|
||||||
@ -409,6 +411,19 @@ int rtnl_get_link_info(
|
|||||||
return r;
|
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) {
|
if (ret_hw_addr) {
|
||||||
r = netlink_message_read_hw_addr(reply, IFLA_ADDRESS, &addr);
|
r = netlink_message_read_hw_addr(reply, IFLA_ADDRESS, &addr);
|
||||||
if (r < 0 && r != -ENODATA)
|
if (r < 0 && r != -ENODATA)
|
||||||
@ -425,6 +440,8 @@ int rtnl_get_link_info(
|
|||||||
*ret_iftype = iftype;
|
*ret_iftype = iftype;
|
||||||
if (ret_flags)
|
if (ret_flags)
|
||||||
*ret_flags = flags;
|
*ret_flags = flags;
|
||||||
|
if (ret_kind)
|
||||||
|
*ret_kind = TAKE_PTR(kind);
|
||||||
if (ret_hw_addr)
|
if (ret_hw_addr)
|
||||||
*ret_hw_addr = addr;
|
*ret_hw_addr = addr;
|
||||||
if (ret_permanent_hw_addr)
|
if (ret_permanent_hw_addr)
|
||||||
|
@ -94,6 +94,7 @@ int rtnl_get_link_info(
|
|||||||
int ifindex,
|
int ifindex,
|
||||||
unsigned short *ret_iftype,
|
unsigned short *ret_iftype,
|
||||||
unsigned *ret_flags,
|
unsigned *ret_flags,
|
||||||
|
char **ret_kind,
|
||||||
struct hw_addr_data *ret_hw_addr,
|
struct hw_addr_data *ret_hw_addr,
|
||||||
struct hw_addr_data *ret_permanent_hw_addr);
|
struct hw_addr_data *ret_permanent_hw_addr);
|
||||||
|
|
||||||
|
@ -1169,6 +1169,7 @@ static int link_get_network(Link *link, Network **ret) {
|
|||||||
&link->permanent_hw_addr,
|
&link->permanent_hw_addr,
|
||||||
link->driver,
|
link->driver,
|
||||||
link->iftype,
|
link->iftype,
|
||||||
|
link->kind,
|
||||||
link->ifname,
|
link->ifname,
|
||||||
link->alternative_names,
|
link->alternative_names,
|
||||||
link->wlan_iftype,
|
link->wlan_iftype,
|
||||||
|
@ -52,6 +52,7 @@ Match.PermanentMACAddress, config_parse_hw_addrs,
|
|||||||
Match.Path, config_parse_match_strv, 0, offsetof(Network, match.path)
|
Match.Path, config_parse_match_strv, 0, offsetof(Network, match.path)
|
||||||
Match.Driver, config_parse_match_strv, 0, offsetof(Network, match.driver)
|
Match.Driver, config_parse_match_strv, 0, offsetof(Network, match.driver)
|
||||||
Match.Type, config_parse_match_strv, 0, offsetof(Network, match.iftype)
|
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.WLANInterfaceType, config_parse_match_strv, 0, offsetof(Network, match.wlan_iftype)
|
||||||
Match.SSID, config_parse_match_strv, 0, offsetof(Network, match.ssid)
|
Match.SSID, config_parse_match_strv, 0, offsetof(Network, match.ssid)
|
||||||
Match.BSSID, config_parse_ether_addrs, 0, offsetof(Network, match.bssid)
|
Match.BSSID, config_parse_ether_addrs, 0, offsetof(Network, match.bssid)
|
||||||
|
@ -22,6 +22,7 @@ void net_match_clear(NetMatch *match) {
|
|||||||
match->path = strv_free(match->path);
|
match->path = strv_free(match->path);
|
||||||
match->driver = strv_free(match->driver);
|
match->driver = strv_free(match->driver);
|
||||||
match->iftype = strv_free(match->iftype);
|
match->iftype = strv_free(match->iftype);
|
||||||
|
match->kind = strv_free(match->kind);
|
||||||
match->ifname = strv_free(match->ifname);
|
match->ifname = strv_free(match->ifname);
|
||||||
match->property = strv_free(match->property);
|
match->property = strv_free(match->property);
|
||||||
match->wlan_iftype = strv_free(match->wlan_iftype);
|
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->path) &&
|
||||||
strv_isempty(match->driver) &&
|
strv_isempty(match->driver) &&
|
||||||
strv_isempty(match->iftype) &&
|
strv_isempty(match->iftype) &&
|
||||||
|
strv_isempty(match->kind) &&
|
||||||
strv_isempty(match->ifname) &&
|
strv_isempty(match->ifname) &&
|
||||||
strv_isempty(match->property) &&
|
strv_isempty(match->property) &&
|
||||||
strv_isempty(match->wlan_iftype) &&
|
strv_isempty(match->wlan_iftype) &&
|
||||||
@ -126,6 +128,7 @@ int net_match_config(
|
|||||||
const struct hw_addr_data *permanent_hw_addr,
|
const struct hw_addr_data *permanent_hw_addr,
|
||||||
const char *driver,
|
const char *driver,
|
||||||
unsigned short iftype,
|
unsigned short iftype,
|
||||||
|
const char *kind,
|
||||||
const char *ifname,
|
const char *ifname,
|
||||||
char * const *alternative_names,
|
char * const *alternative_names,
|
||||||
enum nl80211_iftype wlan_iftype,
|
enum nl80211_iftype wlan_iftype,
|
||||||
@ -160,6 +163,9 @@ int net_match_config(
|
|||||||
if (!net_condition_test_strv(match->iftype, iftype_str))
|
if (!net_condition_test_strv(match->iftype, iftype_str))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (!net_condition_test_strv(match->kind, kind))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (!net_condition_test_ifname(match->ifname, ifname, alternative_names))
|
if (!net_condition_test_ifname(match->ifname, ifname, alternative_names))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -15,7 +15,8 @@ typedef struct NetMatch {
|
|||||||
Set *permanent_hw_addr;
|
Set *permanent_hw_addr;
|
||||||
char **path;
|
char **path;
|
||||||
char **driver;
|
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 **ifname;
|
||||||
char **property;
|
char **property;
|
||||||
char **wlan_iftype;
|
char **wlan_iftype;
|
||||||
@ -33,6 +34,7 @@ int net_match_config(
|
|||||||
const struct hw_addr_data *permanent_hw_addr,
|
const struct hw_addr_data *permanent_hw_addr,
|
||||||
const char *driver,
|
const char *driver,
|
||||||
unsigned short iftype,
|
unsigned short iftype,
|
||||||
|
const char *kind,
|
||||||
const char *ifname,
|
const char *ifname,
|
||||||
char * const *alternative_names,
|
char * const *alternative_names,
|
||||||
enum nl80211_iftype wlan_iftype,
|
enum nl80211_iftype wlan_iftype,
|
||||||
|
@ -28,6 +28,7 @@ Match.OriginalName, config_parse_match_ifnames,
|
|||||||
Match.Path, config_parse_match_strv, 0, offsetof(LinkConfig, match.path)
|
Match.Path, config_parse_match_strv, 0, offsetof(LinkConfig, match.path)
|
||||||
Match.Driver, config_parse_match_strv, 0, offsetof(LinkConfig, match.driver)
|
Match.Driver, config_parse_match_strv, 0, offsetof(LinkConfig, match.driver)
|
||||||
Match.Type, config_parse_match_strv, 0, offsetof(LinkConfig, match.iftype)
|
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.Property, config_parse_match_property, 0, offsetof(LinkConfig, match.property)
|
||||||
Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(LinkConfig, conditions)
|
Match.Host, config_parse_net_condition, CONDITION_HOST, offsetof(LinkConfig, conditions)
|
||||||
Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(LinkConfig, conditions)
|
Match.Virtualization, config_parse_net_condition, CONDITION_VIRTUALIZATION, offsetof(LinkConfig, conditions)
|
||||||
|
@ -361,6 +361,7 @@ Link *link_free(Link *link) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sd_device_unref(link->device);
|
sd_device_unref(link->device);
|
||||||
|
free(link->kind);
|
||||||
free(link->driver);
|
free(link->driver);
|
||||||
return mfree(link);
|
return mfree(link);
|
||||||
}
|
}
|
||||||
@ -402,7 +403,8 @@ int link_new(LinkConfigContext *ctx, sd_netlink **rtnl, sd_device *device, Link
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
log_link_debug_errno(link, r, "Failed to get \"addr_assign_type\" attribute, ignoring: %m");
|
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)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
@ -439,6 +441,7 @@ int link_get_config(LinkConfigContext *ctx, Link *link) {
|
|||||||
&link->permanent_hw_addr,
|
&link->permanent_hw_addr,
|
||||||
link->driver,
|
link->driver,
|
||||||
link->iftype,
|
link->iftype,
|
||||||
|
link->kind,
|
||||||
link->ifname,
|
link->ifname,
|
||||||
/* alternative_names = */ NULL,
|
/* alternative_names = */ NULL,
|
||||||
/* wlan_iftype = */ 0,
|
/* wlan_iftype = */ 0,
|
||||||
|
@ -32,6 +32,7 @@ typedef struct Link {
|
|||||||
sd_device *device;
|
sd_device *device;
|
||||||
sd_device_action_t action;
|
sd_device_action_t action;
|
||||||
|
|
||||||
|
char *kind;
|
||||||
char *driver;
|
char *driver;
|
||||||
uint16_t iftype;
|
uint16_t iftype;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
@ -900,7 +900,7 @@ static int rename_netif(UdevEvent *event) {
|
|||||||
return 0;
|
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)
|
if (r < 0)
|
||||||
return log_device_warning_errno(dev, r, "Failed to get link flags: %m");
|
return log_device_warning_errno(dev, r, "Failed to get link flags: %m");
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ OriginalName=
|
|||||||
Path=
|
Path=
|
||||||
Driver=
|
Driver=
|
||||||
Type=
|
Type=
|
||||||
|
Kind=
|
||||||
Property=
|
Property=
|
||||||
Host=
|
Host=
|
||||||
Virtualization=
|
Virtualization=
|
||||||
|
@ -17,6 +17,7 @@ MulticastRouter=
|
|||||||
[Match]
|
[Match]
|
||||||
KernelVersion=
|
KernelVersion=
|
||||||
Type=
|
Type=
|
||||||
|
Kind=
|
||||||
Driver=
|
Driver=
|
||||||
Architecture=
|
Architecture=
|
||||||
Firmware=
|
Firmware=
|
||||||
|
Loading…
x
Reference in New Issue
Block a user