AT_BANNER([ofproto-dpif]) AT_SETUP([ofproto-dpif - resubmit]) OVS_VSWITCHD_START AT_DATA([flows.txt], [dnl table=0 in_port=1 priority=1000 icmp actions=output(10),resubmit(2),output(19),resubmit(3),output(21) table=0 in_port=2 priority=1500 icmp actions=output(11),resubmit(,1),output(16),resubmit(2,1),output(18) table=0 in_port=3 priority=2000 icmp actions=output(20) table=1 in_port=1 priority=1000 icmp actions=output(12),resubmit(4,1),output(13),resubmit(3),output(15) table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2) table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2) ]) AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-appctl ofproto/trace br0 '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=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21 ]) OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([ofproto-dpif - registers]) OVS_VSWITCHD_START AT_DATA([flows.txt], [dnl in_port=90 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:91 in_port=91 actions=resubmit:5,resubmit:6,resubmit:7,resubmit:92 in_port=92 actions=resubmit:8,resubmit:9,resubmit:10,resubmit:11 in_port=2 actions=load:0x000db000->NXM_NX_REG0[[]] in_port=3 actions=load:0xdea->NXM_NX_REG0[[20..31]] in_port=4 actions=load:0xeef->NXM_NX_REG0[[0..11]] in_port=5 actions=move:NXM_NX_REG0[[]]->NXM_NX_REG1[[]] in_port=6 actions=load:0x22222222->NXM_NX_REG2[[]] in_port=7 actions=move:NXM_NX_REG1[[20..31]]->NXM_NX_REG2[[0..11]] in_port=8 actions=move:NXM_NX_REG1[[0..11]]->NXM_NX_REG2[[20..31]] in_port=9,reg0=0xdeadbeef actions=output:20 in_port=10,reg1=0xdeadbeef actions=output:21 in_port=11,reg2=0xeef22dea actions=output:22 ]) AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-appctl ofproto/trace br0 '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: 20,21,22 ]) OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([ofproto-dpif - output]) OVS_VSWITCHD_START AT_DATA([flows.txt], [dnl in_port=1 actions=resubmit:2,resubmit:3,resubmit:4,resubmit:5,resubmit:6,resubmit:7 in_port=2 actions=output:9 in_port=3 actions=load:55->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]],load:66->NXM_NX_REG1[[]] in_port=4 actions=output:10,output:NXM_NX_REG0[[]],output:NXM_NX_REG1[[]],output:11 in_port=5 actions=load:77->NXM_NX_REG0[[0..15]],load:88->NXM_NX_REG0[[16..31]] in_port=6 actions=output:NXM_NX_REG0[[0..15]],output:NXM_NX_REG0[[16..31]] in_port=7 actions=load:0x110000ff->NXM_NX_REG0[[]],output:NXM_NX_REG0[[]] ]) AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-appctl ofproto/trace br0 '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=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: 9,55,10,55,66,11,77,88 ]) OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([ofproto-dpif - DSCP]) dnl This test assumes port p1 is allocated OpenFlow port number 1. OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy]) AT_DATA([flows.txt], [dnl actions=output:65534,enqueue:1:1,enqueue:1:2,enqueue:1:2,enqueue:1:1,output:1,mod_nw_tos:0,output:1,output:65534 ]) AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-vsctl -- \ set Port p1 qos=@newqos --\ --id=@newqos create QoS type=linux-htb queues=1=@q1,2=@q2 --\ --id=@q1 create Queue dscp=1 --\ --id=@q2 create Queue dscp=2], [0], [ignore]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(9),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: dnl 0,dnl set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xb,ttl=128,frag=no)),set(priority(2)),1,dnl 1,dnl set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x7,ttl=128,frag=no)),set(priority(1)),1,dnl set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0xff,ttl=128,frag=no)),set(priority(0)),1,dnl set(ipv4(src=1.1.1.1,dst=2.2.2.2,proto=1,tos=0x3,ttl=128,frag=no)),1,dnl 0 ]) OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([ofproto-dpif - output/flood flags]) dnl This test assumes that OpenFlow port numbers are allocated in order dnl starting from one. It does not necessarily require that they are allocated dnl in the same order that they are named in the database. Just that the dnl following command guarantees OpenFlow port 65534, and ports 1-7 exist in dnl the bridge. OVS_VSWITCHD_START([dnl add-port br0 p1 -- set Interface p1 type=dummy --\ add-port br0 p2 -- set Interface p2 type=dummy --\ add-port br0 p3 -- set Interface p3 type=dummy --\ add-port br0 p4 -- set Interface p4 type=dummy --\ add-port br0 p5 -- set Interface p5 type=dummy --\ add-port br0 p6 -- set Interface p6 type=dummy --\ add-port br0 p7 -- set Interface p7 type=dummy ]) AT_DATA([flows.txt], [dnl in_port=1 actions=flood in_port=2 actions=all in_port=3 actions=output:65534,output:1,output:2,output:3,output:4,output:5,output:6,output:7 in_port=4 actions=enqueue:65534:1,enqueue:1:1,enqueue:2:1,enqueue:3:2,enqueue:4:1,enqueue:5:1,enqueue:6:1,enqueue:7:1 ]) AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-ofctl mod-port br0 5 noforward]) AT_CHECK([ovs-ofctl mod-port br0 6 noflood]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(1),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout]) AT_CHECK([tail -1 stdout \ | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl 0 2 3 4 7 ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(2),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout]) AT_CHECK([tail -1 stdout \ | sed -e 's/Datapath actions: //' | tr ',' '\n' | sort], [0], [dnl 0 1 3 4 6 7 ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: 0,1,2,4,6,7 ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(4),eth(src=00:00:00:00:00:01,dst=00:00:00:00:00:02),eth_type(0x0900)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: set(priority(1)),0,1,2,set(priority(2)),3,set(priority(1)),6,7 ]) OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([ofproto-dpif - set_tunnel]) OVS_VSWITCHD_START AT_DATA([flows.txt], [dnl in_port=90 actions=resubmit:1,resubmit:2,resubmit:3,resubmit:4,resubmit:5 in_port=1 actions=set_tunnel:1,output:1 in_port=2 actions=set_tunnel:1,output:2 in_port=3 actions=set_tunnel:2,set_tunnel:3,output:3 in_port=4 actions=set_tunnel:4,set_tunnel:3,output:4 in_port=5 actions=set_tunnel:5 ]) AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-appctl ofproto/trace br0 'tun_id(0x1),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(tun_id(0x1)),1,2,set(tun_id(0x3)),3,4 ]) OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([ofproto-dpif - VLAN handling]) OVS_VSWITCHD_START( [set Bridge br0 fail-mode=standalone -- \ add-port br0 p1 trunks=10,12 -- \ add-port br0 p2 tag=10 -- \ add-port br0 p3 tag=12 \ other-config:priority-tags=true -- \ add-port br0 p4 tag=12 -- \ add-port br0 p5 vlan_mode=native-tagged tag=10 -- \ add-port br0 p6 vlan_mode=native-tagged tag=10 trunks=10,12 -- \ add-port br0 p7 vlan_mode=native-untagged tag=12 -- \ add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \ other-config:priority-tags=true -- \ set Interface p1 type=dummy -- \ set Interface p2 type=dummy -- \ set Interface p3 type=dummy -- \ set Interface p4 type=dummy -- \ set Interface p5 type=dummy -- \ set Interface p6 type=dummy -- \ set Interface p7 type=dummy -- \ set Interface p8 type=dummy --]) AT_CHECK( [ovs-vsctl \ -- get Interface p1 ofport \ -- get Interface p2 ofport \ -- get Interface p3 ofport \ -- get Interface p4 ofport \ -- get Interface p5 ofport \ -- get Interface p6 ofport \ -- get Interface p7 ofport \ -- get Interface p8 ofport], [0], [stdout]) set `cat stdout` br0=0 p1=$1 p2=$2 p3=$3 p4=$4 p5=$5 p6=$6 p7=$7 p8=$8 dnl Each of these specifies an in_port, a VLAN VID (or "none"), a VLAN dnl PCP (used if the VID isn't "none") and the expected set of datapath dnl actions. for tuple in \ "br0 none 0 drop" \ "br0 0 0 drop" \ "br0 0 1 drop" \ "br0 10 0 p1,p5,p6,p7,p8,pop_vlan,p2" \ "br0 10 1 p1,p5,p6,p7,p8,pop_vlan,p2" \ "br0 11 0 p5,p7" \ "br0 11 1 p5,p7" \ "br0 12 0 p1,p5,p6,pop_vlan,p3,p4,p7,p8" \ "br0 12 1 p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \ "p1 none 0 drop" \ "p1 0 0 drop" \ "p1 0 1 drop" \ "p1 10 0 br0,p5,p6,p7,p8,pop_vlan,p2" \ "p1 10 1 br0,p5,p6,p7,p8,pop_vlan,p2" \ "p1 11 0 drop" \ "p1 11 1 drop" \ "p1 12 0 br0,p5,p6,pop_vlan,p3,p4,p7,p8" \ "p1 12 1 br0,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \ "p2 none 0 push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \ "p2 0 0 pop_vlan,push_vlan(vid=10,pcp=0),br0,p1,p5,p6,p7,p8" \ "p2 0 1 pop_vlan,push_vlan(vid=10,pcp=1),br0,p1,p5,p6,p7,p8" \ "p2 10 0 drop" \ "p2 10 1 drop" \ "p2 11 0 drop" \ "p2 11 1 drop" \ "p2 12 0 drop" \ "p2 12 1 drop" \ "p3 none 0 p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \ "p3 0 0 pop_vlan,p4,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \ "p3 0 1 p8,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \ "p3 10 0 drop" \ "p3 10 1 drop" \ "p3 11 0 drop" \ "p3 11 1 drop" \ "p3 12 0 drop" \ "p3 12 1 drop" \ "p4 none 0 p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \ "p4 0 0 pop_vlan,p3,p7,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \ "p4 0 1 p3,p8,pop_vlan,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \ "p4 10 0 drop" \ "p4 10 1 drop" \ "p4 11 0 drop" \ "p4 11 1 drop" \ "p4 12 0 drop" \ "p4 12 1 drop" \ "p5 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \ "p5 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p6,p7,p8" \ "p5 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p6,p7,p8" \ "p5 10 0 br0,p1,p6,p7,p8,pop_vlan,p2" \ "p5 10 1 br0,p1,p6,p7,p8,pop_vlan,p2" \ "p5 11 0 br0,p7" \ "p5 11 1 br0,p7" \ "p5 12 0 br0,p1,p6,pop_vlan,p3,p4,p7,p8" \ "p5 12 1 br0,p1,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \ "p6 none 0 p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \ "p6 0 0 pop_vlan,p2,push_vlan(vid=10,pcp=0),br0,p1,p5,p7,p8" \ "p6 0 1 pop_vlan,p2,push_vlan(vid=10,pcp=1),br0,p1,p5,p7,p8" \ "p6 10 0 br0,p1,p5,p7,p8,pop_vlan,p2" \ "p6 10 1 br0,p1,p5,p7,p8,pop_vlan,p2" \ "p6 11 0 drop" \ "p6 11 1 drop" \ "p6 12 0 br0,p1,p5,pop_vlan,p3,p4,p7,p8" \ "p6 12 1 br0,p1,p5,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3,p8" \ "p7 none 0 p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \ "p7 0 0 pop_vlan,p3,p4,p8,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \ "p7 0 1 p3,p8,pop_vlan,p4,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \ "p7 10 0 br0,p1,p5,p6,p8,pop_vlan,p2" \ "p7 10 1 br0,p1,p5,p6,p8,pop_vlan,p2" \ "p7 11 0 br0,p5" \ "p7 11 1 br0,p5" \ "p7 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p8" \ "p7 12 1 br0,p1,p5,p6,pop_vlan,p4,push_vlan(vid=0,pcp=1),p3,p8" \ "p8 none 0 p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \ "p8 0 0 pop_vlan,p3,p4,p7,push_vlan(vid=12,pcp=0),br0,p1,p5,p6" \ "p8 0 1 p3,pop_vlan,p4,p7,push_vlan(vid=12,pcp=1),br0,p1,p5,p6" \ "p8 10 0 br0,p1,p5,p6,p7,pop_vlan,p2" \ "p8 10 1 br0,p1,p5,p6,p7,pop_vlan,p2" \ "p8 11 0 drop" \ "p8 11 1 drop" \ "p8 12 0 br0,p1,p5,p6,pop_vlan,p3,p4,p7" \ "p8 12 1 br0,p1,p5,p6,pop_vlan,p4,p7,push_vlan(vid=0,pcp=1),p3" do set $tuple in_port=$1 vlan=$2 pcp=$3 expected=$4 eval n_in_port=\$$in_port if test $vlan = none; then flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0xabcd)" else flow="in_port($n_in_port),eth(src=50:54:00:00:00:01,dst=ff:ff:ff:ff:ff:ff),eth_type(0x8100),vlan(vid=$vlan,pcp=$pcp),encap(eth_type(0xabcd))" fi echo "----------------------------------------------------------------------" echo "in_port=$in_port vlan=$vlan pcp=$pcp" AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) actual=`tail -1 stdout | sed 's/Datapath actions: //'` AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [stdout]) mv stdout expout AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2 p3=$p3 p4=$p4 p5=$p5 p6=$p6 p7=$p7 p8=$p8], [0], [expout]) done OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([ofproto-dpif - fragment handling]) OVS_VSWITCHD_START AT_DATA([flows.txt], [dnl priority=75 tcp ip_frag=no tp_dst=80 actions=output:1 priority=75 tcp ip_frag=first tp_dst=80 actions=output:2 priority=75 tcp ip_frag=later tp_dst=80 actions=output:3 priority=50 tcp ip_frag=no actions=output:4 priority=50 tcp ip_frag=first actions=output:5 priority=50 tcp ip_frag=later actions=output:6 ]) AT_CHECK([ovs-ofctl replace-flows br0 flows.txt]) base_flow="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=6,tos=0,ttl=128" no_flow="$base_flow,frag=no),tcp(src=12345,dst=80)" first_flow="$base_flow,frag=first),tcp(src=12345,dst=80)" later_flow="$base_flow,frag=later)" # mode no first later for tuple in \ 'normal 1 5 6' \ 'drop 1 drop drop' \ 'nx-match 1 2 6' do set $tuple mode=$1 no=$2 first=$3 later=$4 AT_CHECK([ovs-ofctl set-frags br0 $mode]) for type in no first later; do eval flow=\$${type}_flow exp_output=\$$type AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: $exp_output ]) done done OVS_VSWITCHD_STOP AT_CLEANUP AT_SETUP([ofproto-dpif - exit]) OVS_VSWITCHD_START AT_DATA([flows.txt], [dnl in_port=1 actions=output:10,exit,output:11 in_port=2 actions=output:12,resubmit:1,output:12 in_port=3 actions=output:13,resubmit:2,output:14 ]) AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-appctl ofproto/trace br0 '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=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10 ]) AT_CHECK([ovs-appctl ofproto/trace br0 '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: 12,10 ]) AT_CHECK([ovs-appctl ofproto/trace br0 'in_port(3),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: 13,12,10 ]) OVS_VSWITCHD_STOP AT_CLEANUP