Merge "[rdk-b][mt7986][wifi-hal][Add IGMP snooping function]"
diff --git a/recipes-ccsp/hal/hal-wifi-patches/0035-HAL-add-igmp-snooping-function.patch b/recipes-ccsp/hal/hal-wifi-patches/0035-HAL-add-igmp-snooping-function.patch
new file mode 100644
index 0000000..bc97b5e
--- /dev/null
+++ b/recipes-ccsp/hal/hal-wifi-patches/0035-HAL-add-igmp-snooping-function.patch
@@ -0,0 +1,80 @@
+From b633c0262c070dfe0de5c2e880115082a1b266f2 Mon Sep 17 00:00:00 2001
+From: "Allen.Ye" <allen.ye@mediatek.com>
+Date: Fri, 5 Aug 2022 09:54:14 +0800
+Subject: [PATCH] HAL: add igmp snooping function
+
+---
+ source/wifi/wifi_hal.c | 43 +++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 40 insertions(+), 3 deletions(-)
+
+diff --git a/source/wifi/wifi_hal.c b/source/wifi/wifi_hal.c
+index 44f167b..b0c42bd 100644
+--- a/source/wifi/wifi_hal.c
++++ b/source/wifi/wifi_hal.c
+@@ -82,6 +82,7 @@ Licensed under the ISC license
+ #define DRIVER_2GHZ "ath9k"
+ #define DRIVER_5GHZ "ath10k_pci"
+ #endif
++#define BRIDGE_NAME "brlan0"
+ 
+ /*
+    MAX_APS - Number of all AP available in system
+@@ -3971,16 +3972,52 @@ INT wifi_setRadio11nGreenfieldEnable(INT radioIndex, BOOL enable)
+ //Get radio IGMP snooping enable setting
+ INT wifi_getRadioIGMPSnoopingEnable(INT radioIndex, BOOL *output_bool)
+ {
+-    if (NULL == output_bool)
++    char cmd[128]={0};
++    char buf[4]={0};
++    bool bridge = FALSE, mac80211 = FALSE;
++    WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
++    if(output_bool == NULL)
+         return RETURN_ERR;
+-    *output_bool = TRUE;
++
++    *output_bool = FALSE;
++
++    snprintf(cmd, sizeof(cmd),  "cat /sys/devices/virtual/net/%s/bridge/multicast_snooping", BRIDGE_NAME);
++    _syscmd(cmd, buf, sizeof(buf));
++    if (strncmp(buf, "1", 1) == 0)
++        bridge = TRUE;
++
++    snprintf(cmd, sizeof(cmd),  "cat /sys/devices/virtual/net/%s/brif/%s%d/multicast_to_unicast", BRIDGE_NAME, AP_PREFIX, radioIndex);
++    _syscmd(cmd, buf, sizeof(buf));
++    if (strncmp(buf, "1", 1) == 0)
++        mac80211 = TRUE;
++
++    if (bridge && mac80211)
++        *output_bool = TRUE;
++
++    WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
+     return RETURN_OK;
+ }
+ 
+ //Set radio IGMP snooping enable setting
+ INT wifi_setRadioIGMPSnoopingEnable(INT radioIndex, BOOL enable)
+ {
+-    return RETURN_ERR;
++    char cmd[128]={0};
++    char buf[4]={0};
++
++    WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
++    // bridge
++    snprintf(cmd, sizeof(cmd),  "echo %d > /sys/devices/virtual/net/%s/bridge/multicast_snooping", enable, BRIDGE_NAME);
++    _syscmd(cmd, buf, sizeof(buf));
++
++    // mac80211
++    for (int i = 0; i < NUMBER_OF_RADIOS; i++) {
++        snprintf(cmd, sizeof(cmd),  "echo %d > /sys/devices/virtual/net/%s/brif/%s%d/multicast_to_unicast", enable, BRIDGE_NAME, AP_PREFIX, i);
++        _syscmd(cmd, buf, sizeof(buf));
++    }
++    WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
++    return RETURN_OK;
+ }
+ 
+ //Get the Reset count of radio
+-- 
+2.18.0
+