diff options
Diffstat (limited to 'net/ipv4/af_inet.c')
-rw-r--r-- | net/ipv4/af_inet.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 3a3dad801354..7f03373b8c07 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -369,7 +369,6 @@ lookup_protocol: | |||
369 | sock_init_data(sock, sk); | 369 | sock_init_data(sock, sk); |
370 | 370 | ||
371 | sk->sk_destruct = inet_sock_destruct; | 371 | sk->sk_destruct = inet_sock_destruct; |
372 | sk->sk_family = PF_INET; | ||
373 | sk->sk_protocol = protocol; | 372 | sk->sk_protocol = protocol; |
374 | sk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; | 373 | sk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; |
375 | 374 | ||
@@ -1253,10 +1252,10 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, | |||
1253 | int proto; | 1252 | int proto; |
1254 | int id; | 1253 | int id; |
1255 | 1254 | ||
1256 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) | 1255 | iph = skb_gro_header(skb, sizeof(*iph)); |
1256 | if (unlikely(!iph)) | ||
1257 | goto out; | 1257 | goto out; |
1258 | 1258 | ||
1259 | iph = ip_hdr(skb); | ||
1260 | proto = iph->protocol & (MAX_INET_PROTOS - 1); | 1259 | proto = iph->protocol & (MAX_INET_PROTOS - 1); |
1261 | 1260 | ||
1262 | rcu_read_lock(); | 1261 | rcu_read_lock(); |
@@ -1264,13 +1263,13 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, | |||
1264 | if (!ops || !ops->gro_receive) | 1263 | if (!ops || !ops->gro_receive) |
1265 | goto out_unlock; | 1264 | goto out_unlock; |
1266 | 1265 | ||
1267 | if (iph->version != 4 || iph->ihl != 5) | 1266 | if (*(u8 *)iph != 0x45) |
1268 | goto out_unlock; | 1267 | goto out_unlock; |
1269 | 1268 | ||
1270 | if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl))) | 1269 | if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl))) |
1271 | goto out_unlock; | 1270 | goto out_unlock; |
1272 | 1271 | ||
1273 | flush = ntohs(iph->tot_len) != skb->len || | 1272 | flush = ntohs(iph->tot_len) != skb_gro_len(skb) || |
1274 | iph->frag_off != htons(IP_DF); | 1273 | iph->frag_off != htons(IP_DF); |
1275 | id = ntohs(iph->id); | 1274 | id = ntohs(iph->id); |
1276 | 1275 | ||
@@ -1282,24 +1281,25 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, | |||
1282 | 1281 | ||
1283 | iph2 = ip_hdr(p); | 1282 | iph2 = ip_hdr(p); |
1284 | 1283 | ||
1285 | if (iph->protocol != iph2->protocol || | 1284 | if ((iph->protocol ^ iph2->protocol) | |
1286 | iph->tos != iph2->tos || | 1285 | (iph->tos ^ iph2->tos) | |
1287 | memcmp(&iph->saddr, &iph2->saddr, 8)) { | 1286 | (iph->saddr ^ iph2->saddr) | |
1287 | (iph->daddr ^ iph2->daddr)) { | ||
1288 | NAPI_GRO_CB(p)->same_flow = 0; | 1288 | NAPI_GRO_CB(p)->same_flow = 0; |
1289 | continue; | 1289 | continue; |
1290 | } | 1290 | } |
1291 | 1291 | ||
1292 | /* All fields must match except length and checksum. */ | 1292 | /* All fields must match except length and checksum. */ |
1293 | NAPI_GRO_CB(p)->flush |= | 1293 | NAPI_GRO_CB(p)->flush |= |
1294 | memcmp(&iph->frag_off, &iph2->frag_off, 4) || | 1294 | (iph->ttl ^ iph2->ttl) | |
1295 | (u16)(ntohs(iph2->id) + NAPI_GRO_CB(p)->count) != id; | 1295 | ((u16)(ntohs(iph2->id) + NAPI_GRO_CB(p)->count) ^ id); |
1296 | 1296 | ||
1297 | NAPI_GRO_CB(p)->flush |= flush; | 1297 | NAPI_GRO_CB(p)->flush |= flush; |
1298 | } | 1298 | } |
1299 | 1299 | ||
1300 | NAPI_GRO_CB(skb)->flush |= flush; | 1300 | NAPI_GRO_CB(skb)->flush |= flush; |
1301 | __skb_pull(skb, sizeof(*iph)); | 1301 | skb_gro_pull(skb, sizeof(*iph)); |
1302 | skb_reset_transport_header(skb); | 1302 | skb_set_transport_header(skb, skb_gro_offset(skb)); |
1303 | 1303 | ||
1304 | pp = ops->gro_receive(head, skb); | 1304 | pp = ops->gro_receive(head, skb); |
1305 | 1305 | ||
@@ -1500,8 +1500,8 @@ static int ipv4_proc_init(void); | |||
1500 | * IP protocol layer initialiser | 1500 | * IP protocol layer initialiser |
1501 | */ | 1501 | */ |
1502 | 1502 | ||
1503 | static struct packet_type ip_packet_type = { | 1503 | static struct packet_type ip_packet_type __read_mostly = { |
1504 | .type = __constant_htons(ETH_P_IP), | 1504 | .type = cpu_to_be16(ETH_P_IP), |
1505 | .func = ip_rcv, | 1505 | .func = ip_rcv, |
1506 | .gso_send_check = inet_gso_send_check, | 1506 | .gso_send_check = inet_gso_send_check, |
1507 | .gso_segment = inet_gso_segment, | 1507 | .gso_segment = inet_gso_segment, |