[ovs-dev] [PATCH V2] vtep-ctl and ovs-vtep support of adding explicit tunnel key
itamaro
itamar.ofeq at gmail.com
Tue Jun 14 09:14:59 UTC 2016
From: itamaro <itamar.ofeq at gmail.com>
This patch adds support for handeling a per-tunnel tunnel key in the
ovs-vtep and vtep-ctl to support the usage of neutron L2GW as an
inter-cloud gateway.
The Neutron spec is available here:
https://review.openstack.org/#/c/270786/
* previous patch submission was unusable becuase of using gmail
make check results:
## ------------- ##
## Test results. ##
## ------------- ##
2039 tests were successful.
38 tests were skipped.
Requested-by: "Ofer Ben-Yacov" <ofer.benyacov at gmail.com>
Signed-off-by: "Itamar Ofek" <itamar.ofeq at gmail.com>
---
tests/vtep-ctl.at | 132 +++++++++++++++++++++++++--------------------------
vtep/ovs-vtep | 50 +++++++++++++-------
vtep/vtep-ctl.c | 138 +++++++++++++++++++++++++++++++++++-------------------
vtep/vtep.xml | 10 +++-
4 files changed, 199 insertions(+), 131 deletions(-)
diff --git a/tests/vtep-ctl.at b/tests/vtep-ctl.at
index f0511ad..b7803c3 100644
--- a/tests/vtep-ctl.at
+++ b/tests/vtep-ctl.at
@@ -437,8 +437,8 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-local
@@ -464,7 +464,7 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-local
@@ -484,8 +484,8 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-local
@@ -495,7 +495,7 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
- 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-local
@@ -515,8 +515,8 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-remote
@@ -542,7 +542,7 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-remote
@@ -562,8 +562,8 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-remote
@@ -573,7 +573,7 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
- 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-remote
@@ -595,16 +595,16 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 00:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-local
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
- 02:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 02:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 02:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 02:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
mcast-mac-remote
@@ -627,9 +627,9 @@ AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
mcast-mac-local
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
@@ -657,10 +657,10 @@ AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
mcast-mac-local
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.13
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.13 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL(
@@ -670,9 +670,9 @@ AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
mcast-mac-local
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.13
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.13 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
VTEP_CTL_CLEANUP
@@ -693,9 +693,9 @@ AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
mcast-mac-remote
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
@@ -723,10 +723,10 @@ AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
mcast-mac-remote
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.13
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.13 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL(
@@ -736,9 +736,9 @@ AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
mcast-mac-remote
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.13
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.13 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
VTEP_CTL_CLEANUP
@@ -762,18 +762,18 @@ AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
mcast-mac-local
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
mcast-mac-remote
- 03:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 03:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 03:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 03:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 03:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 03:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
VTEP_CTL_CLEANUP
@@ -797,22 +797,22 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
mcast-mac-local
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
mcast-mac-remote
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL(
@@ -825,12 +825,12 @@ mcast-mac-local
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
mcast-mac-remote
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
VTEP_CTL_CLEANUP
@@ -854,34 +854,34 @@ AT_CHECK([RUN_VTEP_CTL(
], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
mcast-mac-local
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
[ucast-mac-remote
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
mcast-mac-remote
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL(
[clear-remote-macs ls1])], [0], [], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
[ucast-mac-local
- 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
+ 00:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
mcast-mac-local
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10
- 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12
- 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.10 [[]]
+ 01:11:22:33:44:55 -> vxlan_over_ipv4/10.0.0.12 [[]]
+ 01:11:22:33:44:66 -> vxlan_over_ipv4/10.0.0.11 [[]]
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
diff --git a/vtep/ovs-vtep b/vtep/ovs-vtep
index e52c66f..59bd96a 100755
--- a/vtep/ovs-vtep
+++ b/vtep/ovs-vtep
@@ -175,11 +175,25 @@ class Logical_Switch(object):
del self.ports[lbinding]
self.update_flood()
+ def tunnel_dict(self,entry):
+ return {
+ 'tunnel_type': entry[2],
+ 'dest_ip': entry[3],
+ 'tunnel_key': entry[4],
+ }
+
def add_tunnel(self, tunnel):
global tun_id
- vlog.info("adding tunnel %s" % tunnel)
- encap, ip = tunnel.split("/")
-
+ use_self_key = False
+ tunnel_key = tunnel['tunnel_key']
+ if not tunnel_key:
+ use_self_key = True
+ tunnel_key = self.tunnel_key
+ vlog.info("adding tunnel %s key %s" % (tunnel['dest_ip'],
+ tunnel_key))
+
+ encap = tunnel['tunnel_type']
+ ip = tunnel['dest_ip']
if encap != "vxlan_over_ipv4":
vlog.warn("unsupported tunnel format %s" % encap)
return
@@ -189,7 +203,7 @@ class Logical_Switch(object):
ovs_vsctl("add-port %s %s -- set Interface %s type=vxlan "
"options:key=%s options:remote_ip=%s"
- % (self.short_name, tun_name, tun_name, self.tunnel_key, ip))
+ % (self.short_name, tun_name, tun_name, tunnel_key, ip))
for i in range(10):
port_no = ovs_vsctl("get Interface %s ofport" % tun_name)
@@ -203,7 +217,10 @@ class Logical_Switch(object):
# Give the system a moment to allocate the port number
time.sleep(0.5)
- self.tunnels[tunnel] = (port_no, tun_name, ip)
+ self.tunnels[ip] = (port_no,
+ tun_name,
+ ip,
+ tunnel['tunnel_key'])
add_bfd(ip)
@@ -256,7 +273,7 @@ class Logical_Switch(object):
def update_remote_macs(self):
remote_macs = {}
unknown_dsts = set()
- tunnels = set()
+ tunnels = {}
parse_ucast = True
mac_list = vtep_ctl("list-remote-macs %s" % self.name).splitlines()
@@ -264,32 +281,31 @@ class Logical_Switch(object):
if (line.find("mcast-mac-remote") != -1):
parse_ucast = False
continue
-
- entry = re.split(r' (.*) -> (.*)', line)
- if len(entry) != 4:
+ entry = re.split(r' (.*) -> (.*)/(.*) \[(.*)\]', line)
+ if len(entry) != 6:
continue
if parse_ucast:
- remote_macs[entry[1]] = entry[2]
+ remote_macs[entry[1]] = self.tunnel_dict(entry)
else:
if entry[1] != "unknown-dst":
continue
- unknown_dsts.add(entry[2])
+ unknown_dsts.add(entry[3])
- tunnels.add(entry[2])
+ tunnels[entry[3]]= self.tunnel_dict(entry)
old_tunnels = set(self.tunnels.keys())
+ tunnels_keys = set(tunnels.keys())
+ for tunnel in tunnels_keys.difference(old_tunnels):
+ self.add_tunnel(tunnels[tunnel])
- for tunnel in tunnels.difference(old_tunnels):
- self.add_tunnel(tunnel)
-
- for tunnel in old_tunnels.difference(tunnels):
+ for tunnel in old_tunnels.difference(tunnels_keys):
self.del_tunnel(tunnel)
for mac in six.iterkeys(remote_macs):
if (self.remote_macs.get(mac) != remote_macs[mac]):
- self.add_remote_mac(mac, remote_macs[mac])
+ self.add_remote_mac(mac, remote_macs[mac]['dest_ip'])
for mac in six.iterkeys(self.remote_macs):
if mac not in remote_macs:
diff --git a/vtep/vtep-ctl.c b/vtep/vtep-ctl.c
index 5c18971..e09425c 100644
--- a/vtep/vtep-ctl.c
+++ b/vtep/vtep-ctl.c
@@ -345,18 +345,18 @@ Logical Router commands:\n\
lr-exists LR exit 2 if LR does not exist\n\
\n\
MAC binding commands:\n\
- add-ucast-local LS MAC [ENCAP] IP add ucast local entry in LS\n\
- del-ucast-local LS MAC del ucast local entry from LS\n\
- add-mcast-local LS MAC [ENCAP] IP add mcast local entry in LS\n\
- del-mcast-local LS MAC [ENCAP] IP del mcast local entry from LS\n\
- clear-local-macs LS clear local mac entries\n\
- list-local-macs LS list local mac entries\n\
- add-ucast-remote LS MAC [ENCAP] IP add ucast remote entry in LS\n\
- del-ucast-remote LS MAC del ucast remote entry from LS\n\
- add-mcast-remote LS MAC [ENCAP] IP add mcast remote entry in LS\n\
- del-mcast-remote LS MAC [ENCAP] IP del mcast remote entry from LS\n\
- clear-remote-macs LS clear remote mac entries\n\
- list-remote-macs LS list remote mac entries\n\
+ add-ucast-local LS MAC [ENCAP] IP [KEY] add ucast local entry in LS\n\
+ del-ucast-local LS MAC del ucast local entry from LS\n\
+ add-mcast-local LS MAC [ENCAP] IP [KEY] add mcast local entry in LS\n\
+ del-mcast-local LS MAC [ENCAP] IP del mcast local entry from LS\n\
+ clear-local-macs LS clear local mac entries\n\
+ list-local-macs LS list local mac entries\n\
+ add-ucast-remote LS MAC [ENCAP] IP [KEY] add ucast remote entry in LS\n\
+ del-ucast-remote LS MAC del ucast remote entry from LS\n\
+ add-mcast-remote LS MAC [ENCAP] IP [KEY] add mcast remote entry in LS\n\
+ del-mcast-remote LS MAC [ENCAP] IP del mcast remote entry from LS\n\
+ clear-remote-macs LS clear remote mac entries\n\
+ list-remote-macs LS list remote mac entries\n\
\n\
%s\
\n\
@@ -451,6 +451,11 @@ struct vtep_ctl_context {
* struct vtep_ctl_lrouter. */
};
+static bool is_valid_ip(const char* address)
+{
+ struct sockaddr_in sa;
+ return inet_pton(AF_INET, address, &(sa.sin_addr));
+}
/* Casts 'base' into 'struct vtep_ctl_context'. */
static struct vtep_ctl_context *
vtep_ctl_context_cast(struct ctl_context *base)
@@ -887,7 +892,8 @@ pre_get_info(struct ctl_context *ctx)
&vteprec_physical_locator_col_dst_ip);
ovsdb_idl_add_column(ctx->idl,
&vteprec_physical_locator_col_encapsulation_type);
-
+ ovsdb_idl_add_column(ctx->idl,
+ &vteprec_physical_locator_col_tunnel_key);
ovsdb_idl_add_column(ctx->idl, &vteprec_tunnel_col_local);
ovsdb_idl_add_column(ctx->idl, &vteprec_tunnel_col_remote);
}
@@ -1653,27 +1659,43 @@ add_ucast_entry(struct ctl_context *ctx, bool local)
{
struct vtep_ctl_context *vtepctl_ctx = vtep_ctl_context_cast(ctx);
struct vtep_ctl_lswitch *ls;
- const char *mac;
- const char *encap;
- const char *dst_ip;
+ const char *mac = 0;
+ const char *encap = 0;
+ const char *dst_ip = 0;
+ const char *tunnel_key = 0;
struct vteprec_physical_locator *ploc_cfg;
vtep_ctl_context_populate_cache(ctx);
ls = find_lswitch(vtepctl_ctx, ctx->argv[1], true);
mac = ctx->argv[2];
-
- if (ctx->argc == 4) {
- encap = "vxlan_over_ipv4";
- dst_ip = ctx->argv[3];
- } else {
- encap = ctx->argv[3];
- dst_ip = ctx->argv[4];
+ switch (ctx->argc)
+ {
+ case 6:
+ tunnel_key = ctx->argv[5];
+ case 5:
+ if (is_valid_ip(ctx->argv[4])){
+ dst_ip = ctx->argv[4];
+ encap = ctx->argv[3];
+ break;
+ }
+ tunnel_key = ctx->argv[4];
+ case 4:
+ dst_ip = ctx->argv[3];
+ encap = "vxlan_over_ipv4";
+ break;
+ default:
+ break;
}
ploc_cfg = find_ploc(vtepctl_ctx, encap, dst_ip);
if (!ploc_cfg) {
ploc_cfg = vteprec_physical_locator_insert(ctx->txn);
+ if (tunnel_key) {
+ int64_t segement_value = 0;
+ sscanf(tunnel_key,"%ld",&segement_value);
+ vteprec_physical_locator_set_tunnel_key(ploc_cfg,&segement_value,1);
+ }
vteprec_physical_locator_set_dst_ip(ploc_cfg, dst_ip);
vteprec_physical_locator_set_encapsulation_type(ploc_cfg, encap);
@@ -1790,7 +1812,7 @@ commit_mcast_entries(struct vtep_ctl_mcast_mac *mcast_mac)
static void
add_mcast_entry(struct ctl_context *ctx,
struct vtep_ctl_lswitch *ls, const char *mac,
- const char *encap, const char *dst_ip, bool local)
+ const char *encap, const char *dst_ip, const char* tunnel_key,bool local)
{
struct vtep_ctl_context *vtepctl_ctx = vtep_ctl_context_cast(ctx);
struct shash *mcast_shash;
@@ -1839,6 +1861,11 @@ add_mcast_entry(struct ctl_context *ctx,
ploc_cfg = find_ploc(vtepctl_ctx, encap, dst_ip);
if (!ploc_cfg) {
ploc_cfg = vteprec_physical_locator_insert(ctx->txn);
+ if (tunnel_key) {
+ int64_t tunnel_id = 0;
+ sscanf(tunnel_key,"%ld",&tunnel_id);
+ vteprec_physical_locator_set_tunnel_key(ploc_cfg,&tunnel_id,1);
+ }
vteprec_physical_locator_set_dst_ip(ploc_cfg, dst_ip);
vteprec_physical_locator_set_encapsulation_type(ploc_cfg, encap);
@@ -1908,25 +1935,35 @@ add_del_mcast_entry(struct ctl_context *ctx, bool add, bool local)
{
struct vtep_ctl_context *vtepctl_ctx = vtep_ctl_context_cast(ctx);
struct vtep_ctl_lswitch *ls;
- const char *mac;
- const char *encap;
- const char *dst_ip;
-
+ const char *mac = 0;
+ const char *encap = 0;
+ const char *dst_ip = 0;
+ const char *tunnel_key = 0;
vtep_ctl_context_populate_cache(ctx);
ls = find_lswitch(vtepctl_ctx, ctx->argv[1], true);
mac = ctx->argv[2];
- if (ctx->argc == 4) {
- encap = "vxlan_over_ipv4";
- dst_ip = ctx->argv[3];
- } else {
- encap = ctx->argv[3];
- dst_ip = ctx->argv[4];
+ switch (ctx->argc)
+ {
+ case 6:
+ tunnel_key = ctx->argv[5];
+ case 5:
+ if (is_valid_ip(ctx->argv[4])){
+ dst_ip = ctx->argv[4];
+ encap = ctx->argv[3];
+ break;
+ }
+ tunnel_key = ctx->argv[4];
+ case 4:
+ dst_ip = ctx->argv[3];
+ encap = "vxlan_over_ipv4";
+ break;
+ default:
+ break;
}
-
if (add) {
- add_mcast_entry(ctx, ls, mac, encap, dst_ip, local);
+ add_mcast_entry(ctx, ls, mac, encap, dst_ip, tunnel_key, local);
} else {
del_mcast_entry(ctx, ls, mac, encap, dst_ip, local);
}
@@ -2017,7 +2054,7 @@ list_macs(struct ctl_context *ctx, bool local)
struct svec ucast_macs;
struct shash *mcast_shash;
struct svec mcast_macs;
-
+ char tunnel_key[6];
vtep_ctl_context_populate_cache(ctx);
ls = find_lswitch(vtepctl_ctx, ctx->argv[1], true);
@@ -2032,9 +2069,13 @@ list_macs(struct ctl_context *ctx, bool local)
char *entry;
ploc_cfg = local ? ucast_local->locator : ucast_remote->locator;
-
- entry = xasprintf(" %s -> %s/%s", node->name,
- ploc_cfg->encapsulation_type, ploc_cfg->dst_ip);
+ tunnel_key[0] = 0;
+ if (ploc_cfg->tunnel_key)
+ snprintf(&tunnel_key[0],5,"%d",(uint32_t)*ploc_cfg->tunnel_key);
+ entry = xasprintf(" %s -> %s/%s [%s]", node->name,
+ ploc_cfg->encapsulation_type,
+ ploc_cfg->dst_ip,
+ tunnel_key );
svec_add_nocopy(&ucast_macs, entry);
}
ds_put_format(&ctx->output, "ucast-mac-%s\n", local ? "local" : "remote");
@@ -2047,11 +2088,14 @@ list_macs(struct ctl_context *ctx, bool local)
struct vtep_ctl_mcast_mac *mcast_mac = node->data;
struct vtep_ctl_ploc *ploc;
char *entry;
-
LIST_FOR_EACH (ploc, locators_node, &mcast_mac->locators) {
- entry = xasprintf(" %s -> %s/%s", node->name,
+ tunnel_key[0] = 0;
+ if (ploc->ploc_cfg->tunnel_key)
+ snprintf(tunnel_key,5,"%d",(uint32_t)*ploc->ploc_cfg->tunnel_key);
+ entry = xasprintf(" %s -> %s/%s [%s]", node->name,
ploc->ploc_cfg->encapsulation_type,
- ploc->ploc_cfg->dst_ip);
+ ploc->ploc_cfg->dst_ip,
+ tunnel_key);
svec_add_nocopy(&mcast_macs, entry);
}
}
@@ -2508,11 +2552,11 @@ static const struct ctl_command_syntax vtep_commands[] = {
{"lr-exists", 1, 1, NULL, pre_get_info, cmd_lr_exists, NULL, "", RO},
/* MAC binding commands. */
- {"add-ucast-local", 3, 4, NULL, pre_get_info, cmd_add_ucast_local, NULL,
+ {"add-ucast-local", 3, 5, NULL, pre_get_info, cmd_add_ucast_local, NULL,
"", RW},
{"del-ucast-local", 2, 2, NULL, pre_get_info, cmd_del_ucast_local, NULL,
"", RW},
- {"add-mcast-local", 3, 4, NULL, pre_get_info, cmd_add_mcast_local, NULL,
+ {"add-mcast-local", 3, 5, NULL, pre_get_info, cmd_add_mcast_local, NULL,
"", RW},
{"del-mcast-local", 3, 4, NULL, pre_get_info, cmd_del_mcast_local, NULL,
"", RW},
@@ -2520,11 +2564,11 @@ static const struct ctl_command_syntax vtep_commands[] = {
"", RO},
{"list-local-macs", 1, 1, NULL, pre_get_info, cmd_list_local_macs, NULL,
"", RO},
- {"add-ucast-remote", 3, 4, NULL, pre_get_info, cmd_add_ucast_remote, NULL,
+ {"add-ucast-remote", 3, 5, NULL, pre_get_info, cmd_add_ucast_remote, NULL,
"", RW},
{"del-ucast-remote", 2, 2, NULL, pre_get_info, cmd_del_ucast_remote, NULL,
"", RW},
- {"add-mcast-remote", 3, 4, NULL, pre_get_info, cmd_add_mcast_remote, NULL,
+ {"add-mcast-remote", 3, 5, NULL, pre_get_info, cmd_add_mcast_remote, NULL,
"", RW},
{"del-mcast-remote", 3, 4, NULL, pre_get_info, cmd_del_mcast_remote, NULL,
"", RW},
--
1.9.1
More information about the dev
mailing list