sctp: Allow to disable SCTP checksums via module parameter
authorLucas Nussbaum <lucas.nussbaum@ens-lyon.fr>
Fri, 13 Feb 2009 08:33:41 +0000 (08:33 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Feb 2009 08:03:09 +0000 (00:03 -0800)
This is a new version of my patch, now using a module parameter instead
of a sysctl, so that the option is harder to find. Please note that,
once the module is loaded, it is still possible to change the value of
the parameter in /sys/module/sctp/parameters/, which is useful if you
want to do performance comparisons without rebooting.

Computation of SCTP checksums significantly affects the performance of
SCTP. For example, using two dual-Opteron 246 connected using a Gbe
network, it was not possible to achieve more than ~730 Mbps, compared to
941 Mbps after disabling SCTP checksums.
Unfortunately, SCTP checksum offloading in NICs is not commonly
available (yet).

By default, checksums are still enabled, of course.

Signed-off-by: Lucas Nussbaum <lucas.nussbaum@ens-lyon.fr>
Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sctp/structs.h
net/sctp/input.c
net/sctp/output.c
net/sctp/protocol.c

index 9661d7b765f08cc09295273b7e92edba74a32e4a..9f70d54fcefcb8b823e50d59238b1ab8ae1ae7a3 100644 (file)
@@ -218,6 +218,10 @@ extern struct sctp_globals {
 
        /* Flag to idicate if SCTP-AUTH is enabled */
        int auth_enable;
+
+       /* Flag to indicate whether computing and verifying checksum
+        * is disabled. */
+        int checksum_disable;
 } sctp_globals;
 
 #define sctp_rto_initial               (sctp_globals.rto_initial)
@@ -252,6 +256,7 @@ extern struct sctp_globals {
 #define sctp_addip_noauth              (sctp_globals.addip_noauth_enable)
 #define sctp_prsctp_enable             (sctp_globals.prsctp_enable)
 #define sctp_auth_enable               (sctp_globals.auth_enable)
+#define sctp_checksum_disable          (sctp_globals.checksum_disable)
 
 /* SCTP Socket type: UDP or TCP style. */
 typedef enum {
index 2e4a8646dbc389dcb55fcce1cf6b3ad0f608af0d..693fd0804810b37462d76af1b764615a7580852c 100644 (file)
@@ -142,7 +142,8 @@ int sctp_rcv(struct sk_buff *skb)
        __skb_pull(skb, skb_transport_offset(skb));
        if (skb->len < sizeof(struct sctphdr))
                goto discard_it;
-       if (!skb_csum_unnecessary(skb) && sctp_rcv_checksum(skb) < 0)
+       if (!sctp_checksum_disable && !skb_csum_unnecessary(skb) &&
+                 sctp_rcv_checksum(skb) < 0)
                goto discard_it;
 
        skb_pull(skb, sizeof(struct sctphdr));
index 47bfba6c03ecf66996b94b229a5849a5e8e23220..2d65b7a7330bbf5a3272075bdcb78bd436b94459 100644 (file)
@@ -531,7 +531,7 @@ 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 (!(dst->dev->features & NETIF_F_NO_CSUM)) {
+       if (!sctp_checksum_disable && !(dst->dev->features & NETIF_F_NO_CSUM)) {
                crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len);
                crc32 = sctp_end_cksum(crc32);
        } else
index b78e3be6901398f7a62b76a291fb8954341aacc0..cc0b592698f968702e065648e42ba37f937e7618 100644 (file)
@@ -1411,4 +1411,6 @@ MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-132");
 MODULE_ALIAS("net-pf-" __stringify(PF_INET6) "-proto-132");
 MODULE_AUTHOR("Linux Kernel SCTP developers <lksctp-developers@lists.sourceforge.net>");
 MODULE_DESCRIPTION("Support for the SCTP protocol (RFC2960)");
+module_param_named(no_checksums, sctp_checksum_disable, bool, 0644);
+MODULE_PARM_DESC(no_checksums, "Disable checksums computing and verification");
 MODULE_LICENSE("GPL");