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 56bad4335e..a2904a4ef0 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 @@ -762,6 +762,7 @@ static int hnat_probe(struct platform_device *pdev) if (err) return err; + index = 0; prop = of_find_property(np, "ext-devices", NULL); for (name = of_prop_next_string(prop, NULL); name; name = of_prop_next_string(prop, name), index++) { @@ -774,9 +775,22 @@ static int hnat_probe(struct platform_device *pdev) ext_if_add(ext_entry); } + 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); + } + 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); + dev_info(&pdev->dev, "ext devices = %s, prefix = %s\n", ext_entry->name, ext_entry->name_prefix); } 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 d84f798b1b..16fe326923 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 @@ -690,6 +690,7 @@ 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_debugfs.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c index cf85eb3d03..a29dcab54f 100644 --- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c +++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c @@ -1732,8 +1732,8 @@ static int hnat_ext_show(struct seq_file *m, void *private) for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) { ext_entry = hnat_priv->ext_if[i]; if (ext_entry->dev) - seq_printf(m, "ext devices [%d] = %s (dev=%p, ifindex=%d)\n", - i, ext_entry->name, ext_entry->dev, + seq_printf(m, "ext devices [%d] = %s, (dev=%p, ifindex=%d)\n", + i, ext_entry->dev->name, ext_entry->dev, ext_entry->dev->ifindex); } 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 d7e9883e66..4af1b574bf 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,7 +76,10 @@ 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 (!strcmp(name, ext_entry->name)) + 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))) return 1; } return 0; @@ -128,7 +131,10 @@ static inline int extif_set_dev(struct net_device *dev) for (i = 0; i < MAX_EXT_DEVS && hnat_priv->ext_if[i]; i++) { ext_entry = hnat_priv->ext_if[i]; - if (!strcmp(dev->name, ext_entry->name) && !ext_entry->dev) { + 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) + { dev_hold(dev); ext_entry->dev = dev; pr_info("%s(%s)\n", __func__, dev->name);