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_IGMP = 4,
|
||||||
TCA_CSUM_UPDATE_FLAG_TCP = 8,
|
TCA_CSUM_UPDATE_FLAG_TCP = 8,
|
||||||
TCA_CSUM_UPDATE_FLAG_UDP = 16,
|
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 {
|
struct tc_csum {
|
||||||
|
|
|
@ -707,6 +707,7 @@ config NET_ACT_SKBEDIT
|
||||||
config NET_ACT_CSUM
|
config NET_ACT_CSUM
|
||||||
tristate "Checksum Updating"
|
tristate "Checksum Updating"
|
||||||
depends on NET_CLS_ACT && INET
|
depends on NET_CLS_ACT && INET
|
||||||
|
select LIBCRC32C
|
||||||
---help---
|
---help---
|
||||||
Say Y here to update some common checksum after some direct
|
Say Y here to update some common checksum after some direct
|
||||||
packet alterations.
|
packet alterations.
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <net/tcp.h>
|
#include <net/tcp.h>
|
||||||
#include <net/udp.h>
|
#include <net/udp.h>
|
||||||
#include <net/ip6_checksum.h>
|
#include <net/ip6_checksum.h>
|
||||||
|
#include <net/sctp/checksum.h>
|
||||||
|
|
||||||
#include <net/act_api.h>
|
#include <net/act_api.h>
|
||||||
|
|
||||||
|
@ -322,6 +323,25 @@ ignore_obscure_skb:
|
||||||
return 1;
|
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)
|
static int tcf_csum_ipv4(struct sk_buff *skb, u32 update_flags)
|
||||||
{
|
{
|
||||||
const struct iphdr *iph;
|
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))
|
ntohs(iph->tot_len), 1))
|
||||||
goto fail;
|
goto fail;
|
||||||
break;
|
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) {
|
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))
|
pl + sizeof(*ip6h), 1))
|
||||||
goto fail;
|
goto fail;
|
||||||
goto done;
|
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:
|
default:
|
||||||
goto ignore_skb;
|
goto ignore_skb;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue