Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b73c43f8 authored by Michał Mirosław's avatar Michał Mirosław Committed by David S. Miller
Browse files

net: sctp: fix checksum marking for outgoing packets



Packets to devices without NETIF_F_SCTP_CSUM (including NETIF_F_NO_CSUM)
should be properly checksummed because the packets can be diverted or
rerouted after construction. This still leaves packets diverted from
NETIF_F_SCTP_CSUM-enabled devices with broken checksums. Fixing this
needs implementing software offload fallback in networking core.

For users of sctp_checksum_disable, skb->ip_summed should be left as
CHECKSUM_NONE and not CHECKSUM_UNNECESSARY as per include/linux/skbuff.h.

Signed-off-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 51414d41
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
@@ -500,8 +500,8 @@ int sctp_packet_transmit(struct sctp_packet *packet)
	 * Note: Adler-32 is no longer applicable, as has been replaced
	 * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>.
	 */
	if (!sctp_checksum_disable &&
	    !(dst->dev->features & (NETIF_F_NO_CSUM | NETIF_F_SCTP_CSUM))) {
	if (!sctp_checksum_disable) {
		if (!(dst->dev->features & NETIF_F_SCTP_CSUM)) {
			__u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len);

			/* 3) Put the resultant value into the checksum field in the
@@ -509,14 +509,11 @@ int sctp_packet_transmit(struct sctp_packet *packet)
			 */
			sh->checksum = sctp_end_cksum(crc32);
		} else {
		if (dst->dev->features & NETIF_F_SCTP_CSUM) {
			/* no need to seed pseudo checksum for SCTP */
			nskb->ip_summed = CHECKSUM_PARTIAL;
			nskb->csum_start = (skb_transport_header(nskb) -
			                    nskb->head);
			nskb->csum_offset = offsetof(struct sctphdr, checksum);
		} else {
			nskb->ip_summed = CHECKSUM_UNNECESSARY;
		}
	}