Merge "Revert "[Feature][T8TSK-124]Optimize the startup time of the LK stage"" into GSW3.0
diff --git a/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_ap_cache_hostname.patch b/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_ap_cache_hostname.patch
index 8cd4ca2..2c67ba1 100755
--- a/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_ap_cache_hostname.patch
+++ b/meta/meta-mediatek-mt2735/recipes-connectivity/connman/connman/lynq_ap_cache_hostname.patch
@@ -135,35 +135,55 @@
  }
 --- connman-1.41/gdhcp/server.c	2022-01-28 22:48:01.000000000 +0800
 +++ connman-1.41/gdhcp/server_new.c	2022-08-27 15:33:39.326208800 +0800
-@@ -107,13 +107,47 @@
+@@ -107,13 +107,67 @@
  	return NULL;
  }
  
 +static GHashTable *cached_hostname_table = NULL;
-+static int add_cached_hostname(const char * ip, const char * hostname)
++static GHashTable *cached_ip_mac_table = NULL;
++static int add_cached_hostname(const char * mac, const char * hostname)
 +{
-+    if (ip == NULL) {
++    if (mac == NULL) {
 +        return -1;
 +    }
 +    if (cached_hostname_table == NULL) {
 +        cached_hostname_table = g_hash_table_new_full(g_str_hash, g_str_equal,
 +                                NULL, g_free);
 +    }
-+    return g_hash_table_insert(cached_hostname_table, g_strdup(ip), g_strdup(hostname));
++    return g_hash_table_insert(cached_hostname_table, g_strdup(mac), g_strdup(hostname));
 +}
 +
-+static int delete_cached_hostname(const char * ip)
++static int add_cached_ip_mac(const char * ip, const char * mac)
 +{
-+    if (cached_hostname_table != NULL) {
-+        return g_hash_table_remove(cached_hostname_table, ip);
++    if (ip == NULL || mac == NULL) {
++        return -1;
++    }
++    if (cached_ip_mac_table == NULL) {
++        cached_ip_mac_table = g_hash_table_new_full(g_str_hash, g_str_equal,
++                                NULL, g_free);
++    }
++    return g_hash_table_insert(cached_ip_mac_table, g_strdup(ip), g_strdup(mac));
++}
++
++static int delete_cached_ip_mac(const char * ip)
++{
++    if (cached_ip_mac_table != NULL) {
++        return g_hash_table_remove(cached_ip_mac_table, ip);
 +    }
 +    return -1;
 +}
++
 +char * g_dhcp_server_find_hostname(const char * ip) {
-+    if (cached_hostname_table == NULL) {
++    if (ip == NULL || cached_hostname_table == NULL || cached_ip_mac_table == NULL) {
 +        return NULL;
 +    }
-+    char * hostname = g_hash_table_lookup(cached_hostname_table, ip);
++
++	char * mac = g_hash_table_lookup(cached_ip_mac_table, ip);
++	if (mac == NULL) {
++		return NULL;
++	}
++
++    char * hostname = g_hash_table_lookup(cached_hostname_table, mac);
 +    if (hostname != NULL) {
 +        return g_strdup(hostname);
 +    }
@@ -179,32 +199,45 @@
  
  	g_hash_table_remove(dhcp_server->nip_lease_hash,
  				GINT_TO_POINTER((int) lease->lease_nip));
-+    delete_cached_hostname(inet_ntoa(addr));
++    delete_cached_ip_mac(inet_ntoa(addr));
  	g_free(lease);
  }
  
-@@ -653,6 +687,10 @@
+@@ -193,6 +247,7 @@
+ {
+ 	struct dhcp_lease *lease = NULL;
+ 	int ret;
++	struct in_addr addr;
+ 
+ 	ret = get_lease(dhcp_server, yiaddr, chaddr, &lease);
+ 	if (ret != 0)
+@@ -214,6 +269,8 @@
+ 	g_hash_table_insert(dhcp_server->nip_lease_hash,
+ 				GINT_TO_POINTER((int) lease->lease_nip), lease);
+ 
++	addr.s_addr = yiaddr;
++	add_cached_ip_mac(inet_ntoa(addr), chaddr);
+ 	return lease;
+ }
+ 
+@@ -653,6 +710,10 @@
  	uint8_t type, *server_id_option, *request_ip_option;
  	uint16_t packet_len;
  	int re;
 +    const uint8_t *host_name_ptr;
 +    char hostname[128] = {0};
 +    struct in_addr addr;
-+    char *ip = NULL;
++    char *mac=NULL;
  
  	if (condition & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
  		dhcp_server->listener_watch = 0;
-@@ -664,7 +702,18 @@
+@@ -664,7 +725,14 @@
  		return TRUE;
  	packet_len = (uint16_t)(unsigned int)re;
  
 +    host_name_ptr = dhcp_get_option(&packet, packet_len, DHCP_HOST_NAME);
 +    if (host_name_ptr != NULL) {
-+        for(int i=0;i<127;i++) {
-+            if( host_name_ptr[i] >= 0x20) {
-+                hostname[i] = host_name_ptr[i];
-+            }
-+        }
++        memcpy(hostname, host_name_ptr, host_name_ptr[-1]);
 +    }
 +
 +
@@ -213,37 +246,27 @@
  	if (type == 0)
  		return TRUE;
  
-@@ -682,12 +731,17 @@
- 		requested_nip = get_be32(request_ip_option);
- 
- 	lease = find_lease_by_mac(dhcp_server, packet.chaddr);
-+    if (lease && lease->lease_nip != 0) {
-+        addr.s_addr = htonl(lease->lease_nip);
-+        ip = inet_ntoa(addr);
-+    }
- 
- 	switch (type) {
+@@ -687,6 +755,7 @@
  	case DHCPDISCOVER:
  		debug(dhcp_server, "Received DISCOVER");
  
++        add_cached_hostname(packet.chaddr, hostname);
  		send_offer(dhcp_server, &packet, lease, requested_nip);
-+        add_cached_hostname(ip, hostname);
  		break;
  	case DHCPREQUEST:
- 		debug(dhcp_server, "Received REQUEST NIP %d",
-@@ -702,6 +756,7 @@
+@@ -700,6 +769,7 @@
+ 
+ 		if (lease && requested_nip == lease->lease_nip) {
  			debug(dhcp_server, "Sending ACK");
++            add_cached_hostname(packet.chaddr, hostname);
  			send_ACK(dhcp_server, &packet,
  				lease->lease_nip);
-+            add_cached_hostname(ip, hostname);
  			break;
- 		}
- 
-@@ -743,6 +798,7 @@
+@@ -743,6 +813,7 @@
  	case DHCPINFORM:
  		debug(dhcp_server, "Received INFORM");
  		send_inform(dhcp_server, &packet);
-+        add_cached_hostname(ip, hostname);
++        add_cached_hostname(packet.chaddr, hostname);
  		break;
  	}
  
diff --git a/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover b/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
index ac817fb..8f687e9 100644
--- a/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
+++ b/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
@@ -87,6 +87,7 @@
 cd /
 
 echo "$TAG: Before recover radio_property" > /dev/kmsg
+rm -rf /etc/config/.*.uci*
 cp /data_backup/radio_property /etc/config/radio_property
 mkdir -p /data/atsvc
 cp /data_backup/lynq_atsvc_plugin.xml /data/atsvc/lynq_atsvc_plugin.xml
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/lynq-at-test/lynq-at-test.bb b/meta/meta-mediatek-mt2735/recipes-lynq/lynq-at-test/lynq-at-test.bb
new file mode 100755
index 0000000..e660588
--- /dev/null
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/lynq-at-test/lynq-at-test.bb
@@ -0,0 +1,27 @@
+DESCRIPTION = "at test"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-at-test/src"
+DEPENDS += "platform-libs mipc "
+
+LDFLAGS_append = " -lmipc_msg"
+
+
+FILES_${PN} = "/data/ ${bindir} "
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+
+do_compile () {
+	if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+	else
+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+	fi
+}
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${S}/lynq-at-test ${D}${bindir}/
+}
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb b/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
index 06324be..6f4f5a1 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
@@ -33,6 +33,7 @@
     lynq-function-test \
     lynq-low-power \
     lynq-at-extension \
+    lynq-at-test \
     liblynq-logdata-handle \
     lynq-default \
     lynq-logrotate-service \
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/epo.c b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/epo.c
index 1516179..5d59ddf 100644
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/epo.c
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/epo.c
@@ -1253,8 +1253,8 @@
         }
 
         curl_easy_setopt(curl, CURLOPT_URL, url);
-        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
-        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
+        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);
         curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
         curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60);
         //   curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
diff --git a/src/kernel/linux/v4.19/arch/arm64/configs/auto2735evb_defconfig b/src/kernel/linux/v4.19/arch/arm64/configs/auto2735evb_defconfig
index bb4f42a..4f080c8 100644
--- a/src/kernel/linux/v4.19/arch/arm64/configs/auto2735evb_defconfig
+++ b/src/kernel/linux/v4.19/arch/arm64/configs/auto2735evb_defconfig
@@ -67,6 +67,7 @@
 CONFIG_BCMDHD=m
 CONFIG_CYW89570=y
 CONFIG_RFKILL=y
+CONFIG_BCMDHD_WPA3=y
 #tianyan@2021.10.15 modify for open wifi6 module end
 #tianyan@2021.10.15 modify for open wifi5 module start
 CONFIG_WLAN=y
diff --git a/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 724193d..6dd83e1 100755
--- a/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -1237,13 +1237,8 @@
 
 #if defined(CONFIG_HW_NAT)
 		/* fast path FP is QDMA. default uses mac1(eth0) */
-		/*Lxf modify for api-604 20220930 start*/
-		if (mac > 1) {
-			netdev = eth->netdev[1];
-			mac = (netdev && netif_running(netdev)) ?
-			       eth->mac[1]->id : eth->mac[0]->id;
-		}
-		/*Lxf modify for api-604 20220930 end*/
+		if (mac > 1)
+			mac = netif_running(eth->netdev[1]) ? 1 : 0;
 #endif
 		if (unlikely(mac < 0 || mac >= MTK_MAC_COUNT ||
 			     !eth->netdev[mac]))
diff --git a/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/Kconfig b/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/Kconfig
index 9db3a39..36740f9 100644
--- a/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -12,6 +12,9 @@
 
 if STMMAC_ETH
 
+config MARVELL_88Q_PHY
+	tristate "support marvell-88q phy"
+
 config STMMAC_PLATFORM
 	tristate "STMMAC Platform bus support"
 	depends on STMMAC_ETH
diff --git a/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/Makefile b/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/Makefile
index 0cf334c..c2d6806 100644
--- a/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/Makefile
+++ b/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/Makefile
@@ -1,3 +1,8 @@
+#xf.li@20230325 add for query phy_sqi start
+ifdef CONFIG_MARVELL_88Q_PHY
+EXTRA_CFLAGS += -DMARVELL_88Q_PHY
+endif
+#xf.li@20230325 add for query phy_sqi end
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_STMMAC_ETH) += stmmac.o
 stmmac-objs:= stmmac_main.o mediatek_sgmii.o stmmac_ethtool.o stmmac_mdio.o \
diff --git a/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c b/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
index d3746da..e634311 100644
--- a/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
+++ b/src/kernel/linux/v4.19/drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c
@@ -554,9 +554,42 @@
 
 	return count;
 }
+//xf.li@20230325 add for query phy_sqi start
+static ssize_t phy_sqi_show(struct device *dev, struct device_attribute*attr, char *buf)  
+{  
+	struct platform_device *pdev = to_platform_device(dev);
+	struct net_device *netdev = platform_get_drvdata(pdev);
+	struct stmmac_priv *priv = netdev_priv(netdev);
+	int len = 0, devid, reg = 0, reg_addr, value;
+	struct phy_device *phy_dev = of_phy_find_device(priv->plat->phy_node);
+    
+#ifdef MARVELL_88Q_PHY
+	devid = 0x3;
+	reg = 0xfcd8;
+	reg_addr = MII_ADDR_C45 | ((devid & 0x1f) << 16) | (reg & 0xffff);
+	value = priv->mii->read(priv->mii, phy_dev->mdio.addr, reg_addr);
+	if(value == 0xffff)
+	{
+		value = 0xf;//0xffff error, can't read phy_reg
+	}
+	else
+	{
+		value = value%0x8;//0~3bit 
+	}
+	
+	len = sprintf(buf, "%x\n", value);
+#else
+	len = sprintf(buf,"nonsupport\n");
+#endif
+	return len;
+} 
+//xf.li@20230325 add for query phy_sqi end
 
 static DEVICE_ATTR_RW(stmmac);
 
