sctp: Allow to disable SCTP checksums via module parameter
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>
This commit is contained in:
committed by
David S. Miller
parent
85e8d004ec
commit
06e868066e
@@ -218,6 +218,10 @@ extern struct sctp_globals {
|
|||||||
|
|
||||||
/* Flag to idicate if SCTP-AUTH is enabled */
|
/* Flag to idicate if SCTP-AUTH is enabled */
|
||||||
int auth_enable;
|
int auth_enable;
|
||||||
|
|
||||||
|
/* Flag to indicate whether computing and verifying checksum
|
||||||
|
* is disabled. */
|
||||||
|
int checksum_disable;
|
||||||
} sctp_globals;
|
} sctp_globals;
|
||||||
|
|
||||||
#define sctp_rto_initial (sctp_globals.rto_initial)
|
#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_addip_noauth (sctp_globals.addip_noauth_enable)
|
||||||
#define sctp_prsctp_enable (sctp_globals.prsctp_enable)
|
#define sctp_prsctp_enable (sctp_globals.prsctp_enable)
|
||||||
#define sctp_auth_enable (sctp_globals.auth_enable)
|
#define sctp_auth_enable (sctp_globals.auth_enable)
|
||||||
|
#define sctp_checksum_disable (sctp_globals.checksum_disable)
|
||||||
|
|
||||||
/* SCTP Socket type: UDP or TCP style. */
|
/* SCTP Socket type: UDP or TCP style. */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@@ -142,7 +142,8 @@ int sctp_rcv(struct sk_buff *skb)
|
|||||||
__skb_pull(skb, skb_transport_offset(skb));
|
__skb_pull(skb, skb_transport_offset(skb));
|
||||||
if (skb->len < sizeof(struct sctphdr))
|
if (skb->len < sizeof(struct sctphdr))
|
||||||
goto discard_it;
|
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;
|
goto discard_it;
|
||||||
|
|
||||||
skb_pull(skb, sizeof(struct sctphdr));
|
skb_pull(skb, sizeof(struct sctphdr));
|
||||||
|
@@ -531,7 +531,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
|
|||||||
* Note: Adler-32 is no longer applicable, as has been replaced
|
* Note: Adler-32 is no longer applicable, as has been replaced
|
||||||
* by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>.
|
* 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_start_cksum((__u8 *)sh, cksum_buf_len);
|
||||||
crc32 = sctp_end_cksum(crc32);
|
crc32 = sctp_end_cksum(crc32);
|
||||||
} else
|
} else
|
||||||
|
@@ -1411,4 +1411,6 @@ MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-132");
|
|||||||
MODULE_ALIAS("net-pf-" __stringify(PF_INET6) "-proto-132");
|
MODULE_ALIAS("net-pf-" __stringify(PF_INET6) "-proto-132");
|
||||||
MODULE_AUTHOR("Linux Kernel SCTP developers <lksctp-developers@lists.sourceforge.net>");
|
MODULE_AUTHOR("Linux Kernel SCTP developers <lksctp-developers@lists.sourceforge.net>");
|
||||||
MODULE_DESCRIPTION("Support for the SCTP protocol (RFC2960)");
|
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");
|
MODULE_LICENSE("GPL");
|
||||||
|
Reference in New Issue
Block a user