]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: enable to set IFF_ALLMULTI to network device (#9146)
authorSusant Sahani <145210+ssahani@users.noreply.github.com>
Fri, 1 Jun 2018 14:22:12 +0000 (19:52 +0530)
committerLennart Poettering <lennart@poettering.net>
Fri, 1 Jun 2018 14:22:12 +0000 (16:22 +0200)
networkd: allow setting set IFF_ALLMULTI flag on network devices

man/systemd.network.xml
src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h

index 64b9232689f875f9999556ed1ca4088ba1657622..953bc74cc5a6e800f101ee7edf67d9bcefccd760 100644 (file)
       <varlistentry>
         <term><varname>ARP=</varname></term>
         <listitem>
-          <para> A boolean. Enables or disables the ARP (low-level Address Resolution Protocol)
+          <para>A boolean. Enables or disables the ARP (low-level Address Resolution Protocol)
           for this interface. Defaults to unset, which means that the kernel default will be used.</para>
           <para> For example, disabling ARP is useful when creating multiple MACVLAN or VLAN virtual
           interfaces atop a single lower-level physical interface, which will then only serve as a
       <varlistentry>
         <term><varname>Multicast=</varname></term>
         <listitem>
-          <para> A boolean. Enables or disables the change the MULTICAST flag on the device.</para>
+          <para>A boolean. Enables or disables the multicast flag on the device.</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term><varname>AllMulticast=</varname></term>
+        <listitem>
+          <para>A boolean. When this flag is set the driver retrieves all multicast packets from the network.
+          This happens when multicast routing is enabled.</para>
         </listitem>
       </varlistentry>
       <varlistentry>
index 32bcc4c45962794a194a5debc58d8114f9c6ce86..c957efd409cea1381849a146131d8436da39a14d 100644 (file)
@@ -1357,7 +1357,7 @@ static int link_set_flags(Link *link) {
         if (!link->network)
                 return 0;
 
-        if (link->network->arp < 0 && link->network->multicast < 0)
+        if (link->network->arp < 0 && link->network->multicast < 0 && link->network->allmulticast < 0)
                 return 0;
 
         r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
@@ -1374,6 +1374,11 @@ static int link_set_flags(Link *link) {
                 SET_FLAG(ifi_flags, IFF_MULTICAST, link->network->multicast);
         }
 
+        if (link->network->allmulticast >= 0) {
+                ifi_change |= IFF_ALLMULTI;
+                SET_FLAG(ifi_flags, IFF_ALLMULTI, link->network->allmulticast);
+        }
+
         r = sd_rtnl_message_link_set_flags(req, ifi_flags, ifi_change);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not set link flags: %m");
index 26e3f452ef3651b610f625856823210f7a1f9897..7e625e48fa467d4e9b030a5fd4cad5a45384dccb 100644 (file)
@@ -34,6 +34,7 @@ Link.MACAddress,                        config_parse_hwaddr,
 Link.MTUBytes,                          config_parse_mtu,                               AF_UNSPEC,                     offsetof(Network, mtu)
 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)
 Link.Unmanaged,                         config_parse_bool,                              0,                             offsetof(Network, unmanaged)
 Link.RequiredForOnline,                 config_parse_bool,                              0,                             offsetof(Network, required_for_online)
 Network.Description,                    config_parse_string,                            0,                             offsetof(Network, description)
index 57d04827abdf4a9cc44fd3c2bd3d06c5da1dda43..c3a11ddca07a7ef8ad55a38e3833f1c0a59360c4 100644 (file)
@@ -248,6 +248,7 @@ static int network_load_one(Manager *manager, const char *filename) {
         network->proxy_arp = -1;
         network->arp = -1;
         network->multicast = -1;
+        network->allmulticast = -1;
         network->ipv6_accept_ra_use_dns = true;
         network->ipv6_accept_ra_route_table = RT_TABLE_MAIN;
         network->ipv6_mtu = 0;
index 86e97909c98836888fe2a32f114824b6edc65fcd..b8e2c523a3c26b96682e2104c028a36b11b22676 100644 (file)
@@ -214,6 +214,7 @@ struct Network {
         uint32_t mtu;
         int arp;
         int multicast;
+        int allmulticast;
         bool unmanaged;
         bool configure_without_carrier;
         uint32_t iaid;