diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 634dabb558fd..4d5021e1929b 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | * request_sock handling and moved | 39 | * request_sock handling and moved |
| 40 | * most of it into the af independent code. | 40 | * most of it into the af independent code. |
| 41 | * Added tail drop and some other bugfixes. | 41 | * Added tail drop and some other bugfixes. |
| 42 | * Added new listen sematics. | 42 | * Added new listen semantics. |
| 43 | * Mike McLagan : Routing by source | 43 | * Mike McLagan : Routing by source |
| 44 | * Juan Jose Ciarlante: ip_dynaddr bits | 44 | * Juan Jose Ciarlante: ip_dynaddr bits |
| 45 | * Andi Kleen: various fixes. | 45 | * Andi Kleen: various fixes. |
| @@ -1110,24 +1110,18 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb) | |||
| 1110 | static int tcp_v4_checksum_init(struct sk_buff *skb) | 1110 | static int tcp_v4_checksum_init(struct sk_buff *skb) |
| 1111 | { | 1111 | { |
| 1112 | if (skb->ip_summed == CHECKSUM_HW) { | 1112 | if (skb->ip_summed == CHECKSUM_HW) { |
| 1113 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 1114 | if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr, | 1113 | if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr, |
| 1115 | skb->nh.iph->daddr, skb->csum)) | 1114 | skb->nh.iph->daddr, skb->csum)) { |
| 1115 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 1116 | return 0; | 1116 | return 0; |
| 1117 | 1117 | } | |
| 1118 | LIMIT_NETDEBUG(KERN_DEBUG "hw tcp v4 csum failed\n"); | ||
| 1119 | skb->ip_summed = CHECKSUM_NONE; | ||
| 1120 | } | 1118 | } |
| 1119 | |||
| 1120 | skb->csum = csum_tcpudp_nofold(skb->nh.iph->saddr, skb->nh.iph->daddr, | ||
| 1121 | skb->len, IPPROTO_TCP, 0); | ||
| 1122 | |||
| 1121 | if (skb->len <= 76) { | 1123 | if (skb->len <= 76) { |
| 1122 | if (tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr, | 1124 | return __skb_checksum_complete(skb); |
| 1123 | skb->nh.iph->daddr, | ||
| 1124 | skb_checksum(skb, 0, skb->len, 0))) | ||
| 1125 | return -1; | ||
| 1126 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
| 1127 | } else { | ||
| 1128 | skb->csum = ~tcp_v4_check(skb->h.th, skb->len, | ||
| 1129 | skb->nh.iph->saddr, | ||
| 1130 | skb->nh.iph->daddr, 0); | ||
| 1131 | } | 1125 | } |
| 1132 | return 0; | 1126 | return 0; |
| 1133 | } | 1127 | } |
| @@ -1216,10 +1210,10 @@ int tcp_v4_rcv(struct sk_buff *skb) | |||
| 1216 | 1210 | ||
| 1217 | /* An explanation is required here, I think. | 1211 | /* An explanation is required here, I think. |
| 1218 | * Packet length and doff are validated by header prediction, | 1212 | * Packet length and doff are validated by header prediction, |
| 1219 | * provided case of th->doff==0 is elimineted. | 1213 | * provided case of th->doff==0 is eliminated. |
| 1220 | * So, we defer the checks. */ | 1214 | * So, we defer the checks. */ |
| 1221 | if ((skb->ip_summed != CHECKSUM_UNNECESSARY && | 1215 | if ((skb->ip_summed != CHECKSUM_UNNECESSARY && |
| 1222 | tcp_v4_checksum_init(skb) < 0)) | 1216 | tcp_v4_checksum_init(skb))) |
| 1223 | goto bad_packet; | 1217 | goto bad_packet; |
| 1224 | 1218 | ||
| 1225 | th = skb->h.th; | 1219 | th = skb->h.th; |
