On 8/8/14, 4:46 PM, "Andy Zhou" <az...@nicira.com> wrote:

>On Fri, Aug 8, 2014 at 3:58 PM, Pravin Shelar <pshe...@nicira.com> wrote:
>> On Fri, Aug 8, 2014 at 1:56 PM, Andy Zhou <az...@nicira.com> wrote:
>>> I agree with Daniele's comments.
>>>
>>> Acked-by: Andy Zhou <az...@nicira.com>
>>>
>> Thanks I pushed patch to master.
>>
>>> mask_set_nlattr() seems to have a single user. may be we cna remove
>>> this function and
>>> call set_nlattr() directly?
>>>
>>> Not part of this patch, but set_nlattr() does not look correct in
>>> handling nested attributes.
>>>
>> can you elaborate on that? It should handle ovs key attributes.
>
>The minor issue is that the name of the 3rd argument
>"is_attr_mask_key" seems wrong. We first pass in with 'true' then
>change to 'false' for nested attribute does not make sense.  It is
>still part of mask.

Œis_attr_mask_key¹ refers to OVS_FLOW_ATTR_MASK, but I guess that it is
not straightforward. It would be nice to have a more generic netlink
mechanism to solve this issue. Perhaps we should try something like you
suggested (key_len = -2).

>
>The main issue is that this logic does not handle genuine multiple
>level of nested attributes. For example, encap within tunnel.  OVS
>does not support ittoday but Geneve does allow for outer header to
>have a vlan tag.
>
>If the issue is to handle variable length key types, such as GENEVE
>options, we should try to tell that apart from the nested ones, may be
>using key_len of -2?
>
>Make sense?
>
>
>
>>
>>>
>>> On Fri, Aug 8, 2014 at 9:25 AM, Daniele Di Proietto
>>> <ddiproie...@vmware.com> wrote:
>>>> 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/mail
>>>>>man/
>>>>>listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=MV9BdLjtFIdhBDBaw5z
>>>>>%2BU
>>>>>6SSA2gAfY4L%2F1HCy3VjlKU%3D%0A&m=9WggZ4ZovrrQ5GRI9bcKsMv%2BY8JSaoZB1XE
>>>>>CseA
>>>>>iUS4%3D%0A&s=06b570a825ecaa3421698357c4647851c197cace2bf3cf1b28d6900c0
>>>>>e5c0
>>>>>cc1
>>>>
>>>> _______________________________________________
>>>> dev mailing list
>>>> dev@openvswitch.org
>>>> 
>>>>https://urldefense.proofpoint.com/v1/url?u=http://openvswitch.org/mailm
>>>>an/listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=MV9BdLjtFIdhBDBaw
>>>>5z%2BU6SSA2gAfY4L%2F1HCy3VjlKU%3D%0A&m=28Lt0dzZ7w%2BmkbqJsPC0wd0dWShVt1
>>>>xq2qYIEufBl3k%3D%0A&s=58cd2f65a3fb1ee1048def99555bbccb701f782fe43b37a84
>>>>f233ec44bd31f43

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

Reply via email to