]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: add support to configure IPoIB interfaces
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 8 Nov 2021 00:41:51 +0000 (09:41 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 4 Dec 2021 15:18:58 +0000 (00:18 +0900)
man/systemd.network.xml
src/network/netdev/ipoib.c
src/network/netdev/ipoib.h
src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
src/network/networkd-setlink.c
src/network/networkd-setlink.h
test/fuzz/fuzz-network-parser/directives.network

index 1de7bb05387b516d6f9df64282495c0895fc5910..e8e01f9094ce0be343799a4ff38b940e423446c2 100644 (file)
@@ -3227,6 +3227,15 @@ Token=prefixstable:2002:da8:1::</programlisting></para>
       </variablelist>
   </refsect1>
 
+  <refsect1>
+    <title>[IPoIB] Section Options</title>
+      <para>The [IPoIB] section manages the IP over Infiniband and accepts the following keys:</para>
+      <variablelist class='network-directives'>
+        <xi:include href="systemd.netdev.xml" xpointer="ipoib_mode" />
+        <xi:include href="systemd.netdev.xml" xpointer="ipoib_umcast" />
+      </variablelist>
+  </refsect1>
+
   <refsect1>
     <title>[QDisc] Section Options</title>
     <para>The [QDisc] section manages the traffic control queueing discipline (qdisc).</para>
index b341001bc4f11d81e897fd3836f3e552ce33bfcc..c3f583fc4673ea0066be2dd39a5a947228fe32d3 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/if_link.h>
 
 #include "ipoib.h"
+#include "networkd-network.h"
 #include "parse-util.h"
 #include "string-table.h"
 
@@ -56,6 +57,48 @@ static int netdev_ipoib_fill_message_create(NetDev *netdev, Link *link, sd_netli
         return 0;
 }
 
+int ipoib_set_netlink_message(Link *link, sd_netlink_message *m) {
+        int r;
+
+        assert(link);
+        assert(link->network);
+        assert(m);
+
+        r = sd_netlink_message_set_flags(m, NLM_F_REQUEST | NLM_F_ACK);
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Could not set netlink flags: %m");
+
+        r = sd_netlink_message_open_container(m, IFLA_LINKINFO);
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Failed to open IFLA_LINKINFO container: %m");
+
+        r = sd_netlink_message_open_container_union(m, IFLA_INFO_DATA, link->kind);
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Could not open IFLA_INFO_DATA container: %m");
+
+        if (link->network->ipoib_mode >= 0) {
+                r = sd_netlink_message_append_u16(m, IFLA_IPOIB_MODE, link->network->ipoib_mode);
+                if (r < 0)
+                        return log_link_debug_errno(link, r, "Could not append IFLA_IPOIB_MODE attribute: %m");
+        }
+
+        if (link->network->ipoib_umcast >= 0) {
+                r = sd_netlink_message_append_u16(m, IFLA_IPOIB_UMCAST, link->network->ipoib_umcast);
+                if (r < 0)
+                        return log_link_debug_errno(link, r, "Could not append IFLA_IPOIB_UMCAST attribute: %m");
+        }
+
+        r = sd_netlink_message_close_container(m);
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Failed to close IFLA_INFO_DATA container: %m");
+
+        r = sd_netlink_message_close_container(m);
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Failed to close IFLA_LINKINFO container: %m");
+
+        return 0;
+}
+
 static const char * const ipoib_mode_table[_IP_OVER_INFINIBAND_MODE_MAX] = {
         [IP_OVER_INFINIBAND_MODE_DATAGRAM]  = "datagram",
         [IP_OVER_INFINIBAND_MODE_CONNECTED] = "connected",
index d2f5d9350f0389ebb1689391c71593225ba07ba3..415d3b107c8eabf302ba29837c56c9672b8985d4 100644 (file)
@@ -24,5 +24,7 @@ typedef struct IPoIB {
 DEFINE_NETDEV_CAST(IPOIB, IPoIB);
 extern const NetDevVTable ipoib_vtable;
 
+int ipoib_set_netlink_message(Link *link, sd_netlink_message *m);
+
 CONFIG_PARSER_PROTOTYPE(config_parse_ipoib_pkey);
 CONFIG_PARSER_PROTOTYPE(config_parse_ipoib_mode);
index 4df3e19220d5e0145fe083534e8b18172bc0dc58..266334e78ce81c77d0e4be0166fd4f1677bc32cf 100644 (file)
@@ -1101,6 +1101,10 @@ static int link_configure(Link *link) {
         if (r < 0)
                 return r;
 
+        r = link_request_to_set_ipoib(link);
+        if (r < 0)
+                return r;
+
         r = link_request_to_set_flags(link);
         if (r < 0)
                 return r;
index 4ac58a26ad01e68ac7620cf8b37be96639735af7..3b8d45c1bb5b010081b176a587361b4476e101eb 100644 (file)
@@ -382,6 +382,8 @@ CAN.PresumeACK,                              config_parse_can_control_mode,
 CAN.FDNonISO,                                config_parse_can_control_mode,                            CAN_CTRLMODE_FD_NON_ISO,       0
 CAN.ClassicDataLengthCode,                   config_parse_can_control_mode,                            CAN_CTRLMODE_CC_LEN8_DLC,      0
 CAN.Termination,                             config_parse_can_termination,                             0,                             0
+IPoIB.Mode,                                  config_parse_ipoib_mode,                                  0,                             offsetof(Network, ipoib_mode)
+IPoIB.IgnoreUserspaceMulticastGroups,        config_parse_tristate,                                    0,                             offsetof(Network, ipoib_umcast)
 QDisc.Parent,                                config_parse_qdisc_parent,                                _QDISC_KIND_INVALID,           0
 QDisc.Handle,                                config_parse_qdisc_handle,                                _QDISC_KIND_INVALID,           0
 BFIFO.Parent,                                config_parse_qdisc_parent,                                QDISC_KIND_BFIFO,              0
index 7640429f461d6c38e417a6b0cebe3d39ba86c429..6651c6c04ccf610e459bc74059f00840da8a45fe 100644 (file)
@@ -476,6 +476,9 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
                 .ipv6_accept_ra_start_dhcp6_client = IPV6_ACCEPT_RA_START_DHCP6_CLIENT_YES,
 
                 .can_termination = -1,
+
+                .ipoib_mode = _IP_OVER_INFINIBAND_MODE_INVALID,
+                .ipoib_umcast = -1,
         };
 
         r = config_parse_many(
index 2fdd4994c4c41023d2eaf301a6efc9cf7ec76d96..9304ceaafbffc86174297ea6d8cef9d0c15ffa67 100644 (file)
@@ -11,6 +11,7 @@
 #include "condition.h"
 #include "conf-parser.h"
 #include "hashmap.h"
+#include "ipoib.h"
 #include "net-condition.h"
 #include "netdev.h"
 #include "networkd-bridge-vlan.h"
@@ -286,6 +287,10 @@ struct Network {
         uint16_t can_termination;
         bool can_termination_set;
 
+        /* IPoIB support */
+        IPoIBMode ipoib_mode;
+        int ipoib_umcast;
+
         /* sysctl settings */
         AddressFamily ip_forward;
         int ipv4_accept_local;
index e7b39778da603daecbb9fe99bb245d2a2581c894..d32dc81794cdd4b5d122e9153941da90d0abb701 100644 (file)
@@ -24,6 +24,7 @@ static const char *const set_link_operation_table[_SET_LINK_OPERATION_MAX] = {
         [SET_LINK_CAN]                     = "CAN interface configurations",
         [SET_LINK_FLAGS]                   = "link flags",
         [SET_LINK_GROUP]                   = "interface group",
+        [SET_LINK_IPOIB]                   = "IPoIB configurations",
         [SET_LINK_MAC]                     = "MAC address",
         [SET_LINK_MASTER]                  = "master interface",
         [SET_LINK_MTU]                     = "MTU",
@@ -153,6 +154,10 @@ static int link_set_group_handler(sd_netlink *rtnl, sd_netlink_message *m, Link
         return set_link_handler_internal(rtnl, m, link, SET_LINK_GROUP, /* ignore = */ false, NULL);
 }
 
+static int link_set_ipoib_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
+        return set_link_handler_internal(rtnl, m, link, SET_LINK_IPOIB, /* ignore = */ true, NULL);
+}
+
 static int link_set_mac_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
         return set_link_handler_internal(rtnl, m, link, SET_LINK_MAC, /* ignore = */ true, get_link_default_handler);
 }
@@ -236,7 +241,7 @@ static int link_configure(
                 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_NEWLINK, link->master_ifindex);
                 if (r < 0)
                         return log_link_debug_errno(link, r, "Could not allocate RTM_NEWLINK message: %m");
-        } else if (op == SET_LINK_CAN) {
+        } else if (IN_SET(op, SET_LINK_CAN, SET_LINK_IPOIB)) {
                 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_NEWLINK, link->ifindex);
                 if (r < 0)
                         return log_link_debug_errno(link, r, "Could not allocate RTM_NEWLINK message: %m");
@@ -468,6 +473,11 @@ static int link_configure(
                 if (r < 0)
                         return log_link_debug_errno(link, r, "Could not append IFLA_ADDRESS attribute: %m");
                 break;
+        case SET_LINK_IPOIB:
+                r = ipoib_set_netlink_message(link, req);
+                if (r < 0)
+                        return r;
+                break;
         case SET_LINK_MASTER:
                 r = sd_netlink_message_append_u32(req, IFLA_MASTER, PTR_TO_UINT32(userdata));
                 if (r < 0)
@@ -800,6 +810,20 @@ int link_request_to_set_mac(Link *link, bool allow_retry) {
                                      NULL);
 }
 
+int link_request_to_set_ipoib(Link *link) {
+        assert(link);
+        assert(link->network);
+
+        if (link->iftype != ARPHRD_INFINIBAND)
+                return 0;
+
+        if (link->network->ipoib_mode < 0 &&
+            link->network->ipoib_umcast < 0)
+                return 0;
+
+        return link_request_set_link(link, SET_LINK_IPOIB, link_set_ipoib_handler, NULL);
+}
+
 int link_request_to_set_master(Link *link) {
         assert(link);
         assert(link->network);
index d3e9f2b9d7b4027804f140ee8680b1eae3fc3ad8..39a85a6871d848d19972187372f23965c4825ca3 100644 (file)
@@ -14,6 +14,7 @@ typedef enum SetLinkOperation {
         SET_LINK_CAN,                     /* Setting CAN interface configs. */
         SET_LINK_FLAGS,                   /* Setting IFF_NOARP or friends. */
         SET_LINK_GROUP,                   /* Setting interface group. */
+        SET_LINK_IPOIB,                   /* Setting IPoIB configs. */
         SET_LINK_MAC,                     /* Setting MAC address. */
         SET_LINK_MASTER,                  /* Setting IFLA_MASTER. */
         SET_LINK_MTU,                     /* Setting MTU. */
@@ -33,6 +34,7 @@ int link_request_to_set_can(Link *link);
 int link_request_to_set_flags(Link *link);
 int link_request_to_set_group(Link *link);
 int link_request_to_set_mac(Link *link, bool allow_retry);
+int link_request_to_set_ipoib(Link *link);
 int link_request_to_set_master(Link *link);
 int link_request_to_set_mtu(Link *link, uint32_t mtu);
 
index 68cf1ba6919f0b584490203a8ca6a33936cd4527..c1c0026234167026b628bfa8d66c26d35616f42a 100644 (file)
@@ -287,6 +287,9 @@ Loopback=
 OneShot=
 PresumeACK=
 ClassicDataLengthCode=
+[IPoIB]
+Mode=
+IgnoreUserspaceMulticastGroups=
 [Address]
 DuplicateAddressDetection=
 AutoJoin=