Skip to content

Commit 0e91178

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: "Just a couple more stragglers, I really hope this is it. 1) Don't let frags slip down into the GRO segmentation handlers, from Steffen Klassert. 2) Truesize under-estimation triggers warnings in TCP over loopback with socket filters, 2 part fix from Eric Dumazet. 3) Fix undesirable reset of bonding MTU to ETH_HLEN on slave removal, from Paolo Abeni. 4) If we flush the XFRM policy after garbage collection, it doesn't work because stray entries can be created afterwards. Fix from Xin Long. 5) Hung socket connection fixes in TIPC from Parthasarathy Bhuvaragan. 6) Fix GRO regression with IPSEC when netfilter is disabled, from Sabrina Dubroca. 7) Fix cpsw driver Kconfig dependency regression, from Arnd Bergmann" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: net: hso: register netdev later to avoid a race condition net: adjust skb->truesize in ___pskb_trim() tcp: do not underestimate skb->truesize in tcp_trim_head() bonding: avoid defaulting hard_header_len to ETH_HLEN on slave removal ipv4: Don't pass IP fragments to upper layer GRO handlers. cpsw/netcp: refine cpts dependency tipc: close the connection if protocol messages contain errors tipc: improve error validations for sockets in CONNECTING state tipc: Fix missing connection request handling xfrm: fix GRO for !CONFIG_NETFILTER xfrm: do the garbage collection after flushing policy
2 parents affb852 + 4c761da commit 0e91178

File tree

9 files changed

+64
-22
lines changed

9 files changed

+64
-22
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1104,11 +1104,11 @@ static void bond_compute_features(struct bonding *bond)
11041104
gso_max_size = min(gso_max_size, slave->dev->gso_max_size);
11051105
gso_max_segs = min(gso_max_segs, slave->dev->gso_max_segs);
11061106
}
1107+
bond_dev->hard_header_len = max_hard_header_len;
11071108

11081109
done:
11091110
bond_dev->vlan_features = vlan_features;
11101111
bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL;
1111-
bond_dev->hard_header_len = max_hard_header_len;
11121112
bond_dev->gso_max_segs = gso_max_segs;
11131113
netif_set_gso_max_size(bond_dev, gso_max_size);
11141114

drivers/net/ethernet/ti/Kconfig

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ config TI_CPSW
7676
config TI_CPTS
7777
bool "TI Common Platform Time Sync (CPTS) Support"
7878
depends on TI_CPSW || TI_KEYSTONE_NETCP
79-
depends on PTP_1588_CLOCK
79+
depends on POSIX_TIMERS
8080
---help---
8181
This driver supports the Common Platform Time Sync unit of
8282
the CPSW Ethernet Switch and Keystone 2 1g/10g Switch Subsystem.
@@ -87,6 +87,8 @@ config TI_CPTS_MOD
8787
tristate
8888
depends on TI_CPTS
8989
default y if TI_CPSW=y || TI_KEYSTONE_NETCP=y
90+
select NET_PTP_CLASSIFY
91+
imply PTP_1588_CLOCK
9092
default m
9193

9294
config TI_KEYSTONE_NETCP

drivers/net/usb/hso.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2534,13 +2534,6 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
25342534
SET_NETDEV_DEV(net, &interface->dev);
25352535
SET_NETDEV_DEVTYPE(net, &hso_type);
25362536

2537-
/* registering our net device */
2538-
result = register_netdev(net);
2539-
if (result) {
2540-
dev_err(&interface->dev, "Failed to register device\n");
2541-
goto exit;
2542-
}
2543-
25442537
/* start allocating */
25452538
for (i = 0; i < MUX_BULK_RX_BUF_COUNT; i++) {
25462539
hso_net->mux_bulk_rx_urb_pool[i] = usb_alloc_urb(0, GFP_KERNEL);
@@ -2560,6 +2553,13 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface,
25602553

25612554
add_net_device(hso_dev);
25622555

2556+
/* registering our net device */
2557+
result = register_netdev(net);
2558+
if (result) {
2559+
dev_err(&interface->dev, "Failed to register device\n");
2560+
goto exit;
2561+
}
2562+
25632563
hso_log_port(hso_dev);
25642564

25652565
hso_create_rfkill(hso_dev, interface);

net/core/skbuff.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,6 +1576,8 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len)
15761576
skb_set_tail_pointer(skb, len);
15771577
}
15781578

1579+
if (!skb->sk || skb->destructor == sock_edemux)
1580+
skb_condense(skb);
15791581
return 0;
15801582
}
15811583
EXPORT_SYMBOL(___pskb_trim);

net/ipv4/af_inet.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,9 @@ struct sk_buff **inet_gro_receive(struct sk_buff **head, struct sk_buff *skb)
13431343
if (*(u8 *)iph != 0x45)
13441344
goto out_unlock;
13451345

1346+
if (ip_is_fragment(iph))
1347+
goto out_unlock;
1348+
13461349
if (unlikely(ip_fast_csum((u8 *)iph, 5)))
13471350
goto out_unlock;
13481351

net/ipv4/tcp_output.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,7 +1267,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len,
12671267
* eventually). The difference is that pulled data not copied, but
12681268
* immediately discarded.
12691269
*/
1270-
static void __pskb_trim_head(struct sk_buff *skb, int len)
1270+
static int __pskb_trim_head(struct sk_buff *skb, int len)
12711271
{
12721272
struct skb_shared_info *shinfo;
12731273
int i, k, eat;
@@ -1277,7 +1277,7 @@ static void __pskb_trim_head(struct sk_buff *skb, int len)
12771277
__skb_pull(skb, eat);
12781278
len -= eat;
12791279
if (!len)
1280-
return;
1280+
return 0;
12811281
}
12821282
eat = len;
12831283
k = 0;
@@ -1303,23 +1303,28 @@ static void __pskb_trim_head(struct sk_buff *skb, int len)
13031303
skb_reset_tail_pointer(skb);
13041304
skb->data_len -= len;
13051305
skb->len = skb->data_len;
1306+
return len;
13061307
}
13071308

