]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: bridge add support to set IGMP version
authorSusant Sahani <ssahani@vmware.com>
Wed, 24 Jul 2019 12:58:57 +0000 (18:28 +0530)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 25 Jul 2019 01:05:06 +0000 (10:05 +0900)
man/systemd.netdev.xml
src/network/netdev/bridge.c
src/network/netdev/bridge.h
src/network/netdev/netdev-gperf.gperf
test/fuzz/fuzz-netdev-parser/directives.netdev

index ff37f26990cfb3de8648a2575efbc15e51c8c583..515560f14e139d43ea649e94dc25be50314be789 100644 (file)
           </para>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term><varname>IGMPVersion=</varname></term>
+        <listitem>
+          <para>Allows to change bridge's multicast Internet Group Management Protocol (IGMP) version.
+          Takes an interger 2 or 3. When unset, the kernel's default will be used.
+          </para>
+        </listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
index f20130d26441f813496561e611d0ad52ed4703c5..71a7ac7a437701ec7e37bf624ca98b4718ad8121 100644 (file)
@@ -133,6 +133,12 @@ static int netdev_bridge_post_create(NetDev *netdev, Link *link, sd_netlink_mess
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_STP_STATE attribute: %m");
         }
 
+        if (b->igmp_version > 0) {
+                r = sd_netlink_message_append_u8(req, IFLA_BR_MCAST_IGMP_VERSION, b->igmp_version);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not append IFLA_BR_MCAST_IGMP_VERSION attribute: %m");
+        }
+
         r = sd_netlink_message_close_container(req);
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_LINKINFO attribute: %m");
@@ -287,6 +293,50 @@ int link_set_bridge(Link *link) {
         return r;
 }
 
+int config_parse_bridge_igmp_version(
+                const char *unit,
+                const char *filename,
+                unsigned line,
+                const char *section,
+                unsigned section_line,
+                const char *lvalue,
+                int ltype,
+                const char *rvalue,
+                void *data,
+                void *userdata) {
+
+        Bridge *b = userdata;
+        uint8_t u;
+        int r;
+
+        assert(filename);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        if (isempty(rvalue)) {
+                b->igmp_version = 0; /* 0 means unset. */
+                return 0;
+        }
+
+        r = safe_atou8(rvalue, &u);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse bridge IGMP version number '%s', ignoring assignment: %m",
+                           rvalue);
+                return 0;
+        }
+        if (!IN_SET(u, 2, 3)) {
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "Invalid bridge IGMP version number '%s', ignoring assignment.", rvalue);
+                return 0;
+        }
+
+        b->igmp_version = u;
+
+        return 0;
+}
+
 static void bridge_init(NetDev *n) {
         Bridge *b;
 
index 2954155c373928a382fb9c3c6b4d685cc33d9993..b0a728e5a40df76fab3c2e94c87e1fbd6ced4ac1 100644 (file)
@@ -17,6 +17,7 @@ typedef struct Bridge {
         uint16_t priority;
         uint16_t group_fwd_mask;
         uint16_t default_pvid;
+        uint8_t igmp_version;
 
         usec_t forward_delay;
         usec_t hello_time;
@@ -42,3 +43,4 @@ const char* multicast_router_to_string(MulticastRouter i) _const_;
 MulticastRouter multicast_router_from_string(const char *s) _pure_;
 
 CONFIG_PARSER_PROTOTYPE(config_parse_multicast_router);
+CONFIG_PARSER_PROTOTYPE(config_parse_bridge_igmp_version);
index 8641d18026be4a9d494770796ede9f93ce4afe1d..b017ac8ec77e2504926829844ab3db4846b72458 100644 (file)
@@ -207,6 +207,7 @@ Bridge.MulticastQuerier,                  config_parse_tristate,
 Bridge.MulticastSnooping,                 config_parse_tristate,                     0,                             offsetof(Bridge, mcast_snooping)
 Bridge.VLANFiltering,                     config_parse_tristate,                     0,                             offsetof(Bridge, vlan_filtering)
 Bridge.STP,                               config_parse_tristate,                     0,                             offsetof(Bridge, stp)
+Bridge.IGMPVersion,                       config_parse_uint8,                        0,                             offsetof(Bridge, igmp_version)
 VRF.TableId,                              config_parse_uint32,                       0,                             offsetof(Vrf, table) /* deprecated */
 VRF.Table,                                config_parse_uint32,                       0,                             offsetof(Vrf, table)
 WireGuard.FirewallMark,                   config_parse_unsigned,                     0,                             offsetof(Wireguard, fwmark)
index 874c3e5f8ff22ae3521402a2e4dcdbc92d2fe915..78ffcead1cc326b70c5da9647488c2368f11bc34 100644 (file)
@@ -45,6 +45,7 @@ AgeingTimeSec=
 Priority=
 GroupForwardMask=
 VLANFiltering=
+IGMPVersion=
 [VRF]
 TableId=
 Table=