Thread (13 messages) 13 messages, 4 authors, 2016-06-30

Re: [Patch net] mlx4: set csum_complete_sw bit when fixing complete csum

From: Tom Herbert <hidden>
Date: 2016-06-27 22:04:23

On Mon, Jun 27, 2016 at 2:49 PM, Cong Wang [off-list ref] wrote:
On Mon, Jun 27, 2016 at 2:47 PM, Tom Herbert [off-list ref] wrote:
quoted
On Mon, Jun 27, 2016 at 2:44 PM, Cong Wang [off-list ref] wrote:
quoted
On Mon, Jun 27, 2016 at 2:08 PM, Or Gerlitz [off-list ref] wrote:
quoted
On Mon, Jun 27, 2016 at 9:22 PM, Cong Wang [off-list ref] wrote:
quoted
The stack doesn't trust the complete csum by hardware
even when it is correct.
Can you explain that a little further?
Sure, here is the code in __skb_checksum_complete():

        /* skb->csum holds pseudo checksum */
        sum = csum_fold(csum_add(skb->csum, csum));
        if (likely(!sum)) {
                if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
                    !skb->csum_complete_sw)
                        netdev_rx_csum_fault(skb->dev);
        }

So when sum == 0, it means the checksum is correct. And
we already set ->ip_summed to CHECKSUM_COMPLETE
after check_csum(), and ->csum_complete_sw is initialized
to 0 when we allocate the skb. This is why we trigger
netdev_rx_csum_fault().
Yes, but this also means that the driver gave the stack a checksum
complete value that was incorrect. That's an error.
That is the whole purpose of commit f8c6455bb04b944edb69e,
isn't it?
No. Unless you've uncovered some other bug, what is probably happening
is that driver receives a packet with a checksum complete value. It
records the value in the skbuff and marks it as CHECKSUM_COMPLETE.
Subsequently, the stack tries to validate a transport layer checksum,
and the validation fails (checksum does not sum to zero). The stack
will then call __skb_checksum_complete from
__skb_checksum_validate_complete. In this case the stack computes that
transport checksum by hand and sees that transport checksum is valid--
so that means that the original value in checksum complete was not
correct, it is not set to the computed checksum of the whole packet.
This is an important error because it catches issues where checksum is
not correctly being pulled up.

Tom
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help