13081309
/* Remove acked data from a packet in the transmit queue. */
13091310
int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len)
13101311
{
1312+
u32 delta_truesize;
1313+
13111314
if (skb_unclone(skb, GFP_ATOMIC))
13121315
return -ENOMEM;
13131316

1314-
__pskb_trim_head(skb, len);
1317+
delta_truesize = __pskb_trim_head(skb, len);
13151318

13161319
TCP_SKB_CB(skb)->seq += len;
13171320
skb->ip_summed = CHECKSUM_PARTIAL;
13181321

1319-
skb->truesize -= len;
1320-
sk->sk_wmem_queued -= len;
1321-
sk_mem_uncharge(sk, len);
1322-
sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
1322+
if (delta_truesize) {
1323+
skb->truesize -= delta_truesize;
1324+
sk->sk_wmem_queued -= delta_truesize;
1325+
sk_mem_uncharge(sk, delta_truesize);
1326+
sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
1327+
}
13231328

13241329
/* Any change of skb->len requires recalculation of tso factor. */
13251330
if (tcp_skb_pcount(skb) > 1)

net/tipc/socket.c

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,14 @@ static void tipc_sk_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb,
866866
if (!tsk_peer_msg(tsk, hdr))
867867
goto exit;
868868

869+
if (unlikely(msg_errcode(hdr))) {
870+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
871+
tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
872+
tsk_peer_port(tsk));
873+
sk->sk_state_change(sk);
874+
goto exit;
875+
}
876+
869877
tsk->probe_unacked = false;
870878

871879
if (mtyp == CONN_PROBE) {
@@ -1259,7 +1267,10 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop)
12591267
struct sock *sk = sock->sk;
12601268
DEFINE_WAIT(wait);
12611269
long timeo = *timeop;
1262-
int err;
1270+
int err = sock_error(sk);
1271+
1272+
if (err)
1273+
return err;
12631274

12641275
for (;;) {
12651276
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
@@ -1281,6 +1292,10 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop)
12811292
err = sock_intr_errno(timeo);
12821293
if (signal_pending(current))
12831294
break;
1295+
1296+
err = sock_error(sk);
1297+
if (err)
1298+
break;
12841299
}
12851300
finish_wait(sk_sleep(sk), &wait);
12861301
*timeop = timeo;
@@ -1551,25 +1566,37 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
15511566
struct sock *sk = &tsk->sk;
15521567
struct net *net = sock_net(sk);
15531568
struct tipc_msg *hdr = buf_msg(skb);
1569+
u32 pport = msg_origport(hdr);
1570+
u32 pnode = msg_orignode(hdr);
15541571

15551572
if (unlikely(msg_mcast(hdr)))
15561573
return false;
15571574

15581575
switch (sk->sk_state) {
15591576
case TIPC_CONNECTING:
15601577
/* Accept only ACK or NACK message */
1561-
if (unlikely(!msg_connected(hdr)))
1562-
return false;
1578+
if (unlikely(!msg_connected(hdr))) {
1579+
if (pport != tsk_peer_port(tsk) ||
1580+
pnode != tsk_peer_node(tsk))
1581+
return false;
1582+
1583+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
1584+
sk->sk_err = ECONNREFUSED;
1585+
sk->sk_state_change(sk);
1586+
return true;
1587+
}
15631588

15641589
if (unlikely(msg_errcode(hdr))) {
15651590
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
15661591
sk->sk_err = ECONNREFUSED;
1592+
sk->sk_state_change(sk);
15671593
return true;
15681594
}
15691595

15701596
if (unlikely(!msg_isdata(hdr))) {
15711597
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
15721598
sk->sk_err = EINVAL;
1599+
sk->sk_state_change(sk);
15731600
return true;
15741601
}
15751602

@@ -1581,8 +1608,7 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
15811608
return true;
15821609

15831610
/* If empty 'ACK-' message, wake up sleeping connect() */
1584-
if (waitqueue_active(sk_sleep(sk)))
1585-
wake_up_interruptible(sk_sleep(sk));
1611+
sk->sk_data_ready(sk);
15861612

15871613
/* 'ACK-' message is neither accepted nor rejected: */
15881614
msg_set_dest_droppable(hdr, 1);

net/xfrm/xfrm_input.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
395395
if (xo)
396396
xfrm_gro = xo->flags & XFRM_GRO;
397397

398-
err = x->inner_mode->afinfo->transport_finish(skb, async);
398+
err = x->inner_mode->afinfo->transport_finish(skb, xfrm_gro || async);
399399
if (xfrm_gro) {
400400
skb_dst_drop(skb);
401401
gro_cells_receive(&gro_cells, skb);

net/xfrm/xfrm_policy.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,10 @@ int xfrm_policy_flush(struct net *net, u8 type, bool task_valid)
10061006
err = -ESRCH;
10071007
out:
10081008
spin_unlock_bh(&net->xfrm.xfrm_policy_lock);
1009+
1010+
if (cnt)
1011+
xfrm_garbage_collect(net);
1012+
10091013
return err;
10101014
}
10111015
EXPORT_SYMBOL(xfrm_policy_flush);

0 commit comments

Comments
 (0)