]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: bridge fdb add support to configure VXLAN VNI
authorSusant Sahani <ssahani@redhat.com>
Mon, 6 May 2019 14:28:52 +0000 (19:58 +0530)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 8 May 2019 01:43:43 +0000 (03:43 +0200)
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 7353b57419c6cdc772b8773282fb998e817e3b08..f24bf401595b5c5276a287db79679f416a88bfdc 100644 (file)
             table entry.</para>
           </listitem>
         </varlistentry>
+        <varlistentry>
+          <term><varname>VNI=</varname></term>
+          <listitem>
+            <para>The VXLAN Network Identifier (or VXLAN Segment ID) to use to connect to
+            the remote VXLAN tunnel endpoint. Takes a number in the range 1-16777215.
+            Defaults to unset.</para>
+          </listitem>
+        </varlistentry>
       </variablelist>
   </refsect1>
 
index 6ebc45267fcc1a4077e282be10448f7cf240035b..fdac574d74fce76abbb247f49776b35610ed51ce 100644 (file)
@@ -9,9 +9,12 @@
 #include "alloc-util.h"
 #include "conf-parser.h"
 #include "netdev/bridge.h"
+#include "netdev/vxlan.h"
 #include "netlink-util.h"
 #include "networkd-fdb.h"
 #include "networkd-manager.h"
+#include "parse-util.h"
+#include "string-util.h"
 #include "util.h"
 #include "vlan-util.h"
 
@@ -64,6 +67,7 @@ static int fdb_entry_new_static(
         *fdb_entry = (FdbEntry) {
                 .network = network,
                 .mac_addr = TAKE_PTR(mac_addr),
+                .vni = VXLAN_VID_MAX + 1,
         };
 
         LIST_PREPEND(static_fdb_entries, network->static_fdb_entries, fdb_entry);
@@ -103,9 +107,9 @@ static int set_fdb_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link)
 int fdb_entry_configure(Link *link, FdbEntry *fdb_entry) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         sd_netlink *rtnl;
-        int r;
-        uint8_t flags;
         Bridge *bridge;
+        uint8_t flags;
+        int r;
 
         assert(link);
         assert(link->network);
@@ -151,6 +155,12 @@ int fdb_entry_configure(Link *link, FdbEntry *fdb_entry) {
                         return log_link_error_errno(link, r, "Could not append NDA_DST attribute: %m");
         }
 
+        if (fdb_entry->vni <= VXLAN_VID_MAX) {
+                r = sd_netlink_message_append_u32(req, NDA_VNI, fdb_entry->vni);
+                if (r < 0)
+                        return log_link_error_errno(link, r, "Could not append NDA_VNI 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);
@@ -301,3 +311,51 @@ int config_parse_fdb_destination(
 
         return 0;
 }
+
+int config_parse_fdb_vxlan_vni(
+                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;
+        uint32_t vni;
+        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 = safe_atou32(rvalue, &vni);
+        if (r < 0) {
+                log_syntax(unit, LOG_ERR, filename, line, r,
+                           "Failed to parse VXLAN Network Identifier (VNI), ignoring assignment: %s",
+                           rvalue);
+                return 0;
+        }
+
+        if (vni > VXLAN_VID_MAX) {
+                log_syntax(unit, LOG_ERR, filename, line, 0,
+                           "FDB invalid VXLAN Network Identifier (VNI), ignoring assignment: %s",
+                           rvalue);
+                return 0;
+        }
+
+        fdb_entry->vni = vni;
+        fdb_entry = NULL;
+
+        return 0;
+}
index e3c45acd72d0406550fd3a281e2731485ccf73f0..6954e555fa413186d4cfc24b1244e3a280e6c252 100644 (file)
@@ -19,6 +19,8 @@ struct FdbEntry {
         Network *network;
         NetworkConfigSection *section;
 
+        uint32_t vni;
+
         int family;
         uint16_t vlan_id;
 
@@ -36,3 +38,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);
+CONFIG_PARSER_PROTOTYPE(config_parse_fdb_vxlan_vni);
index 646cd91e9388627333c78bdae4ebb2e6b92620b9..98c2241fca2ad79c2c74d90468e737e720629448 100644 (file)
@@ -181,6 +181,7 @@ Bridge.Priority,                        config_parse_bridge_port_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
+BridgeFDB.VNI,                          config_parse_fdb_vxlan_vni,                      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 8149a35d1ebf36a7c7281ff4cb19b7485fa1a1d2..17f21b425871639883fb60dbbb7a500f1ec3a2eb 100644 (file)
@@ -33,6 +33,7 @@ MACAddress=
 VLANId=
 MACAddress=
 Destination=
+VNI=
 [DHCP]
 UseDomains=
 UseRoutes=