diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index 5ee8afc..2ac57a6 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -70,6 +70,14 @@
 const int SLEEP_TIME_ON_IDLE = 100 * 1000; // usecond
 const int MAX_IDLE_COUNT = 600; // 60s
 
+const char * start_wg870_service_script = "/etc/wg870/scripts/start_wg870_service.sh";
+const char * get_interface_name_script = "/etc/wg870/scripts/get_interface_name.sh";
+const char * start_stop_sta_script = "/etc/wg870/scripts/start_stop_sta.sh";
+const char * start_stop_ap_script = "/etc/wg870/scripts/start_stop_ap.sh";
+const char * sta_status_change_script = "/etc/wg870/scripts/sta_status_change.sh";
+
+static char s_ap_iterface_name[64] = {0};
+
 struct local_wpa_ctrl{
     struct wpa_ctrl *ctrl;
     pthread_mutex_t mutex;
@@ -150,10 +158,21 @@
     pthread_mutex_unlock(&s_global_check_mutex);
 }
 
+static int system_call_v(const char * fmt, ...)
+{
+    char str_cmd[256] = {0};
+    va_list args;
+    va_start(args, fmt);
+    vsprintf(str_cmd, fmt, args);
+    va_end(args);
+    printf("system call----------%s\n", str_cmd);
+    return system(str_cmd);
+}
+
 static void check_tether_and_notify()
 {
     RLOGD("check_tether_and_notify called");
-    if (0 == system("ifconfig | grep tether"))
+    if (s_ap_iterface_name[0] != '\0' && 0 == system_call_v("ifconfig | grep %s", s_ap_iterface_name))
     {
         return;
     }
@@ -588,7 +607,7 @@
     size_t len = MAX_RET;
     char msg_notify[MAX_RET];
     error_number_s error;
-    lynq_wifi_sta_status_s state;
+    lynq_wifi_sta_status_s state, last_state = -1;
     int idle_count = 0;
 
     struct wpa_ctrl *lynq_wpa_ctrl = NULL;
@@ -623,6 +642,19 @@
             if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
             {
                 inner_check_connect_error(msg_notify, state, error);
+                if (last_state != state)
+                {
+                    if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
+                    {
+                        system_call_v("%s %s", sta_status_change_script, "connect");
+                    }
+                    else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
+                    {
+                        system_call_v("%s %s", sta_status_change_script, "disconnect");
+                    }
+                }
+
+                last_state = state;
             }
         }
     }
@@ -767,15 +799,7 @@
         goto out_enable;
     }
 
-    const char * cmd_check_service =
-            "state=`systemctl is-active wg870_drv_insmod.service`\n"
-            "[ \"\"$state == \"active\" ] && exit 0\n"
-            "[ \"\"$state == \"inactive\" ] && systemctl start wg870_drv_insmod.service\n";
-//    if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL) {
-//        return 0;
-//    }
-
-    ret = system(cmd_check_service);
+    ret = system(start_wg870_service_script);
     if (ret != 0)
     {
         //printf("service state %d\n", ret);
@@ -784,50 +808,6 @@
         goto out_enable;
     }
 
