Check wildcards for in_port != out_port output validation. (udatapath)
authorJustin Pettit <jpettit@nicira.com>
Wed, 11 Feb 2009 23:23:23 +0000 (15:23 -0800)
committerJustin Pettit <jpettit@nicira.com>
Wed, 11 Feb 2009 23:23:23 +0000 (15:23 -0800)
OpenFlow requires that traffic that is to be sent out the interface it
came in on use the OFPP_IN_PORT virtual port.  The action validation
code that enforces this ignored the wildcards field, which meant it was
using the garbage 'in_port' value for this check.

NB: This problem was addressed in the kernel datapath with commit
1b580f69f3dfacee49532f71abd72755a09eabd4.

udatapath/dp_act.c

index 8579b10a7e5d5c2b41dfe3090ae68443acc9e22c..0baa0aba7ab813503a8e209e8f3720f45251610b 100644 (file)
@@ -50,7 +50,9 @@ validate_output(struct datapath *dp UNUSED, const struct sw_flow_key *key,
     /* To prevent loops, make sure there's no action to send to the
      * OFP_TABLE virtual port.
      */
-    if (oa->port == htons(OFPP_NONE) || oa->port == key->flow.in_port) {
+    if (oa->port == htons(OFPP_NONE) || 
+            (!(key->wildcards & OFPFW_IN_PORT) 
+                    && oa->port == key->flow.in_port)) {
         return OFPBAC_BAD_OUT_PORT;
     }
     return ACT_VALIDATION_OK;