Hi Pravin,

couple of comments:

- I would remove also the check for match->mask in update_range__().
- I think braces are not necessary for if/else statements in the macros.

Of course I would wait for review by Jesse or Andy, but other than that,
LGTM.

Acked-by: Daniele Di Proietto <ddiproie...@vmware.com>


On 8/7/14, 9:26 PM, "Pravin B Shelar" <pshe...@nicira.com> wrote:

>OVS does mask validation even if it does not need to convert
>netlink mask attributes to mask structure.  ovs_nla_get_match()
>caller can pass NULL mask structure pointer if the caller does
>not need mask.  Therefore NULL check is required in SW_FLOW_KEY*
>macros.  Following patch does not convert mask netlink attributes
>if mask pointer is NULL, so we do not need these checks in
>SW_FLOW_KEY* macro.
>
>Signed-off-by: Pravin B Shelar <pshe...@nicira.com>
>---
> datapath/flow_netlink.c | 74
>++++++++++++++++++++++++++-----------------------
> 1 file changed, 39 insertions(+), 35 deletions(-)
>
>diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
>index 75172de..63ab7a6 100644
>--- a/datapath/flow_netlink.c
>+++ b/datapath/flow_netlink.c
>@@ -84,8 +84,7 @@ static void update_range__(struct sw_flow_match *match,
>               update_range__(match, offsetof(struct sw_flow_key, field),  \
>                                    sizeof((match)->key->field), is_mask); \
>               if (is_mask) {                                              \
>-                      if ((match)->mask)                                  \
>-                              (match)->mask->key.field = value;           \
>+                      (match)->mask->key.field = value;                   \
>               } else {                                                    \
>                       (match)->key->field = value;                        \
>               }                                                           \
>@@ -95,10 +94,9 @@ static void update_range__(struct sw_flow_match *match,
>       do { \
>               update_range__(match, offset, len, is_mask);                \
>               if (is_mask) {                                              \
>-                      if ((match)->mask)                                  \
>-                              memcpy((u8 *)&(match)->mask->key + offset, 
>value_p, len);\
>+                      memcpy((u8 *)&(match)->mask->key + offset, value_p, 
>len);\
>               } else {                                                    \
>-                      memcpy((u8 *)(match)->key + offset, value_p, len);      
>   \
>+                      memcpy((u8 *)(match)->key + offset, value_p, len);  \
>               }                                                           \
>       } while (0)
> 
>@@ -111,9 +109,8 @@ static void update_range__(struct sw_flow_match
>*match,
>               update_range__(match, offsetof(struct sw_flow_key, field),  \
>                                    sizeof((match)->key->field), is_mask); \
>               if (is_mask) {                                              \
>-                      if ((match)->mask)                                  \
>-                              memset((u8 *)&(match)->mask->key.field, value,\
>-                                     sizeof((match)->mask->key.field));   \
>+                      memset((u8 *)&(match)->mask->key.field, value,\
>+                             sizeof((match)->mask->key.field));   \
>               } else {                                                    \
>                       memset((u8 *)&(match)->key->field, value,           \
>                              sizeof((match)->key->field));                \
>@@ -633,8 +630,7 @@ static int ovs_key_from_nlattrs(struct sw_flow_match
>*match, u64 attrs,
> 
>               SW_FLOW_KEY_PUT(match, eth.tci, tci, is_mask);
>               attrs &= ~(1ULL << OVS_KEY_ATTR_VLAN);
>-      } else if (!is_mask)
>-              SW_FLOW_KEY_PUT(match, eth.tci, htons(0xffff), true);
>+      }
> 
>       if (attrs & (1ULL << OVS_KEY_ATTR_ETHERTYPE)) {
>               __be16 eth_type;
>@@ -859,8 +855,8 @@ static void mask_set_nlattr(struct nlattr *attr, u8
>val)
>  * attribute specifies the mask field of the wildcarded flow.
>  */
> int ovs_nla_get_match(struct sw_flow_match *match,
>-                    const struct nlattr *key,
>-                    const struct nlattr *mask)
>+                    const struct nlattr *nla_key,
>+                    const struct nlattr *nla_mask)
> {
>       const struct nlattr *a[OVS_KEY_ATTR_MAX + 1];
>       const struct nlattr *encap;
>@@ -870,7 +866,7 @@ int ovs_nla_get_match(struct sw_flow_match *match,
>       bool encap_valid = false;
>       int err;
> 
>-      err = parse_flow_nlattrs(key, a, &key_attrs);
>+      err = parse_flow_nlattrs(nla_key, a, &key_attrs);
>       if (err)
>               return err;
> 
>@@ -911,35 +907,43 @@ int ovs_nla_get_match(struct sw_flow_match *match,
>       if (err)
>               return err;
> 
>-      if (match->mask && !mask) {
>-              /* Create an exact match mask. We need to set to 0xff all the
>-               * 'match->mask' fields that have been touched in 'match->key'.
>-               * We cannot simply memset 'match->mask', because padding bytes
>-               * and fields not specified in 'match->key' should be left to 0.
>-               * Instead, we use a stream of netlink attributes, copied from
>-               * 'key' and set to 0xff: ovs_key_from_nlattrs() will take care
>-               * of filling 'match->mask' appropriately.
>-               */
>-              newmask = kmemdup(key, nla_total_size(nla_len(key)),
>-                                GFP_KERNEL);
>-              if (!newmask)
>-                      return -ENOMEM;
>+      if (match->mask) {
>+
>+              if (!nla_mask) {
>+                      /* Create an exact match mask. We need to set to 0xff
>+                       * all the 'match->mask' fields that have been touched
>+                       * in 'match->key'. We cannot simply memset
>+                       * 'match->mask', because padding bytes and fields not
>+                       * specified in 'match->key' should be left to 0.
>+                       * Instead, we use a stream of netlink attributes,
>+                       * copied from 'key' and set to 0xff: 
>ovs_key_from_nlattrs()
>+                       * will take care of filling 'match->mask' 
>appropriately.
>+                       */
>+                      newmask = kmemdup(nla_key,
>+                                        nla_total_size(nla_len(nla_key)),
>+                                        GFP_KERNEL);
>+                      if (!newmask)
>+                              return -ENOMEM;
> 
>-              mask_set_nlattr(newmask, 0xff);
>+                      mask_set_nlattr(newmask, 0xff);
> 
>-              /* The userspace does not send tunnel attributes that are 0,
>-               * but we should not wildcard them nonetheless. */
>-              if (match->key->tun_key.ipv4_dst)
>-                      SW_FLOW_KEY_MEMSET_FIELD(match, tun_key, 0xff, true);
>+                      /* The userspace does not send tunnel attributes that
>+                       * are 0, but we should not wildcard them nonetheless.
>+                       */
>+                      if (match->key->tun_key.ipv4_dst)
>+                              SW_FLOW_KEY_MEMSET_FIELD(match, tun_key,
>+                                                       0xff, true);
> 
>-              mask = newmask;
>-      }
>+                      nla_mask = newmask;
>+              }
> 
>-      if (mask) {
>-              err = parse_flow_mask_nlattrs(mask, a, &mask_attrs);
>+              err = parse_flow_mask_nlattrs(nla_mask, a, &mask_attrs);
>               if (err)
>                       goto free_newmask;
> 
>+              /* Always match on tci. */
>+              SW_FLOW_KEY_PUT(match, eth.tci, htons(0xffff), true);
>+
>               if (mask_attrs & 1ULL << OVS_KEY_ATTR_ENCAP) {
>                       __be16 eth_type = 0;
>                       __be16 tci = 0;
>-- 
>1.9.3
>
>_______________________________________________
>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=9WggZ4ZovrrQ5GRI9bcKsMv%2BY8JSaoZB1XECseA
>iUS4%3D%0A&s=06b570a825ecaa3421698357c4647851c197cace2bf3cf1b28d6900c0e5c0
>cc1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to