-    RLOGD("check service state is OK");
-    for (i=0; i<10; i++)
-    {
-        if (system("connmanctl technologies | grep -q \"/net/connman/technology/wifi\"") == 0) {
-            break;
-        }
-        usleep(300*1000);
-    }
-
-    if (i >= 10)
-    {
-	RLOGE("[wifi error] check connman technologies no wifi");
-        ret = -1;
-        goto out_enable;
-    }
-
-    //@todo delete add temp check for socket avilable start (20220606)
-    for (i=0; i<60; i++)
-    {
-        if (system("netstat -an | grep -q DGRAM") == 0) {
-            break;
-        }
-        sleep(1);
-    }
-
-    if (i >= 60)
-    {
-        ret  = -1;
-        goto out_enable;
-    }
-    //@todo delete add temp check for socket avilable end (20220606)
-
-    if (0 != system("ifconfig | grep -q ap0"))
-    {
-        system("connmanctl enable wifi");
-        usleep(300*1000);
-        system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disconnect");
-        system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 DRIVER interface_create ap0");
-        usleep(300*1000);
-        system("connmanctl tether wifi on lynq 1qaz@WSX#$%^");
-        usleep(300*1000);
-        system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=ap0 disconnect");
-    }
-
     if (g_global_watcher_pid == 0 ) // this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
     {
         ret=pthread_create(&g_global_watcher_pid,NULL,GlobalWatcherThreadProc,NULL);
@@ -1903,11 +1883,11 @@
 
     CHECK_WPA_CTRL(CTRL_AP);
 
-//    system("connmanctl enable wifi");
-//    system("connmanctl tether wifi on cy-test 12345678");
-//    system("ifconfig wlan0 down");
-//    system("ifconfig wlan0 up");
-//    system("ifconfig wlan0 up");
+    sprintf(LYNQ_WIFI_CMD, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
+    if (0 != exec_cmd(LYNQ_WIFI_CMD, s_ap_iterface_name, sizeof(s_ap_iterface_name)) || s_ap_iterface_name[0] == '\0')
+    {
+        return -1;
+    }
 
     //DO_OK_FAIL_REQUEST(lynq_remove_all_cmd);
     //DO_OK_FAIL_REQUEST(lynq_reconfig_cmd);
@@ -1917,6 +1897,13 @@
 
     check_tether_and_notify();
 
+    ret = system_call_v("%s %s", start_stop_ap_script, "start");
+    if (ret != 0)
+    {
+        RLOGE("lynq_wifi_ap_start excute script fail");
+        return -1;
+    }
+
     return 0;
 }
 
@@ -1938,7 +1925,14 @@
     DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
 
 //    system("connmanctl tether wifi off");
-	
+
+    ret = system_call_v("%s %s", start_stop_ap_script, "stop");
+    if (ret != 0)
+    {
+        RLOGE("lynq_wifi_ap_start excute script fail");
+        return -1;
+    }
+
     return 0;
 }
 
@@ -2834,17 +2828,13 @@
     CHECK_IDX(idx, CTRL_STA);
     CHECK_WPA_CTRL(CTRL_STA);
 
-    system("connmanctl enable wifi");
-
-    if (system("ifconfig | grep -q wlan0") != 0)
+    ret = system_call_v("%s %s", start_stop_sta_script, "start");
+    if (ret != 0)
     {
+        RLOGE("lynq_wifi_ap_start excute script fail");
         return -1;
     }
 
-//    DO_OK_FAIL_REQUEST(cmd_remove_all);
-//    system(lynq_first_sta_cmd);
-//    system(lynq_reconfigure_cmd);
-//    DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
     system(lynq_enable_sta_cmd);
     system(lynq_reconnect_cmd);
 //    DO_OK_FAIL_REQUEST(lynq_reconnect_cmd);
@@ -2861,19 +2851,16 @@
     CHECK_IDX(idx, CTRL_STA);
     CHECK_WPA_CTRL(CTRL_STA);
 
-//    curr_state.ap = &ap_info;
-//    curr_state.state = NULL;
-
-//    if (0 != inner_get_status_info(CTRL_STA, &curr_state) || curr_state.net_no < 0) {
-//        return 0;
-//    }
-
-//    sprintf(lynq_disable_network_cmd, "DISABLE_NETWORK %d", curr_state.net_no);
-//    DO_OK_FAIL_REQUEST(lynq_disable_network_cmd);
     system(lynq_disable_sta_cmd);
     DO_OK_FAIL_REQUEST(cmd_save_config);
-//tmp add cmd fix gsw wlan0 didn't free ip after stop sta
-    system("ifconfig wlan0 0.0.0.0");
+
+    ret = system_call_v("%s %s", start_stop_sta_script, "stop");
+    if (ret != 0)
+    {
+        RLOGE("lynq_wifi_ap_start excute script fail");
+        return -1;
+    }
+
     return 0;
 //    return system("connmanctl disable wifi");
 }
@@ -3424,7 +3411,7 @@
 
     if (idx == 1)
     {
-       ifaName = "tether";
+       ifaName = s_ap_iterface_name;
     }
     else if (idx != 0)
     {
@@ -3695,7 +3682,8 @@
     int mask_len;
     char *p;
     char tmp[64] = {0};
-    if (exec_cmd("ifconfig tether | grep Mask", str_cmd_ret, max_len) != 0)
+    sprintf(tmp, "ifconfig %s | grep Mask", s_ap_iterface_name);
+    if (exec_cmd(tmp, str_cmd_ret, max_len) != 0)
         return -1;
     p = strstr(str_cmd_ret, "Mask:");
     if (p == NULL)
@@ -3732,6 +3720,12 @@
     nmax = 6;
     ncheckcount = nidlecount = 0;
 
+    if (s_ap_iterface_name[0] == '\0')
+    {
+        RLOGE("------gbw thread run\n");
+        return;
+    }
+
     RLOGD("------gbw thread run\n");
     sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
     while (dest_ip[0] == '\0') {
@@ -3750,28 +3744,27 @@
         }
     }
 
