From 06556882d61447641e343aad6d2ea6815aaf4ae3 Mon Sep 17 00:00:00 2001 From: sKyissKy Date: Fri, 22 Sep 2023 18:36:37 +0800 Subject: [PATCH] Fix ipq807x qca-nss-ecm bonding error (#11542) --- package/qca/nss/qca-nss-clients-64/Makefile | 4 +- ...-qca-nss-ecm-bonding-add-bond_get_id.patch | 94 +++++++++++++++++++ ...dd-bridge-join-and-leave-netdev-cmds.patch | 11 +++ 3 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 target/linux/ipq807x/patches-5.10/606-qca-nss-ecm-bonding-add-bond_get_id.patch create mode 100644 target/linux/ipq807x/patches-5.10/607-qca-nss-ecm-Add-bridge-join-and-leave-netdev-cmds.patch diff --git a/package/qca/nss/qca-nss-clients-64/Makefile b/package/qca/nss/qca-nss-clients-64/Makefile index 7bebe70dd..03bbcd152 100644 --- a/package/qca/nss/qca-nss-clients-64/Makefile +++ b/package/qca/nss/qca-nss-clients-64/Makefile @@ -17,7 +17,7 @@ define KernelPackage/qca-nss-drv-pppoe-64 CATEGORY:=Kernel modules SUBMENU:=Network Devices TITLE:=Kernel driver for NSS (connection manager) - PPPoE - DEPENDS:=@(TARGET_ipq60xx||TARGET_ipq807x) +kmod-qca-nss-drv-64 +kmod-ppp +kmod-pppoe + DEPENDS:=@(TARGET_ipq60xx||TARGET_ipq807x) +kmod-qca-nss-drv-64 +kmod-ppp +kmod-pppoe +kmod-bonding FILES:=$(PKG_BUILD_DIR)/pppoe/qca-nss-pppoe.ko AUTOLOAD:=$(call AutoLoad,51,qca-nss-pppoe) endef @@ -45,7 +45,7 @@ define KernelPackage/qca-nss-drv-vlan-mgr-64 CATEGORY:=Kernel modules SUBMENU:=Network Devices TITLE:=Kernel driver for NSS vlan manager - DEPENDS:=@(LINUX_5_10||LINUX_5_15) @(TARGET_ipq60xx||TARGET_ipq807x) +kmod-qca-nss-drv-64 + DEPENDS:=@(LINUX_5_10||LINUX_5_15) @(TARGET_ipq60xx||TARGET_ipq807x) +kmod-qca-nss-drv-64 +kmod-bonding FILES:=$(PKG_BUILD_DIR)/vlan/qca-nss-vlan.ko AUTOLOAD:=$(call AutoLoad,51,qca-nss-vlan) endef diff --git a/target/linux/ipq807x/patches-5.10/606-qca-nss-ecm-bonding-add-bond_get_id.patch b/target/linux/ipq807x/patches-5.10/606-qca-nss-ecm-bonding-add-bond_get_id.patch new file mode 100644 index 000000000..1d9e21abe --- /dev/null +++ b/target/linux/ipq807x/patches-5.10/606-qca-nss-ecm-bonding-add-bond_get_id.patch @@ -0,0 +1,94 @@ +--- a/drivers/net/bonding/bond_main.c ++++ b/drivers/net/bonding/bond_main.c +@@ -247,6 +247,7 @@ static const struct flow_dissector_key f + }; + + static struct flow_dissector flow_keys_bonding __read_mostly; ++static unsigned long bond_id_mask = 0xFFFFFFF0; + + /*-------------------------- Forward declarations ---------------------------*/ + +@@ -301,6 +302,20 @@ netdev_tx_t bond_dev_queue_xmit(struct b + return dev_queue_xmit(skb); + } + ++int bond_get_id(struct net_device *bond_dev) ++{ ++ struct bonding *bond; ++ ++ if (!((bond_dev->priv_flags & IFF_BONDING) && ++ (bond_dev->flags & IFF_MASTER))) ++ return -EINVAL; ++ ++ bond = netdev_priv(bond_dev); ++ ++ return bond->id; ++} ++EXPORT_SYMBOL(bond_get_id); ++ + /*---------------------------------- VLAN -----------------------------------*/ + + /* In the following 2 functions, bond_vlan_rx_add_vid and bond_vlan_rx_kill_vid, +@@ -4822,6 +4837,9 @@ static void bond_destructor(struct net_d + struct bonding *bond = netdev_priv(bond_dev); + if (bond->wq) + destroy_workqueue(bond->wq); ++ ++ if (bond->id != (~0U)) ++ clear_bit(bond->id, &bond_id_mask); + } + + void bond_setup(struct net_device *bond_dev) +@@ -4936,7 +4954,7 @@ static int bond_check_params(struct bond + int bond_mode = BOND_MODE_ROUNDROBIN; + int xmit_hashtype = BOND_XMIT_POLICY_LAYER2; + int lacp_fast = 0; +- int tlb_dynamic_lb; ++ int tlb_dynamic_lb; + + /* Convert string parameters. */ + if (mode) { +@@ -5275,7 +5293,7 @@ static int bond_check_params(struct bond + params->peer_notif_delay = 0; + params->use_carrier = use_carrier; + params->lacp_fast = lacp_fast; +- params->primary[0] = 0; ++ params->primary[0] = 0; + params->primary_reselect = primary_reselect_value; + params->fail_over_mac = fail_over_mac_value; + params->tx_queues = tx_queues; +@@ -5390,7 +5408,15 @@ int bond_create(struct net *net, const c + bond_work_init_all(bond); + + rtnl_unlock(); +- return 0; ++ ++ bond = netdev_priv(bond_dev); ++ bond->id = ~0U; ++ if (bond_id_mask != (~0UL)) { ++ bond->id = (u32)ffz(bond_id_mask); ++ set_bit(bond->id, &bond_id_mask); ++ } ++ ++ return 0; + } + + static int __net_init bond_net_init(struct net *net) +--- a/include/net/bonding.h ++++ b/include/net/bonding.h +@@ -256,6 +256,7 @@ struct bonding { + /* protecting ipsec_list */ + spinlock_t ipsec_lock; + #endif /* CONFIG_XFRM_OFFLOAD */ ++ u32 id; + }; + + #define bond_slave_get_rcu(dev) \ +@@ -629,6 +629,7 @@ struct bond_net { + + int bond_arp_rcv(const struct sk_buff *skb, struct bonding *bond, struct slave *slave); + netdev_tx_t bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev); ++int bond_get_id(struct net_device *bond_dev); + int bond_create(struct net *net, const char *name); + int bond_create_sysfs(struct bond_net *net); + void bond_destroy_sysfs(struct bond_net *net); diff --git a/target/linux/ipq807x/patches-5.10/607-qca-nss-ecm-Add-bridge-join-and-leave-netdev-cmds.patch b/target/linux/ipq807x/patches-5.10/607-qca-nss-ecm-Add-bridge-join-and-leave-netdev-cmds.patch new file mode 100644 index 000000000..e2a1285f5 --- /dev/null +++ b/target/linux/ipq807x/patches-5.10/607-qca-nss-ecm-Add-bridge-join-and-leave-netdev-cmds.patch @@ -0,0 +1,11 @@ +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -1685,7 +1685,7 @@ const char *netdev_cmd_to_name(enum netd + N(UDP_TUNNEL_DROP_INFO) N(CHANGE_TX_QUEUE_LEN) + N(CVLAN_FILTER_PUSH_INFO) N(CVLAN_FILTER_DROP_INFO) + N(SVLAN_FILTER_PUSH_INFO) N(SVLAN_FILTER_DROP_INFO) +- N(PRE_CHANGEADDR) ++ N(PRE_CHANGEADDR) N(BR_JOIN) N(BR_LEAVE) + } + #undef N + return "UNKNOWN_NETDEV_EVENT";