Commit 95d0d094 authored by Qingfang Deng's avatar Qingfang Deng Committed by Jakub Kicinski
Browse files

ppp: use IFF_NO_QUEUE in virtual interfaces



For PPPoE, PPTP, and PPPoL2TP, the start_xmit() function directly
forwards packets to the underlying network stack and never returns
anything other than 1. So these interfaces do not require a qdisc,
and the IFF_NO_QUEUE flag should be set.

Introduces a direct_xmit flag in struct ppp_channel to indicate when
IFF_NO_QUEUE should be applied. The flag is set in ppp_connect_channel()
for relevant protocols.

While at it, remove the usused latency member from struct ppp_channel.

Signed-off-by: default avatarQingfang Deng <dqfext@gmail.com>
Reviewed-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
Link: https://patch.msgid.link/20250301135517.695809-1-dqfext@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 00d66b5f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3493,6 +3493,10 @@ ppp_connect_channel(struct channel *pch, int unit)
		ret = -ENOTCONN;
		goto outl;
	}
	if (pch->chan->direct_xmit)
		ppp->dev->priv_flags |= IFF_NO_QUEUE;
	else
		ppp->dev->priv_flags &= ~IFF_NO_QUEUE;
	spin_unlock_bh(&pch->downl);
	if (pch->file.hdrlen > ppp->file.hdrlen)
		ppp->file.hdrlen = pch->file.hdrlen;
+1 −0
Original line number Diff line number Diff line
@@ -693,6 +693,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
		po->chan.mtu = dev->mtu - sizeof(struct pppoe_hdr) - 2;
		po->chan.private = sk;
		po->chan.ops = &pppoe_chan_ops;
		po->chan.direct_xmit = true;

		error = ppp_register_net_channel(dev_net(dev), &po->chan);
		if (error) {
+1 −0
Original line number Diff line number Diff line
@@ -465,6 +465,7 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr,
	po->chan.mtu -= PPTP_HEADER_OVERHEAD;

	po->chan.hdrlen = 2 + sizeof(struct pptp_gre_header);
	po->chan.direct_xmit = true;
	error = ppp_register_channel(&po->chan);
	if (error) {
		pr_err("PPTP: failed to register PPP channel (%d)\n", error);
+1 −2
Original line number Diff line number Diff line
@@ -42,8 +42,7 @@ struct ppp_channel {
	int		hdrlen;		/* amount of headroom channel needs */
	void		*ppp;		/* opaque to channel */
	int		speed;		/* transfer rate (bytes/second) */
	/* the following is not used at present */
	int		latency;	/* overhead time in milliseconds */
	bool		direct_xmit;	/* no qdisc, xmit directly */
};

#ifdef __KERNEL__
+1 −0
Original line number Diff line number Diff line
@@ -806,6 +806,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
	po->chan.private = sk;
	po->chan.ops	 = &pppol2tp_chan_ops;
	po->chan.mtu	 = pppol2tp_tunnel_mtu(tunnel);
	po->chan.direct_xmit	= true;

	error = ppp_register_net_channel(sock_net(sk), &po->chan);
	if (error) {