On Sun, Aug 14, 2016 at 3:59 AM, Itamar Ofek <[email protected]>
wrote:
>
> Darrell,
>
>
> To aviod lengthy response, i'll address the issues directly.
>
>
> The code in ovs-vtep should not be Neutron L2 border gateway specific.
> Please remove references to so-called relay and mesh ports.
>
> The relay vteps are a second level of hierachy of vteps - I have more
> detail
>
> --agreed
>
> Do not link per tunnel tunnel keys to Neutron L2 border gateway relay vteps
> in generic code, such as ovs-vtep.
>
>
> --agreed.
>
>
> Regarding vtep.ovsschema:
>
>
> diff --git a/vtep/vtep.ovsschema b/vtep/vtep.ovsschema
> index 3a24318..f41568f 100644
> --- a/vtep/vtep.ovsschema
> +++ b/vtep/vtep.ovsschema
> @@ -1,6 +1,6 @@
> {
> "name": "hardware_vtep",
> - "cksum": "353943336 11434",
> + "cksum": "3167636278 11608",
> "tables": {
> "Global": {
> "columns": {
> @@ -209,7 +209,12 @@
> "type": "string"}},
> "mutable": false},
> "dst_ip": {"type": "string", "mutable": false},
> - "tunnel_key": {"type": {"key": "integer", "min": 0, "max": 1}}},
> + "tunnel_key": {"type": {"key": "integer", "min": 0, "max": 1}},
> + "tunnel_level": {
> + "type": {
> + "key": {
> + "enum": ["set", ["level0", "level1"]],
> + "type": "string"},"min": 0, "max": 1}}},
> "indexes": [["encapsulation_type", "dst_ip", "tunnel_key"]]},
> "ACL_entry": {
> "columns": {
>
> I have no issues with this: just two notes the tunne_level should default
> to "level0"
>
I mentioned the default of level0 in the vtep.xml file and its also
explicit in the
ovs-vtep code.
Note, however vtep-ctl.c should not set this as explicit default in the
VTEP DB if
not supplied by the user.
> and vtep-ctl should be changed accordingly.
>
-- I can suggest a patch for it.
>
Yes, please add this parsing for tunnel_level; see below for more comments.
>
> In order to make sure the handling in ovs-vtep satisfies the l2gw I'd
> prefers having your suggested patch
>
> and run tests with it applied.
>
I am including a more comprehensive incremental patch as a suggestion
and to speed the process along.
It includes:
1) my tunnel_level suggestion and some related documentation
2) ovs-vtep support for tunnel_level and tunnel_scope_key including
parsing changes for "list-remote-macs".
I added tunnel_level flood set changes which follows what you did
for "relay" and "mesh" tunnels, but I made it generic using tunnel_level.
3) Other ovs-vtep suggested changes.
4) vtep-ctl.c changes for parsing tunnel_scope_key and general parsing
handling for modified code paths.
I removed the "[[]]" formatting for tunnel_scope_key here and in ovs-vtep.
5) Coding standard suggestions.
6) vtep-ctl.at format changes after removing the [[]]
It does NOT include vtep-ctl.c changes to parse tunnel_level and the various
cases for optional arguments (there are 3 optional arguments now) - that
needs to be added. I am assuming you will add that parsing for different
cases.
vtep-ctl.at should be updated for tunnel_level as well.
I think you should be primary owner for the patches and I can help as
needed.
diff --git a/tests/vtep-ctl.at b/tests/vtep-ctl.at
index 4178309..239560b 100644
--- a/tests/vtep-ctl.at
+++ b/tests/vtep-ctl.at
@@ -441,8 +441,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
- 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.12 100
+ 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-local
@@ -475,9 +475,9 @@ AT_CHECK([RUN_VTEP_CTL(
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:55:66 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.13 200
00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15
- 00:11:22:33:55:88 -> vxlan_over_ipv4/10.0.0.17 [[400]]
+ 00:11:22:33:55:88 -> vxlan_over_ipv4/10.0.0.17 400
mcast-mac-local
@@ -501,8 +501,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
- 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.12 100
+ 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-local
@@ -514,7 +514,7 @@ AT_CHECK([RUN_VTEP_CTL(
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:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-local
@@ -538,8 +538,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
- 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.12 100
+ 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-remote
@@ -568,7 +568,7 @@ AT_CHECK([RUN_VTEP_CTL(
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:55:66 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-remote
@@ -592,8 +592,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
- 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.12 100
+ 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-remote
@@ -605,7 +605,7 @@ AT_CHECK([RUN_VTEP_CTL(
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:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-remote
@@ -633,8 +633,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
- 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 00:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.12 100
+ 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-local
@@ -643,8 +643,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
- 02:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
+ 02:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.12 100
+ 02:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 200
mcast-mac-remote
@@ -672,8 +672,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.13 [[100]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.14 [[200]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.13 100
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.14 200
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
@@ -707,8 +707,8 @@ mcast-mac-local
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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[200]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 200
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL(
@@ -722,7 +722,7 @@ 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:55:77 -> vxlan_over_ipv4/10.0.0.15 [[200]]
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 200
], [], [VTEP_CTL_CLEANUP])
VTEP_CTL_CLEANUP
@@ -749,9 +749,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.13 [[100]]
- 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.15 [[200]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.14 [[300]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.13 100
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.15 200
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.14 300
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
@@ -786,9 +786,9 @@ mcast-mac-remote
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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL(
@@ -802,8 +802,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
VTEP_CTL_CLEANUP
@@ -836,9 +836,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
@@ -848,9 +848,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
VTEP_CTL_CLEANUP
@@ -886,9 +886,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
@@ -899,9 +899,9 @@ 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
- 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL(
@@ -920,9 +920,9 @@ 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
- 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
VTEP_CTL_CLEANUP
@@ -958,9 +958,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
@@ -971,9 +971,9 @@ 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
- 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL(
@@ -986,9 +986,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
- 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
- 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 100
+ 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 200
+ 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 300
], [], [VTEP_CTL_CLEANUP])
AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
diff --git a/vtep/ovs-vtep b/vtep/ovs-vtep
index 360f9fd..3b1e52e 100755
--- a/vtep/ovs-vtep
+++ b/vtep/ovs-vtep
@@ -121,51 +121,53 @@ class Logical_Switch(object):
del_bfd(remote_ip)
def vtep_ports(self, tunnel_list):
- relay_ports, mesh_ports = list(), list()
+ level0_ports = list()
+ level1_ports = list()
for tunnel in tunnel_list:
- if self.tunnels[tunnel][3]:
- relay_ports.append(self.tunnels[tunnel][0])
- continue
- mesh_ports.append(self.tunnels[tunnel][0])
- return relay_ports, mesh_ports
+ if self.tunnels[tunnel][4] is 'level1':
+ level1_ports.append(self.tunnels[tunnel][0])
+ else:
+ level0_ports.append(self.tunnels[tunnel][0])
+ return level1_ports, level0_ports
def update_flood(self):
phy_ports = list(self.ports.values())
- relay_ports, mesh_ports = self.vtep_ports(self.tunnels.keys())
- relay_unknown, mesh_unknown = self.vtep_ports(self.unknown_dsts)
+ level1_ports, level0_ports = self.vtep_ports(self.tunnels.keys())
+ level1_unknown, level0_unknown = self.vtep_ports(self.unknown_dsts)
# Traffic coming from a VTEP physical port should always be
flooded to
# all the other physical ports that belong to that VTEP device and
- # this logical switch and all relay VTEP ports.
- # If the replication mode is service node then
+ # this logical switch and all level1 VTEP ports.
+ # If the level0 replication mode is service node then
# send to one unknown_dst node (the first one here); else we
assume the
# replication mode is source node and we send the packet to all
# unknown_dst nodes.
- phy_flood_ports = phy_ports + relay_unknown
- if len(mesh_unknown) > 0:
+ phy_flood_ports = phy_ports + level1_unknown
+ if len(level0_unknown) > 0:
if self.replication_mode == "service_node":
- phy_flood_ports += mesh_unknown[0]
+ phy_flood_ports += level0_unknown[0]
else:
- phy_flood_ports += mesh_unknown
+ phy_flood_ports += level0_unknown
for port_no in phy_ports:
ovs_ofctl("add-flow %s table=1,priority=1,in_port=%s,action=%s"
% (self.short_name, port_no,
",".join(phy_flood_ports)))
- # Traffic flowing from a mesh VTEP should not be flooded to mesh
+ # Traffic flowing from a level0 VTEP should not be flooded to
level0
# unknown-dst ports
- mesh_flood_ports = phy_ports + relay_unknown
- for port_no in mesh_ports:
+ level0_flood_ports = phy_ports + level1_unknown
+ for port_no in level0_ports:
ovs_ofctl("add-flow %s table=1,priority=1,in_port=%s,action=%s"
- % (self.short_name, port_no,
",".join(mesh_flood_ports)))
+ % (self.short_name, port_no,
+ ",".join(level0_flood_ports)))
- # Traffic flowing from a relay VTEP should not be flooded to relay
+ # Traffic flowing from a level1 VTEP should not be flooded to
level1
# unknown-dst ports
- relay_flood_ports = phy_ports + mesh_unknown
- for port_no in relay_ports:
+ level1_flood_ports = phy_ports + level0_unknown
+ for port_no in level1_ports:
ovs_ofctl("add-flow %s table=1,priority=1,in_port=%s,action=%s"
% (self.short_name,
- port_no, ",".join(relay_flood_ports)))
+ port_no, ",".join(level1_flood_ports)))
def add_lbinding(self, lbinding):
vlog.info("adding %s binding to %s" % (lbinding, self.name))
@@ -186,25 +188,11 @@ 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[5],
- }
-
- def add_tunnel(self, tunnel, tunnel_key):
+ def add_tunnel(self, ip, tunnel_key, tunnel_scope_key, tunnel_level):
global tun_id
- if tunnel['tunnel_key']:
- tunnel_key = tunnel['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
+
+ vlog.info("adding tunnel: ip %s key %s tunnel_scope_key %s" %
+ (ip, tunnel_key, tunnel_scope_key))
tun_id += 1
tun_name = "vx" + str(tun_id)
@@ -218,14 +206,15 @@ class Logical_Switch(object):
if port_no != "-1":
break
elif i == 9:
- vlog.warn("couldn't create tunnel %s" % tunnel)
+ vlog.warn("couldn't create tunnel %s" % ip)
ovs_vsctl("del-port %s %s" % (self.short_name, tun_name))
return
# Give the system a moment to allocate the port number
time.sleep(0.5)
- self.tunnels[ip] = (port_no, tun_name, ip, tunnel['tunnel_key'])
+ self.tunnels[ip] = (port_no, tun_name, ip, tunnel_scope_key,
+ tunnel_level)
add_bfd(ip)
@@ -278,6 +267,7 @@ class Logical_Switch(object):
def update_remote_macs(self):
remote_macs = {}
unknown_dsts = set()
+ # A map of tunnel ip address to tunnel key and tunnel level
tunnels = {}
parse_ucast = True
@@ -297,27 +287,32 @@ class Logical_Switch(object):
if (line.find("mcast-mac-remote") != -1):
parse_ucast = False
continue
- entry = re.split(r' (.*) -> ([^/]*)/(\S*)( \[(.*)\])?', line)
+ entry = re.split(r' (.*) -> ([^/]*)/(\S*)\s?([0-9]?)\s?(.*)?',
+ line)
if len(entry) != 7:
continue
if parse_ucast:
- remote_macs[entry[1]] =
self.tunnel_dict(entry)['tunnel_type']
+ remote_macs[entry[1]] = entry[2]
else:
if entry[1] != "unknown-dst":
continue
unknown_dsts.add(entry[3])
- tunnels[entry[3]] = self.tunnel_dict(entry)
+ tunnels[entry[3]] = (entry[4], entry[5])
- old_tunnels = set(self.tunnels.keys())
- tunnels_keys = set(tunnels.keys())
- for tunnel in tunnels_keys.difference(old_tunnels):
- self.add_tunnel(tunnels[tunnel], tunnel_key)
+ old_tunnel_ips = set(self.tunnels.keys())
+ tunnel_ips = set(tunnels.keys())
+ for tunnel_ip in tunnel_ips.difference(old_tunnel_ips):
+ tunnel_scope_key = tunnels[tunnel_ip][0]
+ if (tunnel_scope_key):
+ tunnel_key = tunnel_scope_key
+ self.add_tunnel(tunnel_ip, tunnel_key, tunnel_scope_key,
+ tunnels[tunnel_ip][1])
- for tunnel in old_tunnels.difference(tunnels_keys):
- self.del_tunnel(tunnel)
+ for tunnel_ip in old_tunnel_ips.difference(tunnel_ips):
+ self.del_tunnel(tunnel_ip)
for mac in six.iterkeys(remote_macs):
if (self.remote_macs.get(mac) != remote_macs[mac]):
diff --git a/vtep/vtep-ctl.c b/vtep/vtep-ctl.c
index 1869d3f..948463d 100644
--- a/vtep/vtep-ctl.c
+++ b/vtep/vtep-ctl.c
@@ -1655,9 +1655,9 @@ 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 = 0;
- const char *encap = 0;
- const char *dst_ip = 0;
+ const char *mac;
+ const char *encap;
+ const char *dst_ip;
const char *tunnel_key = 0;
struct vteprec_physical_locator *ploc_cfg;
ovs_be32 ip = 0;
@@ -1669,31 +1669,40 @@ add_ucast_entry(struct ctl_context *ctx, bool local)
switch (ctx->argc)
{
case 6:
+ encap = ctx->argv[3];
+ dst_ip = ctx->argv[4];
tunnel_key = ctx->argv[5];
+ break;
case 5:
if (ip_parse(ctx->argv[4],&ip)){
- dst_ip = ctx->argv[4];
encap = ctx->argv[3];
- break;
+ dst_ip = ctx->argv[4];
+ } else {
+ encap = "vxlan_over_ipv4";
+ dst_ip = ctx->argv[3];
+ tunnel_key = ctx->argv[4];
}
- tunnel_key = ctx->argv[4];
+ break;
case 4:
if (ip_parse(ctx->argv[3],&ip)){
dst_ip = ctx->argv[3];
encap = "vxlan_over_ipv4";
+ break;
+ } else {
+ ctl_fatal("bad ip address %s", ctx->argv[3]);
}
- break;
default:
- break;
+ ctl_fatal("invalid argument set");
}
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;
- ovs_scan(tunnel_key,"%ld",&segement_value);
-
vteprec_physical_locator_set_tunnel_key(ploc_cfg,&segement_value,1);
+ int64_t tunnel_scope_key = 0;
+ ovs_scan(tunnel_key,"%ld",&tunnel_scope_key);
+ vteprec_physical_locator_set_tunnel_key(ploc_cfg,
+ &tunnel_scope_key,1);
}
vteprec_physical_locator_set_dst_ip(ploc_cfg, dst_ip);
vteprec_physical_locator_set_encapsulation_type(ploc_cfg, encap);
@@ -1811,7 +1820,8 @@ 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, const char*
tunnel_key,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;
@@ -1861,9 +1871,10 @@ add_mcast_entry(struct ctl_context *ctx,
if (!ploc_cfg) {
ploc_cfg = vteprec_physical_locator_insert(ctx->txn);
if (tunnel_key) {
- int64_t tunnel_id = 0;
- ovs_scan(tunnel_key,"%ld",&tunnel_id);
- vteprec_physical_locator_set_tunnel_key(ploc_cfg,&tunnel_id,1);
+ int64_t tunnel_scope_key = 0;
+ ovs_scan(tunnel_key,"%ld",&tunnel_scope_key);
+ vteprec_physical_locator_set_tunnel_key(ploc_cfg,
+ &tunnel_scope_key,1);
}
vteprec_physical_locator_set_dst_ip(ploc_cfg, dst_ip);
vteprec_physical_locator_set_encapsulation_type(ploc_cfg, encap);
@@ -1934,9 +1945,9 @@ 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 = 0;
- const char *encap = 0;
- const char *dst_ip = 0;
+ const char *mac;
+ const char *encap;
+ const char *dst_ip;
const char *tunnel_key = 0;
ovs_be32 ip = 0;
vtep_ctl_context_populate_cache(ctx);
@@ -1947,22 +1958,30 @@ add_del_mcast_entry(struct ctl_context *ctx, bool
add, bool local)
switch (ctx->argc)
{
case 6:
+ encap = ctx->argv[3];
+ dst_ip = ctx->argv[4];
tunnel_key = ctx->argv[5];
+ break;
case 5:
if (ip_parse(ctx->argv[4],&ip)){
- dst_ip = ctx->argv[4];
encap = ctx->argv[3];
- break;
+ dst_ip = ctx->argv[4];
+ } else {
+ encap = "vxlan_over_ipv4";
+ dst_ip = ctx->argv[3];
+ tunnel_key = ctx->argv[4];
}
- tunnel_key = ctx->argv[4];
+ break;
case 4:
if (ip_parse(ctx->argv[3],&ip)){
dst_ip = ctx->argv[3];
encap = "vxlan_over_ipv4";
+ break;
+ } else {
+ ctl_fatal("bad ip address %s", ctx->argv[3]);
}
- break;
default:
- break;
+ ctl_fatal("invalid argument set");
}
if (add) {
@@ -2057,7 +2076,8 @@ list_macs(struct ctl_context *ctx, bool local)
struct svec ucast_macs;
struct shash *mcast_shash;
struct svec mcast_macs;
- char tunnel_key[8];
+ char tunnel_key[10];
+ char tunnel_level[10];
vtep_ctl_context_populate_cache(ctx);
ls = find_lswitch(vtepctl_ctx, ctx->argv[1], true);
@@ -2072,13 +2092,21 @@ list_macs(struct ctl_context *ctx, bool local)
char *entry;
ploc_cfg = local ? ucast_local->locator : ucast_remote->locator;
- tunnel_key[0] = 0;
- if (ploc_cfg->tunnel_key)
- snprintf(&tunnel_key[0],8,"
[%d]",(uint32_t)(*ploc_cfg->tunnel_key));
- entry = xasprintf(" %s -> %s/%s%s", node->name,
+ tunnel_key[0] = '\0';
+ if (ploc_cfg->tunnel_key) {
+ snprintf(&tunnel_key[0], 10, " %d",
+ (uint32_t)(*ploc_cfg->tunnel_key));
+ }
+ if (ploc_cfg->tunnel_level) {
+ snprintf(tunnel_level, 10, " %s", ploc_cfg->tunnel_level);
+ } else {
+ tunnel_level[0] = '\0';
+ }
+ entry = xasprintf(" %s -> %s/%s%s%s", node->name,
ploc_cfg->encapsulation_type,
ploc_cfg->dst_ip,
- tunnel_key );
+ tunnel_key,
+ tunnel_level);
svec_add_nocopy(&ucast_macs, entry);
}
ds_put_format(&ctx->output, "ucast-mac-%s\n", local ? "local" :
"remote");
@@ -2093,13 +2121,22 @@ list_macs(struct ctl_context *ctx, bool local)
char *entry;
LIST_FOR_EACH (ploc, locators_node, &mcast_mac->locators) {
- tunnel_key[0] = 0;
- if (ploc->ploc_cfg->tunnel_key)
- snprintf(tunnel_key,8,"
[%d]",(uint32_t)(*ploc->ploc_cfg->tunnel_key));
- entry = xasprintf(" %s -> %s/%s%s", node->name,
+ tunnel_key[0] = '\0';
+ if (ploc->ploc_cfg->tunnel_key) {
+ snprintf(tunnel_key, 10, " %d",
+ (uint32_t)(*ploc->ploc_cfg->tunnel_key));
+ }
+ if (ploc->ploc_cfg->tunnel_level) {
+ snprintf(tunnel_level, 10, " %s",
+ ploc->ploc_cfg->tunnel_level);
+ } else {
+ tunnel_level[0] = '\0';
+ }
+ entry = xasprintf(" %s -> %s/%s%s%s", node->name,
ploc->ploc_cfg->encapsulation_type,
ploc->ploc_cfg->dst_ip,
- tunnel_key);
+ tunnel_key,
+ tunnel_level);
svec_add_nocopy(&mcast_macs, entry);
}
}
@@ -2556,11 +2593,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, 5, NULL, pre_get_info, cmd_add_ucast_local,
NULL,
+ {"add-ucast-local", 3, 6, 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, 5, NULL, pre_get_info, cmd_add_mcast_local,
NULL,
+ {"add-mcast-local", 3, 6, 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},
@@ -2568,11 +2605,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, 5, NULL, pre_get_info, cmd_add_ucast_remote,
NULL,
+ {"add-ucast-remote", 3, 6, 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, 5, NULL, pre_get_info, cmd_add_mcast_remote,
NULL,
+ {"add-mcast-remote", 3, 6, 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},
diff --git a/vtep/vtep.ovsschema b/vtep/vtep.ovsschema
index 3a24318..35c3fd2 100644
--- a/vtep/vtep.ovsschema
+++ b/vtep/vtep.ovsschema
@@ -1,6 +1,6 @@
{
"name": "hardware_vtep",
- "cksum": "353943336 11434",
+ "cksum": "2728111540 11603",
"tables": {
"Global": {
"columns": {
@@ -209,7 +209,12 @@
"type": "string"}},
"mutable": false},
"dst_ip": {"type": "string", "mutable": false},
- "tunnel_key": {"type": {"key": "integer", "min": 0, "max": 1}}},
+ "tunnel_key": {"type": {"key": "integer", "min": 0, "max": 1}},
+ "tunnel_level": {
+ "type": {
+ "key": {
+ "enum": ["set", ["level0", "level1"]],
+ "type": "string"},"min": 0, "max": 1}}},
"indexes": [["encapsulation_type", "dst_ip", "tunnel_key"]]},
"ACL_entry": {
"columns": {
diff --git a/vtep/vtep.xml b/vtep/vtep.xml
index 62075ca..0d255e7 100644
--- a/vtep/vtep.xml
+++ b/vtep/vtep.xml
@@ -1174,6 +1174,18 @@
</p>
</column>
+ <column name="tunnel_level">
+ <p>
+ For <code>vxlan_over_ipv4</code> encapsulation, represents the
+ hierarchy level of the <ref table="Physical_Locator"/>.
+ Broadcast, unknown unicast and multicast (BUM) traffic received
+ at one level is never sent to another <ref
table="Physical_Locator"/>
+ of the same level. The only valid values supported are level0 and
+ level1; this column is optional and the default value if not
+ configured is level0.
+ </p>
+ </column>
+
</table>
<table name="ACL_entry">
<p>
>
> Regards
>
>
> Itamar
> ------------------------------
> *From:* dev <[email protected]> on behalf of Darrell Ball <
> [email protected]>
> *Sent:* Saturday, August 13, 2016 4:05:07 AM
> *To:* itamaro
> *Cc:* ovs dev
> *Subject:* Re: [ovs-dev] [PATCH V3] ovs-vtep: vtep-ctl and ovs-vtep
> support of adding explicit tunnel key
>
> I tried simulating your use case since there is no real test case
> at the moment and found a missed check in my suggested incremental
> patch.
>
> I added the additional 2 lines
> + if (tunnel_scope_key):
> + tunnel_key = tunnel_scope_key
>
> in the following context
> + old_tunnel_ips = set(self.tunnels.keys())
> + tunnel_ips = set(tunnels.keys())
> + for tunnel_ip in tunnel_ips.difference(old_tunnel_ips):
> + tunnel_scope_key = tunnels[tunnel_ip]
> + if (tunnel_scope_key):
> + tunnel_key = tunnel_scope_key
> + self.add_tunnel(tunnel_ip, tunnel_key, tunnel_scope_key)
>
>
>
>
>
> On Thu, Aug 11, 2016 at 2:12 PM, Darrell Ball <[email protected]> wrote:
>
> > I have various comments; I focused on the big picture mainly and
> > did not review most details except ovs-vtep and one or two selected
> > spots elsewhere, pending agreement on the big picture.
> >
> > Some comments are the same as I made in the first patch.
> >
> > Your patch did not apply cleanly due to previous change in
> > vtep-ctl.c includes, I fixed it locally - please check.
> >
> >
> > On Sun, Jul 24, 2016 at 5:01 AM, itamaro <[email protected]> wrote:
> >
> >> From: itamaro <[email protected]>
> >>
> >> 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/
> >>
> >> The aim of this patch is to support the usage of hardware vtep switch as
> >> an inter-cloud gateway, which is used to connect two separated l2
> >> broadcast
> >> domains. This document will also explain the logic behind the addition
> of
> >> the
> >> new per-tunnel tunnel-key in the hardware_vtep schema.
> >>
> >> The introduction of the relay tunnel, does not change the current logic
> of
> >> hardware_vtep, it does however introduce new logic related to iner-cloud
> >> connectivity.
> >>
> >>
> >> Network layout
> >> ==============
> >>
> >> virtual network 1 shared network virtual
> >> network 2
> >> +------------+
> >> +------------+
> >> |Compute Host| VNI=1 VNI=2
> >> |Compute Host|
> >> | +--+ <---------+ +------->
> >> +--+ |
> >> | |vm| | | | |
> >> |vm| |
> >> | +--+ | | L3 network | |
> >> +--+ |
> >> +---^--------+ | |
> >> +---------^--+
> >> | +-------v--------+ X +----------v-----+
> >> |
> >> | +---> hardware_vtep | X | hardware_vtep |
> >> |
> >> | VNI=1| | logical switch | X | logical switch
> >> <-----+ |
> >> | | | (tunnel_key 1) |==<<==X=>>==| (tunnel_key 2) |
> >> |VNI=2|
> >> | | | +-+ +-+ | X | +-+ +-+ |
> >> | |
> >> | | | |-| |-| | X | |-| |-| |
> >> | |
> >> +---v------v-+ +----------------+ X +----------------+
> >> | |
> >> |Compute Host| vlan2| |vlan5 vlan9| |vlan21
> >> | |
> >> | +--+ | | | relay vxlan | |
> >> +---v-----v--+
> >> | |vm| | | | VNI=100 | |
> >> |Compute Host|
> >> | +--+ | | | | | |
> >> +--+ |
> >> +------------+ +-v-+ +-v-+ +-v-+ +-v-+ |
> >> |vm| |
> >> | | | | | | | | |
> >> +--+ |
> >> | | | | | | | |
> >> +------------+
> >> +---+ +---+ +---+ +---+
> >> Bare metal elements Bare metal elements
> >>
> >> Logical switch
> >> ===============
> >> In a cloud architecture, there is sometimes need to connect virtual
> >> machines
> >> and physical machines to the same L2 broadcast domain.
> >> A logical switch is an entity representing an l2 virtual overlay
> network,
> >> identified by a shared tunnel key. This tunnel key (VxLAN VNI) is shared
> >> among
> >> all overlay virtual tunnel endpoints (VTEP) of the switch.
> >> The logical switch binds physical ports with either identical or
> different
> >> "VLAN" tags to the "VxLAN overlay" network.
> >>
> >> In a multi-cloud architecture, it may be useful to establish a
> cross-cloud
> >> l2 broadcast domain. The extended hardware vtep uses a relay l2 tunnel,
> >> which is a tunnel with an explicit tunnel-key property. The tunnel-key
> >> propery
> >> is used to map each overlay network (logical switch tunnel-key) in each
> >> cloud to
> >> the tunnel-key of the relay tunnel.
> >>
> >> The mapping to a remote logical switch is done by defining the same
> >> tunnel key
> >> in both ends of the the relay tunnel. This tunnel key (VxLAN VNI) is a
> >> property of the relay tunnel itself.
> >>
> >> To support the above tunnel behevior, a new kind of VTEP port is logic
> is
> >> introduced, defining two VTEP port groups. One group represents the
> >> existing
> >> VTEP ports of the local l2 overlay network, and another new group
> >> represents the
> >> individual l2 relay VTEPS.
> >>
> >> Multicast and Unknown unicast traffic
> >> =====================================
> >> Currently Broadcast, Unknown unicast, and Multicast,"BUM" traffic to the
> >> overlay networks
> >> is handled by two replication modes:
> >>
> >> - "source_node" mode: The packets originated from physical port
> >> are replicated on all the VTEPs ports pointed by unknown-dst, and
> >> flooded
> >> to all the physical bound ports.
> >>
> >> - "service_node" mode: The packets originated from physical port are
> >> forwarded to only a selected single service node from the
> unknown-dst
> >> ports
> >> (the service node responsible for "BUM" propagation to the overlay
> >> network),
> >> and flooded to all the physical bound ports.
> >>
> >> In either of the replication modes BUM traffic originated from a VTEP
> >> port is
> >> flooded only to all physical ports.
> >>
> >
> > A refresh of what is source_node and service_node replication does not
> > belong here
> > and adds to the already lengthy commit message.
> >
> >
> >
> >>
> >> Considering the new l2-relay VTEPs ports group, relay related BUM
> traffic
> >> is
> >> handled as follows:
> >> - BUM packets from Physical Port and from local overlay network are
> >> replicated
> >> to the unknown-dst l2-relay ports.
> >> The reason is that a relay VTEP is not a part of the local
> managed
> >> network and BUM traffic to the relay VTEPs cannot be suppressed
> by
> >> a
> >> local service node.
> >> - BUM packets from relay VTEPs are handled according to the
> replicating
> >> mode
> >> and not forwarded/replicated to the l2-relay ports.
> >> It is assumed that relay tunnels do not interconnect remote
> >> networks.
> >
> >
> >> To sum it up, the role of the l2-relay is merely to connect two distinct
> >> broadcast domains, it will otherwise never be used as a switching fabric
> >> among
> >> the different remote l2 networks.
> >>
> >
> > This statement looks misleading. The so called l2 relay ports support BUM
> > traffic and
> > hence its part of L2 switching logic in that sense.
> >
> >
> >
> >
> >>
> >> ovs-vtep manifested changes
> >> ===========================
> >>
> >> 1. The code need to distinguish between overlay (mesh) VTEPs, and relay
> >> VTEPs.
> >> 2. BUM traffic
> >> * BUM traffic from either mesh or bare metal network is replicated
> on
> >> all
> >> relay 'unknown-dst' VTEP.
> >> * BUM traffic from relay VTEP, is handled according to the
> >> replicating mode
> >> and is not forwarded/replicated to the l2-relay ports.
> >>
> >
> > The code in ovs-vtep should not be Neutron L2 border gateway specific.
> > Please remove references to so-called relay and mesh ports.
> >
> > The relay vteps are a second level of hierachy of vteps - I have more
> > detailed
> > comments in the code.
> >
> > Do not link per tunnel tunnel keys to Neutron L2 border gateway relay
> vteps
> > in generic code, such as ovs-vtep.
> >
> >
> >>
> >>
> >> Requested-by: "Ofer Ben-Yacov" <[email protected]>
> >> Signed-off-by: "Itamar Ofek" <[email protected]>
> >> ---
> >> tests/vtep-ctl.at | 145 ++++++++++++++++++++++++++++++
> >> +++++++++++++++++-------
> >> vtep/ovs-vtep | 102 +++++++++++++++++++++++++-------------
> >> vtep/vtep-ctl.c | 138 ++++++++++++++++++++++++++++++
> >> ++++-----------------
> >> 3 files changed, 286 insertions(+), 99 deletions(-)
> >>
> >> diff --git a/tests/vtep-ctl.at b/tests/vtep-ctl.at
> >> index f0511ad..4178309 100644
> >> --- a/tests/vtep-ctl.at
> >> +++ b/tests/vtep-ctl.at
> >> @@ -433,12 +433,16 @@ AT_CHECK([RUN_VTEP_CTL(
> >> CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-local ls1 00:11:22:33:44:55 10.0.0.10],
> >> - [add-ucast-local ls1 00:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11])
> >> + [add-ucast-local ls1 00:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> + [add-ucast-local ls1 00:11:22:33:55:66 10.0.0.12 100],
> >> + [add-ucast-local ls1 00:11:22:33:55:77 vxlan_over_ipv4 10.0.0.13
> 200])
> >> ], [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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
> >> + 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-local
> >>
> >> @@ -460,11 +464,20 @@ AT_CHECK([RUN_VTEP_CTL(
> >> CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-local ls1 00:11:22:33:44:55 10.0.0.10],
> >> - [add-ucast-local ls1 00:11:22:33:44:55 10.0.0.11])
> >> + [add-ucast-local ls1 00:11:22:33:44:55 10.0.0.11],
> >> + [add-ucast-local ls1 00:11:22:33:55:66 10.0.0.12 100],
> >> + [add-ucast-local ls1 00:11:22:33:55:66 10.0.0.13 200],
> >> + [add-ucast-local ls1 00:11:22:33:55:77 10.0.0.14 300],
> >> + [add-ucast-local ls1 00:11:22:33:55:77 10.0.0.15],
> >> + [add-ucast-local ls1 00:11:22:33:55:88 10.0.0.16],
> >> + [add-ucast-local ls1 00:11:22:33:55:88 10.0.0.17 400])
> >> ], [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:55:66 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >> + 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15
> >> + 00:11:22:33:55:88 -> vxlan_over_ipv4/10.0.0.17 [[400]]
> >>
> >> mcast-mac-local
> >>
> >> @@ -480,22 +493,28 @@ AT_CHECK([RUN_VTEP_CTL(
> >> CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-local ls1 00:11:22:33:44:55 10.0.0.10],
> >> - [add-ucast-local ls1 00:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11])
> >> + [add-ucast-local ls1 00:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> + [add-ucast-local ls1 00:11:22:33:55:66 10.0.0.12 100],
> >> + [add-ucast-local ls1 00:11:22:33:55:77 vxlan_over_ipv4 10.0.0.13
> 200])
> >> ], [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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
> >> + 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-local
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> - [del-ucast-local ls1 00:11:22:33:44:55])
> >> + [del-ucast-local ls1 00:11:22:33:44:55],
> >> + [del-ucast-local ls1 00:11:22:33:55:66])
> >> ], [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:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-local
> >>
> >> @@ -511,12 +530,16 @@ AT_CHECK([RUN_VTEP_CTL(
> >> CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-remote ls1 00:11:22:33:44:55 10.0.0.10],
> >> - [add-ucast-remote ls1 00:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11])
> >> + [add-ucast-remote ls1 00:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> + [add-ucast-remote ls1 00:11:22:33:55:66 10.0.0.12 100],
> >> + [add-ucast-remote ls1 00:11:22:33:55:77 10.0.0.13 200])
> >> ], [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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
> >> + 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-remote
> >>
> >> @@ -538,11 +561,14 @@ AT_CHECK([RUN_VTEP_CTL(
> >> CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-remote ls1 00:11:22:33:44:55 10.0.0.10],
> >> - [add-ucast-remote ls1 00:11:22:33:44:55 10.0.0.11])
> >> + [add-ucast-remote ls1 00:11:22:33:44:55 10.0.0.11],
> >> + [add-ucast-remote ls1 00:11:22:33:55:66 10.0.0.12 100],
> >> + [add-ucast-remote ls1 00:11:22:33:55:66 10.0.0.13 200])
> >> ], [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:55:66 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-remote
> >>
> >> @@ -558,22 +584,28 @@ AT_CHECK([RUN_VTEP_CTL(
> >> CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-remote ls1 00:11:22:33:44:55 10.0.0.10],
> >> - [add-ucast-remote ls1 00:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11])
> >> + [add-ucast-remote ls1 00:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> + [add-ucast-remote ls1 00:11:22:33:55:66 10.0.0.12 100],
> >> + [add-ucast-remote ls1 00:11:22:33:55:77 vxlan_over_ipv4 10.0.0.13
> >> 200])
> >> ], [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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
> >> + 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-remote
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> - [del-ucast-remote ls1 00:11:22:33:44:55])
> >> + [del-ucast-remote ls1 00:11:22:33:44:55],
> >> + [del-ucast-remote ls1 00:11:22:33:55:66])
> >> ], [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:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-remote
> >>
> >> @@ -590,13 +622,19 @@ CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-local ls1 00:11:22:33:44:55 10.0.0.10],
> >> [add-ucast-local ls1 00:11:22:33:44:66 10.0.0.11],
> >> + [add-ucast-local ls1 00:11:22:33:55:66 10.0.0.12 100],
> >> + [add-ucast-local ls1 00:11:22:33:55:77 vxlan_over_ipv4 10.0.0.13
> 200],
> >> [add-ucast-remote ls1 02:11:22:33:44:55 10.0.0.10],
> >> - [add-ucast-remote ls1 02:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11])
> >> + [add-ucast-remote ls1 02:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> + [add-ucast-remote ls1 02:11:22:33:55:66 10.0.0.12 100],
> >> + [add-ucast-remote ls1 02:11:22:33:55:77 vxlan_over_ipv4 10.0.0.13
> >> 200])
> >> ], [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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
> >> + 00:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-local
> >>
> >> @@ -605,6 +643,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.12 [[100]]
> >> + 02:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.13 [[200]]
> >>
> >> mcast-mac-remote
> >>
> >> @@ -621,7 +661,9 @@ CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-mcast-local ls1 01:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-local ls1 01:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> - [add-mcast-local ls1 01:11:22:33:44:55 10.0.0.12])
> >> + [add-mcast-local ls1 01:11:22:33:44:55 10.0.0.12],
> >> + [add-mcast-local ls1 01:11:22:33:55:66 10.0.0.13 100],
> >> + [add-mcast-local ls1 01:11:22:33:55:77 vxlan_over_ipv4 10.0.0.14
> 200])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
> >> [ucast-mac-local
> >> @@ -630,6 +672,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.13 [[100]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.14 [[200]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
> >> @@ -651,7 +695,9 @@ AT_CHECK([RUN_VTEP_CTL(
> >> [add-mcast-local ls1 01:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-local ls1 01:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> [add-mcast-local ls1 01:11:22:33:44:55 10.0.0.12],
> >> - [add-mcast-local ls1 01:11:22:33:44:55 10.0.0.13])
> >> + [add-mcast-local ls1 01:11:22:33:44:55 10.0.0.13],
> >> + [add-mcast-local ls1 01:11:22:33:55:66 10.0.0.14 100],
> >> + [add-mcast-local ls1 01:11:22:33:55:77 vxlan_over_ipv4 10.0.0.15
> 200])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
> >> [ucast-mac-local
> >> @@ -661,10 +707,13 @@ mcast-mac-local
> >> 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[200]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> - [del-mcast-local ls1 01:11:22:33:44:55 10.0.0.12])
> >> + [del-mcast-local ls1 01:11:22:33:44:55 10.0.0.12],
> >> + [del-mcast-local ls1 01:11:22:33:55:66 10.0.0.14])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
> >> [ucast-mac-local
> >> @@ -673,6 +722,7 @@ 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:55:77 -> vxlan_over_ipv4/10.0.0.15 [[200]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> VTEP_CTL_CLEANUP
> >> @@ -687,7 +737,10 @@ CHECK_LSWITCHES([ls1])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-remote ls1 01:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> - [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12])
> >> + [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12],
> >> + [add-mcast-remote ls1 01:11:22:33:55:66 10.0.0.13 100],
> >> + [add-mcast-remote ls1 01:11:22:33:55:77 vxlan_over_ipv4 10.0.0.14
> >> 300],
> >> + [add-mcast-remote ls1 01:11:22:33:55:66 10.0.0.15 200])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
> >> [ucast-mac-remote
> >> @@ -696,6 +749,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.13 [[100]]
> >> + 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.15 [[200]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.14 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
> >> @@ -717,7 +773,10 @@ AT_CHECK([RUN_VTEP_CTL(
> >> [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-remote ls1 01:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12],
> >> - [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.13])
> >> + [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.13],
> >> + [add-mcast-remote ls1 01:11:22:33:55:66 10.0.0.14 100],
> >> + [add-mcast-remote ls1 01:11:22:33:55:77 vxlan_over_ipv4 10.0.0.15
> >> 300],
> >> + [add-mcast-remote ls1 01:11:22:33:55:66 10.0.0.16 200])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
> >> [ucast-mac-remote
> >> @@ -727,10 +786,14 @@ mcast-mac-remote
> >> 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> - [del-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12])
> >> + [del-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12],
> >> + [del-mcast-remote ls1 01:11:22:33:55:66 10.0.0.14])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
> >> [ucast-mac-remote
> >> @@ -739,6 +802,8 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> VTEP_CTL_CLEANUP
> >> @@ -756,7 +821,13 @@ AT_CHECK([RUN_VTEP_CTL(
> >> [add-mcast-local ls1 01:11:22:33:44:55 10.0.0.12],
> >> [add-mcast-remote ls1 03:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-remote ls1 03:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> - [add-mcast-remote ls1 03:11:22:33:44:55 10.0.0.12])
> >> + [add-mcast-remote ls1 03:11:22:33:44:55 10.0.0.12],
> >> + [add-mcast-local ls1 01:11:22:33:55:66 10.0.0.14 100],
> >> + [add-mcast-local ls1 01:11:22:33:55:77 vxlan_over_ipv4 10.0.0.15
> 300],
> >> + [add-mcast-local ls1 01:11:22:33:55:66 10.0.0.16 200],
> >> + [add-mcast-remote ls1 03:11:22:33:55:66 10.0.0.14 100],
> >> + [add-mcast-remote ls1 03:11:22:33:55:77 vxlan_over_ipv4 10.0.0.15
> >> 300],
> >> + [add-mcast-remote ls1 03:11:22:33:55:66 10.0.0.16 200])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
> >> [ucast-mac-local
> >> @@ -765,6 +836,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
> >> @@ -774,7 +848,10 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >> +
> >> ], [], [VTEP_CTL_CLEANUP])
> >> VTEP_CTL_CLEANUP
> >> AT_CLEANUP
> >> @@ -793,7 +870,13 @@ AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-remote ls1 00:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-remote ls1 01:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> - [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12])
> >> + [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12],
> >> + [add-mcast-local ls1 01:11:22:33:55:66 10.0.0.14 100],
> >> + [add-mcast-local ls1 01:11:22:33:55:77 vxlan_over_ipv4 10.0.0.15
> 300],
> >> + [add-mcast-local ls1 01:11:22:33:55:66 10.0.0.16 200],
> >> + [add-mcast-remote ls1 03:11:22:33:55:66 10.0.0.14 100],
> >> + [add-mcast-remote ls1 03:11:22:33:55:77 vxlan_over_ipv4 10.0.0.15
> >> 300],
> >> + [add-mcast-remote ls1 03:11:22:33:55:66 10.0.0.16 200])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
> >> [ucast-mac-local
> >> @@ -803,6 +886,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
> >> @@ -813,6 +899,9 @@ 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
> >> + 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> @@ -831,6 +920,9 @@ 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
> >> + 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> VTEP_CTL_CLEANUP
> >> @@ -850,7 +942,13 @@ AT_CHECK([RUN_VTEP_CTL(
> >> [add-ucast-remote ls1 00:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.10],
> >> [add-mcast-remote ls1 01:11:22:33:44:66 vxlan_over_ipv4 10.0.0.11],
> >> - [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12])
> >> + [add-mcast-remote ls1 01:11:22:33:44:55 10.0.0.12],
> >> + [add-mcast-local ls1 01:11:22:33:55:66 10.0.0.14 100],
> >> + [add-mcast-local ls1 01:11:22:33:55:77 vxlan_over_ipv4 10.0.0.15
> 300],
> >> + [add-mcast-local ls1 01:11:22:33:55:66 10.0.0.16 200],
> >> + [add-mcast-remote ls1 03:11:22:33:55:66 10.0.0.14 100],
> >> + [add-mcast-remote ls1 03:11:22:33:55:77 vxlan_over_ipv4 10.0.0.15
> >> 300],
> >> + [add-mcast-remote ls1 03:11:22:33:55:66 10.0.0.16 200])
> >> ], [0], [], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-local-macs ls1])], [0],
> >> [ucast-mac-local
> >> @@ -860,6 +958,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
> >> @@ -870,6 +971,9 @@ 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
> >> + 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 03:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 03:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL(
> >> @@ -882,6 +986,9 @@ 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:55:66 -> vxlan_over_ipv4/10.0.0.14 [[100]]
> >> + 01:11:22:33:55:66 -> vxlan_over_ipv4/10.0.0.16 [[200]]
> >> + 01:11:22:33:55:77 -> vxlan_over_ipv4/10.0.0.15 [[300]]
> >>
> >> ], [], [VTEP_CTL_CLEANUP])
> >> AT_CHECK([RUN_VTEP_CTL([list-remote-macs ls1])], [0],
> >> diff --git a/vtep/ovs-vtep b/vtep/ovs-vtep
> >> index b32a82a..360f9fd 100755
> >> --- a/vtep/ovs-vtep
> >> +++ b/vtep/ovs-vtep
> >> @@ -120,30 +120,52 @@ class Logical_Switch(object):
> >> for port_no, tun_name, remote_ip in
> six.itervalues(self.tunnels):
> >> del_bfd(remote_ip)
> >>
> >> - def update_flood(self):
> >> - flood_ports = list(self.ports.values())
> >> + def vtep_ports(self, tunnel_list):
> >
> > + relay_ports, mesh_ports = list(), list()
> >> + for tunnel in tunnel_list:
> >> + if self.tunnels[tunnel][3]:
> >> + relay_ports.append(self.tunnels[tunnel][0])
> >> + continue
> >> + mesh_ports.append(self.tunnels[tunnel][0])
> >> + return relay_ports, mesh_ports
> >>
> >
> > Please remove references to Neutron L2 border gateway
> > relay and mesh and treat the relay ports as a second level of vtep
> > hierarchy.
> >
> > Per tunnel tunnel key should not linked to "relay vteps" or Neutron L2
> > border
> > gateway design.
> >
> >
> >
> >>
> >> - # Traffic flowing from one 'unknown-dst' should not be flooded
> to
> >> - # port belonging to another 'unknown-dst'.
> >> - for tunnel in self.unknown_dsts:
> >> - port_no = self.tunnels[tunnel][0]
> >> - ovs_ofctl("add-flow %s table=1,priority=1,in_port=%s,
> >> action=%s"
> >> - % (self.short_name, port_no,
> >> ",".join(flood_ports)))
> >> + def update_flood(self):
> >> + phy_ports = list(self.ports.values())
> >> + relay_ports, mesh_ports = self.vtep_ports(self.tunnels.keys())
> >> + relay_unknown, mesh_unknown = self.vtep_ports(self.unknown_
> dsts)
> >>
> >> # Traffic coming from a VTEP physical port should always be
> >> flooded to
> >> # all the other physical ports that belong to that VTEP device
> >> and
> >> - # this logical switch. If the replication mode is service node
> >> then
> >> + # this logical switch and all relay VTEP ports.
> >> + # If the replication mode is service node then
> >> # send to one unknown_dst node (the first one here); else we
> >> assume the
> >> # replication mode is source node and we send the packet to all
> >> # unknown_dst nodes.
> >> - for tunnel in self.unknown_dsts:
> >> - port_no = self.tunnels[tunnel][0]
> >> - flood_ports.append(port_no)
> >> +
> >> + phy_flood_ports = phy_ports + relay_unknown
> >> + if len(mesh_unknown) > 0:
> >> if self.replication_mode == "service_node":
> >> - break
> >> + phy_flood_ports += mesh_unknown[0]
> >> + else:
> >> + phy_flood_ports += mesh_unknown
> >> + for port_no in phy_ports:
> >> + ovs_ofctl("add-flow %s table=1,priority=1,in_port=%s,
> >> action=%s"
> >> + % (self.short_name, port_no,
> >> ",".join(phy_flood_ports)))
> >> +
> >> + # Traffic flowing from a mesh VTEP should not be flooded to
> mesh
> >> + # unknown-dst ports
> >> + mesh_flood_ports = phy_ports + relay_unknown
> >> + for port_no in mesh_ports:
> >> + ovs_ofctl("add-flow %s table=1,priority=1,in_port=%s,
> >> action=%s"
> >> + % (self.short_name, port_no,
> >> ",".join(mesh_flood_ports)))
> >>
> >> - ovs_ofctl("add-flow %s table=1,priority=0,action=%s"
> >> - % (self.short_name, ",".join(flood_ports)))
> >> + # Traffic flowing from a relay VTEP should not be flooded to
> >> relay
> >> + # unknown-dst ports
> >> + relay_flood_ports = phy_ports + mesh_unknown
> >> + for port_no in relay_ports:
> >> + ovs_ofctl("add-flow %s table=1,priority=1,in_port=%s,
> >> action=%s"
> >> + % (self.short_name,
> >> + port_no, ",".join(relay_flood_ports)))
> >>
> >
> >
> > Packets received from second level vteps are not flooded to same level
> but
> > are flooded at other levels - i.e. first level of vteps and physical
> ports.
> >
> > Packets received from first level of vteps is flooded to second level
> vteps
> > and physical ports.
> >
> > To have multi-level vtep support, I was thinking going in the below
> > direction.
> > Let me know if it satisfies your use case for Neutron L2 border gateways.
> >
> > diff --git a/vtep/vtep.ovsschema b/vtep/vtep.ovsschema
> > index 3a24318..f41568f 100644
> > --- a/vtep/vtep.ovsschema
> > +++ b/vtep/vtep.ovsschema
> > @@ -1,6 +1,6 @@
> > {
> > "name": "hardware_vtep",
> > - "cksum": "353943336 11434",
> > + "cksum": "3167636278 11608",
> > "tables": {
> > "Global": {
> > "columns": {
> > @@ -209,7 +209,12 @@
> > "type": "string"}},
> > "mutable": false},
> > "dst_ip": {"type": "string", "mutable": false},
> > - "tunnel_key": {"type": {"key": "integer", "min": 0, "max": 1}}},
> > + "tunnel_key": {"type": {"key": "integer", "min": 0, "max": 1}},
> > + "tunnel_level": {
> > + "type": {
> > + "key": {
> > + "enum": ["set", ["level0", "level1"]],
> > + "type": "string"},"min": 0, "max": 1}}},
> > "indexes": [["encapsulation_type", "dst_ip", "tunnel_key"]]},
> > "ACL_entry": {
> > "columns": {
> >
> > diff --git a/vtep/vtep.xml b/vtep/vtep.xml
> > index 62075ca..6a6c7c6 100644
> > --- a/vtep/vtep.xml
> > +++ b/vtep/vtep.xml
> > @@ -1174,6 +1174,19 @@
> > </p>
> > </column>
> >
> > + <column name="tunnel_level">
> > + <p>
> > + <p>
> > + For <code>vxlan_over_ipv4</code> encapsulation, represents the
> > + hierarchy level of the <ref table="Physical_Locator"/>.
> > Broadcast,
> > + unknown unicast and multicast (BUM) traffic received at one
> level
> > is
> > + never sent to another <ref table="Physical_Locator"/> of the
> same
> > + level. The only valid values supported are level0 and level1;
> > this
> > + column is optional and the default value if not configured is
> > level0.
> > + </p>
> > + </p>
> > + </column>
> > +
> > </table>
> > <table name="ACL_entry">
> > <p>
> >
> >
> >
> >> def add_lbinding(self, lbinding):
> >> vlog.info("adding %s binding to %s" % (lbinding, self.name))
> >> @@ -164,11 +186,22 @@ class Logical_Switch(object):
> >> del self.ports[lbinding]
> >> self.update_flood()
> >>
> >
> >
> > I suggest this is unnecessary and make the code harder to read
> > and inconsistent with other code here - I am suggesting an incremental
> > patch below, after this section of code.
> >
> >
> >>
> >> + def tunnel_dict(self, entry):
> >> + return {
> >> + 'tunnel_type': entry[2],
> >> + 'dest_ip': entry[3],
> >> + 'tunnel_key': entry[5],
> >> + }
> >> +
> >
> > def add_tunnel(self, tunnel, tunnel_key):
> >> global tun_id
> >> - vlog.info("adding tunnel %s" % tunnel)
> >> - encap, ip = tunnel.split("/")
> >> + if tunnel['tunnel_key']:
> >> + tunnel_key = tunnel['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
> >> @@ -192,7 +225,7 @@ 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)
> >>
> >> @@ -200,17 +233,17 @@ class Logical_Switch(object):
> >> "actions=resubmit(,1)"
> >> % (self.short_name, port_no))
> >>
> >> - def del_tunnel(self, tunnel):
> >> - vlog.info("removing tunnel %s" % tunnel)
> >> + def del_tunnel(self, tunnel_ip):
> >> + vlog.info("removing tunnel %s" % tunnel_ip)
> >>
> >> - port_no, tun_name, remote_ip = self.tunnels[tunnel]
> >> + port_no, tun_name, remote_ip, tunnel_key =
> >> self.tunnels[tunnel_ip]
> >> ovs_ofctl("del-flows %s table=0,in_port=%s"
> >> % (self.short_name, port_no))
> >> ovs_vsctl("del-port %s %s" % (self.short_name, tun_name))
> >>
> >> del_bfd(remote_ip)
> >>
> >> - del self.tunnels[tunnel]
> >> + del self.tunnels[tunnel_ip]
> >>
> >> def update_local_macs(self):
> >> flows = ovs_ofctl("dump-flows %s cookie=0x5000/-1,table=1"
> >> @@ -231,8 +264,8 @@ class Logical_Switch(object):
> >>
> >> self.local_macs = macs
> >>
> >> - def add_remote_mac(self, mac, tunnel):
> >> - port_no = self.tunnels.get(tunnel, (0, ""))[0]
> >> + def add_remote_mac(self, mac, tunnel_ip):
> >> + port_no = self.tunnels.get(tunnel_ip, (0, ""))[0]
> >> if not port_no:
> >> return
> >>
> >> @@ -245,7 +278,7 @@ class Logical_Switch(object):
> >> def update_remote_macs(self):
> >> remote_macs = {}
> >> unknown_dsts = set()
> >> - tunnels = set()
> >> + tunnels = {}
> >> parse_ucast = True
> >>
> >> column = vtep_ctl("--columns=tunnel_key find logical_switch "
> >> @@ -264,27 +297,26 @@ 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' (.*) -> ([^/]*)/(\S*)( \[(.*)\])?',
> >> line)
> >> + if len(entry) != 7:
> >> continue
> >>
> >> if parse_ucast:
> >> - remote_macs[entry[1]] = entry[2]
> >> + remote_macs[entry[1]] = self.tunnel_dict(entry)['tunne
> >> l_type']
> >> 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], tunnel_key)
> >>
> >> - for tunnel in tunnels.difference(old_tunnels):
> >> - self.add_tunnel(tunnel, tunnel_key)
> >> -
> >> - for tunnel in old_tunnels.difference(tunnels):
> >> + for tunnel in old_tunnels.difference(tunnels_keys):
> >> self.del_tunnel(tunnel)
> >>
> >
> >
> > I am suggesting the following incremental; let me know if it makes sense.
> >
> > diff --git a/vtep/ovs-vtep b/vtep/ovs-vtep
> > index 360f9fd..f1a0b49 100755
> > --- a/vtep/ovs-vtep
> > +++ b/vtep/ovs-vtep
> > @@ -186,25 +186,11 @@ 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[5],
> > - }
> > -
> > - def add_tunnel(self, tunnel, tunnel_key):
> > + def add_tunnel(self, ip, tunnel_key, tunnel_scope_key):
> > global tun_id
> > - if tunnel['tunnel_key']:
> > - tunnel_key = tunnel['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
> > +
> > + vlog.info("adding tunnel: ip %s key %s tunnel_scope_key %s" %
> > + (ip, tunnel_key, tunnel_scope_key))
> >
> > tun_id += 1
> > tun_name = "vx" + str(tun_id)
> > @@ -218,14 +204,14 @@ class Logical_Switch(object):
> > if port_no != "-1":
> > break
> > elif i == 9:
> > - vlog.warn("couldn't create tunnel %s" % tunnel)
> > + vlog.warn("couldn't create tunnel %s" % ip)
> > ovs_vsctl("del-port %s %s" % (self.short_name,
> tun_name))
> > return
> >
> > # Give the system a moment to allocate the port number
> > time.sleep(0.5)
> >
> > - self.tunnels[ip] = (port_no, tun_name, ip, tunnel['tunnel_key'])
> > + self.tunnels[ip] = (port_no, tun_name, ip, tunnel_scope_key)
> >
> > add_bfd(ip)
> >
> > @@ -278,6 +264,7 @@ class Logical_Switch(object):
> > def update_remote_macs(self):
> > remote_macs = {}
> > unknown_dsts = set()
> > + # A map of tunnel ip address to tunnel key
> > tunnels = {}
> > parse_ucast = True
> >
> > @@ -302,22 +289,23 @@ class Logical_Switch(object):
> > continue
> >
> > if parse_ucast:
> > - remote_macs[entry[1]] = self.tunnel_dict(entry)['
> > tunnel_type']
> > + remote_macs[entry[1]] = entry[2]
> > else:
> > if entry[1] != "unknown-dst":
> > continue
> >
> > unknown_dsts.add(entry[3])
> >
> > - tunnels[entry[3]] = self.tunnel_dict(entry)
> > + tunnels[entry[3]] = entry[5]
> >
> > - old_tunnels = set(self.tunnels.keys())
> > - tunnels_keys = set(tunnels.keys())
> > - for tunnel in tunnels_keys.difference(old_tunnels):
> > - self.add_tunnel(tunnels[tunnel], tunnel_key)
> > + old_tunnel_ips = set(self.tunnels.keys())
> > + tunnel_ips = set(tunnels.keys())
> > + for tunnel_ip in tunnel_ips.difference(old_tunnel_ips):
> > + tunnel_scope_key = tunnels[tunnel_ip]
> > + self.add_tunnel(tunnel_ip, tunnel_key, tunnel_scope_key)
> >
> > - for tunnel in old_tunnels.difference(tunnels_keys):
> > - self.del_tunnel(tunnel)
> > + for tunnel_ip in old_tunnel_ips.difference(tunnel_ips):
> > + self.del_tunnel(tunnel_ip)
> >
> > for mac in six.iterkeys(remote_macs):
> > if (self.remote_macs.get(mac) != remote_macs[mac]):
> >
> >
> >
> >>
> >> for mac in six.iterkeys(remote_macs):
> >> diff --git a/vtep/vtep-ctl.c b/vtep/vtep-ctl.c
> >> index 759150f..1904a71 100644
> >> --- a/vtep/vtep-ctl.c
> >> +++ b/vtep/vtep-ctl.c
> >> @@ -37,6 +37,7 @@
> >> #include "json.h"
> >> #include "ovsdb-data.h"
> >> #include "ovsdb-idl.h"
> >> +#include "lib/packets.h"
> >> #include "poll-loop.h"
> >> #include "process.h"
> >> #include "stream.h"
> >> @@ -345,18 +346,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\
> >> @@ -887,7 +888,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 +1655,46 @@ 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;
> >> + ovs_be32 ip = 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 (ip_parse(ctx->argv[4],&ip)){
> >> + dst_ip = ctx->argv[4];
> >> + encap = ctx->argv[3];
> >> + break;
> >> + }
> >> + tunnel_key = ctx->argv[4];
> >> + case 4:
> >> + if (ip_parse(ctx->argv[3],&ip)){
> >> + 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;
> >> + ovs_scan(tunnel_key,"%ld",&segement_value);
> >> + vteprec_physical_locator_set_
> tunnel_key(ploc_cfg,&segement_v
> >> alue,1);
> >>
> >
> >
> > Please don't use "segment" or the Neutron spelling variant "segement" in
> > this case.
> > Use generic language such as tunnel_scope_key or per_tunnel_key.
> >
> > I mentioned this comment in the earlier patch as well.
> >
> > I did not review most of the code here, pending agreement on the big
> > picture.
> >
> >
> >
> >
> >> + }
> >> vteprec_physical_locator_set_dst_ip(ploc_cfg, dst_ip);
> >> vteprec_physical_locator_set_encapsulation_type(ploc_cfg,
> >> encap);
> >>
> >> @@ -1790,7 +1811,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 +1860,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;
> >> + ovs_scan(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 +1934,39 @@ 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;
> >> + ovs_be32 ip = 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 (ip_parse(ctx->argv[4],&ip)){
> >> + dst_ip = ctx->argv[4];
> >> + encap = ctx->argv[3];
> >> + break;
> >> + }
> >> + tunnel_key = ctx->argv[4];
> >> + case 4:
> >> + if (ip_parse(ctx->argv[3],&ip)){
> >> + 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 +2057,7 @@ list_macs(struct ctl_context *ctx, bool local)
> >> struct svec ucast_macs;
> >> struct shash *mcast_shash;
> >> struct svec mcast_macs;
> >> -
> >> + char tunnel_key[8];
> >> vtep_ctl_context_populate_cache(ctx);
> >> ls = find_lswitch(vtepctl_ctx, ctx->argv[1], true);
> >>
> >> @@ -2032,9 +2072,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],8," [%d]",(uint32_t)(*ploc_cfg->tu
> >> nnel_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");
> >> @@ -2049,9 +2093,13 @@ list_macs(struct ctl_context *ctx, bool local)
> >> 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,8," [%d]",(uint32_t)(*ploc->ploc_c
> >> fg->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 +2556,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 +2568,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
> >>
> >> _______________________________________________
> >> dev mailing list
> >> [email protected]
> >> http://openvswitch.org/mailman/listinfo/dev
> >>
> >
> >
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
>
> ------------------------------------------------------------
> ------------------------------------------------------------
> -------------------------
>
> This email and any files transmitted and/or attachments with it are
> confidential and proprietary information of
> Toga Networks Ltd., and intended solely for the use of the individual or
> entity to whom they are addressed.
> If you have received this email in error please notify the system manager.
> This message contains confidential
> information of Toga Networks Ltd., and is intended only for the individual
> named. If you are not the named
> addressee you should not disseminate, distribute or copy this e-mail.
> Please notify the sender immediately
> by e-mail if you have received this e-mail by mistake and delete this
> e-mail from your system. If you are not
> the intended recipient you are notified that disclosing, copying,
> distributing or taking any action in reliance on
> the contents of this information is strictly prohibited.
>
> ------------------------------------------------------------
> ------------------------------------------------------------
> ------------------------
>
>
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev