[ovs-dev] [recirc datapath V2 3/3] datapath: add recirc action

Andy Zhou azhou at nicira.com
Wed Apr 16 21:32:02 UTC 2014


On Wed, Apr 16, 2014 at 2:25 PM, Jesse Gross <jesse at nicira.com> wrote:
> On Wed, Apr 16, 2014 at 11:13 AM, Andy Zhou <azhou at nicira.com> wrote:
>> On Wed, Apr 16, 2014 at 11:03 AM, Pravin Shelar <pshelar at nicira.com> wrote:
>>> On Wed, Apr 16, 2014 at 6:51 AM, Andy Zhou <azhou at nicira.com> wrote:
>>>> diff --git a/datapath/actions.c b/datapath/actions.c
>>>> index cb239c8..4182b3d 100644
>>>> --- a/datapath/actions.c
>>>> +++ b/datapath/actions.c
>>>> +static int execute_recirc(struct datapath *dp, struct sk_buff *skb,
>>>> +                                const struct nlattr *a)
>>>> +{
>>>> +       struct sw_flow_key recirc_key;
>>>> +       uint16_t in_port = OVS_CB(skb)->pkt_key->phy.in_port;
>>>> +       uint32_t dp_hash = OVS_CB(skb)->pkt_key->dp_hash;
>>>> +       struct vport *p;
>>>> +       int err;
>>>> +
>>>> +       err = ovs_flow_extract(skb, in_port, &recirc_key);
>>>> +       if (err)
>>>> +               return err;
>>>> +
>>>> +       p = ovs_vport_rcu(dp, in_port);
>>>> +       if (unlikely(!p)) {
>>>> +               kfree_skb(skb);
>>>> +               return -ENODEV;
>>>> +       }
>>>> +
>>> We can store in-port in ovs-cb to avoid hash lookup.
>> Do you mean vport * ? Sure if ovs-cb can afford to lose 8 bytes.
>
> Space isn't really an issue at this point, so it should be fine.
Will do.
>
>>>> diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
>>>> index 0a1effa..883d9bf 100644
>>>> --- a/datapath/flow_netlink.c
>>>> +++ b/datapath/flow_netlink.c
>>>> @@ -474,6 +476,23 @@ static int metadata_from_nlattrs(struct sw_flow_match *match,  u64 *attrs,
>>>>                 *attrs &= ~(1ULL << OVS_KEY_ATTR_DP_HASH);
>>>>         }
>>>>
>>>> +       if (*attrs & (1ULL << OVS_KEY_ATTR_RECIRC_ID)) {
>>>> +               u32 recirc_id = nla_get_u32(a[OVS_KEY_ATTR_RECIRC_ID]);
>>>> +
>>>> +               if (is_mask && (recirc_id > 0 && recirc_id < UINT_MAX)) {
>>>> +                       OVS_NLERR("Reicrc_id mask is neither wildcard, nor exact match \n");
>>>> +                       return -EINVAL;
>>>> +               }
>>>> +
>>>> +               SW_FLOW_KEY_PUT(match, recirc_id, recirc_id, is_mask);
>>>> +               *attrs &= ~(1ULL << OVS_KEY_ATTR_RECIRC_ID);
>>>> +       }
>>>> +
>>>> +       if (is_mask) {
>>>> +               /* Always exact match recirc_id. */
>>>> +               SW_FLOW_KEY_PUT(match, recirc_id, UINT_MAX, is_mask);
>>>> +       }
>>>> +
>>>
>>> If the recirc_id is zero it should be safe to ignore it. Can you
>>> explain need for exact match for recirc_id ?
>>
>> Consider the following two flows:
>>
>> 1)  in_port = 1 ; actions= A
>> 2) recirc_id = 2, in_port =1 : Actions=B
>>
>> Without forcing exact match of recirc_id, a packet matches 2) could
>> also match 1)
>
> Presumably anybody that is using recirculation would already make this
> exact match already, right? Is there any possible use case for a
> partial mask?
>
Partial mask is not allowed for recirc_id. Either exact match or wildcard.
I am interpreting a missing attribute to be exact match 0. I think Pravin
is arguing for interpreting it as a wildcard. What do you think?

> You also have a typo in the error message ("Reicrc_id").
Thanks for the catching it. Will fix.



More information about the dev mailing list