aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/af_inet.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/af_inet.c')
-rw-r--r--net/ipv4/af_inet.c47
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}
419EXPORT_SYMBOL(inet_release); 419EXPORT_SYMBOL(inet_release);
420 420
421/* It is off by default, see below. */
422int sysctl_ip_nonlocal_bind __read_mostly;
423EXPORT_SYMBOL(sysctl_ip_nonlocal_bind);
424
425int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) 421int 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}
1202EXPORT_SYMBOL(inet_sk_rebuild_header); 1198EXPORT_SYMBOL(inet_sk_rebuild_header);
1203 1199
1204static 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
1234out:
1235 return err;
1236}
1237
1238static struct sk_buff *inet_gso_segment(struct sk_buff *skb, 1200static 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);
1659static struct packet_offload ip_packet_offload __read_mostly = { 1624static 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
1669static const struct net_offload ipip_offload = { 1633static 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