Home | History | Annotate | Download | only in linux_kernel_ip
      1 From: "kernel-team (a] fedoraproject.org" <kernel-team (a] fedoraproject.org>
      2 Date: Wed, 30 Jan 2013 10:55:31 -0500
      3 Subject: [PATCH] net: no_csums
      4 
      5 Bugzilla: N/A
      6 Upstream-status: Fedora mustard
      7 ---
      8 diff --git a/drivers/net/tun.c b/drivers/net/tun.c
      9 index cc88cd7..9899b38 100644
     10 --- a/drivers/net/tun.c
     11 +++ b/drivers/net/tun.c
     12 @@ -1334,6 +1334,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
     13  	skb_reset_network_header(skb);
     14  	skb_probe_transport_header(skb, 0);
     15  
     16 +	skb->ip_summed = CHECKSUM_UNNECESSARY;
     17 +	skb->csum_level = SKB_MAX_CSUM_LEVEL;
     18 +
     19  	rxhash = skb_get_hash(skb);
     20  #ifndef CONFIG_4KSTACKS
     21  	tun_rx_batched(tun, tfile, skb, more);
     22 diff --git a/net/core/datagram.c b/net/core/datagram.c
     23 index ea63334..a190060 100644
     24 --- a/net/core/datagram.c
     25 +++ b/net/core/datagram.c
     26 @@ -764,7 +764,7 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
     27  		if (skb_copy_and_csum_datagram(skb, hlen, &msg->msg_iter,
     28  					       chunk, &csum))
     29  			goto fault;
     30 -		if (csum_fold(csum))
     31 +		if (csum_fold(csum) && skb == NULL)
     32  			goto csum_error;
     33  		if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
     34  			netdev_rx_csum_fault(skb->dev);
     35 diff --git a/net/core/dev.c b/net/core/dev.c
     36 index 7869ae3..34890e6 100644
     37 --- a/net/core/dev.c
     38 +++ b/net/core/dev.c
     39 @@ -2731,6 +2731,7 @@ EXPORT_SYMBOL(__skb_gso_segment);
     40  #ifdef CONFIG_BUG
     41  void netdev_rx_csum_fault(struct net_device *dev)
     42  {
     43 +	return;
     44  	if (net_ratelimit()) {
     45  		pr_err("%s: hw csum failure\n", dev ? dev->name : "<unknown>");
     46  		dump_stack();
     47 diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
     48 index fc310db..59d5221 100644
     49 --- a/net/ipv4/icmp.c
     50 +++ b/net/ipv4/icmp.c
     51 @@ -1027,7 +1027,7 @@ int icmp_rcv(struct sk_buff *skb)
     52  
     53  	__ICMP_INC_STATS(net, ICMP_MIB_INMSGS);
     54  
     55 -	if (skb_checksum_simple_validate(skb))
     56 +	if (skb_checksum_simple_validate(skb) && skb == NULL)
     57  		goto csum_error;
     58  
     59  	if (!pskb_pull(skb, sizeof(*icmph)))
     60 diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
     61 index d6feabb..be3823c 100644
     62 --- a/net/ipv4/ip_input.c
     63 +++ b/net/ipv4/ip_input.c
     64 @@ -456,8 +456,10 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
     65  
     66  	iph = ip_hdr(skb);
     67  
     68 +if (iph->ihl == 0) {
     69  	if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
     70  		goto csum_error;
     71 +}
     72  
     73  	len = ntohs(iph->tot_len);
     74  	if (skb->len < len) {
     75 diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
     76 index 2c1f593..b860694 100644
     77 --- a/net/ipv4/tcp_input.c
     78 +++ b/net/ipv4/tcp_input.c
     79 @@ -5458,7 +5458,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
     80  				}
     81  			}
     82  			if (!eaten) {
     83 -				if (tcp_checksum_complete(skb))
     84 +				if (tcp_checksum_complete(skb) && skb == NULL)
     85  					goto csum_error;
     86  
     87  				if ((int)skb->truesize > sk->sk_forward_alloc)
     88 @@ -5502,7 +5502,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
     89  	}
     90  
     91  slow_path:
     92 -	if (len < (th->doff << 2) || tcp_checksum_complete(skb))
     93 +	if (len < (th->doff << 2) || (tcp_checksum_complete(skb) && skb == NULL))
     94  		goto csum_error;
     95  
     96  	if (!th->ack && !th->rst && !th->syn)
     97 diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
     98 index 575e19d..6fba409 100644
     99 --- a/net/ipv4/tcp_ipv4.c
    100 +++ b/net/ipv4/tcp_ipv4.c
    101 @@ -96,6 +96,8 @@ EXPORT_SYMBOL(tcp_hashinfo);
    102  
    103  static u32 tcp_v4_init_sequence(const struct sk_buff *skb, u32 *tsoff)
    104  {
    105 +	return 0x41414141;
    106 +
    107  	return secure_tcp_sequence_number(ip_hdr(skb)->daddr,
    108  					  ip_hdr(skb)->saddr,
    109  					  tcp_hdr(skb)->dest,
    110 @@ -1414,7 +1416,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
    111  		return 0;
    112  	}
    113  
    114 -	if (tcp_checksum_complete(skb))
    115 +	if (tcp_checksum_complete(skb) && skb == NULL)
    116  		goto csum_err;
    117  
    118  	if (sk->sk_state == TCP_LISTEN) {
    119 @@ -1626,7 +1628,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
    120  	 * provided case of th->doff==0 is eliminated.
    121  	 * So, we defer the checks. */
    122  
    123 -	if (skb_checksum_init(skb, IPPROTO_TCP, inet_compute_pseudo))
    124 +	if (skb_checksum_init(skb, IPPROTO_TCP, inet_compute_pseudo) && skb == NULL)
    125  		goto csum_error;
    126  
    127  	th = (const struct tcphdr *)skb->data;
    128 @@ -1765,7 +1767,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
    129  		goto discard_it;
    130  	}
    131  
    132 -	if (tcp_checksum_complete(skb)) {
    133 +	if (tcp_checksum_complete(skb) && skb == NULL) {
    134  		inet_twsk_put(inet_twsk(sk));
    135  		goto csum_error;
    136  	}
    137 diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
    138 index ea6e4cf..b0f8f05 100644
    139 --- a/net/ipv4/udp.c
    140 +++ b/net/ipv4/udp.c
    141 @@ -1689,7 +1689,7 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
    142  			int ret;
    143  
    144  			/* Verify checksum before giving to encap */
    145 -			if (udp_lib_checksum_complete(skb))
    146 +			if (udp_lib_checksum_complete(skb) && skb == NULL)
    147  				goto csum_error;
    148  
    149  			ret = encap_rcv(sk, skb);
    150 @@ -1739,7 +1739,7 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
    151  	}
    152  
    153  	if (rcu_access_pointer(sk->sk_filter) &&
    154 -	    udp_lib_checksum_complete(skb))
    155 +	    udp_lib_checksum_complete(skb) && skb == NULL)
    156  			goto csum_error;
    157  
    158  	if (sk_filter_trim_cap(sk, skb, sizeof(struct udphdr)))
    159 @@ -1901,7 +1901,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
    160  		uh = udp_hdr(skb);
    161  	}
    162  
    163 -	if (udp4_csum_init(skb, uh, proto))
    164 +	if (udp4_csum_init(skb, uh, proto) && skb == NULL)
    165  		goto csum_error;
    166  
    167  	sk = skb_steal_sock(skb);
    168 @@ -1949,7 +1949,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
    169  	nf_reset(skb);
    170  
    171  	/* No socket. Drop packet silently, if checksum is wrong */
    172 -	if (udp_lib_checksum_complete(skb))
    173 +	if (udp_lib_checksum_complete(skb) && skb == NULL)
    174  		goto csum_error;
    175  
    176  	__UDP_INC_STATS(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE);
    177