+//xf.li@20230325 add for query phy_sqi start
+static DEVICE_ATTR_RO(phy_sqi);
+//xf.li@20230325 add for query phy_sqi end
 static int eth_create_attr(struct device *dev)
 {
 	int err = 0;
@@ -568,15 +601,24 @@
 	if (err)
 		pr_err("create debug file fail:%s\n", __func__);
 
+	//xf.li@20230325 add for query phy_sqi start
+	err = device_create_file(dev, &dev_attr_phy_sqi);
+	if (err)
+		pr_err("create debug file fail:%s\n", __func__);
+	//xf.li@20230325 add for query phy_sqi end
 	return err;
 }
 
 static void eth_remove_attr(struct device *dev)
 {
 	device_remove_file(dev, &dev_attr_stmmac);
+	//xf.li@20230325 add for query phy_sqi start 
+	device_remove_file(dev, &dev_attr_phy_sqi);
+	//xf.li@20230325 add for query phy_sqi end
 }
 #endif
 
+
 static int mt2712_set_interface(struct mediatek_dwmac_plat_data *plat)
 {
 	int rmii_rxc = plat->rmii_rxc ? RMII_CLK_SRC_RXC : 0;
diff --git a/src/kernel/linux/v4.19/drivers/net/phy/marvell-88q.c b/src/kernel/linux/v4.19/drivers/net/phy/marvell-88q.c
index 9010740..ab00fb0 100755
--- a/src/kernel/linux/v4.19/drivers/net/phy/marvell-88q.c
+++ b/src/kernel/linux/v4.19/drivers/net/phy/marvell-88q.c
@@ -232,6 +232,7 @@
 {
     //xf.li 2022/11/9 modify for API-647
     printk("phy sleep start\n");
+    gpio_direction_output(205 + 268, 0);
     gpio_direction_output(NAD_WAKEUP_PHY1, 0);
     mdelay(1);//ensure do not wake up
     //phy_write(phydev, MII_ADDR_C45 | 0x038022, 0x1);
@@ -255,13 +256,15 @@
     if(if_suspend == 1)
     {
         printk("phy awake start\n");
+	gpio_direction_output(205 + 268, 1);
         gpio_direction_output(PHY_POWER_SUPPLY, 1);
         mdelay(1);
         gpio_direction_output(NAD_WAKEUP_PHY1, 1);
-        udelay(1100);
+        mdelay(1000);
         gpio_direction_output(NAD_WAKEUP_PHY1, 0);
         mdelay(1);
         gpio_direction_output(NAD_RESET_PHY1, 1);
+        gpio_direction_output(205 + 268, 0);
         mdelay(10);//at lest 4ms for reset phy
         q2110_config_init(phydev);
 	if_suspend = 0;
diff --git a/src/kernel/linux/v4.19/drivers/net/phy/mdio_bus.c b/src/kernel/linux/v4.19/drivers/net/phy/mdio_bus.c
index c5588d4..cd0b1e1 100644
--- a/src/kernel/linux/v4.19/drivers/net/phy/mdio_bus.c
+++ b/src/kernel/linux/v4.19/drivers/net/phy/mdio_bus.c
@@ -384,7 +384,8 @@
 	}
 
 	mutex_init(&bus->mdio_lock);
-
+	gpio_direction_output(205 + 268, 1);
+	printk("----------INIT GPIO 205 END----------");
 	/* de-assert bus level PHY GPIO reset */
 	gpiod = devm_gpiod_get_optional(&bus->dev, "reset", GPIOD_OUT_LOW);
 	if (IS_ERR(gpiod)) {
diff --git a/src/kernel/linux/v4.19/include/uapi/linux/nl80211.h b/src/kernel/linux/v4.19/include/uapi/linux/nl80211.h
old mode 100644
new mode 100755
index 8d2479c..1e47749
--- a/src/kernel/linux/v4.19/include/uapi/linux/nl80211.h
+++ b/src/kernel/linux/v4.19/include/uapi/linux/nl80211.h
@@ -2250,6 +2250,135 @@
  *	association request when used with NL80211_CMD_NEW_STATION). Can be set
  *	only if %NL80211_STA_FLAG_WME is set.
  *
+ * @NL80211_ATTR_FTM_RESPONDER: nested attribute which user-space can include
+ *	in %NL80211_CMD_START_AP or %NL80211_CMD_SET_BEACON for fine timing
+ *	measurement (FTM) responder functionality and containing parameters as
+ *	possible, see &enum nl80211_ftm_responder_attr
+ *
+ * @NL80211_ATTR_FTM_RESPONDER_STATS: Nested attribute with FTM responder
+ *	statistics, see &enum nl80211_ftm_responder_stats.
+ *
+ * @NL80211_ATTR_TIMEOUT: Timeout for the given operation in milliseconds (u32),
+ *	if the attribute is not given no timeout is requested. Note that 0 is an
+ *	invalid value.
+ *
+ * @NL80211_ATTR_PEER_MEASUREMENTS: peer measurements request (and result)
+ *	data, uses nested attributes specified in
+ *	&enum nl80211_peer_measurement_attrs.
+ *	This is also used for capability advertisement in the wiphy information,
+ *	with the appropriate sub-attributes.
+ *
+ * @NL80211_ATTR_AIRTIME_WEIGHT: Station's weight when scheduled by the airtime
+ *	scheduler.
+ *
+ * @NL80211_ATTR_STA_TX_POWER_SETTING: Transmit power setting type (u8) for
+ *	station associated with the AP. See &enum nl80211_tx_power_setting for
+ *	possible values.
+ * @NL80211_ATTR_STA_TX_POWER: Transmit power level (s16) in dBm units. This
+ *	allows to set Tx power for a station. If this attribute is not included,
+ *	the default per-interface tx power setting will be overriding. Driver
+ *	should be picking up the lowest tx power, either tx power per-interface
+ *	or per-station.
+ *
+ * @NL80211_ATTR_SAE_PASSWORD: attribute for passing SAE password material. It
+ *	is used with %NL80211_CMD_CONNECT to provide password for offloading
+ *	SAE authentication for WPA3-Personal networks.
+ *
+ * @NL80211_ATTR_TWT_RESPONDER: Enable target wait time responder support.
+ *
+ * @NL80211_ATTR_HE_OBSS_PD: nested attribute for OBSS Packet Detection
+ *	functionality.
+ *
+ * @NL80211_ATTR_WIPHY_EDMG_CHANNELS: bitmap that indicates the 2.16 GHz
+ *	channel(s) that are allowed to be used for EDMG transmissions.
+ *	Defined by IEEE P802.11ay/D4.0 section 9.4.2.251. (u8 attribute)
+ * @NL80211_ATTR_WIPHY_EDMG_BW_CONFIG: Channel BW Configuration subfield encodes
+ *	the allowed channel bandwidth configurations. (u8 attribute)
+ *	Defined by IEEE P802.11ay/D4.0 section 9.4.2.251, Table 13.
+ *
+ * @NL80211_ATTR_VLAN_ID: VLAN ID (1..4094) for the station and VLAN group key
+ *	(u16).
+ *
+ * @NL80211_ATTR_HE_BSS_COLOR: nested attribute for BSS Color Settings.
+ *
+ * @NL80211_ATTR_IFTYPE_AKM_SUITES: nested array attribute, with each entry
+ *	using attributes from &enum nl80211_iftype_akm_attributes. This
+ *	attribute is sent in a response to %NL80211_CMD_GET_WIPHY indicating
+ *	supported AKM suites capability per interface. AKMs advertised in
+ *	%NL80211_ATTR_AKM_SUITES are default capabilities if AKM suites not
+ *	advertised for a specific interface type.
+ *
+ * @NL80211_ATTR_TID_CONFIG: TID specific configuration in a
+ *	nested attribute with &enum nl80211_tid_config_attr sub-attributes;
+ *	on output (in wiphy attributes) it contains only the feature sub-
+ *	attributes.
+ *
+ * @NL80211_ATTR_CONTROL_PORT_NO_PREAUTH: disable preauth frame rx on control
+ *	port in order to forward/receive them as ordinary data frames.
+ *
+ * @NL80211_ATTR_PMK_LIFETIME: Maximum lifetime for PMKSA in seconds (u32,
+ *	dot11RSNAConfigPMKReauthThreshold; 0 is not a valid value).
+ *	An optional parameter configured through %NL80211_CMD_SET_PMKSA.
+ *	Drivers that trigger roaming need to know the lifetime of the
+ *	configured PMKSA for triggering the full vs. PMKSA caching based
+ *	authentication. This timeout helps authentication methods like SAE,
+ *	where PMK gets updated only by going through a full (new SAE)
+ *	authentication instead of getting updated during an association for EAP
+ *	authentication. No new full authentication within the PMK expiry shall
+ *	result in a disassociation at the end of the lifetime.
+ *
+ * @NL80211_ATTR_PMK_REAUTH_THRESHOLD: Reauthentication threshold time, in
+ *	terms of percentage of %NL80211_ATTR_PMK_LIFETIME
+ *	(u8, dot11RSNAConfigPMKReauthThreshold, 1..100). This is an optional
+ *	parameter configured through %NL80211_CMD_SET_PMKSA. Requests the
+ *	driver to trigger a full authentication roam (without PMKSA caching)
+ *	after the reauthentication threshold time, but before the PMK lifetime
+ *	has expired.
+ *
+ *	Authentication methods like SAE need to be able to generate a new PMKSA
+ *	entry without having to force a disconnection after the PMK timeout. If
+ *	no roaming occurs between the reauth threshold and PMK expiration,
+ *	disassociation is still forced.
+ * @NL80211_ATTR_RECEIVE_MULTICAST: multicast flag for the
+ *	%NL80211_CMD_REGISTER_FRAME command, see the description there.
+ * @NL80211_ATTR_WIPHY_FREQ_OFFSET: offset of the associated
+ *	%NL80211_ATTR_WIPHY_FREQ in positive KHz. Only valid when supplied with
+ *	an %NL80211_ATTR_WIPHY_FREQ_OFFSET.
+ * @NL80211_ATTR_CENTER_FREQ1_OFFSET: Center frequency offset in KHz for the
+ *	first channel segment specified in %NL80211_ATTR_CENTER_FREQ1.
+ * @NL80211_ATTR_SCAN_FREQ_KHZ: nested attribute with KHz frequencies
+ *
+ * @NL80211_ATTR_HE_6GHZ_CAPABILITY: HE 6 GHz Band Capability element (from
+ *	association request when used with NL80211_CMD_NEW_STATION).
+ *
+ * @NL80211_ATTR_FILS_DISCOVERY: Optional parameter to configure FILS
+ *	discovery. It is a nested attribute, see
+ *	&enum nl80211_fils_discovery_attributes.
+ *
+ * @NL80211_ATTR_UNSOL_BCAST_PROBE_RESP: Optional parameter to configure
+ *	unsolicited broadcast probe response. It is a nested attribute, see
+ *	&enum nl80211_unsol_bcast_probe_resp_attributes.
+ *
+ * @NL80211_ATTR_S1G_CAPABILITY: S1G Capability information element (from
+ *	association request when used with NL80211_CMD_NEW_STATION)
+ * @NL80211_ATTR_S1G_CAPABILITY_MASK: S1G Capability Information element
+ *	override mask. Used with NL80211_ATTR_S1G_CAPABILITY in
+ *	NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT.
+ *
+ * @NL80211_ATTR_SAE_PWE: Indicates the mechanism(s) allowed for SAE PWE
+ *	derivation in WPA3-Personal networks which are using SAE authentication.
+ *	This is a u8 attribute that encapsulates one of the values from
+ *	&enum nl80211_sae_pwe_mechanism.
+ *
+ * @NL80211_ATTR_SAR_SPEC: SAR power limitation specification when
+ *	used with %NL80211_CMD_SET_SAR_SPECS. The message contains fields
+ *	of %nl80211_sar_attrs which specifies the sar type and related
+ *	sar specs. Sar specs contains array of %nl80211_sar_specs_attrs.
+ *
+ * @NL80211_ATTR_RECONNECT_REQUESTED: flag attribute, used with deauth and
+ *	disassoc events to indicate that an immediate reconnect to the AP
+ *	is desired.
+ *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2691,10 +2820,65 @@
 
 	NL80211_ATTR_HE_CAPABILITY,
 
+	NL80211_ATTR_FTM_RESPONDER,
+
+	NL80211_ATTR_FTM_RESPONDER_STATS,
+
+	NL80211_ATTR_TIMEOUT,
+
+	NL80211_ATTR_PEER_MEASUREMENTS,
+
+	NL80211_ATTR_AIRTIME_WEIGHT,
+	NL80211_ATTR_STA_TX_POWER_SETTING,
+	NL80211_ATTR_STA_TX_POWER,
+
+
 //tianyan@2021.7.27 modify for add wifi6 module start
 	NL80211_ATTR_SAE_PASSWORD,
 //tianyan@2021.7.27 modify for add wifi6 module end
 
+	NL80211_ATTR_TWT_RESPONDER,
+
+	NL80211_ATTR_HE_OBSS_PD,
+
+	NL80211_ATTR_WIPHY_EDMG_CHANNELS,
+	NL80211_ATTR_WIPHY_EDMG_BW_CONFIG,
+
+	NL80211_ATTR_VLAN_ID,
+
+	NL80211_ATTR_HE_BSS_COLOR,
+
+	NL80211_ATTR_IFTYPE_AKM_SUITES,
+
+	NL80211_ATTR_TID_CONFIG,
+
+	NL80211_ATTR_CONTROL_PORT_NO_PREAUTH,
+
+	NL80211_ATTR_PMK_LIFETIME,
+	NL80211_ATTR_PMK_REAUTH_THRESHOLD,
+
+	NL80211_ATTR_RECEIVE_MULTICAST,
+	NL80211_ATTR_WIPHY_FREQ_OFFSET,
+	NL80211_ATTR_CENTER_FREQ1_OFFSET,
+	NL80211_ATTR_SCAN_FREQ_KHZ,
+
+	NL80211_ATTR_HE_6GHZ_CAPABILITY,
+
+	NL80211_ATTR_FILS_DISCOVERY,
+
+	NL80211_ATTR_UNSOL_BCAST_PROBE_RESP,
+
+	NL80211_ATTR_S1G_CAPABILITY,
+	NL80211_ATTR_S1G_CAPABILITY_MASK,
+
+	NL80211_ATTR_SAE_PWE,
+
+	NL80211_ATTR_RECONNECT_REQUESTED,
+
+	NL80211_ATTR_SAR_SPEC,
+
+	NL80211_ATTR_DISABLE_HE,
+
 	/* add attributes here, update the policy in nl80211.c */
 
 	__NL80211_ATTR_AFTER_LAST,
@@ -5239,6 +5423,93 @@
  * @NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT: Driver/device can omit all data
  *	except for supported rates from the probe request content if requested
  *	by the %NL80211_SCAN_FLAG_MIN_PREQ_CONTENT flag.
+ * @NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER: Driver supports enabling fine
+ *	timing measurement responder role.
+ *
+ * @NL80211_EXT_FEATURE_CAN_REPLACE_PTK0: Driver/device confirm that they are
+ *      able to rekey an in-use key correctly. Userspace must not rekey PTK keys
+ *      if this flag is not set. Ignoring this can leak clear text packets and/or
+ *      freeze the connection.
+ * @NL80211_EXT_FEATURE_EXT_KEY_ID: Driver supports "Extended Key ID for
+ *      Individually Addressed Frames" from IEEE802.11-2016.
+ *
+ * @NL80211_EXT_FEATURE_AIRTIME_FAIRNESS: Driver supports getting airtime
+ *	fairness for transmitted packets and has enabled airtime fairness
+ *	scheduling.
+ *
+ * @NL80211_EXT_FEATURE_AP_PMKSA_CACHING: Driver/device supports PMKSA caching
+ *	(set/del PMKSA operations) in AP mode.
+ *
+ * @NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD: Driver supports
+ *	filtering of sched scan results using band specific RSSI thresholds.
+ *
+ * @NL80211_EXT_FEATURE_STA_TX_PWR: This driver supports controlling tx power
+ *	to a station.
+ *
+ * @NL80211_EXT_FEATURE_SAE_OFFLOAD: Device wants to do SAE authentication in
+ *	station mode (SAE password is passed as part of the connect command).
+ *
+ * @NL80211_EXT_FEATURE_VLAN_OFFLOAD: The driver supports a single netdev
+ *	with VLAN tagged frames and separate VLAN-specific netdevs added using
+ *	vconfig similarly to the Ethernet case.
+ *
+ * @NL80211_EXT_FEATURE_AQL: The driver supports the Airtime Queue Limit (AQL)
+ *	feature, which prevents bufferbloat by using the expected transmission
+ *	time to limit the amount of data buffered in the hardware.
+ *
+ * @NL80211_EXT_FEATURE_BEACON_PROTECTION: The driver supports Beacon protection
+ *	and can receive key configuration for BIGTK using key indexes 6 and 7.
+ * @NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT: The driver supports Beacon
+ *	protection as a client only and cannot transmit protected beacons.
+ *
+ * @NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH: The driver can disable the
+ *	forwarding of preauth frames over the control port. They are then
+ *	handled as ordinary data frames.
+ *
+ * @NL80211_EXT_FEATURE_PROTECTED_TWT: Driver supports protected TWT frames
+ *
+ * @NL80211_EXT_FEATURE_DEL_IBSS_STA: The driver supports removing stations
+ *      in IBSS mode, essentially by dropping their state.
+ *
+ * @NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS: management frame registrations
+ *	are possible for multicast frames and those will be reported properly.
+ *
+ * @NL80211_EXT_FEATURE_SCAN_FREQ_KHZ: This driver supports receiving and
+ *	reporting scan request with %NL80211_ATTR_SCAN_FREQ_KHZ. In order to
+ *	report %NL80211_ATTR_SCAN_FREQ_KHZ, %NL80211_SCAN_FLAG_FREQ_KHZ must be
+ *	included in the scan request.
+ *
+ * @NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS: The driver
+ *	can report tx status for control port over nl80211 tx operations.
+ *
+ * @NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION: Driver supports Operating
+ *	Channel Validation (OCV) when using driver's SME for RSNA handshakes.
+ *
+ * @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK: Device wants to do 4-way
+ *	handshake with PSK in AP mode (PSK is passed as part of the start AP
+ *	command).
+ *
+ * @NL80211_EXT_FEATURE_SAE_OFFLOAD_AP: Device wants to do SAE authentication
+ *	in AP mode (SAE password is passed as part of the start AP command).
+ *
+ * @NL80211_EXT_FEATURE_FILS_DISCOVERY: Driver/device supports FILS discovery
+ *	frames transmission
+ *
+ * @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
+ *	unsolicited broadcast probe response transmission
+ *
+ * @NL80211_EXT_FEATURE_BEACON_RATE_HE: Driver supports beacon rate
+ *	configuration (AP/mesh) with HE rates.
+ *
+ * @NL80211_EXT_FEATURE_SECURE_LTF: Device supports secure LTF measurement
+ *      exchange protocol.
+ *
+ * @NL80211_EXT_FEATURE_SECURE_RTT: Device supports secure RTT measurement
+ *      exchange protocol.
+ *
+ * @NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE: Device supports management
+ *      frame protection for all management frames exchanged during the
+ *      negotiation and range measurement procedure.
  *
  * @NUM_NL80211_EXT_FEATURES: number of extended features.
  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
@@ -5271,15 +5542,42 @@
 	NL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN,
 	NL80211_EXT_FEATURE_DFS_OFFLOAD,
 	NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211,
-	NL80211_EXT_FEATURE_DATA_ACK_SIGNAL_SUPPORT,
+	NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT,
+	/* we renamed this - stay compatible */
+	NL80211_EXT_FEATURE_DATA_ACK_SIGNAL_SUPPORT = NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT,
 	NL80211_EXT_FEATURE_TXQS,
 	NL80211_EXT_FEATURE_SCAN_RANDOM_SN,
 	NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT,
+	NL80211_EXT_FEATURE_CAN_REPLACE_PTK0,
+	NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER,
+	NL80211_EXT_FEATURE_AIRTIME_FAIRNESS,
+	NL80211_EXT_FEATURE_AP_PMKSA_CACHING,
+	NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD,
+	NL80211_EXT_FEATURE_EXT_KEY_ID,
+	NL80211_EXT_FEATURE_STA_TX_PWR,
 
 //tianyan@2021.7.27 modify for add wifi6 module start
 	NL80211_EXT_FEATURE_SAE_OFFLOAD,
-	NL80211_EXT_FEATURE_AP_PMKSA_CACHING,
 //tianyan@2021.7.27 modify for add wifi6 module end
+	NL80211_EXT_FEATURE_VLAN_OFFLOAD,
+	NL80211_EXT_FEATURE_AQL,
+	NL80211_EXT_FEATURE_BEACON_PROTECTION,
+	NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH,
+	NL80211_EXT_FEATURE_PROTECTED_TWT,
+	NL80211_EXT_FEATURE_DEL_IBSS_STA,
+	NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS,
+	NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT,
+	NL80211_EXT_FEATURE_SCAN_FREQ_KHZ,
+	NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS,
+	NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION,
+	NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK,
+	NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
+	NL80211_EXT_FEATURE_FILS_DISCOVERY,
+	NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
+	NL80211_EXT_FEATURE_BEACON_RATE_HE,
+	NL80211_EXT_FEATURE_SECURE_LTF,
+	NL80211_EXT_FEATURE_SECURE_RTT,
+	NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE,
 
 	/* add new features before the definition below */
 	NUM_NL80211_EXT_FEATURES,
@@ -5531,6 +5829,10 @@
  * Used by cfg80211_rx_mgmt()
  *
  * @NL80211_RXMGMT_FLAG_ANSWERED: frame was answered by device/driver.
+ * @NL80211_RXMGMT_FLAG_EXTERNAL_AUTH: Host driver intends to offload
+ *	the authentication. Exclusively defined for host drivers that
+ *	advertises the SME functionality but would like the userspace
+ *	to handle certain authentication algorithms (e.g. SAE).
  */
 enum nl80211_rxmgmt_flags {
 	NL80211_RXMGMT_FLAG_ANSWERED = 1 << 0,
diff --git a/src/kernel/modules/netsys_driver/nat/hw_nat/hnat_common.c b/src/kernel/modules/netsys_driver/nat/hw_nat/hnat_common.c
index c4e9b0e..09360ce 100755
--- a/src/kernel/modules/netsys_driver/nat/hw_nat/hnat_common.c
+++ b/src/kernel/modules/netsys_driver/nat/hw_nat/hnat_common.c
@@ -1026,13 +1026,10 @@
 	}
 
 	if (debug_level >= 10)
-/*Lxf modify for api-604 20220930 start*/
-		pr_notice("%s, send to ppe via %s tx\n", __func__, skb->dev->name);
-		
+		pr_notice("%s, send to ppe via ETH tx\n", __func__);
 
-	//dev_queue_xmit(skb);
-	skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev);
-/*Lxf modify for api-604 20220930 end*/
+	dev_queue_xmit(skb);
+
 	return 0;
 }
 
