mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 04:21:09 -04:00
l2tp: ppp: use max L2TP header size for PPP channel hdrlen
chan.hdrlen is read once at channel registration by ppp_register_net_channel(), and used to set the PPP net device's hard_header_len. It was set to PPPOL2TP_L2TP_HDR_SIZE_NOSEQ (6), which is 4 bytes too small if sequence numbers are later enabled via setsockopt(PPPOL2TP_SO_SENDSEQ), causing unnecessary skb reallocations on the TX path. The setsockopt handler attempted to change netdev's hard_header_len by updating chan.hdrlen, but the PPP layer never re-reads it after the registration, so the update had no effect. To avoid the unnecessary reallocations, set chan.hdrlen to PPPOL2TP_L2TP_HDR_SIZE_SEQ (10) unconditionally at registration and remove the ineffective update in the setsockopt callback. Signed-off-by: Qingfang Deng <dqfext@gmail.com> Link: https://patch.msgid.link/20260317054141.524879-1-dqfext@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
committed by
Paolo Abeni
parent
96a584db75
commit
9f4960b94f
@@ -787,11 +787,12 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr_unsized *userva
|
||||
goto out_no_ppp;
|
||||
}
|
||||
|
||||
/* The only header we need to worry about is the L2TP
|
||||
* header. This size is different depending on whether
|
||||
* sequence numbers are enabled for the data channel.
|
||||
/* Reserve enough headroom for the L2TP header with sequence numbers,
|
||||
* which is the largest possible. This is used by the PPP layer to set
|
||||
* the net device's hard_header_len at registration, which must be
|
||||
* sufficient regardless of whether sequence numbers are enabled later.
|
||||
*/
|
||||
po->chan.hdrlen = PPPOL2TP_L2TP_HDR_SIZE_NOSEQ;
|
||||
po->chan.hdrlen = PPPOL2TP_L2TP_HDR_SIZE_SEQ;
|
||||
|
||||
po->chan.private = sk;
|
||||
po->chan.ops = &pppol2tp_chan_ops;
|
||||
@@ -1176,12 +1177,6 @@ static int pppol2tp_session_setsockopt(struct sock *sk,
|
||||
break;
|
||||
}
|
||||
session->send_seq = !!val;
|
||||
{
|
||||
struct pppox_sock *po = pppox_sk(sk);
|
||||
|
||||
po->chan.hdrlen = val ? PPPOL2TP_L2TP_HDR_SIZE_SEQ :
|
||||
PPPOL2TP_L2TP_HDR_SIZE_NOSEQ;
|
||||
}
|
||||
l2tp_session_set_header_len(session, session->tunnel->version,
|
||||
session->tunnel->encap);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user