On Wed, Sep 17, 2014 at 9:02 PM, Joe Stringer <joestrin...@nicira.com> wrote:
>
>
> On 18 September 2014 13:02, Joe Stringer <joestrin...@nicira.com> wrote:
>>>
>>>
>>> > @@ -229,17 +244,19 @@ static bool match_validate(const struct
>>> > sw_flow_match *match,
>>> >                 }
>>> >         }
>>> >
>>> > -       if ((key_attrs & key_expected) != key_expected) {
>>> > +       attrs = attrs_to_bitmask(key_attrs, OVS_KEY_ATTR_MAX);
>>> > +       if ((attrs & key_expected) != attrs) {
>>> >                 /* Key attributes check failed. */
>>> >                 OVS_NLERR("Missing expected key attributes
>>> > (key_attrs=%llx, expected=%llx).\n",
>>> > -                               (unsigned long long)key_attrs,
>>> > (unsigned long long)key_expected);
>>> > +                               (unsigned long long)attrs, (unsigned
>>> > long long)key_expected);
>>> >                 return false;
>>> >         }
>
>
> I also accidentally changed the key_attrs comparison line, which I'll roll
> in a fix for.
>
>>>
>>> <snip>
>>>
>>> > @@ -611,30 +569,31 @@ int ovs_nla_put_egress_tunnel_key(struct sk_buff
>>> > *skb,
>>> >                                     egress_tun_info->options_len);
>>> >  }
>>> >
>>> > -static int metadata_from_nlattrs(struct sw_flow_match *match,  u64
>>> > *attrs,
>>> > +static int metadata_from_nlattrs(struct sw_flow_match *match,
>>> >                                  const struct nlattr **a, bool is_mask)
>>> >  {
>>> > -       if (*attrs & (1ULL << OVS_KEY_ATTR_DP_HASH)) {
>>> > +       if (a[OVS_KEY_ATTR_DP_HASH]) {
>>> >                 u32 hash_val = nla_get_u32(a[OVS_KEY_ATTR_DP_HASH]);
>>> >
>>> >                 SW_FLOW_KEY_PUT(match, ovs_flow_hash, hash_val,
>>> > is_mask);
>>> > -               *attrs &= ~(1ULL << OVS_KEY_ATTR_DP_HASH);
>>> > +               a[OVS_KEY_ATTR_DP_HASH] = NULL;
>>> >         }
>>> If you change a[], then match_validate() does not work.
>>
>>
>> I thought that I was misunderstanding something here, now I see that
>> ovs_key_from_nlattrs() doesn't modify the caller's version of the attrs
>> bitmask on master.
>>
>> Would you prefer that the ovs_key_from_nlattrs() function made a local
>> copy of 'a' and use that here or just convert it to a bitmask and keep
>> metadata_from_nlattrs() unchanged from master?
>>
>
> Actually, as far as I can tell, the logic below is the only reason we are
> changing 'a' in metadata_from_nlattrs(). We can drop all of the a[foo] =
> NULL and it all becomes simpler.
>
>
Sounds good to me. But I would like to take opinion from Andy.

>>> > @@ -884,13 +843,14 @@ static int ovs_key_from_nlattrs(struct
>>> > sw_flow_match *match, u64 attrs,
>>> >                         nd_key->nd_sll, ETH_ALEN, is_mask);
>>> >                 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.tll,
>>> >                                 nd_key->nd_tll, ETH_ALEN, is_mask);
>>> > -               attrs &= ~(1ULL << OVS_KEY_ATTR_ND);
>>> > +               a[OVS_KEY_ATTR_ND] = NULL;
>>> >         }
>>> >
>>> > -       if (attrs != 0) {
>>> > -               OVS_NLERR("Unknown key attributes (%llx).\n",
>>> > -                         (unsigned long long)attrs);
>>> > -               return -EINVAL;
>>> > +       for (i = 0; i < OVS_KEY_ATTR_MAX; i++) {
>>> > +               if (a[i]) {
>>> > +                       OVS_NLERR("Unknown key attribute (%d).\n", i);
>>> > +                       return -EINVAL;
>>> > +               }
>>> >         }
>>> >
>>> Do we still need it with NLA_PARSE_F_UNKNOWN flag?
>>
>>
>> Probably not. I'll fix this up.
>
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to