The function flow_metadata_from_nlattrs() is very restrictive
about the ordering and type of metadata attributes that it receives.
This patch will change flow_metadata_from_nlattrs() behavior by
ignoring attributes that it does not understand and allowing them
to be passed in arbitrary order.
Issue #8167
---
datapath/flow.c | 17 +++++------------
1 files changed, 5 insertions(+), 12 deletions(-)
diff --git a/datapath/flow.c b/datapath/flow.c
index 2dc87ae..287816f 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -1166,43 +1166,36 @@ int flow_metadata_from_nlattrs(u32 *priority, u16
*in_port, __be64 *tun_id,
const struct nlattr *attr)
{
const struct nlattr *nla;
- u16 prev_type;
int rem;
*in_port = USHRT_MAX;
*tun_id = 0;
*priority = 0;
- prev_type = OVS_KEY_ATTR_UNSPEC;
nla_for_each_nested(nla, attr, rem) {
int type = nla_type(nla);
if (type > OVS_KEY_ATTR_MAX || nla_len(nla) !=
ovs_key_lens[type])
return -EINVAL;
- switch (TRANSITION(prev_type, type)) {
- case TRANSITION(OVS_KEY_ATTR_UNSPEC, OVS_KEY_ATTR_PRIORITY):
+ switch (type) {
+ case OVS_KEY_ATTR_PRIORITY:
*priority = nla_get_u32(nla);
break;
- case TRANSITION(OVS_KEY_ATTR_UNSPEC, OVS_KEY_ATTR_TUN_ID):
- case TRANSITION(OVS_KEY_ATTR_PRIORITY, OVS_KEY_ATTR_TUN_ID):
+ case OVS_KEY_ATTR_TUN_ID:
*tun_id = nla_get_be64(nla);
break;
- case TRANSITION(OVS_KEY_ATTR_UNSPEC, OVS_KEY_ATTR_IN_PORT):
- case TRANSITION(OVS_KEY_ATTR_PRIORITY, OVS_KEY_ATTR_IN_PORT):
- case TRANSITION(OVS_KEY_ATTR_TUN_ID, OVS_KEY_ATTR_IN_PORT):
+ case OVS_KEY_ATTR_IN_PORT:
if (nla_get_u32(nla) >= DP_MAX_PORTS)
return -EINVAL;
*in_port = nla_get_u32(nla);
break;
default:
- return 0;
+ break;
}
-
- prev_type = type;
}
if (rem)
return -EINVAL;
--
1.7.4.1
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev