Merge "[rdk-b][mt7986][wifi-hal][Refactor set and get radius server functions]"
diff --git a/recipes-ccsp/hal/hal-wifi-patches/0040-HAL-refactor-set-and-get-radius-server-functions.patch b/recipes-ccsp/hal/hal-wifi-patches/0040-HAL-refactor-set-and-get-radius-server-functions.patch
new file mode 100644
index 0000000..443f006
--- /dev/null
+++ b/recipes-ccsp/hal/hal-wifi-patches/0040-HAL-refactor-set-and-get-radius-server-functions.patch
@@ -0,0 +1,179 @@
+From 019d55137b9c3a0c033675f55cc098bb472d677c Mon Sep 17 00:00:00 2001
+From: "Allen.Ye" <allen.ye@mediatek.com>
+Date: Thu, 18 Aug 2022 15:22:24 +0800
+Subject: [PATCH] HAL: refactor set and get radius server functions
+
+---
+ source/wifi/wifi_hal.c | 137 ++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 127 insertions(+), 10 deletions(-)
+
+diff --git a/source/wifi/wifi_hal.c b/source/wifi/wifi_hal.c
+index 7a137f7..6c00ceb 100644
+--- a/source/wifi/wifi_hal.c
++++ b/source/wifi/wifi_hal.c
+@@ -5624,35 +5624,152 @@ INT wifi_setApSecurityReset(INT apIndex)
+ //The IP Address and port number of the RADIUS server used for WLAN security. RadiusServerIPAddr is only applicable when ModeEnabled is an Enterprise type (i.e. WPA-Enterprise, WPA2-Enterprise or WPA-WPA2-Enterprise).
+ INT wifi_getApSecurityRadiusServer(INT apIndex, CHAR *IP_output, UINT *Port_output, CHAR *RadiusSecret_output)
+ {
++    char config_file[64] = {0};
++    char buf[64] = {0};
++    char cmd[256] = {0};
++
++    WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
+     if(!IP_output || !Port_output || !RadiusSecret_output)
+         return RETURN_ERR;
+-    snprintf(IP_output, 64, "75.56.77.78");
+-    *Port_output = 123;
+-    snprintf(RadiusSecret_output, 64, "12345678");
+ 
++    // Read the first matched config
++    snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, apIndex);
++    sprintf(cmd, "cat %s | grep \"^auth_server_addr=\" | cut -d \"=\" -f 2 | head -n1 | tr -d \"\\n\"", config_file);
++    _syscmd(cmd, buf, sizeof(buf));
++    strncpy(IP_output, buf, 64);
++
++    memset(buf, 0, sizeof(buf));
++    sprintf(cmd, "cat %s | grep \"^auth_server_port=\" | cut -d \"=\" -f 2 | head -n1 | tr -d \"\\n\"", config_file);
++    _syscmd(cmd, buf, sizeof(buf));
++    *Port_output = atoi(buf);
++
++    memset(buf, 0, sizeof(buf));
++    sprintf(cmd, "cat %s | grep \"^auth_server_shared_secret=\" | cut -d \"=\" -f 2 | head -n1 | tr -d \"\\n\"", config_file);
++    _syscmd(cmd, buf, sizeof(buf));
++    strncpy(RadiusSecret_output, buf, 64);
++
++    WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
+     return RETURN_OK;
+ }
+ 
+ INT wifi_setApSecurityRadiusServer(INT apIndex, CHAR *IPAddress, UINT port, CHAR *RadiusSecret)
+ {
+-    //store the paramters, and apply instantly
+-    return RETURN_ERR;
++    char config_file[64] = {0};
++    char port_str[8] = {0};
++    char cmd[256] = {0};
++    char buf[128] = {0};
++
++    WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
++    snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, apIndex);
++
++    snprintf(cmd, sizeof(cmd), "cat %s | grep '# radius 1'", config_file);
++    _syscmd(cmd, buf, sizeof(buf));
++    memset(cmd, 0, sizeof(cmd));
++
++    snprintf(port_str, sizeof(port_str), "%d", port);
++    if (strlen(buf) == 0)
++        // Append
++        snprintf(cmd, sizeof(cmd), "echo -e '# radius 1\\n"
++                                "auth_server_addr=%s\\n"
++                                "auth_server_port=%s\\n"
++                                "auth_server_shared_secret=%s' >> %s", IPAddress, port_str, RadiusSecret, config_file);
++    else {
++        // Delete the three lines setting after the "# radius 1" comment
++        snprintf(cmd, sizeof(cmd), "sed -i '/# radius 1/{n;N;N;d}' %s", config_file);
++        _syscmd(cmd, buf, sizeof(buf));
++        memset(cmd, 0, sizeof(cmd));
++        // Use "# radius 1" comment to find the location to insert the radius setting
++        snprintf(cmd, sizeof(cmd), "sed -i 's/# radius 1/"
++                                "# radius 1\\n"
++                                "auth_server_addr=%s\\n"
++                                "auth_server_port=%s\\n"
++                                "auth_server_shared_secret=%s/' %s", IPAddress, port_str, RadiusSecret, config_file);
++    }
++    if(_syscmd(cmd, buf, sizeof(buf))) {
++        wifi_dbg_printf("%s: command failed, cmd: %s\n", __func__, cmd);
++        return RETURN_ERR;
++    }
++
++    wifi_reloadAp(apIndex);
++    WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
++    return RETURN_OK;
+ }
+ 
+ INT wifi_getApSecuritySecondaryRadiusServer(INT apIndex, CHAR *IP_output, UINT *Port_output, CHAR *RadiusSecret_output)
+ {
++    char config_file[64] = {0};
++    char buf[64] = {0};
++    char cmd[256] = {0};
++
++    WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
+     if(!IP_output || !Port_output || !RadiusSecret_output)
+         return RETURN_ERR;
+-    snprintf(IP_output, 64, "75.56.77.78");
+-    *Port_output = 123;
+-    snprintf(RadiusSecret_output, 64, "12345678");
++
++    // Read the second matched config
++    snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, apIndex);
++    sprintf(cmd, "cat %s | grep \"^auth_server_addr=\" | cut -d \"=\" -f 2 | tail -n +2 | head -n1 | tr -d \"\\n\"", config_file);
++    _syscmd(cmd, buf, sizeof(buf));
++    strncpy(IP_output, buf, 64);
++
++    memset(buf, 0, sizeof(buf));
++    sprintf(cmd, "cat %s | grep \"^auth_server_port=\" | cut -d \"=\" -f 2 | tail -n +2 | head -n1 | tr -d \"\\n\"", config_file);
++    _syscmd(cmd, buf, sizeof(buf));
++    *Port_output = atoi(buf);
++
++    memset(buf, 0, sizeof(buf));
++    sprintf(cmd, "cat %s | grep \"^auth_server_shared_secret=\" | cut -d \"=\" -f 2 | tail -n +2 | head -n1 | tr -d \"\\n\"", config_file);
++    _syscmd(cmd, buf, sizeof(buf));
++    strncpy(RadiusSecret_output, buf, 64);
++
++    WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
+     return RETURN_OK;
+ }
+ 
+ INT wifi_setApSecuritySecondaryRadiusServer(INT apIndex, CHAR *IPAddress, UINT port, CHAR *RadiusSecret)
+ {
+-    //store the paramters, and apply instantly
+-    return RETURN_ERR;
++    char config_file[64] = {0};
++    char port_str[8] = {0};
++    char cmd[256] = {0};
++    char buf[128] = {0};
++
++    WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
++    snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, apIndex);
++
++    snprintf(cmd, sizeof(cmd), "cat %s | grep '# radius 2'", config_file);
++    _syscmd(cmd, buf, sizeof(buf));
++    memset(cmd, 0, sizeof(cmd));
++
++    snprintf(port_str, sizeof(port_str), "%d", port);
++    if (strlen(buf) == 0)
++        // Append
++        snprintf(cmd, sizeof(cmd), "echo -e '# radius 2\\n"
++                                "auth_server_addr=%s\\n"
++                                "auth_server_port=%s\\n"
++                                "auth_server_shared_secret=%s' >> %s", IPAddress, port_str, RadiusSecret, config_file);
++    else {
++        // Delete the three lines setting after the "# radius 2" comment
++        snprintf(cmd, sizeof(cmd), "sed -i '/# radius 2/{n;N;N;d}' %s", config_file);
++        _syscmd(cmd, buf, sizeof(buf));
++        memset(cmd, 0, sizeof(cmd));
++        // Use "# radius 2" comment to find the location to insert the radius setting
++        snprintf(cmd, sizeof(cmd), "sed -i 's/# radius 2/"
++                                "# radius 2\\n"
++                                "auth_server_addr=%s\\n"
++                                "auth_server_port=%s\\n"
++                                "auth_server_shared_secret=%s/' %s", IPAddress, port_str, RadiusSecret, config_file);
++    }
++    if(_syscmd(cmd, buf, sizeof(buf))) {
++        wifi_dbg_printf("%s: command failed, cmd: %s\n", __func__, cmd);
++        return RETURN_ERR;
++    }
++
++    wifi_reloadAp(apIndex);
++    WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
++    return RETURN_OK;
+ }
+ 
+ //RadiusSettings
+-- 
+2.18.0
+