diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-10 13:30:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-10 13:30:29 -0400 |
commit | 26273939ace935dd7553b31d279eab30b40f7b9a (patch) | |
tree | 0730a25482747182b19983ffc450e40c3108f331 | |
parent | f213ad386bc5727a354e7098e34351e1b0a049a3 (diff) | |
parent | c27927e372f0785f3303e8fad94b85945e2c97b7 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) Fix handling of initial STATE message in TIPC, from Jon Paul Maloy.
2) Fix stats handling in bcm_sysport_get_stats(), from Florian
Fainelli.
3) Reject 16777215 VNI value in geneve_validate(), from Girish
Moodalbail.
4) Fix initial IGMP sysctl setting regression, from Nikolay Borisov.
5) Once a UFO fragmented frame is treated as UFO, we should continue
doing so. Likewise once a frame has been segmented, we should
continue doing that and not try to convert it to a UFO frame. From
Willem de Bruijn.
6) Test the AF_PACKET RX/TX ring pg_vec state under the socket lock to
prevent races. From Willem de Bruijn.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
packet: fix tp_reserve race in packet_set_ring
udp: consistently apply ufo or fragmentation
net: sched: set xt_tgchk_param par.nft_compat as 0 in ipt_init_target
igmp: Fix regression caused by igmp sysctl namespace code.
geneve: maximum value of VNI cannot be used
net: systemport: Fix software statistics for SYSTEMPORT Lite
tipc: remove premature ESTABLISH FSM event at link synchronization
-rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.c | 4 | ||||
-rw-r--r-- | drivers/net/geneve.c | 2 | ||||
-rw-r--r-- | net/ipv4/af_inet.c | 7 | ||||
-rw-r--r-- | net/ipv4/igmp.c | 6 | ||||
-rw-r--r-- | net/ipv4/ip_output.c | 8 | ||||
-rw-r--r-- | net/ipv4/udp.c | 2 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 7 | ||||
-rw-r--r-- | net/packet/af_packet.c | 13 | ||||
-rw-r--r-- | net/sched/act_ipt.c | 2 | ||||
-rw-r--r-- | net/tipc/node.c | 4 |
10 files changed, 33 insertions, 22 deletions
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 5333601f855f..dc3052751bc1 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c | |||
@@ -449,6 +449,10 @@ static void bcm_sysport_get_stats(struct net_device *dev, | |||
449 | p = (char *)&dev->stats; | 449 | p = (char *)&dev->stats; |
450 | else | 450 | else |
451 | p = (char *)priv; | 451 | p = (char *)priv; |
452 | |||
453 | if (priv->is_lite && !bcm_sysport_lite_stat_valid(s->type)) | ||
454 | continue; | ||
455 | |||
452 | p += s->stat_offset; | 456 | p += s->stat_offset; |
453 | data[j] = *(unsigned long *)p; | 457 | data[j] = *(unsigned long *)p; |
454 | j++; | 458 | j++; |
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index de8156c6b292..2bbda71818ad 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
@@ -1091,7 +1091,7 @@ static int geneve_validate(struct nlattr *tb[], struct nlattr *data[], | |||
1091 | if (data[IFLA_GENEVE_ID]) { | 1091 | if (data[IFLA_GENEVE_ID]) { |
1092 | __u32 vni = nla_get_u32(data[IFLA_GENEVE_ID]); | 1092 | __u32 vni = nla_get_u32(data[IFLA_GENEVE_ID]); |
1093 | 1093 | ||
1094 | if (vni >= GENEVE_VID_MASK) | 1094 | if (vni >= GENEVE_N_VID) |
1095 | return -ERANGE; | 1095 | return -ERANGE; |
1096 | } | 1096 | } |
1097 | 1097 | ||
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 76c2077c3f5b..2e548eca3489 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1731,6 +1731,13 @@ static __net_init int inet_init_net(struct net *net) | |||
1731 | net->ipv4.sysctl_ip_prot_sock = PROT_SOCK; | 1731 | net->ipv4.sysctl_ip_prot_sock = PROT_SOCK; |
1732 | #endif | 1732 | #endif |
1733 | 1733 | ||
1734 | /* Some igmp sysctl, whose values are always used */ | ||
1735 | net->ipv4.sysctl_igmp_max_memberships = 20; | ||
1736 | net->ipv4.sysctl_igmp_max_msf = 10; | ||
1737 | /* IGMP reports for link-local multicast groups are enabled by default */ | ||
1738 | net->ipv4.sysctl_igmp_llm_reports = 1; | ||
1739 | net->ipv4.sysctl_igmp_qrv = 2; | ||
1740 | |||
1734 | return 0; | 1741 | return 0; |
1735 | } | 1742 | } |
1736 | 1743 | ||
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 28f14afd0dd3..498706b072fb 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -2974,12 +2974,6 @@ static int __net_init igmp_net_init(struct net *net) | |||
2974 | goto out_sock; | 2974 | goto out_sock; |
2975 | } | 2975 | } |
2976 | 2976 | ||
2977 | /* Sysctl initialization */ | ||
2978 | net->ipv4.sysctl_igmp_max_memberships = 20; | ||
2979 | net->ipv4.sysctl_igmp_max_msf = 10; | ||
2980 | /* IGMP reports for link-local multicast groups are enabled by default */ | ||
2981 | net->ipv4.sysctl_igmp_llm_reports = 1; | ||
2982 | net->ipv4.sysctl_igmp_qrv = 2; | ||
2983 | return 0; | 2977 | return 0; |
2984 | 2978 | ||
2985 | out_sock: | 2979 | out_sock: |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 50c74cd890bc..e153c40c2436 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -965,11 +965,12 @@ static int __ip_append_data(struct sock *sk, | |||
965 | csummode = CHECKSUM_PARTIAL; | 965 | csummode = CHECKSUM_PARTIAL; |
966 | 966 | ||
967 | cork->length += length; | 967 | cork->length += length; |
968 | if ((((length + (skb ? skb->len : fragheaderlen)) > mtu) || | 968 | if ((skb && skb_is_gso(skb)) || |
969 | (skb && skb_is_gso(skb))) && | 969 | (((length + (skb ? skb->len : fragheaderlen)) > mtu) && |
970 | (skb_queue_len(queue) <= 1) && | ||
970 | (sk->sk_protocol == IPPROTO_UDP) && | 971 | (sk->sk_protocol == IPPROTO_UDP) && |
971 | (rt->dst.dev->features & NETIF_F_UFO) && !dst_xfrm(&rt->dst) && | 972 | (rt->dst.dev->features & NETIF_F_UFO) && !dst_xfrm(&rt->dst) && |
972 | (sk->sk_type == SOCK_DGRAM) && !sk->sk_no_check_tx) { | 973 | (sk->sk_type == SOCK_DGRAM) && !sk->sk_no_check_tx)) { |
973 | err = ip_ufo_append_data(sk, queue, getfrag, from, length, | 974 | err = ip_ufo_append_data(sk, queue, getfrag, from, length, |
974 | hh_len, fragheaderlen, transhdrlen, | 975 | hh_len, fragheaderlen, transhdrlen, |
975 | maxfraglen, flags); | 976 | maxfraglen, flags); |
@@ -1288,6 +1289,7 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page, | |||
1288 | return -EINVAL; | 1289 | return -EINVAL; |
1289 | 1290 | ||
1290 | if ((size + skb->len > mtu) && | 1291 | if ((size + skb->len > mtu) && |
1292 | (skb_queue_len(&sk->sk_write_queue) == 1) && | ||
1291 | (sk->sk_protocol == IPPROTO_UDP) && | 1293 | (sk->sk_protocol == IPPROTO_UDP) && |
1292 | (rt->dst.dev->features & NETIF_F_UFO)) { | 1294 | (rt->dst.dev->features & NETIF_F_UFO)) { |
1293 | if (skb->ip_summed != CHECKSUM_PARTIAL) | 1295 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index e6276fa3750b..a7c804f73990 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -802,7 +802,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4) | |||
802 | if (is_udplite) /* UDP-Lite */ | 802 | if (is_udplite) /* UDP-Lite */ |
803 | csum = udplite_csum(skb); | 803 | csum = udplite_csum(skb); |
804 | 804 | ||
805 | else if (sk->sk_no_check_tx) { /* UDP csum disabled */ | 805 | else if (sk->sk_no_check_tx && !skb_is_gso(skb)) { /* UDP csum off */ |
806 | 806 | ||
807 | skb->ip_summed = CHECKSUM_NONE; | 807 | skb->ip_summed = CHECKSUM_NONE; |
808 | goto send; | 808 | goto send; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 162efba0d0cd..2dfe50d8d609 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1381,11 +1381,12 @@ emsgsize: | |||
1381 | */ | 1381 | */ |
1382 | 1382 | ||
1383 | cork->length += length; | 1383 | cork->length += length; |
1384 | if ((((length + (skb ? skb->len : headersize)) > mtu) || | 1384 | if ((skb && skb_is_gso(skb)) || |
1385 | (skb && skb_is_gso(skb))) && | 1385 | (((length + (skb ? skb->len : headersize)) > mtu) && |
1386 | (skb_queue_len(queue) <= 1) && | ||
1386 | (sk->sk_protocol == IPPROTO_UDP) && | 1387 | (sk->sk_protocol == IPPROTO_UDP) && |
1387 | (rt->dst.dev->features & NETIF_F_UFO) && !dst_xfrm(&rt->dst) && | 1388 | (rt->dst.dev->features & NETIF_F_UFO) && !dst_xfrm(&rt->dst) && |
1388 | (sk->sk_type == SOCK_DGRAM) && !udp_get_no_check6_tx(sk)) { | 1389 | (sk->sk_type == SOCK_DGRAM) && !udp_get_no_check6_tx(sk))) { |
1389 | err = ip6_ufo_append_data(sk, queue, getfrag, from, length, | 1390 | err = ip6_ufo_append_data(sk, queue, getfrag, from, length, |
1390 | hh_len, fragheaderlen, exthdrlen, | 1391 | hh_len, fragheaderlen, exthdrlen, |
1391 | transhdrlen, mtu, flags, fl6); | 1392 | transhdrlen, mtu, flags, fl6); |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 0615c2a950fa..008a45ca3112 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -3700,14 +3700,19 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv | |||
3700 | 3700 | ||
3701 | if (optlen != sizeof(val)) | 3701 | if (optlen != sizeof(val)) |
3702 | return -EINVAL; | 3702 | return -EINVAL; |
3703 | if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) | ||
3704 | return -EBUSY; | ||
3705 | if (copy_from_user(&val, optval, sizeof(val))) | 3703 | if (copy_from_user(&val, optval, sizeof(val))) |
3706 | return -EFAULT; | 3704 | return -EFAULT; |
3707 | if (val > INT_MAX) | 3705 | if (val > INT_MAX) |
3708 | return -EINVAL; | 3706 | return -EINVAL; |
3709 | po->tp_reserve = val; | 3707 | lock_sock(sk); |
3710 | return 0; | 3708 | if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) { |
3709 | ret = -EBUSY; | ||
3710 | } else { | ||
3711 | po->tp_reserve = val; | ||
3712 | ret = 0; | ||
3713 | } | ||
3714 | release_sock(sk); | ||
3715 | return ret; | ||
3711 | } | 3716 | } |
3712 | case PACKET_LOSS: | 3717 | case PACKET_LOSS: |
3713 | { | 3718 | { |
diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c index 94ba5cfab860..d516ba8178b8 100644 --- a/net/sched/act_ipt.c +++ b/net/sched/act_ipt.c | |||
@@ -49,9 +49,9 @@ static int ipt_init_target(struct net *net, struct xt_entry_target *t, | |||
49 | return PTR_ERR(target); | 49 | return PTR_ERR(target); |
50 | 50 | ||
51 | t->u.kernel.target = target; | 51 | t->u.kernel.target = target; |
52 | memset(&par, 0, sizeof(par)); | ||
52 | par.net = net; | 53 | par.net = net; |
53 | par.table = table; | 54 | par.table = table; |
54 | par.entryinfo = NULL; | ||
55 | par.target = target; | 55 | par.target = target; |
56 | par.targinfo = t->data; | 56 | par.targinfo = t->data; |
57 | par.hook_mask = hook; | 57 | par.hook_mask = hook; |
diff --git a/net/tipc/node.c b/net/tipc/node.c index aeef8011ac7d..9b4dcb6a16b5 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -1455,10 +1455,8 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, | |||
1455 | /* Initiate synch mode if applicable */ | 1455 | /* Initiate synch mode if applicable */ |
1456 | if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG) && (oseqno == 1)) { | 1456 | if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG) && (oseqno == 1)) { |
1457 | syncpt = iseqno + exp_pkts - 1; | 1457 | syncpt = iseqno + exp_pkts - 1; |
1458 | if (!tipc_link_is_up(l)) { | 1458 | if (!tipc_link_is_up(l)) |
1459 | tipc_link_fsm_evt(l, LINK_ESTABLISH_EVT); | ||
1460 | __tipc_node_link_up(n, bearer_id, xmitq); | 1459 | __tipc_node_link_up(n, bearer_id, xmitq); |
1461 | } | ||
1462 | if (n->state == SELF_UP_PEER_UP) { | 1460 | if (n->state == SELF_UP_PEER_UP) { |
1463 | n->sync_point = syncpt; | 1461 | n->sync_point = syncpt; |
1464 | tipc_link_fsm_evt(l, LINK_SYNCH_BEGIN_EVT); | 1462 | tipc_link_fsm_evt(l, LINK_SYNCH_BEGIN_EVT); |