l2tp: fix userspace reception on plain L2TP sockets
As pppol2tp_recv() never queues up packets to plain L2TP sockets, pppol2tp_recvmsg() never returns data to userspace, thus making the recv*() system calls unusable. Instead of dropping packets when the L2TP socket isn't bound to a PPP channel, this patch adds them to its reception queue. Signed-off-by: Guillaume Nault <g.nault@alphalink.fr> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bb5016eac1
commit
9e9cb6221a
@ -254,13 +254,15 @@ static void pppol2tp_recv(struct l2tp_session *session, struct sk_buff *skb, int
|
|||||||
po = pppox_sk(sk);
|
po = pppox_sk(sk);
|
||||||
ppp_input(&po->chan, skb);
|
ppp_input(&po->chan, skb);
|
||||||
} else {
|
} else {
|
||||||
l2tp_info(session, PPPOL2TP_MSG_DATA, "%s: socket not bound\n",
|
l2tp_dbg(session, PPPOL2TP_MSG_DATA,
|
||||||
session->name);
|
"%s: recv %d byte data frame, passing to L2TP socket\n",
|
||||||
|
session->name, data_len);
|
||||||
|
|
||||||
/* Not bound. Nothing we can do, so discard. */
|
if (sock_queue_rcv_skb(sk, skb) < 0) {
|
||||||
atomic_long_inc(&session->stats.rx_errors);
|
atomic_long_inc(&session->stats.rx_errors);
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user