[dpdk-dev] [PATCH] net/tap: Allow all-zero checksum for UDP over IPv4

Ferruh Yigit ferruh.yigit at intel.com
Tue Nov 10 18:42:54 CET 2020


On 11/10/2020 4:01 PM, Morten Brørup wrote:
>> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Ferruh Yigit
>> Sent: Tuesday, November 10, 2020 3:47 PM
>>
>> On 11/9/2020 2:22 PM, Michael Pfeiffer wrote:
>>> Unlike TCP, UDP checksums are optional and may be zero to indicate "not
>>> set" [RFC 768] (except for IPv6, where this prohibited [RFC 8200]). Add
>>> this special case to the checksum offload emulation in net/tap.
>>>
>>> Signed-off-by: Michael Pfeiffer <michael.pfeiffer at tu-ilmenau.de>
>>> ---
>>>    drivers/net/tap/rte_eth_tap.c | 13 +++++++++++--
>>>    1 file changed, 11 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/net/tap/rte_eth_tap.c
>> b/drivers/net/tap/rte_eth_tap.c
>>> index 2f8abb12c..e486b41c5 100644
>>> --- a/drivers/net/tap/rte_eth_tap.c
>>> +++ b/drivers/net/tap/rte_eth_tap.c
>>> @@ -303,6 +303,7 @@ tap_verify_csum(struct rte_mbuf *mbuf)
>>>    	uint16_t cksum = 0;
>>>    	void *l3_hdr;
>>>    	void *l4_hdr;
>>> +	struct rte_udp_hdr *udp_hdr;
>>>
>>>    	if (l2 == RTE_PTYPE_L2_ETHER_VLAN)
>>>    		l2_len += 4;
>>> @@ -349,10 +350,18 @@ tap_verify_csum(struct rte_mbuf *mbuf)
>>>    		/* Don't verify checksum for multi-segment packets. */
>>>    		if (mbuf->nb_segs > 1)
>>>    			return;
>>> -		if (l3 == RTE_PTYPE_L3_IPV4)
>>> +		if (l3 == RTE_PTYPE_L3_IPV4) {
>>> +			if (l4 == RTE_PTYPE_L4_UDP) {
>>> +				udp_hdr = (struct rte_udp_hdr *)l4_hdr;
>>> +				if (udp_hdr->dgram_cksum == 0) {
>>> +					mbuf->ol_flags |= PKT_RX_L4_CKSUM_NONE;
>>> +					return;
>>> +				}
>>> +			}
>>>    			cksum = ~rte_ipv4_udptcp_cksum(l3_hdr, l4_hdr);
>>> -		else if (l3 == RTE_PTYPE_L3_IPV6)
>>> +		} else if (l3 == RTE_PTYPE_L3_IPV6) {
>>>    			cksum = ~rte_ipv6_udptcp_cksum(l3_hdr, l4_hdr);
>>> +		}
>>>    		mbuf->ol_flags |= cksum ?
>>>    			PKT_RX_L4_CKSUM_BAD :
>>>    			PKT_RX_L4_CKSUM_GOOD;
>>>
>>
>> While checking this I stuck with following part:
>>
>>    cksum = ~rte_ipv6_udptcp_cksum(l3_hdr, l4_hdr);
>>    ...
>>     mbuf->ol_flags |= cksum ?
>>     	PKT_RX_L4_CKSUM_BAD :
>>    	PKT_RX_L4_CKSUM_GOOD;
>>
>>
>> Is this correct, or am I missing something, can intention be '!' here
>> instead of
>> '~' ?
> 
> It is correct. The packet's checksum is calculated by rte_ipv6_udptcp_cksum(), and it should be 0xFFFF. The '~' operation makes cksum 0 iff the calculated checksum is 0xFFFF.
> 

Yep, figure that out late,
as far as I understand when the checksum value is zero, 
'rte_ipv6_udptcp_cksum()' will return the checksum value and when checksum is 
correct in the packet, function will return 0xFFFF, this is based on checksum 
calculation, is this right?


More information about the dev mailing list