summaryrefslogtreecommitdiff
path: root/drivers/net/ppp
diff options
context:
space:
mode:
authorQingfang Deng <dqfext@gmail.com>2026-02-24 09:50:52 +0800
committerPaolo Abeni <pabeni@redhat.com>2026-02-26 11:41:00 +0100
commit15c9ed1d8286dc0297f01347dc74f5a8cbc173de (patch)
tree6e3c234886bbadc11e14bbaaa6ab1d3ffddce826 /drivers/net/ppp
parent90fcb0f3bc5ab67773b35030af68ed8c6bd83e1c (diff)
downloadlinux-next-15c9ed1d8286dc0297f01347dc74f5a8cbc173de.tar.gz
linux-next-15c9ed1d8286dc0297f01347dc74f5a8cbc173de.zip
pppoe: remove kernel-mode relay support
The kernel-mode PPPoE relay feature and its two associated ioctls (PPPOEIOCSFWD and PPPOEIOCDFWD) are not used by any existing userspace PPPoE implementations. The most commonly-used package, RP-PPPoE [1], handles the relaying entirely in userspace. This legacy code has remained in the driver since its introduction in kernel 2.3.99-pre7 for over two decades, but has served no practical purpose. Remove the unused relay code. [1] https://dianne.skoll.ca/projects/rp-pppoe/ Signed-off-by: Qingfang Deng <dqfext@gmail.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Guillaume Nault <gnault@redhat.com> Link: https://patch.msgid.link/20260224015053.42472-1-dqfext@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'drivers/net/ppp')
-rw-r--r--drivers/net/ppp/pppoe.c79
-rw-r--r--drivers/net/ppp/pppox.c3
2 files changed, 0 insertions, 82 deletions
diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c
index 7900cc3212a5..1ac61c273b28 100644
--- a/drivers/net/ppp/pppoe.c
+++ b/drivers/net/ppp/pppoe.c
@@ -237,25 +237,6 @@ static inline struct pppox_sock *get_item(struct pppoe_net *pn, __be16 sid,
return po;
}
-static inline struct pppox_sock *__get_item_by_addr(struct net *net,
- struct sockaddr_pppox *sp)
-{
- struct net_device *dev;
- struct pppoe_net *pn;
- struct pppox_sock *pppox_sock = NULL;
-
- int ifindex;
-
- dev = dev_get_by_name_rcu(net, sp->sa_addr.pppoe.dev);
- if (dev) {
- ifindex = dev->ifindex;
- pn = pppoe_pernet(net);
- pppox_sock = __get_item(pn, sp->sa_addr.pppoe.sid,
- sp->sa_addr.pppoe.remote, ifindex);
- }
- return pppox_sock;
-}
-
static inline void delete_item(struct pppoe_net *pn, __be16 sid,
char *addr, int ifindex)
{
@@ -369,7 +350,6 @@ static struct notifier_block pppoe_notifier = {
static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb)
{
struct pppox_sock *po = pppox_sk(sk);
- struct pppox_sock *relay_po;
/* Backlog receive. Semantics of backlog rcv preclude any code from
* executing in lock_sock()/release_sock() bounds; meaning sk->sk_state
@@ -378,17 +358,6 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb)
if (sk->sk_state & PPPOX_BOUND) {
ppp_input(&po->chan, skb);
- } else if (sk->sk_state & PPPOX_RELAY) {
- relay_po = __get_item_by_addr(sock_net(sk),
- &po->pppoe_relay);
- if (relay_po == NULL)
- goto abort_kfree;
-
- if ((sk_pppox(relay_po)->sk_state & PPPOX_CONNECTED) == 0)
- goto abort_kfree;
-
- if (!__pppoe_xmit(sk_pppox(relay_po), skb))
- goto abort_kfree;
} else {
if (sock_queue_rcv_skb(sk, skb))
goto abort_kfree;
@@ -656,7 +625,6 @@ static int pppoe_connect(struct socket *sock, struct sockaddr_unsized *uservaddr
po->pppoe_ifindex = 0;
memset(&po->pppoe_pa, 0, sizeof(po->pppoe_pa));
- memset(&po->pppoe_relay, 0, sizeof(po->pppoe_relay));
memset(&po->chan, 0, sizeof(po->chan));
po->next = NULL;
po->num = 0;
@@ -783,53 +751,6 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
err = 0;
break;
- case PPPOEIOCSFWD:
- {
- struct pppox_sock *relay_po;
-
- err = -EBUSY;
- if (sk->sk_state & (PPPOX_BOUND | PPPOX_DEAD))
- break;
-
- err = -ENOTCONN;
- if (!(sk->sk_state & PPPOX_CONNECTED))
- break;
-
- /* PPPoE address from the user specifies an outbound
- PPPoE address which frames are forwarded to */
- err = -EFAULT;
- if (copy_from_user(&po->pppoe_relay,
- (void __user *)arg,
- sizeof(struct sockaddr_pppox)))
- break;
-
- err = -EINVAL;
- if (po->pppoe_relay.sa_family != AF_PPPOX ||
- po->pppoe_relay.sa_protocol != PX_PROTO_OE)
- break;
-
- /* Check that the socket referenced by the address
- actually exists. */
- rcu_read_lock();
- relay_po = __get_item_by_addr(sock_net(sk), &po->pppoe_relay);
- rcu_read_unlock();
- if (!relay_po)
- break;
-
- sk->sk_state |= PPPOX_RELAY;
- err = 0;
- break;
- }
-
- case PPPOEIOCDFWD:
- err = -EALREADY;
- if (!(sk->sk_state & PPPOX_RELAY))
- break;
-
- sk->sk_state &= ~PPPOX_RELAY;
- err = 0;
- break;
-
default:
err = -ENOTTY;
}
diff --git a/drivers/net/ppp/pppox.c b/drivers/net/ppp/pppox.c
index 08364f10a43f..5861a2f6ce3e 100644
--- a/drivers/net/ppp/pppox.c
+++ b/drivers/net/ppp/pppox.c
@@ -102,9 +102,6 @@ EXPORT_SYMBOL(pppox_ioctl);
#ifdef CONFIG_COMPAT
int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{
- if (cmd == PPPOEIOCSFWD32)
- cmd = PPPOEIOCSFWD;
-
return pppox_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
}