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.
/* 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;