Merge branch 'act_csum-sctp'
Davide Caratti says: ==================== 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 ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
512656008a
3 changed files with 33 additions and 1 deletions
|
@ -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 {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 @@ ignore_obscure_skb:
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue