network: Add support to group links.

Link groups are similar to port ranges found in managed switches.
You can add network interfaces to a numbered group and perform operations
on all the interfaces from that group at once.
This commit is contained in:
Susant Sahani 2020-04-07 14:36:55 +02:00 committed by Lennart Poettering
parent bf896ca628
commit 89fe653544
5 changed files with 63 additions and 0 deletions

View File

@ -205,6 +205,15 @@
controlled by other applications.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>Group=</varname></term>
<listitem>
<para>Link groups are similar to port ranges found in managed switches.
When network interfaces are added to a numbered group, operations on
all the interfaces from that group can be performed at once. An unsigned
integer ranges 0 to 4294967294. Default to unset.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>RequiredForOnline=</varname></term>
<listitem>

View File

@ -1825,6 +1825,53 @@ int link_down(Link *link, link_netlink_message_handler_t callback) {
return 0;
}
static int link_group_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
int r;
assert(link);
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return 1;
r = sd_netlink_message_get_errno(m);
if (r < 0)
log_link_message_warning_errno(link, m, r, "Could not set group for the interface");
return 1;
}
static int link_set_group(Link *link) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
int r;
assert(link);
assert(link->network);
assert(link->manager);
assert(link->manager->rtnl);
if (link->network->group <= 0)
return 0;
log_link_debug(link, "Setting group");
r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
if (r < 0)
return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
r = sd_netlink_message_append_u32(req, IFLA_GROUP, link->network->group);
if (r < 0)
return log_link_error_errno(link, r, "Could not set link group: %m");
r = netlink_call_async(link->manager->rtnl, NULL, req, link_group_handler,
link_netlink_destroy_callback, link);
if (r < 0)
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
link_ref(link);
return 0;
}
static int link_handle_bound_to_list(Link *link) {
Link *l;
Iterator i;
@ -2819,6 +2866,10 @@ static int link_configure(Link *link) {
if (r < 0)
return r;
r = link_set_group(link);
if (r < 0)
return r;
if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4 | ADDRESS_FAMILY_FALLBACK_IPV4)) {
r = ipv4ll_configure(link);
if (r < 0)

View File

@ -46,6 +46,7 @@ Match.KernelVersion, config_parse_net_condition,
Match.Architecture, config_parse_net_condition, CONDITION_ARCHITECTURE, offsetof(Network, conditions)
Link.MACAddress, config_parse_hwaddr, 0, offsetof(Network, mac)
Link.MTUBytes, config_parse_mtu, AF_UNSPEC, offsetof(Network, mtu)
Link.Group, config_parse_uint32, 0, offsetof(Network, group)
Link.ARP, config_parse_tristate, 0, offsetof(Network, arp)
Link.Multicast, config_parse_tristate, 0, offsetof(Network, multicast)
Link.AllMulticast, config_parse_tristate, 0, offsetof(Network, allmulticast)

View File

@ -247,6 +247,7 @@ struct Network {
struct ether_addr *mac;
uint32_t mtu;
uint32_t group;
int arp;
int multicast;
int allmulticast;

View File

@ -37,6 +37,7 @@ Unmanaged=
MTUBytes=
Multicast=
MACAddress=
Group=
[BridgeFDB]
VLANId=
MACAddress=