@@ -1303,10 +1300,8 @@
 
 	if (debug_level >= 7)
 		pr_notice("%s, bind to cpu done if name = %s\n",  __func__, skb->dev->name);
-/*Lxf modify for api-604 20220930 start*/
-	//dev_queue_xmit(skb);
-	skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev);
-/*Lxf modify for api-604 20220930 end*/
+
+	dev_queue_xmit(skb);
 
 	return 0;
 }
diff --git a/src/lynq/framework/lynq-sdk-ready/src/main.cpp b/src/lynq/framework/lynq-sdk-ready/src/main.cpp
index 0ff285c..9c8ee18 100755
--- a/src/lynq/framework/lynq-sdk-ready/src/main.cpp
+++ b/src/lynq/framework/lynq-sdk-ready/src/main.cpp
@@ -15,9 +15,6 @@
 
 int main(void){
     RLOGD("lynq-sdk-ready begin");
-    //xf.li add in 2023.01.04 for API-696 start
-    system("hwnat -O 5");
-    //xf.li add in 2023.01.04 for API-696 end
     start_timer_request();
     while (1)
     {
diff --git a/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h b/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
index 0b1b86e..ec50ef7 100755
--- a/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
+++ b/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
@@ -9,7 +9,8 @@
 #define LYNQ_CALL_MAX 3

 #define LYNQ_CALL_FAIL_VENDOR_CAUSE 64

 #define MAX_IP_LENGTH 128

-#define MAX_VLAN_INFO_LENGTH 128

+#define MAX_VLAN_INFO_LENGTH 32

+#define MAX_SSRC_INFO_LENGTH 10   /*2^32=4294967296, 10 digit*/

 

 typedef enum {

     LYNQ_CALL_FAIL_UNOBTAINABLE_NUMBER = 1,

@@ -148,18 +149,26 @@
     RTP_MODE_MAX

 }LYNQ_Rtp_Mode;

 

+typedef enum{

+    Rtp_Ssrc_random = 0,     

+    Rtp_Ssrc_specific =1,   

+}LYNQ_Rtp_Ssrc_Mode;

+

 /*set*/

 int lynq_set_voice_audio_mode(const LYNQ_Audio_Mode audio_mode); 

 int lynq_set_remote_rtp_ip(const char* ip, const int ip_length);

 int lynq_set_vlan_info(const char* vlan_info, const int vlan_info_length);

 int lynq_set_rtp_port(const LYNQ_Rtp_Mode rtp_mode, const int port);

 int lynq_set_rtp_param(const int clock_rate,const int channels,const int latency); //only for client

+int lynq_set_call_rtp_ssrc(const LYNQ_Rtp_Ssrc_Mode ssrc_mode, const unsigned int ssrc);

+

 /*get*/

 LYNQ_Audio_Mode lynq_get_voice_audio_mode();

 int lynq_get_remote_rtp_ip(char* ip, const int ip_length);

 int lynq_get_vlan_info(char* vlan_info, const int vlan_info_length);

 int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port);

 int lynq_get_rtp_param(int* clock_rate,int* channels, int* latency);//only for client

+int lynq_get_call_rtp_ssrc(int* ssrc_mod, unsigned int* ssrc);

 /*Audio Path setting end*/

 

 void lynq_set_test_mode(const int test_mode);

diff --git a/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp b/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp
index e22b016..4d6c1b3 100755
--- a/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp
@@ -19,14 +19,18 @@
 #include "lynq_call_common.h"

 

 #define RTP_FROM_CMD "gst-launch-1.0 -v udpsrc port=%d caps=\'application/x-rtp, media=(string)audio, clock-rate=(int)%d, channels=(int)%d\' ! rtpjitterbuffer latency=%d ! rtppcmadepay ! alawdec ! audioresample ! audioconvert ! alsasink device=\'hw:0,2\'"

-#define RTP_TO_CMD   "gst-launch-1.0 -v alsasrc device=\'hw:0,6\' ! audioconvert ! audioresample ! alawenc ! rtppcmapay ! udpsink host=%s %s auto-multicast=true port=%d"

+#define RTP_TO_CMD   "gst-launch-1.0 -v alsasrc device=\'hw:0,6\' ! audioconvert ! audioresample ! alawenc ! rtppcmapay ! %s udpsink host=%s %s auto-multicast=true port=%d"

 #define RTP_VLAN_INFO_FORMAT "multicast-iface=\"%s\""

+#define RTP_SSRC_INFO_FORMAT " rtpmux name=mux ssrc=%u !"

+

 #define USER_LOG_TAG "LYNQ_CALL"

 

 typedef struct

 {   

     char ip[MAX_IP_LENGTH];

     int port;   

+    int ssrc_mode;

+    unsigned int ssrc;

     char vlan_info[MAX_VLAN_INFO_LENGTH];

 }lynq_rtp_server_info;

 

@@ -105,6 +109,7 @@
     int* rtp_mode= (int*) arg;

     char cmd[384];

     char vlan_para_string[sizeof(RTP_VLAN_INFO_FORMAT)+MAX_VLAN_INFO_LENGTH-2/*sizeof "%s"*/]={0};

+    char ssrc_para_string[sizeof(RTP_SSRC_INFO_FORMAT)+MAX_SSRC_INFO_LENGTH-2/*sizeof "%u"*/]={0};

     LYINFLOG("lynq_start_rtp_cmd: rtp_mode is %d",(*rtp_mode));    

     if ((*rtp_mode) == RTP_CLIENT)

     {

@@ -120,10 +125,15 @@
         {

            sprintf(vlan_para_string,RTP_VLAN_INFO_FORMAT,g_rtp_server_info.vlan_info);

         }

+

+        if(g_rtp_server_info.ssrc_mode == Rtp_Ssrc_specific)

+        {

+           sprintf(ssrc_para_string,RTP_SSRC_INFO_FORMAT,g_rtp_server_info.ssrc);

+        }

         sprintf(cmd,RTP_TO_CMD,   \

-        g_rtp_server_info.ip,vlan_para_string,g_rtp_server_info.port);       

+        ssrc_para_string, g_rtp_server_info.ip,vlan_para_string,g_rtp_server_info.port);       

         

-    //  LYINFLOG("start to rtp play: cmd is %s",cmd);

+        LYINFLOG("start to rtp play: cmd is %s",cmd);

         system(cmd);    

     }

     return NULL;

