About the second change,
A large part of ip protocols do not need the checksum recalculation of themself.
There are only 6 protocols in tc csum action except for the ip header.
If a protocol need the recalculation of the checksum, may be it should add the 
special handling in TC,
because each has the different checksum calculation.



From: Ilya Maximets <i.maxim...@ovn.org>
Date: 2023-07-21 22:20:55
To:  Aaron Conole <acon...@redhat.com>,ovs-dev <ovs-dev@openvswitch.org>
Cc:  simon.hor...@corigine.com,pa...@nvidia.com,Faicker Mo 
<faicker...@ucloud.cn>,i.maxim...@ovn.org
Subject: Re: [ovs-dev] [PATCH] netdev-tc-offload: Fix ip protocols not 
offloaded in ip rewrite>On 7/20/23 17:32, Aaron Conole wrote:
>> Faicker Mo via dev <ovs-dev@openvswitch.org> writes:
>> 
>>> The warning message is
>>> |00001|tc(handler4)|WARN|can't offload rewrite of IP/IPV6 with ip_proto: X.
>>>
>>> Some ip protocols like ipip, gre and so on do not need the recalculation of
>>> the checksum of themself except for the ip header checksum recalculation
>>> in the ip header rewrite case.
>>> The tc csum action also supports IGMP, UDPLITE and SCTP.
>>> Enable the offload of the ip protocols besides the TCP, UDP and ICMP.
>>>
>>> Fixes: d6118e628988 ("netdev-tc-offloads: Verify csum flags on dump from 
>>> tc")
>>> Signed-off-by: Faicker Mo <faicker...@ucloud.cn>
>>> ---
>> 
>> Hi Faicker,
>> 
>>>  lib/tc.c                         | 17 +++++++---------
>>>  tests/system-offloads-traffic.at | 34 ++++++++++++++++++++++++++++++++
>>>  2 files changed, 41 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/lib/tc.c b/lib/tc.c
>>> index f49048cda..501c7ceb8 100644
>>> --- a/lib/tc.c
>>> +++ b/lib/tc.c
>>> @@ -2967,22 +2967,19 @@ csum_update_flag(struct tc_flower *flower,
>>>      case TCA_PEDIT_KEY_EX_HDR_TYPE_IP6:
>>>      case TCA_PEDIT_KEY_EX_HDR_TYPE_TCP:
>>>      case TCA_PEDIT_KEY_EX_HDR_TYPE_UDP:
>>> +        flower->needs_full_ip_proto_mask = true;
>>>          if (flower->key.ip_proto == IPPROTO_TCP) {
>>> -            flower->needs_full_ip_proto_mask = true;
>>>              flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_TCP;
>>>          } else if (flower->key.ip_proto == IPPROTO_UDP) {
>>> -            flower->needs_full_ip_proto_mask = true;
>>>              flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_UDP;
>>> -        } else if (flower->key.ip_proto == IPPROTO_ICMP) {
>>> -            flower->needs_full_ip_proto_mask = true;
>>>          } else if (flower->key.ip_proto == IPPROTO_ICMPV6) {
>>> -            flower->needs_full_ip_proto_mask = true;
>>>              flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_ICMP;
>>> -        } else {
>>> -            VLOG_WARN_RL(&error_rl,
>>> -                         "can't offload rewrite of IP/IPV6 with ip_proto: 
>>> %d",
>>> -                         flower->key.ip_proto);
>>> -            break;
>>> +        } else if (flower->key.ip_proto == IPPROTO_IGMP) {
>>> +            flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_IGMP;
>>> +        } else if (flower->key.ip_proto == IPPROTO_UDPLITE) {
>>> +            flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_UDPLITE;
>>> +        } else if (flower->key.ip_proto == IPPROTO_SCTP) {
>>> +            flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_SCTP;
>> 
>> This seems like two changes to me.
>> 
>> First change is adding additional support for these other csum update
>> flags.  This could be argued as feature.
>
>Sounds like a feature to me.
>
>> 
>> Second change is dropping the WARN message and always setting
>> needs_full_ip_proto_mask.
>
>I'm not really sure we can do this second change.
>There are protocols that require L4 checksum recalculation on IP header
>changes.  These are not only well known TCP/UDP.  For example, the DCCP
>seems to be such a protocol.  And who knows what other protocols need
>that as well.  So, we should not blindly allow all the protocols.  We
>should only allow ones that are known to not require any special handling,
>or ones for which the special handling is supported by TC.
>
>Best regards, Ilya Maximets.
>
>> 
>>>          }
>>>          /* Fall through. */
>>>      case TCA_PEDIT_KEY_EX_HDR_TYPE_ETH:
>>> diff --git a/tests/system-offloads-traffic.at 
>>> b/tests/system-offloads-traffic.at
>>> index 7215e36e2..49b145e82 100644
>>> --- a/tests/system-offloads-traffic.at
>>> +++ b/tests/system-offloads-traffic.at
>>> @@ -855,3 +855,37 @@ AT_CHECK([ovs-appctl dpctl/dump-flows 
>>> type=tc,offloaded | grep "eth_type(0x0800)
>>>  OVS_TRAFFIC_VSWITCHD_STOP
>>>  AT_CLEANUP
>>>  
>>> +AT_SETUP([offloads - fix ip protocols not offloaded in ip rewrite - 
>>> offloads enabled])
>>> +OVS_TRAFFIC_VSWITCHD_START([], [], [-- set Open_vSwitch . 
>>> other_config:hw-offload=true])
>>> +
>>> +AT_CHECK([ovs-ofctl add-flow br0 "priority=0 actions=normal"])
>>> +
>>> +ADD_NAMESPACES(at_ns0, at_ns1)
>>> +
>>> +ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
>>> +ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
>>> +
>>> +dnl Set up the ip field modify flow.
>>> +AT_CHECK([ovs-ofctl add-flow br0 "priority=100 
>>> in_port=ovs-p0,ip,nw_dst=10.1.1.2 actions=dec_ttl,output:ovs-p1"])
>>> +AT_CHECK([ovs-ofctl add-flow br0 "priority=100 
>>> in_port=ovs-p1,ip,nw_dst=10.1.1.1 actions=dec_ttl,output:ovs-p0"])
>>> +
>>> +dnl Set up ipip tunnel in NS.
>>> +NS_CHECK_EXEC([at_ns0], [ip tunnel add ipip0 remote 10.1.1.2 2>/dev/null], 
>>> [0])
>>> +NS_CHECK_EXEC([at_ns0], [ip link set dev ipip0 up 2>/dev/null], [0])
>>> +NS_CHECK_EXEC([at_ns0], [ip addr add dev ipip0 192.168.1.1/30 
>>> 2>/dev/null], [0])
>>> +NS_CHECK_EXEC([at_ns1], [ip tunnel add ipip0 remote 10.1.1.1 2>/dev/null], 
>>> [0])
>>> +NS_CHECK_EXEC([at_ns1], [ip link set dev ipip0 up 2>/dev/null], [0])
>>> +NS_CHECK_EXEC([at_ns1], [ip addr add dev ipip0 192.168.1.2/30 
>>> 2>/dev/null], [0])
>>> +
>>> +dnl Check the tunnel.
>>> +NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 192.168.1.2 | 
>>> FORMAT_PING], [0], [dnl
>>> +3 packets transmitted, 3 received, 0% packet loss, time 0ms
>>> +])
>>> +
>>> +dnl Check the offloaded flow.
>>> +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep 
>>> "eth_type(0x0800)" | wc -l], [0], [dnl
>>> +2
>>> +])
>> 
>> In general there is a check for the specific flows by doing '|
>> DUMP_CLEAN_SORTED' but I also see that there are some tests which are
>> simply piping through 'wc -l'.  I prefer to see the actual flows in the
>> test, but I guess it isn't as big a deal here.
>> 
>>> +OVS_TRAFFIC_VSWITCHD_STOP
>>> +AT_CLEANUP
>> 
>> _______________________________________________
>> dev mailing list
>> d...@openvswitch.org
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>> 
>




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

Reply via email to