-    system("tc qdisc del dev tether root > /dev/null 2>&1");
-    system("tc qdisc add dev tether root handle 1: htb r2q 1");
-    system("tc class add dev tether parent 1:  classid 1:1  htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000");
+    system_call_v("tc qdisc del dev %s root > /dev/null 2>&1", s_ap_iterface_name);
+    system_call_v("tc qdisc add dev %s root handle 1: htb r2q 1", s_ap_iterface_name);
+    system_call_v("tc class add dev %s parent 1:  classid 1:1  htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000", s_ap_iterface_name);
     if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
     {
         RLOGD("not get tether info\n");
         return;
     }
-    sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 16 u32 match ip dst %s flowid 1:1", str_cmd_ret);
-    system(str_cmd);
-    system("tc class add dev tether parent 1:  classid 1:2  htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000");
-    sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", dest_ip);
-    //printf("----cmd:%s\n", str_cmd);
-    system(str_cmd);
+    system_call_v("tc filter add dev %s parent 1: protocol ip prio 16 u32 match ip dst %s flowid 1:1", s_ap_iterface_name, str_cmd_ret);
+    system_call_v("tc class add dev %s parent 1:  classid 1:2  htb rate 80Mbit ceil 100Mbit prio 0 quantum 3000000", s_ap_iterface_name);
+    system_call_v("tc filter add dev %s parent 1: protocol ip prio 1 u32 match ip dst %s flowid 1:2", s_ap_iterface_name, dest_ip);
 
     while (1) {
         sleep(1);
         memset(str_cmd, 0, sizeof(str_cmd));
-        if (0 != exec_cmd("tc -s class show dev tether classid 1:1 | grep Sent", str_cmd, sizeof (str_cmd)))
+        memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
+        sprintf(str_cmd, "tc -s class show dev %s classid 1:1 | grep Sent", s_ap_iterface_name);
+        if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
             continue;
         //printf("ap1 --- %s\n", str_cmd);
-        n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
+        n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
         if (n > 9) {
             if (strcmp(results[1], "Sent") == 0) {
                 currAP1Bytes = atoll(results[2]);
@@ -3782,10 +3775,12 @@
         }
 
         memset(str_cmd, 0, sizeof(str_cmd));
-        if (0 != exec_cmd("tc -s class show dev tether classid 1:2 | grep Sent", str_cmd, sizeof (str_cmd)))
+        memset(str_cmd_ret, 0, sizeof(str_cmd_ret));
+        sprintf(str_cmd, "tc -s class show dev %s classid 1:2 | grep Sent", s_ap_iterface_name);
+        if (0 != exec_cmd(str_cmd, str_cmd_ret, sizeof (str_cmd_ret)))
             continue;
         //printf("ap2 --- %s\n", str_cmd);
-        n = lynq_split(str_cmd, strlen(str_cmd), ' ', results);
+        n = lynq_split(str_cmd_ret, strlen(str_cmd_ret), ' ', results);
         if (n > 9) {
             if (strcmp(results[1], "Sent") == 0) {
                 currAP2Bytes = atoll(results[2]);
@@ -3833,9 +3828,8 @@
 
         if (currSetAP1Speed != setAP1Speed) {
             setAP1Speed = currSetAP1Speed;
-            sprintf(str_cmd, "tc class replace dev tether parent 1:  classid 1:1  htb rate %dMbit ceil %dMbit prio 2 quantum 3000", setAP1Speed, (int)(setAP1Speed*1.4));
-            //printf("------***change speed: %s\n", str_cmd);
-            system(str_cmd);
+            system_call_v(str_cmd, "tc class replace dev %s parent 1:  classid 1:1  htb rate %dMbit ceil %dMbit prio 2 quantum 3000",
+                         s_ap_iterface_name, setAP1Speed, (int)(setAP1Speed*1.4));
         }
     }
 }
@@ -3894,9 +3888,15 @@
 
 static int stopGBW() {
     void* retval;
+    char cmd[64] = {0};
     pthread_cancel(g_gbw_watcher_pid);
     pthread_join(g_gbw_watcher_pid, &retval);
     g_gbw_watcher_pid = 0;
-    system("tc qdisc del dev tether root");
+    sprintf(cmd, "%s %d", get_interface_name_script, LYNQ_WIFI_INTERFACE_1);
+    if (s_ap_iterface_name[0] != '\0')
+    {
+        sprintf(cmd, "tc qdisc del dev %s root", s_ap_iterface_name);
+        system(cmd);
+    }
 }
 //you.chen add for tv-box end
