diff options
Diffstat (limited to 'net/ipv4/af_inet.c')
-rw-r--r-- | net/ipv4/af_inet.c | 47 |
1 files changed, 6 insertions, 41 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index d156b3c5f363..92db7a69f2b9 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -418,10 +418,6 @@ int inet_release(struct socket *sock) | |||
418 | } | 418 | } |
419 | EXPORT_SYMBOL(inet_release); | 419 | EXPORT_SYMBOL(inet_release); |
420 | 420 | ||
421 | /* It is off by default, see below. */ | ||
422 | int sysctl_ip_nonlocal_bind __read_mostly; | ||
423 | EXPORT_SYMBOL(sysctl_ip_nonlocal_bind); | ||
424 | |||
425 | int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | 421 | int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
426 | { | 422 | { |
427 | struct sockaddr_in *addr = (struct sockaddr_in *)uaddr; | 423 | struct sockaddr_in *addr = (struct sockaddr_in *)uaddr; |
@@ -461,7 +457,7 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
461 | * is temporarily down) | 457 | * is temporarily down) |
462 | */ | 458 | */ |
463 | err = -EADDRNOTAVAIL; | 459 | err = -EADDRNOTAVAIL; |
464 | if (!sysctl_ip_nonlocal_bind && | 460 | if (!net->ipv4.sysctl_ip_nonlocal_bind && |
465 | !(inet->freebind || inet->transparent) && | 461 | !(inet->freebind || inet->transparent) && |
466 | addr->sin_addr.s_addr != htonl(INADDR_ANY) && | 462 | addr->sin_addr.s_addr != htonl(INADDR_ANY) && |
467 | chk_addr_ret != RTN_LOCAL && | 463 | chk_addr_ret != RTN_LOCAL && |
@@ -1201,40 +1197,6 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
1201 | } | 1197 | } |
1202 | EXPORT_SYMBOL(inet_sk_rebuild_header); | 1198 | EXPORT_SYMBOL(inet_sk_rebuild_header); |
1203 | 1199 | ||
1204 | static int inet_gso_send_check(struct sk_buff *skb) | ||
1205 | { | ||
1206 | const struct net_offload *ops; | ||
1207 | const struct iphdr *iph; | ||
1208 | int proto; | ||
1209 | int ihl; | ||
1210 | int err = -EINVAL; | ||
1211 | |||
1212 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) | ||
1213 | goto out; | ||
1214 | |||
1215 | iph = ip_hdr(skb); | ||
1216 | ihl = iph->ihl * 4; | ||
1217 | if (ihl < sizeof(*iph)) | ||
1218 | goto out; | ||
1219 | |||
1220 | proto = iph->protocol; | ||
1221 | |||
1222 | /* Warning: after this point, iph might be no longer valid */ | ||
1223 | if (unlikely(!pskb_may_pull(skb, ihl))) | ||
1224 | goto out; | ||
1225 | __skb_pull(skb, ihl); | ||
1226 | |||
1227 | skb_reset_transport_header(skb); | ||
1228 | err = -EPROTONOSUPPORT; | ||
1229 | |||
1230 | ops = rcu_dereference(inet_offloads[proto]); | ||
1231 | if (likely(ops && ops->callbacks.gso_send_check)) | ||
1232 | err = ops->callbacks.gso_send_check(skb); | ||
1233 | |||
1234 | out: | ||
1235 | return err; | ||
1236 | } | ||
1237 | |||
1238 | static struct sk_buff *inet_gso_segment(struct sk_buff *skb, | 1200 | static struct sk_buff *inet_gso_segment(struct sk_buff *skb, |
1239 | netdev_features_t features) | 1201 | netdev_features_t features) |
1240 | { | 1202 | { |
@@ -1407,6 +1369,9 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head, | |||
1407 | * immediately following this IP hdr. | 1369 | * immediately following this IP hdr. |
1408 | */ | 1370 | */ |
1409 | 1371 | ||
1372 | /* Note : No need to call skb_gro_postpull_rcsum() here, | ||
1373 | * as we already checked checksum over ipv4 header was 0 | ||
1374 | */ | ||
1410 | skb_gro_pull(skb, sizeof(*iph)); | 1375 | skb_gro_pull(skb, sizeof(*iph)); |
1411 | skb_set_transport_header(skb, skb_gro_offset(skb)); | 1376 | skb_set_transport_header(skb, skb_gro_offset(skb)); |
1412 | 1377 | ||
@@ -1659,7 +1624,6 @@ static int ipv4_proc_init(void); | |||
1659 | static struct packet_offload ip_packet_offload __read_mostly = { | 1624 | static struct packet_offload ip_packet_offload __read_mostly = { |
1660 | .type = cpu_to_be16(ETH_P_IP), | 1625 | .type = cpu_to_be16(ETH_P_IP), |
1661 | .callbacks = { | 1626 | .callbacks = { |
1662 | .gso_send_check = inet_gso_send_check, | ||
1663 | .gso_segment = inet_gso_segment, | 1627 | .gso_segment = inet_gso_segment, |
1664 | .gro_receive = inet_gro_receive, | 1628 | .gro_receive = inet_gro_receive, |
1665 | .gro_complete = inet_gro_complete, | 1629 | .gro_complete = inet_gro_complete, |
@@ -1668,8 +1632,9 @@ static struct packet_offload ip_packet_offload __read_mostly = { | |||
1668 | 1632 | ||
1669 | static const struct net_offload ipip_offload = { | 1633 | static const struct net_offload ipip_offload = { |
1670 | .callbacks = { | 1634 | .callbacks = { |
1671 | .gso_send_check = inet_gso_send_check, | ||
1672 | .gso_segment = inet_gso_segment, | 1635 | .gso_segment = inet_gso_segment, |
1636 | .gro_receive = inet_gro_receive, | ||
1637 | .gro_complete = inet_gro_complete, | ||
1673 | }, | 1638 | }, |
1674 | }; | 1639 | }; |
1675 | 1640 | ||