@@ -275,6 +285,17 @@
     LYINFLOG("lynq_set_rtp_param suc: clockrate is %d, channels is %d, latency is %d", clock_rate, channels, latency);

     return RESULT_OK;  

 }

+int lynq_set_call_rtp_ssrc(const LYNQ_Rtp_Ssrc_Mode ssrc_mode,const unsigned int ssrc)

+{

+    if(ssrc_mode < Rtp_Ssrc_random || ssrc_mode > Rtp_Ssrc_specific)

+    {

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    g_rtp_server_info.ssrc_mode = ssrc_mode;

+    g_rtp_server_info.ssrc = ssrc ;

+    LYINFLOG("%s suc: param is %d %d", __func__, ssrc_mode, ssrc);

+    return RESULT_OK;

+}

 /*get*/

 LYNQ_Audio_Mode lynq_get_voice_audio_mode()

 {

@@ -355,3 +376,16 @@
 

     return RESULT_OK;  

 }

+int lynq_get_call_rtp_ssrc(int* ssrc_mode, unsigned int* ssrc)

+{

+    if(ssrc_mode == NULL || ssrc ==NULL)

+    {

+        LYERRLOG("input parameter is NULL");

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    

+    *ssrc_mode = g_rtp_server_info.ssrc_mode;

+    *ssrc = g_rtp_server_info.ssrc ;   

+    

+    return RESULT_OK;

+}

diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index 7fac4a6..460eb9c 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -71,10 +71,12 @@
 * @brief mark data send request mutex
 */
 static pthread_mutex_t g_lynq_data_sendto_mutex;
-
+/*This value data the state of the wait*/
 static int data_waiting_status = 0;
-
+/*The value indicates that 8085 error occurs in data*/
 static int data_invaild_error = 0;
+/*This value ensure the data call timing is correct*/
+static int data_timelimit = 0;
 
 /**g_lynq_data_init_flag
 * @brief mark data initialization state
@@ -381,6 +383,7 @@
     int resp_type;
     int urcid;
     int slot_id;
+    int check_count = 0;
 
     int pdnState = 0;
     char apn[LYNQ_APN_MAX_LEN];
@@ -460,8 +463,20 @@
                 LYDBGLOG("data call state:%d",lynq_data_call);
                 if(lynq_data_call==1)
                 {
+                    while (data_timelimit == 0)
+                    {
+                        LYINFLOG("client not ready to wait");
+                        for (check_count = 0;check_count < 500;check_count++)
+                        {
+                            /*wait 10ms*/
+                            usleep(10*1000);
+                        }
+                        LYERRLOG("client still without res");
+                        break;
+                    }
                     sendSignalDataCallStateChange();
                     lynq_data_call = 0;
+                    data_timelimit = 0;
                 }
             }
             else
@@ -486,8 +501,20 @@
                 LYDBGLOG("data call state:%d",lynq_data_call);
                 if(lynq_data_call==1)
                 {
+                    while (data_timelimit == 0)
+                    {
+                        LYINFLOG("client not ready to wait");
+                        for (check_count = 0;check_count < 500;check_count++)
+                        {
+                            /*wait 10ms*/
+                            usleep(10*1000);
+                        }
+                        LYERRLOG("client still without res");
+                        break;
+                    }
                     sendSignalDataCallStateChange();
                     lynq_data_call = 0;
+                    data_timelimit = 0;
                 }
             }
             break;
@@ -627,6 +654,7 @@
         LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
         return -1;
     }
