[NET]: Detect hardware rx checksum faults correctly
Here is the patch that introduces the generic skb_checksum_complete which also checks for hardware RX checksum faults. If that happens, it'll call netdev_rx_csum_fault which currently prints out a stack trace with the device name. In future it can turn off RX checksum. I've converted every spot under net/ that does RX checksum checks to use skb_checksum_complete or __skb_checksum_complete with the exceptions of: * Those places where checksums are done bit by bit. These will call netdev_rx_csum_fault directly. * The following have not been completely checked/converted: ipmr ip_vs netfilter dccp This patch is based on patches and suggestions from Stephen Hemminger and David S. Miller. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
1064e944d0
commit
fb286bb299
@@ -1236,8 +1236,7 @@ extern unsigned int datagram_poll(struct file *file, struct socket *sock,
|
||||
extern int skb_copy_datagram_iovec(const struct sk_buff *from,
|
||||
int offset, struct iovec *to,
|
||||
int size);
|
||||
extern int skb_copy_and_csum_datagram_iovec(const
|
||||
struct sk_buff *skb,
|
||||
extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
|
||||
int hlen,
|
||||
struct iovec *iov);
|
||||
extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb);
|
||||
@@ -1305,6 +1304,30 @@ static inline void skb_set_timestamp(struct sk_buff *skb, const struct timeval *
|
||||
|
||||
extern void __net_timestamp(struct sk_buff *skb);
|
||||
|
||||
extern unsigned int __skb_checksum_complete(struct sk_buff *skb);
|
||||
|
||||
/**
|
||||
* skb_checksum_complete - Calculate checksum of an entire packet
|
||||
* @skb: packet to process
|
||||
*
|
||||
* This function calculates the checksum over the entire packet plus
|
||||
* the value of skb->csum. The latter can be used to supply the
|
||||
* checksum of a pseudo header as used by TCP/UDP. It returns the
|
||||
* checksum.
|
||||
*
|
||||
* For protocols that contain complete checksums such as ICMP/TCP/UDP,
|
||||
* this function can be used to verify that checksum on received
|
||||
* packets. In that case the function should return zero if the
|
||||
* checksum is correct. In particular, this function will return zero
|
||||
* if skb->ip_summed is CHECKSUM_UNNECESSARY which indicates that the
|
||||
* hardware has already verified the correctness of the checksum.
|
||||
*/
|
||||
static inline unsigned int skb_checksum_complete(struct sk_buff *skb)
|
||||
{
|
||||
return skb->ip_summed != CHECKSUM_UNNECESSARY &&
|
||||
__skb_checksum_complete(skb);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NETFILTER
|
||||
static inline void nf_conntrack_put(struct nf_conntrack *nfct)
|
||||
{
|
||||
|
Reference in New Issue
Block a user