Hi Andy, Two comments inline
Other than those, LGTM, but review by others might be useful :) Acked-by: Daniele Di Proietto <ddiproie...@vmware.com> On 8/12/14, 1:45 PM, "Andy Zhou" <az...@nicira.com> wrote: >-1 was used to indicate both nested and variable length attributes. >This patch introduces OVS_KEY_LEN_NESTED and OVS_KEY_LEN_VARIABLE to >tell them apart. > >Refactor nlattr_set() to more more generally all ovs netlink key >attributes. Typo in the commit message (more more)? > >Signed-off-by: Andy Zhou <az...@nicira.com> >--- > datapath/flow_netlink.c | 88 >++++++++++++++++++++++++++++--------------------- > datapath/flow_netlink.h | 6 ++++ > 2 files changed, 57 insertions(+), 37 deletions(-) > >diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c >index e525c9d..cc5636b 100644 >--- a/datapath/flow_netlink.c >+++ b/datapath/flow_netlink.c >@@ -248,7 +248,7 @@ static bool match_validate(const struct sw_flow_match >*match, > > /* The size of the argument for each %OVS_KEY_ATTR_* Netlink attribute. >*/ > static const int ovs_key_lens[OVS_KEY_ATTR_MAX + 1] = { >- [OVS_KEY_ATTR_ENCAP] = -1, >+ [OVS_KEY_ATTR_ENCAP] = OVS_KEY_LEN_NESTED, > [OVS_KEY_ATTR_PRIORITY] = sizeof(u32), > [OVS_KEY_ATTR_IN_PORT] = sizeof(u32), > [OVS_KEY_ATTR_SKB_MARK] = sizeof(u32), >@@ -267,10 +267,24 @@ static const int ovs_key_lens[OVS_KEY_ATTR_MAX + 1] >= { > [OVS_KEY_ATTR_ND] = sizeof(struct ovs_key_nd), > [OVS_KEY_ATTR_DP_HASH] = sizeof(u32), > [OVS_KEY_ATTR_RECIRC_ID] = sizeof(u32), >- [OVS_KEY_ATTR_TUNNEL] = -1, >+ [OVS_KEY_ATTR_TUNNEL] = OVS_KEY_LEN_NESTED, > [OVS_KEY_ATTR_MPLS] = sizeof(struct ovs_key_mpls), > }; > >+/* The size of the argument for each %OVS_TUNNEL_KEY_ATTR_* Netlink >+ * attribute. */ >+static const int ovs_tunnel_key_lens[OVS_TUNNEL_KEY_ATTR_MAX + 1] = { >+ [OVS_TUNNEL_KEY_ATTR_ID] = sizeof(u64), >+ [OVS_TUNNEL_KEY_ATTR_IPV4_SRC] = sizeof(u32), >+ [OVS_TUNNEL_KEY_ATTR_IPV4_DST] = sizeof(u32), >+ [OVS_TUNNEL_KEY_ATTR_TOS] = 1, >+ [OVS_TUNNEL_KEY_ATTR_TTL] = 1, >+ [OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT] = 0, >+ [OVS_TUNNEL_KEY_ATTR_CSUM] = 0, >+ [OVS_TUNNEL_KEY_ATTR_OAM] = 0, >+ [OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS] = OVS_KEY_LEN_VARIABLE, >+}; >+ > static bool is_all_zero(const u8 *fp, size_t size) > { > int i; >@@ -310,7 +324,8 @@ static int __parse_flow_nlattrs(const struct nlattr >*attr, > } > > expected_len = ovs_key_lens[type]; >- if (nla_len(nla) != expected_len && expected_len != -1) { >+ if (nla_len(nla) != expected_len && >+ expected_len != OVS_KEY_LEN_NESTED) { > OVS_NLERR("Key attribute has unexpected length (type=%d" > ", length=%d, expected=%d).\n", type, > nla_len(nla), expected_len); >@@ -353,17 +368,6 @@ static int ipv4_tun_from_nlattr(const struct nlattr >*attr, > > nla_for_each_nested(a, attr, rem) { > int type = nla_type(a); >- static const u32 ovs_tunnel_key_lens[OVS_TUNNEL_KEY_ATTR_MAX + >1] = { >- [OVS_TUNNEL_KEY_ATTR_ID] = sizeof(u64), >- [OVS_TUNNEL_KEY_ATTR_IPV4_SRC] = sizeof(u32), >- [OVS_TUNNEL_KEY_ATTR_IPV4_DST] = sizeof(u32), >- [OVS_TUNNEL_KEY_ATTR_TOS] = 1, >- [OVS_TUNNEL_KEY_ATTR_TTL] = 1, >- [OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT] = 0, >- [OVS_TUNNEL_KEY_ATTR_CSUM] = 0, >- [OVS_TUNNEL_KEY_ATTR_OAM] = 0, >- [OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS] = -1, >- }; > > if (type > OVS_TUNNEL_KEY_ATTR_MAX) { > OVS_NLERR("Unknown IPv4 tunnel attribute (type=%d, > max=%d).\n", >@@ -372,7 +376,7 @@ static int ipv4_tun_from_nlattr(const struct nlattr >*attr, > } > > if (ovs_tunnel_key_lens[type] != nla_len(a) && >- ovs_tunnel_key_lens[type] != -1) { >+ ovs_tunnel_key_lens[type] != OVS_KEY_LEN_VARIABLE) { > OVS_NLERR("IPv4 tunnel attribute type has unexpected " > " length (type=%d, length=%d, > expected=%d).\n", > type, nla_len(a), ovs_tunnel_key_lens[type]); >@@ -819,26 +823,33 @@ static int ovs_key_from_nlattrs(struct >sw_flow_match *match, u64 attrs, > return 0; > } > >-static void nlattr_set(struct nlattr *attr, u8 val, bool >is_attr_mask_key) >+static void nlattr_set(struct nlattr *attr, u8 val, const int key_lens[]) > { > struct nlattr *nla; > int rem; > > /* The nlattr stream should already have been validated */ > nla_for_each_nested(nla, attr, rem) { >- /* We assume that ovs_key_lens[type] == -1 means that type is a >- * nested attribute >- */ >- if (is_attr_mask_key && ovs_key_lens[nla_type(nla)] == -1) >- nlattr_set(nla, val, false); >- else >+ int len = key_lens[nla_type(nla)]; >+ >+ if (len > 0 || len != OVS_KEY_LEN_NESTED) I donĀ¹t think the len > 0 check is necessary. > memset(nla_data(nla), val, nla_len(nla)); >- } >-} >+ else if ((len == OVS_KEY_LEN_NESTED) && >+ (key_lens == ovs_key_lens)) >+ switch(nla_type(nla)) { >+ case OVS_KEY_ATTR_ENCAP: >+ nlattr_set(attr, val, ovs_key_lens); >+ return; >+ >+ case OVS_KEY_ATTR_TUNNEL: >+ nlattr_set(attr, val, >+ ovs_tunnel_key_lens); >+ return; > >-static void mask_set_nlattr(struct nlattr *attr, u8 val) >-{ >- nlattr_set(attr, val, true); >+ } >+ >+ BUG_ON(len != 0); >+ } > } > > /** >@@ -925,7 +936,7 @@ int ovs_nla_get_match(struct sw_flow_match *match, > if (!newmask) > return -ENOMEM; > >- mask_set_nlattr(newmask, 0xff); >+ nlattr_set(newmask, 0xff, ovs_key_lens); > > /* The userspace does not send tunnel attributes that > * are 0, but we should not wildcard them nonetheless. >@@ -1529,7 +1540,7 @@ static int validate_set(const struct nlattr *a, > > if (key_type > OVS_KEY_ATTR_MAX || > (ovs_key_lens[key_type] != nla_len(ovs_key) && >- ovs_key_lens[key_type] != -1)) >+ ovs_key_lens[key_type] != OVS_KEY_LEN_NESTED)) > return -EINVAL; > > switch (key_type) { >@@ -1661,17 +1672,20 @@ static int __ovs_nla_copy_actions(const struct >nlattr *attr, > return -EOVERFLOW; > > nla_for_each_nested(a, attr, rem) { >- /* Expected argument lengths, (u32)-1 for variable length. */ >- static const u32 action_lens[OVS_ACTION_ATTR_MAX + 1] = { >+ /* Expected argument lengths, or OVS_KEY_LEN_NETSTED for >+ * nested actions attributes. */ >+ static const int action_lens[OVS_ACTION_ATTR_MAX + 1] = { > [OVS_ACTION_ATTR_OUTPUT] = sizeof(u32), > [OVS_ACTION_ATTR_RECIRC] = sizeof(u32), >- [OVS_ACTION_ATTR_USERSPACE] = (u32)-1, >- [OVS_ACTION_ATTR_PUSH_MPLS] = sizeof(struct >ovs_action_push_mpls), >+ [OVS_ACTION_ATTR_USERSPACE] = OVS_KEY_LEN_NESTED, >+ [OVS_ACTION_ATTR_PUSH_MPLS] = >+ sizeof(struct ovs_action_push_mpls), > [OVS_ACTION_ATTR_POP_MPLS] = sizeof(__be16), >- [OVS_ACTION_ATTR_PUSH_VLAN] = sizeof(struct >ovs_action_push_vlan), >+ [OVS_ACTION_ATTR_PUSH_VLAN] = >+ sizeof(struct ovs_action_push_vlan), > [OVS_ACTION_ATTR_POP_VLAN] = 0, >- [OVS_ACTION_ATTR_SET] = (u32)-1, >- [OVS_ACTION_ATTR_SAMPLE] = (u32)-1, >+ [OVS_ACTION_ATTR_SET] = OVS_KEY_LEN_NESTED, >+ [OVS_ACTION_ATTR_SAMPLE] = OVS_KEY_LEN_NESTED, > [OVS_ACTION_ATTR_HASH] = sizeof(struct ovs_action_hash) > }; > const struct ovs_action_push_vlan *vlan; >@@ -1680,7 +1694,7 @@ static int __ovs_nla_copy_actions(const struct >nlattr *attr, > > if (type > OVS_ACTION_ATTR_MAX || > (action_lens[type] != nla_len(a) && >- action_lens[type] != (u32)-1)) >+ action_lens[type] != (u32)OVS_KEY_LEN_NESTED)) > return -EINVAL; > > skip_copy = false; >diff --git a/datapath/flow_netlink.h b/datapath/flow_netlink.h >index 8ac40b5..d8db30b 100644 >--- a/datapath/flow_netlink.h >+++ b/datapath/flow_netlink.h >@@ -56,4 +56,10 @@ int ovs_nla_put_actions(const struct nlattr *attr, > > void ovs_nla_free_flow_actions(struct sw_flow_actions *); > >+enum { >+ /* values >= 0 are fixed key len */ >+ OVS_KEY_LEN_NESTED = -1, >+ OVS_KEY_LEN_VARIABLE = -2, >+}; >+ > #endif /* flow_netlink.h */ >-- >1.9.1 > >_______________________________________________ >dev mailing list >dev@openvswitch.org >https://urldefense.proofpoint.com/v1/url?u=http://openvswitch.org/mailman/ >listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=MV9BdLjtFIdhBDBaw5z%2BU >6SSA2gAfY4L%2F1HCy3VjlKU%3D%0A&m=7v2sJ9zJqPKVfcTXveTtTOuq8257Iyw1VlD0pe%2F >%2FZiE%3D%0A&s=850ba89bb67416a265803193bbcaf2f0223ccbb9a46ee14053cbcb44ade >47a80 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev