OpenFlow 1.0 can match on flows that have the IPv6 Ethertype, but ofputil_usable_protocols() incorrectly reported that such a match required NXM or OXM. This commit fixes the problem.
Also, add some related tests. Reported-by: Nagi Reddy Jonnala <njonn...@brocade.com> Signed-off-by: Ben Pfaff <b...@nicira.com> --- AUTHORS | 1 + lib/ofp-util.c | 21 +++++++---- tests/ovs-ofctl.at | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index 593776d..be0e637 100644 --- a/AUTHORS +++ b/AUTHORS @@ -175,6 +175,7 @@ Mike Kruze mkr...@nicira.com Min Chen ustcer.tonyc...@gmail.com Murphy McCauley murphy.mccau...@gmail.com Mikael Doverhag mdover...@nicira.com +Nagi Reddy Jonnala njonn...@brocade.com Niklas Andersson nanders...@nicira.com Pankaj Thakkar thak...@nicira.com Paul Ingram p...@nicira.com diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 44d3c4e..07c6ce2 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1095,8 +1095,19 @@ ofputil_usable_protocols(const struct match *match) | OFPUTIL_P_OF13_OXM; } - /* NXM and OXM support matching IPv6 traffic. */ - if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) { + /* NXM and OXM support matching L3 and L4 fields within IPv6. + * + * (arp_sha, arp_tha, nw_frag, and nw_ttl are covered elsewhere so they + * don't need to be included in this test too.) */ + if (match->flow.dl_type == htons(ETH_TYPE_IPV6) + && (!ipv6_mask_is_any(&wc->masks.ipv6_src) + || !ipv6_mask_is_any(&wc->masks.ipv6_dst) + || !ipv6_mask_is_any(&wc->masks.nd_target) + || wc->masks.ipv6_label + || wc->masks.tp_src + || wc->masks.tp_dst + || wc->masks.nw_proto + || wc->masks.nw_tos)) { return OFPUTIL_P_OF10_NXM_ANY | OFPUTIL_P_OF12_OXM | OFPUTIL_P_OF13_OXM; } @@ -1119,12 +1130,6 @@ ofputil_usable_protocols(const struct match *match) | OFPUTIL_P_OF13_OXM; } - /* NXM and OXM support matching IPv6 flow label. */ - if (wc->masks.ipv6_label) { - return OFPUTIL_P_OF10_NXM_ANY | OFPUTIL_P_OF12_OXM - | OFPUTIL_P_OF13_OXM; - } - /* NXM and OXM support matching IP ECN bits. */ if (wc->masks.nw_tos & IP_ECN_MASK) { return OFPUTIL_P_OF10_NXM_ANY | OFPUTIL_P_OF12_OXM diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at index db19e01..295cdc7 100644 --- a/tests/ovs-ofctl.at +++ b/tests/ovs-ofctl.at @@ -1,5 +1,106 @@ AT_BANNER([ovs-ofctl]) +AT_SETUP([ovs-ofctl parse-flows choice of protocol]) +# This doesn't cover some potential vlan_tci test cases. +for test_case in \ + 'tun_id=0 NXM,OXM' \ + 'tun_src=1.2.3.4 none' \ + 'tun_dst=1.2.3.4 none' \ + 'tun_flags=0 none' \ + 'tun_tos=0 none' \ + 'tun_ttl=0 none' \ + 'metadata=0 NXM,OXM' \ + 'in_port=1 any' \ + 'skb_priority=0 none' \ + 'skb_mark=1 none' \ + 'reg0=0 NXM,OXM' \ + 'reg1=1 NXM,OXM' \ + 'reg2=2 NXM,OXM' \ + 'reg3=3 NXM,OXM' \ + 'reg4=4 NXM,OXM' \ + 'reg5=5 NXM,OXM' \ + 'reg6=6 NXM,OXM' \ + 'reg7=7 NXM,OXM' \ + 'dl_src=00:11:22:33:44:55 any' \ + 'dl_src=00:11:22:33:44:55/00:ff:ff:ff:ff:ff NXM,OXM' \ + 'dl_dst=00:11:22:33:44:55 any' \ + 'dl_dst=00:11:22:33:44:55/00:ff:ff:ff:ff:ff NXM,OXM' \ + 'dl_type=0x1234 any' \ + 'dl_type=0x0800 any' \ + 'dl_type=0x0806 any' \ + 'dl_type=0x86dd any' \ + 'vlan_tci=0 any' \ + 'vlan_tci=0x1009 any' \ + 'dl_vlan=9 any' \ + 'vlan_vid=11 any' \ + 'dl_vlan_pcp=6 any' \ + 'vlan_pcp=5 any' \ + 'mpls,mpls_label=5 NXM,OXM' \ + 'mpls,mpls_tc=1 NXM,OXM' \ + 'mpls,mpls_bos=0 NXM,OXM' \ + 'ip,ip_src=1.2.3.4 any' \ + 'ip,ip_src=192.168.0.0/24 any' \ + 'ip,ip_src=192.0.168.0/255.0.255.0 NXM,OXM' \ + 'ip,ip_dst=1.2.3.4 any' \ + 'ip,ip_dst=192.168.0.0/24 any' \ + 'ip,ip_dst=192.0.168.0/255.0.255.0 NXM,OXM' \ + 'ipv6,ipv6_src=::1 NXM,OXM' \ + 'ipv6,ipv6_dst=::1 NXM,OXM' \ + 'ipv6,ipv6_label=5 NXM,OXM' \ + 'ip,nw_proto=1 any' \ + 'ipv6,nw_proto=1 NXM,OXM' \ + 'ip,nw_tos=0xf0 any' \ + 'ipv6,nw_tos=0xf0 NXM,OXM' \ + 'ip,nw_tos_shifted=0x3c any' \ + 'ipv6,nw_tos_shifted=0x3c NXM,OXM' \ + 'ip,nw_ecn=1 NXM,OXM' \ + 'ipv6,nw_ecn=1 NXM,OXM' \ + 'ip,nw_ttl=5 NXM,OXM' \ + 'ipv6,nw_ttl=5 NXM,OXM' \ + 'ip,ip_frag=no NXM,OXM' \ + 'ipv6,ip_frag=no NXM,OXM' \ + 'arp,arp_op=0 any' \ + 'arp,arp_spa=1.2.3.4 any' \ + 'arp,arp_tpa=1.2.3.4 any' \ + 'arp,arp_sha=00:11:22:33:44:55 NXM,OXM' \ + 'arp,arp_tha=00:11:22:33:44:55 NXM,OXM' \ + 'tcp,tcp_src=80 any' \ + 'tcp,tcp_src=0x1000/0x1000 NXM,OXM' \ + 'tcp6,tcp_src=80 NXM,OXM' \ + 'tcp6,tcp_src=0x1000/0x1000 NXM,OXM' \ + 'tcp,tcp_dst=80 any' \ + 'tcp,tcp_dst=0x1000/0x1000 NXM,OXM' \ + 'tcp6,tcp_dst=80 NXM,OXM' \ + 'tcp6,tcp_dst=0x1000/0x1000 NXM,OXM' \ + 'udp,udp_src=80 any' \ + 'udp,udp_src=0x1000/0x1000 NXM,OXM' \ + 'udp6,udp_src=80 NXM,OXM' \ + 'udp6,udp_src=0x1000/0x1000 NXM,OXM' \ + 'udp,udp_dst=80 any' \ + 'udp,udp_dst=0x1000/0x1000 NXM,OXM' \ + 'udp6,udp_dst=80 NXM,OXM' \ + 'udp6,udp_dst=0x1000/0x1000 NXM,OXM' \ + 'icmp,icmp_type=1 any' \ + 'icmp,icmp_type=1 any' \ + 'icmp6,icmpv6_type=1 NXM,OXM' \ + 'icmp6,icmpv6_code=2 NXM,OXM' +do + echo "$test_case" + set $test_case + if test "$2" = none; then + AT_CHECK([ovs-ofctl parse-flow "$1,actions=drop"], [1], + [usable protocols: none +], + [ovs-ofctl: no usable protocol +]) + else + AT_CHECK_UNQUOTED([ovs-ofctl parse-flow "$1,actions=drop" | sed 1q], [0], + [usable protocols: $2 +]) + fi +done +AT_CLEANUP + AT_SETUP([ovs-ofctl parse-flows (OpenFlow 1.0)]) AT_DATA([flows.txt], [[ # comment -- 1.7.2.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev