On Sat, Apr 30, 2016 at 4:59 PM, Ben Greear <greearb@xxxxxxxxxxxxxxx> wrote:
On 04/30/2016 12:54 PM, Tom Herbert wrote:
We've put considerable effort into cleaning up the checksum interface
to make it as unambiguous as possible, please be very careful to
follow it. Broken checksum processing is really hard to detect and
debug.
CHECKSUM_UNNECESSARY means that some number of _specific_ checksums
(indicated by csum_level) have been verified to be correct in a
packet. Blindly promoting CHECKSUM_NONE to CHECKSUM_UNNECESSARY is
never right. If CHECKSUM_UNNECESSARY is set in such a manner but the
checksum it would refer to has not been verified and is incorrect this
is a major bug.
Suppose I know that the packet received on a packet-socket has
already been verified by a NIC that supports hardware checksumming.
Then, I want to transmit it on a veth interface using a second
packet socket. I do not want veth to recalculate the checksum on
transmit, nor to validate it on the peer veth on receive, because I do
not want to waste the CPU cycles. I am assuming that my app is not
accidentally corrupting frames, so the checksum can never be bad.
How should the checksumming be configured for the packets going into
the packet-socket from user-space?
It seems like that only the receiver should decide whether or not to
checksum packets on the veth, not the sender.
How about:
We could add a receiving socket option for "don't checksum packets
received from a veth when the other side has marked them as
elide-checksum-suggested" (similar to UDP_NOCHECKSUM), and a sending
socket option for "mark all data sent via this socket to a veth as
elide-checksum-suggested".
So the process would be:
Writer:
1. open read socket
2. open write socket, with option elide-checksum-for-veth-suggested
3. write data
Reader:
1. open read socket with "follow-elide-checksum-suggestions-on-veth"
2. read data
The kernel / module would then need to persist the flag on all packets
that traverse a veth, and drop these data when they leave the veth
module.
Also, I might want to send raw frames that do have
broken checksums (lets assume a real NIC, not veth), and I want them
to hit the wire with those bad checksums.
How do I configure the checksumming in this case?
Correct me if I'm wrong but I think this is already possible now. You
can have packets with incorrect checksum hitting the wire as is. What
you cannot do is instruct the receiving end to ignore the checksum
from the sending end when using a physical device (and something I
think we should mimic on the sending device).