mirror of
https://github.com/openvswitch/ovs
synced 2025-10-25 15:07:05 +00:00
In cases where we don't have a map of tunnel metadata options (such as with ovs-ofctl) we dynamically allocate them as part of the match. However, dynamic allocation brings the possibility of errors such as duplicate entries or running out of space. Up until now, anything that would cause an error was silently ignored. Since that is not very user friendly, this adds a mechanism for reporting these types of errors. Signed-off-by: Jesse Gross <jesse@nicira.com> Acked-by: Ben Pfaff <blp@nicira.com>
527 lines
26 KiB
Plaintext
527 lines
26 KiB
Plaintext
AT_BANNER([tunnel])
|
|
|
|
AT_SETUP([tunnel - input])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=gre \
|
|
options:remote_ip=1.1.1.1 ofport_request=1\
|
|
-- add-port br0 p2 -- set Interface p2 type=gre \
|
|
options:local_ip=2.2.2.2 options:remote_ip=1.1.1.1 \
|
|
ofport_request=2 \
|
|
-- add-port br0 p3 -- set Interface p3 type=gre \
|
|
options:remote_ip=2.2.2.2 ofport_request=3])
|
|
AT_DATA([flows.txt], [dnl
|
|
actions=IN_PORT
|
|
])
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/1: (gre: remote_ip=1.1.1.1)
|
|
p2 2/1: (gre: local_ip=2.2.2.2, remote_ip=1.1.1.1)
|
|
p3 3/1: (gre: remote_ip=2.2.2.2)
|
|
])
|
|
|
|
dnl remote_ip
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=1.2.3.4,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(dst=1.1.1.1,ttl=64,flags(df))),1
|
|
])
|
|
|
|
dnl local_ip, remote_ip
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=2.2.2.2,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(src=2.2.2.2,dst=1.1.1.1,ttl=64,flags(df))),1
|
|
])
|
|
|
|
dnl reconfigure, local_ip, remote_ip
|
|
AT_CHECK([ovs-vsctl set Interface p2 type=gre options:local_ip=2.2.2.3 \
|
|
options:df_default=false options:ttl=1 options:csum=true \
|
|
-- set Interface p3 type=vxlan])
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/1: (gre: remote_ip=1.1.1.1)
|
|
p2 2/1: (gre: csum=true, df_default=false, local_ip=2.2.2.3, remote_ip=1.1.1.1, ttl=1)
|
|
p3 3/4789: (vxlan: remote_ip=2.2.2.2)
|
|
])
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=2.2.2.2,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(dst=1.1.1.1,ttl=64,flags(df))),1
|
|
])
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=2.2.2.3,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(src=2.2.2.3,dst=1.1.1.1,ttl=1,flags(csum))),1
|
|
])
|
|
|
|
dnl nonexistent tunnel
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=5.5.5.5,dst=6.6.6.6,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [2], [ignore], [dnl
|
|
Invalid datapath flow
|
|
ovs-appctl: ovs-vswitchd: server returned an error
|
|
])
|
|
|
|
OVS_VSWITCHD_STOP(["/receive tunnel port not found/d"])
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - ECN decapsulation])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=gre \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 \
|
|
-- add-port br0 p2 -- set Interface p2 type=dummy \
|
|
ofport_request=2])
|
|
AT_DATA([flows.txt], [dnl
|
|
actions=2
|
|
])
|
|
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/1: (gre: remote_ip=1.1.1.1)
|
|
p2 2/2: (dummy)
|
|
])
|
|
|
|
dnl Tunnel CE and encapsulated packet CE
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=3,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=2.2.2.2,tun_tos=3,tun_ttl=64,tun_flags=-df-csum-key,in_port=1,nw_ecn=3,nw_frag=no
|
|
Datapath actions: 2
|
|
])
|
|
|
|
dnl Tunnel CE and encapsulated packet ECT(1)
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=1,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=2.2.2.2,tun_tos=3,tun_ttl=64,tun_flags=-df-csum-key,in_port=1,nw_ecn=1,nw_frag=no
|
|
Datapath actions: set(ipv4(tos=0x3/0x3)),2
|
|
])
|
|
|
|
dnl Tunnel CE and encapsulated packet ECT(2)
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=2,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=2.2.2.2,tun_tos=3,tun_ttl=64,tun_flags=-df-csum-key,in_port=1,nw_ecn=2,nw_frag=no
|
|
Datapath actions: set(ipv4(tos=0x3/0x3)),2
|
|
])
|
|
|
|
dnl Tunnel CE and encapsulated packet Non-ECT
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=2.2.2.2,tos=0x3,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=2.2.2.2,tun_tos=3,tun_ttl=64,tun_flags=-df-csum-key,in_port=1,nw_ecn=0,nw_frag=no
|
|
Datapath actions: drop
|
|
])
|
|
OVS_VSWITCHD_STOP(["/dropping tunnel packet marked ECN CE but is not ECN capable/d"])
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - output])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=gre \
|
|
options:remote_ip=1.1.1.1 options:local_ip=2.2.2.2 \
|
|
options:key=5 ofport_request=1\
|
|
-- add-port br0 p2 -- set Interface p2 type=dummy \
|
|
ofport_request=2 ofport_request=2])
|
|
AT_DATA([flows.txt], [dnl
|
|
actions=output:1
|
|
])
|
|
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/1: (gre: key=5, local_ip=2.2.2.2, remote_ip=1.1.1.1)
|
|
p2 2/2: (dummy)
|
|
])
|
|
|
|
dnl Basic
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=4,ttl=128,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(tun_id=0x5,src=2.2.2.2,dst=1.1.1.1,ttl=64,flags(df|key))),1
|
|
])
|
|
|
|
dnl ECN
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=1,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(tun_id=0x5,src=2.2.2.2,dst=1.1.1.1,tos=0x1,ttl=64,flags(df|key))),1
|
|
])
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - ToS and TTL inheritance])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=gre \
|
|
options:remote_ip=1.1.1.1 options:tos=inherit \
|
|
options:ttl=inherit ofport_request=1 \
|
|
-- add-port br0 p2 -- set Interface p2 type=dummy \
|
|
ofport_request=2 ofport_request=2])
|
|
AT_DATA([flows.txt], [dnl
|
|
actions=output:1
|
|
])
|
|
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/1: (gre: remote_ip=1.1.1.1, tos=inherit, ttl=inherit)
|
|
p2 2/2: (dummy)
|
|
])
|
|
|
|
dnl Basic
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=4,ttl=128,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(dst=1.1.1.1,tos=0x4,ttl=128,flags(df))),1
|
|
])
|
|
|
|
dnl ECN
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=5,ttl=128,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(dst=1.1.1.1,tos=0x5,ttl=128,flags(df))),1
|
|
])
|
|
|
|
dnl non-IP
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0806),arp(sip=1.2.3.4,tip=5.6.7.8,op=1,sha=00:0f:10:11:12:13,tha=00:14:15:16:17:18)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(dst=1.1.1.1,ttl=64,flags(df))),1
|
|
])
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - set_tunnel])
|
|
OVS_VSWITCHD_START([dnl
|
|
add-port br0 p1 -- set Interface p1 type=gre options:key=flow \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 \
|
|
-- add-port br0 p2 -- set Interface p2 type=gre options:key=flow \
|
|
options:remote_ip=2.2.2.2 ofport_request=2 \
|
|
-- add-port br0 p3 -- set Interface p3 type=gre options:key=flow \
|
|
options:remote_ip=3.3.3.3 ofport_request=3 \
|
|
-- add-port br0 p4 -- set Interface p4 type=gre options:key=flow \
|
|
options:remote_ip=4.4.4.4 ofport_request=4])
|
|
AT_DATA([flows.txt], [dnl
|
|
actions=set_tunnel:1,output:1,set_tunnel:2,output:2,set_tunnel:3,output:3,set_tunnel:5,output:4
|
|
])
|
|
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/1: (gre: key=flow, remote_ip=1.1.1.1)
|
|
p2 2/1: (gre: key=flow, remote_ip=2.2.2.2)
|
|
p3 3/1: (gre: key=flow, remote_ip=3.3.3.3)
|
|
p4 4/1: (gre: key=flow, remote_ip=4.4.4.4)
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(100),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl
|
|
set(tunnel(tun_id=0x1,dst=1.1.1.1,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x2,dst=2.2.2.2,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x3,dst=3.3.3.3,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x5,dst=4.4.4.4,ttl=64,flags(df|key))),1
|
|
])
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - key])
|
|
OVS_VSWITCHD_START([dnl
|
|
add-port br0 p1 -- set Interface p1 type=gre options:key=1 \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 \
|
|
-- add-port br0 p2 -- set Interface p2 type=gre options:in_key=2 \
|
|
options:out_key=3 options:remote_ip=1.1.1.1 ofport_request=2 \
|
|
-- add-port br0 p3 -- set Interface p3 type=gre options:out_key=5 \
|
|
options:remote_ip=1.1.1.1 ofport_request=3])
|
|
AT_DATA([flows.txt], [dnl
|
|
actions=IN_PORT,output:1,output:2,output:3
|
|
])
|
|
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/1: (gre: key=1, remote_ip=1.1.1.1)
|
|
p2 2/1: (gre: in_key=2, out_key=3, remote_ip=1.1.1.1)
|
|
p3 3/1: (gre: out_key=5, remote_ip=1.1.1.1)
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x1,src=1.1.1.1,dst=2.2.2.2,ttl=64,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl
|
|
set(tunnel(tun_id=0x1,dst=1.1.1.1,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x3,dst=1.1.1.1,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x5,dst=1.1.1.1,ttl=64,flags(df|key))),1
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x2,src=1.1.1.1,dst=2.2.2.2,ttl=64,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl
|
|
set(tunnel(tun_id=0x3,dst=1.1.1.1,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x1,dst=1.1.1.1,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x5,dst=1.1.1.1,ttl=64,flags(df|key))),1
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(src=1.1.1.1,dst=2.2.2.2,ttl=64,flags()),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl
|
|
set(tunnel(tun_id=0x5,dst=1.1.1.1,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x1,dst=1.1.1.1,ttl=64,flags(df|key))),1,dnl
|
|
set(tunnel(tun_id=0x3,dst=1.1.1.1,ttl=64,flags(df|key))),1
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0xf,src=1.1.1.1,dst=2.2.2.2,ttl=64,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [2], [ignore], [dnl
|
|
Invalid datapath flow
|
|
ovs-appctl: ovs-vswitchd: server returned an error
|
|
])
|
|
OVS_VSWITCHD_STOP(["/receive tunnel port not found/d"])
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - key match])
|
|
OVS_VSWITCHD_START([dnl
|
|
add-port br0 p1 -- set Interface p1 type=gre options:key=flow \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 \
|
|
-- add-port br0 p2 -- set Interface p2 type=gre options:key=3 \
|
|
options:remote_ip=3.3.3.3 ofport_request=2 \
|
|
-- add-port br0 p3 -- set Interface p3 type=dummy ofport_request=3 \
|
|
-- add-port br0 p4 -- set Interface p4 type=dummy ofport_request=4 \
|
|
-- add-port br0 p5 -- set Interface p5 type=dummy ofport_request=5])
|
|
AT_DATA([flows.txt], [dnl
|
|
tun_id=2,actions=output:3
|
|
tun_id=3,actions=output:4,set_tunnel:2,resubmit:99,set_tunnel:4,output:2,resubmit:99
|
|
tun_id=4,actions=output:5
|
|
])
|
|
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/1: (gre: key=flow, remote_ip=1.1.1.1)
|
|
p2 2/1: (gre: key=3, remote_ip=3.3.3.3)
|
|
p3 3/3: (dummy)
|
|
p4 4/4: (dummy)
|
|
p5 5/5: (dummy)
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x2,src=1.1.1.1,dst=2.2.2.2,ttl=64,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0], [dnl
|
|
Datapath actions: 3
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x3,src=1.1.1.1,dst=2.2.2.2,ttl=64,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0], [dnl
|
|
Datapath actions: 4,3,set(tunnel(tun_id=0x3,dst=3.3.3.3,ttl=64,flags(df|key))),1,5
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x3,src=3.3.3.3,dst=2.2.2.2,ttl=64,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0], [dnl
|
|
Datapath actions: 4,3,5
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'tunnel(tun_id=0x0,src=1.1.1.1,dst=2.2.2.2,ttl=64,flags(key)),in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no),tcp(src=8,dst=9)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0], [dnl
|
|
Datapath actions: drop
|
|
])
|
|
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - Geneve])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=geneve \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 options:dst_port=5000])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/5000: (geneve: dst_port=5000, remote_ip=1.1.1.1)
|
|
])
|
|
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - VXLAN])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=vxlan \
|
|
options:remote_ip=1.1.1.1 ofport_request=1])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/4789: (vxlan: remote_ip=1.1.1.1)
|
|
])
|
|
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - LISP])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=lisp \
|
|
options:remote_ip=1.1.1.1 ofport_request=1])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/4341: (lisp: remote_ip=1.1.1.1)
|
|
])
|
|
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - different VXLAN UDP port])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=vxlan \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 options:dst_port=4341])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/4341: (vxlan: dst_port=4341, remote_ip=1.1.1.1)
|
|
])
|
|
|
|
dnl change UDP port
|
|
|
|
AT_CHECK([ovs-vsctl -- set Interface p1 options:dst_port=5000])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/5000: (vxlan: dst_port=5000, remote_ip=1.1.1.1)
|
|
])
|
|
|
|
dnl change UDP port to default
|
|
|
|
AT_CHECK([ovs-vsctl -- set Interface p1 options:dst_port=4789])
|
|
|
|
AT_CHECK([ovs-appctl dpif/show | tail -n +3], [0], [dnl
|
|
br0 65534/100: (dummy)
|
|
p1 1/4789: (vxlan: remote_ip=1.1.1.1)
|
|
])
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([ofproto-dpif - set_field - tun_src/tun_dst/tun_id])
|
|
OVS_VSWITCHD_START([dnl
|
|
add-port br0 p1 -- set Interface p1 type=gre options:key=flow \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 \
|
|
-- add-port br0 p2 -- set Interface p2 type=gre options:key=flow \
|
|
options:remote_ip=flow ofport_request=2 \
|
|
-- add-port br0 p3 -- set Interface p3 type=gre options:key=flow \
|
|
options:remote_ip=flow options:local_ip=flow ofport_request=3 \
|
|
-- add-port br0 p4 -- set Interface p4 type=gre options:key=3 \
|
|
options:remote_ip=flow ofport_request=4 \
|
|
-- add-port br0 p5 -- set Interface p5 type=gre options:key=flow \
|
|
options:remote_ip=5.5.5.5 ofport_request=5])
|
|
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
ADD_OF_PORTS([br0], [90])
|
|
AT_DATA([flows.txt], [dnl
|
|
in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5
|
|
in_port=1 actions=set_field:42->tun_id,output:1
|
|
in_port=2 actions=set_field:3.3.3.3->tun_dst,output:2
|
|
in_port=3 actions=set_field:1.1.1.1->tun_src,set_field:4.4.4.4->tun_dst,output:3
|
|
in_port=4 actions=set_field:2.2.2.2->tun_dst,output:4
|
|
in_port=5 actions=set_field:5->tun_id
|
|
])
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(90),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(tun_id=0x2a,dst=1.1.1.1,ttl=64,flags(df|key))),1,set(tunnel(tun_id=0x2a,dst=3.3.3.3,ttl=64,flags(df|key))),1,set(tunnel(tun_id=0x2a,src=1.1.1.1,dst=4.4.4.4,ttl=64,flags(df|key))),1,set(tunnel(tun_id=0x3,dst=2.2.2.2,ttl=64,flags(df|key))),1
|
|
])
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - Geneve metadata])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=geneve \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 \
|
|
-- add-port br0 p2 -- set Interface p2 type=dummy \
|
|
ofport_request=2 ofport_request=2])
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
|
|
AT_CHECK([ovs-ofctl add-geneve-map br0 "{class=0xffff,type=0,len=4}->tun_metadata0,{class=0xffff,type=1,len=8}->tun_metadata1"])
|
|
|
|
AT_DATA([flows.txt], [dnl
|
|
in_port=2,actions=set_field:0xa->tun_metadata0,set_field:0x1234567890abcdef->tun_metadata1,1
|
|
tun_metadata0=0xb/0xf,actions=2
|
|
])
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
dnl Option generation
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
|
|
AT_CHECK([tail -1 stdout], [0],
|
|
[Datapath actions: set(tunnel(dst=1.1.1.1,ttl=64,geneve({class=0xffff,type=0,len=4,0xa}{class=0xffff,type=0x1,len=8,0x1234567890abcdef}),flags(df))),6081
|
|
])
|
|
|
|
dnl Option match
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'recirc_id(0),tunnel(tun_id=0x0,src=1.1.1.1,dst=1.1.1.2,ttl=64,geneve({class=0xffff,type=0,len=4,0xb}),flags(df|key)),in_port(6081),skb_mark(0),eth_type(0x0800),ipv4(frag=no)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=1.1.1.2,tun_tos=0,tun_ttl=64,tun_flags=+df-csum+key,tun_metadata0=0xb/0xf,in_port=1,nw_frag=no
|
|
Datapath actions: 2
|
|
])
|
|
|
|
dnl Skip unknown option
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'recirc_id(0),tunnel(tun_id=0x0,src=1.1.1.1,dst=1.1.1.2,ttl=64,geneve({class=0xffff,type=0,len=4,0xb}{class=0xffff,type=2,len=4,0xc}),flags(df|key)),in_port(6081),skb_mark(0),eth_type(0x0800),ipv4(frag=no)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=1.1.1.2,tun_tos=0,tun_ttl=64,tun_flags=+df-csum+key,tun_metadata0=0xb/0xf,in_port=1,nw_frag=no
|
|
Datapath actions: 2
|
|
])
|
|
|
|
dnl Check mapping table constraints
|
|
AT_CHECK([ovs-ofctl del-flows br0])
|
|
AT_CHECK([ovs-ofctl add-geneve-map br0 "{class=0xffff,type=2,len=124}->tun_metadata2,{class=0xffff,type=3,len=124}->tun_metadata3"], [1], [ignore],
|
|
[OFPT_ERROR (xid=0x4): NXGTMFC_TABLE_FULL
|
|
NXT_GENEVE_TABLE_MOD (xid=0x4):
|
|
ADD mapping table:
|
|
class type length match field
|
|
----- ---- ------ -----------
|
|
0xffff 0x2 124 tun_metadata2
|
|
0xffff 0x3 124 tun_metadata3
|
|
])
|
|
|
|
AT_CHECK([ovs-ofctl add-flow br0 "tun_metadata0,tun_metadata0,actions=drop"], [1], [ignore],
|
|
[ovs-ofctl: field tun_metadata0 set multiple times
|
|
])
|
|
|
|
AT_CHECK([ovs-ofctl add-flow br0 "tun_metadata0=0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef,tun_metadata1=0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef,tun_metadata2=0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef,tun_metadata3=0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef,tun_metadata4=0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef,actions=drop"], [1], [ignore],
|
|
[ovs-ofctl: field tun_metadata4 exceeds maximum size for tunnel metadata (used 320, max 256)
|
|
])
|
|
|
|
dnl Allocation and match with fragmented address space
|
|
AT_CHECK([ovs-ofctl add-geneve-map br0 "{class=0xffff,type=2,len=124}->tun_metadata2"])
|
|
AT_CHECK([ovs-ofctl add-geneve-map br0 "{class=0xffff,type=3,len=4}->tun_metadata3"])
|
|
AT_CHECK([ovs-ofctl add-geneve-map br0 "{class=0xffff,type=4,len=112}->tun_metadata4"])
|
|
AT_CHECK([ovs-ofctl del-geneve-map br0 "{class=0xffff,type=3,len=4}->tun_metadata3"])
|
|
AT_CHECK([ovs-ofctl add-geneve-map br0 "{class=0xffff,type=3,len=8}->tun_metadata3"])
|
|
|
|
AT_CHECK([ovs-ofctl add-flow br0 tun_metadata3=0x1234567890abcdef,actions=2])
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'recirc_id(0),tunnel(tun_id=0x0,src=1.1.1.1,dst=1.1.1.2,ttl=64,geneve({class=0xffff,type=3,len=8,0x1234567890abcdef}),flags(df|key)),in_port(6081),skb_mark(0),eth_type(0x0800),ipv4(frag=no)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=1.1.1.2,tun_tos=0,tun_ttl=64,tun_flags=+df-csum+key,tun_metadata3=0x1234567890abcdef,in_port=1,nw_frag=no
|
|
Datapath actions: 2
|
|
])
|
|
|
|
AT_CHECK([ovs-ofctl del-geneve-map br0])
|
|
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|
|
|
|
AT_SETUP([tunnel - Geneve option present])
|
|
OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=geneve \
|
|
options:remote_ip=1.1.1.1 ofport_request=1 \
|
|
-- add-port br0 p2 -- set Interface p2 type=dummy \
|
|
ofport_request=2 ofport_request=2])
|
|
OVS_VSWITCHD_DISABLE_TUNNEL_PUSH_POP
|
|
|
|
AT_CHECK([ovs-ofctl add-geneve-map br0 "{class=0xffff,type=0,len=4}->tun_metadata0,{class=0xffff,type=1,len=0}->tun_metadata1,{class=0xffff,type=2,len=4}->tun_metadata2"])
|
|
|
|
AT_DATA([flows.txt], [dnl
|
|
priority=1,tun_metadata0,actions=2
|
|
priority=2,tun_metadata1=0,actions=IN_PORT
|
|
priority=3,tun_metadata2=0,actions=drop
|
|
])
|
|
AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
|
|
|
|
AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort],
|
|
[0], [dnl
|
|
priority=1,tun_metadata0 actions=output:2
|
|
priority=2,tun_metadata1 actions=IN_PORT
|
|
priority=3,tun_metadata2=0 actions=drop
|
|
NXST_FLOW reply:
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'recirc_id(0),tunnel(tun_id=0x0,src=1.1.1.1,dst=1.1.1.2,ttl=64,geneve({class=0xffff,type=0,len=4,0x12345678}),flags(df|key)),in_port(6081),skb_mark(0),eth_type(0x0800),ipv4(frag=no)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=1.1.1.2,tun_tos=0,tun_ttl=64,tun_flags=+df-csum+key,tun_metadata0,tun_metadata1=NP,tun_metadata2=NP,in_port=1,nw_frag=no
|
|
Datapath actions: 2
|
|
])
|
|
|
|
AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'recirc_id(0),tunnel(tun_id=0x0,src=1.1.1.1,dst=1.1.1.2,ttl=64,geneve({class=0xffff,type=1,len=0}),flags(df|key)),in_port(6081),skb_mark(0),eth_type(0x0800),ipv4(frag=no)'], [0], [stdout])
|
|
AT_CHECK([tail -2 stdout], [0],
|
|
[Megaflow: pkt_mark=0,recirc_id=0,ip,tun_id=0,tun_src=1.1.1.1,tun_dst=1.1.1.2,tun_tos=0,tun_ttl=64,tun_flags=+df-csum+key,tun_metadata1,tun_metadata2=NP,in_port=1,nw_ecn=0,nw_frag=no
|
|
Datapath actions: set(tunnel(tun_id=0x0,dst=1.1.1.1,ttl=64,geneve({class=0xffff,type=0x1,len=0}),flags(df|key))),6081
|
|
])
|
|
|
|
OVS_VSWITCHD_STOP
|
|
AT_CLEANUP
|