When using set_field for nw_ecn with OF1.0 or OF1.1, you get an error
instead of a proper translation. This use to work before
4b684612d900
("ofp-actions: Translate mod_nw_ecn action to OF1.1 properly.") because
it would fallback to using NXM.
e.g.
[root@rhel7 ~]# ovs-ofctl -O OpenFlow10 add-flow br0 'ip actions=set_field:2->nw_ecn'
OFPT_ERROR (xid=0x4): OFPBAC_BAD_ARGUMENT
NXT_FLOW_MOD (xid=0x4):
...
$ ovs-ofctl -O OpenFlow11 add-flow br0 'ip actions=set_field:2->nw_ecn'
ovs-ofctl: none of the usable flow formats (NXM,OXM) is among the
allowed flow formats (OpenFlow11)
Fixes: 4b684612d900 ("ofp-actions: Translate mod_nw_ecn action to OF1.1 properly.")
Signed-off-by: Eric Garver <e@erig.me>
Signed-off-by: Ben Pfaff <blp@ovn.org>
* Access: read/write.
* NXM: NXM_NX_IP_ECN(28) since v1.4.
* OXM: OXM_OF_IP_ECN(9) since OF1.2 and v1.7.
+ * OF1.1: exact match.
*/
MFF_IP_ECN,
put_OFPAT_SET_NW_TOS(out, ofp_version, sf->value->u8 << 2);
break;
- case MFF_IP_ECN:
- put_OFPAT11_SET_NW_ECN(out, sf->value->u8);
+ case MFF_IP_ECN: {
+ struct ofpact_ecn ip_ecn = { .ecn = sf->value->u8 };
+ encode_SET_IP_ECN(&ip_ecn, ofp_version, out);
break;
+ }
case MFF_TCP_SRC:
case MFF_UDP_SRC:
OFPST_FLOW reply (OF1.1):
ip actions=mod_nw_ecn:2
])
+
+dnl Check that OF1.2+ set_field to set ECN is translated for earlier OF
+dnl versions.
+AT_CHECK([ovs-ofctl del-flows br0])
+AT_CHECK([ovs-ofctl -O OpenFlow10 add-flow br0 'ip,actions=set_field:2->ip_ecn'])
+AT_CHECK([ovs-ofctl del-flows br0])
+AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 'ip,actions=set_field:2->ip_ecn'])
+
OVS_VSWITCHD_STOP
AT_CLEANUP
'ipv6,nw_tos=0xf0 NXM,OXM' \
'ip,ip_dscp=0x3c any' \
'ipv6,ip_dscp=0x3c NXM,OXM' \
- 'ip,nw_ecn=1 NXM,OXM' \
+ 'ip,nw_ecn=1 NXM,OXM,OpenFlow11' \
'ipv6,nw_ecn=1 NXM,OXM' \
'ip,nw_ttl=5 NXM,OXM' \
'ipv6,nw_ttl=5 NXM,OXM' \