aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-11-19 18:50:47 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-11-19 18:50:47 -0500
commit1ee2dcc2245340cf4ac94b99c4d00efbeba61824 (patch)
tree5339e55add987379525177011dde6e3756b1430c /net/ipv4
parent4457e6f6c9f6052cd5f44a79037108b5ddeb0ce7 (diff)
parent091e0662ee2c37867ad918ce7b6ddd17f0e090e2 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: "Mostly these are fixes for fallout due to merge window changes, as well as cures for problems that have been with us for a much longer period of time" 1) Johannes Berg noticed two major deficiencies in our genetlink registration. Some genetlink protocols we passing in constant counts for their ops array rather than something like ARRAY_SIZE(ops) or similar. Also, some genetlink protocols were using fixed IDs for their multicast groups. We have to retain these fixed IDs to keep existing userland tools working, but reserve them so that other multicast groups used by other protocols can not possibly conflict. In dealing with these two problems, we actually now use less state management for genetlink operations and multicast groups. 2) When configuring interface hardware timestamping, fix several drivers that simply do not validate that the hwtstamp_config value is one the driver actually supports. From Ben Hutchings. 3) Invalid memory references in mwifiex driver, from Amitkumar Karwar. 4) In dev_forward_skb(), set the skb->protocol in the right order relative to skb_scrub_packet(). From Alexei Starovoitov. 5) Bridge erroneously fails to use the proper wrapper functions to make calls to netdev_ops->ndo_vlan_rx_{add,kill}_vid. Fix from Toshiaki Makita. 6) When detaching a bridge port, make sure to flush all VLAN IDs to prevent them from leaking, also from Toshiaki Makita. 7) Put in a compromise for TCP Small Queues so that deep queued devices that delay TX reclaim non-trivially don't have such a performance decrease. One particularly problematic area is 802.11 AMPDU in wireless. From Eric Dumazet. 8) Fix crashes in tcp_fastopen_cache_get(), we can see NULL socket dsts here. Fix from Eric Dumzaet, reported by Dave Jones. 9) Fix use after free in ipv6 SIT driver, from Willem de Bruijn. 10) When computing mergeable buffer sizes, virtio-net fails to take the virtio-net header into account. From Michael Dalton. 11) Fix seqlock deadlock in ip4_datagram_connect() wrt. statistic bumping, this one has been with us for a while. From Eric Dumazet. 12) Fix NULL deref in the new TIPC fragmentation handling, from Erik Hugne. 13) 6lowpan bit used for traffic classification was wrong, from Jukka Rissanen. 14) macvlan has the same issue as normal vlans did wrt. propagating LRO disabling down to the real device, fix it the same way. From Michal Kubecek. 15) CPSW driver needs to soft reset all slaves during suspend, from Daniel Mack. 16) Fix small frame pacing in FQ packet scheduler, from Eric Dumazet. 17) The xen-netfront RX buffer refill timer isn't properly scheduled on partial RX allocation success, from Ma JieYue. 18) When ipv6 ping protocol support was added, the AF_INET6 protocol initialization cleanup path on failure was borked a little. Fix from Vlad Yasevich. 19) If a socket disconnects during a read/recvmsg/recvfrom/etc that blocks we can do the wrong thing with the msg_name we write back to userspace. From Hannes Frederic Sowa. There is another fix in the works from Hannes which will prevent future problems of this nature. 20) Fix route leak in VTI tunnel transmit, from Fan Du. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (106 commits) genetlink: make multicast groups const, prevent abuse genetlink: pass family to functions using groups genetlink: add and use genl_set_err() genetlink: remove family pointer from genl_multicast_group genetlink: remove genl_unregister_mc_group() hsr: don't call genl_unregister_mc_group() quota/genetlink: use proper genetlink multicast APIs drop_monitor/genetlink: use proper genetlink multicast APIs genetlink: only pass array to genl_register_family_with_ops() tcp: don't update snd_nxt, when a socket is switched from repair mode atm: idt77252: fix dev refcnt leak xfrm: Release dst if this dst is improper for vti tunnel netlink: fix documentation typo in netlink_set_err() be2net: Delete secondary unicast MAC addresses during be_close be2net: Fix unconditional enabling of Rx interface options net, virtio_net: replace the magic value ping: prevent NULL pointer dereference on write to msg_name bnx2x: Prevent "timeout waiting for state X" bnx2x: prevent CFC attention bnx2x: Prevent panic during DMAE timeout ...
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/datagram.c2
-rw-r--r--net/ipv4/ip_tunnel.c4
-rw-r--r--net/ipv4/ip_vti.c1
-rw-r--r--net/ipv4/ping.c49
-rw-r--r--net/ipv4/raw.c4
-rw-r--r--net/ipv4/tcp.c6
-rw-r--r--net/ipv4/tcp_metrics.c10
-rw-r--r--net/ipv4/tcp_output.c7
-rw-r--r--net/ipv4/udp.c7
9 files changed, 41 insertions, 49 deletions
diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c
index b28e863fe0a7..19e36376d2a0 100644
--- a/net/ipv4/datagram.c
+++ b/net/ipv4/datagram.c
@@ -57,7 +57,7 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
57 if (IS_ERR(rt)) { 57 if (IS_ERR(rt)) {
58 err = PTR_ERR(rt); 58 err = PTR_ERR(rt);
59 if (err == -ENETUNREACH) 59 if (err == -ENETUNREACH)
60 IP_INC_STATS_BH(sock_net(sk), IPSTATS_MIB_OUTNOROUTES); 60 IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
61 goto out; 61 goto out;
62 } 62 }
63 63
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index caf01176a5e4..90ff9570d7d4 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -454,6 +454,8 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
454 tstats->rx_bytes += skb->len; 454 tstats->rx_bytes += skb->len;
455 u64_stats_update_end(&tstats->syncp); 455 u64_stats_update_end(&tstats->syncp);
456 456
457 skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev)));
458
457 if (tunnel->dev->type == ARPHRD_ETHER) { 459 if (tunnel->dev->type == ARPHRD_ETHER) {
458 skb->protocol = eth_type_trans(skb, tunnel->dev); 460 skb->protocol = eth_type_trans(skb, tunnel->dev);
459 skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); 461 skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
@@ -461,8 +463,6 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
461 skb->dev = tunnel->dev; 463 skb->dev = tunnel->dev;
462 } 464 }
463 465
464 skb_scrub_packet(skb, !net_eq(tunnel->net, dev_net(tunnel->dev)));
465
466 gro_cells_receive(&tunnel->gro_cells, skb); 466 gro_cells_receive(&tunnel->gro_cells, skb);
467 return 0; 467 return 0;
468 468
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c
index 5d9c845d288a..52b802a0cd8c 100644
--- a/net/ipv4/ip_vti.c
+++ b/net/ipv4/ip_vti.c
@@ -126,6 +126,7 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
126 if (!rt->dst.xfrm || 126 if (!rt->dst.xfrm ||
127 rt->dst.xfrm->props.mode != XFRM_MODE_TUNNEL) { 127 rt->dst.xfrm->props.mode != XFRM_MODE_TUNNEL) {
128 dev->stats.tx_carrier_errors++; 128 dev->stats.tx_carrier_errors++;
129 ip_rt_put(rt);
129 goto tx_error_icmp; 130 goto tx_error_icmp;
130 } 131 }
131 tdev = rt->dst.dev; 132 tdev = rt->dst.dev;
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index cbc85f660d54..876c6ca2d8f9 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -830,8 +830,6 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
830{ 830{
831 struct inet_sock *isk = inet_sk(sk); 831 struct inet_sock *isk = inet_sk(sk);
832 int family = sk->sk_family; 832 int family = sk->sk_family;
833 struct sockaddr_in *sin;
834 struct sockaddr_in6 *sin6;
835 struct sk_buff *skb; 833 struct sk_buff *skb;
836 int copied, err; 834 int copied, err;
837 835
@@ -841,13 +839,6 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
841 if (flags & MSG_OOB) 839 if (flags & MSG_OOB)
842 goto out; 840 goto out;
843 841
844 if (addr_len) {
845 if (family == AF_INET)
846 *addr_len = sizeof(*sin);
847 else if (family == AF_INET6 && addr_len)
848 *addr_len = sizeof(*sin6);
849 }
850
851 if (flags & MSG_ERRQUEUE) { 842 if (flags & MSG_ERRQUEUE) {
852 if (family == AF_INET) { 843 if (family == AF_INET) {
853 return ip_recv_error(sk, msg, len); 844 return ip_recv_error(sk, msg, len);
@@ -877,11 +868,15 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
877 868
878 /* Copy the address and add cmsg data. */ 869 /* Copy the address and add cmsg data. */
879 if (family == AF_INET) { 870 if (family == AF_INET) {
880 sin = (struct sockaddr_in *) msg->msg_name; 871 struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
881 sin->sin_family = AF_INET; 872
882 sin->sin_port = 0 /* skb->h.uh->source */; 873 if (sin) {
883 sin->sin_addr.s_addr = ip_hdr(skb)->saddr; 874 sin->sin_family = AF_INET;
884 memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); 875 sin->sin_port = 0 /* skb->h.uh->source */;
876 sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
877 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
878 *addr_len = sizeof(*sin);
879 }
885 880
886 if (isk->cmsg_flags) 881 if (isk->cmsg_flags)
887 ip_cmsg_recv(msg, skb); 882 ip_cmsg_recv(msg, skb);
@@ -890,17 +885,21 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
890 } else if (family == AF_INET6) { 885 } else if (family == AF_INET6) {
891 struct ipv6_pinfo *np = inet6_sk(sk); 886 struct ipv6_pinfo *np = inet6_sk(sk);
892 struct ipv6hdr *ip6 = ipv6_hdr(skb); 887 struct ipv6hdr *ip6 = ipv6_hdr(skb);
893 sin6 = (struct sockaddr_in6 *) msg->msg_name; 888 struct sockaddr_in6 *sin6 =
894 sin6->sin6_family = AF_INET6; 889 (struct sockaddr_in6 *)msg->msg_name;
895 sin6->sin6_port = 0; 890
896 sin6->sin6_addr = ip6->saddr; 891 if (sin6) {
897 892 sin6->sin6_family = AF_INET6;
898 sin6->sin6_flowinfo = 0; 893 sin6->sin6_port = 0;
899 if (np->sndflow) 894 sin6->sin6_addr = ip6->saddr;
900 sin6->sin6_flowinfo = ip6_flowinfo(ip6); 895 sin6->sin6_flowinfo = 0;
901 896 if (np->sndflow)
902 sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr, 897 sin6->sin6_flowinfo = ip6_flowinfo(ip6);
903 IP6CB(skb)->iif); 898 sin6->sin6_scope_id =
899 ipv6_iface_scope_id(&sin6->sin6_addr,
900 IP6CB(skb)->iif);
901 *addr_len = sizeof(*sin6);
902 }
904 903
905 if (inet6_sk(sk)->rxopt.all) 904 if (inet6_sk(sk)->rxopt.all)
906 pingv6_ops.ip6_datagram_recv_ctl(sk, msg, skb); 905 pingv6_ops.ip6_datagram_recv_ctl(sk, msg, skb);
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 41e1d2845c8f..5cb8ddb505ee 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -696,9 +696,6 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
696 if (flags & MSG_OOB) 696 if (flags & MSG_OOB)
697 goto out; 697 goto out;
698 698
699 if (addr_len)
700 *addr_len = sizeof(*sin);
701
702 if (flags & MSG_ERRQUEUE) { 699 if (flags & MSG_ERRQUEUE) {
703 err = ip_recv_error(sk, msg, len); 700 err = ip_recv_error(sk, msg, len);
704 goto out; 701 goto out;
@@ -726,6 +723,7 @@ static int raw_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
726 sin->sin_addr.s_addr = ip_hdr(skb)->saddr; 723 sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
727 sin->sin_port = 0; 724 sin->sin_port = 0;
728 memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); 725 memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
726 *addr_len = sizeof(*sin);
729 } 727 }
730 if (inet->cmsg_flags) 728 if (inet->cmsg_flags)
731 ip_cmsg_recv(msg, skb); 729 ip_cmsg_recv(msg, skb);
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 8e8529d3c8c9..3dc0c6cf02a8 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -808,12 +808,6 @@ static unsigned int tcp_xmit_size_goal(struct sock *sk, u32 mss_now,
808 xmit_size_goal = min_t(u32, gso_size, 808 xmit_size_goal = min_t(u32, gso_size,
809 sk->sk_gso_max_size - 1 - hlen); 809 sk->sk_gso_max_size - 1 - hlen);
810 810
811 /* TSQ : try to have at least two segments in flight
812 * (one in NIC TX ring, another in Qdisc)
813 */
814 xmit_size_goal = min_t(u32, xmit_size_goal,
815 sysctl_tcp_limit_output_bytes >> 1);
816
817 xmit_size_goal = tcp_bound_to_half_wnd(tp, xmit_size_goal); 811 xmit_size_goal = tcp_bound_to_half_wnd(tp, xmit_size_goal);
818 812
819 /* We try hard to avoid divides here */ 813 /* We try hard to avoid divides here */
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c
index 2ab09cbae74d..06493736fbc8 100644
--- a/net/ipv4/tcp_metrics.c
+++ b/net/ipv4/tcp_metrics.c
@@ -663,10 +663,13 @@ void tcp_fastopen_cache_get(struct sock *sk, u16 *mss,
663void tcp_fastopen_cache_set(struct sock *sk, u16 mss, 663void tcp_fastopen_cache_set(struct sock *sk, u16 mss,
664 struct tcp_fastopen_cookie *cookie, bool syn_lost) 664 struct tcp_fastopen_cookie *cookie, bool syn_lost)
665{ 665{
666 struct dst_entry *dst = __sk_dst_get(sk);
666 struct tcp_metrics_block *tm; 667 struct tcp_metrics_block *tm;
667 668
669 if (!dst)
670 return;
668 rcu_read_lock(); 671 rcu_read_lock();
669 tm = tcp_get_metrics(sk, __sk_dst_get(sk), true); 672 tm = tcp_get_metrics(sk, dst, true);
670 if (tm) { 673 if (tm) {
671 struct tcp_fastopen_metrics *tfom = &tm->tcpm_fastopen; 674 struct tcp_fastopen_metrics *tfom = &tm->tcpm_fastopen;
672 675
@@ -988,7 +991,7 @@ static int tcp_metrics_nl_cmd_del(struct sk_buff *skb, struct genl_info *info)
988 return 0; 991 return 0;
989} 992}
990 993
991static struct genl_ops tcp_metrics_nl_ops[] = { 994static const struct genl_ops tcp_metrics_nl_ops[] = {
992 { 995 {
993 .cmd = TCP_METRICS_CMD_GET, 996 .cmd = TCP_METRICS_CMD_GET,
994 .doit = tcp_metrics_nl_cmd_get, 997 .doit = tcp_metrics_nl_cmd_get,
@@ -1079,8 +1082,7 @@ void __init tcp_metrics_init(void)
1079 if (ret < 0) 1082 if (ret < 0)
1080 goto cleanup; 1083 goto cleanup;
1081 ret = genl_register_family_with_ops(&tcp_metrics_nl_family, 1084 ret = genl_register_family_with_ops(&tcp_metrics_nl_family,
1082 tcp_metrics_nl_ops, 1085 tcp_metrics_nl_ops);
1083 ARRAY_SIZE(tcp_metrics_nl_ops));
1084 if (ret < 0) 1086 if (ret < 0)
1085 goto cleanup_subsys; 1087 goto cleanup_subsys;
1086 return; 1088 return;
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 672854664ff5..7820f3a7dd70 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1875,8 +1875,12 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,
1875 * - better RTT estimation and ACK scheduling 1875 * - better RTT estimation and ACK scheduling
1876 * - faster recovery 1876 * - faster recovery
1877 * - high rates 1877 * - high rates
1878 * Alas, some drivers / subsystems require a fair amount
1879 * of queued bytes to ensure line rate.
1880 * One example is wifi aggregation (802.11 AMPDU)
1878 */ 1881 */
1879 limit = max(skb->truesize, sk->sk_pacing_rate >> 10); 1882 limit = max_t(unsigned int, sysctl_tcp_limit_output_bytes,
1883 sk->sk_pacing_rate >> 10);
1880 1884
1881 if (atomic_read(&sk->sk_wmem_alloc) > limit) { 1885 if (atomic_read(&sk->sk_wmem_alloc) > limit) {
1882 set_bit(TSQ_THROTTLED, &tp->tsq_flags); 1886 set_bit(TSQ_THROTTLED, &tp->tsq_flags);
@@ -3093,7 +3097,6 @@ void tcp_send_window_probe(struct sock *sk)
3093{ 3097{
3094 if (sk->sk_state == TCP_ESTABLISHED) { 3098 if (sk->sk_state == TCP_ESTABLISHED) {
3095 tcp_sk(sk)->snd_wl1 = tcp_sk(sk)->rcv_nxt - 1; 3099 tcp_sk(sk)->snd_wl1 = tcp_sk(sk)->rcv_nxt - 1;
3096 tcp_sk(sk)->snd_nxt = tcp_sk(sk)->write_seq;
3097 tcp_xmit_probe_skb(sk, 0); 3100 tcp_xmit_probe_skb(sk, 0);
3098 } 3101 }
3099} 3102}
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index de86e5bc4462..5944d7d668dd 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1235,12 +1235,6 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
1235 int is_udplite = IS_UDPLITE(sk); 1235 int is_udplite = IS_UDPLITE(sk);
1236 bool slow; 1236 bool slow;
1237 1237
1238 /*
1239 * Check any passed addresses
1240 */
1241 if (addr_len)
1242 *addr_len = sizeof(*sin);
1243
1244 if (flags & MSG_ERRQUEUE) 1238 if (flags & MSG_ERRQUEUE)
1245 return ip_recv_error(sk, msg, len); 1239 return ip_recv_error(sk, msg, len);
1246 1240
@@ -1302,6 +1296,7 @@ try_again:
1302 sin->sin_port = udp_hdr(skb)->source; 1296 sin->sin_port = udp_hdr(skb)->source;
1303 sin->sin_addr.s_addr = ip_hdr(skb)->saddr; 1297 sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
1304 memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); 1298 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
1299 *addr_len = sizeof(*sin);
1305 } 1300 }
1306 if (inet->cmsg_flags) 1301 if (inet->cmsg_flags)
1307 ip_cmsg_recv(msg, skb); 1302 ip_cmsg_recv(msg, skb);