net/sched: act_csum: add support for SCTP checksum
Subsystems (3)
v2 cover net/sched: act_csum: add support for SCTP checksum
This series extends current act_csum functionality to allow computation of SCTP checksums. Patch 1 ensures LIBCRC32C will be selected if NET_ACT_CSUM is selected. Patch 2 extends act_csum to handle IPPROTO_SCTP protocol in IPv4/IPv6 header, and eventually compute the CRC32c value.
v2:
- style fix in tc_csum.h
- avoid nested if statement in act_csum.c
Davide Caratti (2):
net/sched: Kconfig: select LIBCRC32C if NET_ACT_CSUM is selected net/sched: act_csum: compute crc32c on SCTP packets
include/uapi/linux/tc_act/tc_csum.h | 3 ++- net/sched/Kconfig | 1 + net/sched/act_csum.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-)
Signature · 1 line
2.7.4
PATCH v2 1/2 net/sched: Kconfig: select LIBCRC32C if NET_ACT_CSUM is selected
LIBCRC32C is needed to compute crc32c on SCTP packets.
--- net/sched/Kconfig | 1 + 1 file changed, 1 insertion(+)
net/sched/Kconfig +1 -0
@@ -707,6 +707,7 @@ config NET_ACT_SKBEDIT config NET_ACT_CSUM tristate "Checksum Updating" depends on NET_CLS_ACT && INET + select LIBCRC32C ---help--- Say Y here to update some common checksum after some direct packet alterations.
Signature · 1 line
2.7.4
PATCH v2 2/2 net/sched: act_csum: compute crc32c on SCTP packets
In reply to Davide Carattimodify act_csum to compute crc32c on IPv4/IPv6 packets having SCTP in their payload, and extend UAPI definitions accordingly.
--- include/uapi/linux/tc_act/tc_csum.h | 3 ++- net/sched/act_csum.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-)
include/uapi/linux/tc_act/tc_csum.h +2 -1
@@ -21,7 +21,8 @@ enum {TCA_CSUM_UPDATE_FLAG_IGMP =4 ,TCA_CSUM_UPDATE_FLAG_TCP =8 ,TCA_CSUM_UPDATE_FLAG_UDP =16 , -TCA_CSUM_UPDATE_FLAG_UDPLITE =32 +TCA_CSUM_UPDATE_FLAG_UDPLITE =32 , + TCA_CSUM_UPDATE_FLAG_SCTP = 64, }; struct tc_csum {
net/sched/act_csum.c +30 -0
@@ -30,6 +30,7 @@#include <net/tcp.h> #include <net/udp.h> #include <net/ip6_checksum.h> +#include <net/sctp/checksum.h> #include <net/act_api.h>
@@ -322,6 +323,25 @@ static int tcf_csum_ipv6_udp(struct sk_buff *skb, unsigned int ihl,return 1 ; } +static int tcf_csum_sctp (struct sk_buff *skb,unsigned int ihl, +unsigned int ipl) +{ +struct sctphdr *sctph; + +if (skb_is_gso (skb) &&skb_shinfo (skb)->gso_type &SKB_GSO_SCTP ) +return 1 ; + + sctph =tcf_csum_skb_nextlayer (skb, ihl, ipl,sizeof (*sctph)); +if (!sctph) +return 0 ; + + sctph->checksum =sctp_compute_cksum (skb, +skb_network_offset (skb) + ihl); + skb->ip_summed =CHECKSUM_NONE ; + +return 1 ; +} +static int tcf_csum_ipv4 (struct sk_buff *skb,u32 update_flags) {const struct iphdr *iph;
@@ -365,6 +385,11 @@ static int tcf_csum_ipv4(struct sk_buff *skb, u32 update_flags) ntohs(iph->tot_len), 1)) goto fail;break ; +case IPPROTO_SCTP : +if ((update_flags &TCA_CSUM_UPDATE_FLAG_SCTP ) && + !tcf_csum_sctp (skb, iph->ihl *4 ,ntohs (iph->tot_len))) + goto fail; +break ; }if (update_flags &TCA_CSUM_UPDATE_FLAG_IPV4HDR ) {
@@ -481,6 +506,11 @@ static int tcf_csum_ipv6(struct sk_buff *skb, u32 update_flags) pl + sizeof(*ip6h), 1)) goto fail; goto done; +case IPPROTO_SCTP : +if ((update_flags &TCA_CSUM_UPDATE_FLAG_SCTP ) && + !tcf_csum_sctp (skb, hl, pl +sizeof (*ip6h))) + goto fail; + goto done;default : goto ignore_skb; }
Signature · 1 line
2.7.4
David Miller
maintainerFrom: Davide Caratti <[email protected]>
Date: Mon, 9 Jan 2017 11:24:19 +0100
Quoted 8 lines
This series extends current
act_csumfunctionality to allow computation of SCTP checksums. Patch 1 ensures LIBCRC32C will be selected ifNET_ACT_CSUMis selected. Patch 2 extendsact_csumto handleIPPROTO_SCTPprotocol in IPv4/IPv6 header, and eventually compute the CRC32c value.v2:
- style fix intc_csum.h
- avoid nested if statement inact_csum.c
Series applied, thanks.