X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Fofproto-dpif.at;h=d58c531344e8830f86eca389f781300a920a7567;hb=2bcf7df6f7a87d8940deff6fbbc359b0a310a74a;hp=d733f9b572d27b80ea51ad6b32d9d18163e3fe10;hpb=9da5b93abce74a41cce2bcba2d17c7b781123f7b;p=openvswitch diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index d733f9b5..d58c5313 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -62,6 +62,34 @@ AT_CHECK([tail -1 stdout], [0], OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto-dpif - output, OFPP_NONE ingress port]) +OVS_VSWITCHD_START( + [add-port br0 p1 -- set Interface p1 type=dummy --\ + add-port br0 p2 -- set Interface p2 type=dummy]) + +AT_CHECK( + [ovs-vsctl \ + -- get Interface p1 ofport \ + -- get Interface p2 ofport], + [0], [stdout]) +set `cat stdout` +br0=0 p1=$1 p2=$2 + +AT_CHECK([ovs-ofctl add-flow br0 action=normal]) + +# "in_port" defaults to OFPP_NONE if it's not specified. +flow="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)" +AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) +actual=`tail -1 stdout | sed 's/Datapath actions: //'` + +expected="$br0,$p1,$p2" +AT_CHECK([ovs-dpctl normalize-actions "$flow" "$expected" br0=$br0 p1=$p1 p2=$p2], [0], [stdout]) +mv stdout expout +AT_CHECK([ovs-dpctl normalize-actions "$flow" "$actual" br0=$br0 p1=$p1 p2=$p2], [0], [expout]) + +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]) @@ -460,6 +488,36 @@ AT_CHECK_UNQUOTED([tail -1 stdout], [0], OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto-dpif - mirroring, OFPP_NONE ingress port]) +OVS_VSWITCHD_START( + [add-port br0 p1 -- set Interface p1 type=dummy --\ + add-port br0 p2 -- set Interface p2 type=dummy --\ + set Bridge br0 mirrors=@m --\ + --id=@p2 get Port p2 --\ + --id=@m create Mirror name=mymirror \ + select_all=true output_port=@p2], [<0> +]) + +AT_CHECK( + [ovs-vsctl \ + -- get Interface p1 ofport \ + -- get Interface p2 ofport], + [0], [stdout]) +set `cat stdout` +p1=$1 p2=$2 + +AT_CHECK([ovs-ofctl add-flow br0 action=output:1]) + +# "in_port" defaults to OFPP_NONE if it's not specified. +flow="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)" +AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) +AT_CHECK_UNQUOTED([tail -1 stdout], [0], + [Datapath actions: $p1,$p2 +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([ofproto-dpif - mirroring, select_dst]) OVS_VSWITCHD_START( @@ -758,3 +816,131 @@ AT_CHECK_UNQUOTED([ovs-appctl fdb/show br1 | sed 's/[[0-9]]$/?/'], [0], [dnl OVS_VSWITCHD_STOP AT_CLEANUP + +dnl Test that basic NetFlow reports flow statistics correctly: +dnl - The initial packet of a flow are correctly accounted. +dnl - Later packets within a flow are correctly accounted. +dnl - Flow actions changing (in this case, due to MAC learning) +dnl cause a record to be sent. +AT_SETUP([ofproto-dpif - NetFlow flow expiration]) + +AT_SKIP_IF([test "x$RANDOM" = x]) +NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)` + +OVS_VSWITCHD_START( + [set Bridge br0 fail-mode=standalone -- \ + add-port br0 p1 -- set Interface p1 type=dummy -- \ + add-port br0 p2 -- set Interface p2 type=dummy -- \ + set Bridge br0 netflow=@nf -- \ + --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \ + engine_id=1 engine_type=2 active_timeout=30 \ + add-id-to-interface=false], [<0> +]) + +AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log]) + +for delay in 1000 30000; do + ovs-appctl netdev-dummy/receive p1 '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=64,frag=no),icmp(type=8,code=0)' + ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)' + + ovs-appctl time/warp $delay +done + +OVS_VSWITCHD_STOP +ovs-appctl -t test-netflow exit + +AT_CHECK([[sed -e 's/, uptime [0-9]*// +s/, now [0-9.]*// +s/time \([0-9]*\)\.\.\.\1\b/time / +s/time [0-9]*\.\.\.[0-9]*/time / +' netflow.log]], [0], + [header: v5, seq 0, engine 2,1 +rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, 1 pkts, 60 bytes, ICMP 8:0, time + +header: v5, seq 1, engine 2,1 +rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, 2 pkts, 120 bytes, ICMP 0:0, time +rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, 1 pkts, 60 bytes, ICMP 8:0, time +]) +AT_CLEANUP + +dnl Test that basic NetFlow reports active expirations correctly. +AT_SETUP([ofproto-dpif - NetFlow active expiration]) + +AT_SKIP_IF([test "x$RANDOM" = x]) +NETFLOW_PORT=`expr 32767 + \( $RANDOM % 32767 \)` + +OVS_VSWITCHD_START( + [set Bridge br0 fail-mode=standalone -- \ + add-port br0 p1 -- set Interface p1 type=dummy -- \ + add-port br0 p2 -- set Interface p2 type=dummy -- \ + set Bridge br0 netflow=@nf -- \ + --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \ + engine_id=1 engine_type=2 active_timeout=10 \ + add-id-to-interface=false], [<0> +]) + +AT_CHECK([test-netflow --detach --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log]) + +n=1 +while test $n -le 60; do + n=`expr $n + 1` + + ovs-appctl netdev-dummy/receive p1 '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=0,ttl=64,frag=no),tcp(src=1234,dst=80)' + ovs-appctl netdev-dummy/receive p2 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=6,tos=0,ttl=64,frag=no),tcp(src=80,dst=1234)' + + ovs-appctl time/warp 1000 +done + +ovs-appctl time/warp 10000 + +OVS_VSWITCHD_STOP +ovs-appctl -t test-netflow exit + +# Count the number of reported packets: +# - From source to destination before MAC learning kicks in (just one). +# - From source to destination after that. +# - From destination to source. +n_learn=0 +n_in=0 +n_out=0 +n_other=0 +n_recs=0 +none=0 +while read line; do + pkts=`echo "$line" | sed 's/.*, \([[0-9]]*\) pkts,.*/\1/'` + case $pkts in + [[0-9]]*) ;; + *) continue ;; + esac + + case $line in + "rec: 192.168.0.1 > 192.168.0.2, if 1 > 65535, "*" pkts, "*" bytes, TCP 1234 > 80, time "*) + counter=n_learn + ;; + "rec: 192.168.0.1 > 192.168.0.2, if 1 > 2, "*" pkts, "*" bytes, TCP 1234 > 80, time "*) + counter=n_in + ;; + "rec: 192.168.0.2 > 192.168.0.1, if 2 > 1, "*" pkts, "*" bytes, TCP 80 > 1234, time "*) + counter=n_out + ;; + *) + counter=n_other + ;; + esac + eval $counter=\`expr \$$counter + \$pkts\` + n_recs=`expr $n_recs + 1` +done < netflow.log + +# There should be exactly 1 MAC learning packet, +# exactly 59 other packets in that direction, +# and exactly 60 packets in the other direction. +AT_CHECK([echo $n_learn $n_in $n_out $n_other], [0], [1 59 60 0 +]) + +# There should be 1 expiration for MAC learning, +# at least 5 active and a final expiration in one direction, +# and at least 5 active and a final expiration in the other direction. +echo $n_recs +AT_CHECK([test $n_recs -ge 13]) + +AT_CLEANUP