On 12/10/2019 2:53 PM, Sathya Perla wrote:
> On Tue, Dec 10, 2019 at 5:25 PM Eli Britstein <el...@mellanox.com> wrote:
>>
>> On 12/10/2019 12:09 PM, Sathya Perla wrote:
>>> On Tue, Dec 10, 2019 at 1:21 PM Eli Britstein <el...@mellanox.com> wrote:
>>>> On 12/10/2019 8:52 AM, Sathya Perla wrote:
>>>>> On Sun, Dec 8, 2019 at 6:53 PM Eli Britstein <el...@mellanox.com> wrote:
>>>>> ...
>>>>>> +static int
>>>>>> +parse_clone_actions(struct netdev *netdev,
>>>>>> +                    struct flow_actions *actions,
>>>>>> +                    const struct nlattr *clone_actions,
>>>>>> +                    const size_t clone_actions_len,
>>>>>> +                    struct offload_info *info)
>>>>>> +{
>>>>>> +    const struct nlattr *ca;
>>>>>> +    unsigned int cleft;
>>>>>> +
>>>>>> +    NL_ATTR_FOR_EACH_UNSAFE (ca, cleft, clone_actions, 
>>>>>> clone_actions_len) {
>>>>>> +        int clone_type = nl_attr_type(ca);
>>>>>> +
>>>>>> +        if (clone_type == OVS_ACTION_ATTR_TUNNEL_PUSH) {
>>>>>> +            const struct ovs_action_push_tnl *tnl_push = 
>>>>>> nl_attr_get(ca);
>>>>>> +            struct rte_flow_action_raw_encap *raw_encap =
>>>>>> +                xzalloc(sizeof *raw_encap);
>>>>>> +
>>>>>> +            raw_encap->data = (uint8_t *)tnl_push->header;
>>>>>> +            raw_encap->preserve = NULL;
>>>>>> +            raw_encap->size = tnl_push->header_len;
>>>>>> +
>>>>>> +            add_flow_action(actions, RTE_FLOW_ACTION_TYPE_RAW_ENCAP,
>>>>>> +                            raw_encap);
>>>>> Hi, converting OVS_TUNNLE_PUSH into RTE_RAW_ENCAP loses the 'tnl_type'
>>>>> information provided by OVS. RAW_ENCAP provides the tunnel header just
>>>>> as a blob of bits which may not be ideal for NIC HW to offload.
>>>>>
>>>>> How about using tnl_push->tnl_type field to parse the header and
>>>>> compose specific tunnel encap actions like RTE_VXLAN_ENCAP,
>>>>> RTE_NVGRE_ENCAP etc.
>>>>> This would be also be more inline with how it's done with TC-offload.
>>>> I see your point. However, struct ovs_action_push_tnl has the "header"
>>>> field just as a raw binary buffer, and not detailed like in TC.
>>>> "tnl_type" has a comment /* For logging. */. It is indeed used for
>>>> logging, as in lib/odp-util.c, in function format_odp_tnl_push_header.
>>> This is not entirely true. Checkout propagate_tunnel_data_to_flow()
>>> where tnl_type is being used
>>> to figure out nw_proto.
>>>
>>>> using VXLAN_ENCAP instead of RAW_ENCAP will make the push less generic,
>>>> as I will have to parse the header to build the vxlan_encap fields, just
>>>> so they can re-build as a raw header in the PMD level, so I don't see
>>>> the offload benefit of it.
>>> Why are you assuming that all PMDs will rebuild the tunnel header
>>> fields as a 'raw header'?
>> As far as I saw in DPDK code, if I'm not wrong, all PMDs that support it
>> do it like this. Anyway, it is indeed not relevant.
>>> What if the NIC HW needs tunnel specific headers to be programmed
>>> separately for each tunnel type?
>>>
>>>> Another point is that this way it will support any header, not just
>>>> VXLAN (as an example).
>>> Given that VXLAN and NVGRE ENCAP and DECAP actions are already defined
>>> in rte_flow, how about
>>> we use them for vxlan and nvgre and use RAW for the rest of the tunnel 
>>> types?
>>> We can support all tunnel headers even this way.....
>> Again, I see your point.
>>
>> However, in OVS level, we have the encap as a raw buffer and DPDK
>> supports it natively using RAW_ENCAP. For that reason I think we should
>> use the straight forward method.
>>
>> I think that if there is a PMD that requires the fields separately, it
>> is under its responsibility to parse it, and not forcing the application
>> to do it.
> How should a PMD parse the header buffer? For e.g., for vxlan, should the PMD
> look for dst UDP port 4789? What if a different port number is used
> for vxlan as it's the case with some deployments?
> I think it's important to deal with this in OVS because the 'tnl_type'
> info is available in OVS and it should be relayed to the PMD
> is some form.
>
>> As it's a valid attribute in DPDK, and it's the natural way for OVS to
>> use, I think we should use it. If it is from some reason not valid, in
>> the future, DPDK will deprecate it.
> I agree RAW_ENCAP is a valid RTE action. But I feel we must choose the
> action that conveys/translates as much
> data as possible from the OVS layer to the PMD. This will enable
> offload support from more number of NIC HWs.

AFAIU, currently there is no such NIC HW that actually uses the 
additional info in VXLAN_ENCAP vs RAW_ENCAP, but they would just 
re-build the header as if it would been received with RAW, so for now I 
don't see any benefit of doing so. In the future, if there is such HW as 
you suggest, maybe it can be enhanced.

What do you think?

>
> thanks!
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to