summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSusant Sahani <ssahani@vmware.com>2020-04-07 14:36:55 +0200
committerLennart Poettering <lennart@poettering.net>2020-05-15 15:27:07 +0200
commit89fe653544a310a9bbc2689c464a1cdd92bb71a2 (patch)
treead8402b8400b9b7d1d5708e26824fc13e3b229db /src
parentbf896ca628d7f362c80222858002836e0ad8bc54 (diff)
downloadsystemd-89fe653544a310a9bbc2689c464a1cdd92bb71a2.tar.gz
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.
Diffstat (limited to 'src')
-rw-r--r--src/network/networkd-link.c51
-rw-r--r--src/network/networkd-network-gperf.gperf1
-rw-r--r--src/network/networkd-network.h1
3 files changed, 53 insertions, 0 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index e261473f6f..32fe86045d 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -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)
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 7316ccffd0..d709633df3 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -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)
diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h
index 90fe222e12..092e58d42c 100644
--- a/src/network/networkd-network.h
+++ b/src/network/networkd-network.h
@@ -247,6 +247,7 @@ struct Network {
struct ether_addr *mac;
uint32_t mtu;
+ uint32_t group;
int arp;
int multicast;
int allmulticast;