Skip to content

Commit

Permalink
sctp: add feature bit for SCTP offload in hardware
Browse files Browse the repository at this point in the history
this is the sctp code to enable hardware crc32c offload for
adapters that support it.

Originally by: Vlad Yasevich <vladislav.yasevich@hp.com>

modified by Jesse Brandeburg <jesse.brandeburg@intel.com>

Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jesse Brandeburg authored and David S. Miller committed Apr 28, 2009
1 parent 182ff8d commit 8dc92f7
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
2 changes: 2 additions & 0 deletions include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,9 @@ struct net_device
#define NETIF_F_GRO 16384 /* Generic receive offload */
#define NETIF_F_LRO 32768 /* large receive offload */

/* the GSO_MASK reserves bits 16 through 23 */
#define NETIF_F_FCOE_CRC (1 << 24) /* FCoE CRC32 */
#define NETIF_F_SCTP_CSUM (1 << 25) /* SCTP checksum offload */

/* Segmentation offload features */
#define NETIF_F_GSO_SHIFT 16
Expand Down
17 changes: 14 additions & 3 deletions net/sctp/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)

/* Build the SCTP header. */
sh = (struct sctphdr *)skb_push(nskb, sizeof(struct sctphdr));
skb_reset_transport_header(nskb);
sh->source = htons(packet->source_port);
sh->dest = htons(packet->destination_port);

Expand Down Expand Up @@ -527,15 +528,25 @@ 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)) {
if (!sctp_checksum_disable &&
!(dst->dev->features & (NETIF_F_NO_CSUM | 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
* common header, and leave the rest of the bits unchanged.
*/
sh->checksum = sctp_end_cksum(crc32);
} else
nskb->ip_summed = CHECKSUM_UNNECESSARY;
} else {
if (dst->dev->features & NETIF_F_SCTP_CSUM) {
/* no need to seed psuedo 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;
}
}

/* IP layer ECN support
* From RFC 2481
Expand Down

0 comments on commit 8dc92f7

Please sign in to comment.