ofp-util: Properly handle "tun_id"s in tun_id_from_cookie flows.
authorBen Pfaff <blp@nicira.com>
Mon, 18 Apr 2011 17:11:43 +0000 (10:11 -0700)
committerBen Pfaff <blp@nicira.com>
Tue, 19 Apr 2011 18:55:19 +0000 (11:55 -0700)
Just setting the tun_id field isn't enough--it's also necessary to set
the tun_id_mask.  Otherwise the call to cls_rule_zero_wildcarded_fields()
at the end of ofputil_cls_rule_from_match() will zero out the tun_id again.

This was broken by commit 8368c090cab "Implement arbitrary bitwise masks
for tun_id field" back in January.  (This makes me wonder whether we can
drop support for tun_id_from_cookie now.)

Reported-by: Dan Wendlandt <dan@nicira.com>
lib/ofp-util.c
tests/ofproto.at

index bcaf3ddc5ecc61c56372bf8101fadac11dc3eae0..9541d69733988de5deb36ae7221e68bcf8350796 100644 (file)
@@ -137,7 +137,7 @@ ofputil_cls_rule_from_match(const struct ofp_match *match,
     wc->nw_dst_mask = ofputil_wcbits_to_netmask(ofpfw >> OFPFW_NW_DST_SHIFT);
 
     if (flow_format == NXFF_TUN_ID_FROM_COOKIE && !(ofpfw & NXFW_TUN_ID)) {
-        rule->flow.tun_id = htonll(ntohll(cookie) >> 32);
+        cls_rule_set_tun_id(rule, htonll(ntohll(cookie) >> 32));
     }
 
     if (ofpfw & OFPFW_DL_DST) {
index 95067561c4dfa5d988d9d57af2d67ce27892c93c..fc7ff57efa9aba087194ed68b4f0b11a12e13308 100644 (file)
@@ -48,10 +48,14 @@ AT_CHECK([ovs-ofctl dump-flows br0 | STRIP_XIDS], [0], [NXST_FLOW reply:
 ])
 AT_CHECK([echo 'in_port=1,actions=0' | ovs-ofctl add-flows br0 -])
 AT_CHECK([ovs-ofctl add-flow br0 in_port=0,actions=1])
-AT_CHECK([ovs-ofctl dump-flows br0 | STRIP_XIDS | STRIP_DURATION], [0], [dnl
-NXST_FLOW reply:
+dnl Tests for a bug in which ofproto ignored tun_id in tun_id_from_cookie
+dnl flow_mod commands.
+AT_CHECK([ovs-ofctl add-flow -F tun_id_from_cookie br0 tun_id=1,actions=mod_vlan_vid:4])
+AT_CHECK([ovs-ofctl dump-flows br0 | STRIP_XIDS | STRIP_DURATION | sort], [0], [dnl
  cookie=0x0, duration=?s, table_id=0, n_packets=0, n_bytes=0, in_port=1 actions=output:0
  cookie=0x0, duration=?s, table_id=0, n_packets=0, n_bytes=0, in_port=65534 actions=output:1
+ cookie=0x100000000, duration=?s, table_id=0, n_packets=0, n_bytes=0, tun_id=0x1 actions=mod_vlan_vid:4
+NXST_FLOW reply:
 ])
 AT_CHECK([ovs-ofctl del-flows br0])
 AT_CHECK([ovs-ofctl dump-flows br0 | STRIP_XIDS], [0], [NXST_FLOW reply: