Add a field to rxrpc_txbuf in which to store the checksum to go in the
header as this may get overwritten in the wire header struct when
transmitting as part of a jumbo packet.
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: "David S. Miller" <davem@davemloft.net>
cc: Eric Dumazet <edumazet@google.com>
cc: Jakub Kicinski <kuba@kernel.org>
cc: Paolo Abeni <pabeni@redhat.com>
cc: linux-afs@lists.infradead.org
cc: netdev@vger.kernel.org
        unsigned int            flags;
 #define RXRPC_TXBUF_WIRE_FLAGS 0xff            /* The wire protocol flags */
 #define RXRPC_TXBUF_RESENT     0x100           /* Set if has been resent */
+       __be16                  cksum;          /* Checksum to go in header */
        u8 /*enum rxrpc_propose_ack_trace*/ ack_why;    /* If ack, why */
        struct {
                /* The packet for encrypting and DMA'ing.  We align it such
 
        /* Each transmission of a Tx packet+ needs a new serial number */
        txb->serial = rxrpc_get_next_serial(conn);
        txb->wire.serial = htonl(txb->serial);
+       txb->wire.cksum = txb->cksum;
 
        if (test_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags) &&
            txb->seq == 1)
 
        y = (y >> 16) & 0xffff;
        if (y == 0)
                y = 1; /* zero checksums are not permitted */
-       txb->wire.cksum = htons(y);
+       txb->cksum = htons(y);
 
        switch (call->conn->security_level) {
        case RXRPC_SECURITY_PLAIN:
 
                txb->ack_why            = 0;
                txb->seq                = call->tx_prepared + 1;
                txb->serial             = 0;
+               txb->cksum              = 0;
                txb->wire.epoch         = htonl(call->conn->proto.epoch);
                txb->wire.cid           = htonl(call->cid);
                txb->wire.callNumber    = htonl(call->call_id);