mirror of
https://github.com/torvalds/linux.git
synced 2026-10-23 15:32:04 +02:00
netfilter: flowtable: restore ieee80211 forward path
Before commit871df5007e("netfilter: flowtable: bail out if forward path cannot be discovered"), there was a fallback to set up a forward path in case .ndo_fill_forward_path fails or DEV_PATH_MTK_WDMA was used. Such fallback was used by commitd787a3e38f("mac80211: add support for .ndo_fill_forward_path"). One possibility is to handle DEV_PATH_MTK_WDMA from the flowtable forward path discovery. However, this is only used internally by drivers to retrieve mtk_wdma information to set up hardware offload. Felix decided to use the .fill_forward_path interface for this purpose due to the lack of a better interface at that time. Add a new DEV_PATH_IEEE80211 path which is offered if the new ieee80211 flag is set on in the struct net_device_path_ctx to restore the flowtable with a ieee80211 netdevice. Handle this new DEV_PATH_IEEE80211 path just like DEV_PATH_ETHERNET and DEV_PATH_DSA, ie. this is the last netdevice in the stack. This new ieee80211 flag is implicitly unset for mtk_ppe and airoha which call dev_fill_forward_path() to retrieve a DEV_PATH_MTK_WDMA path. Fixes:871df5007e("netfilter: flowtable: bail out if forward path cannot be discovered") Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
7c549fb7ee
commit
3ae37eafd3
|
|
@ -887,6 +887,7 @@ enum net_device_path_type {
|
|||
DEV_PATH_DSA,
|
||||
DEV_PATH_MTK_WDMA,
|
||||
DEV_PATH_TUN,
|
||||
DEV_PATH_IEEE80211,
|
||||
};
|
||||
|
||||
struct net_device_path {
|
||||
|
|
@ -953,6 +954,8 @@ struct net_device_path_ctx {
|
|||
u16 id;
|
||||
__be16 proto;
|
||||
} vlan[NET_DEVICE_PATH_VLAN_MAX];
|
||||
|
||||
bool ieee80211;
|
||||
};
|
||||
|
||||
enum tc_setup_type {
|
||||
|
|
|
|||
|
|
@ -1023,6 +1023,13 @@ static int ieee80211_netdev_fill_forward_path(struct net_device_path_ctx *ctx,
|
|||
struct sta_info *sta;
|
||||
int ret = -ENOENT;
|
||||
|
||||
if (ctx->ieee80211) {
|
||||
path->type = DEV_PATH_IEEE80211;
|
||||
path->dev = ctx->dev;
|
||||
ctx->dev = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
sdata = IEEE80211_DEV_TO_SUB_IF(ctx->dev);
|
||||
local = sdata->local;
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ static int nft_dev_fill_forward_path(const struct dst_entry *dst_cache,
|
|||
struct net_device_path_ctx ctx = {
|
||||
.dev = dev,
|
||||
.ether_type = ether_type,
|
||||
.ieee80211 = true,
|
||||
};
|
||||
struct neighbour *n;
|
||||
u8 nud_state;
|
||||
|
|
@ -114,6 +115,7 @@ static int nft_dev_path_info(struct net_device_path_stack *stack,
|
|||
path = &stack->path[i];
|
||||
switch (path->type) {
|
||||
case DEV_PATH_ETHERNET:
|
||||
case DEV_PATH_IEEE80211:
|
||||
case DEV_PATH_DSA:
|
||||
case DEV_PATH_VLAN:
|
||||
case DEV_PATH_PPPOE:
|
||||
|
|
@ -123,6 +125,7 @@ static int nft_dev_path_info(struct net_device_path_stack *stack,
|
|||
memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN);
|
||||
|
||||
if (path->type == DEV_PATH_ETHERNET ||
|
||||
path->type == DEV_PATH_IEEE80211 ||
|
||||
path->type == DEV_PATH_DSA)
|
||||
break;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user