]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: Add support to configure destination address for bridge FDB
authorSusant Sahani <ssahani@redhat.com>
Tue, 30 Apr 2019 09:23:39 +0000 (14:53 +0530)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 3 May 2019 04:11:52 +0000 (06:11 +0200)
Closes #5145.

Example conf:
```
[Match]
Name=vxlan1309

[BridgeFDB]
MACAddress=00:00:00:00:00:00
Destination=10.0.0.2

[BridgeFDB]
MACAddress=00:00:00:00:00:00
Destination=10.0.0.4

[BridgeFDB]
MACAddress=00:00:00:00:00:00
Destination=10.0.0.5
```

man/systemd.network.xml
src/network/networkd-fdb.c
src/network/networkd-fdb.h
src/network/networkd-network-gperf.gperf
test/fuzz/fuzz-network-parser/directives.network

index 4381090d34eef8495f480110baa965facdbf117a..604eea4c18dc5151d2bb6aee1c5617bdbced3c22 100644 (file)
             key is mandatory.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>Destination=</varname></term>
+          <listitem>
+            <para>Takes an IP address of the destination VXLAN tunnel endpoint.</para>
+          </listitem>
+        </varlistentry>
         <varlistentry>
           <term><varname>VLANId=</varname></term>
           <listitem>
index 1934bc66eba5ec2c99e1eb09aca55b3d7a05fe84..6ebc45267fcc1a4077e282be10448f7cf240035b 100644 (file)
@@ -145,6 +145,12 @@ int fdb_entry_configure(Link *link, FdbEntry *fdb_entry) {
                         return rtnl_log_create_error(r);
         }
 
+        if (!in_addr_is_null(fdb_entry->family, &fdb_entry->destination_addr)) {
+                r = netlink_message_append_in_addr_union(req, NDA_DST, fdb_entry->family, &fdb_entry->destination_addr);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append NDA_DST attribute: %m");
+        }
+
         /* send message to the kernel to update its internal static MAC table. */
         r = netlink_call_async(rtnl, NULL, req, set_fdb_handler,
                                link_netlink_destroy_callback, link);
@@ -258,3 +264,40 @@ int config_parse_fdb_vlan_id(
 
         return 0;
 }
+
+int config_parse_fdb_destination(
+                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) {
+
+        _cleanup_(fdb_entry_free_or_set_invalidp) FdbEntry *fdb_entry = NULL;
+        Network *network = userdata;
+        int r;
+
+        assert(filename);
+        assert(section);
+        assert(lvalue);
+        assert(rvalue);
+        assert(data);
+
+        r = fdb_entry_new_static(network, filename, section_line, &fdb_entry);
+        if (r < 0)
+                return log_oom();
+
+        r = in_addr_from_string_auto(rvalue, &fdb_entry->family, &fdb_entry->destination_addr);
+        if (r < 0)
+                return log_syntax(unit, LOG_ERR, filename, line, r,
+                                  "FDB destination IP address is invalid, ignoring assignment: %s",
+                                  rvalue);
+
+        fdb_entry = NULL;
+
+        return 0;
+}
index 6b7da2e7413598d399fd508a40e4452baa33f7b1..e3c45acd72d0406550fd3a281e2731485ccf73f0 100644 (file)
@@ -19,9 +19,12 @@ struct FdbEntry {
         Network *network;
         NetworkConfigSection *section;
 
-        struct ether_addr *mac_addr;
+        int family;
         uint16_t vlan_id;
 
+        struct ether_addr *mac_addr;
+        union in_addr_union destination_addr;
+
         LIST_FIELDS(FdbEntry, static_fdb_entries);
 };
 
@@ -32,3 +35,4 @@ DEFINE_NETWORK_SECTION_FUNCTIONS(FdbEntry, fdb_entry_free);
 
 CONFIG_PARSER_PROTOTYPE(config_parse_fdb_hwaddr);
 CONFIG_PARSER_PROTOTYPE(config_parse_fdb_vlan_id);
+CONFIG_PARSER_PROTOTYPE(config_parse_fdb_destination);
index 0db59473ffd2932bba7c2f76554ab2b89542cc2f..653da83c9f791967c5bb33f22ea2e0504e31fafd 100644 (file)
@@ -179,6 +179,7 @@ Bridge.Learning,                        config_parse_tristate,
 Bridge.Priority,                        config_parse_bridge_port_priority,               0,                             offsetof(Network, priority)
 BridgeFDB.MACAddress,                   config_parse_fdb_hwaddr,                         0,                             0
 BridgeFDB.VLANId,                       config_parse_fdb_vlan_id,                        0,                             0
+BridgeFDB.Destination,                  config_parse_fdb_destination,                    0,                             0
 BridgeVLAN.PVID,                        config_parse_brvlan_pvid,                        0,                             0
 BridgeVLAN.VLAN,                        config_parse_brvlan_vlan,                        0,                             0
 BridgeVLAN.EgressUntagged,              config_parse_brvlan_untagged,                    0,                             0
index cd2031150f3a23cc5777df3fab838d99d94a2fde..fd3256e78406bee26abf9be6fc5a7c39251ee725 100644 (file)
@@ -32,6 +32,7 @@ MACAddress=
 [BridgeFDB]
 VLANId=
 MACAddress=
+Destination=
 [DHCP]
 UseDomains=
 UseRoutes=