skbuff: add stub to help computing crc32c on SCTP packets
sctp_compute_checksum requires crc32c symbol (provided by libcrc32c), so it can't be used in net core. Like it has been done previously with other symbols (e.g. ipv6_dst_lookup), introduce a stub struct skb_checksum_ops to allow computation of crc32c checksum in net core after sctp.ko (and thus libcrc32c) has been loaded. Signed-off-by: Davide Caratti <dcaratti@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6f5b24eed0
commit
9617813dba
3 changed files with 34 additions and 0 deletions
|
@ -3076,6 +3076,8 @@ struct skb_checksum_ops {
|
||||||
__wsum (*combine)(__wsum csum, __wsum csum2, int offset, int len);
|
__wsum (*combine)(__wsum csum, __wsum csum2, int offset, int len);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern const struct skb_checksum_ops *crc32c_csum_stub __read_mostly;
|
||||||
|
|
||||||
__wsum __skb_checksum(const struct sk_buff *skb, int offset, int len,
|
__wsum __skb_checksum(const struct sk_buff *skb, int offset, int len,
|
||||||
__wsum csum, const struct skb_checksum_ops *ops);
|
__wsum csum, const struct skb_checksum_ops *ops);
|
||||||
__wsum skb_checksum(const struct sk_buff *skb, int offset, int len,
|
__wsum skb_checksum(const struct sk_buff *skb, int offset, int len,
|
||||||
|
|
|
@ -2243,6 +2243,32 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(skb_copy_and_csum_bits);
|
EXPORT_SYMBOL(skb_copy_and_csum_bits);
|
||||||
|
|
||||||
|
static __wsum warn_crc32c_csum_update(const void *buff, int len, __wsum sum)
|
||||||
|
{
|
||||||
|
net_warn_ratelimited(
|
||||||
|
"%s: attempt to compute crc32c without libcrc32c.ko\n",
|
||||||
|
__func__);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __wsum warn_crc32c_csum_combine(__wsum csum, __wsum csum2,
|
||||||
|
int offset, int len)
|
||||||
|
{
|
||||||
|
net_warn_ratelimited(
|
||||||
|
"%s: attempt to compute crc32c without libcrc32c.ko\n",
|
||||||
|
__func__);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct skb_checksum_ops default_crc32c_ops = {
|
||||||
|
.update = warn_crc32c_csum_update,
|
||||||
|
.combine = warn_crc32c_csum_combine,
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct skb_checksum_ops *crc32c_csum_stub __read_mostly =
|
||||||
|
&default_crc32c_ops;
|
||||||
|
EXPORT_SYMBOL(crc32c_csum_stub);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* skb_zerocopy_headlen - Calculate headroom needed for skb_zerocopy()
|
* skb_zerocopy_headlen - Calculate headroom needed for skb_zerocopy()
|
||||||
* @from: source buffer
|
* @from: source buffer
|
||||||
|
|
|
@ -98,6 +98,11 @@ static const struct net_offload sctp6_offload = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct skb_checksum_ops crc32c_csum_ops = {
|
||||||
|
.update = sctp_csum_update,
|
||||||
|
.combine = sctp_csum_combine,
|
||||||
|
};
|
||||||
|
|
||||||
int __init sctp_offload_init(void)
|
int __init sctp_offload_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -110,6 +115,7 @@ int __init sctp_offload_init(void)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto ipv4;
|
goto ipv4;
|
||||||
|
|
||||||
|
crc32c_csum_stub = &crc32c_csum_ops;
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ipv4:
|
ipv4:
|
||||||
|
|
Loading…
Add table
Reference in a new issue