| From 8700c287eb74cc013a02439f997e5bf26c1bee28 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 9 May 2022 14:26:15 +0200 |
| Subject: net: fix dev_fill_forward_path with pppoe + bridge |
| |
| From: Felix Fietkau <nbd@nbd.name> |
| |
| [ Upstream commit cf2df74e202d81b09f09d84c2d8903e0e87e9274 ] |
| |
| When calling dev_fill_forward_path on a pppoe device, the provided destination |
| address is invalid. In order for the bridge fdb lookup to succeed, the pppoe |
| code needs to update ctx->daddr to the correct value. |
| Fix this by storing the address inside struct net_device_path_ctx |
| |
| Fixes: f6efc675c9dd ("net: ppp: resolve forwarding path for bridge pppoe devices") |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ppp/pppoe.c | 1 + |
| include/linux/netdevice.h | 2 +- |
| net/core/dev.c | 2 +- |
| 3 files changed, 3 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c |
| index 3619520340b7..e172743948ed 100644 |
| --- a/drivers/net/ppp/pppoe.c |
| +++ b/drivers/net/ppp/pppoe.c |
| @@ -988,6 +988,7 @@ static int pppoe_fill_forward_path(struct net_device_path_ctx *ctx, |
| path->encap.proto = htons(ETH_P_PPP_SES); |
| path->encap.id = be16_to_cpu(po->num); |
| memcpy(path->encap.h_dest, po->pppoe_pa.remote, ETH_ALEN); |
| + memcpy(ctx->daddr, po->pppoe_pa.remote, ETH_ALEN); |
| path->dev = ctx->dev; |
| ctx->dev = dev; |
| |
| diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h |
| index 62ff09467776..39f1893ecac0 100644 |
| --- a/include/linux/netdevice.h |
| +++ b/include/linux/netdevice.h |
| @@ -887,7 +887,7 @@ struct net_device_path_stack { |
| |
| struct net_device_path_ctx { |
| const struct net_device *dev; |
| - const u8 *daddr; |
| + u8 daddr[ETH_ALEN]; |
| |
| int num_vlans; |
| struct { |
| diff --git a/net/core/dev.c b/net/core/dev.c |
| index 804aba2228c2..5907212c00f3 100644 |
| --- a/net/core/dev.c |
| +++ b/net/core/dev.c |
| @@ -741,11 +741,11 @@ int dev_fill_forward_path(const struct net_device *dev, const u8 *daddr, |
| const struct net_device *last_dev; |
| struct net_device_path_ctx ctx = { |
| .dev = dev, |
| - .daddr = daddr, |
| }; |
| struct net_device_path *path; |
| int ret = 0; |
| |
| + memcpy(ctx.daddr, daddr, sizeof(ctx.daddr)); |
| stack->num_paths = 0; |
| while (ctx.dev && ctx.dev->netdev_ops->ndo_fill_forward_path) { |
| last_dev = ctx.dev; |
| -- |
| 2.35.1 |
| |