+    lynq_data_call = 1;
     pthread_mutex_lock(&g_lynq_data_sendto_mutex);
     if(send_request(lynq_client_sockfd,&client)==-1)
     {
@@ -638,9 +666,9 @@
     pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
     JumpHeader(p,&resp_type,&request,&slot_id,&error);
     LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
-    lynq_data_call = 1;
     if(error==0)
     {
+        data_timelimit = 1;
         if (waitDataCallstateChange(60000) == ETIMEDOUT) // 60s
         {
             error = LYNQ_E_TIME_OUT;
@@ -776,6 +804,7 @@
         LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
         return -1;
     }
+    lynq_data_call = 1;
     pthread_mutex_lock(&g_lynq_data_sendto_mutex);
     if(send_request(lynq_client_sockfd,&client)==-1)
     {
@@ -787,9 +816,9 @@
     pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
     JumpHeader(p,&resp_type,&request,&slot_id,&error);
     LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
-    lynq_data_call = 1;
     if(error==0)
     {
+        data_timelimit = 1;   
         if(waitDataCallstateChange(60000)==ETIMEDOUT)//60s
         {
             error = LYNQ_E_TIME_OUT;
diff --git a/src/lynq/lib/liblynq-data/makefile b/src/lynq/lib/liblynq-data/makefile
index 53ed1d4..5d8598d 100755
--- a/src/lynq/lib/liblynq-data/makefile
+++ b/src/lynq/lib/liblynq-data/makefile
@@ -5,11 +5,7 @@
                 -std=gnu++14 \
                 -g -Os \
                 -flto \
-                -DRIL_SHLIB \
-                -DATCI_PARSE \
                 -fPIC \
-                -DKEEP_ALIVE \
-                -DECALL_SUPPORT \
                 -fpermissive \
 
 
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
index 3565676..4d79d0f 100755
--- a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
@@ -42,6 +42,8 @@
  */

 static int g_lynq_gnss_init_flag = 0;

 

+static int g_lynq_gnss_calback_flag = 0;

+

 /**

  * @brief mark gnss raw meas state

  * 0: deinit state

@@ -56,6 +58,12 @@
         RLOGD("init twice is not allowed");

         return -1;

     }

+    if (g_lynq_gnss_calback_flag == 0)

+    {

+        RLOGD("Plz Reg callback before init");

+        return -1;

+    }

+    g_lynq_gnss_init_flag = 1;

     gpshal_set_gps_state_intent(GPSHAL_STATE_INIT);

     gpshal2mnl_gps_init();

     g_gpshal_ctx.mnl_retry_timer = mnldinf_init_timer(gpshal_mnl_retry_routine);

@@ -82,11 +90,17 @@
         RLOGD("For cbs save error\r\n");

         return -1;

     }

+    g_lynq_gnss_calback_flag = 1;

     return 0;

 }

 

 int lynq_gnss_deinit(void)

 {

+    if (g_lynq_gnss_init_flag == 0)

+    {

+        RLOGD("deinit twice is not allowed");

+        return -1;

+    }

     timer_t retry_timer;

     gpshal_set_gps_state_intent(GPSHAL_STATE_CLEANUP);

     gpshal2mnl_gps_cleanup();

@@ -101,6 +115,8 @@
         return -1;

     }

     RLOGD("timer de init end");

+    g_lynq_gnss_calback_flag = 0;

+    g_lynq_gnss_init_flag = 0;

     return 0;

 }

 

diff --git a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
index 5b2ce3c..ba7c1f4 100755
--- a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
+++ b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
@@ -52,6 +52,12 @@
                       * Range [-23, 40], INT_MAX means invalid/unreported.*/

 }signalStrength_t;

 

+typedef enum { 

+    NETWORK_RADIO_ON_TYPE_CFUN_0=0,  

+    NETWORK_RADIO_ON_TYPE_NORMAL_MODE=1,

+    NETWORK_RADIO_ON_TYPE_FLIGHT_MODE=4,

+}lynq_network_radio_on_type;  

+

 int lynq_network_init(int utoken);

 int lynq_network_deinit(void);

 int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc);

@@ -65,7 +71,7 @@
 int lynq_set_unsol_cell_info_listrate(const int rate);

 int lynq_set_band_mode(const int bandmode);

 int lynq_query_available_bandmode(int availBanMode[]);

-int lynq_radio_on(const int data);

+int lynq_radio_on(const lynq_network_radio_on_type type);

 int lynq_query_radio_state(int *radio_state);

 int lynq_query_radio_tech(int* radioTech);

 int lynq_solicited_signal_strength(signalStrength_t *solSigStren);

diff --git a/src/lynq/lib/liblynq-network/lynq_network.cpp b/src/lynq/lib/liblynq-network/lynq_network.cpp
index 98e33f6..dd45fdc 100755
--- a/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -757,21 +757,30 @@
     return RESULT_OK;                

 }

 

-int lynq_radio_on(const int data)

+int lynq_radio_on(const lynq_network_radio_on_type type)

 {     

     if(g_module_init_flag != MODULE_RUNNING)

     {

         LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

         return LYNQ_E_CONFLICT;

     }

-    if (data < 0 || data > 1)

+    if (type != NETWORK_RADIO_ON_TYPE_CFUN_0  && type != NETWORK_RADIO_ON_TYPE_NORMAL_MODE && type!=NETWORK_RADIO_ON_TYPE_FLIGHT_MODE)

     {

-        LYERRLOG("%s parameter %d error",__func__,data);  

+        LYERRLOG("%s parameter %d error",__func__,type);  

         return LYNQ_E_PARAMETER_ANONALY;

     }     

     

     Parcel* p=NULL;      

-    int ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",data);

+    int ret;

+

+    if(type==NETWORK_RADIO_ON_TYPE_CFUN_0)

+    {

+        ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN=0");

+    }

+    else 

+    {

+        ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",(type==NETWORK_RADIO_ON_TYPE_NORMAL_MODE));

+    }

 

     if(ret!=RESULT_OK)

     {

@@ -779,7 +788,7 @@
         return ret;  

     }       

 

-    LYINFLOG("%s set %d suc",__func__,data);  

+    LYINFLOG("%s set %d suc",__func__,type);  

     delete p;

     return RESULT_OK;  

 }

diff --git a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
index 0a2771d..1e8391b 100755
--- a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
+++ b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
@@ -49,6 +49,7 @@
 typedef enum {
     LYNQ_WIFI_STATUS_DISCONNECT = 0,
     LYNQ_WIFI_STATUS_CONNECT,
+    LYNQ_WIFI_SERVICE_ABNORMAL,
 }lynq_wifi_ap_status_s;
 
 typedef struct ap_info
@@ -186,13 +187,20 @@
     LYNQ_WIFI_STA_STATUS_DISCONNECT = 0,
     LYNQ_WIFI_STA_STATUS_CONNECT,
     LYNQ_WIFI_STA_STATUS_SCAN_RESULT,    //finish sta scan 
+    LYNQ_WIFI_STA_STATUS_CONNECT_FAIL,
+    LYNQ_WIFI_STA_SERVICE_ABNORMAL,
+    LYNQ_WIFI_STATUS_EGNORE,
 }lynq_wifi_sta_status_s;
 typedef enum
 {
     LYNQ_TIME_OUT = 0,
+    LYNQ_UNSPECIFIED_REASON,
+    LYNQ_AUTHENTICATION_NO_LONGER_VALID,
     LYNQ_PSW_ERROR,
     LYNQ_AUTH_ERROR,
+    LYNQ_AP_UNABLE_HANDLE,
     LYNQ_NOT_FIND_AP,
+    LYNQ_WAIT_CONNECT_ACTIVE,
 }error_number_s;
 
 typedef void(*STA_CALLBACK_FUNC_PTR)(void *priv, lynq_wifi_sta_status_s status, error_number_s number);
diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index 70f7ac2..e6c394b 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -22,6 +22,8 @@
 #include <netdb.h>
 #include <ifaddrs.h>
 #include "log/log.h"
+#include <sys/time.h>
+#include <asm/errno.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -63,11 +65,17 @@
 const char * state_scan_result = "CTRL-EVENT-SCAN-RESULTS";
 const char * STATE_COMPLETED = "COMPLETED";
 
+const char * cmd_ping = "PING";
+const char * rsp_pong = "PONG";
+const int SLEEP_TIME_ON_IDLE = 100 * 1000; // usecond
+const int MAX_IDLE_COUNT = 600; // 60s
+
 struct local_wpa_ctrl{
     struct wpa_ctrl *ctrl;
     pthread_mutex_t mutex;
 };
 
+
 static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static struct local_wpa_ctrl * g_lynq_wpa_ctrl[2] = {0};
@@ -86,6 +94,75 @@
     int net_no;
 }curr_status_info;
 
+typedef enum {
+    INNER_STA_STATUS_INIT = 0,
+    INNER_STA_STATUS_CONNECTING,
+    INNER_STA_STATUS_ASSOCIATING,
+    INNER_STA_STATUS_ASSOCIATED,
+    INNER_STA_STATUS_CONNECTED,
+    INNER_STA_STATUS_DISCONNECTING,
+    INNER_STA_STATUS_DISCONNECTED,
+    INNER_STA_STATUS_CANCEL,
+}inner_sta_status_s;
+
+static pthread_cond_t s_global_check_cond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t s_global_check_mutex = PTHREAD_MUTEX_INITIALIZER;
+static inner_sta_status_s s_sta_status = INNER_STA_STATUS_INIT;
+static error_number_s s_sta_error_number = -1;
+static char s_sta_current_connecting_ssid[64] = {0};
+static struct timespec s_sta_connect_timeout;
+const int MAX_CONNNECT_TIME = 15; // second
+pthread_t g_global_watcher_pid = 0;
+static int s_service_invoke_timeout_cnt=0;
+const int FAKE_MAX_INT_VALUE = 99999;
+
+static void notify_service_invoke_fail(int error)
+{
+    struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
+    pthread_mutex_lock(&s_global_check_mutex);
+    if (error == -2) //timeout
+    {
+        s_service_invoke_timeout_cnt++;
+        if (s_service_invoke_timeout_cnt > 10)
+        {
+            pthread_cond_signal(&s_global_check_cond);
+        }
+    }
+    else if (error == -1)
+    {
+        // check if can connect wpa service
+        lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[0]);
+        if (lynq_wpa_ctrl == NULL)
+        {
+            s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
+            pthread_cond_signal(&s_global_check_cond);
+        }
+        wpa_ctrl_close(lynq_wpa_ctrl);
+        lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[1]);
+        if (lynq_wpa_ctrl == NULL)
+        {
+            s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
+            pthread_cond_signal(&s_global_check_cond);
+        }
+        wpa_ctrl_close(lynq_wpa_ctrl);
+    }
+
+    pthread_mutex_unlock(&s_global_check_mutex);
+}
+
+static void check_tether_and_notify()
+{
+    RLOGD("check_tether_and_notify called");
+    if (0 == system("ifconfig | grep tether"))
+    {
+        return;
+    }
+    pthread_mutex_lock(&s_global_check_mutex);
+    s_service_invoke_timeout_cnt = FAKE_MAX_INT_VALUE;
+    pthread_cond_signal(&s_global_check_cond);
+    pthread_mutex_unlock(&s_global_check_mutex);
+}
+
 static int local_wpa_ctrl_request(struct local_wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
                             char *reply, size_t *reply_len,
                                   void (*msg_cb)(char *msg, size_t len))
@@ -98,6 +175,10 @@
     pthread_mutex_lock(&ctrl->mutex);
     ret = wpa_ctrl_request(ctrl->ctrl, cmd, cmd_len, reply, reply_len, msg_cb);
     pthread_mutex_unlock(&ctrl->mutex);
+    if (ret != 0)
+    {
+        notify_service_invoke_fail(ret);
+    }
     return ret;
 }
 
@@ -180,67 +261,151 @@
 
 static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len);
 
