From f7aecec1da898774ec4dd7521b43c2c33857a7dc Mon Sep 17 00:00:00 2001 From: hanwckf Date: Thu, 18 Jan 2024 19:43:04 +0800 Subject: [PATCH] mediatek: hnat: fix match ext dev by prefix --- .../net/ethernet/mediatek/mtk_hnat/hnat.c | 21 +++--- .../net/ethernet/mediatek/mtk_hnat/hnat.h | 3 +- .../ethernet/mediatek/mtk_hnat/hnat_nf_hook.c | 70 +++++++++++++++---- 3 files changed, 70 insertions(+), 24 deletions(-) diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c index a2904a4ef0..0f256489bc 100644 --- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c @@ -775,22 +775,23 @@ static int hnat_probe(struct platform_device *pdev) ext_if_add(ext_entry); } + for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) { + ext_entry = hnat_priv->ext_if[i]; + dev_info(&pdev->dev, "ext devices = %s\n", ext_entry->name); + } + index = 0; prop = of_find_property(np, "ext-devices-prefix", NULL); for (name = of_prop_next_string(prop, NULL); name; name = of_prop_next_string(prop, name), index++) { - ext_entry = kzalloc(sizeof(*ext_entry), GFP_KERNEL); - if (!ext_entry) { - err = -ENOMEM; - goto err_out1; - } - strncpy(ext_entry->name_prefix, (char *)name, IFNAMSIZ - 1); - ext_if_add(ext_entry); + if (index < MAX_EXT_PREFIX_NUM) + hnat_priv->ext_if_prefix[index] = name; + else + break; } - for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) { - ext_entry = hnat_priv->ext_if[i]; - dev_info(&pdev->dev, "ext devices = %s, prefix = %s\n", ext_entry->name, ext_entry->name_prefix); + for (i = 0; i < MAX_EXT_PREFIX_NUM && hnat_priv->ext_if_prefix[i]; i++) { + dev_info(&pdev->dev, "ext device prefix = %s\n", hnat_priv->ext_if_prefix[i]); } hnat_priv->lvid = 1; diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h index 16fe326923..19cd1569c9 100644 --- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h @@ -604,6 +604,7 @@ struct foe_entry { */ #define MAX_EXT_DEVS (0x3fU) #define MAX_IF_NUM 64 +#define MAX_EXT_PREFIX_NUM 8 #if defined(CONFIG_MEDIATEK_NETSYS_V2) #define MAX_PPE_NUM 2 @@ -678,6 +679,7 @@ struct mtk_hnat { struct net_device *g_wandev; struct net_device *wifi_hook_if[MAX_IF_NUM]; struct extdev_entry *ext_if[MAX_EXT_DEVS]; + const char *ext_if_prefix[MAX_EXT_PREFIX_NUM]; struct timer_list hnat_sma_build_entry_timer; struct timer_list hnat_reset_timestamp_timer; struct timer_list hnat_mcast_check_timer; @@ -690,7 +692,6 @@ struct mtk_hnat { struct extdev_entry { char name[IFNAMSIZ]; - char name_prefix[IFNAMSIZ]; struct net_device *dev; }; diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c index c45dacb21d..4a7aecbf94 100644 --- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c @@ -76,10 +76,7 @@ static inline int find_extif_from_devname(const char *name) for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) { ext_entry = hnat_priv->ext_if[i]; - if (strlen(ext_entry->name) && !strcmp(name, ext_entry->name)) - return 1; - - if (strlen(ext_entry->name_prefix) && !strncmp(name, ext_entry->name_prefix, strlen(ext_entry->name_prefix))) + if (!strcmp(name, ext_entry->name)) return 1; } return 0; @@ -124,23 +121,70 @@ static inline struct net_device *get_wandev_from_index(int index) return NULL; } -static inline int extif_set_dev(struct net_device *dev) +static inline int extif_match(const char *name) { int i; struct extdev_entry *ext_entry; for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) { ext_entry = hnat_priv->ext_if[i]; - if (((strlen(ext_entry->name) && !strcmp(dev->name, ext_entry->name)) - || (strlen(ext_entry->name_prefix) && !strncmp(dev->name, ext_entry->name_prefix, strlen(ext_entry->name_prefix)))) - && !ext_entry->dev) - { + if (!strcmp(name, ext_entry->name) && !ext_entry->dev) { + return i; + } + } + + return -1; +} + +static inline bool extif_prefix_match(const char *name) +{ + int i; + + for (i = 0; i < MAX_EXT_PREFIX_NUM && hnat_priv->ext_if_prefix[i]; i++) + { + if (strlen(hnat_priv->ext_if_prefix[i]) && + !strncmp(name, hnat_priv->ext_if_prefix[i], + strlen(hnat_priv->ext_if_prefix[i]))) + return true; + } + + return false; +} + +static inline int extif_set_dev(struct net_device *dev, int try_prefix) +{ + struct extdev_entry *ext_entry; + int extif_index, number; + + extif_index = extif_match(dev->name); + + if (extif_index < 0) { + /* try extif prefix match */ + if (try_prefix && extif_prefix_match(dev->name)) { + number = get_ext_device_number(); + if (number >= MAX_EXT_DEVS) { + pr_info("%s : extdev array is full. %s is not registered\n", + __func__, dev->name); + return -1; + } + + ext_entry = kzalloc(sizeof(*ext_entry), GFP_KERNEL); + if (!ext_entry) + return -1; + + strncpy(ext_entry->name, dev->name, IFNAMSIZ - 1); dev_hold(dev); ext_entry->dev = dev; - pr_info("%s(%s)\n", __func__, dev->name); + ext_if_add(ext_entry); - return ext_entry->dev->ifindex; + pr_info("%s prefix match (%s)\n", __func__, dev->name); + return dev->ifindex; } + } else { + dev_hold(dev); + hnat_priv->ext_if[extif_index]->dev = dev; + pr_info("%s(%s)\n", __func__, dev->name); + return dev->ifindex; } return -1; @@ -245,7 +289,7 @@ int nf_hnat_netdevice_event(struct notifier_block *unused, unsigned long event, gmac_ppe_fwd_enable(dev); - extif_set_dev(dev); + extif_set_dev(dev, 1); break; case NETDEV_GOING_DOWN: @@ -1970,7 +2014,7 @@ void mtk_ppe_dev_register_hook(struct net_device *dev) for (i = 1; i < MAX_IF_NUM; i++) { if (!hnat_priv->wifi_hook_if[i]) { if (find_extif_from_devname(dev->name)) { - extif_set_dev(dev); + extif_set_dev(dev, 0); goto add_wifi_hook_if; }