1From: "kernel-team@fedoraproject.org" <kernel-team@fedoraproject.org>
2Date: Wed, 30 Jan 2013 10:55:31 -0500
3Subject: [PATCH] net: no_csums
4
5Bugzilla: N/A
6Upstream-status: Fedora mustard
7---
8diff --git a/drivers/net/tun.c b/drivers/net/tun.c
9index 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);
22diff --git a/net/core/datagram.c b/net/core/datagram.c
23index 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);
35diff --git a/net/core/dev.c b/net/core/dev.c
36index 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();
47diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
48index 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)))
60diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
61index 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) {
75diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
76index 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)
97diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
98index 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 	}
137diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
138index 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