+static int check_connection(struct wpa_ctrl * wpa_ctrl)
+{
+    size_t reply_len = MAX_RET;
+    char cmd_reply[MAX_RET]={0};
+    int ret;
+
+    RLOGD("check_connection [%p]", wpa_ctrl);
+    ret = wpa_ctrl_request(wpa_ctrl, cmd_ping, strlen(cmd_ping), cmd_reply, &reply_len, NULL);
+
+    if (ret != 0 || reply_len < 4 || memcmp(cmd_reply, rsp_pong, 4) != 0)
+    {
+        RLOGE("check_connection error: ctrl [%p], ret [%d], reply_len [%d], rsp [%s]", wpa_ctrl, ret, reply_len, cmd_reply);
+        if (ret != 0)
+        {
+            notify_service_invoke_fail(ret);
+        }
+        return -1;
+    }
+
+    return 0;
+}
+
+/**
+ * @brief check_pending_msg
+ * @param lynq_wpa_ctrl
+ * @return 1 has msg, 0 no msg, -1 error
+ */
+static int check_pending_msg(struct wpa_ctrl ** pp_lynq_wpa_ctrl, int type, int* idle_count, int *started_flag)
+{
+    int ret;
+
+    if (*pp_lynq_wpa_ctrl == NULL) // need connect
+    {
+        *pp_lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[type]); //@todo temp change
+        if (*pp_lynq_wpa_ctrl == NULL)
+        {
+            usleep(SLEEP_TIME_ON_IDLE);
+            return -1;
+        }
+
+        ret = wpa_ctrl_attach(*pp_lynq_wpa_ctrl);
+        if (ret == 0) // attach success
+        {
+            *started_flag = 1;
+        }
+        else
+        {
+            RLOGE("[wifi error]sta watch thread wpa_ctrl_attach fail");
+            wpa_ctrl_close(*pp_lynq_wpa_ctrl);
+            *pp_lynq_wpa_ctrl = NULL;
+            *idle_count = 0;
+            notify_service_invoke_fail(-2);
+            usleep(SLEEP_TIME_ON_IDLE);
+            return -1;
+        }
+    }
+
+    ret = wpa_ctrl_pending(*pp_lynq_wpa_ctrl);
+    if ( ret == 0) // no pending messages
+    {
+        usleep(SLEEP_TIME_ON_IDLE);
+        *idle_count += 1;
+        if (*idle_count > MAX_IDLE_COUNT)
+        {
+            if (check_connection(*pp_lynq_wpa_ctrl) != 0)
+            {
+                wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
+                wpa_ctrl_close(*pp_lynq_wpa_ctrl);
+                *pp_lynq_wpa_ctrl = NULL;
+                *idle_count = 0;
+                return -1;
+            }
+            *idle_count = 0;
+        }
+        return 0;
+    }
+    else if ( ret == -1) // on error
+    {
+        RLOGE("[wifi error]sta wpa_ctrl_pending");
+        wpa_ctrl_detach(*pp_lynq_wpa_ctrl);
+        wpa_ctrl_close(*pp_lynq_wpa_ctrl);
+        *pp_lynq_wpa_ctrl = NULL;
+        *idle_count = 0;
+        notify_service_invoke_fail(ret);
+        return -1;
+    }
+
+    *idle_count = 0;
+    return 1;
+}
+
 static void APWatcherThreadProc() {
     size_t len = MAX_RET;
     char msg_notify[MAX_RET];
+    int idle_count = 0;
 
     struct wpa_ctrl *lynq_wpa_ctrl = NULL;
     g_ap_watcher_stop_flag = 0;
 
     while (g_ap_watcher_stop_flag == 0)
     {
-        if (lynq_wpa_ctrl == NULL)
-	{
-            lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[CTRL_AP]); //@todo temp change
-            if (lynq_wpa_ctrl == NULL)
-	    {
-                usleep(100*1000);
-                continue;
+        if (check_pending_msg(&lynq_wpa_ctrl, CTRL_AP, &idle_count, &g_ap_watcher_started_flag) != 1)
+        {
+            if (g_ap_callback_func != NULL && idle_count == MAX_IDLE_COUNT - 100 )
+            {
+                check_tether_and_notify();
             }
 
-            wpa_ctrl_attach(lynq_wpa_ctrl);
-            g_ap_watcher_started_flag = 1;
-        }
-
-        if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl))
-	{
-            usleep(100*1000);
             continue;
         }
+
         memset(msg_notify, 0, MAX_RET);
         len = MAX_RET;
         if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
-	{
+        {
             msg_notify[len+1] = '\0';
-            RLOGD("STAWatcherThreadProc ap------> %s\n", msg_notify);
-//you.chen change for tv-box start
+            RLOGD("APWatcherThreadProc ap------> %s\n", msg_notify);
+            //you.chen change for tv-box start
             if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
-	    {
+            {
                 if (g_ap_callback_func != NULL)
                     g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
                 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
-		{
+                {
                     RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
                     if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
-		    {
+                    {
                         stopGBW();
                     }
                 }
             }
             else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
-	    {
+            {
                 if (g_ap_callback_func != NULL)
                     g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
                 if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
-		{
+                {
                     RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
                     if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
-		    {
+                    {
                         startGBW();
                     }
                 }
             }
-//you.chen add for tv-box end
+            //you.chen add for tv-box end
         } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
     } // end while (g_ap_watcher_stop_flag == 0)
     if (lynq_wpa_ctrl != NULL)
@@ -250,83 +415,214 @@
     }
 }
 
+static void inner_check_connect_error(const char * event_msg, lynq_wifi_sta_status_s state, error_number_s error_num)
+{
+    char * p;
+    const char * try_associat_flag = "Trying to associate";
+    const char * associated_flag = "Associated with ";
+
+    pthread_mutex_lock(&s_global_check_mutex);
+    if (s_sta_status < INNER_STA_STATUS_CONNECTING || s_sta_status >= INNER_STA_STATUS_CONNECTED) //not in connecting stage, egnore
+    {
+        pthread_mutex_unlock(&s_global_check_mutex);
+        return;
+    }
+
+    if (state == LYNQ_WIFI_STATUS_EGNORE)
+    {
+        if (strstr(event_msg, try_associat_flag) != NULL && strstr(event_msg, s_sta_current_connecting_ssid) != NULL) //associating request ssid
+        {
+            s_sta_status = INNER_STA_STATUS_ASSOCIATING;
+        }
+        else if (s_sta_status == INNER_STA_STATUS_ASSOCIATING && (p=strstr(event_msg, associated_flag)) != NULL)
+        {
+            s_sta_status = INNER_STA_STATUS_ASSOCIATED;
+        }
+    }
+    else if (state == LYNQ_WIFI_STA_STATUS_DISCONNECT)
+    {
+        s_sta_error_number = error_num;
+        if (s_sta_status >= INNER_STA_STATUS_ASSOCIATING && strstr(event_msg, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL && error_num != LYNQ_WAIT_CONNECT_ACTIVE)
+        {
+            s_sta_status = INNER_STA_STATUS_DISCONNECTED;
+            pthread_cond_signal(&s_global_check_cond);
+        }
+    }
+    else if (state == LYNQ_WIFI_STA_STATUS_CONNECT)
+    {
+        s_sta_status = INNER_STA_STATUS_CONNECTED;
+        pthread_cond_signal(&s_global_check_cond);
+    }
+    pthread_mutex_unlock(&s_global_check_mutex);
+}
+
+void get_state_error(const char* modify, lynq_wifi_sta_status_s* state, error_number_s* error)
+{
+    char *pReason;
+    *error = LYNQ_WAIT_CONNECT_ACTIVE;
+    if (strstr(modify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
+    {
+        *state = LYNQ_WIFI_STA_STATUS_SCAN_RESULT;
+        RLOGD("CTRL-EVENT-SCAN-RESULTS state:%d,error:%d\n",*state,*error);
+        return;
+    }
+
+    if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
+    {
+        *state = LYNQ_WIFI_STA_STATUS_CONNECT;
+        RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
+        return;
+    }
+
+    if (strstr(modify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
+    {
+        pReason = strstr(modify, "reason=");
+        if (pReason != NULL)
+        {
+            pReason += strlen("reason=");
+            if (memcmp(pReason, "CONN_FAILED", 11) == 0)
+            {
+                *error = LYNQ_TIME_OUT;
+            }
+            else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
+            {
+                *error = LYNQ_PSW_ERROR;
+            }
+            else 
+            {
+                *error = LYNQ_UNSPECIFIED_REASON;
+            }
+            *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+            RLOGD("CTRL-EVENT-SSID-TEMP-DISABLED state:%d,error:%d\n",*state,*error);
+            return;
+        }
+        else
+        {
+            *error = LYNQ_UNSPECIFIED_REASON;
+            *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+            return;
+        }
+
+    }
+
+    if (strstr(modify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
+    {
+        *error = LYNQ_NOT_FIND_AP;
+        *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+        RLOGD("CTRL-EVENT-NETWORK-NOT-FOUND state:%d,error:%d\n",*state,*error);
+        return;
+    }
+
+
+    if (strstr(modify, "CTRL-EVENT-ASSOC-REJECT") != NULL)
+    {
+        RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT\n");
+        pReason = strstr(modify, "status_code=");
+        if (pReason != NULL)
+        {
+            pReason += strlen("status_code=");
+            if (memcmp(pReason, "17", 2) == 0)
+            {
+                *error = LYNQ_AP_UNABLE_HANDLE;
+            }
+            else if (memcmp(pReason, "1",1) == 0)
+            {
+                *error = LYNQ_UNSPECIFIED_REASON;
+            }
+            else
+            {
+                *error = LYNQ_UNSPECIFIED_REASON;
+            }
+
+             *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+             RLOGD("CTRL-EVENT-ASSOC-REJECT BUT NOT STATUS_CODE NOT 1 or 17 state:%d,error:%d\n",*state,*error);
+             return;
+        }
+        else
+        {
+            RLOGD("FIND CTRL EVENT : CTRL-EVENT-ASSOC-REJECT BUT NOT FOUND STATUS_CODE\n");
+            *error = LYNQ_UNSPECIFIED_REASON;
+            *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+            RLOGD("CTRL-EVENT-ASSOC-REJECT state:%d,error:%d\n",*state,*error);
+            return;
+        }
+    }
+
+    if (strstr(modify, "CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER") != NULL)
+    {
+        RLOGD("FIND CTRL EVENT : CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER\n");
+        *error = LYNQ_AUTHENTICATION_NO_LONGER_VALID;
+        *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+        RLOGD("CTRL-EVENT-SAE-UNKNOWN-PASSWORD-IDENTIFIER state:%d,error:%d\n",*state,*error);
+        return;
+    }
+
+    if (strstr(modify, "CTRL-EVENT-DISCONNECTED") != NULL)
+    {
+        RLOGD("FIND CTRL EVENT : CTRL-EVENT-DISCONNECTED\n");
+        *error = LYNQ_WAIT_CONNECT_ACTIVE;
+        *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+        RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
+        return;
+    }
+
+    RLOGD("EVENT : %s\n", modify);
+    *error = LYNQ_UNSPECIFIED_REASON;
+    *state = LYNQ_WIFI_STATUS_EGNORE;
+    RLOGD("LAST : STA state:%d,error:%d\n",*state,*error);
+    return;
+
+}
+
+static void notify_connect_status(lynq_wifi_sta_status_s state, error_number_s error)
+{
+    if (g_sta_callback_func != NULL && state != LYNQ_WIFI_STATUS_EGNORE)
+    {
+        RLOGD("STAWatcherThreadProc callback begin ------> %d %d\n", state, error);
+        g_sta_callback_func(g_sta_callback_priv, state, error);
+        RLOGD("STAWatcherThreadProc callback end ------> %d %d\n", state, error);
+    }
+}
+
 static void STAWatcherThreadProc() {
     size_t len = MAX_RET;
     char msg_notify[MAX_RET];
-    char *pReason;
     error_number_s error;
+    lynq_wifi_sta_status_s state;
+    int idle_count = 0;
 
     struct wpa_ctrl *lynq_wpa_ctrl = NULL;
     g_sta_watcher_stop_flag = 0;
 
+    RLOGD("STAWatcherThreadProc thread started ------");
     while (g_sta_watcher_stop_flag == 0)
     {
-        if (lynq_wpa_ctrl == NULL)
-	{
-            lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[CTRL_STA]);
-            if (lynq_wpa_ctrl == NULL)
-	    {
-                usleep(100*1000);
-                continue;
-            }
-
-            wpa_ctrl_attach(lynq_wpa_ctrl);
-            g_sta_watcher_started_flag = 1;
-        }
-
-        if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl))
-	{
-            usleep(100*1000);
+        if (check_pending_msg(&lynq_wpa_ctrl, CTRL_STA, &idle_count, &g_sta_watcher_started_flag) != 1)
+        {
             continue;
         }
+
         memset(msg_notify, 0, MAX_RET);
         len = MAX_RET;
         if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
-	{
+        {
             msg_notify[len+1] = '\0';
             RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
             if (strstr(msg_notify, state_scan_result) != NULL)
-	    {
+            {
                 g_sta_scan_finish_flag = 1;
             }
 
             if (g_sta_callback_func == NULL)
-	    {
+            {
                 continue;
             }
-            error = -1;
-            if (strstr(msg_notify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
-	    {
-                g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_SCAN_RESULT, error);
-            }
-            else if (strstr(msg_notify, "CTRL-EVENT-CONNECTED") != NULL)
-	    {
-                g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_CONNECT, error);
-            }
-            else if (strstr(msg_notify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
-	    {
-                pReason = strstr(msg_notify, "reason=");
-                if (pReason != NULL)
-		{
-                    pReason += strlen("reason=");
-                    if (memcmp(pReason, "CONN_FAILED", 11) == 0)
-		    {
-                        error = LYNQ_TIME_OUT;
-                    }
-                    else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
-		    {
-                        error = LYNQ_PSW_ERROR;
-                    }
-                    g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, error);
-                }
-            }
-            else if (strstr(msg_notify, "CTRL-EVENT-DISCONNECTED") != NULL)
-	    {
-                g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, error);
-            }
-            else if (strstr(msg_notify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
-	    {
-                g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, LYNQ_NOT_FIND_AP);
+            get_state_error(msg_notify,&state,&error);
+            notify_connect_status(state, error);
+
+            if (state != LYNQ_WIFI_STA_STATUS_SCAN_RESULT)
+            {
+                inner_check_connect_error(msg_notify, state, error);
             }
         }
     }
@@ -337,6 +633,128 @@
     }
 }
 
+// this thread will not exit when lynq_wifi_disable called,to avoid dead lock,take care
+static void GlobalWatcherThreadProc()
+{
+    int ret, connect_timeout, service_abnormal;
+    error_number_s error_num = -1;
+    inner_sta_status_s sta_status;
+    scan_info_s *scan_list = NULL;
+    int i, scan_len=0;
+    char connecting_ssid[64];
+    struct timeval now;
+
+    RLOGD("GlobalWatcherThreadProc start to run");
+
+    while (1)
+    {
+        pthread_mutex_lock(&s_global_check_mutex);
+        pthread_cond_wait(&s_global_check_cond,&s_global_check_mutex);
+        if (s_sta_status == INNER_STA_STATUS_CONNECTED)
+        {
+            pthread_mutex_unlock(&s_global_check_mutex);
+            usleep(50*1000);
+            notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
+            continue;
+        }
+
+        connect_timeout = 0;
+        service_abnormal = 0;
+        if (s_sta_status >= INNER_STA_STATUS_CONNECTING && s_sta_status < INNER_STA_STATUS_CONNECTED)
+        {
+            while (1)
+            {
+                ret = pthread_cond_timedwait(&s_global_check_cond, &s_global_check_mutex, &s_sta_connect_timeout);
+                if (ret == ETIME)
+                {
+                    connect_timeout = 1;
+                }
+                else if (ret != 0)
+                {
+                    gettimeofday(&now,NULL);
+                    if (now.tv_sec < s_sta_connect_timeout.tv_sec) //time not arrive
+                    {
+                        usleep(SLEEP_TIME_ON_IDLE);
+                        continue;
+                    }
+                    connect_timeout = 1;
+                }
+                sta_status = s_sta_status;
+                error_num = s_sta_error_number;
+                s_sta_status = INNER_STA_STATUS_INIT;
+                strcpy(connecting_ssid, s_sta_current_connecting_ssid);
+                memset(&s_sta_connect_timeout, 0, sizeof (s_sta_connect_timeout));
+                memset(&s_sta_current_connecting_ssid, 0, sizeof (s_sta_current_connecting_ssid));
+                break;
+            }
+        }
+        if (s_service_invoke_timeout_cnt > 10)
+        {
+            service_abnormal = 1;
+            s_service_invoke_timeout_cnt = 0;
+        }
+        pthread_mutex_unlock(&s_global_check_mutex);
+
+        if (service_abnormal == 1)
+        {
+            sleep(1);
+            RLOGE("wpa service is abnormal info app to exit");
+            notify_connect_status(LYNQ_WIFI_STA_SERVICE_ABNORMAL, -1);
+            if (g_ap_callback_func != NULL)
+            {
+                g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_SERVICE_ABNORMAL);
+            }
+            sleep(FAKE_MAX_INT_VALUE); // wait process to exit
+        }
+
+        if (sta_status == INNER_STA_STATUS_CANCEL)
+        {
+            continue;
+        }
+        else if (sta_status == INNER_STA_STATUS_CONNECTED)
+        {
+            notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
+        }
+        else if (connect_timeout == 0 && error_num == LYNQ_NOT_FIND_AP) // not found ap maybe mismatch auth
+        {
+            if (0 == lynq_get_scan_list(0, &scan_list, &scan_len) && NULL != scan_list) // if not found, but scan result exist, maybe auth error
+            {
+                for(i=0; i < scan_len;i++)
+                {
+                    if (strcmp(scan_list[i].ssid, connecting_ssid) == 0)
+                    {
+                        error_num = LYNQ_AUTH_ERROR;
+                        break;
+                    }
+                }
+                free(scan_list);
+            }
+            notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
+        }
+        else if (connect_timeout == 0)
+        {
+            notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, error_num);
+        }
+        else // wait timeout
+        {
+            if (0 != lynq_get_sta_status(LYNQ_WIFI_INTERFACE_0, &sta_status)) // get status fail
+            {
+                ; // wpa service abnormal
+            }
+            else if (sta_status == LYNQ_WIFI_STA_STATUS_ENABLE) // connect ok
+            {
+                RLOGD("GlobalWatcherThreadProc notify connected");
+                notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT, 0);
+            }
+            else
+            {
+                RLOGD("GlobalWatcherThreadProc notify timeout");
+                notify_connect_status(LYNQ_WIFI_STA_STATUS_CONNECT_FAIL, LYNQ_TIME_OUT);
+            }
+        }
+    } // while (1)
+}
+
 int lynq_wifi_enable(void)
 {
     int ret = 0;
@@ -413,7 +831,7 @@
     {
         ret=pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL);
         if(ret<0)
-	{
+        {
             RLOGE("[wifi error]creat APWatcherThreadProc fail");
             ret = -1;
             goto out_enable;
@@ -424,19 +842,30 @@
     if (g_sta_watcher_pid == 0 ) {
         ret=pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL);
         if(ret<0)
-	{
+        {
             RLOGE("[wifi error]creat STAWatcherThreadProc fail");
             ret = -1;
             goto out_enable;
         }
     }
 
+    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);
+        if(ret<0)
+        {
+            RLOGE("[wifi error]creat GlobalWatcherThreadProc fail");
+            ret = -1;
+            goto out_enable;
+        }
+    }
+
     RLOGD("creat STAWatcherTheradProc susccs");
     for (i=0; i<10; i++)
     {
         usleep(300*1000);
         if (g_ap_watcher_started_flag == 1 && g_sta_watcher_started_flag == 1)
-	{
+        {
             break;
         }
     }
@@ -834,31 +1263,31 @@
 static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
     if (flag != NULL)
     {
-        if (strstr( flag, "WPA2-PSK") != NULL)
-	{
+        if ( strstr(flag, "SHA256") != NULL || strstr(flag,"WPA2-SAE") != NULL || strstr(flag,"SAE-H2E") != NULL)
+        {
+            return LYNQ_WIFI_AUTH_WPA3_PSK;
+        }else if ( strstr( flag,"SAE-CCMP") != NULL )
+        {
+            return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
+        }else if (strstr( flag, "WPA2-PSK") != NULL)
+        {
             return LYNQ_WIFI_AUTH_WPA2_PSK;
         }
         else if (strstr( flag, "WPA-PSK") != NULL)
-	{
+        {
             return LYNQ_WIFI_AUTH_WPA_PSK;
         }
         else if (strstr( flag, "WEP") != NULL)
-	{
+        {
             return LYNQ_WIFI_AUTH_WEP;
         }
         else if (strstr( flag, "NONE") != NULL)
-	{
+        {
             return LYNQ_WIFI_AUTH_OPEN;
         }
         else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
-	{
+        {
             return LYNQ_WIFI_AUTH_OPEN;
-	}else if ( strstr(flag, "SHA256") == 0 )
-        {
-            return LYNQ_WIFI_AUTH_WPA3_PSK;
-        }else if ( strstr( flag,"SAE-CCMP") == 0 )
-        {
-            return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
         }
     }
 
@@ -886,6 +1315,7 @@
     return -1;
 }
 
+static int inner_get_network_auth(int interface, int net_no, lynq_wifi_auth_s *auth);
 static int inner_get_status_info(int interface, curr_status_info *curr_state) {
     int i, count;
     char *p;
@@ -916,24 +1346,24 @@
     for(i=0; i < count; i++)
     {
         if (curr_state->ap != NULL)
-	{
+        {
             p = strstr(split_lines[i], FLAG_SBSID);
             if (p != NULL)
-	    {
+            {
                 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
                 ret = 0;
                 continue;
             }
             p = strstr(split_lines[i], FLAG_SSID);
             if (p != NULL)
-	    {
+            {
                 inner_copy_ssid(curr_state->ap->ap_ssid, p + strlen(FLAG_SSID), sizeof (curr_state->ap->ap_ssid));
                 ret = 0;
                 continue;
             }
             p = strstr(split_lines[i], FLAG_KEY_MGMT);
             if (p != NULL)
-	    {
+            {
                 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
                 RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
                 ret = 0;
@@ -941,24 +1371,24 @@
             }
             p = strstr(split_lines[i], FLAG_FREQ);
             if (p != NULL)
-	    {
+            {
                 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
                 ret = 0;
                 continue;
             }
             p = strstr(split_lines[i], FLAG_IPADDR);
             if (p != NULL)
-	    {
+            {
                 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
                 ret = 0;
                 continue;
             }
         } // end  if (ap != NULL)
         if (curr_state->state != NULL)
-	{
+        {
             p = strstr(split_lines[i], FLAG_STATE);
             if (p != NULL)
-	    {
+            {
                 strcpy(curr_state->state, p + strlen(FLAG_STATE));
                 ret = 0;
                 continue;
@@ -966,17 +1396,21 @@
 
         } //end else if (state != NULL)
         if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
-	{
+        {
             ret = 0;
             curr_state->net_no = atoi(p + strlen(FLAG_ID));
             RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
         }
     }
 
+    if (ret == 0 && curr_state->ap != NULL && curr_state->net_no >= 0) // auth may not right when add wpa3
+    {
+        inner_get_network_auth(interface, curr_state->net_no, &curr_state->ap->auth);
+    }
+
     return ret;
 }
 
-
 int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
 {
     RLOGD("enter lynq_wifi_ap_ssid_set");
@@ -1387,7 +1821,7 @@
 	{
             sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
             sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
-            sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
+            sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt SAE", AP_NETWORK_0);
             sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
 
             DO_OK_FAIL_REQUEST(lynq_auth_cmd);
@@ -1512,6 +1946,8 @@
     sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
     DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
 
+    check_tether_and_notify();
+
     return 0;
 }
 
@@ -1748,24 +2184,33 @@
     if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
     {
         if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
-	{
+        {
             if (strcmp(lynq_proto_str, "RSN") == 0)
-	    {
+            {
                 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
                 return 0;
             }
+            else if (strcmp(lynq_proto_str, "WPA") == 0) // need compare when wpa3 supported
+            {
+                return 0;
+            }
         }
     }
+    else if (*auth == LYNQ_WIFI_AUTH_OPEN || *auth == LYNQ_WIFI_AUTH_WEP)
+    {
+        return 0;
+    }
+
     if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
     {
-	RLOGE("check ieee80211w error\n");
+        RLOGE("check ieee80211w error\n");
         return -1;
     }
     if ( strncmp(lynq_auth_str,"1",1) == 0 )
     {
 
-       *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
-       return 0;
+        *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
+        return 0;
     }else if( strncmp(lynq_auth_str,"2",1) == 0 )
     {
 
@@ -1773,6 +2218,7 @@
         return 0;
     }else
     {
+        RLOGE("check ieee80211w error, not 1 or 2\n");
         *auth = -1;
         return -1;
     }
@@ -2082,7 +2528,7 @@
     }
 
     lynq_wifi_sta_start_scan(idx);
-
+    sleep(2);
     if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
     {
         if (NULL != scan_list)
@@ -2199,14 +2645,12 @@
         }	
 	case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
 	{
-            //sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
-            sprintf(lynq_auth_cmd,"wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 set_network %d ieee80211w 1",net_no);
+            sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 1",net_no);
             sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt SAE WPA-PSK",net_no);
             sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
             sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
             
-	   // DO_OK_FAIL_REQUEST(lynq_auth_cmd);
-	    system(lynq_auth_cmd);
+	    DO_OK_FAIL_REQUEST(lynq_auth_cmd);
             DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
             DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
             DO_OK_FAIL_REQUEST(lynq_psk_cmd);
@@ -2215,15 +2659,15 @@
 	}
 	case LYNQ_WIFI_AUTH_WPA3_PSK:
 	{
-           // sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
-            sprintf(lynq_auth_cmd,"wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 set_network %d ieee80211w 1",net_no);
+            sprintf(lynq_auth_cmd,"SET_NETWORK %d ieee80211w 2",net_no);
             sprintf(lynq_ket_mgmt_cmd,"SET_NETWORk %d key_mgmt SAE",net_no);
             sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
             sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
             
-	   // DO_OK_FAIL_REQUEST(lynq_auth_cmd);
-            system(lynq_auth_cmd);
+	    DO_OK_FAIL_REQUEST(lynq_auth_cmd);
+	    RLOGD("inner_set_sta_auth_psw before set SAE CMD");
             DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
+	    RLOGD("inner_set_sta_auth_psw after set SAE CMD");
             DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
             DO_OK_FAIL_REQUEST(lynq_psk_cmd);
 
@@ -2269,6 +2713,9 @@
     int count, net_no, index;
     int net_no_list[128];
     lynq_wifi_auth_s net_auth;
+    curr_status_info curr_state;
+    ap_info_s ap_info;
+    char status[64];
 
     if (ssid == NULL || *ssid == '\0')
     {
@@ -2279,39 +2726,77 @@
     if (LYNQ_WIFI_AUTH_OPEN != auth)
     {
         if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
-	{
+        {
             RLOGE("bad password\n");
             return -1;
         }
     }
 
+
+    pthread_mutex_lock(&s_global_check_mutex);
+    if (s_sta_status != INNER_STA_STATUS_INIT)
+    {
+        s_sta_status = INNER_STA_STATUS_CANCEL;
+        pthread_cond_signal(&s_global_check_cond);
+    }
+    pthread_mutex_unlock(&s_global_check_mutex);
+
     CHECK_IDX(idx, CTRL_STA);
+    CHECK_WPA_CTRL(CTRL_STA);
 
     net_no = -1;
-    count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
+    memset(&ap_info, 0, sizeof (ap_info));
+    memset(status, 0, sizeof (status));
 
-    for (index=0; index < count; index++)
+    curr_state.ap = &ap_info;
+    curr_state.state = status;
+
+    if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
     {
-        net_auth = -1;
-        if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
-	{
-            net_no = net_no_list[index];
-            break;
+        if (strcmp(status, STATE_COMPLETED) == 0 && strcmp(ap_info.ap_ssid, ssid) ==0 && ap_info.auth == auth)
+        {
+            net_no = curr_state.net_no;
+            if (0 == lynq_sta_ssid_password_get(idx, &ap_info, ap_info.psw)
+                    && strcmp(ap_info.psw, psw) == 0)
+            {
+                RLOGD("already connected\n");
+
+                pthread_mutex_lock(&s_global_check_mutex);
+                s_sta_status = INNER_STA_STATUS_CONNECTED;
+                pthread_cond_signal(&s_global_check_cond);
+                pthread_mutex_unlock(&s_global_check_mutex);
+                return 0;
+            }
         }
     }
 
-    if (net_no < 0)
+    if (net_no == -1)
     {
-        net_no = lynq_add_network(CTRL_STA);
-        if (net_no == -1)
-	{
-            return -1;
+        count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
+
+        for (index=0; index < count; index++)
+        {
+            net_auth = -1;
+            if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
+            {
+                net_no = net_no_list[index];
+                break;
+            }
         }
 
-        RLOGD("net no is %d\n", net_no);
-        if (0 != inner_set_sta_ssid(net_no, ssid))
-	{
-            return -1;
+        if (net_no < 0)
+        {
+            net_no = lynq_add_network(CTRL_STA);
+            if (net_no == -1)
+            {
+                return -1;
+            }
+
+            RLOGD("net no is %d\n", net_no);
+            if (0 != inner_set_sta_ssid(net_no, ssid))
+            {
+                return -1;
+            }
         }
     }
 
@@ -2320,7 +2805,22 @@
         return -1;
     }
 
-    return inner_sta_start_stop(net_no, 1, 1);
+
+    DO_OK_FAIL_REQUEST(cmd_disconnect);
+    usleep(200*1000);
+
+    ret = inner_sta_start_stop(net_no, 1, 1);
+
+    pthread_mutex_lock(&s_global_check_mutex);
+    s_sta_status = INNER_STA_STATUS_CONNECTING;
+    strcpy(s_sta_current_connecting_ssid, ssid);
+    struct timeval now;
+    gettimeofday(&now,NULL);
+    s_sta_connect_timeout.tv_sec = now.tv_sec + MAX_CONNNECT_TIME;
+    s_sta_connect_timeout.tv_nsec = now.tv_usec*1000;
+    pthread_cond_signal(&s_global_check_cond);
+    pthread_mutex_unlock(&s_global_check_mutex);
+    return ret;
 }
 
 int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx, char *ssid)
@@ -2350,6 +2850,9 @@
         return 0;
     }
 
+    pthread_mutex_lock(&s_global_check_mutex);
+    s_sta_status = INNER_STA_STATUS_DISCONNECTING;
+    pthread_mutex_unlock(&s_global_check_mutex);
     return inner_sta_start_stop(curr_state.net_no, 0, 0);
 }
 
@@ -2636,29 +3139,36 @@
     count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
     RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
 
+    if (count < 0)
+    {
+        RLOGE("list network fail");
+        return count;
+    }
+    else if (count == 0)
+    {
+        *list = NULL;
+        *len = 0;
+        return 0;
+    }
+
     *list = malloc(sizeof (saved_ap_info_s) * count);
     memset(*list, 0, sizeof (saved_ap_info_s) * count);
     *len = count;
 
     for (index=0; index < count; index++)
     {
-	RLOGD("[lynq_get_sta_saved_ap]to get ssid %d", index);
-	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get ssid");
         inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
-	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get mac");
         inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
-	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get auth");
         inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
-	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get band");
         if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
-	{
+        {
             (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
         }
         else
-	{
+        {
             (*list)[index].base_info.band = -1;
         }
-	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
+        RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
         lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
     }
     RLOGD("[lynq_get_sta_saved_ap] return ok");
@@ -2674,7 +3184,7 @@
 
     CHECK_WPA_CTRL(CTRL_STA);
 
-    system(clean_last_re);
+//    system(clean_last_re); // youchen @ 2023-04-14 temp delete ,next time to fix the orginal bug
     g_sta_scan_finish_flag = 0;
     DO_REQUEST(lynq_scan_cmd);
     if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
@@ -3022,24 +3532,16 @@
 
 //    *rssi = atoi(split_words[1]) * -1;
 
-    FILE *fp;
-    size_t i = 0;
     char lynq_cmd_ret[MAX_RET]={0};
 
-//    CHECK_IDX(idx, CTRL_AP);
 /*******change other cmd to get rssi*******
  *
  *wl rssi ---> wl -i wlan0 rssi
  *
  ***** change by qs.xiong 20221011*******/
-    if((fp=popen("wl -i wlan0 rssi","r"))==NULL)
+    if (0 !=  exec_cmd("wl -i wlan0 rssi", lynq_cmd_ret, MAX_RET))
     {
-        perror("popen error!");
-        return -1;
-    }
-    if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
-    {
-        perror("fread fail!");
+        RLOGE("[lynq_get_connect_ap_rssi] exec cmd [ wl -i wlan0 rssi ] fail");
         return -1;
     }
     *rssi = atoi(lynq_cmd_ret) * -1;
@@ -3047,7 +3549,7 @@
     if(*rssi == 0)
     {
         RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
-	return -1;
+        return -1;
     }
 
     return 0;
diff --git a/src/lynq/packages/apps/lynq-at-test/src/main.cpp b/src/lynq/packages/apps/lynq-at-test/src/main.cpp
new file mode 100755
index 0000000..367a6bb
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-at-test/src/main.cpp
@@ -0,0 +1,121 @@
+
+/*============================================================================= 
+#     FileName: lynq-at-test
+#     Desc: about SIMAPI
+#     Author: lei 
+#     Version: V1.0
+#     LastChange: 2023-03-09 
+#     History: 
+# 
+=============================================================================*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "mipc_msg.h"
+#include "mipc_msg_tlv_api.h"
+#include "mipc_msg_tlv_const.h"
+#include "mipc_msg_host.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char str[] = "AT;AT+CSQ;AT+ECSQ;AT+CREG;AT+CEREG;AT+C5GREG;AT+COPS;AT+CFUN;AT+ERAT";
+
+int check_buf(char *str,char *cmd)
+{
+    char *q = (char *)calloc(64,sizeof(char));
+    strcpy(q, str);
+    char *name;
+    char cmp[16] = {0};
+    while(q != NULL)
+    {
+        name = strsep(&q,";");
+        //printf("name %s\n", name);
+        strcpy(cmp, name);
+        //printf("cmp %s\n", cmp);
+        if(!strncmp(cmp, cmd, strlen(cmp)))
+        {
+            //printf("equal\n");
+            return 1;
+        }
+        // if(name != NULL)
+        // {
+        //     printf("%s\n", name);
+        //     if(!strncmp(name, cmd, strlen(name)))
+        //     {
+        //         return 1;
+        //     }
+        // }
+    }
+    free(q);
+    return 0;
+}
+
+void uper_char(char *cmd)
+{
+    char *p = cmd;
+    while (*p != '\0')
+    {
+        if((*p >= 'a') && (*p <= 'z'))
+        {
+            *p = *p-32;
+        }
+        *p++;
+    }
+}
+
+void sendcmd(char *cmd)
+{
+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_SYS_AT_REQ, (mipc_msg_sim_ps_id_enum)MIPC_PS0);
+    mipc_msg_t *msg_cnf_ptr = NULL;
+    mipc_result_enum result;
+    char *atcmd_res_ptr = NULL;//, *atci_res = NULL;
+    uint16_t atcmd_res_len;
+    mipc_msg_add_tlv(msg_req_ptr, MIPC_SYS_AT_REQ_T_ATCMD, strlen(cmd), cmd);
+    msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);
+    mipc_msg_deinit(msg_req_ptr);
+    result = mipc_get_result(msg_cnf_ptr);
+    if (result == MIPC_RESULT_SUCCESS) {
+        atcmd_res_ptr = (char *)mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_SYS_AT_CNF_T_ATCMD, &atcmd_res_len);
+        //int res_len = strlen(atcmd_res_ptr);
+        //printf( "res_len is:%d, atcmd_res_len is %d\n", res_len, atcmd_res_len);
+        //strncpy(response, atcmd_res_ptr, res_len);
+        //response[res_len] = '\0';
+        //atcmd_res_ptr[atcmd_res_len] = '\0';
+        printf( "%s\n", atcmd_res_ptr);
+    } else {
+        printf( "Failed to execute:%d\n", result);
+    }
+    mipc_msg_deinit(msg_cnf_ptr);
+}
+
+int main(void)
+{
+    SETCOM("/dev/ttyCMIPC2");
+    mipc_init("atci");
+    printf( "set mipc_inited true (UANT)\n");
+    char cmd[256] = {0};
+    while (1)
+    {
+        printf("please input at cmd:\n");
+        fgets(cmd, 256, stdin);
+        cmd[strlen(cmd)-1]='\0';
+        uper_char(cmd);
+        if(check_buf(str, cmd))
+        {
+            sendcmd(cmd);
+        }
+        else
+        {
+            printf("we just support AT+CSQ AT+ECSQ AT+CREG AT+CEREG AT+C5GREG AT+COPS AT+CFUN AT+ERAT\n");
+        }
+        
+    }
+}
+#ifdef __cplusplus
+}
+#endif 
diff --git a/src/lynq/packages/apps/lynq-at-test/src/makefile b/src/lynq/packages/apps/lynq-at-test/src/makefile
new file mode 100755
index 0000000..bf048d7
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-at-test/src/makefile
@@ -0,0 +1,64 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -DRIL_SHLIB \
+                -D_LINUX \
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+                    -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+                    -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH   = .
+
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH) \
+  -I$(ROOT)$(includedir)/ \
+  -I$(ROOT)$(includedir)/mipc/api  \
+  -I$(ROOT)$(includedir)/mipc/common  \
+  -I$(ROOT)$(includedir)/mipc/msg  \
+  -I$(ROOT)$(includedir)/mipc/external  \
+  -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -llog \
+    -pthread \
+    -lmipc_msg \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
+EXECUTABLE = lynq-at-test
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+	$(warning ----->build $<)
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)