X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=tests%2Fclassifier.at;h=88818618bea81bd00d3ebc413c8081d41ef3b80b;hb=9513c0233dca774812cb62357edf73586480f123;hp=710060fc4470f881cbd7eb3717312254151acd21;hpb=a64759f02d8324caf6c37af0ac4e3e1d26e02a43;p=mirror_ovs.git diff --git a/tests/classifier.at b/tests/classifier.at index 710060fc4..88818618b 100644 --- a/tests/classifier.at +++ b/tests/classifier.at @@ -6,11 +6,15 @@ m4_foreach( [single-rule], [rule-replacement], [many-rules-in-one-list], + [versioned many-rules-in-one-list], [many-rules-in-one-table], + [versioned many-rules-in-one-table], [many-rules-in-two-tables], - [many-rules-in-five-tables]], + [versioned many-rules-in-two-tables], + [many-rules-in-five-tables], + [versioned many-rules-in-five-tables]], [AT_SETUP([flow classifier - m4_bpatsubst(testname, [-], [ ])]) - AT_CHECK([ovstest test-classifier testname], [0], [], []) + AT_CHECK([ovstest test-classifier m4_bpatsubst(testname, [versioned], [--versioned])], [0], [], []) AT_CLEANUP])]) AT_BANNER([miniflow unit tests]) @@ -26,7 +30,7 @@ m4_foreach( AT_BANNER([flow classifier lookup segmentation]) AT_SETUP([flow classifier - lookup segmentation]) OVS_VSWITCHD_START -ADD_OF_PORTS([br0], [1], [2], [3]) +add_of_ports br0 1 2 3 AT_DATA([flows.txt], [dnl table=0 in_port=1 priority=16,tcp,nw_dst=10.1.0.0/255.255.0.0,action=output(3) table=0 in_port=1 priority=32,tcp,nw_dst=10.1.2.15,action=output(2) @@ -40,22 +44,22 @@ table=0 in_port=3 priority=0,ip,action=drop AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=2,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=80'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,tcp,in_port=2,nw_dst=192.168.0.0/16,nw_frag=no + [Megaflow: recirc_id=0,eth,tcp,in_port=2,nw_dst=192.168.0.0/16,nw_frag=no Datapath actions: 1 ]) -AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=80'], [0], [stdout]) +AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=11.1.2.15,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=80'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,ip,in_port=1,nw_dst=0.0.0.0/2.0.0.0,nw_frag=no + [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_dst=11.0.0.0/8,nw_frag=no Datapath actions: drop ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=10.1.2.15,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=80'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,tcp,in_port=1,nw_dst=10.1.2.15,nw_frag=no,tp_dst=80 + [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_dst=10.1.2.15,nw_frag=no,tp_dst=80 Datapath actions: drop ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=10.1.2.15,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=79'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,tcp,in_port=1,nw_dst=10.1.2.15,nw_frag=no,tp_dst=0x1/0x1 + [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_dst=10.1.2.15,nw_frag=no,tp_dst=0x40/0xfff0 Datapath actions: 2 ]) OVS_VSWITCHD_STOP @@ -64,7 +68,7 @@ AT_CLEANUP AT_BANNER([flow classifier prefix lookup]) AT_SETUP([flow classifier - prefix lookup]) OVS_VSWITCHD_START -ADD_OF_PORTS([br0], [1], [2], [3]) +add_of_ports br0 1 2 3 AT_CHECK([ovs-vsctl set Bridge br0 flow_tables:0=@N1 -- --id=@N1 create Flow_Table name=t0], [0], [ignore], []) AT_DATA([flows.txt], [dnl table=0 in_port=1 priority=16,tcp,nw_dst=10.1.0.0/255.255.0.0,action=output(3) @@ -83,7 +87,7 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) # nw_dst and nw_src should be on by default AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=80'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,ip,in_port=1,nw_dst=192.168.0.0/16,nw_frag=no + [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_dst=192.168.0.0/16,nw_frag=no Datapath actions: drop ]) @@ -98,29 +102,205 @@ AT_CHECK([ovs-vsctl set Flow_Table t0 prefixes=nw_dst,nw_dst], [1], [], AT_CHECK([ovs-vsctl set Flow_Table t0 prefixes=nw_dst], [0]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=80'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,ip,in_port=1,nw_dst=192.168.0.0/16,nw_frag=no + [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_dst=192.168.0.0/16,nw_frag=no Datapath actions: drop ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=2,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=80'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,tcp,in_port=2,nw_dst=192.168.0.0/16,nw_frag=no + [Megaflow: recirc_id=0,eth,tcp,in_port=2,nw_dst=192.168.0.0/16,nw_frag=no Datapath actions: 1 ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=10.1.2.15,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=80'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,tcp,in_port=1,nw_dst=10.1.2.15,nw_frag=no,tp_dst=80 + [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_dst=10.1.2.15,nw_frag=no,tp_dst=80 Datapath actions: drop ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=10.1.2.15,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=79'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,tcp,in_port=1,nw_dst=10.1.2.15,nw_frag=no,tp_src=0x0/0x1,tp_dst=0x40/0xfff0 + [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_dst=10.1.2.15,nw_frag=no,tp_src=0x0/0xffc0,tp_dst=0x40/0xfff0 Datapath actions: 3 ]) AT_CHECK([ovs-vsctl set Flow_Table t0 prefixes=none], [0]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port=1,dl_src=50:54:00:00:00:05,dl_dst=50:54:00:00:00:07,dl_type=0x0800,nw_src=192.168.0.1,nw_dst=10.1.3.16,nw_proto=6,nw_tos=0,nw_ttl=128,tp_src=8,tp_dst=79'], [0], [stdout]) AT_CHECK([tail -2 stdout], [0], - [Megaflow: recirc_id=0,skb_priority=0,tcp,in_port=1,nw_dst=10.1.3.16,nw_frag=no + [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_dst=10.1.3.16,nw_frag=no Datapath actions: 3 ]) OVS_VSWITCHD_STOP(["/'prefixes' with incompatible field: ipv6_label/d"]) AT_CLEANUP + +AT_BANNER([conjunctive match]) + +AT_SETUP([single conjunctive match]) +OVS_VSWITCHD_START +add_of_ports br0 1 2 3 4 5 +AT_DATA([flows.txt], [dnl +conj_id=1,actions=3 +priority=100,ip,ip_src=10.0.0.1,actions=conjunction(1,1/2) +priority=100,ip,ip_src=10.0.0.4,actions=conjunction(1,1/2) +priority=100,ip,ip_src=10.0.0.6,actions=conjunction(1,1/2) +priority=100,ip,ip_src=10.0.0.7,actions=conjunction(1,1/2) +priority=100,ip,ip_dst=10.0.0.2,actions=conjunction(1,2/2) +priority=100,ip,ip_dst=10.0.0.5,actions=conjunction(1,2/2) +priority=100,ip,ip_dst=10.0.0.7,actions=conjunction(1,2/2) +priority=100,ip,ip_dst=10.0.0.8,actions=conjunction(1,2/2) +priority=100,ip,ip_src=10.0.0.1,ip_dst=10.0.0.4,actions=4 +priority=100,ip,ip_src=10.0.0.3,ip_dst=10.0.0.5,actions=5 + +priority=0 actions=2 +]) +AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) +for src in 0 1 2 3 4 5 6 7; do + for dst in 0 1 2 3 4 5 6 7; do + if test $src$dst = 14; then + out=4 + elif test $src$dst = 35; then + out=5 + else + out=2 + case $src in [[1467]]) case $dst in [[2578]]) out=3 ;; esac ;; esac + fi + AT_CHECK([ovs-appctl ofproto/trace br0 "in_port=1,dl_type=0x0800,nw_src=10.0.0.$src,nw_dst=10.0.0.$dst"], [0], [stdout]) + AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $out +]) + done +done +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([multiple conjunctive match]) +OVS_VSWITCHD_START +add_of_ports br0 1 2 3 4 5 +AT_DATA([flows.txt], [dnl +conj_id=1,actions=1 +conj_id=2,actions=2 +conj_id=3,actions=3 + +priority=5,ip,ip_src=20.0.0.0/8,actions=conjunction(1,1/2),conjunction(2,1/2) +priority=5,ip,ip_src=10.1.0.0/16,actions=conjunction(1,1/2),conjunction(3,2/3) +priority=5,ip,ip_src=10.2.0.0/16,actions=conjunction(1,1/2),conjunction(2,1/2) +priority=5,ip,ip_src=10.1.3.0/24,actions=conjunction(1,1/2),conjunction(3,2/3) +priority=5,ip,ip_src=10.1.4.5/32,actions=conjunction(1,1/2),conjunction(2,1/2) + +priority=5,ip,ip_dst=20.0.0.0/8,actions=conjunction(1,2/2) +priority=5,ip,ip_dst=10.1.0.0/16,actions=conjunction(1,2/2) +priority=5,ip,ip_dst=10.2.0.0/16,actions=conjunction(1,2/2) +priority=5,ip,ip_dst=10.1.3.0/24,actions=conjunction(1,2/2) +priority=5,ip,ip_dst=10.1.4.5/32,actions=conjunction(1,2/2) +priority=5,ip,ip_dst=30.0.0.0/8,actions=conjunction(2,2/2),conjunction(3,1/3) +priority=5,ip,ip_dst=40.5.0.0/16,actions=conjunction(2,2/2),conjunction(3,1/3) + +priority=5,tcp,tcp_dst=80,actions=conjunction(3,3/3) +priority=5,tcp,tcp_dst=443,actions=conjunction(3,3/3) + +priority=5,tcp,tcp_src=80,actions=conjunction(3,3/3) +priority=5,tcp,tcp_src=443,actions=conjunction(3,3/3) + +priority=0,actions=4 +]) +AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) +for a0 in \ + '1 20.0.0.1' \ + '2 10.1.0.1' \ + '3 10.2.0.1' \ + '4 10.1.3.1' \ + '5 10.1.4.5' \ + '6 1.2.3.4' +do + for b0 in \ + '1 20.0.0.1' \ + '2 10.1.0.1' \ + '3 10.2.0.1' \ + '4 10.1.3.1' \ + '5 10.1.4.5' \ + '6 30.0.0.1' \ + '7 40.5.0.1' \ + '8 1.2.3.4' + do + for c0 in '1 80' '2 443' '3 8080'; do + for d0 in '1 80' '2 443' '3 8080'; do + set $a0; a=$1 ip_src=$2 + set $b0; b=$1 ip_dst=$2 + set $c0; c=$1 tcp_src=$2 + set $d0; d=$1 tcp_dst=$2 + case $a$b$c$d in + [[12345]][[12345]]??) out=1 ;; + [[135]][[67]]??) out=2 ;; + [[24]][[67]][[12]]? | [[24]][[67]]?[[12]]) out=3 ;; + *) out=4 + esac + AT_CHECK([ovs-appctl ofproto/trace br0 "in_port=5,dl_type=0x0800,nw_proto=6,nw_src=$ip_src,nw_dst=$ip_dst,tcp_src=$tcp_src,tcp_dst=$tcp_dst"], [0], [stdout]) + AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $out +]) + done + done + done +done +OVS_VSWITCHD_STOP +AT_CLEANUP + +# In conjunctive match, we can find some soft matches that turn out not to be a +# real match. Usually, that's the end of the road--there is no real match. +# But if there is a flow identical to one of the flows that was a soft match, +# except with a lower priority, then we have to try again with that lower +# priority flow. This test checks this special case. +AT_SETUP([conjunctive match priority fallback]) +OVS_VSWITCHD_START +add_of_ports br0 1 2 3 4 5 6 7 +AT_DATA([flows.txt], [dnl +conj_id=1,actions=1 +conj_id=3,actions=3 + +priority=5,ip,ip_src=10.0.0.1,actions=conjunction(1,1/2) +priority=5,ip,ip_src=10.0.0.2,actions=conjunction(1,1/2) +priority=5,ip,ip_dst=10.0.0.1,actions=conjunction(1,2/2) +priority=5,ip,ip_dst=10.0.0.2,actions=conjunction(1,2/2) +priority=5,ip,ip_dst=10.0.0.3,actions=conjunction(1,2/2) + +priority=4,ip,ip_src=10.0.0.3,ip_dst=10.0.0.2,actions=2 + +priority=3,ip,ip_src=10.0.0.1,actions=conjunction(3,1/2) +priority=3,ip,ip_src=10.0.0.3,actions=conjunction(3,1/2) +priority=3,ip,ip_dst=10.0.0.2,actions=conjunction(3,2/2) +priority=3,ip,ip_dst=10.0.0.3,actions=conjunction(3,2/2) +priority=3,ip,ip_dst=10.0.0.4,actions=conjunction(3,2/2) + +priority=2,ip,ip_dst=10.0.0.1,actions=4 + +priority=1,ip,ip_src=10.0.0.1,ip_dst=10.0.0.5,actions=5 + +priority=0,actions=6 +]) +AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) +for src in 0 1 2 3; do + for dst in 0 1 2 3 4 5; do + case $src$dst in + [[12]][[123]]) out=1 ;; + 32) out=2 ;; + [[13]][[234]]) out=3 ;; + ?1) out=4 ;; + 15) out=5 ;; + *) out=6 + esac + AT_CHECK([ovs-appctl ofproto/trace br0 "in_port=7,dl_type=0x0800,nw_src=10.0.0.$src,nw_dst=10.0.0.$dst"], [0], [stdout]) + AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $out +]) + done +done +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([conjunctive match and other actions]) +OVS_VSWITCHD_START +# It's OK to use "conjunction" actions with "note" actions. +AT_CHECK([ovs-ofctl add-flow br0 'actions=conjunction(3,1/2),note:41.42.43.44.45.46']) +AT_CHECK([ovs-ofctl add-flow br0 'actions=note:41.42.43.44.45.46,conjunction(3,1/2)']) +# It's not OK to use "conjunction" actions with other types of actions. +AT_CHECK([ovs-ofctl '-vPATTERN:console:%c|%p|%m' add-flow br0 'actions=output:1,conjunction(3,1/2)'], [1], [], [dnl +ovs-ofctl: "conjunction" actions may be used along with "note" but not any other kind of action (such as the "output" action used here) +]) +AT_CHECK([ovs-ofctl '-vPATTERN:console:%c|%p|%m' add-flow br0 'actions=conjunction(3,1/2),output:1'], [1], [], [dnl +ovs-ofctl: "conjunction" actions may be used along with "note" but not any other kind of action (such as the "output" action used here) +]) +OVS_VSWITCHD_STOP +AT_CLEANUP