[Feature][MD310EU][task-view-1009] Create MD310EU project code directory

Change-Id: I57cd3c474efe4493ae8a242d7e2fa643ad8ecbde
diff --git a/lynq/MD310EU/ap/app/Script/Makefile b/lynq/MD310EU/ap/app/Script/Makefile
new file mode 100755
index 0000000..7bde2a3
--- /dev/null
+++ b/lynq/MD310EU/ap/app/Script/Makefile
@@ -0,0 +1,67 @@
+

+############################################################################

+#

+# Makefile --  Build for rootfs makefile.

+#

+# Copyright (c) 2001-2004, SnapGear (www.snapgear.com)

+# Copyright (c) 2001, Lineo

+#

+# Add by zhouwei 2010-08-06 for freescale imx28 platform

+# 

+############################################################################

+CP        = cp

+ROMFS_DIR = $(ROMFSDIR)

+$(warning  CONFIG_WIFI_MODULE=$(CONFIG_WIFI_MODULE))

+.PHONY: romfs wifi

+

+ifneq ($(CONFIG_WIFI_MODULE), )

+CPWIFI=wifi

+endif

+

+$(warning  CPWIFI=$(CPWIFI))

+all:

+

+romfs: $(CPWIFI)

+	chmod +x ./scripts/*.sh

+	$(CP) -f ./scripts/*.sh $(ROMFS_DIR)/sbin/

+	#$(CP) -f ./scripts/*.txt $(ROMFS_DIR)/sbin/

+	mkdir -p $(ROMFS_DIR)/etc_ro/ 

+	$(CP) -f ./etc/*.conf $(ROMFS_DIR)/etc_ro/

+	$(CP) -f ./etc/options.auth $(ROMFS_DIR)/etc_ro/

+	$(CP) -f ./etc/options.noauth $(ROMFS_DIR)/etc_ro/

+	$(CP) -f ./etc/initchat $(ROMFS_DIR)/etc_ro/

+ifneq ($(CONFIG_USE_WEBUI_SECURITY),yes)

+	$(CP) -f ./etc/pap-secrets $(ROMFS_DIR)/etc_ro/

+	$(CP) -f ./etc/chap-secrets $(ROMFS_DIR)/etc_ro/

+endif

+ifeq ($(USE_FOTA),yes)

+	mkdir -p $(ROMFS_DIR)/recovery/sbin

+	$(CP) -f ./scripts/to_mnt_ubifs.sh $(ROMFS_DIR)/recovery/sbin/

+endif

+wifi:

+	@echo "copying wifi script"

+

+	$(CP) -rf ./wifi_script/realtek/zte_qrcode_create.sh  $(ROMFS_DIR)/sbin/

+ifeq ($(CONFIG_WIFI_MODULE), realtek)

+	@echo "copying wifi realtek script"

+	mkdir -p $(ROMFS_DIR)/etc_ro/ 

+	$(CP) -rf ./wifi/*  $(ROMFS_DIR)/etc_ro/

+ifeq ($(CONFIG_WIFI_RTL_WPA2),yes)

+	chmod +x  ./wifi_script/realtek_wpa2/*

+	$(CP) -rf ./wifi_script/realtek_wpa2/*  $(ROMFS_DIR)/sbin/

+else

+	chmod +x  ./wifi_script/realtek/*

+	$(CP) -rf ./wifi_script/realtek/*  $(ROMFS_DIR)/sbin/

+endif

+else

+	chmod +x  ./wifi_script/realtek/*

+ifeq ($(CONFIG_MIN_8M_VERSION), n)

+	$(CP) -rf ./wifi_script/realtek/zte_qrcode_create.sh  $(ROMFS_DIR)/sbin/

+else

+ifeq ($(CONFIG_MMI_LCD),yes)

+	$(CP) -rf ./wifi_script/realtek/zte_qrcode_create.sh  $(ROMFS_DIR)/sbin/

+endif

+endif

+endif

+

+

diff --git a/lynq/MD310EU/ap/app/at_tool/Makefile b/lynq/MD310EU/ap/app/at_tool/Makefile
new file mode 100755
index 0000000..4f10e41
--- /dev/null
+++ b/lynq/MD310EU/ap/app/at_tool/Makefile
@@ -0,0 +1,58 @@
+#*******************************************************************************

+# include ZTE application makefile

+#*******************************************************************************

+include $(zte_app_mak)

+include $(COMMON_MK)

+

+CPU_PUB_ROOT=$(TOPDIR_AP)/../pub

+##############USER COMIZE BEGIN################

+EXEC = at

+OBJS = at_tool.o

+

+#*******************************************************************************

+# include path

+#*******************************************************************************

+CFLAGS += -I./

+CFLAGS += -I../include

+CFLAGS += -I../zte_comm/nvserver

+CFLAGS += -I$(LIB_DIR)/libnvram

+CFLAGS += -I$(APP_DIR)/include                                                   

+CFLAGS += -g -Werror=implicit-function-declaration 

+

+CFLAGS += -I$(zte_app_path)/include

+CFLAGS += -I$(zte_lib_path)/libnvram

+CFLAGS += -I$(LINUX_DIR)

+CFLAGS += -I$(CPU_PUB_ROOT)/project/zx297520v3/include/nv

+CFLAGS += -O -Dlinux=1 -DHIGH_SPEED=1

+

+CFLAGS += -I$(zte_lib_path)/libsoftap

+CFLAGS += -I$(zte_lib_path)/libsoft_timer

+

+#*******************************************************************************

+# library

+#*******************************************************************************

+LDLIBS += -lnvram -L$(zte_lib_path)/libnvram -lpthread

+ifeq ($(LINUX_TYPE),uClinux)

+LDFLAGS += -Wl,--allow-multiple-definition,-elf2flt=-s131072

+endif

+

+LDLIBS  += -latutils -L$(zte_lib_path)/libatutils

+LDLIBS  += -lsoftap -L$(zte_lib_path)/libsoftap

+LDLIBS  += -lsoft_timer -L$(zte_lib_path)/libsoft_timer

+

+##############USER COMIZE END##################

+

+all: $(EXEC)

+

+$(EXEC): $(OBJS) 

+	$(CC) $(LDFLAGS) -o $@ $(OBJS)  -Wl,--start-group $(LDLIBS) -Wl,--end-group

+	@cp $@ $@.elf

+

+

+romfs:

+	$(ROMFSINST)  /sbin/$(EXEC)

+

+clean:

+	-rm -f $(EXEC) *.elf *.gdb *.o

+

+

diff --git a/lynq/MD310EU/ap/app/at_tool/at_tool.c b/lynq/MD310EU/ap/app/at_tool/at_tool.c
new file mode 100755
index 0000000..109722a
--- /dev/null
+++ b/lynq/MD310EU/ap/app/at_tool/at_tool.c
@@ -0,0 +1,41 @@
+#include "at_tool.h"

+

+static void at_progess(int argc, char *argv[])

+{

+    int ret = -1;

+    char send_at_buf[128] = {0};

+    char *pstr = malloc(128);

+	memset(pstr, 0, 128);

+

+    if(argv[1] != NULL && strlen(argv[1]) >= 2 && strncasecmp(argv[1], "at", 2) == 0)

+    {

+        sprintf(send_at_buf, "%s\r", argv[1]);

+		ret = get_modem_info(send_at_buf, "%s", (void**)&pstr);

+

+		if(0 == ret)

+		{

+			printf("%s\n", pstr);

+		}

+		else

+		{

+			printf("AT command error\n");

+		}

+    }

+    else

+    {

+        printf("not a valid AT command: error\n");

+    }

+

+    free(pstr);

+    return;

+}

+

+int main(int argc, char *argv[])

+{

+    if(argc > 1)

+    {

+        at_progess(argc, argv);

+    }

+

+    return 0;

+}

diff --git a/lynq/MD310EU/ap/app/at_tool/at_tool.h b/lynq/MD310EU/ap/app/at_tool/at_tool.h
new file mode 100755
index 0000000..a781c51
--- /dev/null
+++ b/lynq/MD310EU/ap/app/at_tool/at_tool.h
@@ -0,0 +1,7 @@
+#ifndef __AT_TOOL_H__

+#define __AT_TOOL_H__

+

+#include <stdio.h>

+#include "softap_api.h"

+

+#endif

diff --git a/lynq/MD310EU/ap/app/cgi/Makefile b/lynq/MD310EU/ap/app/cgi/Makefile
new file mode 100755
index 0000000..935f4b4
--- /dev/null
+++ b/lynq/MD310EU/ap/app/cgi/Makefile
@@ -0,0 +1,55 @@
+#*******************************************************************************

+# include ZTE application makefile

+#*******************************************************************************

+include $(zte_app_mak)

+include $(COMMON_MK)

+

+CPU_PUB_ROOT=$(TOPDIR_AP)/../pub

+##############USER COMIZE BEGIN################

+EXEC = upload.cgi

+OBJS = cgi.o

+

+#*******************************************************************************

+# include path

+#*******************************************************************************

+CFLAGS += -I./

+CFLAGS += -I../include

+CFLAGS += -I../zte_comm/nvserver

+CFLAGS += -I$(LIB_DIR)/libnvram

+CFLAGS += -I$(APP_DIR)/include                                                   

+CFLAGS += -g -Werror=implicit-function-declaration 

+

+CFLAGS += -I$(zte_app_path)/include

+CFLAGS += -I$(zte_lib_path)/libnvram

+CFLAGS += -I$(LINUX_DIR)

+CFLAGS += -I$(CPU_PUB_ROOT)/project/zx297520v3/include/nv

+CFLAGS += -O -Dlinux=1 -DHIGH_SPEED=1

+

+CFLAGS += -I$(zte_lib_path)/libsoftap

+CFLAGS += -I$(zte_lib_path)/libsoft_timer

+

+#*******************************************************************************

+# library

+#*******************************************************************************

+LDLIBS += -lnvram -L$(zte_lib_path)/libnvram -lpthread

+ifeq ($(LINUX_TYPE),uClinux)

+LDFLAGS += -Wl,--allow-multiple-definition,-elf2flt=-s131072

+endif

+

+LDLIBS  += -latutils -L$(zte_lib_path)/libatutils

+LDLIBS  += -lsoftap -L$(zte_lib_path)/libsoftap

+LDLIBS  += -lsoft_timer -L$(zte_lib_path)/libsoft_timer

+

+##############USER COMIZE END##################

+

+all: $(EXEC)

+

+$(EXEC): $(OBJS) 

+	$(CC) $(LDFLAGS) -o $@ $(OBJS)  -Wl,--start-group $(LDLIBS) -Wl,--end-group

+	@cp $@ $@.elf

+

+romfs:

+	$(ROMFSINST)  /sbin/$(EXEC)

+

+clean:

+	-rm -f $(EXEC) *.elf *.gdb *.o
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/cgi/cgi.c b/lynq/MD310EU/ap/app/cgi/cgi.c
new file mode 100755
index 0000000..b026367
--- /dev/null
+++ b/lynq/MD310EU/ap/app/cgi/cgi.c
@@ -0,0 +1,350 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <unistd.h>

+#include <fcntl.h>

+#include <errno.h>

+

+#define BUFFER_SIZE (1024 * 20) // Define the buffer size for each read

+#define FIND_STR_LEN 128 // Define the length of the string to find

+#define FOTA_UPDATE_STATUS_FILE "/cache/zte_fota/update_status"

+

+// Custom memmem function

+static void* custom_memmem(const void* haystack, size_t haystack_len, const void* needle, size_t needle_len)

+{

+    if (needle_len == 0 || haystack_len < needle_len)

+    {

+        return NULL;

+    }

+

+    size_t i = 0;

+    const unsigned char* h = (const unsigned char*)haystack;

+    const unsigned char* n = (const unsigned char*)needle;

+

+    for (i = 0; i <= haystack_len - needle_len; ++i)

+    {

+        if (memcmp(h + i, n, needle_len) == 0)

+        {

+            return (void*)(h + i);

+        }

+    }

+

+    return NULL;

+}

+

+// Remove the last boundary marker from the file

+static int remove_last_boundary(const char *filename, const char *boundary_marker, int boundary_marker_len)

+{

+    int fd = open(filename, O_RDWR);

+    if (fd == -1)

+    {

+        perror("Unable to open file for reading and writing");

+        return 1;

+    }

+

+    // Get the file size

+    off_t file_size = lseek(fd, 0, SEEK_END);

+    if (file_size == -1)

+    {

+        perror("Unable to get file size");

+        close(fd);

+        return 1;

+    }

+

+    // Search for the boundary_marker from the end of the file

+    off_t search_start = file_size - FIND_STR_LEN;

+    if (search_start < 0)

+    {

+        search_start = 0;

+    }

+

+    lseek(fd, search_start, SEEK_SET);

+

+    char buffer[FIND_STR_LEN + 1]; // +1 for storing '\0'

+    int bytes_read = read(fd, buffer, FIND_STR_LEN);

+    if (bytes_read <= 0)

+    {

+        perror("Unable to read file");

+        close(fd);

+        return 1;

+    }

+    buffer[bytes_read] = '\0'; // Ensure the string is null-terminated

+

+    // Find the boundary_marker

+    char *boundary = custom_memmem(buffer, bytes_read, boundary_marker, boundary_marker_len);

+    if (boundary)

+    {

+        // Found boundary_marker, calculate the truncate position

+        off_t truncate_pos = search_start + (boundary - buffer);

+        if (ftruncate(fd, truncate_pos) == -1)

+        {

+            perror("Unable to truncate file");

+            close(fd);

+            return 1;

+        }

+    }

+

+    close(fd);

+    return 0;

+}

+

+// Function to handle file upload

+static int handle_file_upload(const char *source_filename, const char *target_filename, int content_length)

+{

+    char buffer[BUFFER_SIZE];

+    int bytes_read;

+    int target_fd = -1;

+    int source_fd = -1; // Source file descriptor

+    char *content_start_ptr = NULL;

+    int content_start = 0;

+    const char *boundary_marker = "\r\n------WebKitFormBoundary"; // Boundary marker

+    int boundary_marker_len = strlen(boundary_marker);

+

+    // Open the target file

+    target_fd = open(target_filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);

+    if (target_fd == -1)

+    {

+        perror("Unable to open target file");

+        return 1;

+    }

+

+    // Open the source file

+    source_fd = open(source_filename, O_RDONLY);

+    if (source_fd == -1)

+    {

+        perror("Unable to open source file");

+        close(target_fd);

+        return 1;

+    }

+

+    // Read the request header to find the start position of file content

+    bytes_read = read(source_fd, buffer, BUFFER_SIZE);

+    if (bytes_read <= 0)

+    {

+        printf("Content-type: text/html\r\n\r\n");

+        printf("<h1>Error: Failed to read data</h1>");

+        printf("<p>Error number: %d - %s</p>", errno, strerror(errno));

+        close(target_fd);

+        close(source_fd);

+        return 1;

+    }

+

+    // Find the start position of the file content (usually after \r\n\r\n)

+    content_start_ptr = strstr(buffer, "\r\n\r\n");

+    if (!content_start_ptr)

+    {

+        printf("Content-type: text/html\r\n\r\n");

+        printf("<h1>Error: Unable to find the start position of file content</h1>");

+        close(target_fd);

+        close(source_fd);

+        return 1;

+    }

+

+    // Calculate the actual start position of the file content

+    content_start = content_start_ptr - buffer + 4;

+

+    // Write the first part of the file content

+    if (content_start < bytes_read)

+    {

+        if (write(target_fd, buffer + content_start, bytes_read - content_start) == -1)

+        {

+            perror("Unable to write to target file");

+            close(target_fd);

+            close(source_fd);

+            return 1;

+        }

+    }

+

+    // Update the remaining content length

+    content_length -= (bytes_read - content_start);

+

+    // Continue reading and writing the file in segments

+    while (content_length > 0)

+    {

+        bytes_read = read(source_fd, buffer, BUFFER_SIZE);

+        if (bytes_read <= 0)

+        {

+            // If reading is complete, normally break out of the loop

+            break;

+        }

+

+        // Write the file content

+        if (write(target_fd, buffer, bytes_read) == -1)

+        {

+            perror("Unable to write to target file");

+            close(target_fd);

+            close(source_fd);

+            return 1;

+        }

+

+        // Update the remaining content length

+        content_length -= bytes_read;

+    }

+

+    // Close file descriptors

+    close(target_fd);

+    close(source_fd);

+

+    // Remove the last boundary marker from the file

+    return remove_last_boundary(target_filename, boundary_marker, boundary_marker_len);

+}

+

+static int fota_is_file_exist(const char* path)

+{

+	if ( (path == NULL) || (*path == '\0') )

+		return 0;

+	if (access(path, R_OK) != 0)

+		return 0;

+

+	return 1;

+}

+

+static int fota_read_file(const char*path, char*buf, size_t sz)

+{

+	int fd = -1;

+	size_t cnt;

+

+	fd = open(path, O_RDONLY, 0);

+	if(fd < 0)

+	{

+		printf("fota_read_file failed to open %s: %s\n", path, strerror(errno));

+		cnt = -1;

+		return cnt;

+	}

+	cnt = read(fd, buf, sz - 1);

+	if(cnt <= 0)

+	{

+		printf("failed to read %s: %s\n", path, strerror(errno));

+		close(fd);

+		cnt = -1;

+		return cnt;

+	}

+	buf[cnt] = '\0';

+	if(buf[cnt - 1] == '\n')

+	{

+		cnt--;

+		buf[cnt] = '\0';

+	}

+	close(fd);

+

+	return cnt;

+}

+

+static int fota_read_file_int(const char* path, int *val)

+{

+	char buf[32];

+	char *end;

+	int ret;

+	int tmp;

+

+	ret = fota_read_file(path, buf, sizeof(buf));

+	if(ret < 0)

+		return -1;

+

+	errno = 0;

+	tmp = strtol(buf, &end, 0);

+	if (errno == ERANGE)

+    {

+		printf("strtol errno %d: %s\n", errno, strerror(errno));

+	}

+

+	if ((end == buf) || ((end < buf + sizeof(buf)) && (*end != '\0')))

+	{

+		return -1;

+	}

+

+	*val = tmp;

+

+	return 0;

+}

+

+static int fota_get_update_status(int *fota_status)

+{

+	int status = 0;

+	int ret = 0;

+	if(!fota_is_file_exist(FOTA_UPDATE_STATUS_FILE))

+    {

+		*fota_status = -1;

+		return -1;

+	}

+	ret = fota_read_file_int(FOTA_UPDATE_STATUS_FILE, &status);

+	if(ret < 0)

+    {

+		*fota_status = -1;

+		return -1;

+	}

+	*fota_status = status;

+	return 0;

+}

+

+static void print_json_response(int success, const char* message)

+{

+    printf("Content-type: application/json\r\n\r\n");

+    printf("{\"success\": %d, \"message\": \"%s\"}\n", success, message);

+}

+

+static void cgi_fota_update_progress()

+{

+    int upgradeStatus, result;

+

+    system("fota_upi -u verify > /dev/null 2>&1");

+    result = fota_get_update_status(&upgradeStatus);

+    if(result < 0)

+    {

+        print_json_response(0, "Fail to read update file");

+    }

+    else if(upgradeStatus != 0)

+    {

+        print_json_response(0, "Verify update file failed");

+    }

+    else

+    {

+        print_json_response(1, "File verification successful, start updating...");

+        sleep(1);

+        system("fota_upi -u recovery > /dev/null 2>&1 &");

+    }

+}

+

+int main()

+{

+    const char *source_filename = "/tmp/firmware_tmp_file"; // Source file path

+    const char *target_filename = "/cache/zte_fota/delta.package";  // Target file path

+    const char *content_length_str = NULL;

+    int content_length = 0;

+

+    system("rm -rf /cache/zte_fota");

+	system("mkdir -p /cache/zte_fota");

+

+    // Get environment variables

+    content_length_str = getenv("CONTENT_LENGTH");

+    if (!content_length_str)

+    {

+        system("rm -rf /tmp/firmware_tmp_file");

+        print_json_response(0, "Missing CONTENT_LENGTH environment variable");

+        return 1;

+    }

+

+    content_length = atoi(content_length_str);

+    if (content_length <= 0)

+    {

+        system("rm -rf /tmp/firmware_tmp_file");

+        print_json_response(0, "Invalid CONTENT_LENGTH");

+        return 1;

+    }

+

+    // Call the file upload handling function

+    if (handle_file_upload(source_filename, target_filename, content_length) != 0)

+    {

+        system("rm -rf /tmp/firmware_tmp_file");

+        print_json_response(0, "File upload failed");

+        return 1;

+    }

+

+    // Output success information

+    //print_json_response(1, "File upload successful");

+    system("rm -rf /tmp/firmware_tmp_file");

+

+    cgi_fota_update_progress();

+

+    return 0;

+}

diff --git a/lynq/MD310EU/ap/app/cwmp/netcwmp/cwmp.conf b/lynq/MD310EU/ap/app/cwmp/netcwmp/cwmp.conf
new file mode 100755
index 0000000..89aae65
--- /dev/null
+++ b/lynq/MD310EU/ap/app/cwmp/netcwmp/cwmp.conf
@@ -0,0 +1,57 @@
+[cwmp]
+enable=1;
+soap_env=SOAP-ENV
+soap_enc=SOAP-ENC
+acs_auth=1
+cpe_auth=1
+event_filename=/cache/cwmpevent.bin
+
+
+acs_url=http://192.168.0.100:7547/ACS
+#acs_url=http://192.168.28.246:9999/
+ca_file=/cache/ca.pem
+ca_password=
+
+
+cpe_manufacture=zxic
+cpe_oui=FEDCBA
+cpe_sn=744AA4E7b050
+cpe_name=000000	
+cpe_pc=OT2800
+cpe_specver=V1.0
+cpe_hwver=V1.0
+cpe_version=V3.3.3.3
+cpe_username=cpe
+cpe_password=cpe
+acs_username=cpe
+acs_password=cpe
+
+
+
+[cwmpd]
+httpd_port=7547
+http_timeout=-1
+
+[file]
+download_root=/cache
+download_img_path=/cache/download.img
+download_cfg_path=/cache/download.cfg
+download_unknown_path=/cache/download.tmp
+upload_cfg_path=/cache/cwmp.cfg
+upload_log_path=/cache/cwmp.log
+
+
+[periodic]
+enable=1
+interval=60
+
+[test]
+parameterkey=123456
+stun_enable=0
+stun_serveraddress=192.168.0.100
+stun_serverport=8080
+stun_username=stun
+stun_password=
+stun_maximumkeepaliveperiod=100
+stun_minimumkeepaliveperiod=10
+natdetected=0
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/cwmp/netcwmp/cwmpd/src/agent.c b/lynq/MD310EU/ap/app/cwmp/netcwmp/cwmpd/src/agent.c
new file mode 100755
index 0000000..fc3a2a7
--- /dev/null
+++ b/lynq/MD310EU/ap/app/cwmp/netcwmp/cwmpd/src/agent.c
@@ -0,0 +1,1225 @@
+/************************************************************************

+ *                                                                      *

+ * Netcwmp/Opencwmp Project                                             *

+ * A software client for enabling TR-069 in embedded devices (CPE).     *

+ *                                                                      *

+ * Copyright (C) 2013-2014  netcwmp.netcwmp group                            *

+ *                                                                      *

+ * This program is free software; you can redistribute it and/or        *

+ * modify it under the terms of the GNU General Public License          *

+ * as published by the Free Software Foundation; either version 2       *

+ * of the License, or (at your option) any later version.               *

+ *                                                                      *

+ * This program is distributed in the hope that it will be useful,      *

+ * but WITHOUT ANY WARRANTY; without even the implied warranty of       *

+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *

+ * GNU General Public License for more details.                         *

+ *                                                                      *

+ * You should have received a copy of the GNU Lesser General Public     *

+ * License along with this library; if not, write to the                *

+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,          *

+ * Boston, MA  02111-1307 USA                                           *

+ *                                                                      *

+ * Copyright 2013-2014  Mr.x(Mr.x) <netcwmp@gmail.com>          *

+ *                                                                      *

+ ***********************************************************************/

+#include "cwmp/periodic.h"

+

+#include "cwmp_module.h"

+#include "cwmp_agent.h"

+#include <cwmp/session.h>

+//#include "modules/data_model.h"

+

+#include "soft_timer.h"

+

+

+#define CWMP_TRUE   1

+

+#define MAX_SESSION_RETRY 3

+

+enum

+{

+    CWMP_ST_START = 0, 

+	CWMP_ST_INFORM, 

+	CWMP_ST_SEND, 

+	CWMP_ST_RESEMD, 

+	CWMP_ST_RECV, 

+	CWMP_ST_ANSLYSE, 

+	CWMP_ST_RETRY, 

+	CWMP_ST_END, 

+	CWMP_ST_EXIT

+};

+

+#define SECHEDULE_INFORM_TIMER   (31)

+

+schedule_inform_info_st g_si;

+

+int get_session_status()

+{

+     return g_si.cwmp->session_running;

+}

+

+void *schedule_inform_timeout(void *arg)

+{

+    FUNCTION_TRACE();

+	int i = 0;

+

+	schedule_inform_info_st *psi = (schedule_inform_info_st *)arg;

+	

+    cwmp_log_info("push begin");

+

+    psi->timer_running = 2;

+	

+//	while(1)

+//	{

+//		if(SESSION_NO_RUNNING == get_session_status())

+//		{

+    	    psi->cwmp->new_request = CWMP_YES;

+    	    cwmp_event_set_value(psi->cwmp, INFORM_SCHEDULED, 1, psi->commandKey, 0, 0, 0);

+    	    cwmp_log_info("commandkey is:%s", psi->commandKey);

+			psi->timer_running = 0;

+    	

+            cwmp_log_info("push ok");

+

+			return NULL;

+//		}

+//		else

+//		{

+//		   cwmp_log_info("there is session running");

+//		   psi->timer_running = 0;

+//           g_si.delaytime += 1;

+//           if(CWMP_OK != schedule_inform_create_timer(&g_si))

+//           {

+//              ;

+//           }

+//		}

+//	}

+

+    return NULL;

+}

+

+

+int schedule_inform_create_timer(schedule_inform_info_st* psi)

+{

+    FUNCTION_TRACE();

+

+	if(2 == g_si.timer_running){

+		cwmp_log_info("there is other schedule inform running!");

+		return CWMP_OK;

+	}

+	else if(1 == g_si.timer_running)

+	{

+        // if exist one schedule inform timer, update		

+		cwmp_log_info("there is other schedule inform active!");

+		DeleteSoftTimer(SECHEDULE_INFORM_TIMER);	

+	}

+	else

+	{

+        cwmp_log_info("update schedule inform info, create timer");

+	}

+

+	TRstrncpy(g_si.commandKey, psi->commandKey, COMMAND_KEY_LEN);

+	g_si.delaytime = psi->delaytime;

+	g_si.cwmp = psi->cwmp;

+	

+

+	cwmp_log_info("begin to create timer!");

+	

+    long result = CreateSoftTimer(SECHEDULE_INFORM_TIMER, TIMER_FLAG_ONCE, psi->delaytime*1000, schedule_inform_timeout, &g_si);

+	g_si.timer_running = 1;

+	cwmp_log_info("end to create timer!");

+

+    cwmp_log_info("commandkey is:%s, delaytime:%d", psi->commandKey, psi->delaytime);

+	

+	return CWMP_OK;

+}

+

+

+

+int cwmp_agent_retry_session(cwmp_session_t * session)

+{

+

+    int sec = 0;

+	int count = 1;

+

+    srand(time(NULL));

+    switch (session->retry_count)

+    {

+    case 0:

+    {

+        count = 5; //5~10

+        break;

+    }

+    case 1:

+    {

+        count = 10; //5~15

+        break;

+    }

+    case 2:

+    {

+        count = 20; //5~25

+        break;

+    }

+    default:

+    {

+        count = 30; //5~35

+        break;

+    }

+    }

+

+    sec = 5 + rand()% count;

+

+    while (sec>0)

+    {

+        sleep(1);

+        sec--;

+    }

+

+    if (session->retry_count > MAX_SESSION_RETRY)

+    {

+        session->retry_count = 0;

+        return CWMP_TIMEOUT;

+    }

+    else

+    {

+        session->retry_count ++;

+        return CWMP_OK;

+    }

+

+}

+

+

+int cwmp_agent_create_datetimes(datatime_t *nowtime)

+{

+    struct tm *t;

+    time_t tn;

+    

+

+    //FUNCTION_TRACE();

+    tn = time(NULL);

+#ifdef WIN32

+    cwmp_log_debug("inform datatime");

+    //localtime_s(&t, &tn);

+    t = MALLOC(sizeof(struct tm));

+    memset(t, 0, sizeof(struct tm));

+#else

+    t = localtime(&tn);

+#endif

+

+    if(NULL != t)

+    {

+        nowtime->year = t->tm_year + 1900;

+        nowtime->month = t->tm_mon + 1;

+        nowtime->day = t->tm_mday;

+        nowtime->hour = t->tm_hour;

+        nowtime->min = t->tm_min;

+        nowtime->sec = t->tm_sec;

+    }

+	else

+	{

+	    cwmp_log_error("localtime return null");

+	}

+

+    return CWMP_OK;

+}

+

+//È¡µÃactive eventÒÔ¼°count

+int cwmp_agent_get_active_event(cwmp_t *cwmp, cwmp_session_t * session,  event_list_t **pevent_list)

+{

+    event_list_t * el;

+    event_code_t * ev;

+    int i=0;

+    FUNCTION_TRACE();

+

+    el = cwmp_create_event_list(session->env, INFORM_MAX);

+	if(NULL == el)

+	{

+	    cwmp_log_error("el cwmp_create_event_list return NULL");

+		return CWMP_ERROR;

+	}

+

+    event_code_t ** pec = cwmp->el->events;

+   

+    int elsize = cwmp->el->count;

+    for(i=0; i<elsize; i++)

+    {      

+        

+	    if(pec[i]  && pec[i]->ref > 0)

+        {

+         

+            event_code_t * ec = pec[i];

+            ev = cwmp_create_event_code(session->env);

+            if(NULL == ev)

+            {

+                cwmp_log_error("ev cwmp_create_event_code return null");

+				return CWMP_ERROR;

+            }

+			

+            ev->event = ec->event;

+            ev->code = ec->code;

+	

+            if (pec[i]->event == INFORM_MREBOOT || pec[i]->event == INFORM_BOOTSTRAP)

+            {

+                strncpy(ev->command_key , ec->command_key, COMMAND_KEY_LEN);

+            }

+	    

+  

+            el->events[el->count++] = ev;

+            ev = NULL;

+

+        }

+    }

+    if (el->count == 0)

+    {

+        ev = cwmp_create_event_code(session->env);

+		if(NULL == ev)

+		{

+		    cwmp_log_error("ev cwmp_create_event_code return null");

+			return CWMP_ERROR;

+		}

+		

+        ev->event = INFORM_BOOT;

+        ev->code = CWMP_INFORM_EVENT_CODE_1;

+        el->events[el->count++] = ev;

+    }

+

+    *pevent_list = el;

+

+    return CWMP_OK;

+}

+

+int cwmp_agent_send_request(cwmp_session_t * session)

+{

+    FUNCTION_TRACE();

+    return cwmp_session_send_request(session);

+}

+

+int cwmp_agent_recv_response(cwmp_session_t * session)

+{

+    return cwmp_session_recv_response(session);

+}

+

+void cwmp_agent_start_session(cwmp_t * cwmp)

+{

+    int rv;

+    cwmp_session_t * session;

+    int session_close = CWMP_NO;

+    xmldoc_t * newdoc;

+    FUNCTION_TRACE();

+    event_list_t  *evtlist;

+	

+    while (TRUE)

+    {

+        if (cwmp->new_request == CWMP_NO)

+        {

+            cwmp_log_debug("No new request from ACS\n");

+            sleep(2);

+            //cwmp->new_request = CWMP_YES;

+            continue;

+        }

+		

+        cwmp_log_debug("New request from ACS\n");

+

+		cwmp_clean_periodic_inform(cwmp);

+		

+        cwmp->new_request = CWMP_NO;

+        session = cwmp_session_create(cwmp);

+        if(NULL == session)

+        {

+            cwmp_log_error("session cwmp_session_create return NULL");

+			cwmp->new_request = CWMP_YES;

+			continue;

+        }

+		

+        session_close  = CWMP_NO;

+        session->timeout = cwmp_conf_get_int("cwmpd:http_timeout");

+        //cwmp_session_set_timeout(cwmp_conf_get_int("cwmpd:http_timeout"));

+        cwmp_log_debug("session timeout is %d", session->timeout);

+		

+        cwmp_session_open(session);

+

+        while (!session_close)

+        {

+            //cwmp_log_debug("session status: %d", session->status);

+            switch (session->status)

+            {

+            case CWMP_ST_START:

+                //create a new connection to acs

+                cwmp_log_debug("session stutus: New START\n");

+

+                if (cwmp_session_connect(session, cwmp->acs_url) != CWMP_OK)

+                {

+                    cwmp_log_error("connect to acs: %s failed.\n", cwmp->acs_url);

+                    session->status = CWMP_ST_RETRY;

+                }

+                else

+                {

+                    session->status = CWMP_ST_INFORM;

+                }

+                break;

+            case CWMP_ST_INFORM:

+				evtlist = NULL;

+				cwmp_log_debug("session stutus: INFORM\n");

+				cwmp_agent_get_active_event(cwmp, session,  & evtlist);

+				if(evtlist != NULL)

+				{

+					cwmp_event_clear_active(cwmp);

+				}

+				else

+				{

+					cwmp_log_debug("evtlist is null");

+					session->status = CWMP_ST_EXIT;	

+					break;

+				}

+				

+				cwmp_log_debug("session stutus: INFORM2\n");

+                if (cwmp->acs_auth)

+                {			

+                    cwmp_session_set_auth(session, cwmp->acs_user, cwmp->acs_pwd );

+                }				

+

+				cwmp_log_debug("session stutus: INFORM3\n");

+                newdoc = cwmp_session_create_inform_message(session, evtlist, session->envpool);

+

+				if(NULL != newdoc)

+				{

+                    cwmp_write_doc_to_chunk(newdoc, session->writers,  session->envpool);

+                    session->last_method = CWMP_INFORM_METHOD;

+                    session->status = CWMP_ST_SEND;

+				}

+				else

+				{

+				    cwmp_log_error("newdoc is null");

+					session->last_method = CWMP_INFORM_METHOD;

+                    session->status = CWMP_ST_EXIT;

+				}

+				

+                break;

+

+            case CWMP_ST_SEND:

+

+                cwmp_log_debug("session stutus: SEND");

+                cwmp_log_debug("session data request length: %d", cwmp_chunk_length(session->writers));

+                session->newdata = CWMP_NO;

+

+                rv = cwmp_agent_send_request(session);

+                

+                if (rv == CWMP_OK)

+                {

+					cwmp_log_debug("session data sended OK, rv=%d", rv);

+					session->status = CWMP_ST_RECV;

+                }

+				else

+				{

+					cwmp_log_debug("session data sended faild! rv=%d", rv);

+					session->status = CWMP_ST_EXIT;

+					/*

+					if (rv == CWMP_COULDNOT_CONNECT)

+					{

+						session->status = CWMP_ST_RETRY;

+					}

+					else

+                    {

+                        session->status = CWMP_ST_EXIT;

+                    }

+					*/

+                }

+     

+                break;

+            case CWMP_ST_RECV:

+                cwmp_log_debug("session stutus: RECV");

+                cwmp_chunk_clear(session->readers);

+

+                rv = cwmp_agent_recv_response(session);

+

+                if (rv == CWMP_OK)

+                {

+                    session->status = CWMP_ST_ANSLYSE;

+                }

+                else

+                {

+                    session->status = CWMP_ST_END;

+                }

+                break;

+

+            case CWMP_ST_ANSLYSE:

+                cwmp_log_debug("session stutus: ANSLYSE");

+                rv = cwmp_agent_analyse_session(session);

+                if (rv == CWMP_OK)

+                {

+                    session->status = CWMP_ST_SEND;

+                }

+                else

+                {

+                    session->status = CWMP_ST_END;

+                }

+                break;

+            case CWMP_ST_RETRY:

+				cwmp_log_debug("session stutus: RETRY");

+                if (cwmp_agent_retry_session(session) == CWMP_TIMEOUT)

+                {

+					cwmp_log_debug("session retry timeover, go out");

+                    session->status = CWMP_ST_EXIT;

+                }

+                else

+                {

+                    session->status = CWMP_ST_START;

+                }

+                break;

+            case CWMP_ST_END:

+                //close connection of ACS

+                cwmp_log_debug("session stutus: END");

+				//run task from queue

+		

+                if (session->newdata == CWMP_YES)

+                {

+                    session->status = CWMP_ST_SEND;

+                }

+                else

+                {

+                    session->status = CWMP_ST_EXIT;

+                }

+                break;

+

+            case CWMP_ST_EXIT:

+                cwmp_log_debug("session stutus: EXIT");

+                cwmp_session_close(session);

+                if (session->reconnect == CWMP_YES)

+                {

+                    session->reconnect = CWMP_NO;

+                    session->status = CWMP_ST_START;

+                    break;

+                }

+                session_close = CWMP_YES;

+                break;

+

+

+            default:

+				cwmp_log_debug("Unknown session stutus");

+                break;

+            }//end switch

+        }//end while(!session_close)

+

+        cwmp_log_debug("session stutus: EXIT");

+        cwmp_session_free(session);

+        session = NULL;

+

+		cwmp->session_running = SESSION_NO_RUNNING;

+

+		int newtaskres = cwmp_agent_run_tasks(cwmp);

+		if(newtaskres == CWMP_YES)

+		{

+			cwmp->new_request = CWMP_YES;

+		}

+		

+        cwmp_reset_periodic_inform(cwmp);

+		

+    }//end while(TRUE)

+}

+

+void to_upper_case_substring(char *str, const char *substring)

+{

+    int i = 0;

+    char *found = strstr(str, substring);

+    int sub_len = strlen(substring);

+

+    while (found != NULL) 

+    {

+        for (i = 0; i < sub_len; ++i)

+        {

+            found[i] = toupper((unsigned char)found[i]);

+        }

+        found = strstr(found + sub_len, substring);

+    }

+}

+

+int cwmp_agent_analyse_session(cwmp_session_t * session)

+{

+    pool_t * doctmppool  = NULL;

+    char * xmlbuf;

+    char cwmp_id[10] = {0};

+    cwmp_uint32_t len;

+    xmldoc_t *  doc;

+    char * method;

+    xmldoc_t *   newdoc = NULL;

+    int rc = CWMP_OK;

+

+    static char * xml_fault = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:cwmp=\"urn:dslforum-org:cwmp-1-0\" xmlns=\"urn:dslforum-org:cwmp-1-0\"><SOAP-ENV:Body SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"  id=\"_0\"><SOAP-ENV:Fault>Error Message</SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>";

+

+    cwmp_uint32_t msglength = 0;

+

+    FUNCTION_TRACE();

+	if(NULL == session)

+	{

+	    cwmp_log_error("session is null");

+		return CWMP_ERROR;

+	}

+

+	cwmp_t * cwmp = session->cwmp;

+	if(NULL == cwmp)

+	{

+	    cwmp_log_error("cwmp is null");

+		return CWMP_ERROR;

+	}	

+

+    msglength = cwmp_chunk_length(session->readers);	

+    if (msglength<= 0)

+    {

+        session->newdata = CWMP_NO;

+        cwmp_log_debug("analyse receive length is 0");

+	    goto eventcheck;

+//        return CWMP_ERROR;

+    }

+    

+    doctmppool = pool_create(POOL_DEFAULT_SIZE);

+	if(NULL == doctmppool)

+	{

+	    cwmp_log_error("doctmppool is null");

+		return CWMP_ERROR;

+	}		

+

+    xmlbuf = pool_palloc(doctmppool, msglength+32);

+	if(NULL == xmlbuf)

+	{

+	    cwmp_log_error("xmlbuf is null");

+		return CWMP_ERROR;

+	}	

+

+    len = sprintf(xmlbuf,"<cwmp>");

+    cwmp_chunk_copy(xmlbuf + len, session->readers, msglength);

+    strncpy(xmlbuf+len+msglength, "</cwmp>", 32-len-1);

+    strcpy(cwmp_id, "cwmp:ID");

+    to_upper_case_substring(xmlbuf, cwmp_id);

+

+    cwmp_log_debug("agent analyse xml: \n%s", xmlbuf);

+

+    doc = XmlParseBuffer(doctmppool, xmlbuf);

+    if (!doc)

+    {

+        cwmp_log_debug("analyse create doc null\n");

+        cwmp_chunk_write_string(session->writers, xml_fault, TRstrlen(xml_fault), session->envpool);

+        goto finished;

+

+    }

+

+    method = cwmp_get_rpc_method_name(doc);

+    cwmp_log_debug("analyse method is: %s\n", method);

+

+    cwmp_chunk_clear(session->writers);

+    pool_clear(session->envpool);

+

+    cwmp_log_info("----------------------------");

+

+    if (TRstrcmp(method, CWMP_RPC_GETRPCMETHODS) == 0)

+    {

+        newdoc = cwmp_session_create_getrpcmethods_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_INFORMRESPONSE) == 0)

+    {

+        newdoc = NULL;

+    }

+    else if (TRstrcmp(method, CWMP_RPC_GETPARAMETERNAMES) == 0)

+    {

+        newdoc = cwmp_session_create_getparameternames_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_GETPARAMETERVALUES) == 0)

+    {

+        newdoc = cwmp_session_create_getparametervalues_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_SETPARAMETERVALUES) == 0)

+    {

+        newdoc = cwmp_session_create_setparametervalues_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_DOWNLOAD) == 0)

+    {

+        newdoc = cwmp_session_create_download_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_UPLOAD) == 0)

+    {

+        newdoc = cwmp_session_create_upload_response_message(session, doc, doctmppool);

+    }

+   else if (TRstrcmp(method, CWMP_RPC_TRANSFERCOMPLETERESPONSE) == 0)

+    {

+        newdoc = NULL;

+    }

+    else if (TRstrcmp(method, CWMP_RPC_REBOOT) == 0)

+    {

+        newdoc = cwmp_session_create_reboot_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_ADDOBJECT) == 0)

+    {

+        newdoc = cwmp_session_create_addobject_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_DELETEOBJECT) == 0)

+    {

+        newdoc = cwmp_session_create_deleteobject_response_message(session, doc, doctmppool);

+    }

+    

+    else if (TRstrcmp(method, CWMP_RPC_FACTORYRESET) == 0)

+    {

+        newdoc = cwmp_session_create_factoryreset_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_GETPARAMETERATTRIBUTES) == 0)

+    {

+        newdoc = cwmp_session_create_getparamterattributes_response_message(session, doc, doctmppool);

+    }

+    else if (TRstrcmp(method, CWMP_RPC_SETPARAMETERATTRIBUTES) == 0)

+    {

+        newdoc = cwmp_session_create_setparamterattributes_response_message(session, doc, doctmppool);

+    }	

+    else if (TRstrcmp(method, CWMP_RPC_SCHEDULEINFORM) == 0)

+    {

+        schedule_inform_info_st si;

+		si.cwmp = session->cwmp;

+        newdoc = cwmp_session_create_scheduleinform_response_message(session, doc, doctmppool, &si);

+		int rc = schedule_inform_create_timer(&si);

+    }		

+    else

+    {

+    	//check event queue

+    	//newdoc = cwmp_session_create_event_response_message(session, doc, doctmppool);

+        cwmp_log_info("unknown method type:%s", method);

+    }

+

+    cwmp_log_info("----------------------------");

+

+//    cwmp_t * cwmp = session->cwmp;

+    if(newdoc == NULL)

+    {

+        cwmp_log_debug("agent analyse newdoc is null. ");

+		

+eventcheck:

+    	{

+    	   	

+    		cwmp_log_debug("agent analyse begin check global event, %d", cwmp->event_global.event_flag);

+    		

+    		//check global event for transfercomplete

+    	

+    		if(cwmp->event_global.event_flag & EVENT_REBOOT_TRANSFERCOMPLETE_FLAG)

+    		{

+    			cwmp->event_global.event_flag &=  ~EVENT_REBOOT_TRANSFERCOMPLETE_FLAG;

+    			if(!doctmppool)

+    			{

+    				doctmppool = pool_create(POOL_DEFAULT_SIZE);

+    			}

+

+				if(!doctmppool)

+				{

+				    cwmp_log_error("doctmppool pool create return null");

+					return CWMP_ERROR;

+				}

+    			event_code_t ec;

+    			ec.event = INFORM_TRANSFERCOMPLETE;

+    			TRstrncpy(ec.command_key, cwmp->event_global.event_key, COMMAND_KEY_LEN);

+    			ec.fault_code = cwmp->event_global.fault_code;

+    			ec.start = cwmp->event_global.start;

+    			ec.end = cwmp->event_global.end;

+    			newdoc = cwmp_session_create_transfercomplete_message(session, &ec, doctmppool);	

+    

+    		}

+    		

+    	}

+

+    }

+

+

+    cwmp_log_debug("newdoc %p, msglength: %d", newdoc, msglength );

+    if(newdoc != NULL) // || (newdoc == NULL && msglength == 0 && session->retry_count < 2))

+    {

+        session->newdata = CWMP_YES;

+        cwmp_write_doc_to_chunk(newdoc, session->writers,  session->envpool);

+	    rc = CWMP_OK;

+    }

+	else if(/*newdoc == NULL && */msglength != 0)

+	{

+        session->newdata = CWMP_YES;

+        cwmp_write_doc_to_chunk(newdoc, session->writers,  session->envpool);

+	    rc = CWMP_OK;	    

+	}

+	else

+    {  	

+	    rc = CWMP_ERROR;

+    }

+	

+finished:

+	if(doctmppool  != NULL)

+	{

+	    pool_destroy(doctmppool);

+	}

+	

+    return rc;

+}

+

+

+

+static void print_param(parameter_node_t * param, int level)

+{

+    if(!param) return; 

+   

+    parameter_node_t * child;

+    char fmt[128];

+    //cwmp_log_debug("name: %s, type: %s, level: %d\n", param->name, cwmp_get_type_string(param->type), level);

+    int i=0;

+    

+    snprintf(fmt, 127, "|%%-%ds%%s,  get:%%p set:%%p refresh:%%p\n", level*4);

+      

+    cwmp_log_debug_src(fmt, "----", param->name, param->get, param->set, param->refresh);

+  

+    child = param->child;

+  

+    if(!child)

+  	return;

+    print_param(child, level+1);

+  

+    parameter_node_t * next = child->next_sibling;

+  

+    while(next)

+    {

+        print_param(next, level+1);

+        next = next->next_sibling;

+    }

+}

+

+

+

+void cwmp_agent_session(cwmp_t * cwmp)

+{

+    char name[1024] = {0};

+    char value[1024]= {0};

+    char local_ip[256];

+

+    char * envstr;

+    char * encstr;

+

+    envstr = "SOAP-ENV"; //cwmp_conf_get("cwmp:soap_env");

+    encstr = "SOAP-ENC"; // cwmp_conf_get("cwmp:soap_enc");

+

+    cwmp_set_envelope_ns(envstr, encstr);

+

+#if 0

+    if (cwmp_session_get_localip(local_ip) == -1)

+    {

+        cwmp_log_error("get local ip error. exited.\n");

+        exit(-1);

+    }

+#else

+    cwmp_session_get_localip(local_ip);	

+#endif	

+

+    print_param(cwmp->root, 0);

+    

+    CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, ManagementServerModule, URLModule);

+    cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->acs_url, TRstrlen(cwmp->acs_url), cwmp->pool);

+

+    CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, ManagementServerModule, ConnectionRequestURLModule);

+    TRsnprintf(value, 1024, "http://%s:%d", local_ip, cwmp->httpd_port);

+    cwmp_data_set_parameter_value(cwmp, cwmp->root, name, value, TRstrlen(value), cwmp->pool);

+    cwmp_log_debug("set request name:%s, value:%s", name, value);

+   

+

+    CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, DeviceInfoModule, ManufacturerModule);

+    cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->cpe_mf, TRstrlen(cwmp->cpe_mf), cwmp->pool);

+

+

+    CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, DeviceInfoModule, ManufacturerOUIModule);

+    cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->cpe_oui, TRstrlen(cwmp->cpe_oui), cwmp->pool);

+

+    CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, DeviceInfoModule, ProductClassModule);

+    cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->cpe_pc, TRstrlen(cwmp->cpe_pc), cwmp->pool);

+

+    CWMP_SPRINTF_PARAMETER_NAME(name, 3, InternetGatewayDeviceModule, DeviceInfoModule, SerialNumberModule);

+    cwmp_data_set_parameter_value(cwmp, cwmp->root, name, cwmp->cpe_sn, TRstrlen(cwmp->cpe_sn), cwmp->pool);

+

+

+    cwmp_agent_start_session(cwmp);

+}

+

+

+/*

+int cwmp_agent_download_file(download_arg_t * dlarg)

+{

+    int faultcode = 0;

+    char url[255];

+    if (TRstrncasecmp(dlarg->url,  "ftp://", 6) == 0)

+    {

+        if (dlarg->username != NULL && strlen(dlarg->username) != 0)

+        {

+            TRsnprintf(url, 255, "ftp://%s:%s@%s", dlarg->username, dlarg->password, dlarg->url+6);

+        }

+        else

+        {

+            TRstrncpy(url, dlarg->url, 255);

+        }

+    }

+    else

+    {

+        TRstrncpy(url, dlarg->url, 255);

+    }

+

+    fetchIO * downfile =   fetchGetURL(url, "");

+    if (!downfile)

+    {

+        cwmp_log_debug("download file fail:  %s", url);

+        faultcode = 9001;

+    }

+    else

+    {

+        char readbuf[1024];

+        int readlen;

+        char targetfile[64];

+        if (dlarg->targetname != NULL && strlen(dlarg->targetname) != 0)

+        {

+            TRsnprintf(targetfile, 64, "/tmp/%s", dlarg->targetname);

+        }

+        else

+        {

+            TRsnprintf(targetfile, 64, "/tmp/%d.file", time(NULL));

+        }

+        FILE * df = fopen(targetfile, "wb+");

+        while (df != NULL)

+        {

+            readlen = fetchIO_read(downfile, readbuf, 1023);

+            if (readlen <= 0)

+            {

+                cwmp_log_debug("fetch io read zero. %s", readlen);

+                break;

+            }

+            readbuf[readlen] = 0;

+            fwrite(readbuf, readlen, 1, df);

+        }

+

+        if (df)

+        {

+            fclose(df);

+        }

+        else

+        {

+            faultcode = 9001;

+        }

+

+        cwmp_log_debug("download file ok:  %s, %s", url, targetfile);

+

+

+        fetchIO_close(downfile);

+    }

+

+

+    return faultcode;

+

+}

+

+

+

+int cwmp_agent_upload_file(upload_arg_t * ularg)

+{

+    int faultcode = 0;

+    char url[255];

+

+    if (TRstrncasecmp(ularg->url,  "ftp://", 6) == 0)

+    {

+        if (ularg->username != NULL && strlen(ularg->username) != 0)

+        {

+            TRsnprintf(url, 255, "ftp://%s:%s@%s", ularg->username, ularg->password, ularg->url+6);

+        }

+        else

+        {

+            TRstrncpy(url, ularg->url, 255);

+        }

+    }

+    else

+    {

+        TRstrncpy(url, ularg->url, 255);

+    }

+

+    fetchIO * uploadfile =   fetchPutURL(url, "");

+    if (!uploadfile)

+    {

+        cwmp_log_debug("upload file fail:  %s", url);

+        faultcode = 9001;

+    }

+    else

+    {

+        char readbuf[1024];

+        int readlen;

+	char targetfile[64];

+	FILE * uf;

+	int rc;

+	if(strcmp(ularg->filetype, "1 Vendor Configuration File") == 0)

+	{

+		//¸ù¾Ýʵ¼ÊÇé¿ö, ÐÞ¸ÄÕâÀïµÄÅäÖÃÎļþ·¾¶

+		

+		uf = fopen("/tmp/mysystem.cfg", "rb");		

+	}

+	else if(strcmp(ularg->filetype, "2 Vendor Log File") == 0)

+	{

+		//¸ù¾Ýʵ¼ÊÇé¿ö, ÐÞ¸ÄÕâÀïµÄÅäÖÃÎļþ·¾¶

+		uf = fopen("/tmp/mysystem.log", "rb");	

+	}

+	else

+	{

+		uf = fopen("/tmp/mysystem.log", "rb");	

+	}

+

+		

+        while (uf != NULL)

+        {

+            readlen = fread(readbuf, 1024, 1,  uf);

+            if (readlen <= 0)

+            {

+                cwmp_log_debug("fetch io read zero. %s", readlen);

+			

+                break;

+            }

+            readbuf[readlen] = 0;

+

+	   rc = fetchIO_write(uploadfile, readbuf, readlen);

+	   if(rc <= 0)

+	   {

+		faultcode = 9001;

+		break;

+	   }

+		

+        }

+

+	if(uf)

+	{

+		fclose(uf);

+	}

+	else

+	{

+		faultcode = 9001;

+	}

+	

+

+

+        cwmp_log_debug("upload file finished:  %s, file:%s", url, targetfile);

+

+

+        fetchIO_close(uploadfile);

+    }

+

+

+    return faultcode;

+

+}

+*/

+

+

+

+int cwmp_agent_download_file(download_arg_t * dlarg)

+{

+    int faultcode = 0;

+    char * fromurl = dlarg->url;

+

+    char tofile[256+1] = {0};

+	char downloadroot[256+1] = {0};

+

+	FUNCTION_TRACE();

+	

+    if(!fromurl)

+    {

+        cwmp_log_error("download src file path is null!");

+		return 9001;

+	}

+	

+	if(NULL == dlarg->targetname)

+	{

+        if(TRstrcmp(dlarg->filetype, "1 Firmware Upgrade Image") == 0)

+        {

+    	    cwmp_conf_get("file:download_img_path", tofile);

+        }

+    	else if(TRstrcmp(dlarg->filetype, "3 Vendor Configuration File") == 0)

+    	{

+    	    cwmp_conf_get("file:download_cfg_path", tofile);

+    	}

+    	else

+    	{

+            cwmp_conf_get("file:download_unknown_path", tofile);

+    	}

+	}

+	else

+	{

+	    cwmp_conf_get("file:download_root", downloadroot);

+		TRsnprintf(tofile, 256, "%s/%s", downloadroot, dlarg->targetname);

+	}

+

+	cwmp_log_info("file type:%s, save file(%s) to path:%s", dlarg->filetype, fromurl, tofile);

+

+    if(/*dlarg->url &&*/ TRstrncasecmp("ftp://", dlarg->url, 6) == 0)

+    {

+	    cwmp_log_debug("Download url:%s", dlarg->url);

+	    return 9001;

+	}

+

+    faultcode = http_receive_file(fromurl, tofile);

+

+    if(faultcode != CWMP_OK)

+    {

+        cwmp_log_debug("faultcode:%d", faultcode);

+	    faultcode = 9001;

+    }

+   

+    return faultcode;

+}

+

+

+

+int cwmp_agent_upload_file(upload_arg_t * ularg)

+{

+    int faultcode = 0;

+    FUNCTION_TRACE();

+    char * fromfile;

+

+	char cfg_path[256] = {0};

+	char log_path[256] = {0};

+

+	FUNCTION_TRACE();

+

+	cwmp_conf_get("file:upload_cfg_path", cfg_path);

+	cwmp_conf_get("file:upload_log_path", log_path);

+

+	if(TRstrcmp(ularg->filetype, "1 Vendor Configuration File") == 0)

+	{

+		fromfile = cfg_path;

+	}

+	else if(TRstrcmp(ularg->filetype, "2 Vendor Log File") == 0)

+	{

+		fromfile = log_path;

+	}

+	else

+	{

+		fromfile = cfg_path;

+	}

+

+	cwmp_log_info("upload type:%s, send file:%s, url:%s", ularg->filetype, fromfile, ularg->url);

+

+

+	faultcode = http_send_file(fromfile, ularg->url);

+

+    if(faultcode != CWMP_OK)

+    {  

+        cwmp_log_error("http send file return[%d], not CWMP_OK, set faultcode 9001", faultcode);

+	    faultcode = 9001;

+    }

+   

+    return faultcode;

+}

+

+

+

+int cwmp_agent_run_tasks(cwmp_t * cwmp)

+{

+	void * data;

+	int tasktype = 0;;

+	int ok = CWMP_NO;

+	int rc = 0;

+

+	FUNCTION_TRACE();

+	

+	while(1)

+	{

+		tasktype = queue_pop(cwmp->queue, &data);

+		if(tasktype == -1)

+		{

+			cwmp_log_debug("no more task to run");

+			break;

+		}

+		ok = CWMP_YES;

+		switch(tasktype)

+		{

+			case TASK_DOWNLOAD_TAG:

+				{

+					cwmp_log_debug("Download begin.....");

+					

+					download_arg_t * dlarg = (download_arg_t*)data;

+					//begin download file

+					time_t starttime = time(NULL);

+					int faultcode = 0;

+

+					faultcode = cwmp_agent_download_file(dlarg);

+					

+					time_t endtime = time(NULL);

+					cwmp_event_set_value(cwmp, INFORM_TRANSFERCOMPLETE, 1,dlarg->cmdkey, faultcode, starttime, endtime);

+					

+					

+					FREE(dlarg);

+

+					cwmp_log_debug("Download OK.....");

+				}

+				break;

+

+			case TASK_UPLOAD_TAG:

+				{

+					cwmp_log_debug("Upload begin.....");

+					

+					upload_arg_t * ularg = (upload_arg_t*)data;

+					//begin download file

+					time_t starttime = time(NULL);

+					int faultcode = 0;

+		

+					faultcode = cwmp_agent_upload_file(ularg);

+					

+					time_t endtime = time(NULL);

+					cwmp_event_set_value(cwmp, INFORM_TRANSFERCOMPLETE, 1,ularg->cmdkey, faultcode, starttime, endtime);

+					

+					

+					FREE(ularg);

+

+					cwmp_log_debug("Upload OK.....");

+				}

+				break;

+

+			case TASK_REBOOT_TAG:

+				{

+					//begin reboot system

+					cwmp_log_debug("reboot ...");

+					cwmp_event_set_value(cwmp, INFORM_MREBOOT, 1, NULL, 0, 0, 0);

+					cwmp_event_clear_active(cwmp);

+

+                    // inorder to save file ok

+

+					sleep(20);

+					

+					rc = restart_request(MODULE_ID_TR069);

+

+					if(0 != rc)

+					{

+					    cwmp_log_info("restart request fail! rc:%d", rc);

+					}

+				}

+				break;

+

+			case TASK_FACTORYRESET_TAG:

+				{

+					//begin factory reset system

+					cwmp_log_debug("factory reset  begin...");

+					

+					cwmp_event_clear_active(cwmp);

+					

+					rc = reset_request(MODULE_ID_TR069);

+

+					if(0 != rc)

+					{

+					    cwmp_log_info("reset request fail! rc:%d", rc);

+					}

+

+

+					cwmp_log_debug("factory reset OK.....");

+				}

+				break;

+

+			default:

+

+				break;

+

+		}

+	}

+

+	return ok;

+}

+

+

+

+

+

+

diff --git a/lynq/MD310EU/ap/app/cwmp/netcwmp/libcwmp/include/cwmp/cwmp.h b/lynq/MD310EU/ap/app/cwmp/netcwmp/libcwmp/include/cwmp/cwmp.h
new file mode 100755
index 0000000..117edf1
--- /dev/null
+++ b/lynq/MD310EU/ap/app/cwmp/netcwmp/libcwmp/include/cwmp/cwmp.h
@@ -0,0 +1,589 @@
+/************************************************************************

+ *                                                                      *

+ * Netcwmp Project                                                      *

+ *                                                                      *

+ * A software client for enabling TR-069 in embedded devices (CPE).     *

+ *                                                                      *

+ * Copyright (C) 2013-2014  netcwmp.netcwmp group                         *

+ *                                                                      *

+ * Copyright 2013-2014           Mr.x() <netcwmp@gmail.com>          *

+ *                                                                      *

+ ***********************************************************************/

+

+#ifndef __CWMP_H__

+#define __CWMP_H__

+

+#include <cwmp/xmlet.h>

+#include <cwmp/types.h>

+#include <cwmp/util.h>

+#include <cwmp/memory.h>

+#include <cwmp/buffer.h>

+#include <cwmp/event.h>

+#include <cwmp/queue.h>

+

+

+#define ASSERT assert

+#define XMLCAST(x)  ((XmlChar *)(x))

+

+

+

+

+

+

+#define CWMP_HEAD_MAX   64

+#define CWMP_NAME_MAX   64

+#define CWMP_PARAMVALUE_SIZE	512

+

+#define SOAP_ENV_NS  "http://schemas.xmlsoap.org/soap/envelope/"

+#define SOAP_ENC_NS "http://schemas.xmlsoap.org/soap/encoding/"

+#define SOAP_XSI_NS  "http://www.w3.org/2001/XMLSchema-instance"

+#define SOAP_XSD_NS  "http://www.w3.org/2001/XMLSchema"

+#define SOAP_CWMP_NS "urn:dslforum-org:cwmp-1-0"

+

+

+

+#define SOAP_ENV_DEFAULT		"SOAP-ENV"

+#define SOAP_ENC_DEFAULT		"SOAP-ENC"

+#define SOAP_XML_HEADER			"Header"

+#define SOAP_XML_BODY	  		"Body"

+#define SOAP_XML_ENVELOPE  		"Envelope"

+#define SOAP_XML_FAULT			"Fault"

+

+

+

+#define CWMP_XML_HEADER_ID	         		"cwmp:ID"

+#define CWMP_XML_HEADER_HOLDREQUESTS	 	    "cwmp:HoldRequests"

+#define CWMP_XML_HEADER_NOMOREREQUESTS	 	    "cwmp:NoMoreRequests"

+#define CWMP_XML_INFORM_MAXENVELOPES	    "MaxEnvelopes"

+#define CWMP_XML_GETPARAMETERNAMES_PARAMETERPATH	 	    "ParameterPath"

+#define CWMP_XML_GETPARAMETERNAMES_NEXTLEVEL	 			"NextLevel"

+#define CWMP_XML_COMMANDKEY	"CommandKey"

+

+

+

+#define SOAP_XSI_TYPE            "xsi:type"

+#define SOAP_XSI_NAME            "xsi:name"

+

+#define SOAP_XSD_STRING          "xsd:string"

+#define SOAP_XSD_UNSIGNEDINT     "xsd:unsignedInt"

+#define SOAP_XSD_ANY             "xsd:any"

+#define SOAP_XSD_DATETIME        "xsd:dateTime"

+#define SOAP_TYPE_ARRAYTYPE        "arrayType"

+

+

+

+#define CWMP_XML_MUSTUNDERSTAND "mustUnderstand"

+

+#define CWMP_RPC_INFORM		 						"cwmp:Inform"

+#define CWMP_RPC_INFORMRESPONSE		 				"cwmp:InformResponse"

+#define CWMP_RPC_GETPARAMETERNAMES  				"cwmp:GetParameterNames"

+#define CWMP_RPC_GETPARAMETERNAMESRESPONSE          "cwmp:GetParameterNamesResponse"

+#define CWMP_RPC_GETPARAMETERVALUES  				"cwmp:GetParameterValues"

+#define CWMP_RPC_GETPARAMETERVALUESRESPONSE         "cwmp:GetParameterValuesResponse"

+#define CWMP_RPC_SETPARAMETERVALUES  				"cwmp:SetParameterValues"

+#define CWMP_RPC_SETPARAMETERVALUESRESPONSE         "cwmp:SetParameterValuesResponse"

+#define CWMP_RPC_GETRPCMETHODS  					"cwmp:GetRPCMethods"

+#define CWMP_RPC_GETRPCMETHODSRESPONSE  		    "cwmp:GetRPCMethodsResponse"

+#define CWMP_RPC_DOWNLOAD	 						"cwmp:Download"

+#define CWMP_RPC_DOWNLOADRESPONSE	 				"cwmp:DownloadResponse"

+#define CWMP_RPC_UPLOAD	 							"cwmp:Upload"

+#define CWMP_RPC_UPLOADRESPONSE	 					"cwmp:UploadResponse"

+#define CWMP_RPC_REBOOT	 							"cwmp:Reboot"

+#define CWMP_RPC_REBOOTRESPONSE	 					"cwmp:RebootResponse"

+#define CWMP_RPC_ADDOBJECT	 						"cwmp:AddObject"

+#define CWMP_RPC_ADDOBJECTRESPONSE	 				"cwmp:AddObjectResponse"

+#define CWMP_RPC_DELETEOBJECT	 					"cwmp:DeleteObject"

+#define CWMP_RPC_DELETEOBJECTRESPONSE	 			"cwmp:DeleteObjectResponse"

+#define CWMP_RPC_TRANSFERCOMPLETE	 			    "cwmp:TransferComplete"

+#define CWMP_RPC_TRANSFERCOMPLETERESPONSE 			"cwmp:TransferCompleteResponse"

+#define CWMP_RPC_FACTORYRESET                       "cwmp:FactoryReset"

+#define CWMP_RPC_FACTORYRESETRESPONSE               "cwmp:FactoryResetResponse"

+

+#define CWMP_RPC_GETPARAMETERATTRIBUTES  			"cwmp:GetParameterAttributes"

+#define CWMP_RPC_GETPARAMETERATTRIBUTESRESPONSE     "cwmp:GetParameterAttributesResponse"

+#define CWMP_RPC_SETPARAMETERATTRIBUTES  		    "cwmp:SetParameterAttributes"

+#define CWMP_RPC_SETPARAMETERATTRIBUTESRESPONSE     "cwmp:SetParameterAttributesResponse"

+

+#define CWMP_RPC_SCHEDULEINFORM  	         	    "cwmp:ScheduleInform"

+#define CWMP_RPC_SCHEDULEINFORMRESPONSE  	        "cwmp:ScheduleInformResponse"

+

+

+

+#define CWMP_INFORM_EVENT_CODE_0  "0 BOOTSTRAP"

+#define CWMP_INFORM_EVENT_CODE_1  "1 BOOT"

+#define CWMP_INFORM_EVENT_CODE_2  "2 PERIODIC"

+#define CWMP_INFORM_EVENT_CODE_3  "3 SCHEDULED"

+#define CWMP_INFORM_EVENT_CODE_4  "4 VALUE CHANGE"

+#define CWMP_INFORM_EVENT_CODE_5  "5 KICKED"

+#define CWMP_INFORM_EVENT_CODE_6  "6 CONNECTION REQUEST"

+#define CWMP_INFORM_EVENT_CODE_7  "7 TRANSFER COMPLETE"

+#define CWMP_INFORM_EVENT_CODE_8  "8 DIAGNOSTICS COMPLETE"

+#define CWMP_INFORM_EVENT_CODE_9  "9 REQUEST DOWNLOAD"

+#define CWMP_INFORM_EVENT_CODE_10  "10 AUTONOMOUS TRANSFER COMPLETE"

+#define CWMP_INFORM_EVENT_CODE_11  "M Reboot"

+#define CWMP_INFORM_EVENT_CODE_12  "M ScheduleInform"

+#define CWMP_INFORM_EVENT_CODE_13  "M Download"

+#define CWMP_INFORM_EVENT_CODE_14  "M Upload"

+#define CWMP_INFORM_EVENT_CODE_15  "M X_0_AccountChanged"

+#define CWMP_INFORM_EVENT_CODE_16  "M 16"

+#define CWMP_INFORM_EVENT_CODE_17  "M 17"

+

+#define FAULT_CODE_OK			0

+#define FAULT_CODE_9000              9000

+#define FAULT_CODE_9001              9001

+#define FAULT_CODE_9002              9002

+#define FAULT_CODE_9003              9003

+#define FAULT_CODE_9004              9004

+#define FAULT_CODE_9005              9005

+#define FAULT_CODE_9006              9006

+#define FAULT_CODE_9007              9007

+#define FAULT_CODE_9008              9008

+#define FAULT_CODE_9009              9009

+#define FAULT_CODE_9010              9010

+#define FAULT_CODE_9011              9011

+#define FAULT_CODE_9012              9012

+#define FAULT_CODE_9013              9013

+#define FAULT_CODE_9014              9014

+#define FAULT_CODE_9015              9015

+#define FAULT_CODE_9016              9016

+#define FAULT_CODE_9017              9017

+#define FAULT_CODE_9018              9018

+#define FAULT_CODE_9019              9019

+

+

+

+#define FAULT_STR_9000  "Method not supported"

+#define FAULT_STR_9001  "Request denied"

+#define FAULT_STR_9002  "Internal error"

+#define FAULT_STR_9003  "Invalid arguments"

+#define FAULT_STR_9004  "Resources exceeded"

+#define FAULT_STR_9005  "Invalid parameter name"

+#define FAULT_STR_9006  "Invalid parameter type"

+#define FAULT_STR_9007  "Invalid parameter value"

+#define FAULT_STR_9008  "Attempt to set a non-writable parameter"

+#define FAULT_STR_9009  "Notification request rejected"

+#define FAULT_STR_9010  "Download failure"

+#define FAULT_STR_9011  "Upload failure"

+#define FAULT_STR_9012  "File transfer server authentication failure"

+#define FAULT_STR_9013  "Unsupported protocol for file transfer"

+#define FAULT_STR_9014  "Download failure: unable to join multicast group"

+#define FAULT_STR_9015  "Download failure: unable to contact file server"

+#define FAULT_STR_9016  "Download failure: unable to access file"

+#define FAULT_STR_9017  "Download failure: unable to complete download"

+#define FAULT_STR_9018  "Download failure: file corrupted"

+#define FAULT_STR_9019  "Download failure: file authentication failure"

+

+#define FAULT_STRING(x)	cwmp_get_fault_string(x)

+

+

+#define InternetGatewayDeviceModule         "InternetGatewayDevice"

+#define DeviceSummaryModule                 "DeviceSummary"

+#define DeviceInfoModule                    "DeviceInfo"

+

+#define ManufacturerModule                  "Manufacturer"

+#define ManufacturerOUIModule               "ManufacturerOUI"

+#define ProductClassModule                  "ProductClass"

+#define DescriptionModule                   "Description"

+#define SerialNumberModule                  "SerialNumber"

+#define SpecVersionModule                   "SpecVersion"

+#define HardwareVersionModule               "HardwareVersion"

+#define SoftwareVersionModule               "SoftwareVersion"

+#define ProvisioningCodeModule              "ProvisioningCode"

+#define UpTimeModule                        "UpTime"

+#define DeviceLogModule                     "DeviceLog"

+

+

+#define ManagementServerModule              "ManagementServer"

+#define URLModule                           "URL"

+#define UsernameModule                      "Username"

+#define PasswordModule                      "Password"

+#define PeriodicInformIntervalModule        "PeriodicInformInterval"

+#define PeriodicInformTimeModule            "PeriodicInformTime"

+#define PeriodicInformEnableModule          "PeriodicInformEnable"

+#define ParameterKeyModule                  "ParameterKey"

+#define ConnectionRequestURLModule          "ConnectionRequestURL"

+#define ConnectionRequestUsernameModule     "ConnectionRequestUsername"

+#define ConnectionRequestPasswordModule     "ConnectionRequestPassword"

+#define UpgradesManagedModule               "UpgradesManaged"

+#define UDPConnectionRequestAddressModule   "UDPConnectionRequestAddress"

+#define STUNEnableModule                    "STUNEnable"

+#define STUNServerAddressModule             "STUNServerAddress"

+#define STUNServerPortModule                "STUNServerPort"

+#define STUNUsernameModule                  "STUNUsernameb"

+#define STUNPasswordModule                  "STUNPassword"

+#define NATDetectedModule                   "NATDetected"

+

+

+#define DeviceConfigModule                  "DeviceConfig"

+#define PersistentDataModule                "PersistentData"

+#define ConfigFileModule                    "ConfigFile"

+

+

+#define TimeModule                          "Time"

+#define NTPServer1Module                    "NTPServer1"

+#define NTPServer2Module                    "NTPServer2"

+#define CurrentLocalTimeModule              "CurrentLocalTime"

+#define LocalTimeZoneModule                 "LocalTimeZone"

+#define LocalTimeZoneNameModule             "LocalTimeZoneName"

+#define DaylightSavingsUsedModule           "DaylightSavingsUsed"

+#define DaylightSavingsStartModule          "DaylightSavingsStart"

+#define DaylightSavingsEndModule            "DaylightSavingsEnd"

+

+

+#define DeviceSummaryModule                 "DeviceSummary"

+

+#define WANDeviceModule                     "WANDevice"

+

+#define WANConnectionDeviceModule           "WANConnectionDevice"

+#define WANIPConnectionModule               "WANIPConnection"

+#define ExternalIPAddressModule             "ExternalIPAddress"

+

+

+

+

+

+

+

+

+typedef enum

+{

+	CWMP_EMPTY_METHOD,

+	CWMP_INFORM_METHOD,

+	CWMP_INFORMRESPONSE_METHOD,

+	CWMP_GETPARAMETERNAMES_METHOD,

+	CWMP_GETPARAMETERNAMESRESPONSE_METHOD,

+	CWMP_GETPARAMETERVALUES_METHOD,

+	CWMP_GETPARAMETERVALUESRESPONSE_METHOD,

+	CWMP_SETPARAMETERVALUES_METHOD,

+	CWMP_SETPARAMETERVALUESRESPONSE_METHOD,

+	CWMP_GETRPCMETHODS_METHOD,

+	CWMP_GETRPCMETHODSRESPONSE_METHOD,

+	CWMP_DOWNLOAD_METHOD,

+	CWMP_DOWNLOADRESPONSE_METHOD,

+	CWMP_UPLOAD_METHOD,

+	CWMP_UPLOADRESPONSE_METHOD,

+	CWMP_REBOOT_METHOD,

+	CWMP_REBOOTRESPONSE_METHOD,

+	CWMP_ADDOBJECT_METHOD,

+	CWMP_ADDOBJECTRESPONSE_METHOD,

+	CWMP_DELETEOBJECT_METHOD,

+	CWMP_DELETEOBJECTRESPONSE_METHOD

+

+

+}cwmp_method_t;

+

+

+

+

+enum cwmp_type_t

+{

+	TYPE_OBJECT=0,	//obj

+	TYPE_INT,	//int

+	TYPE_UNSIGNEDINT, //uint

+	TYPE_STRING,  	//s

+	TYPE_STRING16,	//s16

+	TYPE_STRING32,	//s32

+	TYPE_STRING64,	//s64

+	TYPE_STRING128,	//s128

+	TYPE_STRING256,	//s256

+	TYPE_STRING1024, //s1024

+	TYPE_DATETIME,	//dt

+	TYPE_BOOLEAN,	//bool

+	TYPE_BASE64,	//base

+	TYPE_ANY,

+	TYPE_UNKNOWN

+};

+

+enum InformEventType

+{

+	INFORM_BOOTSTRAP = 0,

+	INFORM_BOOT,

+	INFORM_PERIODIC,

+	INFORM_SCHEDULED,

+	INFORM_VALUECHANGE,

+	INFORM_KICKED,

+	INFORM_CONNECTIONREQUEST,

+	INFORM_TRANSFERCOMPLETE,

+	INFORM_DIAGNOSTICSCOMPLETE,

+	INFORM_REQUESTDOWNLOAD,

+	INFORM_AUTONOMOUSTRANSFERCOMPLETE,

+	INFORM_MREBOOT,

+	INFORM_MSCHEDULEINFORM,

+	INFORM_MDOWNLOAD,

+	INFORM_MUPLOAD,

+	INFORM_ACCOUNTCHANGE,

+	INFORM_MVENDORSPECRPC,

+	INFORM_XOUIEVENT,

+	INFORM_MAX

+};

+

+#define SESSION_RUNNING  (1)

+#define SESSION_NO_RUNNING  (0)

+

+typedef struct datatime_st

+{

+    unsigned int year;

+    unsigned int month;

+    unsigned int day;

+    unsigned int hour;

+    unsigned int min;

+    unsigned int sec;

+}datatime_st;

+

+

+typedef struct periodic_info_st

+{

+	int PeriodicInformEnable;

+	int PeriodicInformInterval;

+	datatime_st PeriodicInformTime;

+

+}periodic_info_st;

+

+

+

+struct cwmp_st

+{

+	cwmp_t			* old_cwmp;

+	int new_request;

+	int httpd_port;

+

+	int    cpe_auth;

+	int    acs_auth;

+

+	char * acs_url;

+	char * cpe_mf;

+	char * cpe_oui;

+	char * cpe_sn;

+	char * cpe_pc;

+	char * cpe_name;

+

+	char * acs_user;

+	char * acs_pwd;

+	char * cpe_user;

+	char * cpe_pwd;

+

+	char * event_filename;

+

+	pthread_mutex_t     event_mutex;

+	

+	event_list_t * el;

+

+	int	event_count;

+

+	event_global_t    event_global;

+

+	transfer_t    transfer_info;      //ÓÃÓÚDownloadºÍUpload

+

+	queue_t  *	queue;

+

+	pool_t * pool;

+	parameter_node_t * root;

+

+	int session_running;

+

+	

+

+#ifdef USE_CWMP_OPENSSL

+    SSL_CTX * ssl_ctx;

+#endif

+

+    int boot_flag;

+

+	periodic_info_st periodic_info;

+};

+

+

+

+

+typedef struct parameter_node_attr_st

+{

+	cwmp_byte_t   type;     /* 0:single 1:multi */

+	cwmp_byte_t   nc;             /* Notification,0:off,1:passive,2:active */

+	cwmp_uint64_t   acl;            /* access list */

+	cwmp_uint64_t	ext;

+}parameter_node_attr_st;

+

+#define PARAMETER_NODE_V_PADDING	0,0,0,0,0

+

+struct parameter_node_st

+{

+	char *    name;

+	cwmp_byte_t	rw;	//read / writable

+	cwmp_byte_t     type;	

+	

+	size_t		value_length;

+	char *          value;

+	parameter_node_attr_t attr;

+

+	parameter_node_t * parent;

+	parameter_node_t * child;

+	parameter_node_t * prev_sibling;

+	parameter_node_t * next_sibling;

+

+	parameter_get_handler_pt    	get;

+	parameter_set_handler_pt    	set;

+	parameter_notify_handler_pt 	notify;

+	parameter_add_handler_pt  	add;

+	parameter_del_handler_pt	del;

+	parameter_refresh_handler_pt	refresh;

+

+

+

+	cwmp_uint32_t	max;

+	cwmp_uint32_t	ext1;

+	cwmp_uint32_t	ext2;

+	cwmp_uint32_t	ext3;

+	cwmp_uint32_t	ext4;

+

+};

+

+

+

+

+

+struct download_arg_st

+{

+    char            *cmdkey;

+    char            *filetype;

+    char            *url;

+    char            *username;

+    char            *password;

+    char            *targetname;

+    char            *succurl;

+    char            *failurl;

+    unsigned int   delaysec;

+    unsigned int   filesize;

+};

+

+

+struct upload_arg_st

+{

+    char            *cmdkey;

+    char            *filetype;

+    char            *url;

+    char            *username;

+    char            *password;

+    unsigned int   delaysec;

+};

+

+

+struct fault_code_st

+{

+	int fault_code;

+	char * fault_string;

+};

+

+

+

+typedef struct schedule_inform_info_st

+{

+	cwmp_t * cwmp;

+

+	int delaytime;

+	char commandKey[COMMAND_KEY_LEN+1];

+	int timer_running;

+}schedule_inform_info_st;

+

+

+

+typedef struct  envelope_t envelope_t;

+

+

+void cwmp_set_envelope_ns(const char * envstr, const char * encstr);

+

+

+char * cwmp_xml_get_node_attribute(xmlnode_t * node, const char * name);

+

+

+parameter_list_t* cwmp_create_parameter_list(env_t * env );

+

+parameter_t* cwmp_create_parameter(env_t * env ,  const char * name, const char * value, size_t value_length, int type);

+parameter_t* cwmp_create_parameter_ex(env_t * env ,  const char * name, const char * value, size_t value_length, int type, parameter_node_attr_t *attr);

+

+

+

+int cwmp_create_parameter_node(env_t * env ,  parameter_node_t ** news, const char * name);

+

+download_arg_t * cwmp_clone_download_arg(download_arg_t * dlarg);

+upload_arg_t * cwmp_clone_upload_arg(upload_arg_t * ularg);

+

+xmldoc_t* cwmp_create_inform_message(env_t * env ,  header_t * header,

+		device_id_t * deviceid,

+		event_list_t *events,

+		datatime_t * currentt,

+		unsigned int max_envelope,

+		unsigned int retry_count,

+		parameter_list_t * pl);

+

+xmldoc_t* cwmp_create_getparameternames_response_message(env_t * env ,

+		header_t * header,

+		const char * path_name,

+		parameter_node_t * node,

+		unsigned int next_subset,

+		unsigned int next_level);

+

+xmldoc_t *  cwmp_create_getparametervalues_response_message(env_t * env ,

+    header_t * header,

+    parameter_list_t * pl);

+

+xmldoc_t *  cwmp_create_setparametervalues_response_message(env_t * env ,

+    header_t * header,

+    unsigned int status);

+

+xmldoc_t *  cwmp_create_getrpcmethods_response_message(env_t * env ,

+    header_t * header,

+    char ** methods,

+    unsigned int count);

+

+xmldoc_t *  cwmp_create_reboot_response_message(env_t * env ,

+    header_t * header);

+

+xmldoc_t * cwmp_create_download_response_message(env_t * env , header_t * header, int status);

+xmldoc_t * cwmp_create_upload_response_message(env_t * env , header_t * header, int status);

+xmldoc_t * cwmp_create_transfercomplete_message(env_t * env ,  header_t * header, event_code_t * evcode);

+xmldoc_t * cwmp_create_addobject_response_message(env_t * env , header_t * header, int instances, int status);

+xmldoc_t * cwmp_create_deleteobject_response_message(env_t * env , header_t * header, int status);

+xmldoc_t * cwmp_create_faultcode_response_message(env_t * env , header_t * header, fault_code_t * fault);

+xmldoc_t * cwmp_create_faultcode_setparametervalues_response_message(env_t * env , header_t * header, parameter_list_t * param_list, fault_code_t * fault);

+xmldoc_t * cwmp_create_factoryreset_response_message(env_t * env ,  header_t * header);

+

+event_code_t * cwmp_create_event_code(env_t * env );

+event_list_t * cwmp_create_event_list(env_t * env, int  size );

+

+int     cwmp_add_parameter_to_list(env_t * env ,  parameter_list_t * pl, parameter_t * parameter);

+void    cwmp_add_event_to_list(env_t * env ,  event_list_t * eventlist, event_code_t * event);

+

+int     cwmp_parse_getparameternames_message(env_t * env, xmldoc_t * doc, char ** path_name, unsigned int * next_level, fault_code_t *fault);

+int     cwmp_parse_getparametervalues_message(env_t * env ,   xmldoc_t * doc, parameter_node_t * root, parameter_list_t ** ppl, fault_code_t *fault);

+int     cwmp_parse_setparametervalues_message(env_t * env ,   xmldoc_t * doc, parameter_node_t * root, parameter_list_t ** ppl, fault_code_t *fault);

+int     cwmp_parse_reboot_message(env_t * env , xmldoc_t *doc, char ** key, fault_code_t *fault);

+int cwmp_parse_addobject_message(env_t * env , xmldoc_t *doc, parameter_node_t * root,  int * instances, int* status, fault_code_t *fault);

+int cwmp_parse_deleteobject_message(env_t * env , xmldoc_t *doc, parameter_node_t * root, int* status, fault_code_t *fault);

+

+xmlnode_t * cwmp_get_rpc_method_node(xmldoc_t *  doc);

+xmlnode_t * cwmp_get_header_node(xmldoc_t *  doc);

+

+int     cwmp_parse_header_node(xmlnode_t * node, header_t ** header, pool_t * pool);

+char *  cwmp_get_rpc_method_name(xmldoc_t *  doc);

+char *  cwmp_get_type_string(int type);

+int	cwmp_get_type_value(char * type);

+char *  cwmp_get_fault_string(int code);

+

+parameter_node_t * cwmp_get_parameter_node(parameter_node_t * root, const char * param_name);

+parameter_node_t * cwmp_get_parameter_path_node(parameter_node_t * parent, const char * param_name);

+

+int cwmp_get_parameter_node_value(cwmp_t * cwmp, parameter_node_t * node, const char * name, char ** value, pool_t * pool);

+int cwmp_set_parameter_node_value(cwmp_t * cwmp, parameter_node_t * node, const char * name, const char * value, int value_length);

+int     cwmp_write_doc_to_chunk(xmldoc_t *  doc, cwmp_chunk_t * chunk, pool_t * pool);

+

+xmldoc_t * cwmp_xml_parse_buffer(pool_t * pool, char * buffer);

+xmlnode_t * cwmp_xml_get_child_with_name(void * nodeptr, const char * nodeName);

+

+

+#define XmlNodeGetDocRoot(docptr)    XmlNodeGetFirstChild(XmlNodeGetFirstChild(& (docptr)->node))

+

+

+

+

+#endif // CWMP_H

+

diff --git a/lynq/MD310EU/ap/app/dmp-test/.Makefile.swp b/lynq/MD310EU/ap/app/dmp-test/.Makefile.swp
new file mode 100755
index 0000000..ef332a3
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/.Makefile.swp
Binary files differ
diff --git a/lynq/MD310EU/ap/app/dmp-test/MQTTClient.c b/lynq/MD310EU/ap/app/dmp-test/MQTTClient.c
new file mode 100755
index 0000000..c39c6a8
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/MQTTClient.c
@@ -0,0 +1,795 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2017 IBM Corp.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *   Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation
+ *   Ian Craggs - fix for #96 - check rem_len in readPacket
+ *   Ian Craggs - add ability to set message handler separately #6
+ *******************************************************************************/
+#include "MQTTClient.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#define MQTT_RECONN_MINTIMESPACE        (1*60*1000)      //Reconnect min timespace, unit:ms
+#define MQTT_RECONN_MAXCOUNT            (30)             //Reconnect max count
+
+static void NewMessageData(MessageData* md, MQTTString* aTopicName, MQTTMessage* aMessage) {
+    md->topicName = aTopicName;
+    md->message = aMessage;
+}
+
+
+static int getNextPacketId(MQTTClient *c) {
+    return c->next_packetid = (c->next_packetid == MAX_PACKET_ID) ? 1 : c->next_packetid + 1;
+}
+
+
+static int sendPacket(MQTTClient* c, int length, Timer* timer)
+{
+    int rc = FAILURE,
+        sent = 0;
+
+    while (sent < length && !TimerIsExpired(timer))
+    {
+        rc = c->ipstack->mqttwrite(c->ipstack, &c->buf[sent], length, TimerLeftMS(timer));
+        if (rc < 0)  // there was an error writing the data
+            break;
+        sent += rc;
+    }
+    if (sent == length)
+    {
+        TimerCountdown(&c->last_sent, c->keepAliveInterval); // record the fact that we have successfully sent the packet
+        rc = SUCCESS;
+    }
+    else
+        rc = FAILURE;
+    return rc;
+}
+
+
+void MQTTClientInit(MQTTClient* c, Network* network, unsigned int command_timeout_ms,
+		unsigned char* sendbuf, size_t sendbuf_size, unsigned char* readbuf, size_t readbuf_size)
+{
+    int i;
+    c->ipstack = network;
+
+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
+        c->messageHandlers[i].topicFilter = 0;
+    c->command_timeout_ms = command_timeout_ms;
+    c->buf = sendbuf;
+    c->buf_size = sendbuf_size;
+    c->readbuf = readbuf;
+    c->readbuf_size = readbuf_size;
+    c->isconnected = 0;
+    c->cleansession = 0;
+    c->ping_outstanding = 0;
+    c->defaultMessageHandler = NULL;
+	  c->next_packetid = 1;
+    TimerInit(&c->last_sent);
+    TimerInit(&c->last_received);
+#if defined(MQTT_TASK)
+	  MutexInit(&c->mutex);
+#endif
+}
+
+
+static int decodePacket(MQTTClient* c, int* value, int timeout)
+{
+    unsigned char i;
+    int multiplier = 1;
+    int len = 0;
+    const int MAX_NO_OF_REMAINING_LENGTH_BYTES = 4;
+
+    *value = 0;
+    do
+    {
+        int rc = MQTTPACKET_READ_ERROR;
+
+        if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES)
+        {
+            rc = MQTTPACKET_READ_ERROR; /* bad data */
+            goto exit;
+        }
+        rc = c->ipstack->mqttread(c->ipstack, &i, 1, timeout);
+        if (rc != 1)
+            goto exit;
+        *value += (i & 127) * multiplier;
+        multiplier *= 128;
+    } while ((i & 128) != 0);
+exit:
+    return len;
+}
+
+
+static int readPacket(MQTTClient* c, Timer* timer)
+{
+    MQTTHeader header = {0};
+    int len = 0;
+    int rem_len = 0;
+
+    /* 1. read the header byte.  This has the packet type in it */
+    printf("1. read the header\n");
+    int rc = c->ipstack->mqttread(c->ipstack, c->readbuf, 1, TimerLeftMS(timer));
+    if (rc != 1)
+        goto exit;
+
+    len = 1;
+    /* 2. read the remaining length.  This is variable in itself */
+    printf("2. read the remaining length\n");
+    decodePacket(c, &rem_len, TimerLeftMS(timer));
+    len += MQTTPacket_encode(c->readbuf + 1, rem_len); /* put the original remaining length back into the buffer */
+
+    if (rem_len > (c->readbuf_size - len))
+    {
+        rc = BUFFER_OVERFLOW;
+        printf("Buffer overflow error\n");
+        goto exit;
+    }
+
+    /* 3. read the rest of the buffer using a callback to supply the rest of the data */
+    printf("3. read the rest of the buffer\n");
+    if (rem_len > 0 && (rc = c->ipstack->mqttread(c->ipstack, c->readbuf + len, rem_len, TimerLeftMS(timer)) != rem_len)) {
+        printf("Failed to receive the rest of the packet\n");
+        rc = 0;
+        goto exit;
+    }
+
+    header.byte = c->readbuf[0];
+    rc = header.bits.type;
+    if (c->keepAliveInterval > 0)
+        TimerCountdown(&c->last_received, c->keepAliveInterval); // record the fact that we have successfully received a packet
+exit:
+    printf("readPacket rc = %d\n",rc);
+    return rc;
+}
+
+
+// assume topic filter and name is in correct format
+// # can only be at end
+// + and # can only be next to separator
+static char isTopicMatched(char* topicFilter, MQTTString* topicName)
+{
+    char* curf = topicFilter;
+    char* curn = topicName->lenstring.data;
+    char* curn_end = curn + topicName->lenstring.len;
+
+    while (*curf && curn < curn_end)
+    {
+        if (*curn == '/' && *curf != '/')
+            break;
+        if (*curf != '+' && *curf != '#' && *curf != *curn)
+            break;
+        if (*curf == '+')
+        {   // skip until we meet the next separator, or end of string
+            char* nextpos = curn + 1;
+            while (nextpos < curn_end && *nextpos != '/')
+                nextpos = ++curn + 1;
+        }
+        else if (*curf == '#')
+            curn = curn_end - 1;    // skip until end of string
+        curf++;
+        curn++;
+    };
+
+    return (curn == curn_end) && (*curf == '\0');
+}
+
+
+int deliverMessage(MQTTClient* c, MQTTString* topicName, MQTTMessage* message)
+{
+    int i;
+    int rc = FAILURE;
+
+    // we have to find the right message handler - indexed by topic
+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
+    {
+        if (c->messageHandlers[i].topicFilter != 0 && (MQTTPacket_equals(topicName, (char*)c->messageHandlers[i].topicFilter) ||
+                isTopicMatched((char*)c->messageHandlers[i].topicFilter, topicName)))
+        {
+            if (c->messageHandlers[i].fp != NULL)
+            {
+                MessageData md;
+                NewMessageData(&md, topicName, message);
+                c->messageHandlers[i].fp(&md);
+                rc = SUCCESS;
+            }
+        }
+    }
+
+    if (rc == FAILURE && c->defaultMessageHandler != NULL)
+    {
+        MessageData md;
+        NewMessageData(&md, topicName, message);
+        c->defaultMessageHandler(&md);
+        rc = SUCCESS;
+    }
+
+    return rc;
+}
+
+
+int keepalive(MQTTClient* c)
+{
+    int rc = SUCCESS;
+
+    if (c->keepAliveInterval == 0)
+        goto exit;
+
+    if (TimerIsExpired(&c->last_sent) || TimerIsExpired(&c->last_received))
+    {
+        if (c->ping_outstanding)
+            rc = FAILURE; /* PINGRESP not received in keepalive interval */
+        else
+        {
+            Timer timer;
+            TimerInit(&timer);
+            TimerCountdownMS(&timer, 1000);
+            int len = MQTTSerialize_pingreq(c->buf, c->buf_size);
+            printf("keepalive MQTTSerialize_pingreq len = %d\n",len);
+            if (len > 0 && (rc = sendPacket(c, len, &timer)) == SUCCESS) // send the ping packet
+                c->ping_outstanding = 1;
+        }
+    }
+
+exit:
+    return rc;
+}
+
+
+void MQTTCleanSession(MQTTClient* c)
+{
+    int i = 0;
+
+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
+        c->messageHandlers[i].topicFilter = NULL;
+}
+
+
+void MQTTCloseSession(MQTTClient* c)
+{
+    c->ping_outstanding = 0;
+    c->isconnected = 0;
+    if (c->cleansession)
+        MQTTCleanSession(c);
+}
+
+
+int cycle(MQTTClient* c, Timer* timer)
+{
+    int len = 0,
+        rc = SUCCESS;
+    int packet_type = readPacket(c, timer);     /* read the socket, see what work is due */
+    printf("cycle packet_type = %d\n", packet_type);
+
+    switch (packet_type)
+    {
+        default:
+            /* no more data to read, unrecoverable. Or read packet fails due to unexpected network error */
+            rc = packet_type;
+            goto exit;
+        case 0: /* timed out reading packet */
+            break;
+        case CONNACK:
+        case PUBACK:
+        case SUBACK:
+        case UNSUBACK:
+            break;
+        case PUBLISH:
+        {
+            MQTTString topicName;
+            MQTTMessage msg;
+            int intQoS;
+            msg.payloadlen = 0; /* this is a size_t, but deserialize publish sets this as int */
+            if (MQTTDeserialize_publish(&msg.dup, &intQoS, &msg.retained, &msg.id, &topicName,
+               (unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->readbuf, c->readbuf_size) != 1)
+                goto exit;
+            msg.qos = (enum QoS)intQoS;
+            deliverMessage(c, &topicName, &msg);
+            if (msg.qos != QOS0)
+            {
+                if (msg.qos == QOS1)
+                    len = MQTTSerialize_ack(c->buf, c->buf_size, PUBACK, 0, msg.id);
+                else if (msg.qos == QOS2)
+                    len = MQTTSerialize_ack(c->buf, c->buf_size, PUBREC, 0, msg.id);
+                if (len <= 0)
+                    rc = FAILURE;
+                else
+                    rc = sendPacket(c, len, timer);
+                if (rc == FAILURE)
+                    goto exit; // there was a problem
+            }
+            break;
+        }
+        case PUBREC:
+        case PUBREL:
+        {
+            unsigned short mypacketid;
+            unsigned char dup, type;
+            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
+                rc = FAILURE;
+            else if ((len = MQTTSerialize_ack(c->buf, c->buf_size,
+                (packet_type == PUBREC) ? PUBREL : PUBCOMP, 0, mypacketid)) <= 0)
+                rc = FAILURE;
+            else if ((rc = sendPacket(c, len, timer)) != SUCCESS) // send the PUBREL packet
+                rc = FAILURE; // there was a problem
+            if (rc == FAILURE)
+                goto exit; // there was a problem
+            break;
+        }
+
+        case PUBCOMP:
+            break;
+        case PINGRESP:
+            c->ping_outstanding = 0;
+            break;
+    }
+
+    if (keepalive(c) != SUCCESS) {
+        //check only keepalive FAILURE status so that previous FAILURE status can be considered as FAULT
+        rc = FAILURE;
+    }
+
+exit:
+    if (rc == SUCCESS)
+        rc = packet_type;
+    else if (c->isconnected)
+        MQTTCloseSession(c);
+    return rc;
+}
+
+
+int MQTTYield(MQTTClient* c, int timeout_ms)
+{
+    int rc = SUCCESS;
+    Timer timer;
+
+    TimerInit(&timer);
+    TimerCountdownMS(&timer, timeout_ms);
+
+    /*
+	do
+    {
+        if(cycle(c, &timer) < 0)
+        {
+            rc = FAILURE;
+            break;
+        }
+  	}while(!TimerIsExpired(&timer));
+    */
+
+    while(!TimerIsExpired(&timer));
+    if(cycle(c, &timer) < 0)
+    {
+        rc = FAILURE;
+    }
+
+    return rc;
+}
+
+/*
+int MqttClientYield(MQTTClient* c, int timeout_ms)
+{
+    int rc = -100;
+    static Timer timer;
+    static uint16_t reconnCount = 0;
+    uint32_t nextReconnTime = 0;
+
+    if (c == NULL)
+    {
+        printf("MQTTClient is NULL, please check!\n");
+        rc = FAILURE;
+    }
+
+    if (c -> isconnected)
+    {
+        rc = MQTTYield(c, timeout_ms);
+        if(rc != 0)
+		{
+			printf("MQTTYield failed, rc:%d\n", rc);
+            TimerCountdownMS(&reconntimer, MQTT_RECONN_MINTIMESPACE);
+		    reconnCount = 0;
+		}
+    }
+    else
+    {
+        if(reconnCount == 0 || TimerIsExpired(&reconntimer) == 1)
+		{
+			reconnCount++;
+			if(reconnCount < MQTT_RECONN_MAXCOUNT)
+			{
+				nextReconnTime = (1 << (reconnCount/5))*MQTT_RECONN_MINTIMESPACE;
+			}
+			else
+			{
+				nextReconnTime = (1 << (MQTT_RECONN_MAXCOUNT/5))*MQTT_RECONN_MINTIMESPACE;
+			}	
+
+			printf("MQTT is disconnected, try to reconnect, count:%d, next reconnect need %ds!\n", reconnCount, nextReconnTime/1000);
+
+			rc = MqttClientReconnect(c, &g_MqttParam);
+			if(rc != 0)
+			{
+				printf("MQTT reconnect failed, rc:%d\n", rc);
+				rc = FAILURE;
+			}
+			else
+			{
+				printf("MQTT reconnect success\n");
+				rc = SUCCESS;                               
+			}
+
+			TimerCountdownMS(&reconntimer, nextReconnTime);
+		}
+    }
+    
+    return rc;
+}
+*/
+
+int MQTTIsConnected(MQTTClient* client)
+{
+  return client->isconnected;
+}
+
+void MQTTRun(void* parm)
+{
+	Timer timer;
+	MQTTClient* c = (MQTTClient*)parm;
+
+	TimerInit(&timer);
+
+	while (1)
+	{
+#if defined(MQTT_TASK)
+		MutexLock(&c->mutex);
+#endif
+		TimerCountdownMS(&timer, 500); /* Don't wait too long if no traffic is incoming */
+		cycle(c, &timer);
+#if defined(MQTT_TASK)
+		MutexUnlock(&c->mutex);
+#endif
+	}
+}
+
+
+#if defined(MQTT_TASK)
+int MQTTStartTask(MQTTClient* client)
+{
+	return ThreadStart(&client->thread, &MQTTRun, client);
+}
+#endif
+
+
+int waitfor(MQTTClient* c, int packet_type, Timer* timer)
+{
+    int rc = FAILURE;
+
+    do
+    {
+        if (TimerIsExpired(timer))
+            break; // we timed out
+        rc = cycle(c, timer);
+    }
+    while (rc != packet_type && rc >= 0);
+
+    return rc;
+}
+
+
+
+
+int MQTTConnectWithResults(MQTTClient* c, MQTTPacket_connectData* options, MQTTConnackData* data)
+{
+    Timer connect_timer;
+    int rc = FAILURE;
+    MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer;
+    int len = 0;
+
+#if defined(MQTT_TASK)
+	  MutexLock(&c->mutex);
+#endif
+	  if (c->isconnected) /* don't send connect packet again if we are already connected */
+	{   
+        printf( "MQTTConnectWithResults: already connected\n" );
+          goto exit;
+    }
+
+    TimerInit(&connect_timer);
+    TimerCountdownMS(&connect_timer, c->command_timeout_ms);
+
+    if (options == 0)
+        options = &default_options; /* set default options if none were supplied */
+
+    c->keepAliveInterval = options->keepAliveInterval;
+    c->cleansession = options->cleansession;
+    TimerCountdown(&c->last_received, c->keepAliveInterval);
+    if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0)
+    {
+        printf("MQTTSerialize_connect fiiled\n");
+        goto exit;
+    }
+    if ((rc = sendPacket(c, len, &connect_timer)) != SUCCESS)  // send the connect packet
+    {
+        printf("sendPacket failed\n");
+        goto exit; // there was a problem
+    }
+    // this will be a blocking call, wait for the connack
+    if (waitfor(c, CONNACK, &connect_timer) == CONNACK)
+    {
+        data->rc = 0;
+        data->sessionPresent = 0;
+        if (MQTTDeserialize_connack(&data->sessionPresent, &data->rc, c->readbuf, c->readbuf_size) == 1)
+        {
+            rc = data->rc;
+        }
+        else
+        {
+            printf("MQTTDeserialize_connack failed\n");
+            rc = FAILURE;
+        }
+    }
+    else
+    {
+        printf("waitfor CONNACK failed\n");
+        rc = FAILURE;
+    }
+
+exit:
+    if (rc == SUCCESS)
+    {
+        c->isconnected = 1;
+        c->ping_outstanding = 0;
+    }
+
+#if defined(MQTT_TASK)
+	  MutexUnlock(&c->mutex);
+#endif
+
+    return rc;
+}
+
+
+int MQTTConnect(MQTTClient* c, MQTTPacket_connectData* options)
+{
+    MQTTConnackData data;
+    return MQTTConnectWithResults(c, options, &data);
+}
+
+
+int MQTTSetMessageHandler(MQTTClient* c, const char* topicFilter, messageHandler messageHandler)
+{
+    int rc = FAILURE;
+    int i = -1;
+
+    /* first check for an existing matching slot */
+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
+    {
+        if (c->messageHandlers[i].topicFilter != NULL && strcmp(c->messageHandlers[i].topicFilter, topicFilter) == 0)
+        {
+            if (messageHandler == NULL) /* remove existing */
+            {
+                c->messageHandlers[i].topicFilter = NULL;
+                c->messageHandlers[i].fp = NULL;
+            }
+            rc = SUCCESS; /* return i when adding new subscription */
+            break;
+        }
+    }
+    /* if no existing, look for empty slot (unless we are removing) */
+    if (messageHandler != NULL) {
+        if (rc == FAILURE)
+        {
+            for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)
+            {
+                if (c->messageHandlers[i].topicFilter == NULL)
+                {
+                    rc = SUCCESS;
+                    break;
+                }
+            }
+        }
+        if (i < MAX_MESSAGE_HANDLERS)
+        {
+            c->messageHandlers[i].topicFilter = topicFilter;
+            c->messageHandlers[i].fp = messageHandler;
+        }
+    }
+    return rc;
+}
+
+
+int MQTTSubscribeWithResults(MQTTClient* c, const char* topicFilter, enum QoS qos,
+       messageHandler messageHandler, MQTTSubackData* data)
+{
+    int rc = FAILURE;
+    Timer timer;
+    int len = 0;
+    MQTTString topic = MQTTString_initializer;
+    topic.cstring = (char *)topicFilter;
+
+#if defined(MQTT_TASK)
+	  MutexLock(&c->mutex);
+#endif
+	  if (!c->isconnected)
+		    goto exit;
+
+    TimerInit(&timer);
+    TimerCountdownMS(&timer, c->command_timeout_ms);
+
+    len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, (int*)&qos);
+    if (len <= 0)
+        goto exit;
+    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet
+        goto exit;             // there was a problem
+
+    if (waitfor(c, SUBACK, &timer) == SUBACK)      // wait for suback
+    {
+        int count = 0;
+        unsigned short mypacketid;
+        data->grantedQoS = QOS0;
+        if (MQTTDeserialize_suback(&mypacketid, 1, &count, (int*)&data->grantedQoS, c->readbuf, c->readbuf_size) == 1)
+        {
+            if (data->grantedQoS != 0x80)
+                rc = MQTTSetMessageHandler(c, topicFilter, messageHandler);
+        }
+    }
+    else
+        rc = FAILURE;
+
+exit:
+    if (rc == FAILURE)
+        MQTTCloseSession(c);
+#if defined(MQTT_TASK)
+	  MutexUnlock(&c->mutex);
+#endif
+    return rc;
+}
+
+
+int MQTTSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos,
+       messageHandler messageHandler)
+{
+    MQTTSubackData data;
+    return MQTTSubscribeWithResults(c, topicFilter, qos, messageHandler, &data);
+}
+
+
+int MQTTUnsubscribe(MQTTClient* c, const char* topicFilter)
+{
+    int rc = FAILURE;
+    Timer timer;
+    MQTTString topic = MQTTString_initializer;
+    topic.cstring = (char *)topicFilter;
+    int len = 0;
+
+#if defined(MQTT_TASK)
+	  MutexLock(&c->mutex);
+#endif
+	  if (!c->isconnected)
+		  goto exit;
+
+    TimerInit(&timer);
+    TimerCountdownMS(&timer, c->command_timeout_ms);
+
+    if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0)
+        goto exit;
+    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet
+        goto exit; // there was a problem
+
+    if (waitfor(c, UNSUBACK, &timer) == UNSUBACK)
+    {
+        unsigned short mypacketid;  // should be the same as the packetid above
+        if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1)
+        {
+            /* remove the subscription message handler associated with this topic, if there is one */
+            MQTTSetMessageHandler(c, topicFilter, NULL);
+        }
+    }
+    else
+        rc = FAILURE;
+
+exit:
+    if (rc == FAILURE)
+        MQTTCloseSession(c);
+#if defined(MQTT_TASK)
+	  MutexUnlock(&c->mutex);
+#endif
+    return rc;
+}
+
+
+int MQTTPublish(MQTTClient* c, const char* topicName, MQTTMessage* message)
+{
+    int rc = FAILURE;
+    Timer timer;
+    MQTTString topic = MQTTString_initializer;
+    topic.cstring = (char *)topicName;
+    int len = 0;
+
+#if defined(MQTT_TASK)
+	  MutexLock(&c->mutex);
+#endif
+	  if (!c->isconnected)
+		    goto exit;
+
+    TimerInit(&timer);
+    TimerCountdownMS(&timer, c->command_timeout_ms);
+
+    if (message->qos == QOS1 || message->qos == QOS2)
+        message->id = getNextPacketId(c);
+
+    len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id,
+              topic, (unsigned char*)message->payload, message->payloadlen);
+    printf("len = %d\n",len);
+    if (len <= 0)
+        goto exit;
+    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet
+        goto exit; // there was a problem
+
+    if (message->qos == QOS1)
+    {
+        if (waitfor(c, PUBACK, &timer) == PUBACK)
+        {
+            unsigned short mypacketid;
+            unsigned char dup, type;
+            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
+                rc = FAILURE;
+        }
+        else
+            rc = FAILURE;
+    }
+    else if (message->qos == QOS2)
+    {
+        if (waitfor(c, PUBCOMP, &timer) == PUBCOMP)
+        {
+            unsigned short mypacketid;
+            unsigned char dup, type;
+            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)
+                rc = FAILURE;
+        }
+        else
+            rc = FAILURE;
+    }
+
+exit:
+    if (rc == FAILURE)
+        MQTTCloseSession(c);
+#if defined(MQTT_TASK)
+	  MutexUnlock(&c->mutex);
+#endif
+    return rc;
+}
+
+
+int MQTTDisconnect(MQTTClient* c)
+{
+    int rc = FAILURE;
+    Timer timer;     // we might wait for incomplete incoming publishes to complete
+    int len = 0;
+
+#if defined(MQTT_TASK)
+	MutexLock(&c->mutex);
+#endif
+    TimerInit(&timer);
+    TimerCountdownMS(&timer, c->command_timeout_ms);
+
+	  len = MQTTSerialize_disconnect(c->buf, c->buf_size);
+    if (len > 0)
+        rc = sendPacket(c, len, &timer);            // send the disconnect packet
+    MQTTCloseSession(c);
+
+#if defined(MQTT_TASK)
+	  MutexUnlock(&c->mutex);
+#endif
+    return rc;
+}
diff --git a/lynq/MD310EU/ap/app/dmp-test/MQTTLinux.c b/lynq/MD310EU/ap/app/dmp-test/MQTTLinux.c
new file mode 100755
index 0000000..702d57e
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/MQTTLinux.c
@@ -0,0 +1,367 @@
+/*******************************************************************************

+ * Copyright (c) 2014, 2017 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation

+ *    Ian Craggs - return codes from linux_read

+ *******************************************************************************/

+

+#include "MQTTLinux.h"

+

+void TimerInit(Timer* timer)

+{

+	timer->end_time = (struct timeval){0, 0};

+}

+

+char TimerIsExpired(Timer* timer)

+{

+	struct timeval now, res;

+	gettimeofday(&now, NULL);

+	timersub(&timer->end_time, &now, &res);

+	return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);

+}

+

+

+void TimerCountdownMS(Timer* timer, unsigned int timeout)

+{

+	struct timeval now;

+	gettimeofday(&now, NULL);

+	struct timeval interval = {timeout / 1000, (timeout % 1000) * 1000};

+	timeradd(&now, &interval, &timer->end_time);

+}

+

+

+void TimerCountdown(Timer* timer, unsigned int timeout)

+{

+	struct timeval now;

+	gettimeofday(&now, NULL);

+	struct timeval interval = {timeout, 0};

+	timeradd(&now, &interval, &timer->end_time);

+}

+

+

+int TimerLeftMS(Timer* timer)

+{

+	struct timeval now, res;

+	gettimeofday(&now, NULL);

+	timersub(&timer->end_time, &now, &res);

+	//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);

+	return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;

+}

+

+

+int linux_read(Network* n, unsigned char* buffer, int len, int timeout_ms)

+{

+	struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};

+	if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))

+	{

+		interval.tv_sec = 0;

+		interval.tv_usec = 100;

+	}

+

+	//printf("linux_read setsockopt my_socket\n");

+	setsockopt(n->my_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));

+	//printf("linux_read setsockopt ssl\n");

+	setsockopt(n->ssl, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));

+

+	int bytes = 0;

+	int err = 0;

+	while (bytes < len)

+	{

+		int rc = -1;

+		printf("linux_read n->useSSL = %d\n",n->useSSL);

+		if (n->useSSL != 0)

+		{

+			rc = SSL_read(n->ssl, buffer+bytes, (len - bytes));

+			printf("SSL_read rc = %d\n",rc);

+			if (rc < 0)

+			{

+				err = SSL_get_error(n->ssl, rc);

+				printf("SSL_read error %d\n", err);

+				/*

+				if (err == 2)

+				{

+					usleep(500);

+					continue;

+				}

+				*/

+			}

+			

+		}

+		else

+		{

+			rc = recv(n->my_socket, &buffer[bytes], (size_t)(len - bytes), 0);

+		}

+		

+		if (rc == -1)

+		{

+			printf("linux_read errno = %d\n",errno);

+			if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EPERM)

+			  bytes = -1;

+			break;

+		}

+		else if (rc == 0)

+		{

+			bytes = 0;

+			break;

+		}

+		else

+			bytes += rc;

+	}

+	return bytes;

+}

+

+

+int linux_write(Network* n, unsigned char* buffer, int len, int timeout_ms)

+{

+	struct timeval tv;

+

+	tv.tv_sec = 0;  /* 30 Secs Timeout */

+	tv.tv_usec = timeout_ms * 1000;  // Not init'ing this can cause strange errors

+

+	//printf("linux_write setsockopt my_socket\n");

+	setsockopt(n->my_socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));

+	//printf("linux_write setsockopt ssl\n");

+	//setsockopt(n->ssl, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));

+	int	rc = -1;

+    /* 是不是使用SSL决定了从哪个描述符写数据 */

+	printf("linux_write n->useSSL = %d\n",n->useSSL);

+    if(n->useSSL != 0)

+	{

+		printf("SSL_write\n");

+        rc = SSL_write(n->ssl, buffer, len);

+		printf("SSL_write rc = %d\n",rc);

+    }

+	else

+	{

+		printf("no SSL_write,n->userssl = %d\n",n->useSSL);

+        rc = write(n->my_socket, buffer, len);

+    }

+	return rc;

+}

+

+

+void NetworkInit(Network* n)

+{

+	n->my_socket = 0;

+	n->mqttread = linux_read;

+	n->mqttwrite = linux_write;

+	n->useSSL = 0;

+}

+

+

+int NetworkConnect(Network* n, char* addr, int port)

+{

+	int type = SOCK_STREAM;

+	struct sockaddr_in address;

+	int rc = -1;

+	char ip_str[64];

+	sa_family_t family = AF_INET;

+	struct addrinfo *result = NULL;

+	struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};

+

+	if ((rc = getaddrinfo(addr, NULL, &hints, &result)) == 0)

+	{

+		struct addrinfo* res = result;

+		/* prefer ip4 addresses */

+		while (res)

+		{

+			if (res->ai_family == AF_INET)

+			{

+				result = res;

+				break;

+			}

+			res = res->ai_next;

+		}

+

+		if (result->ai_family == AF_INET)

+		{

+			address.sin_port = htons(port);

+			address.sin_family = family = AF_INET;

+			address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;

+		}

+		else

+		{

+			rc = -1;

+		}

+		freeaddrinfo(result);

+	}

+

+	if (rc == 0)

+	{

+		n->my_socket = socket(family, type, 0);

+		printf("NetworkConnect set userSSL = 0\n");

+		n->useSSL = 0;

+		if (n->my_socket != -1)

+			rc = connect(n->my_socket, (struct sockaddr*)&address, sizeof(address));

+	}

+

+	return rc;

+}

+

+

+

+/**

+ * 打印证书内容

+ *

+ * @param ssl : SSL的描述符

+ */

+void ShowCerts(SSL * ssl)

+{

+    X509 *cert;

+    char *line;

+    cert = SSL_get_peer_certificate(ssl);

+    if (cert != NULL) {

+        printf("certs infomation:\n");

+        line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);

+        printf("certs: %s\n", line);

+        free(line);

+        line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);

+        printf("owner: %s\n", line);

+        free(line);

+        X509_free(cert);

+    } else {

+        printf("no certs\n");

+    }

+}

+

+/**

+ * 连接Network(带SSL的socket)

+ *

+ * @param n : Network对象的指针

+ * @param addr : MQTT服务器的IP地址

+ * @param port : MQTT服务器的IP地址

+ * @param crtFilePath : 证书路径

+ * @return 0:成功  其他:失败

+ */

+int NetworkConnectBySSL(Network* n, const char* addr, int port, const char* crtFilePath)

+{

+ 

+	int rc = -1;

+	struct addrinfo *result = NULL;

+	struct sockaddr_in address;

+	sa_family_t family = AF_INET;

+    SSL_CTX* ssl_context;

+    SSL *ssl;

+ 

+    /*SSL初始化*/

+    SSL_library_init();

+    OpenSSL_add_all_algorithms();

+    SSL_load_error_strings();

+ 

+    /* 创建SSL的上下文 */

+	printf("SSL_CTX_new\n");

+    ssl_context = SSL_CTX_new(TLSv1_2_client_method());

+    /*设置只验证服务器的证书*/

+	printf("SSL_CTX_set_verify\n");

+    SSL_CTX_set_verify(ssl_context, SSL_VERIFY_NONE, NULL);

+    /* 设置用来进行校验的证书 */

+	/*

+    if (SSL_CTX_use_certificate_file(ssl_context, crtFilePath, SSL_FILETYPE_PEM) != 1) {

+        SSL_CTX_free(ssl_context);

+        printf("Failed to load client certificate from %s", crtFilePath);

+    }

+	printf("SSL_CTX_set_default_verify_paths\n");

+    SSL_CTX_set_default_verify_paths(ssl_context);

+	*/

+ 

+    /* 创建Socket并连接到服务器 */

+	printf("create socket\n");

+    int socketFd = -1;

+    if ((socketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

+        printf("create socket failed! %s", strerror(errno));

+        return -1;

+    }

+	/*

+    

+	

+    int result = getaddrinfo(addr, port, &hints, &serverInfo);

+	printf("getaddrinfo result=%d\n");

+    if (result != 0) {

+        printf("Failed to get addr info= %s    addr=%s  port=%s", strerror(result),addr,port);

+        return -1;

+    }

+	printf("connect socket\n");

+    if (connect(socketFd, serverInfo->ai_addr, serverInfo->ai_addrlen) != 0) {

+        printf("Connect socket failed! %s", strerror(errno));

+        return -1;

+    }

+	*/

+	printf("getaddrinfo\n");

+	struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};

+    struct addrinfo* serverInfo;

+    hints.ai_family = AF_INET;

+    hints.ai_socktype = SOCK_STREAM;

+

+	if ((rc = getaddrinfo(addr, NULL, &hints, &result)) == 0)

+	{

+		struct addrinfo* res = result;

+

+		/* prefer ip4 addresses */

+		while (res)

+		{

+			if (res->ai_family == AF_INET)

+			{

+				result = res;

+				break;

+			}

+			res = res->ai_next;

+		}

+

+		if (result->ai_family == AF_INET)

+		{

+			address.sin_port = htons(port);

+			address.sin_family = family = AF_INET;

+			address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;

+			printf("address.sin_addr=%s\n",inet_ntoa(address.sin_addr));

+		}

+		else

+			rc = -1;

+

+		freeaddrinfo(result);

+	}

+

+	printf("connect socket\n");

+    if (connect(socketFd, (struct sockaddr*)&address, sizeof(address)) != 0) {

+        printf("Connect socket failed! %s", strerror(errno));

+        return -1;

+    }

+

+	printf("SSL_new\n");

+    ssl = SSL_new(ssl_context);

+	printf("ssl_set_fd\n");

+    SSL_set_fd(ssl, socketFd);

+    if (SSL_connect(ssl) == -1) {

+        ERR_print_errors_fp(stderr);

+        return -1;

+    } else {

+        printf("Connected with %s encryption\n", SSL_get_cipher(ssl));

+        /* 打印一下证书的内容 */

+        //ShowCerts(ssl);

+        /* 检查一下证书 */

+        /* 把对应的描述符什么的存起来 */

+        n->my_socket = socketFd;

+        n->ssl = ssl;

+        n->useSSL = 1;

+    }

+    return 0;

+}

+

+

+void NetworkDisconnect(Network* n)

+{

+	close(n->my_socket);

+	if(n->useSSL == 1)

+	{

+        SSL_shutdown(n->ssl);

+    }

+}

diff --git a/lynq/MD310EU/ap/app/dmp-test/Makefile b/lynq/MD310EU/ap/app/dmp-test/Makefile
new file mode 100755
index 0000000..404dade
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/Makefile
@@ -0,0 +1,119 @@
+#*******************************************************************************
+# include build/common makefile
+# 以生成两个应用为例,如果只有一个删除EXEC2 OBJS2即可
+#*******************************************************************************
+include $(COMMON_MK)
+
+MQTT_LIB = paho-embed-mqtt3c
+MQTT_LIB_PATH = libpaho-embed-mqtt
+MQTT_SOURCE = mqtt/
+MQTT_SRCDIR = libpaho-embed-mqtt/src
+MBEDTLS_LIB = mbedtls
+CJSON_LIB = cjson
+UTIL_LIB = util
+WIFI_SRC_DIR = ../goahead/interface5.0/wifi
+CURL_LIB = curl
+
+
+SRC_FILE := \
+$(CJSON_LIB)/cJSON.c \
+$(UTIL_LIB)/util_sha256.c \
+$(UTIL_LIB)/util_string.c \
+#$(MBEDTLS_LIB)/library/sha256.c \
+#$(MBEDTLS_LIB)/library/md.c \
+#$(MQTT_SRCDIR)/MQTTTls.c \
+
+#$(MQTT_SRCDIR)/MQTTClient.c \
+#$(MQTT_SRCDIR)/MQTTLinux.c \
+
+WIFI_SRC = $(WIFI_SRC_DIR)/zte_web_lan.c
+
+
+
+SRC_FILE += $(wildcard *.c)
+#SRC_FILE += $(wildcard $(MQTT_SRCDIR)/*.c)
+
+	
+
+#OBJS = zte_web_lan.o
+
+
+EXEC = dongle_dmp
+#OBJS = dongle_dmp.o aiot_mqtt_sign.o
+OBJS += $(addsuffix .o, $(basename $(SRC_FILE))) \
+		$(addsuffix .o, $(basename $(WIFI_SRC)))
+
+
+
+#EXEC 特有的LIB参数
+LDLIBS_dongle_dmp = -L$(MQTT_LIB_PATH)/lib/
+
+
+#宏和头文件目录在CFLAGS里定义,要用+=,不要用=,否则会覆盖COMMON_MK里的值
+#CFLAGS += -I$(APP_DIR)/include
+
+CFLAGS += -I$(MQTT_LIB_PATH)/include
+CFLAGS += -I$(MBEDTLS_LIB)/include/mbedtls
+CFLAGS += -I$(MBEDTLS_LIB)/include/psa
+CFLAGS += -I$(MBEDTLS_LIB)/include
+CFLAGS += -I$(UTIL_LIB)
+CFLAGS += -I$(CJSON_LIB)
+CFLAGS += -I$(zte_lib_path)/libnvram \
+		  -I$(zte_lib_path)/libezxml \
+		  -I$(zte_lib_path)/libmxml \
+		  -I$(WIFI_SRC_DIR)/../../../include \
+		  -I$(WIFI_SRC_DIR)/../../../wlan \
+		  -I$(zte_lib_path)/libsqlite \
+		  -I$(zte_lib_path)/libsoft_timer \
+		  -I$(WIFI_SRC_DIR)/../../../at_server \
+		  -I$(WIFI_SRC_DIR)/../../server \
+		  -I$(WIFI_SRC_DIR)/../ \
+		  -I$(WIFI_SRC_DIR)/../net \
+		  -I$(WIFI_SRC_DIR)/../other \
+		  -I$(WIFI_SRC_DIR)/ \
+		  -I$(CURL_LIB)/include \
+		  -I$(zte_lib_path)/libcurl/install/include \
+		  -I$(zte_lib_path)/libssl/install/include \
+		  -I../include
+#CFLAGS += -DMBEDTLS_MD_C
+
+
+#EXEC EXEC2 公共LIB参数,第一行定义LDLIBS用=,不要用+=,应用连接的库都在本Makefile定义
+LDLIBS = -lpthread \
+	 -Llibpaho-embed-mqtt/lib/ -lpaho-embed-mqtt3c \
+	 -lm \
+	 -L../../lib/libnvram -lnvram \
+	 -L$(WIFI_SRC_DIR)/../libwebinterface.a \
+	 -L../../lib/libwlan_interface -lwlan_interface \
+	 -L../../lib/libsoftap -lsoftap \
+	 -L../../lib/libsoft_timer -lsoft_timer \
+	 -L$(zte_lib_path)/libcurl/install/lib -lcurl \
+	 -L$(zte_lib_path)/libssl/install/lib -lssl \
+	 -L$(zte_lib_path)/libssl/install/lib -lcrypto \
+#*******************************************************************************
+# targets
+#*******************************************************************************
+
+all: $(EXEC) 
+
+$(EXEC): $(OBJS)
+	@echo $(SRC_FILE)
+	echo "MK is $(COMMON_MK)"
+	echo "cc is $(CC)"
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) $(LDLIBS_$@) -Wl,--end-group
+	@echo "CC is $(CC)"	
+	@cp $@ $@.elf
+	
+#%.o:%.c
+#$(CC) -c  $< -o $@
+
+romfs:
+	$(ROMFSINST) $(EXEC) /bin/$(EXEC)
+	$(ROMFSINST) libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so /lib/libpaho-embed-mqtt3c.so
+	$(ROMFSINST) libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so.1 /lib/libpaho-embed-mqtt3c.so.1
+	$(ROMFSINST) libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so.1.0 /lib/libpaho-embed-mqtt3c.so.1.0
+
+clean:
+	-@rm -f $(EXEC) $(EXEC2) *.elf *.gdb *.o
+
+
diff --git a/lynq/MD310EU/ap/app/dmp-test/cjson/Makefile.inc b/lynq/MD310EU/ap/app/dmp-test/cjson/Makefile.inc
new file mode 100755
index 0000000..03f6057
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/cjson/Makefile.inc
@@ -0,0 +1,49 @@
+CJSON_DIR        := $(TOP)/PLAT/middleware/thirdparty/cjson

+

+CFLAGS_INC     +=  -I $(TOP)/PLAT/middleware/thirdparty/cjson

+              

+

+CJSON_SRC_DIRS += $(CJSON_DIR)

+CJSON_EXCLUDE_FILES :=

+CJSON_CSRC = $(foreach dir, $(CJSON_SRC_DIRS), $(wildcard $(dir)/*.c))

+CJSON_CFILES = $(filter-out $(CJSON_EXCLUDE_FILES), $(CJSON_CSRC))

+CJSON_COBJSTEMP := $(patsubst %.c, %.o, $(CJSON_CFILES))

+CJSON_COBJSTEMP :=$(subst $(CJSON_DIR),PLAT/middleware/thirdparty/cjson,$(CJSON_COBJSTEMP))

+CJSON_COBJS := $(addprefix $(BUILDDIR)/, $(CJSON_COBJSTEMP))

+

+CJSON_PPFILES := $(patsubst %.o, %.pp, $(CJSON_COBJS))

+PPFILES += $(CJSON_PPFILES)

+

+ifneq ($(MAKECMDGOALS), unilog)

+-include $(CJSON_COBJS:.o=.d)

+endif

+-include $(CJSON_COBJS:.o=.dd)

+

+CFLAGS += -DFEATURE_CJSON_ENABLE

+

+ifeq ($(TOOLCHAIN),GCC)

+

+CFLAGS_INC += -I $(TOP)/PLAT/os/freertos/portable/gcc

+

+lib-y += libcjson.a

+

+$(BUILDDIR)/lib/libcjson.a: $(CJSON_COBJS)

+	@mkdir -p $(dir $@)

+	$(ECHO) AR $@

+	$(Q)$(AR) -cr $@ $^

+

+endif

+

+ifeq ($(TOOLCHAIN),ARMCC)

+

+CFLAGS_INC += -I $(TOP)/PLAT/os/freertos/portable/keil

+

+

+lib-y += libcjson.lib

+

+$(BUILDDIR)/lib/libcjson.lib: $(CJSON_COBJS)

+	@mkdir -p $(dir $@)

+	$(ECHO) AR $@

+	$(Q)$(AR) $(ARFLAGS) $@ $^

+

+endif

diff --git a/lynq/MD310EU/ap/app/dmp-test/cjson/cJSON.c b/lynq/MD310EU/ap/app/dmp-test/cjson/cJSON.c
new file mode 100755
index 0000000..5e37c02
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/cjson/cJSON.c
@@ -0,0 +1,3119 @@
+/*

+  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors

+

+  Permission is hereby granted, free of charge, to any person obtaining a copy

+  of this software and associated documentation files (the "Software"), to deal

+  in the Software without restriction, including without limitation the rights

+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

+  copies of the Software, and to permit persons to whom the Software is

+  furnished to do so, subject to the following conditions:

+

+  The above copyright notice and this permission notice shall be included in

+  all copies or substantial portions of the Software.

+

+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

+  THE SOFTWARE.

+*/

+

+/* cJSON */

+/* JSON parser in C. */

+

+/* disable warnings about old C89 functions in MSVC */

+#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER)

+#define _CRT_SECURE_NO_DEPRECATE

+#endif

+

+#ifdef __GNUC__

+#pragma GCC visibility push(default)

+#endif

+#if defined(_MSC_VER)

+#pragma warning (push)

+/* disable warning about single line comments in system headers */

+#pragma warning (disable : 4001)

+#endif

+

+#include <string.h>

+#include <stdio.h>

+#include <math.h>

+#include <stdlib.h>

+#include <limits.h>

+#include <ctype.h>

+#include <float.h>

+

+#ifdef ENABLE_LOCALES

+#include <locale.h>

+#endif

+

+#if defined(_MSC_VER)

+#pragma warning (pop)

+#endif

+#ifdef __GNUC__

+#pragma GCC visibility pop

+#endif

+

+#include "cJSON.h"

+

+/* define our own boolean type */

+#ifdef true

+#undef true

+#endif

+#define true ((cJSON_bool)1)

+

+#ifdef false

+#undef false

+#endif

+#define false ((cJSON_bool)0)

+

+/* define isnan and isinf for ANSI C, if in C99 or above, isnan and isinf has been defined in math.h */

+#ifndef isinf

+#define isinf(d) (isnan((d - d)) && !isnan(d))

+#endif

+#ifndef isnan

+#define isnan(d) (d != d)

+#endif

+

+#ifndef NAN

+#ifdef _WIN32

+#define NAN sqrt(-1.0)

+#else

+#define NAN 0.0/0.0

+#endif

+#endif

+

+typedef struct {

+    const unsigned char *json;

+    size_t position;

+} error;

+static error global_error = { NULL, 0 };

+

+CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void)

+{

+    return (const char*) (global_error.json + global_error.position);

+}

+

+CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item)

+{

+    if (!cJSON_IsString(item))

+    {

+        return NULL;

+    }

+

+    return item->valuestring;

+}

+

+CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item)

+{

+    if (!cJSON_IsNumber(item))

+    {

+        return (double) NAN;

+    }

+

+    return item->valuedouble;

+}

+

+/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */

+#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 16)

+    #error cJSON.h and cJSON.c have different versions. Make sure that both have the same.

+#endif

+

+CJSON_PUBLIC(const char*) cJSON_Version(void)

+{

+    static char version[15];

+    sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH);

+

+    return version;

+}

+

+/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */

+static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2)

+{

+    if ((string1 == NULL) || (string2 == NULL))

+    {

+        return 1;

+    }

+

+    if (string1 == string2)

+    {

+        return 0;

+    }

+

+    for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++)

+    {

+        if (*string1 == '\0')

+        {

+            return 0;

+        }

+    }

+

+    return tolower(*string1) - tolower(*string2);

+}

+

+typedef struct internal_hooks

+{

+    void *(CJSON_CDECL *allocate)(size_t size);

+    void (CJSON_CDECL *deallocate)(void *pointer);

+    void *(CJSON_CDECL *reallocate)(void *pointer, size_t size);

+} internal_hooks;

+

+#if defined(_MSC_VER)

+/* work around MSVC error C2322: '...' address of dllimport '...' is not static */

+static void * CJSON_CDECL internal_malloc(size_t size)

+{

+    return malloc(size);

+}

+static void CJSON_CDECL internal_free(void *pointer)

+{

+    free(pointer);

+}

+static void * CJSON_CDECL internal_realloc(void *pointer, size_t size)

+{

+    return realloc(pointer, size);

+}

+#else

+#define internal_malloc malloc

+#define internal_free free

+#define internal_realloc realloc

+#endif

+

+/* strlen of character literals resolved at compile time */

+#define static_strlen(string_literal) (sizeof(string_literal) - sizeof(""))

+

+static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc };

+

+static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks)

+{

+    size_t length = 0;

+    unsigned char *copy = NULL;

+

+    if (string == NULL)

+    {

+        return NULL;

+    }

+

+    length = strlen((const char*)string) + sizeof("");

+    copy = (unsigned char*)hooks->allocate(length);

+    if (copy == NULL)

+    {

+        return NULL;

+    }

+    memcpy(copy, string, length);

+

+    return copy;

+}

+

+CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks)

+{

+    if (hooks == NULL)

+    {

+        /* Reset hooks */

+        global_hooks.allocate = malloc;

+        global_hooks.deallocate = free;

+        global_hooks.reallocate = realloc;

+        return;

+    }

+

+    global_hooks.allocate = malloc;

+    if (hooks->malloc_fn != NULL)

+    {

+        global_hooks.allocate = hooks->malloc_fn;

+    }

+

+    global_hooks.deallocate = free;

+    if (hooks->free_fn != NULL)

+    {

+        global_hooks.deallocate = hooks->free_fn;

+    }

+

+    /* use realloc only if both free and malloc are used */

+    global_hooks.reallocate = NULL;

+    if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free))

+    {

+        global_hooks.reallocate = realloc;

+    }

+}

+

+/* Internal constructor. */

+static cJSON *cJSON_New_Item(const internal_hooks * const hooks)

+{

+    cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON));

+    if (node)

+    {

+        memset(node, '\0', sizeof(cJSON));

+    }

+

+    return node;

+}

+

+/* Delete a cJSON structure. */

+CJSON_PUBLIC(void) cJSON_Delete(cJSON *item)

+{

+    cJSON *next = NULL;

+    while (item != NULL)

+    {

+        next = item->next;

+        if (!(item->type & cJSON_IsReference) && (item->child != NULL))

+        {

+            cJSON_Delete(item->child);

+        }

+        if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL))

+        {

+            global_hooks.deallocate(item->valuestring);

+        }

+        if (!(item->type & cJSON_StringIsConst) && (item->string != NULL))

+        {

+            global_hooks.deallocate(item->string);

+        }

+        global_hooks.deallocate(item);

+        item = next;

+    }

+}

+

+/* get the decimal point character of the current locale */

+static unsigned char get_decimal_point(void)

+{

+#ifdef ENABLE_LOCALES

+    struct lconv *lconv = localeconv();

+    return (unsigned char) lconv->decimal_point[0];

+#else

+    return '.';

+#endif

+}

+

+typedef struct

+{

+    const unsigned char *content;

+    size_t length;

+    size_t offset;

+    size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */

+    internal_hooks hooks;

+} parse_buffer;

+

+/* check if the given size is left to read in a given parse buffer (starting with 1) */

+#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length))

+/* check if the buffer can be accessed at the given index (starting with 0) */

+#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length))

+#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index))

+/* get a pointer to the buffer at the position */

+#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset)

+

+/* Parse the input text to generate a number, and populate the result into item. */

+static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer)

+{

+    double number = 0;

+    unsigned char *after_end = NULL;

+    unsigned char number_c_string[64];

+    unsigned char decimal_point = get_decimal_point();

+    size_t i = 0;

+

+    if ((input_buffer == NULL) || (input_buffer->content == NULL))

+    {

+        return false;

+    }

+

+    /* copy the number into a temporary buffer and replace '.' with the decimal point

+     * of the current locale (for strtod)

+     * This also takes care of '\0' not necessarily being available for marking the end of the input */

+    for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++)

+    {

+        switch (buffer_at_offset(input_buffer)[i])

+        {

+            case '0':

+            case '1':

+            case '2':

+            case '3':

+            case '4':

+            case '5':

+            case '6':

+            case '7':

+            case '8':

+            case '9':

+            case '+':

+            case '-':

+            case 'e':

+            case 'E':

+                number_c_string[i] = buffer_at_offset(input_buffer)[i];

+                break;

+

+            case '.':

+                number_c_string[i] = decimal_point;

+                break;

+

+            default:

+                goto loop_end;

+        }

+    }

+loop_end:

+    number_c_string[i] = '\0';

+

+    number = strtod((const char*)number_c_string, (char**)&after_end);

+    if (number_c_string == after_end)

+    {

+        return false; /* parse_error */

+    }

+

+    item->valuedouble = number;

+

+    /* use saturation in case of overflow */

+    if (number >= INT_MAX)

+    {

+        item->valueint = INT_MAX;

+    }

+    else if (number <= (double)INT_MIN)

+    {

+        item->valueint = INT_MIN;

+    }

+    else

+    {

+        item->valueint = (int)number;

+    }

+

+    item->type = cJSON_Number;

+

+    input_buffer->offset += (size_t)(after_end - number_c_string);

+    return true;

+}

+

+/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */

+CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number)

+{

+    if (number >= INT_MAX)

+    {

+        object->valueint = INT_MAX;

+    }

+    else if (number <= (double)INT_MIN)

+    {

+        object->valueint = INT_MIN;

+    }

+    else

+    {

+        object->valueint = (int)number;

+    }

+

+    return object->valuedouble = number;

+}

+

+CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring)

+{

+    char *copy = NULL;

+    /* if object's type is not cJSON_String or is cJSON_IsReference, it should not set valuestring */

+    if (!(object->type & cJSON_String) || (object->type & cJSON_IsReference))

+    {

+        return NULL;

+    }

+    if (strlen(valuestring) <= strlen(object->valuestring))

+    {

+        strcpy(object->valuestring, valuestring);

+        return object->valuestring;

+    }

+    copy = (char*) cJSON_strdup((const unsigned char*)valuestring, &global_hooks);

+    if (copy == NULL)

+    {

+        return NULL;

+    }

+    if (object->valuestring != NULL)

+    {

+        cJSON_free(object->valuestring);

+    }

+    object->valuestring = copy;

+

+    return copy;

+}

+

+typedef struct

+{

+    unsigned char *buffer;

+    size_t length;

+    size_t offset;

+    size_t depth; /* current nesting depth (for formatted printing) */

+    cJSON_bool noalloc;

+    cJSON_bool format; /* is this print a formatted print */

+    internal_hooks hooks;

+} printbuffer;

+

+/* realloc printbuffer if necessary to have at least "needed" bytes more */

+static unsigned char* ensure(printbuffer * const p, size_t needed)

+{

+    unsigned char *newbuffer = NULL;

+    size_t newsize = 0;

+

+    if ((p == NULL) || (p->buffer == NULL))

+    {

+        return NULL;

+    }

+

+    if ((p->length > 0) && (p->offset >= p->length))

+    {

+        /* make sure that offset is valid */

+        return NULL;

+    }

+

+    if (needed > INT_MAX)

+    {

+        /* sizes bigger than INT_MAX are currently not supported */

+        return NULL;

+    }

+

+    needed += p->offset + 1;

+    if (needed <= p->length)

+    {

+        return p->buffer + p->offset;

+    }

+

+    if (p->noalloc) {

+        return NULL;

+    }

+

+    /* calculate new buffer size */

+    if (needed > (INT_MAX / 2))

+    {

+        /* overflow of int, use INT_MAX if possible */

+        if (needed <= INT_MAX)

+        {

+            newsize = INT_MAX;

+        }

+        else

+        {

+            return NULL;

+        }

+    }

+    else

+    {

+        newsize = needed * 2;

+    }

+

+    if (p->hooks.reallocate != NULL)

+    {

+        /* reallocate with realloc if available */

+        newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize);

+        if (newbuffer == NULL)

+        {

+            p->hooks.deallocate(p->buffer);

+            p->length = 0;

+            p->buffer = NULL;

+

+            return NULL;

+        }

+    }

+    else

+    {

+        /* otherwise reallocate manually */

+        newbuffer = (unsigned char*)p->hooks.allocate(newsize);

+        if (!newbuffer)

+        {

+            p->hooks.deallocate(p->buffer);

+            p->length = 0;

+            p->buffer = NULL;

+

+            return NULL;

+        }

+

+        memcpy(newbuffer, p->buffer, p->offset + 1);

+        p->hooks.deallocate(p->buffer);

+    }

+    p->length = newsize;

+    p->buffer = newbuffer;

+

+    return newbuffer + p->offset;

+}

+

+/* calculate the new length of the string in a printbuffer and update the offset */

+static void update_offset(printbuffer * const buffer)

+{

+    const unsigned char *buffer_pointer = NULL;

+    if ((buffer == NULL) || (buffer->buffer == NULL))

+    {

+        return;

+    }

+    buffer_pointer = buffer->buffer + buffer->offset;

+

+    buffer->offset += strlen((const char*)buffer_pointer);

+}

+

+/* securely comparison of floating-point variables */

+static cJSON_bool compare_double(double a, double b)

+{

+    double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);

+    return (fabs(a - b) <= maxVal * DBL_EPSILON);

+}

+

+/* Render the number nicely from the given item into a string. */

+static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer)

+{

+    unsigned char *output_pointer = NULL;

+    double d = item->valuedouble;

+    int length = 0;

+    size_t i = 0;

+    unsigned char number_buffer[26] = {0}; /* temporary buffer to print the number into */

+    unsigned char decimal_point = get_decimal_point();

+    double test = 0.0;

+

+    if (output_buffer == NULL)

+    {

+        return false;

+    }

+

+    /* This checks for NaN and Infinity */

+    if (isnan(d) || isinf(d))

+    {

+        length = sprintf((char*)number_buffer, "null");

+    }

+	else if(d == (double)item->valueint)

+	{

+		length = sprintf((char*)number_buffer, "%d", item->valueint);

+	}

+    else

+    {

+        /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */

+        length = sprintf((char*)number_buffer, "%1.15g", d);

+

+        /* Check whether the original double can be recovered */

+        if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d))

+        {

+            /* If not, print with 17 decimal places of precision */

+            length = sprintf((char*)number_buffer, "%1.17g", d);

+        }

+    }

+

+    /* sprintf failed or buffer overrun occurred */

+    if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1)))

+    {

+        return false;

+    }

+

+    /* reserve appropriate space in the output */

+    output_pointer = ensure(output_buffer, (size_t)length + sizeof(""));

+    if (output_pointer == NULL)

+    {

+        return false;

+    }

+

+    /* copy the printed number to the output and replace locale

+     * dependent decimal point with '.' */

+    for (i = 0; i < ((size_t)length); i++)

+    {

+        if (number_buffer[i] == decimal_point)

+        {

+            output_pointer[i] = '.';

+            continue;

+        }

+

+        output_pointer[i] = number_buffer[i];

+    }

+    output_pointer[i] = '\0';

+

+    output_buffer->offset += (size_t)length;

+

+    return true;

+}

+

+/* parse 4 digit hexadecimal number */

+static unsigned parse_hex4(const unsigned char * const input)

+{

+    unsigned int h = 0;

+    size_t i = 0;

+

+    for (i = 0; i < 4; i++)

+    {

+        /* parse digit */

+        if ((input[i] >= '0') && (input[i] <= '9'))

+        {

+            h += (unsigned int) input[i] - '0';

+        }

+        else if ((input[i] >= 'A') && (input[i] <= 'F'))

+        {

+            h += (unsigned int) 10 + input[i] - 'A';

+        }

+        else if ((input[i] >= 'a') && (input[i] <= 'f'))

+        {

+            h += (unsigned int) 10 + input[i] - 'a';

+        }

+        else /* invalid */

+        {

+            return 0;

+        }

+

+        if (i < 3)

+        {

+            /* shift left to make place for the next nibble */

+            h = h << 4;

+        }

+    }

+

+    return h;

+}

+

+/* converts a UTF-16 literal to UTF-8

+ * A literal can be one or two sequences of the form \uXXXX */

+static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer)

+{

+    long unsigned int codepoint = 0;

+    unsigned int first_code = 0;

+    const unsigned char *first_sequence = input_pointer;

+    unsigned char utf8_length = 0;

+    unsigned char utf8_position = 0;

+    unsigned char sequence_length = 0;

+    unsigned char first_byte_mark = 0;

+

+    if ((input_end - first_sequence) < 6)

+    {

+        /* input ends unexpectedly */

+        goto fail;

+    }

+

+    /* get the first utf16 sequence */

+    first_code = parse_hex4(first_sequence + 2);

+

+    /* check that the code is valid */

+    if (((first_code >= 0xDC00) && (first_code <= 0xDFFF)))

+    {

+        goto fail;

+    }

+

+    /* UTF16 surrogate pair */

+    if ((first_code >= 0xD800) && (first_code <= 0xDBFF))

+    {

+        const unsigned char *second_sequence = first_sequence + 6;

+        unsigned int second_code = 0;

+        sequence_length = 12; /* \uXXXX\uXXXX */

+

+        if ((input_end - second_sequence) < 6)

+        {

+            /* input ends unexpectedly */

+            goto fail;

+        }

+

+        if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u'))

+        {

+            /* missing second half of the surrogate pair */

+            goto fail;

+        }

+

+        /* get the second utf16 sequence */

+        second_code = parse_hex4(second_sequence + 2);

+        /* check that the code is valid */

+        if ((second_code < 0xDC00) || (second_code > 0xDFFF))

+        {

+            /* invalid second half of the surrogate pair */

+            goto fail;

+        }

+

+

+        /* calculate the unicode codepoint from the surrogate pair */

+        codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF));

+    }

+    else

+    {

+        sequence_length = 6; /* \uXXXX */

+        codepoint = first_code;

+    }

+

+    /* encode as UTF-8

+     * takes at maximum 4 bytes to encode:

+     * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */

+    if (codepoint < 0x80)

+    {

+        /* normal ascii, encoding 0xxxxxxx */

+        utf8_length = 1;

+    }

+    else if (codepoint < 0x800)

+    {

+        /* two bytes, encoding 110xxxxx 10xxxxxx */

+        utf8_length = 2;

+        first_byte_mark = 0xC0; /* 11000000 */

+    }

+    else if (codepoint < 0x10000)

+    {

+        /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */

+        utf8_length = 3;

+        first_byte_mark = 0xE0; /* 11100000 */

+    }

+    else if (codepoint <= 0x10FFFF)

+    {

+        /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */

+        utf8_length = 4;

+        first_byte_mark = 0xF0; /* 11110000 */

+    }

+    else

+    {

+        /* invalid unicode codepoint */

+        goto fail;

+    }

+

+    /* encode as utf8 */

+    for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--)

+    {

+        /* 10xxxxxx */

+        (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF);

+        codepoint >>= 6;

+    }

+    /* encode first byte */

+    if (utf8_length > 1)

+    {

+        (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF);

+    }

+    else

+    {

+        (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F);

+    }

+

+    *output_pointer += utf8_length;

+

+    return sequence_length;

+

+fail:

+    return 0;

+}

+

+/* Parse the input text into an unescaped cinput, and populate item. */

+static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer)

+{

+    const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1;

+    const unsigned char *input_end = buffer_at_offset(input_buffer) + 1;

+    unsigned char *output_pointer = NULL;

+    unsigned char *output = NULL;

+

+    /* not a string */

+    if (buffer_at_offset(input_buffer)[0] != '\"')

+    {

+        goto fail;

+    }

+

+    {

+        /* calculate approximate size of the output (overestimate) */

+        size_t allocation_length = 0;

+        size_t skipped_bytes = 0;

+        while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"'))

+        {

+            /* is escape sequence */

+            if (input_end[0] == '\\')

+            {

+                if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length)

+                {

+                    /* prevent buffer overflow when last input character is a backslash */

+                    goto fail;

+                }

+                skipped_bytes++;

+                input_end++;

+            }

+            input_end++;

+        }

+        if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"'))

+        {

+            goto fail; /* string ended unexpectedly */

+        }

+

+        /* This is at most how much we need for the output */

+        allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes;

+        output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof(""));

+        if (output == NULL)

+        {

+            goto fail; /* allocation failure */

+        }

+    }

+

+    output_pointer = output;

+    /* loop through the string literal */

+    while (input_pointer < input_end)

+    {

+        if (*input_pointer != '\\')

+        {

+            *output_pointer++ = *input_pointer++;

+        }

+        /* escape sequence */

+        else

+        {

+            unsigned char sequence_length = 2;

+            if ((input_end - input_pointer) < 1)

+            {

+                goto fail;

+            }

+

+            switch (input_pointer[1])

+            {

+                case 'b':

+                    *output_pointer++ = '\b';

+                    break;

+                case 'f':

+                    *output_pointer++ = '\f';

+                    break;

+                case 'n':

+                    *output_pointer++ = '\n';

+                    break;

+                case 'r':

+                    *output_pointer++ = '\r';

+                    break;

+                case 't':

+                    *output_pointer++ = '\t';

+                    break;

+                case '\"':

+                case '\\':

+                case '/':

+                    *output_pointer++ = input_pointer[1];

+                    break;

+

+                /* UTF-16 literal */

+                case 'u':

+                    sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer);

+                    if (sequence_length == 0)

+                    {

+                        /* failed to convert UTF16-literal to UTF-8 */

+                        goto fail;

+                    }

+                    break;

+

+                default:

+                    goto fail;

+            }

+            input_pointer += sequence_length;

+        }

+    }

+

+    /* zero terminate the output */

+    *output_pointer = '\0';

+

+    item->type = cJSON_String;

+    item->valuestring = (char*)output;

+

+    input_buffer->offset = (size_t) (input_end - input_buffer->content);

+    input_buffer->offset++;

+

+    return true;

+

+fail:

+    if (output != NULL)

+    {

+        input_buffer->hooks.deallocate(output);

+    }

+

+    if (input_pointer != NULL)

+    {

+        input_buffer->offset = (size_t)(input_pointer - input_buffer->content);

+    }

+

+    return false;

+}

+

+/* Render the cstring provided to an escaped version that can be printed. */

+static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer)

+{

+    const unsigned char *input_pointer = NULL;

+    unsigned char *output = NULL;

+    unsigned char *output_pointer = NULL;

+    size_t output_length = 0;

+    /* numbers of additional characters needed for escaping */

+    size_t escape_characters = 0;

+

+    if (output_buffer == NULL)

+    {

+        return false;

+    }

+

+    /* empty string */

+    if (input == NULL)

+    {

+        output = ensure(output_buffer, sizeof("\"\""));

+        if (output == NULL)

+        {

+            return false;

+        }

+        strcpy((char*)output, "\"\"");

+

+        return true;

+    }

+

+    /* set "flag" to 1 if something needs to be escaped */

+    for (input_pointer = input; *input_pointer; input_pointer++)

+    {

+        switch (*input_pointer)

+        {

+            case '\"':

+            case '\\':

+            case '\b':

+            case '\f':

+            case '\n':

+            case '\r':

+            case '\t':

+                /* one character escape sequence */

+                escape_characters++;

+                break;

+            default:

+                if (*input_pointer < 32)

+                {

+                    /* UTF-16 escape sequence uXXXX */

+                    escape_characters += 5;

+                }

+                break;

+        }

+    }

+    output_length = (size_t)(input_pointer - input) + escape_characters;

+

+    output = ensure(output_buffer, output_length + sizeof("\"\""));

+    if (output == NULL)

+    {

+        return false;

+    }

+

+    /* no characters have to be escaped */

+    if (escape_characters == 0)

+    {

+        output[0] = '\"';

+        memcpy(output + 1, input, output_length);

+        output[output_length + 1] = '\"';

+        output[output_length + 2] = '\0';

+

+        return true;

+    }

+

+    output[0] = '\"';

+    output_pointer = output + 1;

+    /* copy the string */

+    for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++)

+    {

+        if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\'))

+        {

+            /* normal character, copy */

+            *output_pointer = *input_pointer;

+        }

+        else

+        {

+            /* character needs to be escaped */

+            *output_pointer++ = '\\';

+            switch (*input_pointer)

+            {

+                case '\\':

+                    *output_pointer = '\\';

+                    break;

+                case '\"':

+                    *output_pointer = '\"';

+                    break;

+                case '\b':

+                    *output_pointer = 'b';

+                    break;

+                case '\f':

+                    *output_pointer = 'f';

+                    break;

+                case '\n':

+                    *output_pointer = 'n';

+                    break;

+                case '\r':

+                    *output_pointer = 'r';

+                    break;

+                case '\t':

+                    *output_pointer = 't';

+                    break;

+                default:

+                    /* escape and print as unicode codepoint */

+                    sprintf((char*)output_pointer, "u%04x", *input_pointer);

+                    output_pointer += 4;

+                    break;

+            }

+        }

+    }

+    output[output_length + 1] = '\"';

+    output[output_length + 2] = '\0';

+

+    return true;

+}

+

+/* Invoke print_string_ptr (which is useful) on an item. */

+static cJSON_bool print_string(const cJSON * const item, printbuffer * const p)

+{

+    return print_string_ptr((unsigned char*)item->valuestring, p);

+}

+

+/* Predeclare these prototypes. */

+static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer);

+static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer);

+static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer);

+static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer);

+static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer);

+static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer);

+

+/* Utility to jump whitespace and cr/lf */

+static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer)

+{

+    if ((buffer == NULL) || (buffer->content == NULL))

+    {

+        return NULL;

+    }

+

+    if (cannot_access_at_index(buffer, 0))

+    {

+        return buffer;

+    }

+

+    while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32))

+    {

+       buffer->offset++;

+    }

+

+    if (buffer->offset == buffer->length)

+    {

+        buffer->offset--;

+    }

+

+    return buffer;

+}

+

+/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */

+static parse_buffer *skip_utf8_bom(parse_buffer * const buffer)

+{

+    if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0))

+    {

+        return NULL;

+    }

+

+    if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0))

+    {

+        buffer->offset += 3;

+    }

+

+    return buffer;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)

+{

+    size_t buffer_length;

+

+    if (NULL == value)

+    {

+        return NULL;

+    }

+

+    /* Adding null character size due to require_null_terminated. */

+    buffer_length = strlen(value) + sizeof("");

+

+    return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated);

+}

+

+/* Parse an object - create a new root, and populate. */

+CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated)

+{

+    parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };

+    cJSON *item = NULL;

+

+    /* reset error position */

+    global_error.json = NULL;

+    global_error.position = 0;

+

+    if (value == NULL || 0 == buffer_length)

+    {

+        goto fail;

+    }

+

+    buffer.content = (const unsigned char*)value;

+    buffer.length = buffer_length;

+    buffer.offset = 0;

+    buffer.hooks = global_hooks;

+

+    item = cJSON_New_Item(&global_hooks);

+    if (item == NULL) /* memory fail */

+    {

+        goto fail;

+    }

+

+    if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer))))

+    {

+        /* parse failure. ep is set. */

+        goto fail;

+    }

+

+    /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */

+    if (require_null_terminated)

+    {

+        buffer_skip_whitespace(&buffer);

+        if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0')

+        {

+            goto fail;

+        }

+    }

+    if (return_parse_end)

+    {

+        *return_parse_end = (const char*)buffer_at_offset(&buffer);

+    }

+

+    return item;

+

+fail:

+    if (item != NULL)

+    {

+        cJSON_Delete(item);

+    }

+

+    if (value != NULL)

+    {

+        error local_error;

+        local_error.json = (const unsigned char*)value;

+        local_error.position = 0;

+

+        if (buffer.offset < buffer.length)

+        {

+            local_error.position = buffer.offset;

+        }

+        else if (buffer.length > 0)

+        {

+            local_error.position = buffer.length - 1;

+        }

+

+        if (return_parse_end != NULL)

+        {

+            *return_parse_end = (const char*)local_error.json + local_error.position;

+        }

+

+        global_error = local_error;

+    }

+

+    return NULL;

+}

+

+/* Default options for cJSON_Parse */

+CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value)

+{

+    return cJSON_ParseWithOpts(value, 0, 0);

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length)

+{

+    return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0);

+}

+

+#define cjson_min(a, b) (((a) < (b)) ? (a) : (b))

+

+static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks)

+{

+    static const size_t default_buffer_size = 256;

+    printbuffer buffer[1];

+    unsigned char *printed = NULL;

+

+    memset(buffer, 0, sizeof(buffer));

+

+    /* create buffer */

+    buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size);

+    buffer->length = default_buffer_size;

+    buffer->format = format;

+    buffer->hooks = *hooks;

+    if (buffer->buffer == NULL)

+    {

+        goto fail;

+    }

+

+    /* print the value */

+    if (!print_value(item, buffer))

+    {

+        goto fail;

+    }

+    update_offset(buffer);

+

+    /* check if reallocate is available */

+    if (hooks->reallocate != NULL)

+    {

+        printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1);

+        if (printed == NULL) {

+            goto fail;

+        }

+        buffer->buffer = NULL;

+    }

+    else /* otherwise copy the JSON over to a new buffer */

+    {

+        printed = (unsigned char*) hooks->allocate(buffer->offset + 1);

+        if (printed == NULL)

+        {

+            goto fail;

+        }

+        memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1));

+        printed[buffer->offset] = '\0'; /* just to be sure */

+

+        /* free the buffer */

+        hooks->deallocate(buffer->buffer);

+    }

+

+    return printed;

+

+fail:

+    if (buffer->buffer != NULL)

+    {

+        hooks->deallocate(buffer->buffer);

+    }

+

+    if (printed != NULL)

+    {

+        hooks->deallocate(printed);

+    }

+

+    return NULL;

+}

+

+/* Render a cJSON item/entity/structure to text. */

+CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item)

+{

+    return (char*)print(item, true, &global_hooks);

+}

+

+CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item)

+{

+    return (char*)print(item, false, &global_hooks);

+}

+

+CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt)

+{

+    printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };

+

+    if (prebuffer < 0)

+    {

+        return NULL;

+    }

+

+    p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer);

+    if (!p.buffer)

+    {

+        return NULL;

+    }

+

+    p.length = (size_t)prebuffer;

+    p.offset = 0;

+    p.noalloc = false;

+    p.format = fmt;

+    p.hooks = global_hooks;

+

+    if (!print_value(item, &p))

+    {

+        global_hooks.deallocate(p.buffer);

+        return NULL;

+    }

+

+    return (char*)p.buffer;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format)

+{

+    printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };

+

+    if ((length < 0) || (buffer == NULL))

+    {

+        return false;

+    }

+

+    p.buffer = (unsigned char*)buffer;

+    p.length = (size_t)length;

+    p.offset = 0;

+    p.noalloc = true;

+    p.format = format;

+    p.hooks = global_hooks;

+

+    return print_value(item, &p);

+}

+

+/* Parser core - when encountering text, process appropriately. */

+static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer)

+{

+    if ((input_buffer == NULL) || (input_buffer->content == NULL))

+    {

+        return false; /* no input */

+    }

+

+    /* parse the different types of values */

+    /* null */

+    if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0))

+    {

+        item->type = cJSON_NULL;

+        input_buffer->offset += 4;

+        return true;

+    }

+    /* false */

+    if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0))

+    {

+        item->type = cJSON_False;

+        input_buffer->offset += 5;

+        return true;

+    }

+    /* true */

+    if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0))

+    {

+        item->type = cJSON_True;

+        item->valueint = 1;

+        input_buffer->offset += 4;

+        return true;

+    }

+    /* string */

+    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"'))

+    {

+        return parse_string(item, input_buffer);

+    }

+    /* number */

+    if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9'))))

+    {

+        return parse_number(item, input_buffer);

+    }

+    /* array */

+    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '['))

+    {

+        return parse_array(item, input_buffer);

+    }

+    /* object */

+    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{'))

+    {

+        return parse_object(item, input_buffer);

+    }

+

+    return false;

+}

+

+/* Render a value to text. */

+static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer)

+{

+    unsigned char *output = NULL;

+

+    if ((item == NULL) || (output_buffer == NULL))

+    {

+        return false;

+    }

+

+    switch ((item->type) & 0xFF)

+    {

+        case cJSON_NULL:

+            output = ensure(output_buffer, 5);

+            if (output == NULL)

+            {

+                return false;

+            }

+            strcpy((char*)output, "null");

+            return true;

+

+        case cJSON_False:

+            output = ensure(output_buffer, 6);

+            if (output == NULL)

+            {

+                return false;

+            }

+            strcpy((char*)output, "false");

+            return true;

+

+        case cJSON_True:

+            output = ensure(output_buffer, 5);

+            if (output == NULL)

+            {

+                return false;

+            }

+            strcpy((char*)output, "true");

+            return true;

+

+        case cJSON_Number:

+            return print_number(item, output_buffer);

+

+        case cJSON_Raw:

+        {

+            size_t raw_length = 0;

+            if (item->valuestring == NULL)

+            {

+                return false;

+            }

+

+            raw_length = strlen(item->valuestring) + sizeof("");

+            output = ensure(output_buffer, raw_length);

+            if (output == NULL)

+            {

+                return false;

+            }

+            memcpy(output, item->valuestring, raw_length);

+            return true;

+        }

+

+        case cJSON_String:

+            return print_string(item, output_buffer);

+

+        case cJSON_Array:

+            return print_array(item, output_buffer);

+

+        case cJSON_Object:

+            return print_object(item, output_buffer);

+

+        default:

+            return false;

+    }

+}

+

+/* Build an array from input text. */

+static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer)

+{

+    cJSON *head = NULL; /* head of the linked list */

+    cJSON *current_item = NULL;

+

+    if (input_buffer->depth >= CJSON_NESTING_LIMIT)

+    {

+        return false; /* to deeply nested */

+    }

+    input_buffer->depth++;

+

+    if (buffer_at_offset(input_buffer)[0] != '[')

+    {

+        /* not an array */

+        goto fail;

+    }

+

+    input_buffer->offset++;

+    buffer_skip_whitespace(input_buffer);

+    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']'))

+    {

+        /* empty array */

+        goto success;

+    }

+

+    /* check if we skipped to the end of the buffer */

+    if (cannot_access_at_index(input_buffer, 0))

+    {

+        input_buffer->offset--;

+        goto fail;

+    }

+

+    /* step back to character in front of the first element */

+    input_buffer->offset--;

+    /* loop through the comma separated array elements */

+    do

+    {

+        /* allocate next item */

+        cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks));

+        if (new_item == NULL)

+        {

+            goto fail; /* allocation failure */

+        }

+

+        /* attach next item to list */

+        if (head == NULL)

+        {

+            /* start the linked list */

+            current_item = head = new_item;

+        }

+        else

+        {

+            /* add to the end and advance */

+            current_item->next = new_item;

+            new_item->prev = current_item;

+            current_item = new_item;

+        }

+

+        /* parse next value */

+        input_buffer->offset++;

+        buffer_skip_whitespace(input_buffer);

+        if (!parse_value(current_item, input_buffer))

+        {

+            goto fail; /* failed to parse value */

+        }

+        buffer_skip_whitespace(input_buffer);

+    }

+    while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ','));

+

+    if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']')

+    {

+        goto fail; /* expected end of array */

+    }

+

+success:

+    input_buffer->depth--;

+

+    if (head != NULL) {

+        head->prev = current_item;

+    }

+

+    item->type = cJSON_Array;

+    item->child = head;

+

+    input_buffer->offset++;

+

+    return true;

+

+fail:

+    if (head != NULL)

+    {

+        cJSON_Delete(head);

+    }

+

+    return false;

+}

+

+/* Render an array to text */

+static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer)

+{

+    unsigned char *output_pointer = NULL;

+    size_t length = 0;

+    cJSON *current_element = item->child;

+

+    if (output_buffer == NULL)

+    {

+        return false;

+    }

+

+    /* Compose the output array. */

+    /* opening square bracket */

+    output_pointer = ensure(output_buffer, 1);

+    if (output_pointer == NULL)

+    {

+        return false;

+    }

+

+    *output_pointer = '[';

+    output_buffer->offset++;

+    output_buffer->depth++;

+

+    while (current_element != NULL)

+    {

+        if (!print_value(current_element, output_buffer))

+        {

+            return false;

+        }

+        update_offset(output_buffer);

+        if (current_element->next)

+        {

+            length = (size_t) (output_buffer->format ? 2 : 1);

+            output_pointer = ensure(output_buffer, length + 1);

+            if (output_pointer == NULL)

+            {

+                return false;

+            }

+            *output_pointer++ = ',';

+            if(output_buffer->format)

+            {

+                *output_pointer++ = ' ';

+            }

+            *output_pointer = '\0';

+            output_buffer->offset += length;

+        }

+        current_element = current_element->next;

+    }

+

+    output_pointer = ensure(output_buffer, 2);

+    if (output_pointer == NULL)

+    {

+        return false;

+    }

+    *output_pointer++ = ']';

+    *output_pointer = '\0';

+    output_buffer->depth--;

+

+    return true;

+}

+

+/* Build an object from the text. */

+static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer)

+{

+    cJSON *head = NULL; /* linked list head */

+    cJSON *current_item = NULL;

+

+    if (input_buffer->depth >= CJSON_NESTING_LIMIT)

+    {

+        return false; /* to deeply nested */

+    }

+    input_buffer->depth++;

+

+    if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{'))

+    {

+        goto fail; /* not an object */

+    }

+

+    input_buffer->offset++;

+    buffer_skip_whitespace(input_buffer);

+    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}'))

+    {

+        goto success; /* empty object */

+    }

+

+    /* check if we skipped to the end of the buffer */

+    if (cannot_access_at_index(input_buffer, 0))

+    {

+        input_buffer->offset--;

+        goto fail;

+    }

+

+    /* step back to character in front of the first element */

+    input_buffer->offset--;

+    /* loop through the comma separated array elements */

+    do

+    {

+        /* allocate next item */

+        cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks));

+        if (new_item == NULL)

+        {

+            goto fail; /* allocation failure */

+        }

+

+        /* attach next item to list */

+        if (head == NULL)

+        {

+            /* start the linked list */

+            current_item = head = new_item;

+        }

+        else

+        {

+            /* add to the end and advance */

+            current_item->next = new_item;

+            new_item->prev = current_item;

+            current_item = new_item;

+        }

+

+        /* parse the name of the child */

+        input_buffer->offset++;

+        buffer_skip_whitespace(input_buffer);

+        if (!parse_string(current_item, input_buffer))

+        {

+            goto fail; /* failed to parse name */

+        }

+        buffer_skip_whitespace(input_buffer);

+

+        /* swap valuestring and string, because we parsed the name */

+        current_item->string = current_item->valuestring;

+        current_item->valuestring = NULL;

+

+        if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':'))

+        {

+            goto fail; /* invalid object */

+        }

+

+        /* parse the value */

+        input_buffer->offset++;

+        buffer_skip_whitespace(input_buffer);

+        if (!parse_value(current_item, input_buffer))

+        {

+            goto fail; /* failed to parse value */

+        }

+        buffer_skip_whitespace(input_buffer);

+    }

+    while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ','));

+

+    if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}'))

+    {

+        goto fail; /* expected end of object */

+    }

+

+success:

+    input_buffer->depth--;

+

+    if (head != NULL) {

+        head->prev = current_item;

+    }

+

+    item->type = cJSON_Object;

+    item->child = head;

+

+    input_buffer->offset++;

+    return true;

+

+fail:

+    if (head != NULL)

+    {

+        cJSON_Delete(head);

+    }

+

+    return false;

+}

+

+/* Render an object to text. */

+static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer)

+{

+    unsigned char *output_pointer = NULL;

+    size_t length = 0;

+    cJSON *current_item = item->child;

+

+    if (output_buffer == NULL)

+    {

+        return false;

+    }

+

+    /* Compose the output: */

+    length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */

+    output_pointer = ensure(output_buffer, length + 1);

+    if (output_pointer == NULL)

+    {

+        return false;

+    }

+

+    *output_pointer++ = '{';

+    output_buffer->depth++;

+    if (output_buffer->format)

+    {

+        *output_pointer++ = '\n';

+    }

+    output_buffer->offset += length;

+

+    while (current_item)

+    {

+        if (output_buffer->format)

+        {

+            size_t i;

+            output_pointer = ensure(output_buffer, output_buffer->depth);

+            if (output_pointer == NULL)

+            {

+                return false;

+            }

+            for (i = 0; i < output_buffer->depth; i++)

+            {

+                *output_pointer++ = '\t';

+            }

+            output_buffer->offset += output_buffer->depth;

+        }

+

+        /* print key */

+        if (!print_string_ptr((unsigned char*)current_item->string, output_buffer))

+        {

+            return false;

+        }

+        update_offset(output_buffer);

+

+        length = (size_t) (output_buffer->format ? 2 : 1);

+        output_pointer = ensure(output_buffer, length);

+        if (output_pointer == NULL)

+        {

+            return false;

+        }

+        *output_pointer++ = ':';

+        if (output_buffer->format)

+        {

+            *output_pointer++ = '\t';

+        }

+        output_buffer->offset += length;

+

+        /* print value */

+        if (!print_value(current_item, output_buffer))

+        {

+            return false;

+        }

+        update_offset(output_buffer);

+

+        /* print comma if not last */

+        length = ((size_t)(output_buffer->format ? 1 : 0) + (size_t)(current_item->next ? 1 : 0));

+        output_pointer = ensure(output_buffer, length + 1);

+        if (output_pointer == NULL)

+        {

+            return false;

+        }

+        if (current_item->next)

+        {

+            *output_pointer++ = ',';

+        }

+

+        if (output_buffer->format)

+        {

+            *output_pointer++ = '\n';

+        }

+        *output_pointer = '\0';

+        output_buffer->offset += length;

+

+        current_item = current_item->next;

+    }

+

+    output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2);

+    if (output_pointer == NULL)

+    {

+        return false;

+    }

+    if (output_buffer->format)

+    {

+        size_t i;

+        for (i = 0; i < (output_buffer->depth - 1); i++)

+        {

+            *output_pointer++ = '\t';

+        }

+    }

+    *output_pointer++ = '}';

+    *output_pointer = '\0';

+    output_buffer->depth--;

+

+    return true;

+}

+

+/* Get Array size/item / object item. */

+CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)

+{

+    cJSON *child = NULL;

+    size_t size = 0;

+

+    if (array == NULL)

+    {

+        return 0;

+    }

+

+    child = array->child;

+

+    while(child != NULL)

+    {

+        size++;

+        child = child->next;

+    }

+

+    /* FIXME: Can overflow here. Cannot be fixed without breaking the API */

+

+    return (int)size;

+}

+

+static cJSON* get_array_item(const cJSON *array, size_t index)

+{

+    cJSON *current_child = NULL;

+

+    if (array == NULL)

+    {

+        return NULL;

+    }

+

+    current_child = array->child;

+    while ((current_child != NULL) && (index > 0))

+    {

+        index--;

+        current_child = current_child->next;

+    }

+

+    return current_child;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index)

+{

+    if (index < 0)

+    {

+        return NULL;

+    }

+

+    return get_array_item(array, (size_t)index);

+}

+

+static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive)

+{

+    cJSON *current_element = NULL;

+

+    if ((object == NULL) || (name == NULL))

+    {

+        return NULL;

+    }

+

+    current_element = object->child;

+    if (case_sensitive)

+    {

+        while ((current_element != NULL) && (current_element->string != NULL) && (strcmp(name, current_element->string) != 0))

+        {

+            current_element = current_element->next;

+        }

+    }

+    else

+    {

+        while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0))

+        {

+            current_element = current_element->next;

+        }

+    }

+

+    if ((current_element == NULL) || (current_element->string == NULL)) {

+        return NULL;

+    }

+

+    return current_element;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string)

+{

+    return get_object_item(object, string, false);

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string)

+{

+    return get_object_item(object, string, true);

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string)

+{

+    return cJSON_GetObjectItem(object, string) ? 1 : 0;

+}

+

+/* Utility for array list handling. */

+static void suffix_object(cJSON *prev, cJSON *item)

+{

+    prev->next = item;

+    item->prev = prev;

+}

+

+/* Utility for handling references. */

+static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks)

+{

+    cJSON *reference = NULL;

+    if (item == NULL)

+    {

+        return NULL;

+    }

+

+    reference = cJSON_New_Item(hooks);

+    if (reference == NULL)

+    {

+        return NULL;

+    }

+

+    memcpy(reference, item, sizeof(cJSON));

+    reference->string = NULL;

+    reference->type |= cJSON_IsReference;

+    reference->next = reference->prev = NULL;

+    return reference;

+}

+

+static cJSON_bool add_item_to_array(cJSON *array, cJSON *item)

+{

+    cJSON *child = NULL;

+

+    if ((item == NULL) || (array == NULL) || (array == item))

+    {

+        return false;

+    }

+

+    child = array->child;

+    /*

+     * To find the last item in array quickly, we use prev in array

+     */

+    if (child == NULL)

+    {

+        /* list is empty, start new one */

+        array->child = item;

+        item->prev = item;

+        item->next = NULL;

+    }

+    else

+    {

+        /* append to the end */

+        if (child->prev)

+        {

+            suffix_object(child->prev, item);

+            array->child->prev = item;

+        }

+    }

+

+    return true;

+}

+

+/* Add item to array/object. */

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item)

+{

+    return add_item_to_array(array, item);

+}

+

+#if defined(__clang__) || (defined(__GNUC__)  && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))

+    #pragma GCC diagnostic push

+#endif

+#ifdef __GNUC__

+#pragma GCC diagnostic ignored "-Wcast-qual"

+#endif

+/* helper function to cast away const */

+static void* cast_away_const(const void* string)

+{

+    return (void*)string;

+}

+#if defined(__clang__) || (defined(__GNUC__)  && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))

+    #pragma GCC diagnostic pop

+#endif

+

+

+static cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key)

+{

+    char *new_key = NULL;

+    int new_type = cJSON_Invalid;

+

+    if ((object == NULL) || (string == NULL) || (item == NULL) || (object == item))

+    {

+        return false;

+    }

+

+    if (constant_key)

+    {

+        new_key = (char*)cast_away_const(string);

+        new_type = item->type | cJSON_StringIsConst;

+    }

+    else

+    {

+        new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks);

+        if (new_key == NULL)

+        {

+            return false;

+        }

+

+        new_type = item->type & ~cJSON_StringIsConst;

+    }

+

+    if (!(item->type & cJSON_StringIsConst) && (item->string != NULL))

+    {

+        hooks->deallocate(item->string);

+    }

+

+    item->string = new_key;

+    item->type = new_type;

+

+    return add_item_to_array(object, item);

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item)

+{

+    return add_item_to_object(object, string, item, &global_hooks, false);

+}

+

+/* Add an item to an object with constant string as key */

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item)

+{

+    return add_item_to_object(object, string, item, &global_hooks, true);

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item)

+{

+    if (array == NULL)

+    {

+        return false;

+    }

+

+    return add_item_to_array(array, create_reference(item, &global_hooks));

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item)

+{

+    if ((object == NULL) || (string == NULL))

+    {

+        return false;

+    }

+

+    return add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false);

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name)

+{

+    cJSON *null = cJSON_CreateNull();

+    if (add_item_to_object(object, name, null, &global_hooks, false))

+    {

+        return null;

+    }

+

+    cJSON_Delete(null);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name)

+{

+    cJSON *true_item = cJSON_CreateTrue();

+    if (add_item_to_object(object, name, true_item, &global_hooks, false))

+    {

+        return true_item;

+    }

+

+    cJSON_Delete(true_item);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name)

+{

+    cJSON *false_item = cJSON_CreateFalse();

+    if (add_item_to_object(object, name, false_item, &global_hooks, false))

+    {

+        return false_item;

+    }

+

+    cJSON_Delete(false_item);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean)

+{

+    cJSON *bool_item = cJSON_CreateBool(boolean);

+    if (add_item_to_object(object, name, bool_item, &global_hooks, false))

+    {

+        return bool_item;

+    }

+

+    cJSON_Delete(bool_item);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number)

+{

+    cJSON *number_item = cJSON_CreateNumber(number);

+    if (add_item_to_object(object, name, number_item, &global_hooks, false))

+    {

+        return number_item;

+    }

+

+    cJSON_Delete(number_item);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string)

+{

+    cJSON *string_item = cJSON_CreateString(string);

+    if (add_item_to_object(object, name, string_item, &global_hooks, false))

+    {

+        return string_item;

+    }

+

+    cJSON_Delete(string_item);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw)

+{

+    cJSON *raw_item = cJSON_CreateRaw(raw);

+    if (add_item_to_object(object, name, raw_item, &global_hooks, false))

+    {

+        return raw_item;

+    }

+

+    cJSON_Delete(raw_item);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name)

+{

+    cJSON *object_item = cJSON_CreateObject();

+    if (add_item_to_object(object, name, object_item, &global_hooks, false))

+    {

+        return object_item;

+    }

+

+    cJSON_Delete(object_item);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name)

+{

+    cJSON *array = cJSON_CreateArray();

+    if (add_item_to_object(object, name, array, &global_hooks, false))

+    {

+        return array;

+    }

+

+    cJSON_Delete(array);

+    return NULL;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item)

+{

+    if ((parent == NULL) || (item == NULL))

+    {

+        return NULL;

+    }

+

+    if (item != parent->child)

+    {

+        /* not the first element */

+        item->prev->next = item->next;

+    }

+    if (item->next != NULL)

+    {

+        /* not the last element */

+        item->next->prev = item->prev;

+    }

+

+    if (item == parent->child)

+    {

+        /* first element */

+        parent->child = item->next;

+    }

+    else if (item->next == NULL)

+    {

+        /* last element */

+        parent->child->prev = item->prev;

+    }

+

+    /* make sure the detached item doesn't point anywhere anymore */

+    item->prev = NULL;

+    item->next = NULL;

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which)

+{

+    if (which < 0)

+    {

+        return NULL;

+    }

+

+    return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which));

+}

+

+CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which)

+{

+    cJSON_Delete(cJSON_DetachItemFromArray(array, which));

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string)

+{

+    cJSON *to_detach = cJSON_GetObjectItem(object, string);

+

+    return cJSON_DetachItemViaPointer(object, to_detach);

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string)

+{

+    cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string);

+

+    return cJSON_DetachItemViaPointer(object, to_detach);

+}

+

+CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string)

+{

+    cJSON_Delete(cJSON_DetachItemFromObject(object, string));

+}

+

+CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string)

+{

+    cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string));

+}

+

+/* Replace array/object items with new ones. */

+CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem)

+{

+    cJSON *after_inserted = NULL;

+

+    if (which < 0)

+    {

+        return false;

+    }

+

+    after_inserted = get_array_item(array, (size_t)which);

+    if (after_inserted == NULL)

+    {

+        return add_item_to_array(array, newitem);

+    }

+

+    newitem->next = after_inserted;

+    newitem->prev = after_inserted->prev;

+    after_inserted->prev = newitem;

+    if (after_inserted == array->child)

+    {

+        array->child = newitem;

+    }

+    else

+    {

+        newitem->prev->next = newitem;

+    }

+    return true;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement)

+{

+    if ((parent == NULL) || (parent->child == NULL) || (replacement == NULL) || (item == NULL))

+    {

+        return false;

+    }

+

+    if (replacement == item)

+    {

+        return true;

+    }

+

+    replacement->next = item->next;

+    replacement->prev = item->prev;

+

+    if (replacement->next != NULL)

+    {

+        replacement->next->prev = replacement;

+    }

+    if (parent->child == item)

+    {

+        if (parent->child->prev == parent->child)

+        {

+            replacement->prev = replacement;

+        }

+        parent->child = replacement;

+    }

+    else

+    {   /*

+         * To find the last item in array quickly, we use prev in array.

+         * We can't modify the last item's next pointer where this item was the parent's child

+         */

+        if (replacement->prev != NULL)

+        {

+            replacement->prev->next = replacement;

+        }

+        if (replacement->next == NULL)

+        {

+            parent->child->prev = replacement;

+        }

+    }

+

+    item->next = NULL;

+    item->prev = NULL;

+    cJSON_Delete(item);

+

+    return true;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem)

+{

+    if (which < 0)

+    {

+        return false;

+    }

+

+    return cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem);

+}

+

+static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive)

+{

+    if ((replacement == NULL) || (string == NULL))

+    {

+        return false;

+    }

+

+    /* replace the name in the replacement */

+    if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL))

+    {

+        cJSON_free(replacement->string);

+    }

+    replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks);

+    if (replacement->string == NULL)

+    {

+        return false;

+    }

+

+    replacement->type &= ~cJSON_StringIsConst;

+

+    return cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement);

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem)

+{

+    return replace_item_in_object(object, string, newitem, false);

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem)

+{

+    return replace_item_in_object(object, string, newitem, true);

+}

+

+/* Create basic types: */

+CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if(item)

+    {

+        item->type = cJSON_NULL;

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if(item)

+    {

+        item->type = cJSON_True;

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if(item)

+    {

+        item->type = cJSON_False;

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if(item)

+    {

+        item->type = boolean ? cJSON_True : cJSON_False;

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if(item)

+    {

+        item->type = cJSON_Number;

+        item->valuedouble = num;

+

+        /* use saturation in case of overflow */

+        if (num >= INT_MAX)

+        {

+            item->valueint = INT_MAX;

+        }

+        else if (num <= (double)INT_MIN)

+        {

+            item->valueint = INT_MIN;

+        }

+        else

+        {

+            item->valueint = (int)num;

+        }

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if(item)

+    {

+        item->type = cJSON_String;

+        item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks);

+        if(!item->valuestring)

+        {

+            cJSON_Delete(item);

+            return NULL;

+        }

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if (item != NULL)

+    {

+        item->type = cJSON_String | cJSON_IsReference;

+        item->valuestring = (char*)cast_away_const(string);

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if (item != NULL) {

+        item->type = cJSON_Object | cJSON_IsReference;

+        item->child = (cJSON*)cast_away_const(child);

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) {

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if (item != NULL) {

+        item->type = cJSON_Array | cJSON_IsReference;

+        item->child = (cJSON*)cast_away_const(child);

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if(item)

+    {

+        item->type = cJSON_Raw;

+        item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks);

+        if(!item->valuestring)

+        {

+            cJSON_Delete(item);

+            return NULL;

+        }

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if(item)

+    {

+        item->type=cJSON_Array;

+    }

+

+    return item;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void)

+{

+    cJSON *item = cJSON_New_Item(&global_hooks);

+    if (item)

+    {

+        item->type = cJSON_Object;

+    }

+

+    return item;

+}

+

+/* Create Arrays: */

+CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count)

+{

+    size_t i = 0;

+    cJSON *n = NULL;

+    cJSON *p = NULL;

+    cJSON *a = NULL;

+

+    if ((count < 0) || (numbers == NULL))

+    {

+        return NULL;

+    }

+

+    a = cJSON_CreateArray();

+

+    for(i = 0; a && (i < (size_t)count); i++)

+    {

+        n = cJSON_CreateNumber(numbers[i]);

+        if (!n)

+        {

+            cJSON_Delete(a);

+            return NULL;

+        }

+        if(!i)

+        {

+            a->child = n;

+        }

+        else

+        {

+            suffix_object(p, n);

+        }

+        p = n;

+    }

+

+    if (a && a->child) {

+        a->child->prev = n;

+    }

+

+    return a;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count)

+{

+    size_t i = 0;

+    cJSON *n = NULL;

+    cJSON *p = NULL;

+    cJSON *a = NULL;

+

+    if ((count < 0) || (numbers == NULL))

+    {

+        return NULL;

+    }

+

+    a = cJSON_CreateArray();

+

+    for(i = 0; a && (i < (size_t)count); i++)

+    {

+        n = cJSON_CreateNumber((double)numbers[i]);

+        if(!n)

+        {

+            cJSON_Delete(a);

+            return NULL;

+        }

+        if(!i)

+        {

+            a->child = n;

+        }

+        else

+        {

+            suffix_object(p, n);

+        }

+        p = n;

+    }

+

+    if (a && a->child) {

+        a->child->prev = n;

+    }

+

+    return a;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count)

+{

+    size_t i = 0;

+    cJSON *n = NULL;

+    cJSON *p = NULL;

+    cJSON *a = NULL;

+

+    if ((count < 0) || (numbers == NULL))

+    {

+        return NULL;

+    }

+

+    a = cJSON_CreateArray();

+

+    for(i = 0; a && (i < (size_t)count); i++)

+    {

+        n = cJSON_CreateNumber(numbers[i]);

+        if(!n)

+        {

+            cJSON_Delete(a);

+            return NULL;

+        }

+        if(!i)

+        {

+            a->child = n;

+        }

+        else

+        {

+            suffix_object(p, n);

+        }

+        p = n;

+    }

+

+    if (a && a->child) {

+        a->child->prev = n;

+    }

+

+    return a;

+}

+

+CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count)

+{

+    size_t i = 0;

+    cJSON *n = NULL;

+    cJSON *p = NULL;

+    cJSON *a = NULL;

+

+    if ((count < 0) || (strings == NULL))

+    {

+        return NULL;

+    }

+

+    a = cJSON_CreateArray();

+

+    for (i = 0; a && (i < (size_t)count); i++)

+    {

+        n = cJSON_CreateString(strings[i]);

+        if(!n)

+        {

+            cJSON_Delete(a);

+            return NULL;

+        }

+        if(!i)

+        {

+            a->child = n;

+        }

+        else

+        {

+            suffix_object(p,n);

+        }

+        p = n;

+    }

+

+    if (a && a->child) {

+        a->child->prev = n;

+    }

+

+    return a;

+}

+

+/* Duplication */

+CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse)

+{

+    cJSON *newitem = NULL;

+    cJSON *child = NULL;

+    cJSON *next = NULL;

+    cJSON *newchild = NULL;

+

+    /* Bail on bad ptr */

+    if (!item)

+    {

+        goto fail;

+    }

+    /* Create new item */

+    newitem = cJSON_New_Item(&global_hooks);

+    if (!newitem)

+    {

+        goto fail;

+    }

+    /* Copy over all vars */

+    newitem->type = item->type & (~cJSON_IsReference);

+    newitem->valueint = item->valueint;

+    newitem->valuedouble = item->valuedouble;

+    if (item->valuestring)

+    {

+        newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks);

+        if (!newitem->valuestring)

+        {

+            goto fail;

+        }

+    }

+    if (item->string)

+    {

+        newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks);

+        if (!newitem->string)

+        {

+            goto fail;

+        }

+    }

+    /* If non-recursive, then we're done! */

+    if (!recurse)

+    {

+        return newitem;

+    }

+    /* Walk the ->next chain for the child. */

+    child = item->child;

+    while (child != NULL)

+    {

+        newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */

+        if (!newchild)

+        {

+            goto fail;

+        }

+        if (next != NULL)

+        {

+            /* If newitem->child already set, then crosswire ->prev and ->next and move on */

+            next->next = newchild;

+            newchild->prev = next;

+            next = newchild;

+        }

+        else

+        {

+            /* Set newitem->child and move to it */

+            newitem->child = newchild;

+            next = newchild;

+        }

+        child = child->next;

+    }

+    if (newitem && newitem->child)

+    {

+        newitem->child->prev = newchild;

+    }

+

+    return newitem;

+

+fail:

+    if (newitem != NULL)

+    {

+        cJSON_Delete(newitem);

+    }

+

+    return NULL;

+}

+

+static void skip_oneline_comment(char **input)

+{

+    *input += static_strlen("//");

+

+    for (; (*input)[0] != '\0'; ++(*input))

+    {

+        if ((*input)[0] == '\n') {

+            *input += static_strlen("\n");

+            return;

+        }

+    }

+}

+

+static void skip_multiline_comment(char **input)

+{

+    *input += static_strlen("/*");

+

+    for (; (*input)[0] != '\0'; ++(*input))

+    {

+        if (((*input)[0] == '*') && ((*input)[1] == '/'))

+        {

+            *input += static_strlen("*/");

+            return;

+        }

+    }

+}

+

+static void minify_string(char **input, char **output) {

+    (*output)[0] = (*input)[0];

+    *input += static_strlen("\"");

+    *output += static_strlen("\"");

+

+

+    for (; (*input)[0] != '\0'; (void)++(*input), ++(*output)) {

+        (*output)[0] = (*input)[0];

+

+        if ((*input)[0] == '\"') {

+            (*output)[0] = '\"';

+            *input += static_strlen("\"");

+            *output += static_strlen("\"");

+            return;

+        } else if (((*input)[0] == '\\') && ((*input)[1] == '\"')) {

+            (*output)[1] = (*input)[1];

+            *input += static_strlen("\"");

+            *output += static_strlen("\"");

+        }

+    }

+}

+

+CJSON_PUBLIC(void) cJSON_Minify(char *json)

+{

+    char *into = json;

+

+    if (json == NULL)

+    {

+        return;

+    }

+

+    while (json[0] != '\0')

+    {

+        switch (json[0])

+        {

+            case ' ':

+            case '\t':

+            case '\r':

+            case '\n':

+                json++;

+                break;

+

+            case '/':

+                if (json[1] == '/')

+                {

+                    skip_oneline_comment(&json);

+                }

+                else if (json[1] == '*')

+                {

+                    skip_multiline_comment(&json);

+                } else {

+                    json++;

+                }

+                break;

+

+            case '\"':

+                minify_string(&json, (char**)&into);

+                break;

+

+            default:

+                into[0] = json[0];

+                json++;

+                into++;

+        }

+    }

+

+    /* and null-terminate. */

+    *into = '\0';

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xFF) == cJSON_Invalid;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xFF) == cJSON_False;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xff) == cJSON_True;

+}

+

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & (cJSON_True | cJSON_False)) != 0;

+}

+CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xFF) == cJSON_NULL;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xFF) == cJSON_Number;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xFF) == cJSON_String;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xFF) == cJSON_Array;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xFF) == cJSON_Object;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item)

+{

+    if (item == NULL)

+    {

+        return false;

+    }

+

+    return (item->type & 0xFF) == cJSON_Raw;

+}

+

+CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive)

+{

+    if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)))

+    {

+        return false;

+    }

+

+    /* check if type is valid */

+    switch (a->type & 0xFF)

+    {

+        case cJSON_False:

+        case cJSON_True:

+        case cJSON_NULL:

+        case cJSON_Number:

+        case cJSON_String:

+        case cJSON_Raw:

+        case cJSON_Array:

+        case cJSON_Object:

+            break;

+

+        default:

+            return false;

+    }

+

+    /* identical objects are equal */

+    if (a == b)

+    {

+        return true;

+    }

+

+    switch (a->type & 0xFF)

+    {

+        /* in these cases and equal type is enough */

+        case cJSON_False:

+        case cJSON_True:

+        case cJSON_NULL:

+            return true;

+

+        case cJSON_Number:

+            if (compare_double(a->valuedouble, b->valuedouble))

+            {

+                return true;

+            }

+            return false;

+

+        case cJSON_String:

+        case cJSON_Raw:

+            if ((a->valuestring == NULL) || (b->valuestring == NULL))

+            {

+                return false;

+            }

+            if (strcmp(a->valuestring, b->valuestring) == 0)

+            {

+                return true;

+            }

+

+            return false;

+

+        case cJSON_Array:

+        {

+            cJSON *a_element = a->child;

+            cJSON *b_element = b->child;

+

+            for (; (a_element != NULL) && (b_element != NULL);)

+            {

+                if (!cJSON_Compare(a_element, b_element, case_sensitive))

+                {

+                    return false;

+                }

+

+                a_element = a_element->next;

+                b_element = b_element->next;

+            }

+

+            /* one of the arrays is longer than the other */

+            if (a_element != b_element) {

+                return false;

+            }

+

+            return true;

+        }

+

+        case cJSON_Object:

+        {

+            cJSON *a_element = NULL;

+            cJSON *b_element = NULL;

+            cJSON_ArrayForEach(a_element, a)

+            {

+                /* TODO This has O(n^2) runtime, which is horrible! */

+                b_element = get_object_item(b, a_element->string, case_sensitive);

+                if (b_element == NULL)

+                {

+                    return false;

+                }

+

+                if (!cJSON_Compare(a_element, b_element, case_sensitive))

+                {

+                    return false;

+                }

+            }

+

+            /* doing this twice, once on a and b to prevent true comparison if a subset of b

+             * TODO: Do this the proper way, this is just a fix for now */

+            cJSON_ArrayForEach(b_element, b)

+            {

+                a_element = get_object_item(a, b_element->string, case_sensitive);

+                if (a_element == NULL)

+                {

+                    return false;

+                }

+

+                if (!cJSON_Compare(b_element, a_element, case_sensitive))

+                {

+                    return false;

+                }

+            }

+

+            return true;

+        }

+

+        default:

+            return false;

+    }

+}

+

+CJSON_PUBLIC(void *) cJSON_malloc(size_t size)

+{

+    return global_hooks.allocate(size);

+}

+

+CJSON_PUBLIC(void) cJSON_free(void *object)

+{

+    global_hooks.deallocate(object);

+}

diff --git a/lynq/MD310EU/ap/app/dmp-test/cjson/cJSON.h b/lynq/MD310EU/ap/app/dmp-test/cjson/cJSON.h
new file mode 100755
index 0000000..f7384b7
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/cjson/cJSON.h
@@ -0,0 +1,300 @@
+/*

+  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors

+

+  Permission is hereby granted, free of charge, to any person obtaining a copy

+  of this software and associated documentation files (the "Software"), to deal

+  in the Software without restriction, including without limitation the rights

+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

+  copies of the Software, and to permit persons to whom the Software is

+  furnished to do so, subject to the following conditions:

+

+  The above copyright notice and this permission notice shall be included in

+  all copies or substantial portions of the Software.

+

+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

+  THE SOFTWARE.

+*/

+

+#ifndef cJSON__h

+#define cJSON__h

+

+#ifdef __cplusplus

+extern "C"

+{

+#endif

+

+#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))

+#define __WINDOWS__

+#endif

+

+#ifdef __WINDOWS__

+

+/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention.  For windows you have 3 define options:

+

+CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols

+CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)

+CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol

+

+For *nix builds that support visibility attribute, you can define similar behavior by

+

+setting default visibility to hidden by adding

+-fvisibility=hidden (for gcc)

+or

+-xldscope=hidden (for sun cc)

+to CFLAGS

+

+then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does

+

+*/

+

+#define CJSON_CDECL __cdecl

+#define CJSON_STDCALL __stdcall

+

+/* export symbols by default, this is necessary for copy pasting the C and header file */

+#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)

+#define CJSON_EXPORT_SYMBOLS

+#endif

+

+#if defined(CJSON_HIDE_SYMBOLS)

+#define CJSON_PUBLIC(type)   type CJSON_STDCALL

+#elif defined(CJSON_EXPORT_SYMBOLS)

+#define CJSON_PUBLIC(type)   __declspec(dllexport) type CJSON_STDCALL

+#elif defined(CJSON_IMPORT_SYMBOLS)

+#define CJSON_PUBLIC(type)   __declspec(dllimport) type CJSON_STDCALL

+#endif

+#else /* !__WINDOWS__ */

+#define CJSON_CDECL

+#define CJSON_STDCALL

+

+#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)

+#define CJSON_PUBLIC(type)   __attribute__((visibility("default"))) type

+#else

+#define CJSON_PUBLIC(type) type

+#endif

+#endif

+

+/* project version */

+#define CJSON_VERSION_MAJOR 1

+#define CJSON_VERSION_MINOR 7

+#define CJSON_VERSION_PATCH 16

+

+#include <stddef.h>

+

+/* cJSON Types: */

+#define cJSON_Invalid (0)

+#define cJSON_False  (1 << 0)

+#define cJSON_True   (1 << 1)

+#define cJSON_NULL   (1 << 2)

+#define cJSON_Number (1 << 3)

+#define cJSON_String (1 << 4)

+#define cJSON_Array  (1 << 5)

+#define cJSON_Object (1 << 6)

+#define cJSON_Raw    (1 << 7) /* raw json */

+

+#define cJSON_IsReference 256

+#define cJSON_StringIsConst 512

+

+/* The cJSON structure: */

+typedef struct cJSON

+{

+    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */

+    struct cJSON *next;

+    struct cJSON *prev;

+    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */

+    struct cJSON *child;

+

+    /* The type of the item, as above. */

+    int type;

+

+    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */

+    char *valuestring;

+    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */

+    int valueint;

+    /* The item's number, if type==cJSON_Number */

+    double valuedouble;

+

+    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */

+    char *string;

+} cJSON;

+

+typedef struct cJSON_Hooks

+{

+      /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */

+      void *(CJSON_CDECL *malloc_fn)(size_t sz);

+      void (CJSON_CDECL *free_fn)(void *ptr);

+} cJSON_Hooks;

+

+typedef int cJSON_bool;

+

+/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.

+ * This is to prevent stack overflows. */

+#ifndef CJSON_NESTING_LIMIT

+#define CJSON_NESTING_LIMIT 1000

+#endif

+

+/* returns the version of cJSON as a string */

+CJSON_PUBLIC(const char*) cJSON_Version(void);

+

+/* Supply malloc, realloc and free functions to cJSON */

+CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);

+

+/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */

+/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */

+CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);

+CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);

+/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */

+/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */

+CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);

+CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);

+

+/* Render a cJSON entity to text for transfer/storage. */

+CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);

+/* Render a cJSON entity to text for transfer/storage without any formatting. */

+CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);

+/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */

+CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);

+/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */

+/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */

+CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);

+/* Delete a cJSON entity and all subentities. */

+CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);

+

+/* Returns the number of items in an array (or object). */

+CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);

+/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */

+CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);

+/* Get item "string" from object. Case insensitive. */

+CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);

+CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);

+CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);

+/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */

+CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);

+

+/* Check item type and return its value */

+CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);

+CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);

+

+/* These functions check the type of an item */

+CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);

+CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);

+

+/* These calls create a cJSON item of the appropriate type. */

+CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);

+CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);

+CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);

+CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);

+CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);

+CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);

+/* raw json */

+CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);

+CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);

+CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);

+

+/* Create a string where valuestring references a string so

+ * it will not be freed by cJSON_Delete */

+CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);

+/* Create an object/array that only references it's elements so

+ * they will not be freed by cJSON_Delete */

+CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);

+CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);

+

+/* These utilities create an Array of count items.

+ * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/

+CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);

+CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);

+CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);

+CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);

+

+/* Append item to the specified array/object. */

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);

+/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.

+ * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before

+ * writing to `item->string` */

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);

+/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);

+CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);

+

+/* Remove/Detach items from Arrays/Objects. */

+CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);

+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);

+CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);

+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);

+CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);

+CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);

+CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);

+

+/* Update array items. */

+CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */

+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);

+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);

+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);

+CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);

+

+/* Duplicate a cJSON item */

+CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);

+/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will

+ * need to be released. With recurse!=0, it will duplicate any children connected to the item.

+ * The item->next and ->prev pointers are always zero on return from Duplicate. */

+/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.

+ * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */

+CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);

+

+/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.

+ * The input pointer json cannot point to a read-only address area, such as a string constant, 

+ * but should point to a readable and writable address area. */

+CJSON_PUBLIC(void) cJSON_Minify(char *json);

+

+/* Helper functions for creating and adding items to an object at the same time.

+ * They return the added item or NULL on failure. */

+CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);

+CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);

+CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);

+CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);

+CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);

+CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);

+CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);

+CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);

+CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);

+

+/* When assigning an integer value, it needs to be propagated to valuedouble too. */

+#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))

+/* helper for the cJSON_SetNumberValue macro */

+CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);

+#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))

+/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */

+CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);

+

+/* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/

+#define cJSON_SetBoolValue(object, boolValue) ( \

+    (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \

+    (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \

+    cJSON_Invalid\

+)

+

+/* Macro for iterating over an array or object */

+#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)

+

+/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */

+CJSON_PUBLIC(void *) cJSON_malloc(size_t size);

+CJSON_PUBLIC(void) cJSON_free(void *object);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif

diff --git a/lynq/MD310EU/ap/app/dmp-test/dongle_cmd.h b/lynq/MD310EU/ap/app/dmp-test/dongle_cmd.h
new file mode 100755
index 0000000..f251c40
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/dongle_cmd.h
@@ -0,0 +1,9 @@
+#define MQTT_URL_LEN 128
+
+typedef struct {
+    char productKey[50];
+    char productSecret[50];
+    char DeviceManu[50];
+    char DeviceType[50];
+    char HardVersion[50];
+}lynq_dmp_cfg_t;
diff --git a/lynq/MD310EU/ap/app/dmp-test/dongle_cust.h b/lynq/MD310EU/ap/app/dmp-test/dongle_cust.h
new file mode 100755
index 0000000..8b13789
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/dongle_cust.h
@@ -0,0 +1 @@
+
diff --git a/lynq/MD310EU/ap/app/dmp-test/dongle_dmp.c b/lynq/MD310EU/ap/app/dmp-test/dongle_dmp.c
new file mode 100755
index 0000000..e350c90
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/dongle_dmp.c
@@ -0,0 +1,2015 @@
+/****************************************************************************
+ *
+ ****************************************************************************/
+#include <stdio.h>
+#include "string.h"
+#include "dongle_cmd.h"
+#include "dongle_cust.h"
+#include "dongle_dmp.h"
+#include "MQTTClient.h"
+#include <pthread.h>
+#include <time.h>
+#include <semaphore.h>
+#include "util_sha256.h"
+#include "util_string.h"
+#include "cJSON.h"
+#include "cfg_api.h"
+#include "zte_web_lan.h"
+#include <curl/curl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include "softap_log.h"
+
+
+#define DMP_TOKEN_FILE         "/mnt/userdata/dongle_dmp_token"
+#define DONGLE_DMP_CONFIG      "/mnt/userdata/dongle_dmp_config"
+
+#define PRODUCT_KEY "cuj28lghju3q5Bha"
+#define MQTT_RECONN_MINTIMESPACE        (1*60*1000)      //Reconnect min timespace, unit:ms
+#define MQTT_RECONN_MAXCOUNT            (30)             //Reconnect max count
+#define DMP_HOST "dmp-mqtts.cuiot.cn"
+#define DMP_PORT 8883
+
+
+typedef enum
+{
+    LYNQ_FOTA_BEGIN = 0,              //FOTA begin http download
+    LYNQ_FOTA_DL_PROC = 1,            //FOTA download progress
+    LYNQ_FOTA_ERR = 2,                //FOTA  error
+    LYNQ_FOTA_DOWNLOADEND = 3,        //FOTA download end
+    LYNQ_FOTA_PACKAGE_MISMATCH = 4,   //FOTA package mismatch
+    LYNQ_FOTA_PARAM_ERRR = 5          //FOTA param error
+} lynq_fota_status;
+
+lynq_dmp_cfg_t dmp_repo_config;
+//
+int dmp_repo_time = MBTK_DMP_REPO_TIME;
+char productSecret[50] = {0};
+char productKey[50] = {0};
+char g_TokenStr[64 + 1] = {0}; 
+static char dmp_MqttSendbuf[1024];
+static char dmp_MqttReadbuf[1024];
+static Network dmp_MqttNetwork;
+static MQTTClient dmp_MqttClient;
+int arrived_flag = 0;
+static int sim_type_flag = 0;
+static int message_id = 123;
+MQTTPacket_connectData connectData2 = MQTTPacket_connectData_initializer;
+char *connackReturnCodeStr[] = {"success", 
+								"unnacceptable protocol", 
+								"clientid rejected",
+								"server unavailable",
+								"bad username or password",
+								"not authorized"};
+
+
+volatile int toStop = 0;
+
+
+void mbtk_dmp_repo_msg(void);
+int mbtk_subscribe_topic();
+
+/**
+ * @brief Gets the value of nv
+ *
+ * Based on the given nv name, get the corresponding value from the configuration file and store it in the specified string variable.
+ *
+ * @param key nv name
+ * @param value A string variable that stores the value of nv
+ *
+ * @return If 1 is returned, the value of nv is obtained successfully. Otherwise, other values are returned
+ */
+int get_cfg_item(char* key,char* value)
+{
+    char rstr[36] = {0};
+    cfg_get_item(key, rstr, sizeof(rstr));
+    slog(MISC_PRINT, SLOG_DEBUG, "nv get %s = %s",key,rstr);
+    //printf("nv get %s = %s",key,rstr);
+    if(strlen(rstr) > 0)
+    {
+        strcpy(value, rstr);
+    }
+    return 1;
+}
+
+void trim_version(const char* input, char* output, size_t outputSize) {
+    const char* searchFor = "AP";
+    const char delimiter = '.';
+
+    const char* apPos = strstr(input, searchFor);
+    if (apPos != NULL) {
+        // Skip AP and the first . immediately following it.
+        apPos += strlen(searchFor) + 1; // Plus the length of the AP and a .
+
+        // the base string to be concatenated
+        const char* prefix = "R305V";
+
+        // Check if the remaining space is sufficient
+        size_t prefixLen = strlen(prefix);
+        size_t versionLen = 0;
+        while (*apPos != '\0' && versionLen < outputSize) {
+            versionLen++;
+            apPos++;
+        }
+
+        // Make sure there is enough space to store the results
+        if (prefixLen + versionLen + 1 > outputSize) {
+            *output = '\0'; 
+            return;
+        }
+
+        // Copy the base string to the output array
+        strcpy(output, prefix); 
+
+        // Concatenate version number
+        strncpy(output + prefixLen, apPos - versionLen, versionLen); // 注意调整起始位置
+
+        output[prefixLen + versionLen] = '\0';
+    } else {
+        // If the AP is not found, the output array remains empty
+        *output = '\0';
+    }
+
+    printf("version is %s\n", output); 
+}
+
+
+
+/**
+ * @brief Handle the MQTT inform_reply topic
+ *
+ * @param md Message data pointer
+ */
+void dmp_sub_command_handle(MessageData* md)
+{
+    MQTTMessage* m = md->message;
+
+    // Check if the message payload contains "code"
+    if(strstr(m->payload, "code") != NULL)
+    {
+        char code[10] = {0};
+        char* strPtr = NULL;
+        strPtr = strstr(m->payload, "code");
+        strPtr = strPtr + 7;
+        // From the current position, read the string before the next double quotation mark and save it to the code array
+        sscanf(strPtr,"%[^\"]",code);
+        slog(MISC_PRINT, SLOG_DEBUG, "pub version code was %s\n", code);
+        //printf("pub version code was %s\n", code);
+    }
+}
+
+/**
+ * @brief Handle DMP remote upgrade
+ *
+ * parse the download link and the upgrade operation is performed.
+ *
+ * @param md Message data pointer
+ */
+void dmp_upgrade_handle(MessageData* md)
+{
+    MQTTMessage* m = md->message;
+
+    // Check if "url" is included in the message payload
+    if(strstr(m->payload, "url") != NULL)
+    {
+        char* strPtr = NULL;
+        char download_url[256] = {0};
+
+        // Empty the download_url array
+        memset(download_url,0x0,sizeof(download_url));
+        // Find the location of "url"
+        strPtr = strstr(m->payload, "url");
+        strPtr = strPtr + 6;
+        // Starting with strPtr, will read the string until the next double quotes and save it to download_url
+        sscanf(strPtr,"%[^\"]",download_url);
+        slog(MISC_PRINT, SLOG_DEBUG, "download_url %s\n",download_url);
+        //printf("download_url %s\n",download_url);
+        if(download_url[0] != '\0')
+        {
+            //printf("start fota download\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "start fota download\n");
+            //Do the FOTA download
+            dmp_fota_download(download_url);
+            sleep(10);
+            //Do the FOTA upgrade
+            dmp_fota_callback(LYNQ_FOTA_DOWNLOADEND, 0);
+        }
+    }
+}
+
+/**
+ * @brief Download the FOTA  pack
+ *
+ * Download the FOTA package from the given URL and save it to the specified path。
+ *
+ * @param url package download address
+ *
+ * @return If the return value is 0, the download succeeds. If the return value is 0, the download fails
+ */
+void dmp_fota_download(char* url)
+{
+    int ret = -1;
+    //printf("start fota download\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "start fota download\n");
+    
+    CURL *curl = curl_easy_init();
+    FILE *fp = fopen("/cache/zte_fota/delta.package", "wb");
+
+    if (fp == NULL)
+    {
+        // If the directory does not exist, create a directory
+        ret = mkdir("/cache/zte_fota",0777);
+        if(ret == -1) {
+            perror("mkdir");
+            return -1;
+        }
+        // Try opening the file again
+        fp = fopen("/cache/zte_fota/delta.package", "wb");
+        if (fp == NULL)
+        {
+            perror("open file error\n");
+            return -1;
+        }
+        
+    }
+
+    if (curl && fp)
+    {
+        // Set the CURL option to specify the download URL
+        curl_easy_setopt(curl, CURLOPT_URL, url);
+        // Set the CURL option to specify a pointer to the file to write to
+        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
+        // Set the CURL option to disable SSL certificate authentication
+        curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,0L);
+        // 设置CURL选项,不验证SSL主机名
+        curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,0L);
+
+        // Set the CURL option to not validate the SSL host name
+        CURLcode res = curl_easy_perform(curl);
+        if (res != CURLE_OK)
+        {
+            //printf("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+            slog(MISC_PRINT, SLOG_DEBUG, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+        }
+        else
+        {
+            slog(MISC_PRINT, SLOG_DEBUG, "downloaded file successfully\n");
+            //printf("downloaded file successfully\n");
+        }
+        fclose(fp);
+    }
+
+    else
+    {
+        slog(MISC_PRINT, SLOG_DEBUG, "curl_easy_init() failed\n");
+        //printf("curl_easy_init() failed\n");
+    }
+
+    // Clear the CURL object
+    curl_easy_cleanup(curl);
+    // Clear CURL global resources
+    curl_global_cleanup();
+    
+    return 0;
+}
+
+/**
+ * @brief DMP FOTA 回调函数
+ *
+ */
+void dmp_fota_callback(lynq_fota_status status, int percent)
+{
+    MQTTMessage pubmsg2;
+    char deviceKey[100] = {0};
+    char ota_progress_topic[100] = {0};
+    char payload_progress[512] = {0};
+    int ret = 0;
+    pubmsg2.qos = QOS0;
+    pubmsg2.retained = 0;
+    pubmsg2.dup = 0;
+
+    memset(deviceKey, 0x0, sizeof(deviceKey));
+    memset(ota_progress_topic, 0x0, sizeof(ota_progress_topic));
+    get_cfg_item("imei", deviceKey);
+    sprintf(ota_progress_topic,"$sys/%s/%s/ota/progress", productKey, deviceKey);
+
+    //start verify
+    system("fota_upi -u verify");
+    FILE *update_status_fp;
+    char update_status[10] = {0};
+    //start to read updata_status
+    update_status_fp = fopen("/cache/zte_fota/update_status", "r");
+    if (update_status_fp != NULL)
+    {
+        ret = fread(update_status, 10, 1, update_status_fp);
+        slog(MISC_PRINT, SLOG_DEBUG, "update_status %s\n", update_status);
+        //printf("update_status %s\n", update_status);
+        fclose(update_status_fp);
+    }
+    else
+    {
+        slog(MISC_PRINT, SLOG_DEBUG, "open update_status failed\n");
+        //printf("open update_status failed\n");
+        return -1;
+    }
+
+    //if update_status is 1, means package mismatch
+    if(strcmp(update_status, "1") == 0)
+    {
+        sprintf(payload_progress,"{\"messageId\":\"%d\",\"params\": {\"step\":\"%d\",\"desc\": \"%d\",\"otaType\": \"%s\"}}",message_id,-3,0,"default");
+        message_id ++;
+        pubmsg2.payload = (void*)payload_progress;
+        pubmsg2.payloadlen = strlen((char*)pubmsg2.payload);
+        ret = MQTTPublish(&dmp_MqttClient, ota_progress_topic, &pubmsg2);
+        slog(MISC_PRINT, SLOG_DEBUG, "pub result:PACKAGE_MISMATCH ret = %d\n", ret);
+        //printf("pub result:PACKAGE_MISMATCH ret = %d\n", ret);
+    }
+
+    //else if update_status is 0, means package match, start upgrade
+    else if (strcmp(update_status, "0") == 0)
+    {
+        while(percent <= 100)
+        {
+            sprintf(payload_progress,"{\"messageId\":\"%d\",\"params\": {\"step\":\"%d\",\"desc\": \"%d\",\"otaType\": \"%s\"}}",message_id,0,percent,"default");
+            message_id ++;
+            pubmsg2.payload = (void*)payload_progress;
+            pubmsg2.payloadlen = strlen((char*)pubmsg2.payload);
+            ret = MQTTPublish(&dmp_MqttClient, ota_progress_topic, &pubmsg2);
+            slog(MISC_PRINT, SLOG_DEBUG, "publish result ret = %d\n", ret);
+            //printf("publish result ret = %d\n", ret);
+            percent+=10;
+            sleep(1);
+        }
+        system("fota_upi -u recovery");
+    }
+}
+
+/**
+ * @brief Reconnect to the MQTT client
+ *
+ * Try to reconnect to the MQTT client by re-establishing the network connection and connecting to the MQTT client.
+ *
+ * @return Connection status code, 0 is returned on success, negative value is returned on failure
+ */
+int MqttClientReconnect()
+{
+    int rc = 0;
+    // Disconnect from the network
+    NetworkDisconnect(&dmp_MqttNetwork);
+     // Select a connection mode based on the port number
+    if(DMP_PORT == 8883)
+    {
+        rc = NetworkConnectBySSL(&dmp_MqttNetwork, DMP_HOST, DMP_PORT, "");
+    }
+    else if(DMP_PORT == 1883)
+    {
+        rc = NetworkConnect(&dmp_MqttNetwork, DMP_HOST, DMP_PORT);
+    }
+
+    if (rc < 0)
+    {
+        slog(MISC_PRINT, SLOG_DEBUG, "mqtt connect failed,rc:%d\n");
+        //printf("mqtt connect failed,rc:%d\n");
+        return -2;
+    }
+
+    // Reconnect to the MQTT server
+    rc = MQTTConnect(&dmp_MqttClient, &connectData2);
+    if (rc != 0)
+    {
+        if(rc > 0 && rc <= 5)
+        {
+            slog(MISC_PRINT, SLOG_DEBUG, "MQTTConnect failed,rc:%d, %s\n", rc,connackReturnCodeStr[rc]);
+            //printf("MQTTConnect failed,rc:%d, %s\n", rc,connackReturnCodeStr[rc]);
+        }
+        else
+        {
+            slog(MISC_PRINT, SLOG_DEBUG, "MQTTConnect failed,rc:%d\n", rc);
+            //printf("MQTTConnect failed,rc:%d\n", rc);
+        }
+        return -3;
+    }
+    return rc;
+}
+
+/**
+ * @brief 
+ *
+ * 
+ */
+void yield_thread(void)
+{
+    int ret;
+    int repo_count = 0;
+    int retry_count = 0;
+    int nextReconnTime = 0;
+    int reconnCount = 0;
+    while(!toStop)
+    {
+        // Check whether the data reporting time is reached
+        if (repo_count >= (dmp_repo_time/30))
+        {
+            mbtk_dmp_repo_msg();
+            repo_count = 0;
+            continue;
+        }
+        // Perform the yield operation on MQTT to listen for messages
+        ret = MQTTYield(&dmp_MqttClient, 1000);
+        slog(MISC_PRINT, SLOG_DEBUG, "yield ret = %d,mqttclientisconnected = %d\n",ret,MQTTIsConnected(&dmp_MqttClient));
+        //printf("yield ret = %d,mqttclientisconnected = %d\n",ret,MQTTIsConnected(&dmp_MqttClient));
+        sleep(30);
+        // If the yield operation does not return 0, the number of retries is increased
+        if (ret != 0)
+        {
+            retry_count++;
+        }
+        
+        // If the number of retries exceeds 10, retry
+        if(retry_count > 10)
+        {
+            reconnCount++;
+            // Calculate the next reconnection time based on the number of reconnections
+			if(reconnCount < MQTT_RECONN_MAXCOUNT)
+			{
+				nextReconnTime = (1 << (reconnCount/5))*MQTT_RECONN_MINTIMESPACE;
+			}
+			else
+			{
+				nextReconnTime = (1 << (MQTT_RECONN_MAXCOUNT/5))*MQTT_RECONN_MINTIMESPACE;
+			}
+            slog(MISC_PRINT, SLOG_DEBUG, "retry_count = %d,need to reconnect\n", retry_count);
+            //printf("retry_count = %d,need to reconnect\n", retry_count);
+            // Try to reconnect
+            ret = MqttClientReconnect(1000);
+            if (ret != 0)
+            {
+                slog(MISC_PRINT, SLOG_DEBUG, "MQTT reconnect failed,rc:%d\n", ret);
+                //printf("MQTT reconnect failed,rc:%d\n", ret);
+                ret = -101;
+                usleep(nextReconnTime);
+            }
+            else
+            {
+                slog(MISC_PRINT, SLOG_DEBUG, "MQTT reconnect success\n");
+                //printf("MQTT reconnect success\n");
+                //resubscribe topic
+                mbtk_subscribe_topic();
+                reconnCount = 0;
+                ret = 1;
+            }
+            retry_count = 0;
+            continue;
+        }
+        repo_count++;
+        usleep(1000*100);
+    }
+}
+
+
+void utils_hmac_sha256(const uint8_t *source, uint32_t sour_len, const uint8_t *key, uint32_t key_len, uint8_t out[32])
+{
+    uni_sha256_s text;
+    uint8_t k_itext[UNI_SHA256_KEY_SIZE];   
+    uint8_t k_otext[UNI_SHA256_KEY_SIZE];   
+    int32_t i;
+
+    if((NULL == source) || (NULL == key) || (NULL == out)) 
+	{
+        //printf("source or key or out is NULL\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "source or key or out is NULL\n");
+        return;
+    }
+
+    if(key_len > UNI_SHA256_KEY_SIZE) 
+	{
+        slog(MISC_PRINT, SLOG_DEBUG, "length:%d is not enough\n", key_len);
+        //printf("length:%d is not enough\n", key_len);
+        return;
+    }
+
+    memset(k_itext, 0, sizeof(k_itext));
+    memset(k_otext, 0, sizeof(k_otext));
+    memcpy(k_itext, key, key_len);
+    memcpy(k_otext, key, key_len);
+
+    for(i = 0; i < UNI_SHA256_KEY_SIZE; i++) 
+	{
+        k_itext[i] ^= 0x36;
+        k_otext[i] ^= 0x5c;
+    }
+
+    utils_sha256_init(&text);                                      
+    utils_sha256_starts(&text);                                  
+    utils_sha256_update(&text, k_itext, UNI_SHA256_KEY_SIZE);     
+    utils_sha256_update(&text, source, sour_len);                    
+    utils_sha256_finish(&text, out);                         
+
+    utils_sha256_init(&text);                            
+    utils_sha256_starts(&text);                           
+    utils_sha256_update(&text, k_otext, UNI_SHA256_KEY_SIZE);    
+    utils_sha256_update(&text, out, UNI_SHA256_TARGET_SIZE);  
+    utils_sha256_finish(&text, out);                      
+}
+
+
+void cfinish(int sig)
+{
+	signal(SIGINT, NULL);
+	toStop = 1;
+}
+
+/**
+ * @brief The callback function when the message arrives
+ *
+ * This callback function is triggered when an MQTT message is received.
+ *
+ * @param md Message data pointer
+ */
+void messageArrived(MessageData* md)
+{
+    //printf("messageArrived\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "messageArrived\n");
+    arrived_flag = 1;
+	MQTTMessage* message = md->message;
+
+	//printf("%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data);
+	//printf("%.*s\n", (int)message->payloadlen, (char*)message->payload);
+    slog(MISC_PRINT, SLOG_DEBUG, "%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data);
+    slog(MISC_PRINT, SLOG_DEBUG, "%.*s\n", (int)message->payloadlen, (char*)message->payload);
+}
+/**
+ * @brief Process MQTT topic messages that auto registration
+ * @param md Message data pointer
+ */
+void _mqtt_noreg_topic_handle(MessageData *md)
+{
+	cJSON *root = NULL;
+	cJSON *pItem = NULL;
+    MQTTMessage* message = md->message;
+
+	//printf("%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data);
+	//printf("%.*s\n", (int)message->payloadlen, (char*)message->payload);
+    slog(MISC_PRINT, SLOG_DEBUG, "%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data);
+    slog(MISC_PRINT, SLOG_DEBUG, "%.*s\n", (int)message->payloadlen, (char*)message->payload);
+
+
+    // If the topic name does not contain "/ext/autoregist", a prompt is printed and returned
+	if(strstr(md->topicName->lenstring.data, "/ext/autoregist") == NULL)
+	{
+        //printf("the packet is not /ext/autoregist");
+        slog(MISC_PRINT, SLOG_DEBUG, "the packet is not /ext/autoregist");
+		return;
+	}
+
+	root = cJSON_Parse(message->payload);
+	if(NULL == root) 
+	{
+		slog(MISC_PRINT, SLOG_DEBUG, "cJSON_Parse error:[%s]", cJSON_GetErrorPtr());
+        //printf("cJSON_Parse error:[%s]", cJSON_GetErrorPtr());
+		return;
+	}
+
+	pItem = cJSON_GetObjectItem(root, "params");
+	if(NULL != pItem)
+	{
+		pItem = cJSON_GetObjectItem(pItem, "token");
+		if(NULL != pItem)
+		{
+			strncpy(g_TokenStr, pItem->valuestring, sizeof(g_TokenStr)-1);
+		}
+	}
+
+    //printf("get token %s\n", g_TokenStr);
+    slog(MISC_PRINT, SLOG_DEBUG, "get token %s\n", g_TokenStr);
+
+	if(root != NULL)
+	{
+		cJSON_Delete(root);
+	}	
+}
+
+/**
+ * @brief acquisition of signal quality
+ *
+ * Gets the values of signal quality, RSSI, RSRP, and RSRQ from the nv and assigns them to the specified variable.
+ *
+ * @param csq 
+ * @param rssi 
+ * @param rsrp 
+ * @param rsrq 
+ *
+ * @return 
+ */
+int appGetSignalQualitySync(uint8_t *csq, int8_t *rssi, int8_t *rsrp, int8_t *rsrq)
+{
+    char value_temp[10] = {0};
+    //printf("get csq \n");
+    slog(MISC_PRINT, SLOG_DEBUG, "get csq \n");
+    get_cfg_item("csq", value_temp);
+    if (strlen(value_temp) > 0)
+    {
+        *csq = atoi(value_temp);
+    }
+    else
+    {
+        *csq = 0;
+    }
+
+    bzero(value_temp, sizeof(value_temp));
+    //printf("get rssi \n");
+    slog(MISC_PRINT, SLOG_DEBUG, "get rssi \n");
+    get_cfg_item("rssi", value_temp);
+    if (strlen(value_temp) > 0)
+    {
+        *rssi = atoi(value_temp);
+    }
+    else
+    {
+        *rssi = 0;
+    }
+
+    bzero(value_temp, sizeof(value_temp));
+    slog(MISC_PRINT, SLOG_DEBUG, "get rsrp \n");
+    //printf("get rsrp \n");
+    get_cfg_item("lte_rsrp", value_temp);
+    if (strlen(value_temp) > 0)
+    {
+        *rsrp = atoi(value_temp);
+    }
+    else
+    {
+        *rsrp = 0;
+    }
+    bzero(value_temp, sizeof(value_temp));
+    return 0;
+}
+
+
+/**
+ * @brief Gets network load information and returns it in JSON format
+ *
+ * The obtained network load information is converted into JSON format and stored in the incoming character array.
+ *
+ * @param net_payload A character array that stores network load information in JSON format
+ *
+ * @return 0 indicates success and -1 indicates failure
+ */
+int mbtk_get_net_payload(char * net_payload)
+{
+    char    *cjson_str = NULL;
+    cJSON   *jsonroot = NULL;
+    int ret = 0;
+    time_t time_test = 0;
+    char time_current[100] = {0};
+    cJSON * ObjArr = NULL;
+    //ol_cid_info_struct info;
+    uint8_t csq = 0;
+    int8_t snr = 0;
+    int8_t rsrp = 0;
+    int8_t rsrq = 0;
+    int8_t sRsrq = 0;
+    int8_t rssi = 0;
+    //BasicCellListInfo cellinfo;
+    char str[10] = {0};
+    char cellid[10] = {0};
+    char pci[10] = {0};
+
+    time_test = time(NULL);
+    //printf("ol_time = %d\n",time_test);
+    slog(MISC_PRINT, SLOG_DEBUG, "ol_time = %d\n",time_test);
+    sprintf(time_current,"%u000",time_test);
+
+    jsonroot = cJSON_CreateObject();
+    if(NULL == jsonroot)
+    {
+        //printf("cjson ob error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson ob error\n");
+        return -1;
+    }
+
+    cJSON_AddStringToObject(jsonroot, "messageId", "11");
+    ObjArr = cJSON_CreateArray();
+
+    //printf("wan_ipaddr\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "wan_ipaddr\n");
+    char wan_ip[128] = {0};
+    get_cfg_item("wan_ipaddr",wan_ip);
+    cJSON * Obj_ip  = NULL;
+    Obj_ip = cJSON_CreateObject();
+    if(NULL == Obj_ip)
+    {
+        //printf("create cjson Obj_ip error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "create cjson Obj_ip error\n");
+        return -1;
+    }
+    cJSON_AddStringToObject(Obj_ip, "key", "WANIP");
+    cJSON_AddStringToObject(Obj_ip, "value", wan_ip);
+    cJSON_AddStringToObject(Obj_ip, "ts", time_current);
+    cJSON_AddItemToArray(ObjArr, Obj_ip);
+
+    ret =  appGetSignalQualitySync(&csq, &rssi, &rsrp, &rsrq);
+    //printf("csq %d rssi%d rsrp %d \n",csq,rssi,rsrp);
+    slog(MISC_PRINT, SLOG_DEBUG, "csq %d rssi%d rsrp %d \n",csq,rssi,rsrp);
+    if(ret == 0)
+    {
+        memset(str,0x0,10);
+        sprintf(str,"%d",csq);
+        if(str[0] != '\0')
+        {
+            cJSON * Objcsq  = NULL;
+            Objcsq = cJSON_CreateObject();
+            if(NULL == Objcsq)
+            {
+                //printf("cjson Objcsq error\n");
+                slog(MISC_PRINT, SLOG_DEBUG, "cjson Objcsq error\n");
+                return -1;
+            }
+            cJSON_AddStringToObject(Objcsq, "key", "csq");
+            cJSON_AddStringToObject(Objcsq, "value", str);
+            cJSON_AddStringToObject(Objcsq, "ts", time_current);
+            cJSON_AddItemToArray(ObjArr, Objcsq);
+        }
+
+        memset(str,0x0,10);
+        sprintf(str,"%d",rsrp);
+        if(str[0] != '\0')
+        {
+            cJSON * Objrsrp  = NULL;
+            Objrsrp = cJSON_CreateObject();
+            if(NULL == Objrsrp)
+            {
+                //printf("cjson Objrsrp error\n");
+                slog(MISC_PRINT, SLOG_DEBUG, "cjson Objrsrp error\n");
+                return -1;
+            }
+            cJSON_AddStringToObject(Objrsrp, "key", "RSRP");
+            cJSON_AddStringToObject(Objrsrp, "value", str);
+            cJSON_AddStringToObject(Objrsrp, "ts", time_current);
+            cJSON_AddItemToArray(ObjArr, Objrsrp);
+        }
+
+        /*
+        memset(str,0,10);
+        if (rsrq != 127)
+        {
+            if (rsrq <= 0)
+            {
+                sRsrq = (rsrq - 39) >> 1;
+            }
+            else if (rsrq <= 34)
+            {
+                    sRsrq = (rsrq - 40) >> 1;
+            }
+            else
+            {
+                    sRsrq = (rsrq - 41) >> 1;
+            }
+        }
+        itoa(sRsrq, str, 10);
+        OL_LOG_PRINTF("str %s",str);
+        if(str[0] != '\0')
+        {
+            cJSON * Objrsrq  = NULL;
+            Objrsrq = cJSON_CreateObject();
+            if(NULL == Objrsrq)
+            {
+            OL_LOG_PRINTF("cjson Objrsrp error");
+            return -1;
+            }
+            cJSON_AddStringToObject(Objrsrq, "key", "RSRQ");
+            cJSON_AddStringToObject(Objrsrq, "value", str);
+            cJSON_AddStringToObject(Objrsrq, "ts", time);
+            cJSON_AddItemToArray(ObjArr, Objrsrq);
+        }
+        */
+
+        memset(str,0x0,10);
+        sprintf(str,"%d",rssi);
+        if(str[0] != '\0')
+        {
+            cJSON * Objrssi  = NULL;
+            Objrssi = cJSON_CreateObject();
+            if(NULL == Objrssi)
+            {
+                //printf("cjson Objrssi error\n");
+                slog(MISC_PRINT, SLOG_DEBUG, "cjson Objrssi error\n");
+                return -1;
+            }
+            cJSON_AddStringToObject(Objrssi, "key", "RSSI");
+            cJSON_AddStringToObject(Objrssi, "value", str);
+            cJSON_AddStringToObject(Objrssi, "ts", time_current);
+            cJSON_AddItemToArray(ObjArr, Objrssi);
+        }
+
+    }
+
+    //printf("get cellid \n");
+    slog(MISC_PRINT, SLOG_DEBUG, "get cellid \n");
+    get_cfg_item("cell_id", cellid);
+    if (strlen(cellid) == 0)
+    {
+        sprintf(cellid,"%d",0);
+    }
+
+    //printf("get pci \n");
+    slog(MISC_PRINT, SLOG_DEBUG, "get pci \n");
+    get_cfg_item("lte_pci", pci);
+    if (strlen(pci) == 0)
+    {
+        sprintf(pci,"%d",0);
+    }
+
+
+    cJSON * ObjCID  = NULL;
+    ObjCID = cJSON_CreateObject();
+    if(NULL == ObjCID)
+    {
+        //printf("cjson ObjCID error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson ObjCID error\n");
+        return -1;
+    }
+    cJSON_AddStringToObject(ObjCID, "key", "cellID");
+    cJSON_AddStringToObject(ObjCID, "value", cellid);
+    cJSON_AddStringToObject(ObjCID, "ts", time_current);
+    cJSON_AddItemToArray(ObjArr, ObjCID);
+
+
+    //printf("pci %s\n", pci);
+    slog(MISC_PRINT, SLOG_DEBUG, "pci %s\n", pci);
+    cJSON * ObjPID  = NULL;
+    ObjPID = cJSON_CreateObject();
+    if(NULL == ObjPID)
+    {
+        //printf("cjson ObjCID error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson ObjCID error\n");
+        return -1;
+    }
+    cJSON_AddStringToObject(ObjPID, "key", "PCI");
+    cJSON_AddStringToObject(ObjPID, "value", pci);
+    cJSON_AddStringToObject(ObjPID, "ts", time_current);
+    cJSON_AddItemToArray(ObjArr, ObjPID);
+
+    cJSON * Objson  = NULL;
+    Objson = cJSON_CreateObject();
+
+    cJSON_AddItemToObject(Objson, "data", ObjArr);
+    cJSON_AddItemToObject(jsonroot, "params", Objson);
+    cjson_str = cJSON_Print(jsonroot);
+    //printf("json root %s\n",cjson_str);
+    slog(MISC_PRINT, SLOG_DEBUG, "json root %s\n",cjson_str);
+    strcpy(net_payload, cjson_str);
+    free(cjson_str);
+    return 0;
+}
+
+void mbtk_pub_sim_payload(char * key,char *value)
+{
+    char payload_temp[512] = {0};
+    char pub_topic[100] = {0};
+    char deviceKey[100] = {0};
+    MQTTMessage pubmsg;
+    MQTTMessage pubmsg2;
+    int ret = 0;
+    time_t time_test = 0;
+    char time_cur[100] = {0};
+
+    memset(deviceKey, 0x0, sizeof(deviceKey));
+    get_cfg_item("imei",deviceKey);
+    memset(pub_topic, 0x0, sizeof(pub_topic));
+    memset(payload_temp, 0x0, sizeof(payload_temp));
+
+    time_test = time(NULL);
+    //printf("time_test %d\n", time_test);
+    slog(MISC_PRINT, SLOG_DEBUG, "time_test %d\n", time_test);
+    sprintf(time_cur, "%u000", time_test);
+
+    if(sim_type_flag)
+    {
+        sim_type_flag = 0;
+        int value_temp = 0;
+        value_temp = atoi(value);
+        //printf("value_temp %d\n",value_temp);
+        slog(MISC_PRINT, SLOG_DEBUG, "value_temp %d\n",value_temp);
+        sprintf(payload_temp,"{\"messageId\":\"%d\",\"params\": {\"key\":\"%s\",\"value\": \"%d\",\"ts\":\"%s\"}}",message_id,key,value_temp,time_cur);
+    }
+    else
+    {
+        sprintf(payload_temp,"{\"messageId\":\"%d\",\"params\": {\"key\":\"%s\",\"value\": \"%s\",\"ts\":\"%s\"}}",message_id,key,value,time_cur);
+    }
+    //printf("payload_temp %s\n", payload_temp);
+    slog(MISC_PRINT, SLOG_DEBUG, "payload_temp %s\n", payload_temp);
+    message_id++;
+
+    pubmsg.payload = (void*)payload_temp;
+    pubmsg.payloadlen = strlen((char*)pubmsg.payload);
+    pubmsg.qos = QOS0;
+    pubmsg.retained = 0;
+    pubmsg.dup = 0;
+
+    sprintf(pub_topic,"$sys/%s/%s/property/pub", productKey, deviceKey);
+    //printf("pub_topic %s\n", pub_topic);
+    slog(MISC_PRINT, SLOG_DEBUG, "pub_topic %s\n", pub_topic);
+    ret = MQTTPublish(&dmp_MqttClient, pub_topic, &pubmsg);
+    if (ret != 0)
+    {
+        //printf("MQTT_Publish failed,ret %d\n", ret);
+        slog(MISC_PRINT, SLOG_DEBUG, "MQTT_Publish failed,ret %d\n", ret);
+    }
+    else
+    {
+        //printf("MQTT_Publish success\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "MQTT_Publish success\n");
+    }
+
+    usleep(500*1000);
+}
+
+
+int mbtk_cjson_test(char * cjson_data)
+{
+    char    *cjson_str = NULL;
+    cJSON   *jsonroot = NULL;
+    int ret = 0;
+    char sn[40] = {0};
+    char imei[32] = {0};
+    time_t time_test = 0;
+    char time_cur[50] = {0};
+    cJSON * ObjArr = NULL;
+
+    time_test = time(NULL);
+    //printf("ol_time = %d\n",time_test);
+    slog(MISC_PRINT, SLOG_DEBUG, "ol_time = %d\n",time_test);
+    sprintf(time_cur,"%u000",time_test);
+
+    jsonroot = cJSON_CreateObject();
+    if(NULL == jsonroot)
+    {
+        //printf("cjson ob error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson ob error\n");
+        return -1;
+    }
+
+    cJSON_AddStringToObject(jsonroot, "messageId", "10");
+    ObjArr = cJSON_CreateArray();
+
+    if(strlen(dmp_repo_config.DeviceManu) > 0)
+    {
+        cJSON * ObjFirst  = NULL;
+        ObjFirst = cJSON_CreateObject();
+        if(NULL == ObjFirst)
+        {
+            //printf("create cjson ObjFirst error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "create cjson ObjFirst error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(ObjFirst, "key", "DeviceManu");
+        cJSON_AddStringToObject(ObjFirst, "value", dmp_repo_config.DeviceManu);
+        cJSON_AddStringToObject(ObjFirst, "ts", time_cur);
+        cJSON_AddItemToArray(ObjArr, ObjFirst);
+    }
+
+    if(strlen(dmp_repo_config.DeviceType) > 0)
+    {
+        cJSON * Obj2  = NULL;
+        Obj2 = cJSON_CreateObject();
+        if(NULL == Obj2)
+        {
+            //printf("create cjson Obj2 error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "create cjson Obj2 error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj2, "key", "DeviceType");
+        cJSON_AddStringToObject(Obj2, "value", dmp_repo_config.DeviceType);
+        cJSON_AddStringToObject(Obj2, "ts", time_cur);
+        cJSON_AddItemToArray(ObjArr, Obj2);
+    }
+
+    memset(sn, 0x0, sizeof(sn));
+    ret = get_cfg_item("SERIAL_TSP",sn);
+    if(ret == 1 && sn[0] != '\0')
+    {
+        cJSON * Obj_sn  = NULL;
+        Obj_sn = cJSON_CreateObject();
+        if(NULL == Obj_sn)
+        {
+            //printf("cjson Obj_sn error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_sn error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj_sn, "key", "sn");
+        cJSON_AddStringToObject(Obj_sn, "value", sn);
+        cJSON_AddStringToObject(Obj_sn, "ts", time_cur);
+        cJSON_AddItemToArray(ObjArr, Obj_sn);
+    }
+
+    memset(imei, 0x0, sizeof(imei));
+    ret = get_cfg_item("imei",imei);
+    if(ret == 1 && imei[0] != '\0')
+    {
+        cJSON * Obj_imei  = NULL;
+        Obj_imei = cJSON_CreateObject();
+        if(NULL == Obj_imei)
+        {
+            //printf("cjson Obj_imei error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_imei error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj_imei, "key", "moduleIMEI");
+        cJSON_AddStringToObject(Obj_imei, "value", imei);
+        cJSON_AddStringToObject(Obj_imei, "ts", time_cur);
+        cJSON_AddItemToArray(ObjArr, Obj_imei);
+    }
+
+
+    cJSON * Obj_MANU  = NULL;
+    Obj_MANU = cJSON_CreateObject();
+    if(NULL == Obj_MANU)
+    {
+        //printf("cjson Obj_MANU error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_MANU error\n");
+        return -1;
+    }
+    cJSON_AddStringToObject(Obj_MANU, "key", "manufacturer");
+    cJSON_AddStringToObject(Obj_MANU, "value", "Mobiletek");
+    cJSON_AddStringToObject(Obj_MANU, "ts", time_cur);
+    cJSON_AddItemToArray(ObjArr, Obj_MANU);
+
+
+    cJSON * Obj_mtype  = NULL;
+    Obj_mtype = cJSON_CreateObject();
+    if(NULL == Obj_mtype)
+    {
+        //printf("cjson Obj_mtype error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_mtype error\n");
+        return -1;
+    }
+    cJSON_AddStringToObject(Obj_mtype, "key", "moduleType");
+    cJSON_AddStringToObject(Obj_mtype, "value", (char *)"R305");
+    cJSON_AddStringToObject(Obj_mtype, "ts", time_cur);
+    cJSON_AddItemToArray(ObjArr, Obj_mtype);
+
+
+    cJSON * Obj_cmanu  = NULL;
+    Obj_cmanu = cJSON_CreateObject();
+    if(NULL == Obj_cmanu)
+    {
+        //printf("cjson Obj_cmanu error");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_cmanu error");
+        return -1;
+    }
+    cJSON_AddStringToObject(Obj_cmanu, "key", "chipManufacturer");
+    cJSON_AddStringToObject(Obj_cmanu, "value", "ZTE");
+    cJSON_AddStringToObject(Obj_cmanu, "ts", time_cur);
+
+    cJSON * Obj_ctype  = NULL;
+    Obj_ctype = cJSON_CreateObject();
+    if(NULL == Obj_ctype)
+    {
+        //printf("cjson Obj_ctype error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_ctype error\n");
+        return -1;
+    }
+    cJSON_AddStringToObject(Obj_ctype, "key", "chipType");
+    cJSON_AddStringToObject(Obj_ctype, "value", "ZTE7520V3");
+    cJSON_AddStringToObject(Obj_ctype, "ts", time_cur);
+
+    cJSON * Obj_sver  = NULL;
+    Obj_sver = cJSON_CreateObject();
+    if(NULL == Obj_sver)
+    {
+        //printf("cjson Obj_sver error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_sver error\n");
+        return -1;
+    }
+    char version[32] = {0};
+    get_cfg_item("cr_version",version);
+    cJSON_AddStringToObject(Obj_sver, "key", "SoftVersion");
+    cJSON_AddStringToObject(Obj_sver, "value", version);
+    cJSON_AddStringToObject(Obj_sver, "ts", time_cur);
+
+    cJSON_AddItemToArray(ObjArr, Obj_cmanu);
+    cJSON_AddItemToArray(ObjArr, Obj_ctype);
+    cJSON_AddItemToArray(ObjArr, Obj_sver);
+
+    cJSON * Objson  = NULL;
+    Objson = cJSON_CreateObject();
+
+    cJSON_AddItemToObject(Objson, "data", ObjArr);
+    cJSON_AddItemToObject(jsonroot, "params", Objson);
+    cjson_str = cJSON_Print(jsonroot);
+    //printf("json root %s\n",cjson_str);
+    slog(MISC_PRINT, SLOG_DEBUG, "json root %s\n",cjson_str);
+    strcpy(cjson_data, cjson_str);
+    free(cjson_str);
+    return 0;
+}
+
+/**
+ * @brief Gets wifi load information and returns it in JSON format
+ *
+ * The obtained wifi load information is converted into JSON format and stored in the incoming character array.
+ *
+ * @param wifi_payload A character array that stores wifi load information in JSON format
+ *
+ * @return 0 indicates success and -1 indicates failure
+ */
+int mbtk_get_wifi_payload(char * wifi_payload)
+{
+    char *cjson_str = NULL;
+    cJSON *jsonroot = NULL;
+    int ret = 0;
+    time_t time_test = 0;
+    char time_current[100] = {0};
+
+    cJSON *ObjArr = NULL;
+    //WIFI information
+    char wifi_mac[32] = {0};
+    char lan_ipaddr[32] = {0};
+    char wifiEnabled[10] = {0};
+    char wifi_ssid[32] = {0};
+    char authmode[10] = {0};
+    char wifi_pwd[32] = {0};
+    char max_connt[32] = {0};
+    char wifi_list[1024] = {0};
+
+    time_test = time(NULL);
+    //printf("time_test %d\n", time_test);
+    slog(MISC_PRINT, SLOG_DEBUG, "time_test %d\n", time_test);
+    sprintf(time_current,"%u000",time_test);
+
+    jsonroot = cJSON_CreateObject();
+    if(NULL == jsonroot)
+    {
+        //printf("cjson root error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson root error\n");
+        return -1;
+    }
+
+    cJSON_AddStringToObject(jsonroot, "messageId", "12");
+    ObjArr = cJSON_CreateArray();
+
+    //printf("wifiEnabled\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "wifiEnabled\n");
+    get_cfg_item("wifiEnabled", wifiEnabled);
+    cJSON * Obj_wifiEnabled  = NULL;
+    Obj_wifiEnabled = cJSON_CreateObject();
+    if(NULL == Obj_wifiEnabled)
+    {
+        //printf("cjson Obj_wifiEnabled error\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_wifiEnabled error\n");
+        return -1;
+    }
+    //printf("wifiEnabled %s\n", wifiEnabled);
+    slog(MISC_PRINT, SLOG_DEBUG, "wifiEnabled %s\n", wifiEnabled);
+    int wifi_enable = atoi(wifiEnabled);
+    if (wifi_enable == 1)
+    {
+        sprintf(wifiEnabled,"true");
+    }
+    else
+    {
+        sprintf(wifiEnabled,"false");
+    }
+    cJSON_AddStringToObject(Obj_wifiEnabled, "key", "WifiEnable");
+    cJSON_AddStringToObject(Obj_wifiEnabled, "value", wifiEnabled);
+    cJSON_AddStringToObject(Obj_wifiEnabled, "ts", time_current);
+    cJSON_AddItemToArray(ObjArr, Obj_wifiEnabled);
+
+    if(wifi_enable == 1)
+    {
+        //printf("wifi_list\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "wifi_list\n");
+        lynq_wlan_get_station_list(wifi_list);
+        //printf("wifi_list %s\n", wifi_list);
+        slog(MISC_PRINT, SLOG_DEBUG, "wifi_list %s\n", wifi_list);
+        if(wifi_list[0] != '\0')
+        {
+            cJSON * Obj_wifi_list  = NULL;
+            Obj_wifi_list = cJSON_CreateObject();
+            if(NULL == Obj_wifi_list)
+            {
+                //printf("cjson Obj_wifi_list error\n");
+                slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_wifi_list error\n");
+                return -1;
+            }
+            cJSON_AddStringToObject(Obj_wifi_list, "key", "DeviceList");
+            cJSON_AddStringToObject(Obj_wifi_list, "value", wifi_list);
+            cJSON_AddStringToObject(Obj_wifi_list, "ts", time_current);
+            cJSON_AddItemToArray(ObjArr, Obj_wifi_list);
+        }
+        //printf("wifi_mac\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "wifi_mac\n");
+        get_cfg_item("wifi_mac", wifi_mac);
+        cJSON * Obj_mac  = NULL;
+        Obj_mac = cJSON_CreateObject();
+        if(NULL == Obj_mac)
+        {
+            //printf("cjson Obj_mac error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_mac error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj_mac, "key", "MAC");
+        cJSON_AddStringToObject(Obj_mac, "value", wifi_mac);
+        cJSON_AddStringToObject(Obj_mac, "ts", time_current);
+        cJSON_AddItemToArray(ObjArr, Obj_mac);
+
+
+        //printf("lan_ipaddr\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "lan_ipaddr\n");
+        get_cfg_item("lan_ipaddr", lan_ipaddr);
+        cJSON * Obj_gateway  = NULL;
+        Obj_gateway = cJSON_CreateObject();
+        if(NULL == Obj_gateway)
+        {
+            //printf("cjson Obj_gateway error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_gateway error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj_gateway, "key", "GatewayIP");
+        cJSON_AddStringToObject(Obj_gateway, "value", lan_ipaddr);
+        cJSON_AddStringToObject(Obj_gateway, "ts", time_current);
+        cJSON_AddItemToArray(ObjArr, Obj_gateway);
+
+        
+        //printf("wifi_ssid\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "wifi_ssid\n");
+        get_cfg_item("SSID1", wifi_ssid);
+        cJSON * Obj_ssid  = NULL;
+        Obj_ssid = cJSON_CreateObject();
+        if(NULL == Obj_ssid)
+        {
+            //printf("cjson Obj_ssid error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_ssid error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj_ssid, "key", "WifiSSID");
+        cJSON_AddStringToObject(Obj_ssid, "value", wifi_ssid);
+        cJSON_AddStringToObject(Obj_ssid, "ts", time_current);
+        cJSON_AddItemToArray(ObjArr, Obj_ssid);
+
+        //printf("authmode\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "authmode\n");
+        get_cfg_item("AuthMode", authmode);
+        cJSON * Obj_authmode  = NULL;
+        Obj_authmode = cJSON_CreateObject();
+        if(NULL == Obj_authmode)
+        {
+            //printf("cjson Obj_authmode error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_authmode error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj_authmode, "key", "WifiAuth");
+        cJSON_AddStringToObject(Obj_authmode, "value", authmode);
+        cJSON_AddStringToObject(Obj_authmode, "ts", time_current);
+        cJSON_AddItemToArray(ObjArr, Obj_authmode);
+
+        //printf("wifi_pwd\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "wifi_pwd\n");
+        get_cfg_item("WPAPSK1", wifi_pwd);
+        cJSON * Obj_pwd  = NULL;
+        Obj_pwd = cJSON_CreateObject();
+        if(NULL == Obj_pwd)
+        {
+            //printf("cjson Obj_pwd error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_pwd error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj_pwd, "key", "WifiPwd");
+        cJSON_AddStringToObject(Obj_pwd, "value", wifi_pwd);
+        cJSON_AddStringToObject(Obj_pwd, "ts", time_current);
+        cJSON_AddItemToArray(ObjArr, Obj_pwd);
+
+
+        //printf("max_connt\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "max_connt\n");
+        get_cfg_item("MAX_Access_num", max_connt);
+        if (strlen(max_connt) == 0)
+        {
+            sprintf(max_connt,"0");
+        }
+        
+        cJSON * Obj_max_connt  = NULL;
+        Obj_max_connt = cJSON_CreateObject();
+        if(NULL == Obj_max_connt)
+        {
+            //printf("cjson Obj_max_connt error\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "cjson Obj_max_connt error\n");
+            return -1;
+        }
+        cJSON_AddStringToObject(Obj_max_connt, "key", "MaxConn");
+        cJSON_AddStringToObject(Obj_max_connt, "value", max_connt);
+        cJSON_AddStringToObject(Obj_max_connt, "ts", time_current);
+        cJSON_AddItemToArray(ObjArr, Obj_max_connt);
+    }
+
+    cJSON * Objson  = NULL;
+    Objson = cJSON_CreateObject();
+
+    cJSON_AddItemToObject(Objson, "data", ObjArr);
+    cJSON_AddItemToObject(jsonroot, "params", Objson);
+    cjson_str = cJSON_Print(jsonroot);
+    //printf("cjson_str %s\n", cjson_str);
+    slog(MISC_PRINT, SLOG_DEBUG, "cjson_str %s\n", cjson_str);
+    strcpy(wifi_payload,cjson_str);
+    free(cjson_str);
+    return 0;
+}
+
+/**
+ * @brief Publish messages to the MQTT server
+ *
+ * This function is responsible for publishing the message to the MQTT server. Depending on the module (sim, network, wifi),
+ * The corresponding message payload is generated and published to the specified topic via the MQTT protocol.
+ *
+ * @note Before publishing a message, the MQTT client's ping response is checked to see if it is suspended, and if it is suspended, it is not published.
+ */
+void mbtk_dmp_repo_msg(void)
+{
+    char payload[2048] = {0};
+    char pub_topic[100] = {0};
+    //sim
+    MQTTMessage pubmsg;
+    //network
+    MQTTMessage pubmsg2;
+    //wifi
+    MQTTMessage pubmsg3;
+
+    int ret = 0;
+    char deviceKey[32] = {0};
+
+    memset(pub_topic, 0x0, sizeof(pub_topic));
+    memset(payload, 0x0, sizeof(payload));
+    memset(deviceKey, 0x0, sizeof(deviceKey));
+
+    get_cfg_item("imei",deviceKey);
+
+    //json test
+    mbtk_cjson_test(payload);
+    if (dmp_MqttClient.ping_outstanding == 0)
+    {
+        pubmsg.payload = (void*)payload;
+        pubmsg.payloadlen = strlen((char*)pubmsg.payload);
+        pubmsg.qos = QOS0;
+        pubmsg.retained = 0;
+        pubmsg.dup = 0;
+        sprintf(pub_topic,"$sys/%s/%s/property/batch", productKey, deviceKey);
+        //printf("pub_topic %s\n", pub_topic);
+        slog(MISC_PRINT, SLOG_DEBUG, "pub_topic %s\n", pub_topic);
+        ret = MQTTPublish(&dmp_MqttClient, pub_topic, &pubmsg);
+        if (ret != 0)
+        {
+            //printf("MQTT_Publish failed,ret %d\n", ret);
+            slog(MISC_PRINT, SLOG_DEBUG, "MQTT_Publish failed,ret %d\n", ret);
+        }
+        else
+        {
+            //printf("MQTT_Publish success\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "MQTT_Publish success\n");
+        }
+    }
+    usleep(1000*1000);
+
+    //imsi
+    char key_imsi[] = {"InIMSI"};
+    char imsi[32] = {0};
+    get_cfg_item("sim_imsi",imsi);
+    mbtk_pub_sim_payload(key_imsi, imsi);
+
+    //imei
+    char key_IMEI[] = {"DeviceIMEI"};
+    mbtk_pub_sim_payload(key_IMEI, deviceKey);
+    if (strlen(dmp_repo_config.HardVersion) > 0)
+    {
+        char key_HardVersion[] = {"HardVersion"};
+        char hard_version[10] = {0};
+        get_cfg_item("hw_version",hard_version);
+        if(hard_version[0] == '\0')
+        {
+            mbtk_pub_sim_payload(key_HardVersion, dmp_repo_config.HardVersion);
+        }
+        else
+        {
+            mbtk_pub_sim_payload(key_HardVersion, hard_version);
+        }
+    }
+
+    //connectionMode
+    char key_conn[] = {"connectionMode"};
+    char value_conn[] = {"4G"};
+    mbtk_pub_sim_payload(key_conn, value_conn);
+
+    //SIMType
+    char key_sim_type[] = {"SIMType"};
+    char sim_type[] = {"0"};
+    //int type,set sim_type_flag = 1
+    sim_type_flag = 1;
+    mbtk_pub_sim_payload(key_sim_type,sim_type);
+
+    char key_iccid[] = {"InICCID"};
+    char iccid[32] = {0};
+    memset(iccid, 0x0, sizeof(iccid));
+    get_cfg_item("ziccid",iccid);
+    mbtk_pub_sim_payload(key_iccid, iccid);
+
+    //software version
+    char module_ver_key[] = {"moduleSoftwareVersion"};
+    char module_ver[32] = {0};
+    memset(module_ver, 0x0, sizeof(module_ver));
+    get_cfg_item("cr_version",module_ver);
+    if(module_ver[0] == '\0')
+    {
+        mbtk_pub_sim_payload(module_ver_key,"LYNQ_CGMR_SW_V1.0");
+    }
+    else
+    {
+        mbtk_pub_sim_payload(module_ver_key,module_ver);
+    }
+    //hardware version
+    char module_hver_key[] = {"moduleHardwareVersion"};
+    char module_hver[10] = {0};
+    memset(module_hver, 0x0, sizeof(module_hver));
+    get_cfg_item("hw_version",module_hver);
+    mbtk_pub_sim_payload(module_hver_key,module_hver);
+
+    //apn
+    char key_apn[] = {"APN"};
+    char apn[100];
+    memset(apn,0x0,sizeof(apn));
+    get_cfg_item("wan_apn",apn);
+    //printf("ret %d,apn %s\n",ret,apn);
+    slog(MISC_PRINT, SLOG_DEBUG, "ret %d,apn %s\n",ret,apn);
+    mbtk_pub_sim_payload(key_apn,apn);
+
+    //printf("repo done\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "repo done\n");
+
+    //time
+    char time_current[128] = {0};
+    char sign = '+';
+    time_t time_stamp;
+    time(&time_stamp);
+    struct tm *time_info = localtime(&time_stamp);
+    sprintf(time_current,"%d-%02d-%02d, %02d:%02d:%02d",
+                                time_info->tm_year + 1900, time_info->tm_mon + 1, time_info->tm_mday,\
+                                time_info->tm_hour, time_info->tm_min, time_info->tm_sec);
+    //printf("current time %s\n",time_current);
+    slog(MISC_PRINT, SLOG_DEBUG, "current time %s\n",time_current);
+    char key_time[] = {"moduleTime"};
+    mbtk_pub_sim_payload(key_time,time_current);
+
+    //netpayload
+    char net_payload[1024] = {0};
+    memset(net_payload, 0x0, sizeof(net_payload));
+    mbtk_get_net_payload(net_payload);
+    //printf("net_payload %s\n",net_payload);
+    slog(MISC_PRINT, SLOG_DEBUG, "net_payload %s\n",net_payload);
+
+    pubmsg2.payload = (void*)net_payload;
+    pubmsg2.payloadlen = strlen((char*)pubmsg2.payload);
+    pubmsg2.qos = QOS0;
+    pubmsg2.retained = 0;
+    pubmsg2.dup = 0;
+    ret = MQTTPublish(&dmp_MqttClient, pub_topic, &pubmsg2);
+    if(ret != 0)
+    {
+        //printf("mqtt publish err, %d\n", ret);
+        //dmp_MqttClient.ping_outstanding = 1;
+        slog(MISC_PRINT, SLOG_DEBUG, "mqtt publish err, %d\n", ret);
+    }
+    else
+    {
+        //printf("mqtt publish2 success\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "mqtt publish2 success\n");
+    }
+    usleep(500*1000);
+
+    char ota_ver_topic[100] = {0};
+    char payload_Version[256] = {0};
+    char origin_version[48] = {0};
+    char inform_version[32] = {0};
+    get_cfg_item("cr_version", origin_version);
+    trim_version(origin_version,inform_version,sizeof(inform_version));
+    sprintf(ota_ver_topic,"$sys/%s/%s/ota/inform", productKey, deviceKey);
+    sprintf(payload_Version,"{\"messageId\":\"%d\",\"params\": {\"version\":\"%s\",\"otaType\": \"%s\"}}",message_id,inform_version,"default");
+    //printf("ota/inform topic %s\n", ota_ver_topic);
+    slog(MISC_PRINT, SLOG_DEBUG, "ota/inform topic %s\n", ota_ver_topic);
+    message_id ++;
+    //printf("payload_Version %s\n", payload_Version);
+    slog(MISC_PRINT, SLOG_DEBUG, "payload_Version %s\n", payload_Version);
+    pubmsg2.payload = (void*)payload_Version;
+    pubmsg2.payloadlen = strlen((char*)pubmsg2.payload);
+    ret = MQTTPublish(&dmp_MqttClient, ota_ver_topic, &pubmsg2);
+    //printf("ota/inform result %d\n",ret);
+    slog(MISC_PRINT, SLOG_DEBUG, "ota/inform result %d\n",ret);
+    sleep(1);
+    
+    char wifi_payload[1024] = {0};
+    memset(wifi_payload, 0x0, sizeof(wifi_payload));
+    mbtk_get_wifi_payload(wifi_payload);
+    //printf("wifi_payload %s\n",wifi_payload);
+    slog(MISC_PRINT, SLOG_DEBUG, "wifi_payload %s\n",wifi_payload);
+
+    pubmsg3.payload = (void*)wifi_payload;
+    pubmsg3.payloadlen = strlen((char*)pubmsg3.payload);
+    pubmsg3.qos = QOS0;
+    pubmsg3.retained = 0;
+    pubmsg3.dup = 0;
+    ret = MQTTPublish(&dmp_MqttClient, pub_topic, &pubmsg3);
+    if(ret != 0)
+    {
+        //printf("mqtt publish err, %d\n", ret);
+        //dmp_MqttClient.ping_outstanding = 1;
+        slog(MISC_PRINT, SLOG_DEBUG, "mqtt publish err, %d\n", ret);
+    }
+    else
+    {
+        //printf("mqtt publish3 success\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "mqtt publish3 success\n");
+    }
+    
+
+    usleep(500*1000);
+
+
+}
+
+/**
+ * @brief Subscribe to topics
+ *
+ * Subscribe to two MQTT topics, one for OTA notification replies and the other for OTA upgrades.
+ *
+ * @return Subscription results, return 0 on success and non-zero on failure
+ */
+int mbtk_subscribe_topic()
+{
+    char deviceKey[32] = {0};
+    int ret = 0;
+    get_cfg_item("imei", deviceKey);
+    char sub_ver_topic[100] = {0};
+    memset(sub_ver_topic, 0x0 ,sizeof(sub_ver_topic));
+    sprintf(sub_ver_topic,"$sys/%s/%s/ota/inform_reply", productKey, deviceKey);
+    ret = MQTTSubscribe(&dmp_MqttClient, sub_ver_topic, QOS0, dmp_sub_command_handle);
+    //printf("subscirbe %s,ret = %d\n",sub_ver_topic,ret);
+    slog(MISC_PRINT, SLOG_DEBUG, "subscirbe %s,ret = %d\n",sub_ver_topic,ret);
+    char ota_sub_topic[100] = {0};
+    memset(ota_sub_topic, 0x0 ,sizeof(ota_sub_topic));
+    sprintf(ota_sub_topic,"$sys/%s/%s/ota/upgrade", productKey, deviceKey);
+    ret = MQTTSubscribe(&dmp_MqttClient, ota_sub_topic, QOS0, dmp_upgrade_handle);
+    //printf("subscirbe %s,ret = %d\n",ota_sub_topic,ret);
+    slog(MISC_PRINT, SLOG_DEBUG, "subscirbe %s,ret = %d\n",ota_sub_topic,ret);
+}
+
+/**
+ * @brief Get file size
+ *
+ * Gets the size of the file (in bytes) by the given file pointer.
+ *
+ * @param fp File pointer
+ *
+ * @return File size (number of bytes), return 0 if the file failed to open
+ */
+int get_file_size(FILE* fp)
+{
+    if (fp == NULL)
+    {
+        //printf("Failed to open file\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "Failed to open file\n");
+        return 0;
+    }
+
+    fseek(fp, 0, SEEK_END);
+    long size = ftell(fp);
+
+    fclose(fp);
+    return size;
+}
+
+void dmp_demo(void)
+{
+    char deviceKey[32] = {0};
+    char device_iccid[32] = {0};
+    char clientID[100] = {0};
+    char UserName[100] = {0};
+    char PassWord_temp[200] = {0};
+    char PassWord[200] = {0};
+    int operator = 1;
+    int mnc = 0;
+    char test_topic[200] = {0};
+    char test_pubtopic[200] = {0};
+    int ret = 0;
+    int retry_num = 0;
+    uint8_t passwd_hex[UNI_PASS_HEX_MAXLEN];
+
+    char new_clientID[100] = {0};
+    char new_UserName[100] = {0};
+    char token[100] = {0};
+
+    memset(new_clientID, 0x0, sizeof(new_clientID));
+    memset(new_UserName, 0x0, sizeof(new_UserName));
+    memset(token, 0x0, sizeof(token));
+
+    memset(deviceKey, 0x0, sizeof(deviceKey));
+    memset(clientID, 0x0, sizeof(clientID));
+    memset(device_iccid, 0x0, sizeof(device_iccid));
+    memset(UserName, 0x0, sizeof(UserName));
+    memset(PassWord, 0x0, sizeof(PassWord));
+    memset(PassWord_temp, 0x0, sizeof(PassWord));
+    memset(test_topic, 0x0, sizeof(test_topic));
+
+    get_cfg_item("imei", deviceKey);
+
+    signal(SIGINT, cfinish);
+	signal(SIGTERM, cfinish);
+
+    //get token config
+    FILE *fp = NULL;
+    int config_size = 0;
+
+    //config_fp = fopen(DONGLE_DMP_CONFIG, "rb");
+    //config_size = lynq_get_file_size(config_fp);
+    //RLOGD("config_size %d", config_size);
+    //if have a config file
+    if (config_size != 0)
+    {
+        lynq_dmp_cfg_t dmp_repo_config_temp;
+        //read config file
+        //****************
+        //
+        memset(&dmp_repo_config, 0x0, sizeof(dmp_repo_config));
+        memcpy(dmp_repo_config.productKey, dmp_repo_config_temp.productKey, strlen(dmp_repo_config_temp.productKey));
+        memcpy(dmp_repo_config.productSecret, dmp_repo_config_temp.productSecret, strlen(dmp_repo_config_temp.productSecret));
+        memcpy(dmp_repo_config.DeviceManu, dmp_repo_config_temp.DeviceManu, strlen(dmp_repo_config_temp.DeviceManu));
+        memcpy(dmp_repo_config.DeviceType, dmp_repo_config_temp.DeviceType, strlen(dmp_repo_config_temp.DeviceType));
+        memcpy(dmp_repo_config.HardVersion, dmp_repo_config_temp.HardVersion, strlen(dmp_repo_config_temp.HardVersion));
+        
+        if (strlen(dmp_repo_config.productKey) > 0 && strlen(dmp_repo_config.productSecret) > 0)
+        {
+            memset(productKey, 0x0, sizeof(productKey));
+            memset(productSecret, 0x0, sizeof(productSecret));
+            memcpy(productKey, dmp_repo_config.productKey, strlen(dmp_repo_config.productKey));
+            memcpy(productSecret, dmp_repo_config.productSecret, strlen(dmp_repo_config.productSecret));
+        }
+        else
+        {
+            memset(productKey, 0x0, sizeof(productKey));
+            memset(productSecret, 0x0, sizeof(productSecret));
+
+            memcpy(productKey, MBTK_DMP_PRODUCT_KEY, strlen(MBTK_DMP_PRODUCT_KEY));
+            memcpy(productSecret, MBTK_DMP_PRODUCT_SECRET, strlen(MBTK_DMP_PRODUCT_SECRET));
+        }
+    }
+    else
+    {
+        memset(&dmp_repo_config, 0x0, sizeof(dmp_repo_config));
+        memset(productKey, 0x0, sizeof(productKey));
+        memset(productSecret, 0x0, sizeof(productSecret));
+
+        memcpy(productKey, MBTK_DMP_PRODUCT_KEY, strlen(MBTK_DMP_PRODUCT_KEY));
+        memcpy(productSecret, MBTK_DMP_PRODUCT_SECRET, strlen(MBTK_DMP_PRODUCT_SECRET));
+        memcpy(dmp_repo_config.DeviceManu, MBTK_DMP_DEVICE_MANU, strlen(MBTK_DMP_DEVICE_MANU));
+        memcpy(dmp_repo_config.DeviceType, MBTK_DMP_DEVICE_TYPE, strlen(MBTK_DMP_DEVICE_TYPE));
+        memcpy(dmp_repo_config.HardVersion, MBTK_DMP_HARD_VERSION, strlen(MBTK_DMP_HARD_VERSION));
+    }
+
+    //geticcid
+    get_cfg_item("ziccid", device_iccid);
+    sprintf(clientID,"%s|%s|0|2|%d", device_iccid, productKey, operator);
+    //printf("clientID %s\n", clientID);
+    slog(MISC_PRINT, SLOG_DEBUG, "clientID %s\n", clientID);
+    sprintf(UserName,"%s|%s", deviceKey, productKey);
+    //printf("UserName :%s \n",UserName);
+    slog(MISC_PRINT, SLOG_DEBUG, "UserName :%s \n",UserName);
+    sprintf(PassWord_temp,"%s%s%s", device_iccid,deviceKey, productKey);
+    //printf("PassWord_temp :%s \n",PassWord_temp);
+    slog(MISC_PRINT, SLOG_DEBUG, "PassWord_temp :%s \n",PassWord_temp);
+    
+    utils_hmac_sha256((const uint8_t *)PassWord_temp, strlen(PassWord_temp), (const uint8_t *)productSecret, strlen(productSecret), passwd_hex);
+    util_hex2str(passwd_hex,UNI_PASS_HEX_MAXLEN,PassWord);
+    //printf("Password :%s \n",PassWord);
+    slog(MISC_PRINT, SLOG_DEBUG, "Password :%s \n",PassWord);
+
+    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
+    connectData.willFlag = 0;
+    connectData.MQTTVersion = 3;
+    connectData.clientID.cstring = clientID;
+    connectData.username.cstring = UserName;
+    connectData.password.cstring = PassWord;
+    connectData.keepAliveInterval = 295;
+    connectData.cleansession = 1;
+
+    FILE *token_fp = NULL;
+    token_fp = fopen(DMP_TOKEN_FILE, "ab+");
+    int token_filesize = 0;
+    token_filesize = get_file_size(token_fp);
+    //printf("token file size %d\n", token_filesize);
+    slog(MISC_PRINT, SLOG_DEBUG, "token file size %d\n", token_filesize);
+    //if don't have a token file, auto registration
+    if (0 == token_filesize)
+    {
+        NetworkInit(&dmp_MqttNetwork);
+        if(DMP_PORT == 8883)
+        {
+            //printf("networkConnectBySSL\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "networkConnectBySSL\n");
+            NetworkConnectBySSL(&dmp_MqttNetwork, DMP_HOST, DMP_PORT, "");
+        }
+        else if(DMP_PORT == 1883)
+        {
+            //printf("networkConnect\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "networkConnect\n");
+            NetworkConnect(&dmp_MqttNetwork, DMP_HOST, DMP_PORT);
+        }
+        MQTTClientInit(&dmp_MqttClient, &dmp_MqttNetwork, 1000, (unsigned char*)dmp_MqttSendbuf, sizeof(dmp_MqttSendbuf), (unsigned char*)dmp_MqttReadbuf, sizeof(dmp_MqttReadbuf));
+        if (MQTTConnect(&dmp_MqttClient, &connectData) != 0)
+        {
+            //printf("MQTT Connect fail\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "MQTT Connect fail\n");
+            dmp_MqttClient.ping_outstanding = 1;
+            if(dmp_MqttSendbuf != NULL)
+            {
+                bzero(dmp_MqttSendbuf,strlen(dmp_MqttSendbuf));
+            }
+            if(dmp_MqttReadbuf != NULL)
+            {
+                bzero(dmp_MqttSendbuf,strlen(dmp_MqttSendbuf));
+            }
+            MQTTDisconnect(&dmp_MqttClient);
+            //printf("disconnect\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "disconnect\n");
+            return;
+        }
+        else{
+            //printf("MQTT Connect success,topic\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "MQTT Connect success,topic\n");
+            dmp_MqttClient.ping_outstanding = 0;
+        }
+
+        sprintf(test_topic,"$sys/%s/%s/ext/autoregist", productKey, deviceKey);
+        //printf("test_topic %s\n", test_topic);
+        slog(MISC_PRINT, SLOG_DEBUG, "test_topic %s\n", test_topic);
+
+        if(dmp_MqttClient.ping_outstanding == 0)
+        {
+            ret = MQTTSubscribe(&dmp_MqttClient, test_topic, QOS0, _mqtt_noreg_topic_handle);
+            if(ret != 0)
+            {
+                //printf("mqtt subscribe err\n, %d", ret);
+                slog(MISC_PRINT, SLOG_DEBUG, "mqtt subscribe err\n, %d", ret);
+                dmp_MqttClient.ping_outstanding = 1;
+            }
+            else
+            {
+                //printf("mqtt subscribe success,topic = %s\n", test_topic);
+                slog(MISC_PRINT, SLOG_DEBUG, "mqtt subscribe success,topic = %s\n", test_topic);
+            }
+            while (1)
+            {
+                //Yield
+                ret = MQTTYield(&dmp_MqttClient, 1000);
+                //printf("mqtt yield ret = %d\n",ret);
+                slog(MISC_PRINT, SLOG_DEBUG, "mqtt yield ret = %d\n",ret);
+                usleep(500*1000);
+
+                if(strlen(g_TokenStr) > 0)
+                {
+                    break;
+                }
+
+                retry_num++;
+                if(retry_num > MQTT_DYNREG_SUBNUM)
+                {
+                    //printf("mqtt dynreg sub retrynum done\n");
+                    slog(MISC_PRINT, SLOG_DEBUG, "mqtt dynreg sub retrynum done\n");
+                    break;
+                }
+            }
+        }
+
+        if(strlen(g_TokenStr) <= 0)
+        {
+            //printf("don't get token %s\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "don't get token %s\n");
+            MQTTDisconnect(&dmp_MqttClient);
+            return;
+        }
+        else
+        {
+            FILE *token_write_fp = fopen(DMP_TOKEN_FILE, "wb");
+            if (token_write_fp == NULL) {
+                perror("Failed to create and open file for writing");
+                fclose(token_write_fp);
+                return;
+            }
+            fwrite(g_TokenStr, sizeof(char), strlen(g_TokenStr), token_write_fp);
+            fclose(token_write_fp);
+            //printf("File created and written with default token.\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "File created and written with default token.\n");
+
+            MQTTDisconnect(&dmp_MqttClient);
+	        NetworkDisconnect(&dmp_MqttNetwork);
+        }
+    }
+    else{
+        FILE *token_read_fp = fopen(DMP_TOKEN_FILE, "rb");
+        if(token_read_fp == NULL)
+        {
+            //printf("open token file fail\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "open token file fail\n");
+            fclose(token_read_fp);
+            return;
+        }
+        size_t bytesRead = fread(g_TokenStr, sizeof(char), token_filesize, token_read_fp);
+        if (bytesRead > 0)
+        {
+            g_TokenStr[bytesRead] = '\0';
+            //printf("token %s\n",g_TokenStr);
+            slog(MISC_PRINT, SLOG_DEBUG, "token %s\n",g_TokenStr);
+        }
+        else
+        {
+            //printf("read token file fail\n");
+            slog(MISC_PRINT, SLOG_DEBUG, "read token file fail\n");
+            fclose(token_read_fp);
+            return;
+        }
+        fclose(token_read_fp);
+    }
+
+    //printf("autoregist success\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "autoregist success\n");
+    sprintf(new_clientID,"%s|%s|0|-2|%d", device_iccid, productKey, operator);
+    sprintf(new_UserName,"%s|%s", deviceKey, productKey);
+    
+    connectData2.willFlag = 0;
+    connectData2.MQTTVersion = 3;
+    connectData2.clientID.cstring = new_clientID;
+    connectData2.username.cstring = new_UserName;
+    connectData2.password.cstring = g_TokenStr;
+    connectData2.keepAliveInterval = 295;
+    connectData2.cleansession = 1;
+
+    //printf("new_clientID %s\n", new_clientID);
+    //printf("new_UserName %s\n", new_UserName);
+    slog(MISC_PRINT, SLOG_DEBUG, "new_clientID %s\n", new_clientID);
+    slog(MISC_PRINT, SLOG_DEBUG, "new_UserName %s\n", new_UserName);
+
+    //printf("networkInit\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "networkInit\n");
+    NetworkInit(&dmp_MqttNetwork);
+    if(DMP_PORT == 8883)
+    {
+        //printf("networkConnectBySSL\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "networkConnectBySSL\n");
+        NetworkConnectBySSL(&dmp_MqttNetwork, DMP_HOST, DMP_PORT, "");
+    }
+    else if(DMP_PORT == 1883)
+    {
+        //printf("networkConnect\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "networkConnect\n");
+        NetworkConnect(&dmp_MqttNetwork, DMP_HOST, DMP_PORT);
+    }
+    //printf("MQTTClientInit\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "MQTTClientInit\n");
+    MQTTClientInit(&dmp_MqttClient, &dmp_MqttNetwork, 1000, (unsigned char*)dmp_MqttSendbuf, sizeof(dmp_MqttSendbuf), (unsigned char*)dmp_MqttReadbuf, sizeof(dmp_MqttReadbuf));
+    //printf("MQTTConnect\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "MQTTConnect\n");
+
+    ret = MQTTConnect(&dmp_MqttClient, &connectData2);
+    if (ret != 0)
+    {
+        //printf("mqtt connect fail,return %d\n",ret);
+        slog(MISC_PRINT, SLOG_DEBUG, "mqtt connect fail,return %d\n",ret);
+        dmp_MqttClient.ping_outstanding = 1;
+        MQTTDisconnect(&dmp_MqttClient);
+        if(dmp_MqttSendbuf != NULL)
+        {
+            bzero(dmp_MqttSendbuf,strlen(dmp_MqttSendbuf));
+        }
+        if(dmp_MqttReadbuf != NULL)
+        {
+            bzero(dmp_MqttSendbuf,strlen(dmp_MqttSendbuf));
+        }
+        //printf("disconnected\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "disconnected\n");
+        return;
+    }
+    else
+    {
+        //printf("mqtt connect success\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "mqtt connect success\n");
+        dmp_MqttClient.ping_outstanding = 0;
+    }
+    mbtk_dmp_repo_msg(); 
+
+    char sub_ver_topic[100] = {0};
+    memset(sub_ver_topic, 0x0 ,sizeof(sub_ver_topic));
+    sprintf(sub_ver_topic,"$sys/%s/%s/ota/inform_reply", productKey, deviceKey);
+    ret = MQTTSubscribe(&dmp_MqttClient, sub_ver_topic, QOS0, dmp_sub_command_handle);
+    //printf("subscirbe %s,ret = %d\n",sub_ver_topic,ret);
+    slog(MISC_PRINT, SLOG_DEBUG, "subscirbe %s,ret = %d\n",sub_ver_topic,ret);
+    char ota_sub_topic[100] = {0};
+    memset(ota_sub_topic, 0x0 ,sizeof(ota_sub_topic));
+    sprintf(ota_sub_topic,"$sys/%s/%s/ota/upgrade", productKey, deviceKey);
+    ret = MQTTSubscribe(&dmp_MqttClient, ota_sub_topic, QOS0, dmp_upgrade_handle);
+    //printf("subscirbe %s,ret = %d\n",ota_sub_topic,ret);
+    slog(MISC_PRINT, SLOG_DEBUG, "subscirbe %s,ret = %d\n",ota_sub_topic,ret);
+
+
+    //printf("dmp_repo_time %d\n", dmp_repo_time);
+    slog(MISC_PRINT, SLOG_DEBUG, "dmp_repo_time %d\n", dmp_repo_time);
+    if (dmp_repo_time > 0)
+    {
+        pthread_t yield_tid;
+        sleep(1);
+        pthread_create(&yield_tid, NULL, yield_thread, NULL);
+        pthread_join(yield_tid, NULL);
+    }
+}
+
+/**
+ * @brief Check network connection
+ *
+ * Run the ping command to check whether the specified IP address (110.242.68.66) can be connected.
+ * If the connection is successful, return 1; Otherwise, 0 is returned.
+ *
+ * @return If the connection is successful, return 1; Otherwise, 0 is returned.
+ */
+int check_network()
+{
+    int i;
+    int count=0;
+    while(1)
+    {
+        i=system("ping -c 1 110.242.68.66");
+        //printf("ping -c 1 110.242.68.66 i=%d \n",i);
+        slog(MISC_PRINT, SLOG_DEBUG, "ping -c 1 110.242.68.66 i=%d \n",i);
+        count++;
+        if(i==0)
+        {
+            return 1;
+        }
+        if(count>3)
+        {
+            //printf("/n error cannot reach 110.242.68.66");
+            slog(MISC_PRINT, SLOG_DEBUG,"/n error cannot reach 110.242.68.66");
+            return 0;
+        }
+    }
+}
+
+void dmp_mqtt_task(void *arg)
+{
+    int net_status = 1;
+    int fail_count = 0;
+    sleep(30);
+    while (1)
+    {
+        net_status = check_network();
+        if(fail_count > 5)
+        {
+            slog(MISC_PRINT, SLOG_DEBUG,"failed time > 5,exit");
+            break;
+        }
+        if (1 == net_status)
+        {
+            dmp_demo();
+            fail_count ++;
+        }
+        sleep(30);
+    }
+    //printf("dmp_mqtt_task start\n");
+    slog(MISC_PRINT, SLOG_DEBUG, "dmp_mqtt_task start\n");
+
+    return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+    pthread_t thread;
+    pthread_attr_t attr;
+    int ret = 0;
+
+    pthread_attr_init(&attr);
+
+    ret = pthread_create(&thread, &attr, dmp_mqtt_task, NULL);
+    //printf("ret = %d\n", ret);
+    slog(MISC_PRINT, SLOG_DEBUG, "ret = %d\n", ret);
+
+    if (ret != 0)
+    {
+        //printf("create dmp_mqtt_task failed\n");
+        slog(MISC_PRINT, SLOG_DEBUG, "create dmp_mqtt_task failed\n");
+        return -1;
+    }
+
+    pthread_join(thread, NULL);
+    
+}
+
+
+
+
+
+
+
+
diff --git a/lynq/MD310EU/ap/app/dmp-test/dongle_dmp.h b/lynq/MD310EU/ap/app/dmp-test/dongle_dmp.h
new file mode 100755
index 0000000..4e6445b
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/dongle_dmp.h
@@ -0,0 +1,16 @@
+#ifndef __DONGLE_DMP_H__
+#define __DONGLE_DMP_H__
+
+#define MQTT_DYNREG_SUBNUM                    30 // retry times
+#define UNI_PASS_HEX_MAXLEN                   32
+
+
+
+#define MBTK_DMP_REPO_TIME                    180
+#define MBTK_DMP_PRODUCT_KEY                 "cuj28lghju3q5Bha"
+#define MBTK_DMP_PRODUCT_SECRET              "f00c0b9665719db1127070d7760a6176"
+#define MBTK_DMP_DEVICE_MANU                 "Mobiletek"
+#define MBTK_DMP_DEVICE_TYPE                 "R305"
+#define MBTK_DMP_HARD_VERSION                "V0"
+
+#endif /*__DONGLE_DMP_H__*/
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTClient.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTClient.h
new file mode 100755
index 0000000..9d9eb7a
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTClient.h
@@ -0,0 +1,372 @@
+/*******************************************************************************

+ * Copyright (c) 2014, 2017 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation

+ *    Ian Craggs - documentation and platform specific header

+ *    Ian Craggs - add setMessageHandler function

+ *******************************************************************************/

+

+#if !defined(__MQTT_CLIENT_C_)

+#define __MQTT_CLIENT_C_

+

+#if defined(__cplusplus)

+ extern "C" {

+#endif

+

+#if defined(WIN32_DLL) || defined(WIN64_DLL)

+  #define DLLImport __declspec(dllimport)

+  #define DLLExport __declspec(dllexport)

+#elif defined(LINUX_SO)

+  #define DLLImport extern

+  #define DLLExport  __attribute__ ((visibility ("default")))

+#else

+  #define DLLImport

+  #define DLLExport

+#endif

+

+#include "MQTTLinux.h"
+#include "MQTTPacket.h"

+#if defined FEATURE_FREERTOS_ENABLE

+#include "MQTTFreeRTOS.h"

+#endif

+

+#if defined FEATURE_LITEOS_ENABLE

+#include "MQTTLiteOS.h"

+#endif

+

+#if defined(MQTTCLIENT_PLATFORM_HEADER)

+/* The following sequence of macros converts the MQTTCLIENT_PLATFORM_HEADER value

+ * into a string constant suitable for use with include.

+ */

+#define xstr(s) str(s)

+#define str(s) #s

+#include xstr(MQTTCLIENT_PLATFORM_HEADER)

+#endif

+

+#define MAX_PACKET_ID 65535 /* according to the MQTT specification - do not change! */

+

+#if !defined(MAX_MESSAGE_HANDLERS)

+#ifdef MBTK_OPENCPU_SUPPORT

+#define MAX_MESSAGE_HANDLERS 10

+#else

+#define MAX_MESSAGE_HANDLERS 5 /* redefinable - how many subscriptions do you want? */

+#endif

+#endif

+

+enum QoS { QOS0, QOS1, QOS2, SUBFAIL=0x80 };

+

+/* all failure return codes must be negative */

+enum returnCode { BUFFER_OVERFLOW = -2, FAILURE = -1, SUCCESS = 0 };

+

+/* The Platform specific header must define the Network and Timer structures and functions

+ * which operate on them.

+ *

+typedef struct Network

+{

+    int (*mqttread)(Network*, unsigned char* read_buffer, int, int);

+    int (*mqttwrite)(Network*, unsigned char* send_buffer, int, int);

+} Network;*/

+

+/* The Timer structure must be defined in the platform specific header,

+ * and have the following functions to operate on it.  */

+extern void TimerInit(Timer*);

+extern char TimerIsExpired(Timer*);

+extern void TimerCountdownMS(Timer*, unsigned int);

+extern void TimerCountdown(Timer*, unsigned int);

+extern int TimerLeftMS(Timer*);

+

+#ifdef MBTK_OPENCPU_SUPPORT

+enum MBTK_MQTT_SSL_TYPE

+{

+    MBTK_MQTT_SSL_NONE = 0,

+    MBTK_MQTT_SSL_HAVE = 1,

+};

+typedef enum

+{

+    MQTT_CONNECT_SUCCESS_EVENT = 0,

+    MQTT_DISCONNECT_SUCCESS_EVENT = 1,

+    MQTT_CONNECT_ABORT_EVENT = 2,

+    MQTT_START_RECONNECT_EVENT = 3,

+    MQTT_RECONNECT_FAIL_EVENT = 4,

+}MqttConnectionEvent;

+

+typedef enum

+{

+    MBTK_MQTT_RECONNECT_ENABLE = 0,

+    MBTK_MQTT_RECONNECT_DISABLE = 1,

+}MBTK_Mqtt_Reconnect_FLAG;

+

+typedef void (*connect_event_cb_t)(uint32_t event,uint32_t errno);

+

+#endif

+

+typedef struct MQTTMessage

+{

+    enum QoS qos;

+    unsigned char retained;

+    unsigned char dup;

+    unsigned short id;

+    void *payload;

+    size_t payloadlen;

+} MQTTMessage;

+

+typedef struct MessageData

+{

+    MQTTMessage* message;

+    MQTTString* topicName;

+} MessageData;

+

+typedef struct MQTTConnackData

+{

+    unsigned char rc;

+    unsigned char sessionPresent;

+} MQTTConnackData;

+

+typedef struct MQTTSubackData

+{

+    enum QoS grantedQoS;

+} MQTTSubackData;

+

+typedef void (*messageHandler)(MessageData*);

+

+typedef struct MQTTClient

+{

+    unsigned int next_packetid,

+      command_timeout_ms;

+    size_t buf_size,

+      readbuf_size;

+    unsigned char *buf,

+      *readbuf;

+    unsigned int keepAliveInterval;

+    char ping_outstanding;

+    int isconnected;

+    int cleansession;

+

+    struct MessageHandlers

+    {

+        const char* topicFilter;

+        void (*fp) (MessageData*);

+#ifdef MBTK_OPENCPU_SUPPORT

+        int qos;

+#endif

+    } messageHandlers[MAX_MESSAGE_HANDLERS];      /* Message handlers are indexed by subscription topic */

+

+    void (*defaultMessageHandler) (MessageData*);

+

+    Network* ipstack;

+    Timer last_sent, last_received;

+#if defined(MQTT_TASK)

+    Mutex mutex;

+    Thread thread;

+#endif

+

+#ifdef MBTK_OPENCPU_SUPPORT

+    int qos;

+    char* mbtk_mqtt_server_url;

+    int mbtk_mqtt_port;

+    MQTTPacket_connectData* mbtk_mqtt_options;

+    int is_mqtts;

+    connect_event_cb_t mqtt_connect_callback;

+    int mqtt_reconn_enable;

+    int first_sub;

+    int recv_task_num;

+    #ifdef FEATURE_MQTT_TLS_ENABLE

+    mqttsClientContext* mqtts_client;

+    #endif

+#endif

+

+} MQTTClient;

+

+typedef struct

+{

+    int   cmdType;

+    char *topic;

+    int   topicLen;

+    MQTTMessage message;

+}mqttSendMsg;

+

+typedef struct

+{

+    int   cmdType;

+    int   ret;

+    char *data;

+    int   dataLen;

+}mqttDataMsg;

+enum MQTT_MSG_CMD_

+{

+    MQTT_DEMO_MSG_PUBLISH = 1, 

+    MQTT_DEMO_MSG_PUBLISH_ACK = 2, 

+    MQTT_DEMO_MSG_SUB, 

+    MQTT_DEMO_MSG_UNSUB, 

+    MQTT_DEMO_MSG_RECONNECT,

+};

+

+#define DefaultClient {0, 0, 0, 0, NULL, NULL, 0, 0, 0}

+

+#define ALI_SHA1_KEY_IOPAD_SIZE (64)

+#define ALI_SHA1_DIGEST_SIZE    (20)

+

+#define ALI_SHA256_KEY_IOPAD_SIZE   (64)

+#define ALI_SHA256_DIGEST_SIZE      (32)

+

+#define ALI_MD5_KEY_IOPAD_SIZE  (64)

+#define ALI_MD5_DIGEST_SIZE     (16)

+

+#define ALI_HMAC_USED           (1)

+#define ALI_HMAC_NOT_USED       (0)

+

+#define MQTT_DEMO_TASK_STACK_SIZE     2048

+

+#ifdef MBTK_OPENCPU_SUPPORT

+#define MQTT_RECV_DEMO_TASK_STACK_SIZE (4096 * 2)

+#endif

+

+#define MQTT_SEND_BUFF_LEN       (1024)

+#define MQTT_RECV_BUFF_LEN       (1024)

+

+#define MQTT_SERVER_URI        "183.230.40.39"

+

+#define MQTT_SERVER_PORT       (6002)

+#define MQTT_SERVER_TOPIC_0        "$dp"

+#define MQTT_SERVER_TOPIC_1        "$dp"

+#define MQTT_SERVER_TOPIC_2        "$dp"

+

+#define MQTT_MSG_TIMEOUT        1000

+

+#define MQTT_ERR_ABRT          (-13)

+#define MQTT_ERR_RST           (-14)

+#define MQTT_ERR_CLSD          (-15)

+#define MQTT_ERR_BADE          (9)

+

+#define MQTT_SEND_TIMEOUT       2000

+#define MQTT_RECV_TIMEOUT       5000

+

+/**

+ * Create an MQTT client object

+ * @param client

+ * @param network

+ * @param command_timeout_ms

+ * @param

+ */

+DLLExport void MQTTClientInit(MQTTClient* client, Network* network, unsigned int command_timeout_ms,

+        unsigned char* sendbuf, size_t sendbuf_size, unsigned char* readbuf, size_t readbuf_size);

+

+/** MQTT Connect - send an MQTT connect packet down the network and wait for a Connack

+ *  The nework object must be connected to the network endpoint before calling this

+ *  @param options - connect options

+ *  @return success code

+ */

+DLLExport int MQTTConnectWithResults(MQTTClient* client, MQTTPacket_connectData* options,

+    MQTTConnackData* data);

+

+/** MQTT Connect - send an MQTT connect packet down the network and wait for a Connack

+ *  The nework object must be connected to the network endpoint before calling this

+ *  @param options - connect options

+ *  @return success code

+ */

+DLLExport int MQTTConnect(MQTTClient* client, MQTTPacket_connectData* options);

+

+/** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs

+ *  @param client - the client object to use

+ *  @param topic - the topic to publish to

+ *  @param message - the message to send

+ *  @return success code

+ */

+DLLExport int MQTTPublish(MQTTClient* client, const char*, MQTTMessage*);

+

+/** MQTT SetMessageHandler - set or remove a per topic message handler

+ *  @param client - the client object to use

+ *  @param topicFilter - the topic filter set the message handler for

+ *  @param messageHandler - pointer to the message handler function or NULL to remove

+ *  @return success code

+ */

+DLLExport int MQTTSetMessageHandler(MQTTClient* c, const char* topicFilter, messageHandler messageHandler);

+

+/** MQTT Subscribe - send an MQTT subscribe packet and wait for suback before returning.

+ *  @param client - the client object to use

+ *  @param topicFilter - the topic filter to subscribe to

+ *  @param message - the message to send

+ *  @return success code

+ */

+DLLExport int MQTTSubscribe(MQTTClient* client, const char* topicFilter, enum QoS, messageHandler);

+

+/** MQTT Subscribe - send an MQTT subscribe packet and wait for suback before returning.

+ *  @param client - the client object to use

+ *  @param topicFilter - the topic filter to subscribe to

+ *  @param message - the message to send

+ *  @param data - suback granted QoS returned

+ *  @return success code

+ */

+DLLExport int MQTTSubscribeWithResults(MQTTClient* client, const char* topicFilter, enum QoS, messageHandler, MQTTSubackData* data);

+

+/** MQTT Subscribe - send an MQTT unsubscribe packet and wait for unsuback before returning.

+ *  @param client - the client object to use

+ *  @param topicFilter - the topic filter to unsubscribe from

+ *  @return success code

+ */

+DLLExport int MQTTUnsubscribe(MQTTClient* client, const char* topicFilter);

+

+/** MQTT Disconnect - send an MQTT disconnect packet and close the connection

+ *  @param client - the client object to use

+ *  @return success code

+ */

+DLLExport int MQTTDisconnect(MQTTClient* client);

+

+/** MQTT Yield - MQTT background

+ *  @param client - the client object to use

+ *  @param time - the time, in milliseconds, to yield for

+ *  @return success code

+ */

+DLLExport int MQTTYield(MQTTClient* client, int time);

+

+/** MQTT isConnected

+ *  @param client - the client object to use

+ *  @return truth value indicating whether the client is connected to the server

+ */

+DLLExport int MQTTIsConnected(MQTTClient* client);

+

+#if defined(MQTT_TASK)

+/** MQTT start background thread for a client.  After this, MQTTYield should not be called.

+*  @param client - the client object to use

+*  @return success code

+*/

+DLLExport int MQTTStartTask(MQTTClient* client);

+#endif

+

+int MQTTInit(MQTTClient* c, Network* n, unsigned char* sendBuf, unsigned char* readBuf);

+int MQTTCreate(MQTTClient* c, Network* n, char* clientID, char* username, char* password, char *serverAddr, int port, MQTTPacket_connectData* connData);

+

+#ifdef FEATURE_CUCC_DM_ENABLE

+int MQTTCuccCreate(MQTTClient* c, Network* n, char* clientID, char* username, char* password, char *serverAddr, int port, MQTTPacket_connectData* connData);

+int MQTTCuccConnect(MQTTClient* c, char* clientID, char* username, char* password, MQTTPacket_connectData* connData);

+int MQTTCuccPublish(MQTTClient* c, const char* topicName, MQTTMessage* message);

+int MQTTCuccSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos, messageHandler messageHandler);

+int MQTTCuccDisconnect(MQTTClient* c);

+int MQTTCuccWaitForRecv(MQTTClient* c, int packet_type, unsigned int timerOut, MQTTString *topicName, char *outPayload);

+#endif

+

+void mqtt_demo_onenet(void);

+void mqtt_demo_ali(void);

+

+void mqtt_demo_send_task(void *argument);

+void app_mqtt_demo_task(void *argument);

+int mqtt_demo_recv_task_init(void);

+int mqtt_demo_send_task_init(void);

+int app_mqtt_demo_task_init(void);

+

+

+#if defined(__cplusplus)

+     }

+#endif

+

+#endif

diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTConnect.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTConnect.h
new file mode 100755
index 0000000..189a592
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTConnect.h
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2023 IBM Corp. and others
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *    Ian Craggs - initial API and implementation and/or initial documentation
+ *    Ian Craggs - add connack return code definitions
+ *    Xiang Rong - 442039 Add makefile to Embedded C client
+ *    Ian Craggs - fix for issue #64, bit order in connack response
+ *******************************************************************************/
+
+#ifndef MQTTCONNECT_H_
+#define MQTTCONNECT_H_
+
+#include <stdint.h>
+
+enum MQTTConnackReturnCodes
+{
+    MQTTCONNACK_CONNECTION_ACCEPTED = 0,
+    MQTTCONNACK_UNNACCEPTABLE_PROTOCOL = 1,
+    MQTTCONNACK_CLIENTID_REJECTED = 2,
+    MQTTCONNACK_SERVER_UNAVAILABLE = 3,
+    MQTTCONNACK_BAD_USERNAME_OR_PASSWORD = 4,
+    MQTTCONNACK_NOT_AUTHORIZED = 5,
+};
+
+#if !defined(DLLImport)
+  #define DLLImport
+#endif
+#if !defined(DLLExport)
+  #define DLLExport
+#endif
+
+
+typedef union
+{
+	unsigned char all;	/**< all connect flags */
+#if defined(REVERSED)
+	struct
+	{
+		unsigned int username : 1;			/**< 3.1 user name */
+		unsigned int password : 1; 			/**< 3.1 password */
+		unsigned int willRetain : 1;		/**< will retain setting */
+		unsigned int willQoS : 2;				/**< will QoS value */
+		unsigned int will : 1;			    /**< will flag */
+		unsigned int cleansession : 1;	  /**< clean session flag */
+		unsigned int : 1;	  	          /**< unused */
+	} bits;
+#else
+	struct
+	{
+		unsigned int : 1;	     					/**< unused */
+		unsigned int cleansession : 1;	  /**< cleansession flag */
+		unsigned int will : 1;			    /**< will flag */
+		unsigned int willQoS : 2;				/**< will QoS value */
+		unsigned int willRetain : 1;		/**< will retain setting */
+		unsigned int password : 1; 			/**< 3.1 password */
+		unsigned int username : 1;			/**< 3.1 user name */
+	} bits;
+#endif
+} MQTTConnectFlags;	/**< connect flags byte */
+
+
+
+/**
+ * Defines the MQTT "Last Will and Testament" (LWT) settings for
+ * the connect packet.
+ */
+typedef struct
+{
+	/** The eyecatcher for this structure.  must be MQTW. */
+	char struct_id[4];
+	/** The version number of this structure.  Must be 0 */
+	int struct_version;
+	/** The LWT topic to which the LWT message will be published. */
+	MQTTString topicName;
+	/** The LWT payload. */
+	MQTTString message;
+	/**
+      * The retained flag for the LWT message (see MQTTAsync_message.retained).
+      */
+	unsigned char retained;
+	/**
+      * The quality of service setting for the LWT message (see
+      * MQTTAsync_message.qos and @ref qos).
+      */
+	char qos;
+} MQTTPacket_willOptions;
+
+
+#define MQTTPacket_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 0, {NULL, {0, NULL}}, {NULL, {0, NULL}}, 0, 0 }
+
+
+typedef struct
+{
+	/** The eyecatcher for this structure.  must be MQTC. */
+	char struct_id[4];
+	/** The version number of this structure.  Must be 0 */
+	int struct_version;
+	/** Version of MQTT to be used.  3 = 3.1 4 = 3.1.1
+	  */
+	unsigned char MQTTVersion;
+	MQTTString clientID;
+	unsigned short keepAliveInterval;
+	unsigned char cleansession;
+	unsigned char willFlag;
+	MQTTPacket_willOptions will;
+	MQTTString username;
+	MQTTString password;
+} MQTTPacket_connectData;
+
+typedef union
+{
+	unsigned char all;	/**< all connack flags */
+#if defined(REVERSED)
+	struct
+	{
+    unsigned int reserved : 7;	  	    /**< unused */
+		unsigned int sessionpresent : 1;    /**< session present flag */
+	} bits;
+#else
+	struct
+	{
+		unsigned int sessionpresent : 1;    /**< session present flag */
+    unsigned int reserved: 7;	     			/**< unused */
+	} bits;
+#endif
+} MQTTConnackFlags;	/**< connack flags byte */
+
+#define MQTTPacket_connectData_initializer { {'M', 'Q', 'T', 'C'}, 0, 4, {NULL, {0, NULL}}, 60, 1, 0, \
+		MQTTPacket_willOptions_initializer, {NULL, {0, NULL}}, {NULL, {0, NULL}} }
+
+DLLExport int MQTTSerialize_connect(unsigned char* buf, int32_t buflen, MQTTPacket_connectData* options);
+DLLExport int MQTTDeserialize_connect(MQTTPacket_connectData* data, unsigned char* buf, int32_t len);
+
+DLLExport int MQTTSerialize_connack(unsigned char* buf, int32_t buflen, unsigned char connack_rc, unsigned char sessionPresent);
+DLLExport int MQTTDeserialize_connack(unsigned char* sessionPresent, unsigned char* connack_rc, unsigned char* buf, int32_t buflen);
+
+DLLExport int MQTTSerialize_disconnect(unsigned char* buf, int32_t buflen);
+DLLExport int MQTTDeserialize_disconnect(unsigned char* buf, int32_t buflen);
+DLLExport int MQTTSerialize_pingreq(unsigned char* buf, int32_t buflen);
+
+#endif /* MQTTCONNECT_H_ */
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTFormat.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTFormat.h
new file mode 100755
index 0000000..cbae3fb
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTFormat.h
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2023 IBM Corp., Ian Craggs and others
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *    Ian Craggs - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+#if !defined(MQTTFORMAT_H)
+#define MQTTFORMAT_H
+
+#include "StackTrace.h"
+#include "MQTTPacket.h"
+
+const char* MQTTPacket_getName(unsigned short packetid);
+int MQTTStringFormat_connect(char* strbuf, int strbuflen, MQTTPacket_connectData* data);
+int MQTTStringFormat_connack(char* strbuf, int strbuflen, unsigned char connack_rc, unsigned char sessionPresent);
+int MQTTStringFormat_publish(char* strbuf, int strbuflen, unsigned char dup, int qos, unsigned char retained,
+		unsigned short packetid, MQTTString topicName, unsigned char* payload, int payloadlen);
+int MQTTStringFormat_ack(char* strbuf, int strbuflen, unsigned char packettype, unsigned char dup, unsigned short packetid);
+int MQTTStringFormat_subscribe(char* strbuf, int strbuflen, unsigned char dup, unsigned short packetid, int count,
+		MQTTString topicFilters[], unsigned char requestedQoSs[]);
+int MQTTStringFormat_suback(char* strbuf, int strbuflen, unsigned short packetid, int count, unsigned char* grantedQoSs);
+int MQTTStringFormat_unsubscribe(char* strbuf, int strbuflen, unsigned char dup, unsigned short packetid,
+		int count, MQTTString topicFilters[]);
+char* MQTTFormat_toClientString(char* strbuf, int strbuflen, unsigned char* buf, int32_t buflen);
+char* MQTTFormat_toServerString(char* strbuf, int strbuflen, unsigned char* buf, int32_t buflen);
+
+#endif
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTLinux.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTLinux.h
new file mode 100755
index 0000000..749cd37
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTLinux.h
@@ -0,0 +1,83 @@
+/*******************************************************************************

+ * Copyright (c) 2014 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation

+ *******************************************************************************/

+

+#if !defined(__MQTT_LINUX_)

+#define __MQTT_LINUX_

+

+#if defined(WIN32_DLL) || defined(WIN64_DLL)

+  #define DLLImport __declspec(dllimport)

+  #define DLLExport __declspec(dllexport)

+#elif defined(LINUX_SO)

+  #define DLLImport extern

+  #define DLLExport  __attribute__ ((visibility ("default")))

+#else

+  #define DLLImport

+  #define DLLExport

+#endif

+

+#include <sys/types.h>

+#include <sys/socket.h>

+#include <sys/param.h>

+#include <sys/time.h>

+#include <sys/select.h>

+#include <netinet/in.h>

+#include <netinet/tcp.h>

+#include <arpa/inet.h>

+#include <netdb.h>

+#include <stdio.h>

+#include <unistd.h>

+#include <errno.h>

+#include <fcntl.h>

+

+

+#include <openssl/ssl.h>

+#include <openssl/err.h>

+#include <openssl/evp.h>

+#include <stdlib.h>

+#include <string.h>

+#include <signal.h>

+

+typedef struct Timer

+{

+	struct timeval end_time;

+} Timer;

+

+void TimerInit(Timer*);

+char TimerIsExpired(Timer*);

+void TimerCountdownMS(Timer*, unsigned int);

+void TimerCountdown(Timer*, unsigned int);

+int TimerLeftMS(Timer*);

+

+typedef struct Network

+{

+	int my_socket;

+	int (*mqttread) (struct Network*, unsigned char*, int, int);

+	int (*mqttwrite) (struct Network*, unsigned char*, int, int);

+  SSL *ssl;

+  int useSSL;

+} Network;

+

+int linux_read(Network*, unsigned char*, int, int);

+int linux_write(Network*, unsigned char*, int, int);

+

+DLLExport void NetworkInit(Network*);

+DLLExport int NetworkConnect(Network*, char*, int);

+DLLExport int NetworkConnectBySSL(Network*, const char*, int, const char*);

+DLLExport int NetworkConnectNotSSL(Network*, const char*, const char*);

+DLLExport void NetworkDisconnect(Network*);

+DLLExport void ShowCerts(SSL *);

+

+#endif

diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTPacket.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTPacket.h
new file mode 100755
index 0000000..6a55f3f
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTPacket.h
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2023 IBM Corp., Ian Craggs and others
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *    Ian Craggs - initial API and implementation and/or initial documentation
+ *    Xiang Rong - 442039 Add makefile to Embedded C client
+ *******************************************************************************/
+
+#ifndef MQTTPACKET_H_
+#define MQTTPACKET_H_
+
+#include <stdint.h>
+
+#if defined(__cplusplus) /* If this is a C++ compiler, use C linkage */
+extern "C" {
+#endif
+
+#if defined(WIN32_DLL) || defined(WIN64_DLL)
+  #define DLLImport __declspec(dllimport)
+  #define DLLExport __declspec(dllexport)
+#elif defined(LINUX_SO)
+  #define DLLImport extern
+  #define DLLExport  __attribute__ ((visibility ("default")))
+#else
+  #define DLLImport
+  #define DLLExport
+#endif
+
+enum errors
+{
+	MQTTPACKET_BUFFER_TOO_SHORT = -2,
+	MQTTPACKET_READ_ERROR = -1,
+	MQTTPACKET_READ_COMPLETE
+};
+
+enum msgTypes
+{
+	CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL,
+	PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK,
+	PINGREQ, PINGRESP, DISCONNECT
+#if defined(MQTTV5)
+  , AUTH
+#endif
+};
+
+/**
+ * Bitfields for the MQTT header byte.
+ */
+typedef union
+{
+	unsigned char byte;	                /**< the whole byte */
+#if defined(REVERSED)
+	struct
+	{
+		unsigned int type : 4;			/**< message type nibble */
+		unsigned int dup : 1;				/**< DUP flag bit */
+		unsigned int qos : 2;				/**< QoS value, 0, 1 or 2 */
+		unsigned int retain : 1;		/**< retained flag bit */
+	} bits;
+#else
+	struct
+	{
+		unsigned int retain : 1;		/**< retained flag bit */
+		unsigned int qos : 2;				/**< QoS value, 0, 1 or 2 */
+		unsigned int dup : 1;				/**< DUP flag bit */
+		unsigned int type : 4;			/**< message type nibble */
+	} bits;
+#endif
+} MQTTHeader;
+
+typedef struct
+{
+	int32_t len;
+	char* data;
+} MQTTLenString;
+
+typedef struct
+{
+	char* cstring;
+	MQTTLenString lenstring;
+} MQTTString;
+
+#define MQTTString_initializer {NULL, {0, NULL}}
+
+int MQTTstrlen(MQTTString mqttstring);
+
+#include "MQTTConnect.h"
+#include "MQTTPublish.h"
+#include "MQTTSubscribe.h"
+#include "MQTTUnsubscribe.h"
+#include "MQTTFormat.h"
+
+DLLExport int32_t MQTTSerialize_ack(unsigned char* buf, int32_t buflen, unsigned char type, unsigned char dup, unsigned short packetid);
+DLLExport int32_t MQTTDeserialize_ack(unsigned char* packettype, unsigned char* dup, unsigned short* packetid, unsigned char* buf, int32_t buflen);
+
+int32_t MQTTPacket_VBIlen(int32_t rem_len);
+int32_t MQTTPacket_len(int32_t rem_len);
+DLLExport int MQTTPacket_equals(MQTTString* a, char* b);
+
+DLLExport int32_t MQTTPacket_encode(unsigned char* buf, int32_t length);
+int32_t MQTTPacket_decode(int (*getcharfn)(unsigned char*, int), int32_t* value);
+int32_t MQTTPacket_decodeBuf(unsigned char* buf, int32_t* value);
+
+int readInt(unsigned char** pptr);
+char readChar(unsigned char** pptr);
+void writeChar(unsigned char** pptr, char c);
+void writeInt(unsigned char** pptr, int anInt);
+int readMQTTLenString(MQTTString* mqttstring, unsigned char** pptr, unsigned char* enddata);
+void writeCString(unsigned char** pptr, const char* string);
+void writeMQTTString(unsigned char** pptr, MQTTString mqttstring);
+
+DLLExport int MQTTPacket_read(unsigned char* buf, int32_t buflen, int (*getfn)(unsigned char*, int));
+
+typedef struct {
+	int (*getfn)(void *, unsigned char*, int); /* must return -1 for error, 0 for call again, or the number of bytes read */
+	void *sck;	/* pointer to whatever the system may use to identify the transport */
+	int multiplier;
+	int rem_len;
+	int32_t len;
+	char state;
+}MQTTTransport;
+
+int MQTTPacket_readnb(unsigned char* buf, int32_t buflen, MQTTTransport *trp);
+
+#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
+}
+#endif
+
+
+#endif /* MQTTPACKET_H_ */
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTPublish.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTPublish.h
new file mode 100755
index 0000000..afd1c42
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTPublish.h
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2023 IBM Corp., Ian Craggs and others
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *    Ian Craggs - initial API and implementation and/or initial documentation
+ *    Xiang Rong - 442039 Add makefile to Embedded C client
+ *******************************************************************************/
+
+#ifndef MQTTPUBLISH_H_
+#define MQTTPUBLISH_H_
+
+#if !defined(DLLImport)
+  #define DLLImport
+#endif
+#if !defined(DLLExport)
+  #define DLLExport
+#endif
+
+DLLExport int32_t MQTTSerialize_publish(unsigned char* buf, int32_t buflen, unsigned char dup, unsigned char qos, unsigned char retained, unsigned short packetid,
+		MQTTString topicName, unsigned char* payload, int32_t payloadlen);
+
+DLLExport int32_t MQTTDeserialize_publish(unsigned char* dup, unsigned char* qos, unsigned char* retained, unsigned short* packetid, MQTTString* topicName,
+		unsigned char** payload, int32_t* payloadlen, unsigned char* buf, int32_t len);
+
+DLLExport int32_t MQTTSerialize_puback(unsigned char* buf, int32_t buflen, unsigned short packetid);
+DLLExport int32_t MQTTSerialize_pubrel(unsigned char* buf, int32_t buflen, unsigned char dup, unsigned short packetid);
+DLLExport int32_t MQTTSerialize_pubcomp(unsigned char* buf, int32_t buflen, unsigned short packetid);
+
+#endif /* MQTTPUBLISH_H_ */
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTSubscribe.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTSubscribe.h
new file mode 100755
index 0000000..18f53cf
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTSubscribe.h
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2014 IBM Corp.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *    Ian Craggs - initial API and implementation and/or initial documentation
+ *    Xiang Rong - 442039 Add makefile to Embedded C client
+ *******************************************************************************/
+
+#ifndef MQTTSUBSCRIBE_H_
+#define MQTTSUBSCRIBE_H_
+
+#if !defined(DLLImport)
+  #define DLLImport
+#endif
+#if !defined(DLLExport)
+  #define DLLExport
+#endif
+
+DLLExport int32_t MQTTSerialize_subscribe(unsigned char* buf, int32_t buflen, unsigned char dup, unsigned short packetid,
+		int count, MQTTString topicFilters[], unsigned char requestedQoSs[]);
+
+DLLExport int32_t MQTTDeserialize_subscribe(unsigned char* dup, unsigned short* packetid,
+		int maxcount, int* count, MQTTString topicFilters[], unsigned char requestedQoSs[], unsigned char* buf, int32_t len);
+
+DLLExport int32_t MQTTSerialize_suback(unsigned char* buf, int32_t buflen, unsigned short packetid, int count, unsigned char* grantedQoSs);
+
+DLLExport int32_t MQTTDeserialize_suback(unsigned short* packetid, int maxcount, int* count, unsigned char grantedQoSs[], unsigned char* buf, int32_t len);
+
+
+#endif /* MQTTSUBSCRIBE_H_ */
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTTls.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTTls.h
new file mode 100755
index 0000000..65d1538
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTTls.h
@@ -0,0 +1,71 @@
+

+#ifndef MQTT_DTLS_H

+#define MQTT_DTLS_H

+

+

+#include "mbedtls/net.h"

+#include "mbedtls/ssl.h"

+#include "mbedtls/certs.h"

+#include "mbedtls/entropy.h"

+#include "mbedtls/ctr_drbg.h"

+

+

+

+

+#define MQTT_MAX_TIMEOUT  (10 * 60)  //10 min

+

+

+typedef struct mqttsClientSslTag

+{

+    mbedtls_ssl_context       sslContext;

+    mbedtls_net_context       netContext;

+    mbedtls_ssl_config        sslConfig;

+    mbedtls_entropy_context   entropyContext;

+    mbedtls_ctr_drbg_context  ctrDrbgContext;

+    mbedtls_x509_crt_profile  crtProfile;

+    mbedtls_x509_crt          caCert;

+    mbedtls_x509_crt          clientCert;

+    mbedtls_pk_context        pkContext;

+}mqttsClientSsl;

+

+typedef struct mqttsClientContextTag

+{

+    int socket;

+    int timeout_s;

+    int timeout_r;

+    int isMqtts;

+    int method;

+    uint16_t port;

+    unsigned int keepAliveInterval;

+    size_t sendBufSize;

+    size_t readBufSize;

+    unsigned char *sendBuf;

+    unsigned char *readBuf;

+    

+    mqttsClientSsl * ssl;

+    char *caCert;

+    char *clientCert;

+    char *clientPk;

+    char *hostName;

+    char *psk_key;

+    char *psk_identity;

+    int caCertLen;

+    int clientCertLen;

+    int clientPkLen;

+    uint8_t seclevel;//0:no verify; 1:verify server; 2:both verify

+    int32_t ciphersuite[2];//just like 0x0035 TLS_RSA_WITH_AES_256_CBC_SHA,ciphersuite[1] must NULL

+    uint8_t pdpId;//pdp context id--cid--0 is default

+

+}mqttsClientContext;

+

+

+

+int mqttSslConn_old(mqttsClientContext* context, char* host);

+int mqttSslSend(mqttsClientContext* context, unsigned char* buf, int len);

+int mqttSslRecv(mqttsClientContext* context, unsigned char* buf, int minLen, int maxLen, int* pReadLen);

+int mqttSslRead(mqttsClientContext* context, unsigned char *buffer, int len, int timeout_ms);

+int mqttSslClose(mqttsClientContext* context);

+int mqttSslConn_new(mqttsClientContext* context, char* host);

+

+#endif

+

diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTUnsubscribe.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTUnsubscribe.h
new file mode 100755
index 0000000..866da98
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/MQTTUnsubscribe.h
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2023 IBM Corp., Ian Craggs and others
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *    Ian Craggs - initial API and implementation and/or initial documentation
+ *    Xiang Rong - 442039 Add makefile to Embedded C client
+ *******************************************************************************/
+
+#ifndef MQTTUNSUBSCRIBE_H_
+#define MQTTUNSUBSCRIBE_H_
+
+#if !defined(DLLImport)
+  #define DLLImport
+#endif
+#if !defined(DLLExport)
+  #define DLLExport
+#endif
+
+DLLExport int32_t MQTTSerialize_unsubscribe(unsigned char* buf, int32_t buflen, unsigned char dup, unsigned short packetid,
+		int count, MQTTString topicFilters[]);
+
+DLLExport int32_t MQTTDeserialize_unsubscribe(unsigned char* dup, unsigned short* packetid, int max_count, int* count, MQTTString topicFilters[],
+		unsigned char* buf, int32_t len);
+
+DLLExport int32_t MQTTSerialize_unsuback(unsigned char* buf, int32_t buflen, unsigned short packetid);
+
+DLLExport int32_t MQTTDeserialize_unsuback(unsigned short* packetid, unsigned char* buf, int32_t len);
+
+#endif /* MQTTUNSUBSCRIBE_H_ */
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/StackTrace.h b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/StackTrace.h
new file mode 100755
index 0000000..2808a0d
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/include/StackTrace.h
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2014 IBM Corp.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *    Ian Craggs - initial API and implementation and/or initial documentation
+ *    Ian Craggs - fix for bug #434081
+ *******************************************************************************/
+
+#ifndef STACKTRACE_H_
+#define STACKTRACE_H_
+
+#include <stdio.h>
+#define NOSTACKTRACE 1
+
+#if defined(NOSTACKTRACE)
+#define FUNC_ENTRY
+#define FUNC_ENTRY_NOLOG
+#define FUNC_ENTRY_MED
+#define FUNC_ENTRY_MAX
+#define FUNC_EXIT
+#define FUNC_EXIT_NOLOG
+#define FUNC_EXIT_MED
+#define FUNC_EXIT_MAX
+#define FUNC_EXIT_RC(x)
+#define FUNC_EXIT_MED_RC(x)
+#define FUNC_EXIT_MAX_RC(x)
+
+#else
+
+#if defined(WIN32)
+#define inline __inline
+#define FUNC_ENTRY StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MINIMUM)
+#define FUNC_ENTRY_NOLOG StackTrace_entry(__FUNCTION__, __LINE__, -1)
+#define FUNC_ENTRY_MED StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MEDIUM)
+#define FUNC_ENTRY_MAX StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MAXIMUM)
+#define FUNC_EXIT StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MINIMUM)
+#define FUNC_EXIT_NOLOG StackTrace_exit(__FUNCTION__, __LINE__, -1)
+#define FUNC_EXIT_MED StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MEDIUM)
+#define FUNC_EXIT_MAX StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MAXIMUM)
+#define FUNC_EXIT_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MINIMUM)
+#define FUNC_EXIT_MED_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MEDIUM)
+#define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MAXIMUM)
+#else
+#define FUNC_ENTRY StackTrace_entry(__func__, __LINE__, TRACE_MINIMUM)
+#define FUNC_ENTRY_NOLOG StackTrace_entry(__func__, __LINE__, -1)
+#define FUNC_ENTRY_MED StackTrace_entry(__func__, __LINE__, TRACE_MEDIUM)
+#define FUNC_ENTRY_MAX StackTrace_entry(__func__, __LINE__, TRACE_MAXIMUM)
+#define FUNC_EXIT StackTrace_exit(__func__, __LINE__, NULL, TRACE_MINIMUM)
+#define FUNC_EXIT_NOLOG StackTrace_exit(__func__, __LINE__, NULL, -1)
+#define FUNC_EXIT_MED StackTrace_exit(__func__, __LINE__, NULL, TRACE_MEDIUM)
+#define FUNC_EXIT_MAX StackTrace_exit(__func__, __LINE__, NULL, TRACE_MAXIMUM)
+#define FUNC_EXIT_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MINIMUM)
+#define FUNC_EXIT_MED_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MEDIUM)
+#define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MAXIMUM)
+
+void StackTrace_entry(const char* name, int line, int trace);
+void StackTrace_exit(const char* name, int line, void* return_value, int trace);
+
+void StackTrace_printStack(FILE* dest);
+char* StackTrace_get(unsigned long);
+
+#endif
+
+#endif
+
+
+
+
+#endif /* STACKTRACE_H_ */
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so
new file mode 120000
index 0000000..ef0786f
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so
@@ -0,0 +1 @@
+libpaho-embed-mqtt3c.so.1
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so.1 b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so.1
new file mode 120000
index 0000000..b1804cc
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so.1
@@ -0,0 +1 @@
+libpaho-embed-mqtt3c.so.1.0
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so.1.0 b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so.1.0
new file mode 100755
index 0000000..fb6d5d5
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/lib/libpaho-embed-mqtt3c.so.1.0
Binary files differ
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/*.o b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/*.o
new file mode 100755
index 0000000..a08962c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/*.o
Binary files differ
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTClient.c b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTClient.c
new file mode 100755
index 0000000..39f6a8e
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTClient.c
@@ -0,0 +1,2352 @@
+/*******************************************************************************

+ * Copyright (c) 2014, 2017 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *   Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation

+ *   Ian Craggs - fix for #96 - check rem_len in readPacket

+ *   Ian Craggs - add ability to set message handler separately #6

+ *******************************************************************************/

+ 

+#include <stdio.h>

+#include <stdarg.h>

+//#include "commontypedef.h"

+#include "MQTTClient.h"

+#ifdef FEATURE_MQTT_TLS_ENABLE

+#include "sha1.h"

+#include "sha256.h"

+#include "md5.h"

+#endif

+//#include "debug_trace.h"

+//#include DEBUG_LOG_HEADER_FILE

+

+char *mqttSendbuf = NULL;

+char *mqttReadbuf = NULL;

+

+unsigned char mqttJsonbuff[256] = {0};

+char mqtt_payload[128] = {0};

+int ec_sensor_temp = 20;

+char ec_data_type = 3;

+int ec_data_len = 0;

+//osMessageQueueId_t mqttRecvMsgHandle = NULL;

+//osMessageQueueId_t mqttSendMsgHandle = NULL;

+//osMessageQueueId_t appMqttMsgHandle = NULL;

+

+///osThreadId_t mqttRecvTaskHandle = NULL;

+

+#ifdef MBTK_OPENCPU_SUPPORT

+#define MAX_RECV_TASK 5

+osThreadId_t mbtk_mqttRecvTaskHandle[MAX_RECV_TASK];

+Mutex mbtk_mqttMutex1[MAX_RECV_TASK];

+#endif

+

+//osThreadId_t mqttSendTaskHandle = NULL;

+//osThreadId_t appMqttTaskHandle = NULL;

+

+//Mutex mqttMutex1;

+//Mutex mqttMutex2;

+MQTTClient mqttClient;

+Network mqttNetwork;

+int mqtt_send_task_status_flag = 0;

+int mqtt_keepalive_retry_count = 0;

+char mqttHb2Hex(unsigned char hb)

+{

+    hb = hb&0xF;

+    return (char)(hb<10 ? '0'+hb : hb-10+'a');

+}

+

+#ifdef FEATURE_MQTT_TLS_ENABLE

+void mqttAliHmacSha1(const unsigned char *input, int ilen, unsigned char *output,const unsigned char *key, int keylen)

+{

+    int i;

+    mbedtls_sha1_context ctx;

+    unsigned char k_ipad[ALI_SHA1_KEY_IOPAD_SIZE] = {0};

+    unsigned char k_opad[ALI_SHA1_KEY_IOPAD_SIZE] = {0};

+    unsigned char tempbuf[ALI_SHA1_DIGEST_SIZE];

+

+    memset(k_ipad, 0x36, ALI_SHA1_KEY_IOPAD_SIZE);

+    memset(k_opad, 0x5C, ALI_SHA1_KEY_IOPAD_SIZE);

+

+    for(i=0; i<keylen; i++)

+    {

+        if(i>=ALI_SHA1_KEY_IOPAD_SIZE)

+        {

+            break;

+        }

+        k_ipad[i] ^=key[i];

+        k_opad[i] ^=key[i];

+    }

+    mbedtls_sha1_init(&ctx);

+

+    mbedtls_sha1_starts(&ctx);

+    mbedtls_sha1_update(&ctx, k_ipad, ALI_SHA1_KEY_IOPAD_SIZE);

+    mbedtls_sha1_update(&ctx, input, ilen);

+    mbedtls_sha1_finish(&ctx, tempbuf);

+

+    mbedtls_sha1_starts(&ctx);

+    mbedtls_sha1_update(&ctx, k_opad, ALI_SHA1_KEY_IOPAD_SIZE);

+    mbedtls_sha1_update(&ctx, tempbuf, ALI_SHA1_DIGEST_SIZE);

+    mbedtls_sha1_finish(&ctx, tempbuf);

+

+    for(i=0; i<ALI_SHA1_DIGEST_SIZE; ++i)

+    {

+        output[i*2] = mqttHb2Hex(tempbuf[i]>>4);

+        output[i*2+1] = mqttHb2Hex(tempbuf[i]);

+    }

+    mbedtls_sha1_free(&ctx);

+}

+/*

+ * output = SHA-256( input buffer )

+ */

+void mqttAliHmacSha256(const unsigned char *input, int ilen, unsigned char *output,const unsigned char *key, int keylen)

+{

+    int i;

+    mbedtls_sha256_context ctx;

+    unsigned char k_ipad[ALI_SHA256_KEY_IOPAD_SIZE] = {0};

+    unsigned char k_opad[ALI_SHA256_KEY_IOPAD_SIZE] = {0};

+

+    memset(k_ipad, 0x36, 64);

+    memset(k_opad, 0x5C, 64);

+

+    if ((NULL == input) || (NULL == key) || (NULL == output)) {

+        return;

+    }

+

+    if (keylen > ALI_SHA256_KEY_IOPAD_SIZE) {

+        return;

+    }

+

+    for(i=0; i<keylen; i++)

+    {

+        if(i>=ALI_SHA256_KEY_IOPAD_SIZE)

+        {

+            break;

+        }

+        k_ipad[i] ^=key[i];

+        k_opad[i] ^=key[i];

+    }

+    mbedtls_sha256_init(&ctx);

+

+    mbedtls_sha256_starts(&ctx, 0);

+    mbedtls_sha256_update(&ctx, k_ipad, ALI_SHA256_KEY_IOPAD_SIZE);

+    mbedtls_sha256_update(&ctx, input, ilen);

+    mbedtls_sha256_finish(&ctx, output);

+

+    mbedtls_sha256_starts(&ctx, 0);

+    mbedtls_sha256_update(&ctx, k_opad, ALI_SHA256_KEY_IOPAD_SIZE);

+    mbedtls_sha256_update(&ctx, output, ALI_SHA256_DIGEST_SIZE);

+    mbedtls_sha256_finish(&ctx, output);

+

+    mbedtls_sha256_free(&ctx);

+}

+/*

+ * output = MD-5( input buffer )

+ */

+void mqttAliHmacMd5(const unsigned char *input, int ilen, unsigned char *output,const unsigned char *key, int keylen)

+{

+    int i;

+    mbedtls_md5_context ctx;

+    unsigned char k_ipad[ALI_MD5_KEY_IOPAD_SIZE] = {0};

+    unsigned char k_opad[ALI_MD5_KEY_IOPAD_SIZE] = {0};

+    unsigned char tempbuf[ALI_MD5_DIGEST_SIZE];

+

+    memset(k_ipad, 0x36, ALI_MD5_KEY_IOPAD_SIZE);

+    memset(k_opad, 0x5C, ALI_MD5_KEY_IOPAD_SIZE);

+

+    for(i=0; i<keylen; i++)

+    {

+        if(i>=ALI_MD5_KEY_IOPAD_SIZE)

+        {

+            break;

+        }

+        k_ipad[i] ^=key[i];

+        k_opad[i] ^=key[i];

+    }

+    mbedtls_md5_init(&ctx);

+

+    mbedtls_md5_starts(&ctx);

+    mbedtls_md5_update(&ctx, k_ipad, ALI_MD5_KEY_IOPAD_SIZE);

+    mbedtls_md5_update(&ctx, input, ilen);

+    mbedtls_md5_finish(&ctx, tempbuf);

+

+    mbedtls_md5_starts(&ctx);

+    mbedtls_md5_update(&ctx, k_opad, ALI_MD5_KEY_IOPAD_SIZE);

+    mbedtls_md5_update(&ctx, tempbuf, ALI_MD5_DIGEST_SIZE);

+    mbedtls_md5_finish(&ctx, tempbuf);

+

+    for(i=0; i<ALI_MD5_DIGEST_SIZE; ++i)

+    {

+        output[i*2] = mqttHb2Hex(tempbuf[i]>>4);

+        output[i*2+1] = mqttHb2Hex(tempbuf[i]);

+    }

+    mbedtls_md5_free(&ctx);

+}

+#endif

+void mqttDefMessageArrived(MessageData* data)

+{

+    char *bufTemp = NULL;

+    bufTemp = malloc(data->message->payloadlen+1);

+    memset(bufTemp, 0, data->message->payloadlen+1);

+    memcpy(bufTemp, data->message->payload, data->message->payloadlen);

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttRecvTask_2, P_SIG, ".........MQTT topic is:%s", (const uint8_t *)data->topicName->lenstring.data);

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttRecvTask_1, P_SIG, ".........MQTT_messageArrived is:%s", (const uint8_t *)bufTemp);

+    free(bufTemp);

+}

+

+static void NewMessageData(MessageData* md, MQTTString* aTopicName, MQTTMessage* aMessage) {

+    md->topicName = aTopicName;

+    md->message = aMessage;

+}

+

+

+static int getNextPacketId(MQTTClient *c) {

+    return c->next_packetid = (c->next_packetid == MAX_PACKET_ID) ? 1 : c->next_packetid + 1;

+}

+

+static int sendPacket(MQTTClient* c, int length, Timer* timer)

+{

+    int rc = FAILURE,

+        sent = 0;

+

+#ifdef FEATURE_MQTT_TLS_ENABLE

+#ifdef MBTK_OPENCPU_SUPPORT

+    if(c->is_mqtts == MBTK_MQTT_SSL_HAVE)

+    {

+        ECOMM_TRACE(UNILOG_MQTT, mqtt_task_tls3, P_INFO, 0, "...mqttSendPacket..0.");

+        rc = mqttSslSend(c->mqtts_client, &c->mqtts_client->sendBuf[sent], length);

+        ECOMM_TRACE(UNILOG_MQTT, mqtt_task_tls4, P_INFO, 1, "...mqttSendPacket..=%d.", rc);

+        TimerCountdown(&c->last_sent, c->keepAliveInterval); // record the fact that we have successfully sent the packet

+        return rc;

+    }

+    else

+#endif

+#endif

+    {

+

+    while (sent < length && !TimerIsExpired(timer))

+    {

+        #ifdef MQTT_RAI_OPTIMIZE

+        rc = c->ipstack->mqttwrite(c->ipstack, &c->buf[sent], length, TimerLeftMS(timer), 0, false);

+        #else

+        rc = c->ipstack->mqttwrite(c->ipstack, &c->buf[sent], length, TimerLeftMS(timer));

+        #endif

+        if (rc < 0)  // there was an error writing the data

+            break;

+        sent += rc;

+    }

+    if (sent == length)

+    {

+        TimerCountdown(&c->last_sent, c->keepAliveInterval); // record the fact that we have successfully sent the packet

+        rc = SUCCESS;

+    }

+    else

+        rc = FAILURE;

+    return rc;

+

+    }

+}

+

+void MQTTClientInit(MQTTClient* c, Network* network, unsigned int command_timeout_ms,

+        unsigned char* sendbuf, size_t sendbuf_size, unsigned char* readbuf, size_t readbuf_size)

+{

+    int i;

+    c->ipstack = network;

+

+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)

+        c->messageHandlers[i].topicFilter = 0;

+    c->command_timeout_ms = command_timeout_ms;

+    c->buf = sendbuf;

+    c->buf_size = sendbuf_size;

+    c->readbuf = readbuf;

+    c->readbuf_size = readbuf_size;

+    c->isconnected = 0;

+    c->cleansession = 0;

+    c->ping_outstanding = 0;

+    c->defaultMessageHandler = mqttDefMessageArrived;

+      c->next_packetid = 1;

+    TimerInit(&c->last_sent);

+    TimerInit(&c->last_received);

+	

+#ifdef FEATURE_MQTT_TLS_ENABLE

+#ifdef MBTK_OPENCPU_SUPPORT

+    c->recv_task_num = -1;

+    if(c->is_mqtts == MBTK_MQTT_SSL_HAVE)

+    {

+        c->mqtts_client->sendBuf = sendbuf;

+        c->mqtts_client->sendBufSize = sendbuf_size;

+        c->mqtts_client->readBuf = readbuf;

+        c->mqtts_client->readBufSize = readbuf_size;

+    }

+#endif

+#endif

+

+#if defined(MQTT_TASK)

+      MutexInit(&c->mutex);

+#endif

+}

+

+static int decodePacket(MQTTClient* c, int* value, int timeout)

+{

+    unsigned char i;

+    int multiplier = 1;

+    int len = 0;

+    const int MAX_NO_OF_REMAINING_LENGTH_BYTES = 4;

+

+    *value = 0;

+    do

+    {

+        int rc = MQTTPACKET_READ_ERROR;

+

+        if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES)

+        {

+            rc = MQTTPACKET_READ_ERROR; /* bad data */

+            goto exit;

+        }

+        

+#ifdef FEATURE_MQTT_TLS_ENABLE

+        #ifdef MBTK_OPENCPU_SUPPORT

+        if(c->is_mqtts == MBTK_MQTT_SSL_HAVE)

+        {

+            rc = mqttSslRead(c->mqtts_client, &i, 1, timeout);

+        }

+        else

+        {

+            rc = c->ipstack->mqttread(c->ipstack, &i, 1, timeout);

+        }

+        #endif

+#else

+        rc = c->ipstack->mqttread(c->ipstack, &i, 1, timeout);

+#endif

+

+        if (rc != 1)

+            goto exit;

+        *value += (i & 127) * multiplier;

+        multiplier *= 128;

+    } while ((i & 128) != 0);

+exit:

+    return len;

+}

+

+static int readPacket(MQTTClient* c, Timer* timer)

+{

+    MQTTHeader header = {0};

+    int len = 0;

+    int rem_len = 0;

+    int rc = 0;

+

+#ifdef FEATURE_MQTT_TLS_ENABLE

+#ifdef MBTK_OPENCPU_SUPPORT

+    if(c->is_mqtts == MBTK_MQTT_SSL_HAVE)

+    {

+        ECOMM_TRACE(UNILOG_MQTT, mqtt_task_tls0, P_INFO, 0, "...mqttReadPacket..0.");

+        /* 1. read the header byte.  This has the packet type in it */

+        rc = mqttSslRead(c->mqtts_client, c->mqtts_client->readBuf, 1, TimerLeftMS(timer));

+        if (rc != 1)

+        {

+            goto exit;

+        }

+

+        len = 1;

+        ECOMM_TRACE(UNILOG_MQTT, mqtt_task_tls1, P_INFO, 0, "...mqttReadPacket..1.");

+        /* 2. read the remaining length.  This is variable in itself */

+        decodePacket(c, &rem_len, TimerLeftMS(timer));

+        len += MQTTPacket_encode(c->mqtts_client->readBuf + 1, rem_len); /* put the original remaining length back into the buffer */

+

+        if (rem_len > (c->mqtts_client->readBufSize - len))

+        {

+            ECOMM_TRACE(UNILOG_MQTT, mqtt_task_tls202, P_INFO, 0, "...mqttReadPacket..202.");

+            rc = BUFFER_OVERFLOW;

+            goto exit;

+        }

+

+        ECOMM_TRACE(UNILOG_MQTT, mqtt_task_tls2, P_INFO, 0, "...mqttReadPacket..2.");

+        /* 3. read the rest of the buffer using a callback to supply the rest of the data */

+        if (rem_len > 0 && (mqttSslRead(c->mqtts_client, c->mqtts_client->readBuf + len, rem_len, TimerLeftMS(timer)) != rem_len))

+        {

+            rc = 0;

+            ECOMM_TRACE(UNILOG_MQTT, mqtt_task_tls200, P_INFO, 0, "...mqttReadPacket..200.");

+            goto exit;

+        }

+

+        header.byte = c->mqtts_client->readBuf[0];

+        rc = header.bits.type;

+        if (c->keepAliveInterval > 0)

+        {

+            ECOMM_TRACE(UNILOG_MQTT, mqtt_task_tls201, P_INFO, 0, "...mqttReadPacket..201.");

+            TimerCountdown(&c->last_received, c->keepAliveInterval); // record the fact that we have successfully received a packet

+        }

+    }

+    else

+#endif

+#endif

+    {

+

+    /* 1. read the header byte.  This has the packet type in it */

+    rc = c->ipstack->mqttread(c->ipstack, c->readbuf, 1, TimerLeftMS(timer));

+    if (rc != 1)

+        goto exit;

+

+    len = 1;

+    /* 2. read the remaining length.  This is variable in itself */

+    decodePacket(c, &rem_len, TimerLeftMS(timer));

+    len += MQTTPacket_encode(c->readbuf + 1, rem_len); /* put the original remaining length back into the buffer */

+

+    if (rem_len > (c->readbuf_size - len))

+    {

+        rc = BUFFER_OVERFLOW;

+        goto exit;

+    }

+

+    /* 3. read the rest of the buffer using a callback to supply the rest of the data */

+    if (rem_len > 0 && (c->ipstack->mqttread(c->ipstack, c->readbuf + len, rem_len, TimerLeftMS(timer)) != rem_len)) {

+        rc = 0;

+        goto exit;

+    }

+

+    header.byte = c->readbuf[0];

+    rc = header.bits.type;

+    if (c->keepAliveInterval > 0)

+        TimerCountdown(&c->last_received, c->keepAliveInterval); // record the fact that we have successfully received a packet

+

+    }

+

+exit:

+    return rc;

+}

+

+// assume topic filter and name is in correct format

+// # can only be at end

+// + and # can only be next to separator

+static char isTopicMatched(char* topicFilter, MQTTString* topicName)

+{

+    char* curf = topicFilter;

+    char* curn = topicName->lenstring.data;

+    char* curn_end = curn + topicName->lenstring.len;

+

+    while (*curf && curn < curn_end)

+    {

+        if (*curn == '/' && *curf != '/')

+            break;

+        if (*curf != '+' && *curf != '#' && *curf != *curn)

+            break;

+        if (*curf == '+')

+        {   // skip until we meet the next separator, or end of string

+            char* nextpos = curn + 1;

+            while (nextpos < curn_end && *nextpos != '/')

+                nextpos = ++curn + 1;

+        }

+        else if (*curf == '#')

+            curn = curn_end - 1;    // skip until end of string

+        curf++;

+        curn++;

+    };

+

+    return (curn == curn_end) && (*curf == '\0');

+}

+

+int deliverMessage(MQTTClient* c, MQTTString* topicName, MQTTMessage* message)

+{

+    int i;

+    int rc = FAILURE;

+    //ECOMM_TRACE(UNILOG_MQTT, deliverMessage1, P_SIG, 0, "....1....deliverMessage..");

+

+    // we have to find the right message handler - indexed by topic

+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)

+    {

+        if (c->messageHandlers[i].topicFilter != 0 && (MQTTPacket_equals(topicName, (char*)c->messageHandlers[i].topicFilter) ||

+                isTopicMatched((char*)c->messageHandlers[i].topicFilter, topicName)))

+        {

+            if (c->messageHandlers[i].fp != NULL)

+            {

+                MessageData md;

+                NewMessageData(&md, topicName, message);

+                c->messageHandlers[i].fp(&md);

+                rc = SUCCESS;

+                //ECOMM_TRACE(UNILOG_MQTT, deliverMessage2, P_SIG, 0, "....2....deliverMessage..");

+            }

+        }

+    }

+

+    if (rc == FAILURE && c->defaultMessageHandler != NULL)

+    {

+        MessageData md;

+        //ECOMM_TRACE(UNILOG_MQTT, deliverMessage3, P_SIG, 0, "....3....deliverMessage..");

+        NewMessageData(&md, topicName, message);

+        c->defaultMessageHandler(&md);

+        rc = SUCCESS;

+        //ECOMM_TRACE(UNILOG_MQTT, deliverMessage4, P_SIG, 0, "....4....deliverMessage..");

+    }

+

+    return rc;

+}

+

+int keepalive(MQTTClient* c)

+{

+    int rc = SUCCESS;

+

+    if (c->keepAliveInterval == 0)

+    {

+        goto exit;

+    }

+

+    if (TimerIsExpired(&c->last_sent) || TimerIsExpired(&c->last_received))

+    {

+        if (c->ping_outstanding)

+        {

+            mqtt_keepalive_retry_count++;

+            //ECOMM_TRACE(UNILOG_MQTT, keepalive_0, P_SIG, 0, "....keepalive....ping_outstanding..=1..");

+            rc = FAILURE; /* PINGRESP not received in keepalive interval */

+        }

+        else

+        {

+            Timer timer;

+            TimerInit(&timer);

+            TimerCountdownMS(&timer, 1000);

+            

+            #ifdef MBTK_OPENCPU_SUPPORT

+            memset(c->buf, 0, MQTT_SEND_BUFF_LEN);

+            memset(c->readbuf, 0, MQTT_RECV_BUFF_LEN);

+            #endif

+

+            //memset(mqttSendbuf, 0, MQTT_SEND_BUFF_LEN);

+            //memset(mqttReadbuf, 0, MQTT_RECV_BUFF_LEN);

+            int len = MQTTSerialize_pingreq(c->buf, c->buf_size);

+            

+            //ECOMM_TRACE(UNILOG_MQTT, keepalive_1, P_SIG, 0, "....keepalive....send packet..");

+            if (len > 0 && (rc = sendPacket(c, len, &timer)) == SUCCESS) // send the ping packet

+                c->ping_outstanding = 1;

+        }

+    }

+

+exit:

+    return rc;

+}

+

+int keepaliveRetry(MQTTClient* c)

+{

+    int rc = SUCCESS;

+

+    if (c->keepAliveInterval == 0)

+    {

+        goto exit;

+    }

+

+    if (TimerIsExpired(&c->last_sent) || TimerIsExpired(&c->last_received))

+    {

+        {

+            Timer timer;

+            TimerInit(&timer);

+            TimerCountdownMS(&timer, 1000);

+            

+            #ifdef MBTK_OPENCPU_SUPPORT

+            memset(c->buf, 0, MQTT_SEND_BUFF_LEN);

+            memset(c->readbuf, 0, MQTT_RECV_BUFF_LEN);

+            #endif

+

+            //memset(mqttSendbuf, 0, MQTT_SEND_BUFF_LEN);

+            //memset(mqttReadbuf, 0, MQTT_RECV_BUFF_LEN);

+            int len = MQTTSerialize_pingreq(c->buf, c->buf_size);

+            

+            //ECOMM_TRACE(UNILOG_MQTT, keepalive_1pp, P_SIG, 0, "....keepalive....send packet..");

+            if (len > 0 && (rc = sendPacket(c, len, &timer)) == SUCCESS) // send the ping packet

+                c->ping_outstanding = 1;

+        }

+    }

+

+exit:

+    return rc;

+}

+

+void MQTTCleanSession(MQTTClient* c)

+{

+    int i = 0;

+

+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)

+        c->messageHandlers[i].topicFilter = NULL;

+}

+

+void MQTTCloseSession(MQTTClient* c)

+{

+    c->ping_outstanding = 0;

+    c->isconnected = 0;

+    if (c->cleansession)

+        MQTTCleanSession(c);

+}

+

+#ifdef MBTK_OPENCPU_SUPPORT

+

+int mqtt_try_resubscribe(MQTTClient* c)

+{

+    int i;

+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)

+    {

+        if (c->messageHandlers[i].topicFilter != 0)

+        {

+            MQTTSubscribe(c, c->messageHandlers[i].topicFilter, c->messageHandlers[i].qos,c->messageHandlers[i].fp);

+        }

+    }

+    return 0;

+}

+int mqtt_try_reconnect(MQTTClient* c)

+{

+    int reconnect_flag = 1;

+    int rc = 0;

+    mqtt_keepalive_retry_count = 0;

+    int ret = 0;

+

+    if(c->isconnected == 1)

+    {

+        if(c->is_mqtts == 0)

+        {

+            ret = c->ipstack->disconnect(c->ipstack);

+        }

+        else

+        {

+#ifdef FEATURE_MQTT_TLS_ENABLE

+#ifdef MBTK_OPENCPU_SUPPORT

+            ret = mqttSslClose(c->mqtts_client);

+#endif

+#endif

+        }

+        if(ret == 0)

+        {

+            c->isconnected = 0;

+        }

+    }

+

+    if(c->mqtt_connect_callback != 0)

+    {

+        c->mqtt_connect_callback(MQTT_START_RECONNECT_EVENT,0);

+    }

+

+    c->isconnected = 0;

+#ifdef FEATURE_MQTT_TLS_ENABLE

+#ifdef MBTK_OPENCPU_SUPPORT

+    if(c->is_mqtts == MBTK_MQTT_SSL_HAVE)

+    {

+        if(mqttRecvTaskHandle)

+        rc = mqttSslConn_new(c->mqtts_client, c->mbtk_mqtt_server_url);

+    }

+    else

+#endif

+#endif

+    {

+        rc = NetworkConnectTimeout(c->ipstack, c->mbtk_mqtt_server_url, c->mbtk_mqtt_port, MQTT_SEND_TIMEOUT, MQTT_RECV_TIMEOUT);

+    }

+    if(rc < 0)

+    {

+        reconnect_flag = 0;

+    }

+    else

+    {

+        if ((rc = (MQTTConnect(c, c->mbtk_mqtt_options))) != 0)

+        {

+            reconnect_flag = 0;

+        }

+        else

+        {

+            mqtt_try_resubscribe(c);

+            return 0;

+        }

+    }

+

+

+

+    if(reconnect_flag == 0)

+    {

+        if(c->mqtt_connect_callback != NULL)

+        {

+            int socket_status = sock_get_errno(c->ipstack->my_socket);

+            c->mqtt_connect_callback(MQTT_RECONNECT_FAIL_EVENT,socket_status);

+        }

+    }

+

+    return 0;

+}

+#endif

+

+int cycle(MQTTClient* c, Timer* timer)

+{

+    int len = 0,

+        rc = SUCCESS;

+

+    int packet_type = readPacket(c, timer);     /* read the socket, see what work is due */

+    //ECOMM_TRACE(UNILOG_MQTT, mqttRecvTask_0001, P_SIG, 1, ".....mqttRecvTask..packet_type=%d....",packet_type);

+    //ECPLAT_PRINTF(UNILOG_DM1, cycle0, P_SIG, ".....autoReg..packet_type=%d ",packet_type);

+

+#ifdef MBTK_OPENCPU_SUPPORT

+    if(c->is_mqtts == MBTK_MQTT_SSL_NONE)

+    {

+        int socket_status = sock_get_errno(c->ipstack->my_socket);

+        if(socket_status == ENOTCONN && c->isconnected == 1)

+        {

+            if(c->mqtt_connect_callback != NULL)

+            {

+                c->mqtt_connect_callback(MQTT_CONNECT_ABORT_EVENT,socket_status);

+            }

+            if(MBTK_MQTT_RECONNECT_ENABLE == c->mqtt_reconn_enable)

+            {

+                mqtt_try_reconnect(c);

+            }

+            else

+            {

+                goto exit;

+            }

+        }

+        else if(c->isconnected == 0)

+        {

+            goto exit;

+        }

+    }

+    if(c->is_mqtts && packet_type < 0)

+    {

+        if(c->isconnected)

+        {

+            if(c->mqtt_connect_callback != NULL)

+            {

+                c->mqtt_connect_callback(MQTT_CONNECT_ABORT_EVENT,ENOTCONN);

+            }

+            if(MBTK_MQTT_RECONNECT_ENABLE == c->mqtt_reconn_enable)

+            {

+                mqtt_try_reconnect(c);

+            }

+            else

+            {

+                goto exit;

+            }

+        }

+        else

+        {

+            goto exit;

+        }

+    }

+#endif

+    switch (packet_type)

+    {

+        default:

+            /* no more data to read, unrecoverable. Or read packet fails due to unexpected network error */

+            rc = packet_type;

+            break;

+        case 0: /* timed out reading packet */

+            break;

+        case CONNACK:

+        case PUBACK:

+        case SUBACK:

+        case UNSUBACK:

+            if(packet_type == SUBACK)

+            {

+                //rc = packet_type;

+            }

+            break;

+        case PUBLISH:

+        {

+            MQTTString topicName;

+            MQTTMessage msg;

+            int intQoS;

+            msg.payloadlen = 0; /* this is a size_t, but deserialize publish sets this as int */

+            if (MQTTDeserialize_publish(&msg.dup, &intQoS, &msg.retained, &msg.id, &topicName,

+               (unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->readbuf, c->readbuf_size) != 1)

+                goto exit;

+            msg.qos = (enum QoS)intQoS;

+            deliverMessage(c, &topicName, &msg);

+            if (msg.qos != QOS0)

+            {

+                if (msg.qos == QOS1)

+                    len = MQTTSerialize_ack(c->buf, c->buf_size, PUBACK, 0, msg.id);

+                else if (msg.qos == QOS2)

+                    len = MQTTSerialize_ack(c->buf, c->buf_size, PUBREC, 0, msg.id);

+                if (len <= 0)

+                    rc = FAILURE;

+                else

+                    rc = sendPacket(c, len, timer);

+                if (rc == FAILURE)

+                    goto exit; // there was a problem

+            }

+            break;

+        }

+        case PUBREC:

+        case PUBREL:

+        {

+            unsigned short mypacketid;

+            unsigned char dup, type;

+            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)

+                rc = FAILURE;

+            else if ((len = MQTTSerialize_ack(c->buf, c->buf_size,

+                (packet_type == PUBREC) ? PUBREL : PUBCOMP, 0, mypacketid)) <= 0)

+                rc = FAILURE;

+            else if ((rc = sendPacket(c, len, timer)) != SUCCESS) // send the PUBREL packet

+                rc = FAILURE; // there was a problem

+            if (rc == FAILURE)

+                goto exit; // there was a problem

+            break;

+        }

+

+        case PUBCOMP:

+            break;

+        case PINGRESP:

+            c->ping_outstanding = 0;

+            break;

+    }

+

+    if (keepalive(c) != SUCCESS) {      

+        int socket_stat = 0;        

+#ifndef MBTK_OPENCPU_SUPPORT

+        mqttSendMsg mqttMsg;

+#endif

+        //check only keepalive FAILURE status so that previous FAILURE status can be considered as FAULT

+        rc = FAILURE;

+        socket_stat = sock_get_errno(c->ipstack->my_socket);

+        if((socket_stat == MQTT_ERR_ABRT)||(socket_stat == MQTT_ERR_RST)||(socket_stat == MQTT_ERR_CLSD)||(socket_stat == MQTT_ERR_BADE))

+        {

+#ifdef MBTK_OPENCPU_SUPPORT

+            if(c->mqtt_reconn_enable == MBTK_MQTT_RECONNECT_ENABLE)

+            {

+                mqtt_try_reconnect(c);

+            }

+#else

+            //ECOMM_TRACE(UNILOG_MQTT, mqttRecvTask_0, P_INFO, 0, ".....now, need reconnect.......");

+            /* send  reconnect msg to send task */

+            memset(&mqttMsg, 0, sizeof(mqttMsg));

+            mqttMsg.cmdType = MQTT_DEMO_MSG_RECONNECT;

+

+            osMessageQueuePut(mqttSendMsgHandle, &mqttMsg, 0, MQTT_MSG_TIMEOUT);

+#endif

+        }

+        else

+        {

+            if(mqtt_keepalive_retry_count>3)

+            {

+#ifdef MBTK_OPENCPU_SUPPORT

+                if(c->mqtt_reconn_enable == MBTK_MQTT_RECONNECT_ENABLE)

+                {

+                    mqtt_try_reconnect(c);

+                }

+#else

+                mqtt_keepalive_retry_count = 0;

+                //ECOMM_TRACE(UNILOG_MQTT, mqttRecvTask_ee0, P_INFO, 0, ".....now, need reconnect.......");

+                /* send  reconnect msg to send task */

+                memset(&mqttMsg, 0, sizeof(mqttMsg));

+                mqttMsg.cmdType = MQTT_DEMO_MSG_RECONNECT;

+                

+                osMessageQueuePut(mqttSendMsgHandle, &mqttMsg, 0, MQTT_MSG_TIMEOUT);

+#endif

+            }

+            else

+            {

+                keepaliveRetry(c);

+            }

+        }

+    }

+

+exit:

+    if (rc == SUCCESS)

+        rc = packet_type;

+    else if (c->isconnected)

+        ;//MQTTCloseSession(c);

+    return rc;

+}

+

+int MQTTYield(MQTTClient* c, int timeout_ms)

+{

+    int rc = SUCCESS;

+    Timer timer;

+

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, timeout_ms);

+

+      do

+    {

+        if (cycle(c, &timer) < 0)

+        {

+            rc = FAILURE;

+            break;

+        }

+    } while (!TimerIsExpired(&timer));

+

+    return rc;

+}

+

+int MQTTIsConnected(MQTTClient* client)

+{

+  return client->isconnected;

+}

+

+void MQTTRun(void* parm)

+{

+    Timer timer;

+    MQTTClient* c = (MQTTClient*)&mqttClient;

+

+#ifndef MBTK_OPENCPU_SUPPORT

+    if(mqttSendMsgHandle == NULL)

+    {

+        mqttSendMsgHandle = osMessageQueueNew(16, sizeof(mqttSendMsg), NULL);

+    }

+    

+    if(appMqttMsgHandle == NULL)

+    {

+        appMqttMsgHandle = osMessageQueueNew(16, sizeof(mqttDataMsg), NULL);

+    }

+#endif

+    /*

+    if(mqttMutex1.sem == NULL)

+    {

+        MutexInit(&mqttMutex1);

+    }

+    */

+

+    TimerInit(&timer);

+

+    while (1)

+    {

+#if defined(MQTT_TASK)

+        //MutexLock(&c->mutex);

+#endif

+        //MutexLock(&mqttMutex1);

+

+        TimerCountdownMS(&timer, 1500); /* Don't wait too long if no traffic is incoming */

+        cycle(c, &timer);

+        //MutexUnlock(&mqttMutex1);

+        

+#if defined(MQTT_TASK)

+        //MutexUnlock(&c->mutex);

+#endif

+        sleep(200);

+    }

+}

+

+#if defined(MQTT_TASK)

+int MQTTStartTask(MQTTClient* client)

+{

+    return ThreadStart(&client->thread, &MQTTRun, client);

+}

+#endif

+

+int MQTTStartRECVTask(void)

+{

+    //osThreadAttr_t task_attr;

+

+    //memset(&task_attr, 0, sizeof(task_attr));

+    //task_attr.name = "mqttRecv";

+    //task_attr.stack_size = MQTT_DEMO_TASK_STACK_SIZE;

+    #if defined FEATURE_LITEOS_ENABLE

+    task_attr.priority = osPriorityBelowNormal4;

+    #elif defined FEATURE_FREERTOS_ENABLE

+    task_attr.priority = osPriorityBelowNormal7;

+    #endif

+

+    //mqttRecvTaskHandle = osThreadNew(MQTTRun, NULL,&task_attr);

+    if(mqttRecvTaskHandle == NULL)

+    {

+        return FAILURE;

+    }

+

+    return SUCCESS;

+}

+

+int waitfor(MQTTClient* c, int packet_type, Timer* timer)

+{

+    int rc = FAILURE;

+

+    do

+    {

+        if (TimerIsExpired(timer))

+            break; // we timed out

+        rc = cycle(c, timer);

+    }

+    while (rc != packet_type && rc >= 0);

+

+    return rc;

+}

+

+int MQTTConnectWithResults(MQTTClient* c, MQTTPacket_connectData* options, MQTTConnackData* data)

+{

+    Timer connect_timer;

+    int rc = FAILURE;

+    MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer;

+    int len = 0;

+

+#if defined(MQTT_TASK)

+      MutexLock(&c->mutex);

+#endif

+      if (c->isconnected) /* don't send connect packet again if we are already connected */

+          goto exit;

+

+    TimerInit(&connect_timer);

+    TimerCountdownMS(&connect_timer, c->command_timeout_ms);

+

+    if (options == 0)

+        options = &default_options; /* set default options if none were supplied */

+

+    c->keepAliveInterval = options->keepAliveInterval;

+    c->cleansession = options->cleansession;

+    TimerCountdown(&c->last_received, c->keepAliveInterval);

+    if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0)

+        goto exit;

+    if ((rc = sendPacket(c, len, &connect_timer)) != SUCCESS)  // send the connect packet

+        goto exit; // there was a problem

+

+    // this will be a blocking call, wait for the connack

+    if (waitfor(c, CONNACK, &connect_timer) == CONNACK)

+    {

+        data->rc = 0;

+        data->sessionPresent = 0;

+        if (MQTTDeserialize_connack(&data->sessionPresent, &data->rc, c->readbuf, c->readbuf_size) == 1)

+            rc = data->rc;

+        else

+            rc = FAILURE;

+    }

+    else

+        rc = FAILURE;

+

+exit:

+#ifdef MBTK_OPENCPU_SUPPORT

+    if (rc == SUCCESS)

+    {

+        if(c->mqtt_connect_callback != NULL)

+        {

+            c->mqtt_connect_callback(MQTT_CONNECT_SUCCESS_EVENT,0);

+        }

+        c->isconnected = 1;

+        c->ping_outstanding = 0;

+    }

+#endif

+

+#if defined(MQTT_TASK)

+      MutexUnlock(&c->mutex);

+#endif

+

+    return rc;

+}

+

+int MQTTReConnect(MQTTClient* client, MQTTPacket_connectData* connectData)

+{

+    int ret = FAILURE;

+    

+    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_13hh0, P_INFO, 0, "...start tcp disconnect ..");

+    client->ipstack->disconnect(client->ipstack);

+    

+    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_14hh1, P_INFO, 0, "...start tcp connect ...");

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_16hh3, P_INFO, 0, "...tcp connect ok...");

+        client->isconnected = 0;

+        if((NetworkConnectTimeout(client->ipstack, MQTT_SERVER_URI, MQTT_SERVER_PORT, MQTT_SEND_TIMEOUT, MQTT_RECV_TIMEOUT)) < 0)

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_17hh4, P_INFO, 0, "...tcp reconnect fail!!!...\r\n");

+        }

+        else

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_18hh5, P_INFO, 0, "...start mqtt connect ..");

+    

+            if ((MQTTConnect(client, connectData)) != 0)

+            {

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_19hh6, P_INFO, 0, "...mqtt reconnect fial!!!...");

+            }

+            else

+            {

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_20hh7, P_INFO, 0, "...mqtt reconnect ok!!!...");

+                ret = SUCCESS;

+            }

+        }

+    }

+    return ret;

+}

+

+int MQTTConnect(MQTTClient* c, MQTTPacket_connectData* options)

+{

+    MQTTConnackData data;

+    return MQTTConnectWithResults(c, options, &data);

+}

+

+int MQTTSetMessageHandler(MQTTClient* c, const char* topicFilter, messageHandler messageHandler)

+{

+    int rc = FAILURE;

+    int i = -1;

+

+    /* first check for an existing matching slot */

+    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)

+    {

+        if (c->messageHandlers[i].topicFilter != NULL && strcmp(c->messageHandlers[i].topicFilter, topicFilter) == 0)

+        {

+            if (messageHandler == NULL) /* remove existing */

+            {

+                c->messageHandlers[i].topicFilter = NULL;

+                c->messageHandlers[i].fp = NULL;

+            }

+            rc = SUCCESS; /* return i when adding new subscription */

+            break;

+        }

+    }

+    /* if no existing, look for empty slot (unless we are removing) */

+    if (messageHandler != NULL) {

+        if (rc == FAILURE)

+        {

+            for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)

+            {

+                if (c->messageHandlers[i].topicFilter == NULL)

+                {

+                    rc = SUCCESS;

+                    break;

+                }

+            }

+        }

+        if (i < MAX_MESSAGE_HANDLERS)

+        {

+            c->messageHandlers[i].topicFilter = topicFilter;

+            c->messageHandlers[i].fp = messageHandler;

+#ifdef MBTK_OPENCPU_SUPPORT

+            c->messageHandlers[i].qos = c->qos;

+#endif

+        }

+    }

+    return rc;

+}

+

+#ifdef MBTK_OPENCPU_SUPPORT

+

+void mbtk_MQTTRun(void* parm)

+{

+    Timer timer;

+    MQTTClient* c = (MQTTClient*)parm;

+    int i = c->recv_task_num;

+

+    if(mbtk_mqttMutex1[i].sem == NULL)

+    {

+        MutexInit(&mbtk_mqttMutex1[i]);

+    }

+

+    TimerInit(&timer);

+

+    while (1)

+    {

+#if defined(MQTT_TASK)

+        MutexLock(&c->mutex);

+#endif

+        MutexLock(&mbtk_mqttMutex1[i]);

+

+        TimerCountdownMS(&timer, 1500); 

+        cycle(c, &timer);

+        MutexUnlock(&mbtk_mqttMutex1[i]);

+        

+#if defined(MQTT_TASK)

+        MutexUnlock(&c->mutex);

+#endif

+        osDelay(200);

+    }

+}

+

+

+int mbtk_mqtt_demo_recv_task_init(int i,MQTTClient* c)

+{

+    osThreadAttr_t task_attr;

+    char name[10] = {0};

+    memset(&task_attr, 0, sizeof(task_attr));

+    task_attr.stack_size = MQTT_RECV_DEMO_TASK_STACK_SIZE;

+    task_attr.priority = osPriorityBelowNormal7;

+    sprintf(name, "mqttRecv%d", i);

+    task_attr.name = name;

+    ECOMM_TRACE(UNILOG_MQTT, mbtk_mqtt_demo_recv_task_init_1, P_INFO, 0, "mbtk_mqtt_demo_recv_task_init task_attr.name%s",task_attr.name);

+

+

+    mbtk_mqttRecvTaskHandle[i] = osThreadNew(mbtk_MQTTRun, (void *)c,&task_attr);

+    if(mbtk_mqttRecvTaskHandle[i] == NULL)

+    {

+        return FAILURE;

+    }

+    return SUCCESS;

+}

+

+

+#endif

+int MQTTSubscribeWithResults(MQTTClient* c, const char* topicFilter, enum QoS qos,

+       messageHandler messageHandler, MQTTSubackData* data)

+{

+    int rc = FAILURE;

+    Timer timer;

+    int len = 0;

+    int mqttQos = (int)qos;

+    MQTTString topic = MQTTString_initializer;

+    topic.cstring = (char *)topicFilter;

+

+#if defined(MQTT_TASK)

+      MutexLock(&c->mutex);

+#endif

+      if (!c->isconnected)

+            goto exit;

+

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, c->command_timeout_ms);

+

+    len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, (int*)&mqttQos);

+    if (len <= 0)

+        goto exit;

+    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet

+        goto exit;             // there was a problem

+

+    if (waitfor(c, SUBACK, &timer) == SUBACK)      // wait for suback

+    {

+        int count = 0;

+        unsigned short mypacketid;

+        //data->grantedQoS = QOS0;

+        mqttQos = QOS0;

+        if (MQTTDeserialize_suback(&mypacketid, 1, &count, (int*)&mqttQos, c->readbuf, c->readbuf_size) == 1)

+        {

+            if (mqttQos != 0x80)

+            {//mbtk change

+            #ifndef MBTK_OPENCPU_SUPPORT

+                rc = MQTTSetMessageHandler(c, topicFilter, messageHandler);

+                mqttClient = *c;

+                

+                if(mqttRecvTaskHandle == NULL)

+                {

+                    mqtt_demo_recv_task_init();

+                }

+

+           #else

+            rc = MQTTSetMessageHandler(c, topicFilter, messageHandler);

+            int i = 0;

+            if(c->first_sub == 0)

+            {

+                c->first_sub = 1;

+                for(i = 0; i < MAX_RECV_TASK; i++)

+                {

+                    if(mbtk_mqttRecvTaskHandle[i] != NULL)

+                    {

+                        ECOMM_TRACE(UNILOG_MQTT, MQTTSubscribeWithResults_0, P_INFO, 0, "mbtk_mqttRecvTaskHandle %d has create",i);

+                        continue;

+                    }

+                    else

+                    {

+                        c->recv_task_num = i;

+                        mbtk_mqtt_demo_recv_task_init(i,c);

+                        break;

+                    }

+                }

+                if(i >= MAX_RECV_TASK)

+                {

+                

+                    ECOMM_TRACE(UNILOG_MQTT, MQTTSubscribeWithResults_1, P_INFO, 0, "create mqtt recv task error");

+                    rc = FAILURE;

+                }

+            }

+

+            #endif

+            }//mbtk change, end

+        }

+    }

+    else

+        rc = FAILURE;

+

+exit:

+    if (rc == FAILURE)

+        ;//MQTTCloseSession(c);

+#if defined(MQTT_TASK)

+      MutexUnlock(&c->mutex);

+#endif

+    return rc;

+}

+

+int MQTTSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos,

+       messageHandler messageHandler)

+{

+    MQTTSubackData data;

+    return MQTTSubscribeWithResults(c, topicFilter, qos, messageHandler, &data);

+}

+

+int MQTTUnsubscribe(MQTTClient* c, const char* topicFilter)

+{

+    int rc = FAILURE;

+    Timer timer;

+    MQTTString topic = MQTTString_initializer;

+    topic.cstring = (char *)topicFilter;

+    int len = 0;

+

+#if defined(MQTT_TASK)

+      MutexLock(&c->mutex);

+#endif

+      if (!c->isconnected)

+          goto exit;

+

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, c->command_timeout_ms);

+

+    if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0)

+        goto exit;

+    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet

+        goto exit; // there was a problem

+

+    if (waitfor(c, UNSUBACK, &timer) == UNSUBACK)

+    {

+        unsigned short mypacketid;  // should be the same as the packetid above

+        if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1)

+        {

+            /* remove the subscription message handler associated with this topic, if there is one */

+            MQTTSetMessageHandler(c, topicFilter, NULL);

+        }

+    }

+    else

+        rc = FAILURE;

+

+exit:

+    if (rc == FAILURE)

+        ;//MQTTCloseSession(c);

+#if defined(MQTT_TASK)

+      MutexUnlock(&c->mutex);

+#endif

+    return rc;

+}

+

+int MQTTPublish(MQTTClient* c, const char* topicName, MQTTMessage* message)

+{

+    int rc = FAILURE;

+    Timer timer;

+    MQTTString topic = MQTTString_initializer;

+    topic.cstring = (char *)topicName;

+    int len = 0;

+

+#if defined(MQTT_TASK)

+      MutexLock(&c->mutex);

+#endif

+      if (!c->isconnected)

+            goto exit;

+

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, c->command_timeout_ms);

+

+    if (message->qos == QOS1 || message->qos == QOS2)

+        message->id = getNextPacketId(c);

+

+    len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id,

+              topic, (unsigned char*)message->payload, message->payloadlen);

+    if (len <= 0)

+        goto exit;

+    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet

+        goto exit; // there was a problem

+

+    if (message->qos == QOS1)

+    {

+        if (waitfor(c, PUBACK, &timer) == PUBACK)

+        {

+            unsigned short mypacketid;

+            unsigned char dup, type;

+            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)

+                rc = FAILURE;

+        }

+        else

+            rc = FAILURE;

+    }

+    else if (message->qos == QOS2)

+    {

+        if (waitfor(c, PUBCOMP, &timer) == PUBCOMP)

+        {

+            unsigned short mypacketid;

+            unsigned char dup, type;

+            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)

+                rc = FAILURE;

+        }

+        else

+            rc = FAILURE;

+    }

+

+exit:

+    if (rc == FAILURE)

+        ;//MQTTCloseSession(c);

+#if defined(MQTT_TASK)

+      MutexUnlock(&c->mutex);

+#endif

+    return rc;

+}

+

+int MQTTDisconnect(MQTTClient* c)

+{

+    int rc = FAILURE;

+    Timer timer;     // we might wait for incomplete incoming publishes to complete

+    int len = 0;

+

+#if defined(MQTT_TASK)

+    MutexLock(&c->mutex);

+#endif

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, c->command_timeout_ms);

+

+      len = MQTTSerialize_disconnect(c->buf, c->buf_size);

+    if (len > 0)

+        rc = sendPacket(c, len, &timer);            // send the disconnect packet

+    MQTTCloseSession(c);

+

+#if defined(MQTT_TASK)

+      MutexUnlock(&c->mutex);

+#endif

+    return rc;

+}

+

+int MQTTInit(MQTTClient* c, Network* n, unsigned char* sendBuf, unsigned char* readBuf)

+{    

+    NetworkInit(n);

+    MQTTClientInit(c, n, 40000, (unsigned char *)sendBuf, 1000, (unsigned char *)readBuf, 1000);

+

+    return 0;

+}

+

+int MQTTCreate(MQTTClient* c, Network* n, char* clientID, char* username, char* password, char *serverAddr, int port, MQTTPacket_connectData* connData)

+{

+    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;

+    int clientLen = 0;

+    int usernameLen = 0;

+    int passwordLen = 0;

+

+    if(connData != NULL)

+    {

+        memcpy(&connectData, connData, sizeof(MQTTPacket_connectData));

+    }

+    else

+    {

+        connectData.MQTTVersion = 4;

+        connectData.keepAliveInterval = 120;

+    }

+

+    if(clientID != NULL)

+    {

+        clientLen = strlen(clientID);

+        connectData.clientID.cstring = malloc(clientLen+1);

+        memset(connectData.clientID.cstring, 0, (clientLen+1));

+        memcpy(connectData.clientID.cstring, clientID, clientLen);

+    }

+

+    if(username != NULL)

+    {

+        usernameLen = strlen(username);

+        connectData.username.cstring = malloc(usernameLen+1);;

+        memset(connectData.username.cstring, 0, (usernameLen+1));

+        memcpy(connectData.username.cstring, username, usernameLen);

+    }

+

+    if(password != NULL)

+    {

+        passwordLen = strlen(password);

+        connectData.password.cstring = malloc(passwordLen+1);

+        memset(connectData.password.cstring, 0, (passwordLen+1));

+        memcpy(connectData.password.cstring, password, passwordLen);

+    } 

+      

+    {

+        if ((NetworkConnectTimeout(n, serverAddr, port, 5000, 5000)) != 0)

+        {

+            c->keepAliveInterval = connectData.keepAliveInterval;

+            c->ping_outstanding = 1;

+            return 1;

+        }

+        else

+        {

+            if ((MQTTConnect(c, &connectData)) != 0)

+            {

+                c->ping_outstanding = 1;

+                return 1;

+            }

+            else

+            {

+                #if defined(MQTT_TASK)

+                    if ((MQTTStartTask(c)) != pdPASS)

+                    {

+                        return 1;

+                    }

+                    else

+                    {

+                        return 0;

+                    }

+                #endif

+            }

+        }

+    }

+    return 1;

+}

+

+#ifdef FEATURE_CUCC_DM_ENABLE

+

+int MQTTCuccCycle(MQTTClient* c, Timer* timer)

+{

+    int rc = SUCCESS;

+

+    int packet_type = readPacket(c, timer);     /* read the socket, see what work is due */

+    //ECOMM_TRACE(UNILOG_MQTT, mqttRecvTask_0001, P_SIG, 1, ".....mqttRecvTask..packet_type=%d....",packet_type);

+    //ECPLAT_PRINTF(UNILOG_DM1, cycle0, P_SIG, ".....autoReg..packet_type=%d ",packet_type);

+

+    switch (packet_type)

+    {

+        default:

+            /* no more data to read, unrecoverable. Or read packet fails due to unexpected network error */

+            rc = packet_type;

+            break;

+        case 0: /* timed out reading packet */

+            break;

+        case CONNACK:

+        case PUBACK:

+        case SUBACK:

+        case UNSUBACK:

+            if(packet_type == SUBACK)

+            {

+                //rc = packet_type;

+            }

+            break;

+        case PUBLISH:

+        {

+            break;

+        }

+        case PUBREC:

+        case PUBREL:

+        {

+            break;

+        }

+

+        case PUBCOMP:

+            break;

+        case PINGRESP:

+            c->ping_outstanding = 0;

+            break;

+    }

+

+    if (rc == SUCCESS)

+        rc = packet_type;

+    else if (c->isconnected)

+        ;//MQTTCloseSession(c);

+    return rc;

+}

+

+int MQTTCuccWaitfor(MQTTClient* c, int packet_type, Timer* timer)

+{

+    int rc = FAILURE;

+

+    do

+    {

+        if (TimerIsExpired(timer))

+            break; // we timed out

+        rc = MQTTCuccCycle(c, timer);

+    }

+    while (rc != packet_type && rc >= 0);

+

+    return rc;

+}

+

+int MQTTCuccCreate(MQTTClient* c, Network* n, char* clientID, char* username, char* password, char *serverAddr, int port, MQTTPacket_connectData* connData)

+{

+    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;

+    int clientLen = 0;

+    int usernameLen = 0;

+    int passwordLen = 0;

+

+    if(connData != NULL)

+    {

+        memcpy(&connectData, connData, sizeof(MQTTPacket_connectData));

+    }

+    else

+    {

+        connectData.MQTTVersion = 4;

+        connectData.keepAliveInterval = 120;

+    }

+

+    if(clientID != NULL)

+    {

+        clientLen = strlen(clientID);

+        connectData.clientID.cstring = malloc(clientLen+1);

+        memset(connectData.clientID.cstring, 0, (clientLen+1));

+        memcpy(connectData.clientID.cstring, clientID, clientLen);

+    }

+

+    if(username != NULL)

+    {

+        usernameLen = strlen(username);

+        connectData.username.cstring = malloc(usernameLen+1);;

+        memset(connectData.username.cstring, 0, (usernameLen+1));

+        memcpy(connectData.username.cstring, username, usernameLen);

+    }

+

+    if(password != NULL)

+    {

+        passwordLen = strlen(password);

+        connectData.password.cstring = malloc(passwordLen+1);

+        memset(connectData.password.cstring, 0, (passwordLen+1));

+        memcpy(connectData.password.cstring, password, passwordLen);

+    } 

+      

+    {

+        if ((NetworkConnectTimeout(n, serverAddr, port, 5000, 5000)) != 0)

+        {

+            c->keepAliveInterval = connectData.keepAliveInterval;

+            c->ping_outstanding = 1;

+            return 1;

+        }

+        else

+        {

+            if ((MQTTConnect(c, &connectData)) != 0)

+            {

+                //c->ping_outstanding = 1;

+                //return 1;

+            }

+            else

+            {

+                #if defined(MQTT_TASK)

+                    if ((MQTTStartTask(c)) != pdPASS)

+                    {

+                        return 1;

+                    }

+                    else

+                    {

+                        return 0;

+                    }

+                #endif

+            }

+        }

+    }

+    return 0;

+}

+

+int MQTTCuccConnect(MQTTClient* c, char* clientID, char* username, char* password, MQTTPacket_connectData* connData)

+{

+    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;

+    int clientLen = 0;

+    int usernameLen = 0;

+    int passwordLen = 0;

+

+    if(connData != NULL)

+    {

+        memcpy(&connectData, connData, sizeof(MQTTPacket_connectData));

+    }

+    else

+    {

+        connectData.MQTTVersion = 4;

+        connectData.keepAliveInterval = 120;

+    }

+

+    if(clientID != NULL)

+    {

+        clientLen = strlen(clientID);

+        connectData.clientID.cstring = malloc(clientLen+1);

+        memset(connectData.clientID.cstring, 0, (clientLen+1));

+        memcpy(connectData.clientID.cstring, clientID, clientLen);

+    }

+

+    if(username != NULL)

+    {

+        usernameLen = strlen(username);

+        connectData.username.cstring = malloc(usernameLen+1);;

+        memset(connectData.username.cstring, 0, (usernameLen+1));

+        memcpy(connectData.username.cstring, username, usernameLen);

+    }

+

+    if(password != NULL)

+    {

+        passwordLen = strlen(password);

+        connectData.password.cstring = malloc(passwordLen+1);

+        memset(connectData.password.cstring, 0, (passwordLen+1));

+        memcpy(connectData.password.cstring, password, passwordLen);

+    } 

+      

+    if ((MQTTConnect(c, &connectData)) != 0)

+    {

+        c->ping_outstanding = 1;

+        return 1;

+    }

+

+    return 0;

+}

+

+int MQTTCuccPublish(MQTTClient* c, const char* topicName, MQTTMessage* message)

+{

+    int rc = FAILURE;

+    Timer timer;

+    MQTTString topic = MQTTString_initializer;

+    topic.cstring = (char *)topicName;

+    int len = 0;

+

+#if defined(MQTT_TASK)

+      MutexLock(&c->mutex);

+#endif

+      if (!c->isconnected)

+            goto exit;

+

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, c->command_timeout_ms);

+

+    if (message->qos == QOS1 || message->qos == QOS2)

+        message->id = getNextPacketId(c);

+

+    len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id,

+              topic, (unsigned char*)message->payload, message->payloadlen);

+    if (len <= 0)

+        goto exit;

+    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet

+        goto exit; // there was a problem

+

+    if (message->qos == QOS1)

+    {

+        if (waitfor(c, PUBACK, &timer) == PUBACK)

+        {

+            unsigned short mypacketid;

+            unsigned char dup, type;

+            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)

+                rc = FAILURE;

+        }

+        else

+            rc = FAILURE;

+    }

+    else if (message->qos == QOS2)

+    {

+        if (waitfor(c, PUBCOMP, &timer) == PUBCOMP)

+        {

+            unsigned short mypacketid;

+            unsigned char dup, type;

+            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)

+                rc = FAILURE;

+        }

+        else

+            rc = FAILURE;

+    }

+

+exit:

+    if (rc == FAILURE)

+        ;//MQTTCloseSession(c);

+#if defined(MQTT_TASK)

+      MutexUnlock(&c->mutex);

+#endif

+    return rc;

+}

+

+int MQTTCuccSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos, messageHandler messageHandler)

+{

+    int rc = FAILURE;

+    Timer timer;

+    int len = 0;

+    int mqttQos = (int)qos;

+    //MQTTSubackData data;

+    MQTTString topic = MQTTString_initializer;

+    topic.cstring = (char *)topicFilter;

+

+#if defined(MQTT_TASK)

+      MutexLock(&c->mutex);

+#endif

+      if (!c->isconnected)

+            goto exit;

+

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, 40000);

+

+    len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, (int*)&mqttQos);

+    if (len <= 0)

+        goto exit;

+    if ((rc = sendPacket(c, len, &timer)) != SUCCESS) // send the subscribe packet

+        goto exit;             // there was a problem

+

+    if (waitfor(c, SUBACK, &timer) == SUBACK)      // wait for suback

+    {

+        int count = 0;

+        unsigned short mypacketid;

+        //data.grantedQoS = QOS0;

+        mqttQos = QOS0;

+        if (MQTTDeserialize_suback(&mypacketid, 1, &count, (int*)&mqttQos, c->readbuf, c->readbuf_size) == 1)

+        {

+            if (mqttQos == 0x80)

+            {

+                rc = FAILURE;

+            }

+            else

+            {

+                rc = SUCCESS;

+            }

+        }

+    }

+    else

+    {

+        rc = FAILURE;

+    }

+

+exit:

+    if (rc == FAILURE)

+        ;//MQTTCloseSession(c);

+#if defined(MQTT_TASK)

+      MutexUnlock(&c->mutex);

+#endif

+    return rc;

+}

+

+

+int MQTTCuccDisconnect(MQTTClient* c)

+{

+    int rc = FAILURE;

+    Timer timer;     // we might wait for incomplete incoming publishes to complete

+    int len = 0;

+

+#if defined(MQTT_TASK)

+    MutexLock(&c->mutex);

+#endif

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, c->command_timeout_ms);

+

+      len = MQTTSerialize_disconnect(c->buf, c->buf_size);

+    if (len > 0)

+        rc = sendPacket(c, len, &timer);            // send the disconnect packet

+    MQTTCloseSession(c);

+

+#if defined(MQTT_TASK)

+      MutexUnlock(&c->mutex);

+#endif

+    return rc;

+}

+

+int MQTTCuccWaitForRecv(MQTTClient* c, int packet_type, unsigned int timerOut, MQTTString *topicName, char *outPayload)

+{

+    int rc = FAILURE;

+    Timer timer;

+    MQTTMessage msg;

+    int intQoS;

+

+    memset(&msg, 0, sizeof(MQTTMessage));

+    TimerInit(&timer);

+    TimerCountdownMS(&timer, timerOut);

+

+    do

+    {

+        if (TimerIsExpired(&timer))

+            break; // we timed out

+        rc = cycle(c, &timer);

+    }

+    while (rc != packet_type && rc >= 0);

+

+    if(rc == PUBLISH)

+    {

+        if (MQTTDeserialize_publish(&msg.dup, &intQoS, &msg.retained, &msg.id, topicName,

+                                (unsigned char**)&msg.payload, (int*)&msg.payloadlen, c->readbuf, c->readbuf_size) == 1)

+        {

+            memcpy(outPayload, (unsigned char*)msg.payload, msg.payloadlen);

+            rc = SUCCESS;

+        }

+    }

+    

+    return rc;

+}

+

+

+#endif

+

+#define MQTT_DEMO_EXAMPLE_1_ONENET

+void mqtt_demo_onenet(void)

+{

+    int len = 0;

+    MQTTMessage message;

+    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;

+    

+    connectData.MQTTVersion = 4;

+    connectData.clientID.cstring = "34392813";

+    connectData.username.cstring = "122343";

+    connectData.password.cstring = "test001";

+    connectData.keepAliveInterval = 120;

+    //ECOMM_TRACE(UNILOG_MQTT, mqtt_hh00, P_SIG, 0, "mqtt_demo........");

+    ECPLAT_PRINTF(UNILOG_MQTT, mqtt_demo_onenet0, P_INFO, "mqtt_demo........");

+    mqttSendbuf = malloc(MQTT_SEND_BUFF_LEN);

+    mqttReadbuf = malloc(MQTT_RECV_BUFF_LEN);

+    memset(mqttSendbuf, 0, MQTT_SEND_BUFF_LEN);

+    memset(mqttReadbuf, 0, MQTT_RECV_BUFF_LEN);

+    

+    NetworkInit(&mqttNetwork);

+    MQTTClientInit(&mqttClient, &mqttNetwork, 40000, (unsigned char *)mqttSendbuf, 1000, (unsigned char *)mqttReadbuf, 1000);

+

+    if((NetworkSetConnTimeout(&mqttNetwork, 5000, 5000)) != 0)

+    {

+        mqttClient.keepAliveInterval = connectData.keepAliveInterval;

+        mqttClient.ping_outstanding = 1;

+    }

+    else

+    {

+        if ((NetworkConnect(&mqttNetwork, "183.230.40.39", 6002)) != 0)

+        {

+            mqttClient.keepAliveInterval = connectData.keepAliveInterval;

+            mqttClient.ping_outstanding = 1;

+        }

+        else

+        {

+            ECPLAT_PRINTF(UNILOG_MQTT, mqtt_demo_onenet1, P_INFO, "mqtt_demo socket connect ok");

+            if ((MQTTConnect(&mqttClient, &connectData)) != 0)

+            {

+                mqttClient.ping_outstanding = 1;

+            }

+            else

+            {

+                ECPLAT_PRINTF(UNILOG_MQTT, mqtt_demo_onenet2, P_INFO, "mqtt_demo connect fail");

+                mqttClient.ping_outstanding = 0;

+            }

+        }

+        if(mqttClient.ping_outstanding == 0)

+        {

+            if ((MQTTStartRECVTask()) != SUCCESS)

+                ;

+        }

+

+    }

+    while(1)

+    {

+        sprintf(mqtt_payload,"{\"ec_smart_sensor_data\":%d}", ec_sensor_temp);

+        len = strlen(mqtt_payload);

+        ec_data_len = len;

+        unsigned char *ptr = mqttJsonbuff;

+        sprintf((char *)mqttJsonbuff,"%c%c%c%s", ec_data_type, ec_data_type,ec_data_type, mqtt_payload);

+        message.payload = mqttJsonbuff;

+        message.payloadlen = strlen((char *)mqttJsonbuff);

+        writeChar(&ptr, ec_data_type);

+        writeInt(&ptr, ec_data_len);

+        ECPLAT_PRINTF(UNILOG_MQTT, mqtt_demo_onenet3, P_INFO, "mqtt_demo send data");

+

+        MQTTPublish(&mqttClient, "$dp", &message);

+

+        osDelay(10000);

+    }

+    /* do not return */

+}

+

+#define MQTT_DEMO_EXAMPLE_2_ALI

+#ifdef FEATURE_MQTT_TLS_ENABLE

+void mqtt_demo_ali(void)

+{

+    //char *pub_topic;

+    int len = 0;

+    MQTTMessage message;

+    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;

+    char hmac_source[256] = {0};

+    char *ali_clientID = NULL;

+    char *ali_username = NULL;

+    char *ali_signature = NULL;

+

+    /* eigencomm  ec_smoke     a1xFDTv3InR  sWZtNMYkODMxvauyaSiGeJrVEp9jZ4Tg  8964 ---"eigencomm|securemode=3,signmethod=hmacsha1,timestamp=8964|" "deviceGrape&a1fsx061r0x" */

+    /* eigencomm  deviceGrape  a1fsx061r0x  WLar6NunAcCJ0aZHbaNw4eQwdsYVKyC9  8964 ---"eigencomm|securemode=3,signmethod=hmacsha1,timestamp=8964|" "deviceGrape&a1fsx061r0x" */

+    /* clientID   deviceName   productKey   deviceSecret*/

+    ali_clientID = malloc(128);

+    ali_username = malloc(64);

+    ali_signature = malloc(96);

+    

+    memset(ali_clientID, 0, 128);

+    memset(ali_username, 0, 64);

+    memset(ali_signature, 0, 96);

+    

+    snprintf(hmac_source, sizeof(hmac_source), "clientId%s" "deviceName%s" "productKey%s" "timestamp%s", "eigencomm", "ec_smoke", "a1xFDTv3InR", "8964");

+    

+    mqttAliHmacSha1((unsigned char *)hmac_source, strlen(hmac_source), (unsigned char *)ali_signature,(unsigned char *)"sWZtNMYkODMxvauyaSiGeJrVEp9jZ4Tg", strlen("sWZtNMYkODMxvauyaSiGeJrVEp9jZ4Tg"));

+    

+    sprintf(ali_clientID,"%s|securemode=3,signmethod=hmacsha1,timestamp=8964|", "eigencomm");

+    sprintf(ali_username,"%s&%s","ec_smoke","a1xFDTv3InR");

+    connectData.clientID.cstring = ali_clientID;

+    connectData.username.cstring = ali_username;

+    connectData.password.cstring = ali_signature;

+    

+    connectData.MQTTVersion = 4;

+    connectData.keepAliveInterval = 120;

+    //ECOMM_TRACE(UNILOG_MQTT, mqtt_hh001, P_SIG, 0, "mqtt_demo........");

+    mqttSendbuf = malloc(MQTT_SEND_BUFF_LEN);

+    mqttReadbuf = malloc(MQTT_RECV_BUFF_LEN);

+    memset(mqttSendbuf, 0, MQTT_SEND_BUFF_LEN);

+    memset(mqttReadbuf, 0, MQTT_RECV_BUFF_LEN);

+    

+    NetworkInit(&mqttNetwork);

+    MQTTClientInit(&mqttClient, &mqttNetwork, 40000, (unsigned char *)mqttSendbuf, 1000, (unsigned char *)mqttReadbuf, 1000);

+

+    if((NetworkSetConnTimeout(&mqttNetwork, 5000, 5000)) != 0)

+    {

+        mqttClient.keepAliveInterval = connectData.keepAliveInterval;

+        mqttClient.ping_outstanding = 1;

+    }

+    else

+    {

+        if ((NetworkConnect(&mqttNetwork, "a1xFDTv3InR.iot-as-mqtt.cn-shanghai.aliyuncs.com", 1883)) != 0)

+        {

+            mqttClient.keepAliveInterval = connectData.keepAliveInterval;

+            mqttClient.ping_outstanding = 1;

+        }

+        else

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqtt_hh012, P_SIG, 0, "mqtt_demo....1....");

+            if ((MQTTConnect(&mqttClient, &connectData)) != 0)

+            {

+                mqttClient.ping_outstanding = 1;

+            }

+            else

+            {

+                //ECOMM_TRACE(UNILOG_MQTT, mqtt_hh023, P_SIG, 0, "mqtt_demo....2....");

+                mqttClient.ping_outstanding = 0;

+            }

+        }

+        if(mqttClient.ping_outstanding == 0)

+        {

+            if ((MQTTStartRECVTask()) != SUCCESS)

+                ;

+        }

+

+    }

+    while(1)

+    {

+        memset(mqtt_payload, 0, sizeof(mqtt_payload));

+        memcpy(mqtt_payload, "update", strlen("update"));

+        len = strlen(mqtt_payload);

+        message.payload = mqtt_payload;

+        message.payloadlen = len;

+        //ECOMM_TRACE(UNILOG_MQTT, mqtt_hh034, P_SIG, 0, "mqtt_demo....3....");

+

+        MQTTPublish(&mqttClient, "a1xFDTv3InR/ec_smoke/user/get", &message);

+

+        osDelay(10000);

+    }

+    /* do not return */

+}

+#endif

+#define MQTT_DEMO_EXAMPLE_3_APP

+void mqtt_demo_send_task(void *argument)

+{

+    int ret = FAILURE;

+    int msgType = 0xff;

+    mqttSendMsg mqttMsg;

+    mqttDataMsg mqttMessage;

+    int socket_stat = -1;

+    int socket_err = -1;    

+    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;

+    

+    connectData.MQTTVersion = 4;

+    connectData.clientID.cstring = "34392813";

+    connectData.username.cstring = "122343";

+    connectData.password.cstring = "test001";

+    connectData.keepAliveInterval = 120;

+    

+    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_0, P_SIG, 0, "mqttSendTask........");

+    mqttSendbuf = malloc(MQTT_SEND_BUFF_LEN);

+    mqttReadbuf = malloc(MQTT_RECV_BUFF_LEN);

+    memset(mqttSendbuf, 0, MQTT_SEND_BUFF_LEN);

+    memset(mqttReadbuf, 0, MQTT_RECV_BUFF_LEN);

+

+    NetworkInit(&mqttNetwork);

+    MQTTClientInit(&mqttClient, &mqttNetwork, 40000, (unsigned char *)mqttSendbuf, MQTT_SEND_BUFF_LEN, (unsigned char *)mqttReadbuf, MQTT_RECV_BUFF_LEN);

+

+    if((NetworkSetConnTimeout(&mqttNetwork, 10000, 10000)) != 0)

+    {

+        mqttClient.keepAliveInterval = connectData.keepAliveInterval;

+        mqttClient.ping_outstanding = 1;

+    }

+    else

+    {

+        if ((NetworkConnect(&mqttNetwork, "183.230.40.39", 6002)) != 0)

+        {

+            mqttClient.keepAliveInterval = connectData.keepAliveInterval;

+            mqttClient.ping_outstanding = 1;

+            //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_1, P_SIG, 0, "mqttSendTask..tcp connect fail....");

+        }

+        else

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_2, P_SIG, 0, "mqttSendTask..tcp connect ok....");

+            if ((MQTTConnect(&mqttClient, &connectData)) != 0)

+            {

+                mqttClient.ping_outstanding = 1;

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_3, P_SIG, 0, "mqttSendTask..mqtt connect fail....");

+            }

+            else

+            {

+                mqttClient.keepAliveInterval = connectData.keepAliveInterval;

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_4, P_SIG, 0, "mqttSendTask..mqtt connect ok....");

+                mqtt_send_task_status_flag = 1;             

+                mqttClient.ping_outstanding = 0;

+            }

+        }

+    }

+    

+    /* sub topic*/

+    //MQTTSubscribe(&mqttClient, topic_data, 0, NULL);       

+    

+    /*start recv task*/

+    if(mqttClient.ping_outstanding == 0)

+    {

+        mqtt_demo_recv_task_init();

+    }

+    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_4000, P_SIG, 0, "mqttSendTask..start recv msg....");

+    

+    while(1)

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_4001, P_SIG, 1, "mqttSendTask..recv msg hand=0x%x....",mqttSendMsgHandle);

+        /* recv msg (block mode) */

+        osMessageQueueGet(mqttSendMsgHandle, &mqttMsg, 0, osWaitForever);

+        msgType = mqttMsg.cmdType;

+        //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_4002, P_SIG, 1, "mqttSendTask..recv msg=%d....",msgType);

+

+        switch(msgType)

+        {

+            case MQTT_DEMO_MSG_PUBLISH:

+                /* send packet */

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_500, P_INFO, 0, ".....start send mqtt publish packet.......");

+                MutexLock(&mqttMutex1);

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_5, P_INFO, 0, ".....start send mqtt publish packet.......");

+                memset(mqttSendbuf, 0, MQTT_SEND_BUFF_LEN);

+                ret = MQTTPublish(&mqttClient, mqttMsg.topic, &mqttMsg.message);

+                

+                if(mqttMsg.topic != NULL)

+                {

+                    free(mqttMsg.topic);

+                    mqttMsg.topic = NULL;

+                }

+                if(mqttMsg.message.payload != NULL)

+                {

+                    free(mqttMsg.message.payload);

+                    mqttMsg.message.payload = NULL;

+                }           

+                

+                /* send result to at task */

+                if(ret == SUCCESS)

+                {

+                    memset(&mqttMessage, 0, sizeof(mqttMessage));

+                    mqttMessage.cmdType = MQTT_DEMO_MSG_PUBLISH_ACK;

+                    mqttMessage.ret = SUCCESS;

+                    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_600, P_INFO, 0, ".....send mqtt publish packet ok.......");

+                

+                    osMessageQueuePut(appMqttMsgHandle, &mqttMessage, 0, MQTT_MSG_TIMEOUT);

+                }

+                else

+                {

+                    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_6, P_INFO, 0, ".....send mqtt publish packet fail.......");

+                    socket_stat = sock_get_errno(mqttClient.ipstack->my_socket);

+                    socket_err = socket_error_is_fatal(socket_stat);

+                    if(socket_err == 1)

+                    {

+                        //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_7, P_INFO, 0, ".....find need reconnect when publish packet.......");

+                        MQTTReConnect(&mqttClient, &connectData);

+

+                    }

+                    else

+                    {

+                        memset(&mqttMessage, 0, sizeof(mqttMessage));

+                        mqttMessage.cmdType = MQTT_DEMO_MSG_PUBLISH_ACK;

+                        mqttMessage.ret = SUCCESS;

+                        //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_600ii, P_INFO, 0, ".....send mqtt publish packet ok.......");

+                    

+                        osMessageQueuePut(appMqttMsgHandle, &mqttMessage, 0, MQTT_MSG_TIMEOUT);

+                    }

+                    //memset(&mqttMessage, 0, sizeof(mqttMessage));

+                    //mqttMessage.cmdType = MQTT_MSG_RECONNECT;

+                    //mqttMessage.ret = FAILURE;

+                

+                    //xQueueSend(appMqttMsgHandle, &mqttMessage, MQTT_MSG_TIMEOUT);

+                }

+                MutexUnlock(&mqttMutex1);

+                break;

+#if 0

+            case MQTT_DEMO_MSG_KEEPALIVE:

+                /* send keepalive packet */

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_8, P_INFO, 0, ".....start send mqtt keeplive packet.......");

+                ret = keepalive(&mqttClient);

+

+                if(ret == SUCCESS) // send the ping packet

+                {

+                    mqttClient->ping_outstanding = 1;

+                    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_9, P_INFO, 1, ".....mqtt keeplive send ok.......");

+                }

+                else

+                {

+                    socket_stat = sock_get_errno(mqttNewContext->mqtt_client->ipstack->my_socket);

+                    socket_err = socket_error_is_fatal(socket_stat);

+                    if(socket_err == 1)

+                    {

+                        //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_10, P_INFO, 0, ".....find need reconnect when send keeplive packet.......");

+                        ret = MQTT_RECONNECT;

+                    }

+                    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_11, P_INFO, 1, ".....mqtt send keeplive Packet fail");

+                }

+                break;

+#endif

+            case MQTT_DEMO_MSG_RECONNECT:

+                MutexLock(&mqttMutex1);

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_12, P_INFO, 0, ".....find need reconnect when read packet.......");

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_13, P_INFO, 0, "...start tcp disconnect ..");

+                mqttClient.ipstack->disconnect(mqttClient.ipstack);

+                

+                //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_14, P_INFO, 0, "...start tcp connect ...");

+                if ((NetworkSetConnTimeout(mqttClient.ipstack, MQTT_SEND_TIMEOUT, MQTT_RECV_TIMEOUT)) != 0)

+                {

+                    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_15, P_INFO, 0, "...tcp socket set timeout fail...");

+                }

+                else

+                {

+                    //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_16, P_INFO, 0, "...tcp connect ok...");

+                    mqttClient.isconnected = 0;

+                    if((NetworkConnect(mqttClient.ipstack, MQTT_SERVER_URI, MQTT_SERVER_PORT)) < 0)

+                    {

+                        //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_17, P_INFO, 0, "...tcp reconnect fail!!!...\r\n");

+                    }

+                    else

+                    {

+                        //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_18, P_INFO, 0, "...start mqtt connect ..");

+

+                        if ((MQTTConnect(&mqttClient, &connectData)) != 0)

+                        {

+                            //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_19, P_INFO, 0, "...mqtt reconnect fial!!!...");

+                        }

+                        else

+                        {

+                            //ECOMM_TRACE(UNILOG_MQTT, mqttSendTask_20, P_INFO, 0, "...mqtt reconnect ok!!!...");

+                        }

+                    }

+                }

+                MutexUnlock(&mqttMutex1);

+                break;

+            }

+    }

+}

+

+void app_mqtt_demo_task(void *argument)

+{

+    int msgType = 1;

+    int payloadLen = 0;

+    mqttSendMsg mqttMsg;

+    mqttDataMsg mqttMessage;

+    int ret = FAILURE;

+    

+    /*init driver*/

+

+    /*start mqtt send task*/

+    ret = mqtt_demo_send_task_init();

+    if(ret == FAILURE)

+    {

+        ;

+    }

+    while(1)

+    {

+        if(mqtt_send_task_status_flag == 1)

+        {

+            break;

+        }

+        osDelay(4000);

+    }

+    

+    /*state machine*/

+    while(1)

+    {

+        /*read data*/

+

+        osDelay(4000);

+

+        /*send msg to mqtt send task, and wait for excute result*/

+        //ECOMM_TRACE(UNILOG_MQTT, appMqttTask_0, P_SIG, 0, "appMqttTask...send start.....");

+        memset(&mqttMsg, 0, sizeof(mqttSendMsg));

+        mqttMsg.cmdType = MQTT_DEMO_MSG_PUBLISH;

+

+        mqttMsg.topic = malloc(128);

+        memset(mqttMsg.topic, 0, 128);

+        memcpy(mqttMsg.topic, "$dp", strlen("$dp"));        

+        mqttMsg.message.qos = QOS0;

+        mqttMsg.message.retained = 0;

+        mqttMsg.message.id = 0;

+        mqttMsg.message.payload = malloc(32);

+        memset(mqttMsg.message.payload, 0, 32);

+        memcpy(mqttMsg.message.payload, "{\"data\":90}", strlen("{\"data\":90}"));

+        

+        sprintf(mqttMsg.message.payload, "%c%c%c%s",msgType, msgType, msgType, "{\"data\":90}");

+        payloadLen = strlen(mqttMsg.message.payload);

+        unsigned char *ptr = (unsigned char *)mqttMsg.message.payload;

+        writeChar(&ptr,3);

+        writeInt(&ptr,strlen("{\"data\":90}"));

+        mqttMsg.message.payloadlen = payloadLen;

+

+        osMessageQueuePut(mqttSendMsgHandle, &mqttMsg, 0, (2*MQTT_MSG_TIMEOUT));

+        

+        osMessageQueueGet(appMqttMsgHandle, &mqttMessage, 0, cmsisMAX_DELAY);

+        if(mqttMessage.cmdType == MQTT_DEMO_MSG_PUBLISH_ACK)

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, appMqttTask_1, P_SIG, 0, "appMqttTask...send ok.....");

+        }

+        else

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, appMqttTask_2, P_SIG, 0, "appMqttTask...send fail.....");

+        }

+    }

+}

+

+int mqtt_demo_recv_task_init(void)

+{

+    osThreadAttr_t task_attr;

+

+    memset(&task_attr, 0, sizeof(task_attr));

+    task_attr.name = "mqttRecv";

+#ifdef MBTK_OPENCPU_SUPPORT

+    task_attr.stack_size = MQTT_RECV_DEMO_TASK_STACK_SIZE;

+#else

+    task_attr.stack_size = MQTT_DEMO_TASK_STACK_SIZE;

+#endif

+    #if defined FEATURE_LITEOS_ENABLE

+    task_attr.priority = osPriorityBelowNormal4;

+    #elif defined FEATURE_FREERTOS_ENABLE

+    task_attr.priority = osPriorityBelowNormal7;

+    #endif

+

+    mqttRecvTaskHandle = osThreadNew(MQTTRun, NULL,&task_attr);

+    if(mqttRecvTaskHandle == NULL)

+    {

+        return FAILURE;

+    }

+

+    return SUCCESS;

+}

+

+int mqtt_demo_send_task_init(void)

+{

+    osThreadAttr_t task_attr;

+    

+    memset(&task_attr, 0, sizeof(task_attr));

+    task_attr.name = "mqttSend";

+    task_attr.stack_size = MQTT_DEMO_TASK_STACK_SIZE;

+    #if defined FEATURE_LITEOS_ENABLE

+    task_attr.priority = osPriorityBelowNormal3;

+    #elif defined FEATURE_FREERTOS_ENABLE

+    task_attr.priority = osPriorityBelowNormal6;

+    #endif

+    mqttSendTaskHandle = osThreadNew(mqtt_demo_send_task, NULL,&task_attr);

+    if(mqttSendTaskHandle == NULL)

+    {

+        return FAILURE;

+    }

+

+    return SUCCESS;

+}

+

+int app_mqtt_demo_task_init(void)

+{

+    osThreadAttr_t task_attr;

+

+    if(mqttSendMsgHandle == NULL)

+    {

+        mqttSendMsgHandle = osMessageQueueNew(16, sizeof(mqttSendMsg), NULL);

+    }

+    

+    if(appMqttMsgHandle == NULL)

+    {

+        appMqttMsgHandle = osMessageQueueNew(16, sizeof(mqttDataMsg), NULL);

+    }

+    

+    if(mqttMutex1.sem == NULL)

+    {

+        MutexInit(&mqttMutex1);

+    }

+

+    memset(&task_attr, 0, sizeof(task_attr));

+    task_attr.name = "appTask";

+    task_attr.stack_size = MQTT_DEMO_TASK_STACK_SIZE;

+    #if defined FEATURE_LITEOS_ENABLE

+    task_attr.priority = osPriorityBelowNormal2;

+    #elif defined FEATURE_FREERTOS_ENABLE

+    task_attr.priority = osPriorityBelowNormal5;

+    #endif

+    appMqttTaskHandle = osThreadNew(app_mqtt_demo_task, NULL,&task_attr);

+    if(appMqttTaskHandle == NULL)

+    {

+        return FAILURE;

+    }

+

+    return SUCCESS;

+}

+

+

diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.c b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.c
new file mode 100755
index 0000000..baa02dc
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.c
@@ -0,0 +1,166 @@
+/*******************************************************************************

+ * Copyright (c) 2014, 2017 IBM Corp.

+ *

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Eclipse Distribution License v1.0 which accompany this distribution.

+ *

+ * The Eclipse Public License is available at

+ *    http://www.eclipse.org/legal/epl-v10.html

+ * and the Eclipse Distribution License is available at

+ *   http://www.eclipse.org/org/documents/edl-v10.php.

+ *

+ * Contributors:

+ *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation

+ *    Ian Craggs - return codes from linux_read

+ *******************************************************************************/

+

+#include "MQTTLinux.h"

+

+void TimerInit(Timer* timer)

+{

+	timer->end_time = (struct timeval){0, 0};

+}

+

+char TimerIsExpired(Timer* timer)

+{

+	struct timeval now, res;

+	gettimeofday(&now, NULL);

+	timersub(&timer->end_time, &now, &res);

+	return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);

+}

+

+

+void TimerCountdownMS(Timer* timer, unsigned int timeout)

+{

+	struct timeval now;

+	gettimeofday(&now, NULL);

+	struct timeval interval = {timeout / 1000, (timeout % 1000) * 1000};

+	timeradd(&now, &interval, &timer->end_time);

+}

+

+

+void TimerCountdown(Timer* timer, unsigned int timeout)

+{

+	struct timeval now;

+	gettimeofday(&now, NULL);

+	struct timeval interval = {timeout, 0};

+	timeradd(&now, &interval, &timer->end_time);

+}

+

+

+int TimerLeftMS(Timer* timer)

+{

+	struct timeval now, res;

+	gettimeofday(&now, NULL);

+	timersub(&timer->end_time, &now, &res);

+	//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);

+	return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;

+}

+

+

+int linux_read(Network* n, unsigned char* buffer, int len, int timeout_ms)

+{

+	struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};

+	if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))

+	{

+		interval.tv_sec = 0;

+		interval.tv_usec = 100;

+	}

+

+	setsockopt(n->my_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));

+

+	int bytes = 0;

+	while (bytes < len)

+	{

+		int rc = recv(n->my_socket, &buffer[bytes], (size_t)(len - bytes), 0);

+		if (rc == -1)

+		{

+			if (errno != EAGAIN && errno != EWOULDBLOCK)

+			  bytes = -1;

+			break;

+		}

+		else if (rc == 0)

+		{

+			bytes = 0;

+			break;

+		}

+		else

+			bytes += rc;

+	}

+	return bytes;

+}

+

+

+int linux_write(Network* n, unsigned char* buffer, int len, int timeout_ms)

+{

+	struct timeval tv;

+

+	tv.tv_sec = 0;  /* 30 Secs Timeout */

+	tv.tv_usec = timeout_ms * 1000;  // Not init'ing this can cause strange errors

+

+	setsockopt(n->my_socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));

+	int	rc = write(n->my_socket, buffer, len);

+	return rc;

+}

+

+

+void NetworkInit(Network* n)

+{

+	n->my_socket = 0;

+	n->mqttread = linux_read;

+	n->mqttwrite = linux_write;

+}

+

+

+int NetworkConnect(Network* n, char* addr, int port)

+{

+	int type = SOCK_STREAM;

+	struct sockaddr_in address;

+	int rc = -1;

+	sa_family_t family = AF_INET;

+	struct addrinfo *result = NULL;

+	struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};

+

+	if ((rc = getaddrinfo(addr, NULL, &hints, &result)) == 0)

+	{

+		struct addrinfo* res = result;

+

+		/* prefer ip4 addresses */

+		while (res)

+		{

+			if (res->ai_family == AF_INET)

+			{

+				result = res;

+				break;

+			}

+			res = res->ai_next;

+		}

+

+		if (result->ai_family == AF_INET)

+		{

+			address.sin_port = htons(port);

+			address.sin_family = family = AF_INET;

+			address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;

+		}

+		else

+			rc = -1;

+

+		freeaddrinfo(result);

+	}

+

+	if (rc == 0)

+	{

+		n->my_socket = socket(family, type, 0);

+		if (n->my_socket != -1)

+			rc = connect(n->my_socket, (struct sockaddr*)&address, sizeof(address));

+	}

+

+	return rc;

+}

+

+

+void NetworkDisconnect(Network* n)

+{

+	close(n->my_socket);

+}

diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.o b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.o
new file mode 100755
index 0000000..a08962c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTLinux.o
Binary files differ
diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTTls.c b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTTls.c
new file mode 100755
index 0000000..c53c1da
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTTls.c
@@ -0,0 +1,637 @@
+

+#include "sha1.h"

+#include "sha256.h"

+#include "md5.h"

+//#include DEBUG_LOG_HEADER_FILE

+

+#include "MQTTTls.h"

+#include "MQTTLinux.h"

+#include "error.h"

+#include <sys/socket.h>

+

+

+int mqttSslRandom(void *p_rng, unsigned char *output, size_t output_len)

+{

+    uint32_t rnglen = output_len;

+    uint8_t   rngoffset = 0;

+

+    while (rnglen > 0) 

+    {

+        *(output + rngoffset) = (unsigned char)rand();

+        rngoffset++;

+        rnglen--;

+    }

+    return 0;

+}

+

+static void mqttSslDebug(void *ctx, int level, const char *file, int line, const char *str)

+{

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttTls_00, P_INFO, "%s(%d):%s", file, line, str);

+

+//    DBG("%s", str);

+}

+

+int mqttSslNonblockRecv(void *netContext, uint8_t *buf, size_t len)

+{

+    int ret;

+    int fd = ((mbedtls_net_context *)netContext)->fd;

+    

+    if(fd < 0)

+    {

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+    

+    ret = (int)recv(fd, buf, len, MSG_DONTWAIT);

+    if(ret<0)

+    {

+        if( errno == EPIPE || errno == ECONNRESET) 

+        {

+            return (MBEDTLS_ERR_NET_CONN_RESET);

+        }

+        

+        if( errno == EINTR ) 

+        {

+            return (MBEDTLS_ERR_SSL_WANT_READ);

+        }

+        

+        if(ret == -1 && errno == EWOULDBLOCK) 

+        {

+            return ret;

+        }

+        return (MBEDTLS_ERR_NET_RECV_FAILED);

+    }

+    return (ret);

+}

+extern void mbedtls_debug_set_threshold( int threshold );

+

+int mqttSslConn_new(mqttsClientContext* context, char* host)

+{

+    int value;

+    mqttsClientSsl *ssl;

+    const char *custom = "mqtts";

+    char port[10] = {0};

+    int authmode = MBEDTLS_SSL_VERIFY_NONE;

+    uint32_t flag;

+    

+    //ECPLAT_PRINTF(UNILOG_HTTP, sslMEM_2, P_INFO, "before ssl context malloc:%d", xBytesTaskMalloced);

+    context->ssl = malloc(sizeof(mqttsClientSsl));

+    ssl = context->ssl;

+    

+    /*

+     * 0. Initialize the RNG and the session data

+     */

+#if defined(MBEDTLS_DEBUG_C)

+    mbedtls_debug_set_threshold((int)2);

+#endif

+    mbedtls_net_init(&ssl->netContext);

+    mbedtls_ssl_init(&ssl->sslContext);

+    mbedtls_ssl_config_init(&ssl->sslConfig);

+    mbedtls_x509_crt_init(&ssl->caCert);

+    mbedtls_x509_crt_init(&ssl->clientCert);

+    mbedtls_pk_init(&ssl->pkContext);

+    mbedtls_ctr_drbg_init(&ssl->ctrDrbgContext);

+    mbedtls_entropy_init(&ssl->entropyContext);

+

+    if((value = mbedtls_ctr_drbg_seed(&ssl->ctrDrbgContext,

+                             mbedtls_entropy_func,

+                             &ssl->entropyContext,

+                             (const unsigned char*)custom,

+                             strlen(custom))) != 0) {

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_0, P_INFO, "mbedtls_ctr_drbg_seed failed, value:-0x%x.", -value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+    //ECPLAT_PRINTF(UNILOG_HTTP, sslMEM_3, P_INFO, "after ssl init:%d", xBytesTaskMalloced);

+    /*

+     * 0. Initialize certificates

+     */

+    if(context->seclevel != 0){

+        if (NULL != context->caCert) {

+            //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_1, P_INFO, "STEP 0. Loading the CA root certificate ...");

+            authmode = MBEDTLS_SSL_VERIFY_REQUIRED;

+            if (0 != (value = mbedtls_x509_crt_parse(&(ssl->caCert), (const unsigned char *)context->caCert, context->caCertLen))) {

+                //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_2, P_INFO, "failed ! value:-0x%x", -value);

+                //return MQTT_MBEDTLS_ERR;

+                return -1;

+            }

+        }

+    }

+    //ECPLAT_PRINTF(UNILOG_HTTP, sslMEM_4, P_INFO, "after ca cert parse:%d", xBytesTaskMalloced);

+    /* Setup Client Cert/Key */

+    if(context->seclevel == 2){

+        if (context->clientCert != NULL && context->clientPk != NULL) {

+            //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_3, P_INFO, "STEP 0. start prepare client cert ...");

+            value = mbedtls_x509_crt_parse(&(ssl->clientCert), (const unsigned char *) context->clientCert, context->clientCertLen);

+            if (value != 0) {

+                //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_4, P_INFO, "failed!  mbedtls_x509_crt_parse returned -0x%x\n", -value);

+                //return MQTT_MBEDTLS_ERR;

+                return -1;

+            }

+

+            //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_5, P_INFO, "context->clientPkLen=%d", context->clientPkLen);

+            

+            

+            value = mbedtls_pk_parse_key(&ssl->pkContext, (const unsigned char *) context->clientPk, context->clientPkLen, NULL, 0);

+    

+            if (value != 0) {

+                //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_6, P_INFO, "failed !  mbedtls_pk_parse_key returned -0x%x\n", -value);

+                //return MQTT_MBEDTLS_ERR;

+                return -1;

+            }

+        }

+    }

+    if(context->seclevel == 0){

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_7, P_INFO, "user set verify none");

+        authmode = MBEDTLS_SSL_VERIFY_NONE;

+    }

+    //ali mqtts is psk tls

+    if((context->psk_key != NULL)&&(context->psk_identity != NULL))

+    {

+        mbedtls_ssl_conf_psk(&ssl->sslConfig, (const unsigned char *)context->psk_key, strlen(context->psk_key),

+                             (const unsigned char *)context->psk_identity, strlen(context->psk_identity));

+    }

+    

+    /*

+     * 1. Start the connection

+     */

+    snprintf(port, sizeof(port), "%d", context->port);

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_8_0, P_INFO, "STEP 1. host:%s", host);

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_8_1, P_INFO, "STEP 1. Connecting to PORT:%d",context->port);

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_8_2, P_INFO, "STEP 1. port:%s", port);

+    if (0 != (value = mbedtls_net_connect(&ssl->netContext, host, port, MBEDTLS_NET_PROTO_TCP, 1))) {

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_9, P_INFO, " failed ! mbedtls_net_connect returned -0x%x", -value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+

+    

+    /*

+     * 2. Setup stuff

+     */

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_10, P_INFO, "STEP 2. Setting up the SSL/TLS structure...");

+    if ((value = mbedtls_ssl_config_defaults(&(ssl->sslConfig), MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM,

+                                           MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_11, P_INFO, " failed! mbedtls_ssl_config_defaults returned -0x%x", -value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+

+    //ECPLAT_PRINTF(UNILOG_HTTP, sslMEM_6, P_INFO, "after net connect:%d", xBytesTaskMalloced);

+    mbedtls_ssl_conf_max_version(&ssl->sslConfig, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);

+    mbedtls_ssl_conf_min_version(&ssl->sslConfig, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);

+

+    memcpy(&(ssl->crtProfile), ssl->sslConfig.cert_profile, sizeof(mbedtls_x509_crt_profile));

+    mbedtls_ssl_conf_authmode(&(ssl->sslConfig), authmode);

+

+#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)

+    if ((value = mbedtls_ssl_conf_max_frag_len(&(ssl->sslConfig), MBEDTLS_SSL_MAX_FRAG_LEN_4096)) != 0) {

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_12, P_INFO, " mbedtls_ssl_conf_max_frag_len returned -0x%x", -value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+#endif

+

+#if defined(MBEDTLS_X509_CRT_PARSE_C)

+    mbedtls_ssl_conf_cert_profile(&ssl->sslConfig, &ssl->crtProfile);

+    mbedtls_ssl_conf_ca_chain(&(ssl->sslConfig), &(ssl->caCert), NULL);

+    if(context->clientCert) {

+        if ((value = mbedtls_ssl_conf_own_cert(&(ssl->sslConfig), &(ssl->clientCert), &(ssl->pkContext))) != 0) {

+            //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_13, P_INFO, "  failed! mbedtls_ssl_conf_own_cert returned -0x%x", -value);

+            //return MQTT_MBEDTLS_ERR;

+            return -1;

+        }

+    }

+#endif

+

+    if(context->ciphersuite[0] != 0xFFFF){

+        mbedtls_ssl_conf_ciphersuites(&(ssl->sslConfig), (const int *)(context->ciphersuite));

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_14, P_INFO, "conf ciphersuite 0x%x", context->ciphersuite[0]);

+    }

+

+    mbedtls_ssl_conf_rng(&(ssl->sslConfig), mqttSslRandom, &(ssl->ctrDrbgContext));

+    mbedtls_ssl_conf_dbg(&(ssl->sslConfig), mqttSslDebug, NULL);

+

+#if defined(MBEDTLS_SSL_ALPN)

+    const char *alpn_list[] = { "http/1.1", NULL };

+    mbedtls_ssl_conf_alpn_protocols(&(ssl->sslConfig),alpn_list);

+#endif

+

+    if(context->timeout_r > 0) {

+        uint32_t recvTimeout;

+        recvTimeout = context->timeout_r > MQTT_MAX_TIMEOUT ? MQTT_MAX_TIMEOUT * 1000 : context->timeout_r * 1000;

+        mbedtls_ssl_conf_read_timeout(&(ssl->sslConfig), recvTimeout);

+    }

+    //ECPLAT_PRINTF(UNILOG_HTTP, sslMEM_7, P_INFO, "before ssl setup:%d", xBytesTaskMalloced);

+    if ((value = mbedtls_ssl_setup(&(ssl->sslContext), &(ssl->sslConfig))) != 0) {

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_15, P_INFO, " failed! mbedtls_ssl_setup returned -0x%x", -value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+    if(context->hostName != NULL)

+    {

+        mbedtls_ssl_set_hostname(&(ssl->sslContext), context->hostName);

+    }

+    else

+    {

+        mbedtls_ssl_set_hostname(&(ssl->sslContext), host);

+    }

+    mbedtls_ssl_set_bio(&(ssl->sslContext), &(ssl->netContext), (mbedtls_ssl_send_t*)mbedtls_net_send, (mbedtls_ssl_recv_t*)mbedtls_net_recv, (mbedtls_ssl_recv_timeout_t*)mbedtls_net_recv_timeout);

+    

+

+    /*

+     * 3. Handshake

+     */

+    //ECPLAT_PRINTF(UNILOG_HTTP, sslMEM_8, P_INFO, "after ssl setup before handshake:%d", xBytesTaskMalloced);

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_16, P_INFO, "STEP 3. Performing the SSL/TLS handshake...");

+    

+    while ((value = mbedtls_ssl_handshake(&(ssl->sslContext))) != 0) {

+        if ((value != MBEDTLS_ERR_SSL_WANT_READ) && (value != MBEDTLS_ERR_SSL_WANT_WRITE)) {

+            //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_17, P_INFO, "failed  ! mbedtls_ssl_handshake returned -0x%x", -value);

+            //return MQTT_MBEDTLS_ERR;

+            return -1;

+        }

+    }

+    //ECPLAT_PRINTF(UNILOG_HTTP, sslMEM_9, P_INFO, "after handshake:%d", xBytesTaskMalloced);

+

+    /*

+     * 4. Verify the server certificate

+     */

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_18, P_INFO, "STEP 4. Verifying peer X.509 certificate..");

+    flag = mbedtls_ssl_get_verify_result(&(ssl->sslContext));

+    if (flag != 0) {

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_19, P_INFO, " failed  ! verify result not confirmed.");

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+    //ECPLAT_PRINTF(UNILOG_MQTT, mqttTlsConn_20, P_INFO, "caCert varification ok");

+

+    //return MQTT_CONN_OK;

+    return 0;

+}

+

+int mqttSslConn_old(mqttsClientContext* context, char* host)

+{

+    int32_t value;

+    mqttsClientSsl *ssl;

+    const char *custom = "mqtts";

+    char port[10] = {0};

+    int32_t authmode = MBEDTLS_SSL_VERIFY_NONE;

+    uint32_t flag;

+    

+    context->ssl = malloc(sizeof(mqttsClientSsl));

+    ssl = context->ssl;

+    

+    /*

+     * 0. Initialize the RNG and the session data

+     */

+#if defined(MBEDTLS_DEBUG_C)

+    mbedtls_debug_set_threshold((int)2);

+#endif

+    mbedtls_net_init(&ssl->netContext);

+    mbedtls_ssl_init(&ssl->sslContext);

+    mbedtls_ssl_config_init(&ssl->sslConfig);

+    mbedtls_x509_crt_init(&ssl->caCert);

+    mbedtls_x509_crt_init(&ssl->clientCert);

+    mbedtls_pk_init(&ssl->pkContext);

+    mbedtls_ctr_drbg_init(&ssl->ctrDrbgContext);

+    mbedtls_entropy_init(&ssl->entropyContext);

+    if((context->psk_key != NULL)&&(context->psk_identity != NULL))

+    {

+        mbedtls_ssl_conf_psk(&ssl->sslConfig, (const unsigned char *)context->psk_key, strlen(context->psk_key),

+                             (const unsigned char *)context->psk_identity, strlen(context->psk_identity));

+    }

+    if((value = mbedtls_ctr_drbg_seed(&ssl->ctrDrbgContext,

+                             mbedtls_entropy_func,

+                             &ssl->entropyContext,

+                             (const unsigned char*)custom,

+                             strlen(custom))) != 0) 

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_0, P_SIG, 1, "mbedtls_ctr_drbg_seed failed, value:-0x%x.", -value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+

+    /*

+     * 0. Initialize certificates

+     */

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_1, P_SIG, 0, "STEP 0. Loading the CA root certificate ...");

+    if (NULL != context->caCert) 

+    {

+        //authmode = MBEDTLS_SSL_VERIFY_REQUIRED;

+        if (0 != (value = mbedtls_x509_crt_parse(&(ssl->caCert), (const unsigned char *)context->caCert, context->caCertLen))) 

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_2, P_SIG, 1, "failed ! value:-0x%x", -value);

+            //return MQTT_MBEDTLS_ERR;

+            return -1;

+        }

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_3, P_SIG, 1, " ok (%d skipped)", value);

+    }

+

+    /* Setup Client Cert/Key */

+    if (context->clientCert != NULL && context->clientPk != NULL) 

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_4, P_SIG, 0, "STEP 0. start prepare client cert ...");

+        value = mbedtls_x509_crt_parse(&(ssl->clientCert), (const unsigned char *) context->clientCert, context->clientCertLen);

+        if (value != 0) 

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_5, P_SIG, 1, " failed!  mbedtls_x509_crt_parse returned -0x%x\n", -value);

+            //return MQTT_MBEDTLS_ERR;

+            return -1;

+        }

+

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_6, P_SIG, 1, "STEP 0. start mbedtls_pk_parse_key[%s]", context->clientPk);

+        value = mbedtls_pk_parse_key(&ssl->pkContext, (const unsigned char *) context->clientPk, context->clientPkLen, NULL, 0);

+        if (value != 0) 

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_7, P_SIG, 1, " failed\n  !  mbedtls_pk_parse_key returned -0x%x\n", -value);

+            //return MQTT_MBEDTLS_ERR;

+            return -1;

+        }

+    }

+   

+    /*

+     * 1. Start the connection

+     */

+    snprintf(port, sizeof(port), "%d", context->port);

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_8, P_SIG, 2, "STEP 1. Connecting to /%s/%s...", host, port);

+    if (0 != (value = mbedtls_net_connect(&ssl->netContext, host, port, MBEDTLS_NET_PROTO_TCP, 1))) 

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_9, P_SIG, 1, " failed ! mbedtls_net_connect returned -0x%x", -value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_10, P_SIG, 0, " ok");

+    

+    /*

+     * 2. Setup stuff

+     */

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_11, P_SIG, 0, "STEP 2. Setting up the SSL/TLS structure...");

+    if ((value = mbedtls_ssl_config_defaults(&(ssl->sslConfig), MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM,

+                                           MBEDTLS_SSL_PRESET_DEFAULT)) != 0) 

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_12, P_SIG, 1, " failed! mbedtls_ssl_config_defaults returned %d", value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+

+    mbedtls_ssl_conf_max_version(&ssl->sslConfig, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);

+    mbedtls_ssl_conf_min_version(&ssl->sslConfig, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);

+

+    memcpy(&(ssl->crtProfile), ssl->sslConfig.cert_profile, sizeof(mbedtls_x509_crt_profile));

+    mbedtls_ssl_conf_authmode(&(ssl->sslConfig), authmode);

+

+#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)

+    if ((mbedtls_ssl_conf_max_frag_len(&(ssl->sslConfig), MBEDTLS_SSL_MAX_FRAG_LEN_1024)) != 0) 

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_13, P_SIG, 0, "mbedtls_ssl_conf_max_frag_len returned\r\n");       

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+#endif

+

+#if defined(MBEDTLS_X509_CRT_PARSE_C)

+    mbedtls_ssl_conf_cert_profile(&ssl->sslConfig, &ssl->crtProfile);

+    mbedtls_ssl_conf_ca_chain(&(ssl->sslConfig), &(ssl->caCert), NULL);

+    if(context->clientCert) 

+    {

+        if ((value = mbedtls_ssl_conf_own_cert(&(ssl->sslConfig), &(ssl->clientCert), &(ssl->pkContext))) != 0) 

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_14, P_SIG, 1, " failed\n  ! mbedtls_ssl_conf_own_cert returned %d\n", value);  

+            //return MQTT_MBEDTLS_ERR;

+            return -1;

+        }

+    }

+#endif

+

+    if(context->ciphersuite[0] != 0xFFFF){

+        mbedtls_ssl_conf_ciphersuites(&(ssl->sslConfig), (const int *)(context->ciphersuite));

+        //ECPLAT_PRINTF(UNILOG_MQTT, mqttTls_14_1, P_INFO, "conf ciphersuite 0x%x", context->ciphersuite[0]);

+    }

+

+    mbedtls_ssl_conf_rng(&(ssl->sslConfig), mqttSslRandom, &(ssl->ctrDrbgContext));

+    mbedtls_ssl_conf_dbg(&(ssl->sslConfig), mqttSslDebug, NULL);

+

+    if(context->timeout_r > 0) 

+    {

+        uint32_t recvTimeout;

+        recvTimeout = context->timeout_r > MQTT_MAX_TIMEOUT ? MQTT_MAX_TIMEOUT * 1000 : context->timeout_r * 1000;

+        mbedtls_ssl_conf_read_timeout(&(ssl->sslConfig), recvTimeout);

+    }

+    if ((value = mbedtls_ssl_setup(&(ssl->sslContext), &(ssl->sslConfig))) != 0) 

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_15, P_SIG, 1, "failed! mbedtls_ssl_setup returned %d", value);

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+    

+    if(context->hostName != NULL)

+    {

+        mbedtls_ssl_set_hostname(&(ssl->sslContext), context->hostName);

+        //mbedtls_ssl_set_hostname(&(ssl->sslContext), "OneNET MQTTS");

+    }

+    else

+    {

+        mbedtls_ssl_set_hostname(&(ssl->sslContext), host);

+    }

+    

+    mbedtls_ssl_set_bio(&(ssl->sslContext), &(ssl->netContext), mbedtls_net_send, mbedtls_net_recv, mbedtls_net_recv_timeout);

+    

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_16, P_SIG, 0, " ok");

+

+    /*

+     * 3. Handshake

+     */

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_17, P_SIG, 0, "STEP 3. Performing the SSL/TLS handshake...");    

+    while ((value = mbedtls_ssl_handshake(&(ssl->sslContext))) != 0) 

+    {

+        if ((value != MBEDTLS_ERR_SSL_WANT_READ) && (value != MBEDTLS_ERR_SSL_WANT_WRITE)) 

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_18, P_SIG, 1, "failed  ! mbedtls_ssl_handshake returned -0x%x\n", -value);

+            //return MQTT_MBEDTLS_ERR;

+            return -1;

+        }

+    }

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_19, P_SIG, 0, " ok");

+

+    /*

+     * 4. Verify the server certificate

+     */

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_20, P_SIG, 0, "STEP 4. Verifying peer X.509 certificate..");

+    flag = mbedtls_ssl_get_verify_result(&(ssl->sslContext));

+    if (flag != 0) 

+    {

+        //ECOMM_TRACE(UNILOG_MQTT, mqttTls_21, P_SIG, 0, " failed  ! verify result not confirmed.");

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+    }

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_22, P_SIG, 0, "caCert varification ok");

+

+    //return MQTT_CONN_OK;

+    return 0;

+}

+

+//INT32 mqttSslSend(mbedtls_ssl_context* sslContext, const char* buf, UINT16 len)

+int mqttSslSend(mqttsClientContext* context, unsigned char* buf, int len)

+{

+    int32_t waitToSend = len;

+    int32_t hasSend = 0;

+

+    do

+    {

+        hasSend = mbedtls_ssl_write(&(context->ssl->sslContext), (unsigned char *)(buf + len - waitToSend), waitToSend);

+        if(hasSend > 0)

+        {

+            waitToSend -= hasSend;

+        }

+        else if(hasSend == 0)

+        {

+            //return MQTT_CONN_OK;

+            return 0;

+        }

+        else

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_23, P_SIG, 0, "mqtt_client(ssl): send failed \n");

+            //return MQTT_CONN;

+            return 1;

+        }

+    }while(waitToSend>0);

+

+    //return MQTT_CONN_OK;

+    return 0;

+}

+

+int mqttSslRecv(mqttsClientContext* context, unsigned char* buf, int minLen, int maxLen, int* pReadLen) //0 on success, err code on failure

+{

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_24, P_INFO, 2, "Trying to read between %d and %d bytes", minLen, maxLen);

+    int32_t readLen = 0;

+    int32_t ret;

+    

+    while (readLen < maxLen) 

+    {

+        mqttsClientSsl *ssl = (mqttsClientSsl *)context->ssl;

+        if (readLen < minLen) 

+        {

+            mbedtls_ssl_set_bio(&(ssl->sslContext), &(ssl->netContext), mbedtls_net_send, mbedtls_net_recv, NULL);

+            ret = mbedtls_ssl_read(&(ssl->sslContext), (unsigned char *)(buf+readLen), minLen-readLen);

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_30, P_INFO, 1, "mbedtls_ssl_read [blocking] return:0x%x", ret);

+            if(ret == 0)

+            {

+                //ECOMM_TRACE(UNILOG_MQTT, mqttTls_31, P_INFO, 0, "mbedtls_ssl_read [blocking] return 0 connect error");

+                //return MQTT_CONN;

+                return 1;

+            }

+        } 

+        else 

+        {

+            mbedtls_ssl_set_bio(&(ssl->sslContext), &(ssl->netContext), mbedtls_net_send, mqttSslNonblockRecv, NULL);

+            ret = mbedtls_ssl_read(&(ssl->sslContext), (unsigned char*)(buf+readLen), maxLen-readLen);

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_32, P_INFO, 1, "mbedtls_ssl_read [not blocking] return:0x%x", ret);

+            if(ret == -1 && errno == EWOULDBLOCK) 

+            {

+                //ECOMM_TRACE(UNILOG_MQTT, mqttTls_33, P_INFO, 0, "mbedtls_ssl_read [not blocking] errno == EWOULDBLOCK");

+                break;

+            }

+        }

+        if(ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY)

+        {

+            //return MQTT_CLOSED;

+            return 2;

+        }

+

+        if (ret > 0) 

+        {

+            readLen += ret;

+        } 

+        else if ( ret == 0 ) 

+        {

+            break;

+        } 

+        else 

+        {

+            //ECOMM_TRACE(UNILOG_MQTT, mqttTls_34, P_INFO, 1, "Connection error (recv returned %d)", ret);

+            *pReadLen = readLen;

+            //return MQTT_CONN;

+            return 1;

+        }

+    }

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_35, P_INFO, 1, "Read %d bytes", readLen);

+    buf[readLen] = '\0';    // DS makes it easier to see what's new.

+    *pReadLen = readLen;

+    //return MQTT_CONN_OK;

+    return 0;

+}

+

+int mqttSslRead(mqttsClientContext* context, unsigned char *buffer, int len, int timeout_ms)

+{

+    uint32_t          readLen = 0;

+    static int      net_status = 0;

+    int32_t             ret = -1;

+    char            err_str[33];

+    mqttsClientSsl *ssl = (mqttsClientSsl *)context->ssl;

+

+    mbedtls_ssl_conf_read_timeout(&(ssl->sslConfig), timeout_ms);

+    while (readLen < len) {

+        ret = mbedtls_ssl_read(&(ssl->sslContext), (unsigned char *)(buffer + readLen), (len - readLen));

+        if (ret > 0) {

+            readLen += ret;

+            net_status = 0;

+        } else if (ret == 0) {

+            /* if ret is 0 and net_status is -2, indicate the connection is closed during last call */

+            net_status = -2;

+            return -2;//(net_status == -2) ? net_status : readLen;

+        } else {

+            if (MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY == ret) {

+                //mbedtls_strerror(ret, err_str, sizeof(err_str));

+                printf("ssl recv error: code = -0x%04X, err_str = '%s'\n", -ret, err_str);

+                net_status = -2; /* connection is closed */

+                break;

+            } else if ((MBEDTLS_ERR_SSL_TIMEOUT == ret)

+                       || (MBEDTLS_ERR_SSL_CONN_EOF == ret)

+                       || (MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED == ret)

+                       || (MBEDTLS_ERR_SSL_NON_FATAL == ret)) {

+                /* read already complete */

+                /* if call mbedtls_ssl_read again, it will return 0 (means EOF) */

+

+                return readLen;

+            } else {

+                //mbedtls_strerror(ret, err_str, sizeof(err_str));

+                printf("ssl recv error: code = -0x%04X, err_str = '%s'\n", -ret, err_str);

+                net_status = -1;

+                return -1; /* Connection error */

+            }

+        }

+    }

+

+    return (readLen > 0) ? readLen : net_status;

+}

+

+int mqttSslClose(mqttsClientContext* context)

+{

+    mqttsClientSsl *ssl = (mqttsClientSsl *)context->ssl;

+    /*context->clientCert = NULL;

+    context->caCert = NULL;

+    context->clientPk = NULL; let up level free it*/

+    if(ssl == NULL)

+        //return MQTT_MBEDTLS_ERR;

+        return -1;

+

+    mbedtls_ssl_close_notify(&(ssl->sslContext));

+    mbedtls_net_free(&(ssl->netContext));

+    mbedtls_x509_crt_free(&(ssl->caCert));

+    mbedtls_x509_crt_free(&(ssl->clientCert));

+    mbedtls_pk_free(&(ssl->pkContext));

+    mbedtls_ssl_free(&(ssl->sslContext));

+    mbedtls_ssl_config_free(&(ssl->sslConfig));

+    mbedtls_ctr_drbg_free(&(ssl->ctrDrbgContext));

+    mbedtls_entropy_free(&(ssl->entropyContext));

+

+    free(ssl);

+    context->ssl = NULL;

+

+    //ECOMM_TRACE(UNILOG_MQTT, mqttTls_36, P_INFO, 0, "mqtt tls close ok");

+    //return MQTT_CONN_OK;

+    return 0;

+}

+

+ 

diff --git a/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTTls.o b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTTls.o
new file mode 100755
index 0000000..6c17101
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/libpaho-embed-mqtt/src/MQTTTls.o
Binary files differ
diff --git a/lynq/MD310EU/ap/app/dmp-test/util/util_sha256.c b/lynq/MD310EU/ap/app/dmp-test/util/util_sha256.c
new file mode 100755
index 0000000..636f170
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/util/util_sha256.c
@@ -0,0 +1,215 @@
+/*******************************************************************************

+* Author		  :  author

+* Version		  :  V1.0

+* Date			  :  2021-07-27

+* Description	  :  util_sha256.c

+********************************************************************************/

+

+/********************************* Include File ********************************/

+#include <stdlib.h>

+#include <string.h>

+#include "util_sha256.h"

+

+

+/********************************* Macro Definition ****************************/

+#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)

+#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))	

+#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^  SHR(x, 3))

+#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^  SHR(x,10))

+#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))

+#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))

+

+#define F0(x,y,z) ((x & y) | (z & (x | y)))

+#define F1(x,y,z) (z ^ (x & (y ^ z)))

+

+#define R(t)  (M[t] = S1(M[t-2]) + M[t-7] + S0(M[t-15]) + M[t-16])

+#define P(a,b,c,d,e,f,g,h,x,K)                  \

+			{												\

+				tep = h + S3(e) + F1(e,f,g) + K + x;		\

+				tep1 = S2(a) + F0(a,b,c);					\

+				d += tep; h = tep + tep1;				\

+			}

+

+#ifndef GET_UINT32_BE

+#define GET_UINT32_BE(n,b,i)                            \

+		do {													\

+			(n) = ( (uint32_t) (b)[(i)	  ] << 24 ) 			\

+				  | ( (uint32_t) (b)[(i) + 1] << 16 )			  \

+				  | ( (uint32_t) (b)[(i) + 2] <<  8 )			  \

+				  | ( (uint32_t) (b)[(i) + 3]		);			  \

+		} while( 0 )

+#endif

+

+#ifndef PUT_UINT32_BE

+#define PUT_UINT32_BE(n,b,i)                            \

+    do {                                                    \

+        (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \

+        (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \

+        (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \

+        (b)[(i) + 3] = (unsigned char) ( (n)       );       \

+    } while( 0 )

+#endif

+

+

+/********************************* Type Definition *****************************/
+

+

+/********************************* Variables ***********************************/

+static const uint32_t K[] = {

+    0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,

+    0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,

+    0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,

+    0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,

+    0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,

+    0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,

+    0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,

+    0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,

+    0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,

+    0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,

+    0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,

+    0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,

+    0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,

+    0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,

+    0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,

+    0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,

+};

+

+

+/********************************* Function ************************************/

+void utils_sha256_init(uni_sha256_s *tex)

+{

+    memset(tex, 0, sizeof(uni_sha256_s));

+}

+

+void utils_sha256_starts(uni_sha256_s *tex)

+{

+    int is224 = 0;

+    tex->total[0] = 0;

+    tex->total[1] = 0;

+

+    if (is224 == 0) {

+        tex->state[0] = 0x6A09E667;

+        tex->state[1] = 0xBB67AE85;

+        tex->state[2] = 0x3C6EF372;

+        tex->state[3] = 0xA54FF53A;

+        tex->state[4] = 0x510E527F;

+        tex->state[5] = 0x9B05688C;

+        tex->state[6] = 0x1F83D9AB;

+        tex->state[7] = 0x5BE0CD19;

+    }

+

+    tex->type = is224;

+}

+

+void utils_sha256_process(uni_sha256_s *tex, const unsigned char data[64])

+{

+    unsigned int i;

+    uint32_t B[8],M[64];

+	uint32_t tep,tep1;

+

+    for (i = 0; i < 8; i++) {

+        B[i] = tex->state[i];

+    }

+

+    for (i = 0; i < 64; i++) {

+        if (i < 16) {

+            GET_UINT32_BE(M[i], data, 4 * i);

+        } else {

+            R(i);

+        }

+

+        P(B[0], B[1], B[2], B[3], B[4], B[5], B[6], B[7], M[i], K[i]);

+

+        tep = B[7];

+        B[7] = B[6];

+        B[6] = B[5];

+        B[5] = B[4];

+        B[4] = B[3];

+        B[3] = B[2];

+        B[2] = B[1];

+        B[1] = B[0];

+        B[0] = tep;

+    }

+	

+    for (i = 0; i < 8; i++) {

+        tex->state[i] += B[i];

+    }

+}

+

+void utils_sha256_update(uni_sha256_s *tex, const unsigned char *in, uint32_t in_len)

+{

+    uint32_t left;

+    size_t cov;

+

+    if (in_len == 0) {

+        return;

+    }

+

+    left = tex->total[0] & 0x3F;

+    cov = 64 - left;

+

+    tex->total[0] += (uint32_t) in_len;

+    tex->total[0] &= 0xFFFFFFFF;

+

+    if (tex->total[0] < (uint32_t) in_len) {

+        tex->total[1]++;

+    }

+

+    if (left && in_len >= cov) {

+        memcpy((void *)(tex->buffer + left), in, cov);

+        utils_sha256_process(tex, tex->buffer);

+        in += cov;

+        in_len  -= cov;

+        left = 0;

+    }

+

+    while (in_len >= 64) {

+        utils_sha256_process(tex, in);

+        in += 64;

+        in_len  -= 64;

+    }

+

+    if (in_len > 0) {

+        memcpy((void *)(tex->buffer + left), in, in_len);

+    }

+}

+

+static const unsigned char sha256_filling[64] = {

+    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+};

+

+void utils_sha256_finish(uni_sha256_s *tex, uint8_t out[32])

+{

+    uint32_t last, padn;

+    uint32_t high, low;

+    unsigned char msglen[8];

+

+    high = (tex->total[0] >> 29)

+           | (tex->total[1] <<  3);

+    low  = (tex->total[0] <<  3);

+

+    PUT_UINT32_BE(high, msglen, 0);

+    PUT_UINT32_BE(low,  msglen, 4);

+

+    last = tex->total[0] & 0x3F;

+    padn = (last < 56) ? (56 - last) : (120 - last);

+

+    utils_sha256_update(tex, sha256_filling, padn);

+    utils_sha256_update(tex, msglen, 8);

+

+    PUT_UINT32_BE(tex->state[0], out,  0);

+    PUT_UINT32_BE(tex->state[1], out,  4);

+    PUT_UINT32_BE(tex->state[2], out,  8);

+    PUT_UINT32_BE(tex->state[3], out, 12);

+    PUT_UINT32_BE(tex->state[4], out, 16);

+    PUT_UINT32_BE(tex->state[5], out, 20);

+    PUT_UINT32_BE(tex->state[6], out, 24);

+

+    if (tex->type == 0) {

+        PUT_UINT32_BE(tex->state[7], out, 28);

+    }

+}

+

diff --git a/lynq/MD310EU/ap/app/dmp-test/util/util_sha256.h b/lynq/MD310EU/ap/app/dmp-test/util/util_sha256.h
new file mode 100755
index 0000000..2b1fb21
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/util/util_sha256.h
@@ -0,0 +1,37 @@
+/*******************************************************************************

+* Author		  :  author

+* Version		  :  V1.0

+* Date			  :  2021-07-27

+* Description	  :  util_sha256.h

+********************************************************************************/

+

+#ifndef __UTIL_SHA256_H__

+#define __UTIL_SHA256_H__

+

+/********************************* Include File ********************************/

+#include <stdint.h>

+

+

+/********************************* Macro Definition ****************************/

+#define UNI_SHA256_KEY_SIZE        (64)

+#define UNI_SHA256_TARGET_SIZE     (32)

+

+

+/********************************* Type Definition *****************************/

+typedef struct 

+{

+    uint32_t total[2];          

+    uint32_t state[8];          

+    unsigned char buffer[64];   

+    int type;                  //0:SHA-256, not 0: SHA-224

+}uni_sha256_s;

+

+

+/********************************* Function Prototype Definition ***************/
+void utils_sha256_init(uni_sha256_s *tex);

+void utils_sha256_starts(uni_sha256_s *tex);

+void utils_sha256_update(uni_sha256_s *tex, const unsigned char *in, uint32_t in_len);

+void utils_sha256_finish(uni_sha256_s *tex, uint8_t out[32]);

+

+

+#endif

diff --git a/lynq/MD310EU/ap/app/dmp-test/util/util_string.c b/lynq/MD310EU/ap/app/dmp-test/util/util_string.c
new file mode 100755
index 0000000..b5a0142
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/util/util_string.c
@@ -0,0 +1,76 @@
+/*******************************************************************************

+* Author		  :  author

+* Version		  :  V1.0

+* Date			  :  2021-07-27

+* Description	  :  util_string.c

+********************************************************************************/

+

+/********************************* Include File ********************************/

+#include <stdlib.h>

+#include <string.h>

+#include "util_string.h"

+

+

+/********************************* Macro Definition ****************************/

+

+

+/********************************* Type Definition *****************************/
+

+

+/********************************* Variables ***********************************/

+

+

+/********************************* Function ************************************/

+void util_hex2str(uint8_t *in, uint16_t in_len, char *out)

+{

+    char *zEncode = "0123456789ABCDEF";

+    int i = 0, j = 0;

+

+    for (i = 0; i < in_len; i++) {

+        out[j++] = zEncode[(in[i] >> 4) & 0xf];

+        out[j++] = zEncode[(in[i]) & 0xf];

+    }

+}

+

+char *util_strtok(char *str, const char *wstr)

+{

+    int only_delim = 1;

+    static char *pos = NULL;

+    static char *target = NULL;

+

+    pos = (str == NULL)?(pos):(str);

+

+    if (pos == NULL || wstr == NULL ||

+        strlen(pos) <= strlen(wstr)) {

+        return NULL;

+    }

+

+    target = pos;

+    while (strlen(pos) >= strlen(wstr)) {

+        if (memcmp(pos,wstr,strlen(wstr)) != 0) {

+            only_delim = 0;

+            pos++;

+            continue;

+        }

+

+        if (strlen(pos) == strlen(wstr)) {

+            memset(pos,0,strlen(wstr));

+            if (only_delim) {

+                return NULL;

+            }

+            return target;

+        }

+

+        if (target == pos) {

+            pos += strlen(wstr);

+            target = pos;

+        }else{

+            memset(pos,0,strlen(wstr));

+            pos += strlen(wstr);

+            break;

+        }

+    }

+

+    return target;

+}

+

diff --git a/lynq/MD310EU/ap/app/dmp-test/util/util_string.h b/lynq/MD310EU/ap/app/dmp-test/util/util_string.h
new file mode 100755
index 0000000..a4c7660
--- /dev/null
+++ b/lynq/MD310EU/ap/app/dmp-test/util/util_string.h
@@ -0,0 +1,26 @@
+/*******************************************************************************

+* Author		  :  author

+* Version		  :  V1.0

+* Date			  :  2021-07-27

+* Description	  :  util_string.h

+********************************************************************************/

+

+#ifndef __UTIL_STRING_H__

+#define __UTIL_STRING_H__

+

+/********************************* Include File ********************************/

+#include <stdint.h>

+

+

+/********************************* Macro Definition ****************************/

+

+

+/********************************* Type Definition *****************************/

+

+

+/********************************* Function Prototype Definition ***************/
+void util_hex2str(uint8_t *in, uint16_t in_len, char *out);

+char *util_strtok(char *str, const char *wstr);

+

+

+#endif

diff --git a/lynq/MD310EU/ap/app/fota_upi/src/upi_led.c b/lynq/MD310EU/ap/app/fota_upi/src/upi_led.c
new file mode 100755
index 0000000..80ecc17
--- /dev/null
+++ b/lynq/MD310EU/ap/app/fota_upi/src/upi_led.c
@@ -0,0 +1,329 @@
+/**
+* @file upi_led.c
+* @brief ÁÁµÆÏà¹Ø½Ó¿Ú
+*
+* Copyright (C) 2017 Sanechips Technology Co., Ltd.
+* @author
+*
+*/
+
+
+/*******************************************************************************
+ *                           Include header files                              *
+ ******************************************************************************/
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include "upi_led.h"
+#include "update.h"
+
+
+// nv½Ó¿ÚÐèÒª
+#include "softap_api.h"
+
+#include "upi_cmd.h"
+#include "zxic_fs_interface.h"
+
+
+
+/*******************************************************************************
+ *                             Macro definitions                               *
+ ******************************************************************************/
+// LEDµÆÃû³Æ¶¨Òå
+#define WL_LED 						"/sys/class/leds/wl_led_en/"
+
+#define SIGNAL_1_LED 				"/sys/class/leds/signal_status1_led/"
+#define SIGNAL_2_LED				"/sys/class/leds/signal_status2_led/"
+#define SIGNAL_3_LED				"/sys/class/leds/signal_status3_led/"
+
+#define WIFI_RED_LED				"/sys/class/leds/wifi_r_led/"
+#define WIFI_GREEN_LED				"/sys/class/leds/wifi_g_led/"
+#define WIFI_BLUE_LED				"/sys/class/leds/wifi_b_led/"
+
+
+#define BATTERY_RED_LED			"/sys/class/leds/battery_r_led/"
+#define BATTERY_GREEN_LED			"/sys/class/leds/battery_g_led/"
+#define BATTERY_BLUE_LED			"/sys/class/leds/battery_b_led/"
+
+#define SMS_LED						"/sys/class/leds/sms_led/"
+
+#define MODEM_RED_LED				"/sys/class/leds/modem_r_led/"
+#define MODEM_GREEN_LED			"/sys/class/leds/modem_g_led/"
+#define MODEM_BLUE_LED				"/sys/class/leds/modem_b_led/"
+
+// LEDµÆ²Ù×÷¶¨Òå
+#define BRIGHTNESS					"/brightness"     // µÆ×Ü¿ª¹Ø
+#define BLINKSWITDH					"/trigger"       // ÉÁ˸¿ª¹Ø
+#define BLINKTIMEON					"/delay_on"      // ÉÁ˸ÁÁµÆÊ±¼ä(ms)
+#define BLINKTIMEOFF				"/delay_off"    // ÉÁ˸ÃðµÆÊ±¼ä(ms)
+
+
+#define LEDON						(1)
+#define LEDOFF						(0)
+
+#define LEDBLINKON					"timer"
+#define LEDBLINKOFF					"none"
+
+#define FOTA_LED_BLINK_ON_MS		(300)
+#define FOTA_LED_BLINK_OFF_MS		(300)
+
+
+// system command max len
+//#define CMD_MAX_LEN				(256)
+
+
+// nv max len
+#define LED_NV_MAX_LEN				(256)
+
+static int  g_led_off = 0;
+
+/*******************************************************************************
+ *                             Type definitions                                *
+ ******************************************************************************/
+
+typedef enum {
+	SHOW_MODE_UNDEFINE = 0,
+	SHOW_MODE_LED = 1,
+	SHOW_MODE_LCD,
+	SHOW_MODE_ALL
+} E_zShowMode;
+
+
+/*******************************************************************************
+ *                       Global variable declarations                          *
+ ******************************************************************************/
+
+E_zShowMode			g_show_mode = SHOW_MODE_UNDEFINE;
+
+/*******************************************************************************
+ *                       Static function declarations                          *
+ ******************************************************************************/
+static int write_led_file(const char* filepath, const char* content)
+{
+	int ret = -1;
+	int fd  = -1;
+
+	fd = open(filepath, O_RDWR|O_TRUNC);
+	if (fd < 0)       
+	{
+		upi_err("open file fail [%s], error:%d[%s]\n", filepath,  errno, strerror(errno));
+		return -1;
+	}
+
+	ret = upi_writen(fd, content, strlen(content));
+	if (ret < 0)
+	{
+		upi_err("write fail ,file path:%s , error:%d[%s]\n", filepath,  errno, strerror(errno));
+		close(fd);
+		return -1;
+	}
+	else
+	{
+		upi_log("write counts: %d\n", ret);
+	}
+
+	ret = close(fd);
+	if(ret < 0)
+	{
+		upi_err("close file fail [%s], error:%d[%s]\n", filepath,  errno, strerror(errno));
+		return -1;
+	}
+
+	return 0;
+}
+
+
+/**
+ * @brief		ÉèÖÃLEDµÈÁÁÃð¼°ÉÁ˸
+ * @param	ledName:		LEDµÆÃû³Æ
+ * @param	brightNess:	µÆ×Ü¿ª¹Ø£¬0-¹Ø£¬1-¿ª
+ * @param	blinkSwitch:	ÉÁ˸¿ª¹Ø£¬0-¹Ø£¬1-¿ª
+ * @param	onMs:		ÉÁ˸ÁÁµÆºÁÃëÊý
+ * @param	offMs:		ÉÁ˸ÃðµÆºÁÃëÊý
+ */
+static int led_handle(const char *ledName, unsigned int brightNess,
+                      const char * blinkSwitch, unsigned int onMs, unsigned int offMs)
+{
+	char content[128] = {0};
+	char path[256] = {0};
+	int ret = -1;
+	int ret_1 = -1;
+	int ret_2 = -1;
+	int ret_3 = -1;
+
+	if (NULL == ledName) {
+		upi_err("set_led_blink NULL parameter ledName\n");
+		return -1;
+	}
+
+	if (0 != access(ledName, F_OK)) {
+		upi_err("set_led_blink led device [%s] does not exist!\n", ledName);
+		return -2;
+	}
+
+	memset(content, 0, sizeof(content));
+	memset(path, 0, sizeof(path));
+	snprintf(content, sizeof(content), "%d", brightNess);
+	snprintf(path, sizeof(path), "%s%s", ledName, BRIGHTNESS);
+	ret = write_led_file(path, content);
+	upi_log("set_led_blink set [%s] :%d \n", ledName, ret);
+
+	return ret;
+#if 0
+	switch (brightNess) {
+	case 0: 
+		{
+			memset(content, 0, sizeof(content));
+			memset(path, 0, sizeof(path));
+			snprintf(content, sizeof(content), "%d", brightNess);
+			snprintf(path, sizeof(path), "%s%s", ledName, BRIGHTNESS);
+			ret = write_led_file(path, content);
+			upi_log("set_led_blink set [%s] off :%d \n", ledName, ret);
+			break;
+		}
+
+	case 1: 
+		{
+			memset(content, 0, sizeof(content));
+			memset(path, 0, sizeof(path));
+			snprintf(content, sizeof(content), "%s", blinkSwitch);
+			snprintf(path, sizeof(path), "%s%s", ledName, BLINKSWITDH);
+			ret_1 = write_led_file(path, content);
+
+			memset(content, 0, sizeof(content));
+			memset(path, 0, sizeof(path));
+			snprintf(content, sizeof(content), "%d", onMs);
+			snprintf(path, sizeof(path), "%s%s", ledName, BLINKTIMEON);
+			ret_2 = write_led_file(path, content);
+
+			memset(content, 0, sizeof(content));
+			memset(path, 0, sizeof(path));
+			snprintf(content, sizeof(content), "%d", offMs);
+			snprintf(path, sizeof(path), "%s%s", ledName, BLINKTIMEOFF);
+			ret_3 = write_led_file(path, content);
+
+			upi_log("set_led_blink set [%s] blink: %dms on, %dms off, ret=%d|%d|%d \n", ledName, onMs, offMs, ret_1, ret_2, ret_3);
+			ret = (ret_1 & ret_2 & ret_3);
+
+			break;
+		}
+
+	default: 
+		{
+			upi_err("set_led_blink invalid parameter: MUST BE 0 or 1\n");
+			ret = -1;
+			break;
+		}
+	}
+
+
+	return ret;
+#endif
+}
+
+void fota_upgrade_led_ctrl(char *arg)
+{
+	int i   = 0;
+	char* led_list[] = {MODEM_GREEN_LED, WIFI_GREEN_LED, BATTERY_GREEN_LED, NULL};
+	int led_list_len = sizeof(led_list) / sizeof(char*);
+
+
+	// ϨÃðÆäËûLEDµÆ
+	led_handle(WIFI_RED_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(WIFI_GREEN_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(WIFI_BLUE_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+
+	led_handle(BATTERY_RED_LED,	 	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_GREEN_LED, 	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_BLUE_LED, 	LEDOFF, LEDBLINKOFF, 0, 0);
+
+	led_handle(MODEM_RED_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_GREEN_LED, 	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_BLUE_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+
+	while (!g_led_off)
+	{
+		usleep(300 * 1000);
+		led_handle(BATTERY_GREEN_LED,  LEDON, LEDBLINKOFF, 0, 0);
+		led_handle(WIFI_GREEN_LED,     LEDON, LEDBLINKOFF, 0, 0);
+		led_handle(MODEM_GREEN_LED,    LEDON, LEDBLINKOFF, 0, 0);
+		usleep(300 * 1000);
+		led_handle(BATTERY_GREEN_LED,  LEDOFF, LEDBLINKOFF, 0, 0);
+		led_handle(WIFI_GREEN_LED,     LEDOFF, LEDBLINKOFF, 0, 0);
+		led_handle(MODEM_GREEN_LED,    LEDOFF, LEDBLINKOFF, 0, 0);
+	}
+
+	upi_log("FOTA set led blink end!\n");
+}
+
+/*******************************************************************************
+ *                       Global function declarations                          *
+ ******************************************************************************/
+
+/**
+ * @brief 	ÉèÖôò¿ªupiÉý¼¶ledÉÁµÆ
+ * @note		ÉèÖÃÉÁµÆÇ°ÐèÒªÏÈ¹Ø±ÕÆäËüÎÞ¹ØÉÁµÆ
+ */
+void set_upi_leds_on(void)
+{
+	pthread_t led_ctrl;
+	pthread_create(&led_ctrl, NULL, (void *)fota_upgrade_led_ctrl, NULL);
+
+	return;
+}
+
+/**
+ * @brief 	ÉèÖùرÕupiÉý¼¶ledÉÁµÆ
+ * @note
+ */
+void set_upi_leds_off(void)
+{
+	g_led_off = 1;
+	sleep(2);
+	led_handle(WIFI_BLUE_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(WIFI_GREEN_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(WIFI_RED_LED, 		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_RED_LED,		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_GREEN_LED,	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(BATTERY_BLUE_LED,	LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_GREEN_LED,		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_BLUE_LED,		LEDOFF, LEDBLINKOFF, 0, 0);
+	led_handle(MODEM_RED_LED,		LEDOFF, LEDBLINKOFF, 0, 0);
+}
+
+
+
+/**
+ * @brief 	»ñÈ¡ÏÔʾģʽ£¬Ö÷ÒªÅжÏÊÇ·ñÐèÒªLED
+ * @note
+ */
+
+int init_show_mode()
+{
+#if 0
+	char led_nv_value[LED_NV_MAX_LEN] = {0};
+
+	//ÉèÖÃmmiÏÔʾģʽȫ¾Ö±äÁ¿
+	cfg_get_item("mmi_showmode", led_nv_value, sizeof(led_nv_value));
+	if (0 == strcmp(led_nv_value, "led")) {
+		g_show_mode = SHOW_MODE_LED;
+	} else if (0 == strcmp(led_nv_value, "lcd")) {
+		g_show_mode = SHOW_MODE_LCD;
+	} else if (0 == strcmp(led_nv_value, "all")) {
+		g_show_mode = SHOW_MODE_ALL;
+	} else {
+		assert(0);
+		return -1;
+	}
+#endif
+
+	return 0;
+
+}
+
+
+
+
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/Makefile b/lynq/MD310EU/ap/app/goahead/interface5.0/Makefile
new file mode 100755
index 0000000..e6d24a8
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/Makefile
@@ -0,0 +1,189 @@
+# /*****************************************************************************
+#* °æÈ¨ËùÓÐ (C)2015, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+#* 
+#* ÎļþÃû³Æ:     Makefile
+#* Îļþ±êʶ:     Makefile
+#* ÄÚÈÝÕªÒª:     Makefile of ZTE applications
+#* ʹÓ÷½·¨:     void
+#* 
+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+#* -----------------------------------------------------------------------------
+#* 2015/02/10      V1.0        Create          ÁõÑÇÄÏ          ´´½¨
+#* 
+# ******************************************************************************/
+
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(zte_app_mak)
+
+.PHONE: webuinet
+.PHONE: webuiwifi
+.PHONE: webuiother
+#*******************************************************************************
+# LIBWEBINTERFACE
+#*******************************************************************************
+LIBWEBINTERFACE = libwebinterface.a
+LIBWEBINTERFACE_SHARED = libwebinterface.so
+
+#*******************************************************************************
+# objects
+#*******************************************************************************
+OBJS    = zte_web_regist.o zte_web_util.o zte_web_mgmt.o \
+		zte_web_pbm.o \
+		zte_web_wan.o zte_web_sms.o \
+		zte_web_get_fw_para.o \
+		zte_web_httpshare.o zte_web_ussd.o \
+		zte_web_mc.o zte_web_rest.o zte_web_safe.o zte_web_cell_broadcast.o \
+		zte_web_cjson.o zte_web_sem.o
+
+#OBJS    += $(wildcard $(zte_lib_path)/libpthread/*.o) 
+export WEBUI=
+
+ifeq ($(WEBUI), orig)
+OBJS += 
+WEBOBJS :=
+else
+CFLAGS += -DMYWEBUI
+WEBOBJS := $(patsubst %.c,%.o,$(wildcard ./net/*.c))
+endif
+
+WIFIOBJS := $(patsubst %.c,%.o,$(wildcard ./wifi/*.c))
+
+OTHEROBJS   := $(patsubst %.c,%.o,$(wildcard ./other/*.c))
+#OBJS += $(WIFIOBJS)
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS	+= -DCONFIG_CHINA_UNICOM -DWEBS -DUEMF -DOS="LINUX" -DLINUX $(UMSW) $(DASW) $(SSLSW) $(IFMODSW)
+CFLAGS	+= -DWEBINSPECT_FIX
+CFLAGS  += -Wall -fno-strict-aliasing
+#CFLAGS	+= -I$(ROOTDIR)/lib/libnvram -I$(ROOTDIR)/$(LINUXDIR)/drivers/char -I$(ROOTDIR)/$(LINUXDIR)/include 
+#CFLAGS  += -I$(ROOTDIR)/$(LINUXDIR)/drivers/flash
+CFLAGS	+= -I$(zte_lib_path)/libnvram
+CFLAGS  += -I$(zte_lib_path)/libezxml
+CFLAGS  += -I$(zte_lib_path)/libmxml
+CFLAGS  += -I$(zte_lib_path)/zlib/install/include
+CFLAGS  += -I../../goahead/interface5.0/net
+CFLAGS  += -I../../goahead/interface5.0/wifi
+CFLAGS  += -I../../goahead/interface5.0/other
+CFLAGS  += -I../../goahead/interface5.0
+CFLAGS	+= -I../../include
+CFLAGS	+= -I../../wlan
+#CFLAGS	+= -I../../zte_sqlite
+#CFLAGS  += -I../../soft_timer
+CFLAGS	+= -I$(zte_lib_path)/libsqlite
+CFLAGS	+= -I$(zte_lib_path)/libsoft_timer
+CFLAGS  += -I../../at_server
+CFLAGS	 += -I../../awps/include
+CFLAGS	 += -I.
+
+#CFLAGS	+= -I../../sms
+
+ifeq ($(LINUX_TYPE),linux)
+CFLAGS  += -I$(USR_DIR)
+endif
+
+#CFLAGS  += -I$(USR_DIR)/zte_apps/soft_timer
+#CFLAGS  += -I$(USR_DIR)/zte_apps/at_server
+CFLAGS	+= -I../server
+CFLAGS	+= -fPIC  -shared -lc
+SHAREDFLAG := -fPIC -shared -lc
+#CFLAGS += -I$(LIB_DIR)/lib/sms_pbm
+
+ifeq ($(CONFIG_USE_WEBUI_SECURITY),yes)
+CFLAGS	+= -DWEBS_SECURITY
+endif
+ifeq ($(CONFIG_USE_WEBUI_SSL),yes)
+CFLAGS	+= -DWEBS_SSL_SUPPORT -DOPENSSL
+endif
+
+#*******************************************************************************
+# macro definition
+#*******************************************************************************
+ifeq ($(FEATURE_IPV6), YES)
+		CFLAGS	+= -DFEATURE_IPV4V6_MODE
+endif
+
+ifeq ($(FEATURE_SMS_MODE), CS)
+		CFLAGS	+= -DCS_SMS
+endif
+
+ifeq ($(CUSTOM_MODEL),MF253)
+	ifeq ($(CUSTOM_OPERATOR),VIVO_BR)
+		CFLAGS	+= -DCUSTOM_VERSION_MF253_VIVO_BR
+	endif
+endif
+
+ifeq ($(FEATURE_TSP_MODE), YES)
+	CFLAGS	+= -DFEATURE_TSP_MODEM
+endif
+
+ifeq ($(CUSTOM_MODEL), MF253S2)
+ifeq ($(CUSTOM_OPERATOR), CM_CN)
+CFLAGS	+= -DCUSTOM_VERSION_MF253S2_CM_CN
+endif
+endif
+
+#*******************************************************************************
+# library
+#*******************************************************************************
+LDLIBS += -lpthread -lgcc_s
+LDLIBS += -lnvram -lsoft_timer -lsqlite -lzte_pbm -lwlan_interface -llog
+
+#*******************************************************************************
+# library path
+#*******************************************************************************
+LDLIBS  += -L$(zte_lib_path)/libnvram
+LDLIBS  += -L$(zte_lib_path)/libsoft_timer
+LDLIBS  += -L$(zte_lib_path)/libsqlite
+LDLIBS  += -L$(zte_lib_path)/liblog
+LDLIBS  += -L$(zte_lib_path)/libzte_pbm
+LDLIBS  += -L$(zte_lib_path)/../libezxml
+LDLIBS  += -L$(zte_lib_path)/../libmxml
+LDLIBS  += -L$(zte_lib_path)/libwlan_interface
+
+CFLAGS += -I$(zte_lib_path)/libssl/install/include
+LDLIBS += -L$(zte_lib_path)/libssl/install/lib -lcrypto
+
+CFLAGS += -I$(zte_lib_path)/libcurl/install/include
+LDLIBS += -L$(zte_lib_path)/libcurl/install/lib -lcurl
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(LIBWEBINTERFACE) webuinet webuiwifi webuiother
+zte_web_util.o: webuinet webuiwifi webuiother
+#all:
+#	echo $(ROOTDIR) $(LINUXDIR) $(zte_lib_path)
+
+$(LIBWEBINTERFACE): $(OBJS) webuinet webuiwifi webuiother
+	$(AR) -rc $@ $(OBJS) $(WEBOBJS) $(WIFIOBJS) $(OTHEROBJS)
+	
+$(LIBWEBINTERFACE_SHARED): $(OBJS) webuinet webuiwifi webuiother
+	$(LD) $(SHAREDFLAG) -o $@ $^ $(LDLIBS) $(WEBOBJS) $(WIFIOBJS) $(OTHEROBJS)
+#	$(STRIP) $@
+	
+romfs:
+
+ifeq ($(WEBUI), orig)
+webuinet:
+	@echo
+else
+webuinet:
+	cd ./net; echo $$pwd ;$(MAKE) -C ./ all||exit $$?
+endif
+
+webuiwifi:
+	cd ./wifi; echo $$pwd ;$(MAKE) -C ./ all||exit $$?
+
+webuiother:
+	cd ./other; echo $$pwd ;$(MAKE) -C ./ all||exit $$?
+
+root_fs:
+#	$(ROMFSINST) -e CONFIG_USER_GOAHEAD /bin/$(LIBWEBINTERFACE)
+
+clean:
+	-rm -f $(LIBWEBINTERFACE) *.elf *.gdb *.o
+	-cd ./net && $(MAKE) -C ./ clean
+	-cd ./wifi && $(MAKE) -C ./ clean
+	-cd ./other && $(MAKE) -C ./ clean
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/net/zte_web_net_wan.c b/lynq/MD310EU/ap/app/goahead/interface5.0/net/zte_web_net_wan.c
new file mode 100755
index 0000000..cf5f8eb
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/net/zte_web_net_wan.c
@@ -0,0 +1,1822 @@
+#include "zte_web_interface.h"
+#include "zte_web_net_wan.h"
+#include "zte_web_get_fw_para.h"
+#include "message.h"
+
+#define IP_VERSION_V4 "ipv4"
+#define IP_VERSION_V6 "ipv6"
+
+//======================Global Constants=============================//
+static char wan_if_name[20] = {0};   /* default is ppp0 */
+
+//==============================Util================================//
+static int isMacValid(char *str)
+{
+	int i, len = strlen(str);
+	if (len != 17)
+		return 0;
+
+	for (i = 0; i < 5; i++) {
+		if ((!isxdigit(str[i * 3])) || (!isxdigit(str[i * 3 + 1])) || (str[i * 3 + 2] != ':'))
+			return 0;
+	}
+	return (isxdigit(str[15]) && isxdigit(str[16])) ? 1 : 0;
+}
+
+int isIpValid(char *str)
+{
+	struct in_addr addr;    // for examination/*lint !e1080 !565 */
+	if ((! strcmp(T("any"), str)) || (! strcmp(T("any/0"), str)))
+		return 1;
+#ifdef WEBS_SECURITY
+	int len = strlen(str);
+	len--;
+	while(len > 0)
+	{
+		len--;
+		if(str[len] == '0' && str[len+1] >= '0')
+		{
+			if(len == 0 || (len > 1 && str[len-1] == '.'))
+				return 0;
+		}
+	}
+#endif	
+	if (!(inet_aton(str, &addr))) {
+		slog(MISC_PRINT, SLOG_ERR, "isIpValid(): %s is not a valid IP address.\n", str); /*lint !e26*/
+		return 0;
+	}
+	return 1;
+}
+
+int isIpv6Valid(char *str)
+{
+	int ret = 0;
+	struct in6_addr ipv6_addr;
+
+	if ((! strcmp(T("any"), str)) || (! strcmp(T("any/0"), str)))
+		return 1;
+
+	ret = inet_pton(AF_INET6, str, &ipv6_addr);
+	if (ret < 1) {
+		slog(MISC_PRINT, SLOG_ERR,"isIpv6Valid: str inet_pton failed: %d \n", ret);
+		return 0;
+	}
+	return 1;
+}
+
+static int isNumOnly(char *str)
+{
+	int i, len = strlen(str);
+	for (i = 0; i < len; i++) {
+		if ((str[i] >= '0' && str[i] <= '9'))
+			continue;
+		return 0;
+	}
+	return 1;
+}
+
+static int isAllNumAndSlash(char *str)
+{
+	int i, len = strlen(str);
+	for (i = 0; i < len; i++) {
+		if ((str[i] >= '0' && str[i] <= '9') || str[i] == '.' || str[i] == '/')
+			continue;
+		return 0;
+	}
+	return 1;
+}
+
+static int isOnlyOneSlash(char *str)
+{
+	int i, count = 0;
+	int len = strlen(str);
+	for (i = 0; i < len; i++)
+		if (str[i] == '/')
+			count++;
+	return count <= 1 ? 1 : 0;
+}
+
+static int isIpNetmaskValid(char *s)
+{
+	char str[32]={0};
+	char *slash;
+	struct in_addr addr;    // for examination/*lint !e1080*/
+
+	if (!s || !strlen(s)) {
+		return 0;
+	}
+
+	strncpy(str, s, sizeof(str)-1);
+
+	if ((!strcmp("any", str)) || (!strcmp("any/0", str)))
+		return 1;
+
+	if (!isAllNumAndSlash(str)) {
+		return 0;
+	}
+
+	if (!isOnlyOneSlash(str)) {
+		return 0;
+	}
+
+	slash = strchr(str, '/');
+	if (slash) {
+		int mask;
+
+		*slash = '\0';
+		slash++;
+		if (!strlen(slash)) {
+			return 0;
+		}
+
+		if (!isNumOnly(slash)) {
+			return 0;
+		}
+
+		mask = atoi(slash);
+		if (mask < 0 || mask > 32) {
+			return 0;
+		}
+	}
+
+	if (!(inet_aton(str, &addr))) {
+		slog(MISC_PRINT, SLOG_ERR, "isIpNetmaskValid(): %s is not a valid IP address.\n", str); /*lint !e26*/
+		return 0;
+	}
+	return 1;
+}
+
+static int getNums(char *value, char delimit)
+{
+
+	char *pos = value;
+
+	int count = 1;
+	if (!pos)
+		return 0;
+	while ((pos = strchr(pos, delimit))) {
+
+		pos = pos + 1;
+
+		count++;
+
+	}
+
+	return count;
+}
+
+static int getRuleNums(char *rules)
+{
+
+	return getNums(rules, ';');
+}
+
+
+
+/*
+ *  argument:  [IN]     index -- the index array of deleted items(begin from 0)
+ *             [IN]     count -- deleted itmes count.
+ *             [IN/OUT] value -- original string/return string
+ *             [IN]     delimit -- delimitor
+ */
+static int static_deleteNthValueMulti(int index[], int count, char *value, char delimit)
+{
+	char *begin, *end;
+	int i = 0, j = 0;
+	int need_check_flag = 0;
+	char *buf = strdup(value);
+
+	if(buf == NULL)
+		return 0;
+	*(buf+strlen(value)) = 0;
+	begin = buf;
+
+	end = strchr(begin, delimit);
+	while (end) {
+		if (i == index[j]) {
+			memset(begin, 0, end - begin);
+			if (index[j] == 0)
+				need_check_flag = 1;
+			j++;
+			if (j >= count)
+				break;
+		}
+		begin = end;
+
+		end = strchr(begin + 1, delimit);
+		i++;
+	}
+
+	if (!end && index[j] == i)
+		memset(begin, 0, strlen(begin));
+
+	if (need_check_flag) {
+		for (i = 0; i < strlen(value); i++) {
+			if (buf[i] == '\0')
+				continue;
+			if (buf[i] == ';')
+				buf[i] = '\0';
+			break;
+		}
+	}
+
+	for (i = 0, j = 0; i < strlen(value) && j < 1023; i++) {
+		if (buf[i] != '\0') {
+			value[j++] = buf[i];
+		}
+	}
+	value[j] = '\0';
+
+	free(buf);
+	return 0;
+}
+
+/*
+ * substitution of getNthValue which dosen't destroy the original value
+ */
+static int static_getNthValueSafe(int index, char *value, char delimit, char *result, int len)
+{
+	int i = 0, result_len = 0;
+	char *begin, *end;
+
+	if (!value || !result || !len)
+		return -1;
+
+	begin = value;
+	end = strchr(begin, delimit);
+
+	while (i < index && end) {
+		begin = end + 1;
+		end = strchr(begin, delimit);
+		i++;
+	}
+
+	//no delimit
+	if (!end) {
+		if (i == index) {
+			end = begin + strlen(begin);
+			result_len = (len - 1) < (end - begin) ? (len - 1) : (end - begin);
+		} else
+			return -1;
+	} else
+		result_len = (len - 1) < (end - begin) ? (len - 1) : (end - begin);
+
+	memcpy(result, begin, result_len);
+	*(result + result_len) = '\0';
+
+	return 0;
+}
+
+/*************************** firewallÏà¹Ø ***************************/
+
+/*IP¡¢PORTµÈ·À»ðǽµÄwebÒ³Ãæ»ù±¾ÅäÖÃ*/
+void zte_fw_basic_setting(webs_t wp)
+{
+	char *firewall_enable = NULL;    /* 0: Disabled  1: Enabled */
+	char *default_policy = NULL;      /* 0: Accepted  1: Dropped */
+
+	firewall_enable = websGetVar(wp, T("portFilterEnabled"), T("0"));
+	default_policy  = websGetVar(wp, T("defaultFirewallPolicy"), T("0"));
+
+	switch (atoi(firewall_enable)) {
+	case 0:
+		(void)zte_web_write("IPPortFilterEnable", "0");    /* Disable */
+		slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User disable port filtering!\n"));
+		break;
+	case 1:
+		(void)zte_web_write("IPPortFilterEnable", "1");    /* Enable */
+		slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User enable port filtering!\n"));
+		break;
+	default:
+		(void)zte_web_write("IPPortFilterEnable", "0");    /* Accepted */
+		break;
+	}
+
+	switch (atoi(default_policy)) {
+	case 1:
+		(void)zte_web_write("DefaultFirewallPolicy", "1");    /* Dropped */
+		break;
+	case 0:
+	default:
+		(void)zte_web_write("DefaultFirewallPolicy", "0");    /* Accepted */
+		break;
+	}
+
+	//zte_iptables_basic_setting();
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_basic_setting SEND MESSAGE TO MC START"); /*lint !e26*/
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FILTER, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_fw_basic_setting SEND MESSAGE TO MC END"); /*lint !e26*/
+
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*¶Ë¿Úת·¢web»ù±¾ÅäÖÃ*/
+void zte_fw_forward_setting(webs_t wp)
+{
+	char *firewall_enable = NULL;    /* 0: Disabled  1: Enabled */
+
+	firewall_enable = websGetVar(wp, T("PortForwardEnable"), T("0"));
+
+	switch (atoi(firewall_enable)) {
+	case 0:
+		(void)zte_web_write("PortForwardEnable", "0");    /* Disable */
+		slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User disable port forward!\n"));
+		break;
+	case 1:
+		(void)zte_web_write("PortForwardEnable", "1");    /* Enable */
+		slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User enable port forward!\n"));
+		break;
+	default:
+		(void)zte_web_write("PortForwardEnable", "0");    /* Accepted */
+		break;
+	}
+
+	//zte_iptables_basic_setting();
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_forward_setting SEND MESSAGE TO MC START"); /*lint !e26*/
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FORWARD, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_fw_forward_setting SEND MESSAGE TO MC END"); /*lint !e26*/
+
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*·À»ðǽÖÐÍâÍø¿Ú¶¨ÖƹæÔò£¬ÊôÓÚ·À»ðǽ·¶³ë*/
+void zte_fw_sys_security_setting(webs_t wp)
+{
+	char *rmE = NULL;    /* 0: Disabled  1: Enabled */
+	char *wpfE = NULL;    /* 0: Disabled  1: Enabled */
+
+	rmE = websGetVar(wp, T("RemoteManagement"), T("0"));
+	wpfE = websGetVar(wp, T("WANPingFilter"), T("0"));
+
+	switch (atoi(rmE)) {
+	case 0:
+		(void)zte_web_write("RemoteManagement", "0");    /* Disable */
+		break;
+	case 1:
+		(void)zte_web_write("RemoteManagement", "1");    /* Enable */
+		break;
+	default:
+		(void)zte_web_write("RemoteManagement", "0");    /* Accepted */
+		break;
+	}
+
+	switch (atoi(wpfE)) {
+	case 0:
+		(void)zte_web_write("WANPingFilter", "0");    /* Disable */
+		break;
+	case 1:
+		(void)zte_web_write("WANPingFilter", "1");    /* Enable */
+		break;
+	default:
+		(void)zte_web_write("WANPingFilter", "0");    /* Accepted */
+		break;
+	}
+
+	//zte_iptables_basic_setting();
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FORWARD, 0, NULL, 0);
+
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*ɾ³ýÒ»Ìõ·À»ðǽ*/
+void zte_fw_ipport_filter_del(webs_t wp)
+{
+	/* value from web page */
+	int i = 0, j = 0;
+	char_t *delete_id = NULL;
+	int id = 0;
+	char_t *start = NULL;
+	char IPPortFilterRules_x[NV_ITEM_STRING_LEN_50] = {0};
+	char IPPortFilterRules[NV_ITEM_STRING_LEN_200] = {0};
+	int flag = 0;
+
+	delete_id = websGetVar(wp, "delete_id", "");
+
+	if (*delete_id == '\0') {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	//to delete the rules
+	for (start = delete_id; *delete_id != '\0';) {
+		if (*delete_id == ';') {
+			*delete_id = '\0';
+			id = atoi(start);
+			memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+			(void)snprintf(IPPortFilterRules_x, NV_ITEM_STRING_LEN_50, "IPPortFilterRules_%d", id);
+			(void)cfg_set(IPPortFilterRules_x, "");
+
+			delete_id ++;/*lint !e52*/
+			start = delete_id;
+		} else {
+			delete_id ++;/*lint !e52*/
+		}
+	}
+
+	//organize the rule
+	for (i = 0; i <= 9; i++) {
+		flag = 0;
+		memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+		memset(IPPortFilterRules, 0, sizeof(IPPortFilterRules));
+
+		(void)snprintf(IPPortFilterRules_x, NV_ITEM_STRING_LEN_50, "IPPortFilterRules_%d", i);
+		cfg_get_item(IPPortFilterRules_x, IPPortFilterRules, sizeof(IPPortFilterRules));
+		if (0 == strcmp(IPPortFilterRules, "")) {
+			for (j = (i + 1); j <= 9; j++) {
+				//reset
+				memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+				memset(IPPortFilterRules, 0, sizeof(IPPortFilterRules));
+
+				(void)snprintf(IPPortFilterRules_x, NV_ITEM_STRING_LEN_50, "IPPortFilterRules_%d", j);
+				cfg_get_item(IPPortFilterRules_x, IPPortFilterRules, sizeof(IPPortFilterRules));
+				if (0 != strcmp(IPPortFilterRules, "")) {
+					cfg_set(IPPortFilterRules_x, "");
+					memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+					(void)snprintf(IPPortFilterRules_x, NV_ITEM_STRING_LEN_50, "IPPortFilterRules_%d", i);
+					cfg_set(IPPortFilterRules_x, IPPortFilterRules);
+					flag = 1;
+					break;
+				}
+			}
+
+			if (0 == flag) {
+				break;
+			}
+		}
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FILTER, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_ipport_filter_del SEND MESSAGE TO MC END");/*lint !e26*/ /*lint !e26*/
+
+	//cfg_save();
+	//zte_response_json_for_test(wp,"zte_fw_ipport_filter_del","send message to mc");
+
+	zte_write_result_to_web(wp, SUCCESS);
+	return;
+}
+
+/*ɾ³ýÒ»Ìõ¶Ë¿Úת·¢¹æÔò*/
+void zte_fw_port_forward_del(webs_t wp)
+{
+	int i = 0, j = 0;
+	char_t *delete_id = NULL;
+	int id = 0;
+	char_t *start = NULL;
+	char PortForwardRules_x[NV_ITEM_STRING_LEN_50] = {0};
+	char PortForwardRules[NV_ITEM_STRING_LEN_200] = {0};
+	int flag = 0;
+
+	delete_id = websGetVar(wp, "delete_id", "");
+
+	if (*delete_id == '\0') {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	//to delete the rules
+	for (start = delete_id; *delete_id != '\0';) {
+		if (*delete_id == ';') {
+			*delete_id = '\0';
+			id = atoi(start);
+			memset(PortForwardRules_x, 0, sizeof(PortForwardRules_x));
+			(void)snprintf(PortForwardRules_x, NV_ITEM_STRING_LEN_50, "PortForwardRules_%d", id);
+			slog(MISC_PRINT, SLOG_DEBUG, "port_forward delete NV:[%s]", PortForwardRules_x);
+			(void)cfg_set(PortForwardRules_x, "");
+
+			delete_id ++;/*lint !e52*/
+			start = delete_id;
+		} else {
+			delete_id ++;/*lint !e52*/
+		}
+	}
+
+	//organize the rule
+	for (i = 0; i <= 9; i++) {
+		flag = 0;
+		memset(PortForwardRules_x, 0, sizeof(PortForwardRules_x));
+		memset(PortForwardRules, 0, sizeof(PortForwardRules));
+
+		(void)snprintf(PortForwardRules_x, NV_ITEM_STRING_LEN_50, "PortForwardRules_%d", i);
+		cfg_get_item(PortForwardRules_x, PortForwardRules, sizeof(PortForwardRules));
+
+		if (0 == strcmp(PortForwardRules, "")) {
+			for (j = (i + 1); j <= 9; j++) {
+				//reset
+				memset(PortForwardRules_x, 0, sizeof(PortForwardRules_x));
+				memset(PortForwardRules, 0, sizeof(PortForwardRules));
+
+				(void)snprintf(PortForwardRules_x, NV_ITEM_STRING_LEN_50, "PortForwardRules_%d", j);
+				cfg_get_item(PortForwardRules_x, PortForwardRules, sizeof(PortForwardRules));
+				if (0 != strcmp(PortForwardRules, "")) {
+					(void)cfg_set(PortForwardRules_x, "");
+
+					memset(PortForwardRules_x, 0, sizeof(PortForwardRules_x));
+					(void)snprintf(PortForwardRules_x, NV_ITEM_STRING_LEN_50, "PortForwardRules_%d", i);
+					(void)cfg_set(PortForwardRules_x, PortForwardRules);
+
+					flag = 1;
+					break;
+				}
+			}
+
+			if (0 == flag) {
+				break;
+			}
+		}
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FORWARD, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_port_forward_del SEND MESSAGE TO MC END"); /*lint !e26*/
+	//zte_response_json_for_test(wp,"zte_fw_port_forward_del","send message to mc");
+
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+	return;
+}
+
+/******************************************************
+* Function: zte_fw_port_map_check()
+* Description:  check the add port map data
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2014/08/18      V1.0    gebin        create
+*******************************************************/
+static int zte_fw_port_map_check(webs_t wp, fw_port_map_type *fw_port_map)
+{
+	// we dont trust user input.....
+	if (!fw_port_map->spr) {//klocwork
+		return -1;
+	}
+	if (!fw_port_map->dpr) {
+		return -1;
+	}
+	/* user choose nothing but press "apply" only */
+	if (0 == strlen(fw_port_map->ip_address)
+	    || 0 == strlen(fw_port_map->spr)
+	    || 0 == strlen(fw_port_map->dpr)
+	    || 0 == strlen(fw_port_map->comment)) {
+		zte_web_write("PortMapEnable", "1");
+		slog(MISC_PRINT, SLOG_DEBUG,  "port_map some parameter null");
+		return -1;
+	}
+#ifdef WEBS_SECURITY
+	int i = 0;
+	int len = strlen(fw_port_map->comment);
+	for (i = 0; i < len; i++) {
+		if (strchr("`$&*\\[];:\'\"<>,",fw_port_map->comment[i]) || !isprint(fw_port_map->comment[i])) {
+			return -1;
+		}
+	}
+#endif	
+#if 0 // kw 3  fw_port_map->ip_address has already checked
+	if (!strlen(fw_port_map->ip_address)) {
+		return -1;
+	}
+#endif	
+	if (!isIpValid(fw_port_map->ip_address)) {
+		return -1;
+	}
+
+	if (!(fw_port_map->spr_int = atoi(fw_port_map->spr))) {
+		return -1;
+	}
+	if (fw_port_map->spr_int > 65000) {
+		return -1;
+	}
+
+	if (!(fw_port_map->dpr_int = atoi(fw_port_map->dpr))) {
+		return -1;
+	}
+	if (fw_port_map->dpr_int > 65000) {
+		return -1;
+	}
+
+	if (!strcmp(fw_port_map->protocol, "TCP"))
+		fw_port_map->proto = PROTO_TCP;
+	else if (!strcmp(fw_port_map->protocol, "UDP"))
+		fw_port_map->proto = PROTO_UDP;
+	else if (!strcmp(fw_port_map->protocol, "TCP&UDP"))
+		fw_port_map->proto = PROTO_TCP_UDP;
+	else {
+		return -1;
+	}
+	if (strlen(fw_port_map->comment) > 32) {
+		return -1;
+	}
+	/* i know you will try to break our box... ;) */
+	if (strchr(fw_port_map->comment, ';') || strchr(fw_port_map->comment, ',')) {
+		return -1;
+	}
+
+	return 1;
+}
+
+/*Ìí¼ÓÒ»Ìõ¶Ë¿ÚÓ³É乿Ôò*/
+void zte_fw_port_map_add(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_ERR, T("UFIx User added port map!\n"));
+	fw_port_map_type fw_port_map;
+	int check_result = 0;
+	int count = 0;
+	int flag = 0;
+	char PortMapRules[NV_FW_RULE_MAX_LEN] = {0};
+	char PortMapRules_x[NV_ITEM_STRING_LEN_50] = {0};
+	char *portmap_enable = NULL;    /* 0: Disabled  1: Enabled */
+	char portmap_original[2] = {0};    /* 0: Disabled  1: Enabled */
+
+	slog(MISC_PRINT, SLOG_DEBUG, "enter zte_fw_port_map_add.\n");
+
+	//port_map setting
+	portmap_enable = websGetVar(wp, T("portMapEnabled"), T("0"));
+
+	//read original port_map setting
+	zte_web_read("PortMapEnable", portmap_original);
+	slog(MISC_PRINT, SLOG_DEBUG, "portmap_original: %s, portmap_enable: %s\n", portmap_original, portmap_enable);
+
+	switch (atoi(portmap_enable)) {
+	case 0:
+		(void)zte_web_write("PortMapEnable", "0");    /* Disable */
+		break;
+	case 1:
+		(void)zte_web_write("PortMapEnable", "1");    /* Enable */
+		break;
+	default:
+		(void)zte_web_write("PortMapEnable", "0");    /* Accepted */
+		break;
+	}
+
+	//portmap switch open/close, or keep close
+	if ((0 != strcmp(portmap_original, portmap_enable)) || (0 == strcmp(portmap_enable, "0"))) {
+		/* EC: 616000297057, Ô­Òò: ÍøÂç²»Ö§³Ö¶Ë¿ÚÓ³Éä */
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_MAPPING, 0, NULL, 0);
+
+		//cfg_save();
+		zte_write_result_to_web(wp, SUCCESS);
+		slog(MISC_PRINT, SLOG_NORMAL, "portmap switch open/close, or keep close\n");
+		return;
+	}
+
+	memset(&fw_port_map, 0, sizeof(fw_port_map_type));
+	fw_port_map.ip_address = websGetVar(wp, T("ip_address"), T(""));
+	fw_port_map.spr        = websGetVar(wp, T("fromPort"), T(""));
+	fw_port_map.dpr        = websGetVar(wp, T("toPort"), T(""));
+	fw_port_map.protocol   = websGetVar(wp, T("protocol"), T(""));
+	fw_port_map.comment    = websGetVar(wp, T("comment"), T(""));
+
+	/* user re-press port_map open apply button, should return SUCCESS*/
+	/* while user choose nothing but press "apply" only will be checked by js code*/
+	if (0 == strlen(fw_port_map.ip_address)
+	    && 0 == strlen(fw_port_map.spr)
+	    && 0 == strlen(fw_port_map.dpr)
+	    && 0 == strlen(fw_port_map.comment)) {
+		zte_write_result_to_web(wp, SUCCESS);
+		slog(MISC_PRINT, SLOG_DEBUG, "portmap re-press open apply button\n");
+		return;
+	}
+
+	//add rules
+	check_result = zte_fw_port_map_check(wp, &fw_port_map);
+	if (check_result < 0) {
+		slog(MISC_PRINT, SLOG_ERR, "portmap add rule failure\n");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	for (count = 0; count <= 9; count++) {
+		(void)snprintf(PortMapRules_x, NV_ITEM_STRING_LEN_50, "PortMapRules_%d", count);
+		memset(PortMapRules, 0, sizeof(PortMapRules));
+		zte_web_read(PortMapRules_x, PortMapRules);
+		if (0 == strcmp(PortMapRules, "")) {
+			memset(PortMapRules, 0, sizeof(PortMapRules));
+			(void)snprintf(PortMapRules, NV_ITEM_STRING_LEN_200, "%s,%d,%d,%d,%s",
+			               fw_port_map.ip_address, fw_port_map.spr_int,
+			               fw_port_map.dpr_int, fw_port_map.proto,
+			               fw_port_map.comment);
+			(void)zte_web_write(PortMapRules_x, PortMapRules);
+			flag = 1;
+			slog(MISC_PRINT, SLOG_DEBUG, "zte_fw_port_map_add %s: %s\n", PortMapRules_x, PortMapRules);
+			break;
+		}
+	}
+
+	if (0 == flag) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_MAPPING, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_port_map_add MESSAGE TO MC END\n"); /*lint !e26*/
+
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*ɾ³ýÒ»Ìõ¶Ë¿ÚÓ³É乿Ôò*/
+void zte_fw_port_map_del(webs_t wp)
+{
+	int i = 0, j = 0;
+	char_t *delete_id = NULL;
+	int id = 0;
+	char_t *start = NULL;
+	char PortMapRules_x[NV_ITEM_STRING_LEN_50] = {0};
+	char PortMapRules[NV_ITEM_STRING_LEN_200] = {0};
+	int flag = 0;
+
+	delete_id = websGetVar(wp, "delete_id", "");
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_fw_port_map_del delete_id: %s\n", delete_id);
+	if (*delete_id == '\0') {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	//to delete the rules
+	for (start = delete_id; *delete_id != '\0';) {
+		if (*delete_id == ';') {
+			*delete_id = '\0';
+			id = atoi(start);
+			memset(PortMapRules_x, 0, sizeof(PortMapRules_x));
+			(void)snprintf(PortMapRules_x, NV_ITEM_STRING_LEN_50, "PortMapRules_%d", id);
+			slog(MISC_PRINT, SLOG_DEBUG,  "port_map delete NV: %s\n", PortMapRules_x);
+			(void)cfg_set(PortMapRules_x, "");
+
+			delete_id++; /*lint !e52*/
+			start = delete_id;
+		} else {
+			delete_id ++;/*lint !e52*/
+		}
+	}
+
+	//organize the rule
+	for (i = 0; i <= 9; i++) {
+		flag = 0;
+		memset(PortMapRules_x, 0, sizeof(PortMapRules_x));
+		memset(PortMapRules, 0, sizeof(PortMapRules));
+
+		(void)snprintf(PortMapRules_x, NV_ITEM_STRING_LEN_50, "PortMapRules_%d", i);
+		cfg_get_item(PortMapRules_x, PortMapRules, sizeof(PortMapRules));
+
+		if (0 == strcmp(PortMapRules, "")) {
+			for (j = (i + 1); j <= 9; j++) {
+				//reset
+				memset(PortMapRules_x, 0, sizeof(PortMapRules_x));
+				memset(PortMapRules, 0, sizeof(PortMapRules));
+
+				(void)snprintf(PortMapRules_x, NV_ITEM_STRING_LEN_50, "PortMapRules_%d", j);
+				cfg_get_item(PortMapRules_x, PortMapRules, sizeof(PortMapRules));
+				if (0 != strcmp(PortMapRules, "")) {
+					(void)cfg_set(PortMapRules_x, "");
+
+					memset(PortMapRules_x, 0, sizeof(PortMapRules_x));
+					(void)snprintf(PortMapRules_x, NV_ITEM_STRING_LEN_50, "PortMapRules_%d", i);
+					(void)cfg_set(PortMapRules_x, PortMapRules);
+
+					flag = 1;
+					break;
+				}
+			}
+
+			if (0 == flag) {
+				break;
+			}
+		}
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_MAPPING, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_port_map_del SEND MESSAGE TO MC END\n"); /*lint !e26*/
+
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+//¹©web»ñÈ¡¹æÔòÐÐÊý
+/*int zte_get_fw_rules_num(webs_t wp, char* ruleName)
+{
+    char rules[NV_FW_RULE_MAX_LEN]={0};
+
+	cfg_get_item(ruleName, rules, sizeof(rules));
+    if(0 == strlen(rules))
+    {
+        websWrite(wp, T("0"));
+        return 0;
+    }
+
+    websWrite(wp, T("%d"), getRuleNums(rules));
+    return 0;
+}*/
+
+void zte_goform_url_filter_add_process(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User added url filter!\n"));
+	char urlfilters[1023] = {0};
+	char new_urlfilters[1024] = {0};
+	char *rule = websGetVar(wp, T("addURLFilter"), T(""));
+
+	memset(urlfilters, 0, 1023);
+	memset(new_urlfilters, 0, 1024);
+
+	if (!rule)
+		return;
+	if (strchr(rule, ';'))
+		return;
+
+	cfg_get_item("websURLFilters", urlfilters, sizeof(urlfilters));
+	if (0 == strcmp(urlfilters, "")) {
+		cfg_set("websURLFilters", rule);
+	} else {
+		snprintf(new_urlfilters,sizeof(new_urlfilters),"%s%s%s",urlfilters,";",rule);
+/*		strcat(new_urlfilters, urlfilters);
+		strcat(new_urlfilters, ";");
+		if(strlen(new_urlfilters) + strlen(rule) < 1024)
+		strcat(new_urlfilters, rule);*/
+		cfg_set("websURLFilters", new_urlfilters);
+	}
+
+	//zte_iptables_Webs_Filter_Run();
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_URL_FILTER, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_goform_url_filter_add_process MESSAGE TO MC END"); /*lint !e26*/
+
+	//cfg_save();
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+//URL¹ýÂ˹æÔòɾ³ý
+void zte_goform_url_filter_delete_process(webs_t wp)
+{
+	int  j = 0, rule_count = 0;
+	char_t name_buf[16] = {0};
+	char_t *value = NULL;
+	char_t *delete_id = NULL;
+	int *deleArray = NULL;
+	char rules[1024] = {0};
+	char_t *start = NULL;
+	int id = 0;
+
+	delete_id = websGetVar(wp, "url_filter_delete_id", NULL);
+
+	if (delete_id == NULL || *delete_id == '\0') {
+		slog(MISC_PRINT, SLOG_DEBUG, "delete_id is NULL."); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE); /*lint !e26*/
+		return;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "delete_id is [%s].", delete_id); /*lint !e26*/
+
+	//to delete the rules
+
+	cfg_get_item("websURLFilters", rules, sizeof(rules));
+	if (0 == strlen(rules)) {
+		slog(MISC_PRINT, SLOG_ERR, "rules is NULL."); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	rule_count = getRuleNums(rules);
+#if 0 // kw 3 INVARIANT_CONDITION.UNREACH	
+	if (!rule_count) {
+		slog(MISC_PRINT, SLOG_ERR, "rule_count is NULL."); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+#endif
+	deleArray = (int *)malloc(rule_count * sizeof(int));
+	if (NULL == deleArray) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	for (start = delete_id; *delete_id != '\0';) {
+		if (*delete_id == ';') {
+			*delete_id = '\0';
+			id = atoi(start);
+			slog(MISC_PRINT, SLOG_DEBUG, "delete_id single is [%d].", id); /*lint !e26*/
+			deleArray[j++] = id; /*lint !e52*/
+			delete_id ++;
+			start = delete_id;
+		} else {
+			delete_id ++;/*lint !e52*/
+		}
+	}
+#if 0
+	for (i = 0, j = 0; i < rule_count; i++) {
+		snprintf(name_buf, 16, "DR%d", i);
+		value = websGetVar(wp, name_buf, NULL);
+		if (value) {
+			deleArray[j++] = i;
+		}
+	}
+#endif
+	if (!j) {
+		free(deleArray);
+
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	static_deleteNthValueMulti(deleArray, rule_count, rules, ';');
+	free(deleArray);
+	deleArray = NULL;
+
+	cfg_set("websURLFilters", rules);
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_URL_FILTER, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_goform_url_filter_delete_process MESSAGE TO MC END"); /*lint !e26*/
+
+	//cfg_save();
+
+	zte_write_result_to_web(wp, SUCCESS);
+	return;
+}
+
+//DMZ¹æÔòÌí¼Ó
+void zte_fw_dmz(webs_t wp)
+{
+	char *dmzE, *ip_address;
+
+	dmzE = websGetVar(wp, T("DMZEnabled"), T(""));
+	ip_address = websGetVar(wp, T("DMZIPAddress"), T(""));
+
+	// someone use malform page.....
+	if (!dmzE || !strlen(dmzE)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (atoi(dmzE) && !isIpValid(ip_address)) {	// enable && invalid mac address
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	//zte_iptables_DMZ_Run();
+	if (atoi(dmzE) == 0) {
+		zte_web_write("DMZEnable", "0");// disable
+		slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User disable port forward!\n"));
+	} else {
+		zte_web_write("DMZEnable", "1");// enable
+		slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User enable port forward!\n"));
+		if (strlen(ip_address)) {
+			zte_web_write("DMZIPAddress", ip_address);
+		}
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_DMZ, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_dmz SEND MESSAGE TO MC END"); /*lint !e26*/
+
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+static int zte_fw_ipport_filter_check(webs_t wp, fw_ipport_filter_type *fw_ipport_filter)
+{
+	char *ip_version = NULL;
+	ip_version = websGetVar(wp, T("ip_version"), T(""));
+
+	if (0 == strlen(fw_ipport_filter->mac_address)
+	    && 0 == strlen(fw_ipport_filter->sip_1)
+	    && 0 == strlen(fw_ipport_filter->dip_1)
+	    && 0 == strlen(fw_ipport_filter->sprf)
+	    && 0 == strlen(fw_ipport_filter->dprf)) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_fw_ipport_filter_add -> No MAC/IP/Port input!"); /*lint !e26*/
+		return -1;
+	}
+
+	if (strlen(fw_ipport_filter->mac_address) > 0
+	    && !isMacValid(fw_ipport_filter->mac_address)) {
+		slog(MISC_PRINT, SLOG_ERR, "Mac address is error.");   /*lint !e26*/
+		return -1;
+	}
+
+	if (strlen(fw_ipport_filter->sip_1)) {
+		if (0 == strcmp(ip_version, IP_VERSION_V4)) {
+			if (!isIpNetmaskValid(fw_ipport_filter->sip_1)) {
+				slog(MISC_PRINT, SLOG_ERR, "zte_fw_ipport_filter_add -> src ip is invalid:[%s]", fw_ipport_filter->sip_1); /*lint !e26*/
+				return -1;
+			}
+		}
+	} else {
+		fw_ipport_filter->sip_1 = T("any/0");
+		slog(MISC_PRINT, SLOG_DEBUG, "liuyingnan check:[%s]", fw_ipport_filter->sip_1); /*lint !e26*/
+	}
+
+	if (strlen(fw_ipport_filter->dip_1)) {
+		if (0 == strcmp(ip_version, IP_VERSION_V4)) {
+			if (!isIpNetmaskValid(fw_ipport_filter->dip_1)) {
+				slog(MISC_PRINT, SLOG_ERR, "zte_fw_ipport_filter_add -> dest ip is invalid:[%s]", fw_ipport_filter->dip_1); /*lint !e26*/
+				return -1;
+			}
+		}
+	} else {
+		fw_ipport_filter->dip_1 = T("any/0");
+		slog(MISC_PRINT, SLOG_DEBUG, "liuyingnan check:[%s]", fw_ipport_filter->dip_1); /*lint !e26*/
+	}
+
+	fw_ipport_filter->sip_2 = fw_ipport_filter->dip_2 = "0";
+
+	if (!strcmp(fw_ipport_filter->protocol, T("TCP")))
+		fw_ipport_filter->proto = PROTO_TCP;
+	else if (!strcmp(fw_ipport_filter->protocol, T("UDP")))
+		fw_ipport_filter->proto = PROTO_UDP;
+	else if (!strcmp(fw_ipport_filter->protocol, T("None")))
+		fw_ipport_filter->proto = PROTO_NONE;
+	else if (!strcmp(fw_ipport_filter->protocol, T("ICMP")))
+		fw_ipport_filter->proto = PROTO_ICMP;
+	else if (!strcmp(fw_ipport_filter->protocol, T("TCP&UDP")))
+		fw_ipport_filter->proto = PROTO_TCP_UDP;
+	else {
+		slog(MISC_PRINT, SLOG_ERR, "protocol is invalid:[%s]", fw_ipport_filter->protocol); /*lint !e26*/
+		return -1;
+	}
+
+	/* port(1~65535) is valid only when the protocol is TCP or UDP */
+	if (!strlen(fw_ipport_filter->sprf)
+	    || fw_ipport_filter->proto == PROTO_NONE
+	    || fw_ipport_filter->proto == PROTO_ICMP) {
+		fw_ipport_filter->sprf_int = 0;
+	} else {
+		fw_ipport_filter->sprf_int = atoi(fw_ipport_filter->sprf);
+		if (fw_ipport_filter->sprf_int == 0 || fw_ipport_filter->sprf_int > 65535) {
+			slog(MISC_PRINT, SLOG_ERR, "sprf is invalid:[%s]", fw_ipport_filter->sprf); /*lint !e26*/
+			return -1;
+		}
+	}
+
+	if (!strlen(fw_ipport_filter->sprt)
+	    || fw_ipport_filter->proto == PROTO_NONE
+	    || fw_ipport_filter->proto == PROTO_ICMP) {
+		fw_ipport_filter->sprt_int = 0;
+	} else {
+		fw_ipport_filter->sprt_int = atoi(fw_ipport_filter->sprt);
+		if (fw_ipport_filter->sprt_int == 0 || fw_ipport_filter->sprt_int > 65535) {
+			slog(MISC_PRINT, SLOG_ERR, "sprt is invalid:[%s]", fw_ipport_filter->sprt); /*lint !e26*/
+			return -1;
+		}
+	}
+
+	if (!strlen(fw_ipport_filter->dprf)
+	    || fw_ipport_filter->proto == PROTO_NONE
+	    || fw_ipport_filter->proto == PROTO_ICMP) {
+		fw_ipport_filter->dprf_int = 0;
+	} else {
+		fw_ipport_filter->dprf_int = atoi(fw_ipport_filter->dprf);
+		if (fw_ipport_filter->dprf_int == 0 || fw_ipport_filter->dprf_int > 65535) {
+			slog(MISC_PRINT, SLOG_ERR, "dprf is invalid:[%s]", fw_ipport_filter->dprf); /*lint !e26*/
+			return -1;
+		}
+	}
+
+	if (!strlen(fw_ipport_filter->dprt)
+	    || fw_ipport_filter->proto == PROTO_NONE
+	    || fw_ipport_filter->proto == PROTO_ICMP) {
+		fw_ipport_filter->dprt_int = 0;
+	} else {
+		fw_ipport_filter->dprt_int = atoi(fw_ipport_filter->dprt);
+		if (fw_ipport_filter->dprt_int == 0 || fw_ipport_filter->dprt_int > 65535) {
+			slog(MISC_PRINT, SLOG_ERR, "dprt is invalid:[%s]", fw_ipport_filter->dprt); /*lint !e26*/
+			return -1;
+		}
+	}
+
+	if (0 == (strcmp(fw_ipport_filter->action_str, T("Accept")))) {
+		fw_ipport_filter->action = ACTION_ACCEPT;
+	} else if (0 == (strcmp(fw_ipport_filter->action_str, T("Drop")))) {
+		fw_ipport_filter->action = ACTION_DROP;
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "action is invalid:[%s]", fw_ipport_filter->action_str); /*lint !e26*/
+		return -1;
+	}
+
+	if (strlen(fw_ipport_filter->comment) > 32) {
+		slog(MISC_PRINT, SLOG_ERR, "comment is too long."); /*lint !e26*/
+		return -1;
+	}
+	// i know you will try to break our box... ;)
+	if (strchr(fw_ipport_filter->comment, ';') || strchr(fw_ipport_filter->comment, ',')) {
+		slog(MISC_PRINT, SLOG_ERR, "comment is invalid."); /*lint !e26*/
+		return -1;
+	}
+
+	return 1;
+}
+
+/*IPV4¶Ë¿Ú¹ýÂËÌí¼Ó*/
+static void zte_fw_ipport_filter_add_v4(webs_t wp)
+{
+	fw_ipport_filter_type fw_ipport_filter_v4;
+	char IPPortFilterRules[NV_FW_RULE_MAX_LEN] = {0};
+	char IPPortFilterRules_x[NV_ITEM_STRING_LEN_50] = {0};
+	int check_result = 0;
+	int count = 0;
+	int flag = 0;
+
+	memset(&fw_ipport_filter_v4, 0, sizeof(fw_ipport_filter_type));
+	fw_ipport_filter_v4.sip_1 = websGetVar(wp, T("sip_address"), T("any"));
+	fw_ipport_filter_v4.sip_2 = websGetVar(wp, T("sip_address2"), T(""));        // TODO: not support now
+	fw_ipport_filter_v4.sprf   = websGetVar(wp, T("sFromPort"), T("0"));
+	fw_ipport_filter_v4.sprt   = websGetVar(wp, T("sToPort"), T(""));
+	fw_ipport_filter_v4.dip_1 = websGetVar(wp, T("dip_address"), T("any"));
+	fw_ipport_filter_v4.dip_2 = websGetVar(wp, T("dip_address2"), T(""));        // TODO: not support now
+	fw_ipport_filter_v4.dprf   = websGetVar(wp, T("dFromPort"), T("0"));
+	fw_ipport_filter_v4.dprt   = websGetVar(wp, T("dToPort"), T(""));
+	fw_ipport_filter_v4.mac_address = websGetVar(wp, T("mac_address"), T(""));
+	fw_ipport_filter_v4.protocol        = websGetVar(wp, T("protocol"), T(""));                   // None | TCP | UDP | ICMP | TCP&UDP
+	fw_ipport_filter_v4.action_str     = websGetVar(wp, T("action"), T(""));                    // Drop | Accept
+	fw_ipport_filter_v4.comment      = websGetVar(wp, T("comment"), T(""));
+
+	check_result = zte_fw_ipport_filter_check(wp, &fw_ipport_filter_v4);
+	if (check_result < 0) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	for (count = 0; count <= 9; count ++) {
+		(void)snprintf(IPPortFilterRules_x, NV_ITEM_STRING_LEN_50, "IPPortFilterRules_%d", count);
+		memset(IPPortFilterRules, 0, sizeof(IPPortFilterRules));
+		zte_web_read(IPPortFilterRules_x, IPPortFilterRules);
+		if (0 == strcmp(IPPortFilterRules, "")) {
+			memset(IPPortFilterRules, 0, sizeof(IPPortFilterRules));
+			(void)snprintf(IPPortFilterRules, NV_FW_RULE_MAX_LEN, "%s,%s,%d,%d,%s,%s,%d,%d,%d,%d,%s,%s",
+			               fw_ipport_filter_v4.sip_1, fw_ipport_filter_v4.sip_2,
+			               fw_ipport_filter_v4.sprf_int, fw_ipport_filter_v4.sprt_int,
+			               fw_ipport_filter_v4.dip_1, fw_ipport_filter_v4.dip_2,
+			               fw_ipport_filter_v4.dprf_int, fw_ipport_filter_v4.dprt_int,
+			               fw_ipport_filter_v4.proto, fw_ipport_filter_v4.action,
+			               fw_ipport_filter_v4.comment, fw_ipport_filter_v4.mac_address);
+			(void)zte_web_write(IPPortFilterRules_x, IPPortFilterRules);
+			flag = 1;
+			break;
+		}
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FILTER, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_ipport_filter_add_v4 SEND MESSAGE TO MC END"); /*lint !e26*/
+	//zte_response_json_for_test(wp,"zte_fw_ipport_filter_add","send message to mc");
+	cfg_save();
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*IPV6¶Ë¿Ú¹ýÂËÌí¼Ó*/
+static void zte_fw_ipport_filter_add_v6(webs_t wp)
+{
+	fw_ipport_filter_type fw_ipport_filter_v6;
+	char IPPortFilterRulesV6[NV_FW_RULE_MAX_LEN] = {0};
+	char IPPortFilterRulesV6_x[NV_ITEM_STRING_LEN_50] = {0};
+	int check_result = 0;
+	int count = 0;
+	int flag = 0;
+
+	memset(&fw_ipport_filter_v6, 0, sizeof(fw_ipport_filter_type));
+	fw_ipport_filter_v6.sip_1          = websGetVar(wp, T("sip_address"), T("any"));
+	fw_ipport_filter_v6.sip_2          = websGetVar(wp, T("sip_address2"), T(""));        // TODO: not support now
+	fw_ipport_filter_v6.sprf           = websGetVar(wp, T("sFromPort"), T("0"));
+	fw_ipport_filter_v6.sprt           = websGetVar(wp, T("sToPort"), T(""));
+	fw_ipport_filter_v6.dip_1          = websGetVar(wp, T("dip_address"), T("any"));
+	fw_ipport_filter_v6.dip_2          = websGetVar(wp, T("dip_address2"), T(""));        // TODO: not support now
+	fw_ipport_filter_v6.dprf           = websGetVar(wp, T("dFromPort"), T("0"));
+	fw_ipport_filter_v6.dprt           = websGetVar(wp, T("dToPort"), T(""));
+	fw_ipport_filter_v6.mac_address    = websGetVar(wp, T("mac_address"), T(""));
+	fw_ipport_filter_v6.protocol       = websGetVar(wp, T("protocol"), T(""));                   // None | TCP | UDP | ICMP | TCP&UDP
+	fw_ipport_filter_v6.action_str     = websGetVar(wp, T("action"), T(""));                    // Drop | Accept
+	fw_ipport_filter_v6.comment        = websGetVar(wp, T("comment"), T(""));
+
+	check_result = zte_fw_ipport_filter_check(wp, &fw_ipport_filter_v6);
+	if (check_result < 0) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	for (count = 0; count <= 9; count ++) {
+		(void)snprintf(IPPortFilterRulesV6_x, NV_ITEM_STRING_LEN_50, "IPPortFilterRulesv6_%d", count);
+		memset(IPPortFilterRulesV6, 0, sizeof(IPPortFilterRulesV6));
+		zte_web_read(IPPortFilterRulesV6_x, IPPortFilterRulesV6);
+		if (0 == strcmp(IPPortFilterRulesV6, "")) {
+			memset(IPPortFilterRulesV6, 0, sizeof(IPPortFilterRulesV6));
+			(void)snprintf(IPPortFilterRulesV6, NV_FW_RULE_MAX_LEN, "%s,%s,%d,%d,%s,%s,%d,%d,%d,%d,%s,%s",
+			               fw_ipport_filter_v6.sip_1, fw_ipport_filter_v6.sip_2,
+			               fw_ipport_filter_v6.sprf_int, fw_ipport_filter_v6.sprt_int,
+			               fw_ipport_filter_v6.dip_1, fw_ipport_filter_v6.dip_2,
+			               fw_ipport_filter_v6.dprf_int, fw_ipport_filter_v6.dprt_int,
+			               fw_ipport_filter_v6.proto, fw_ipport_filter_v6.action,
+			               fw_ipport_filter_v6.comment, fw_ipport_filter_v6.mac_address);
+			(void)zte_web_write(IPPortFilterRulesV6_x, IPPortFilterRulesV6);
+			flag = 1;
+			break;
+		}
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FILTER, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_ipport_filter_add_v6 MESSAGE TO MC END"); /*lint !e26*/
+
+	//zte_response_json_for_test(wp,"zte_fw_ipport_filter_add","send message to mc");
+
+	cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*¶Ë¿Ú¹ýÂËÓÐЧÐÔ¼ì²é*/
+static int zte_fw_port_forward_check(webs_t wp, fw_port_forward_type *fw_port_forward)
+{
+	/* user choose nothing but press "apply" only */
+	if (0 == strlen(fw_port_forward->ip_address)
+	    && 0 == strlen(fw_port_forward->prf)
+	    && 0 == strlen(fw_port_forward->prt)
+	    && 0 == strlen(fw_port_forward->comment)) {
+		zte_web_write("PortForwardEnable", "1");
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FORWARD, 0, NULL, 0);
+		return -1;
+	}
+
+	if (!strlen(fw_port_forward->ip_address)) {
+		return -1;
+	}
+	if (!isIpValid(fw_port_forward->ip_address)) {
+		return -1;
+	}
+
+	// we dont trust user input.....
+	if (!fw_port_forward->prf || !strlen(fw_port_forward->prf)) {
+		return -1;
+	}
+	if (!(fw_port_forward->prf_int = atoi(fw_port_forward->prf))) {
+		return -1;
+	}
+	if (fw_port_forward->prf_int > 65535) {
+		return -1;
+	}
+
+	if (!fw_port_forward->prt) {
+		return -1;
+	}
+	if (strlen(fw_port_forward->prt)) {
+		if (!(fw_port_forward->prt_int = atoi(fw_port_forward->prt))) {
+			return -1;
+		}
+		if (fw_port_forward->prt_int < fw_port_forward->prf_int) {
+			return -1;
+		}
+		if (fw_port_forward->prt_int > 65535)
+			return -1;
+	} else {
+		fw_port_forward->prt_int = 0;
+	}
+
+	if (! strcmp(fw_port_forward->protocol, "TCP"))
+		fw_port_forward->proto = PROTO_TCP;
+	else if (!strcmp(fw_port_forward->protocol, "UDP"))
+		fw_port_forward->proto = PROTO_UDP;
+	else if (!strcmp(fw_port_forward->protocol, "TCP&UDP"))
+		fw_port_forward->proto = PROTO_TCP_UDP;
+	else {
+		return -1;
+	}
+	if (strlen(fw_port_forward->comment) > 32) {
+		return -1;
+	}
+	/* i know you will try to break our box... ;) */
+	if (strchr(fw_port_forward->comment, ';') || strchr(fw_port_forward->comment, ',')) {
+		return -1;
+	}
+
+	return 1;
+}
+
+/*Ìí¼ÓÒ»Ìõ·À»ðǽ*/
+void zte_fw_ipport_filter_add(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User added port filter!\n"));
+
+	char *ip_version = NULL;
+
+	ip_version = websGetVar(wp, T("ip_version"), T(""));
+
+	if (0 == strcmp(ip_version, IP_VERSION_V4)) {
+		zte_fw_ipport_filter_add_v4(wp);
+	} else if (0 == strcmp(ip_version, IP_VERSION_V6)) {
+		zte_fw_ipport_filter_add_v6(wp);
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "unknown ip_version:[%s]", ip_version); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+	}
+}
+
+/*Ìí¼ÓÒ»Ìõ¶Ë¿Úת·¢¹æÔò£¬½»ÓÉzte_routerͳһ´¦Àí*/
+void zte_fw_port_forward_add(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User added port forward!\n"));
+	fw_port_forward_type fw_port_forward;
+	int check_result = 0;
+	int count = 0;
+	int flag = 0;
+	char PortForwardRules[NV_FW_RULE_MAX_LEN] = {0};
+	char PortForwardRules_x[NV_ITEM_STRING_LEN_50] = {0};
+	memset(&fw_port_forward, 0, sizeof(fw_port_forward_type));
+	fw_port_forward.ip_address = websGetVar(wp, T("ipAddress"), T(""));
+	fw_port_forward.prf        = websGetVar(wp, T("portStart"), T(""));
+	fw_port_forward.prt        = websGetVar(wp, T("portEnd"), T(""));
+	fw_port_forward.protocol   = websGetVar(wp, T("protocol"), T(""));
+	fw_port_forward.comment    = websGetVar(wp, T("comment"), T(""));
+	//slog(MISC_PRINT,SLOG_DEBUG, "fw_port_forward.protocol:[%s]", fw_port_forward.protocol);
+
+	check_result = zte_fw_port_forward_check(wp, &fw_port_forward);
+	if (check_result < 0) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	//zte_web_write("PortForwardEnable", "1");
+	for (count = 0; count <= 9; count ++) {
+		(void)snprintf(PortForwardRules_x, NV_ITEM_STRING_LEN_50, "PortForwardRules_%d", count);
+		memset(PortForwardRules, 0, sizeof(PortForwardRules));
+		zte_web_read(PortForwardRules_x, PortForwardRules);
+		if (0 == strcmp(PortForwardRules, "")) {
+			memset(PortForwardRules, 0, sizeof(PortForwardRules));
+			(void)snprintf(PortForwardRules, NV_ITEM_STRING_LEN_200, "%s,%d,%d,%d,%s",
+			               fw_port_forward.ip_address, fw_port_forward.prf_int,
+			               fw_port_forward.prt_int, fw_port_forward.proto,
+			               fw_port_forward.comment);
+			(void)zte_web_write(PortForwardRules_x, PortForwardRules);
+			flag = 1;
+			break;
+		}
+	}
+
+	if (0 == flag) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FORWARD, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_port_forward_add MESSAGE TO MC END"); /*lint !e26*/
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*ɾ³ýV4µÄ¶Ë¿ÚÁбí*/
+static void zte_fw_ipport_filter_del_v4(webs_t wp)
+{
+	int i = 0, j = 0;
+	char_t *delete_id = NULL;
+	int id = 0;
+	char_t *start = NULL;
+	char IPPortFilterRules_x[NV_ITEM_STRING_LEN_50] = {0};
+	char IPPortFilterRules[NV_FW_RULE_MAX_LEN] = {0};
+	int flag = 0;
+
+	delete_id = websGetVar(wp, "delete_id", "");
+	slog(MISC_PRINT, SLOG_DEBUG, "delete_id is [%s].", delete_id); /*lint !e26*/
+
+	if (*delete_id == '\0') {
+		return; // no delete the v4 rule
+	}
+
+	//to delete the rules
+	for (start = delete_id; *delete_id != '\0';) {
+		if (*delete_id == ';') {
+			*delete_id = '\0';
+			id = atoi(start);
+			memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+			(void)snprintf(IPPortFilterRules_x, sizeof(IPPortFilterRules_x) - 1, "IPPortFilterRules_%d", id);
+			(void)zte_web_write(IPPortFilterRules_x, "");
+
+			delete_id ++;/*lint !e52*/
+			start = delete_id;
+		} else {
+			delete_id ++;/*lint !e52*/
+		}
+	}
+
+	//organize the rule
+	for (i = 0; i <= 9; i++) {
+		flag = 0;
+		memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+		memset(IPPortFilterRules, 0, sizeof(IPPortFilterRules));
+
+		(void)snprintf(IPPortFilterRules_x, sizeof(IPPortFilterRules_x) - 1, "IPPortFilterRules_%d", i);
+		(void)zte_web_read(IPPortFilterRules_x, IPPortFilterRules);
+
+		if (0 == strcmp(IPPortFilterRules, "")) {
+			for (j = (i + 1); j <= 9; j++) {
+				//reset
+				memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+				memset(IPPortFilterRules, 0, sizeof(IPPortFilterRules));
+
+				(void)snprintf(IPPortFilterRules_x, sizeof(IPPortFilterRules_x) - 1, "IPPortFilterRules_%d", j);
+				(void)zte_web_read(IPPortFilterRules_x, IPPortFilterRules);
+				if (0 != strcmp(IPPortFilterRules, "")) {
+					(void)zte_web_write(IPPortFilterRules_x, "");
+
+					memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+					(void)snprintf(IPPortFilterRules_x, sizeof(IPPortFilterRules_x) - 1, "IPPortFilterRules_%d", i);
+					(void)zte_web_write(IPPortFilterRules_x, IPPortFilterRules);
+
+					flag = 1;
+					break;
+				}
+			}
+
+			if (0 == flag) {
+				break;
+			}
+		}
+	}
+}
+
+/*ɾ³ýV6µÄ¶Ë¿ÚÁбí*/
+static void zte_fw_ipport_filter_del_v6(webs_t wp)
+{
+	int i = 0, j = 0;
+	char_t *delete_id = NULL;
+	int id = 0;
+	char_t *start = NULL;
+	char IPPortFilterRules_x[NV_ITEM_STRING_LEN_50] = {0};
+	char IPPortFilterRules[NV_FW_RULE_MAX_LEN_V6] = {0};
+	int flag = 0;
+
+	delete_id = websGetVar(wp, "delete_id_v6", "");
+	slog(MISC_PRINT, SLOG_DEBUG, "delete_id is [%s].", delete_id); /*lint !e26*/
+
+	if (*delete_id == '\0') {
+		return; // no delete the v6 rule
+	}
+
+	//to delete the rules
+	for (start = delete_id; *delete_id != '\0';) {
+		if (*delete_id == ';') {
+			*delete_id = '\0';
+			id = atoi(start);
+			memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+			(void)snprintf(IPPortFilterRules_x, sizeof(IPPortFilterRules_x) - 1, "IPPortFilterRulesv6_%d", id);
+			(void)zte_web_write(IPPortFilterRules_x, "");
+
+			delete_id ++;/*lint !e52*/
+			start = delete_id;
+		} else {
+			delete_id ++;/*lint !e52*/
+		}
+	}
+
+	//organize the rule
+	for (i = 0; i <= 9; i++) {
+		flag = 0;
+		memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+		memset(IPPortFilterRules, 0, sizeof(IPPortFilterRules));
+
+		(void)snprintf(IPPortFilterRules_x, sizeof(IPPortFilterRules_x) - 1, "IPPortFilterRulesv6_%d", i);
+		(void)zte_web_read(IPPortFilterRules_x, IPPortFilterRules);
+
+		if (0 == strcmp(IPPortFilterRules, "")) {
+			for (j = (i + 1); j <= 9; j++) {
+				//reset
+				memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+				memset(IPPortFilterRules, 0, sizeof(IPPortFilterRules));
+
+				(void)snprintf(IPPortFilterRules_x, sizeof(IPPortFilterRules_x) - 1, "IPPortFilterRulesv6_%d", j);
+				(void)zte_web_read(IPPortFilterRules_x, IPPortFilterRules);
+				if (0 != strcmp(IPPortFilterRules, "")) {
+					(void)zte_web_write(IPPortFilterRules_x, "");
+
+					memset(IPPortFilterRules_x, 0, sizeof(IPPortFilterRules_x));
+					(void)snprintf(IPPortFilterRules_x, sizeof(IPPortFilterRules_x) - 1, "IPPortFilterRulesv6_%d", i);
+					(void)zte_web_write(IPPortFilterRules_x, IPPortFilterRules);
+
+					flag = 1;
+					break;
+				}
+			}
+
+			if (0 == flag) {
+				break;
+			}
+		}
+	}
+
+}
+
+/*ɾ³ýij¶Ë¿ÚÁбí*/
+void zte_fw_ipport_filter_del_v4_v6(webs_t wp)
+{
+	//delete the v4 rule and v6 rule
+	zte_fw_ipport_filter_del_v4(wp);
+	zte_fw_ipport_filter_del_v6(wp);
+	cfg_save();
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_IPPORT_FILTER, 0, NULL, 0);
+
+	//response
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/**********************************************************************
+¿ª¹ØupnpÒµÎñ
+**********************************************************************/
+void zte_fw_upnp_set(webs_t wp, char_t *path, char_t *query)
+{
+	char *upnp_set = NULL;
+#if 0
+	//wanghan start ÓÉÓÚȱʧ¶¯Ì¬¿âÍ·Îļþdlfcn.h£¬miniupnpdÔÝʱÎÞ·¨±àÒë¹ý£¬ÏÈ´ò×®±£Ö¤webui²»»á¿¨×¡
+	zte_write_result_to_web(wp, SUCCESS);
+	return;
+	//wanghan end
+#endif
+	//zte_topsw_state_e_type status = ZTE_NVIO_DONE;
+
+	upnp_set = websGetVar(wp, T("upnp_setting_option"), T("0"));
+
+	if (atoi(upnp_set) == 0) {
+		// disable
+		(void)zte_web_write("upnpEnabled", "0");
+		slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User disable port forward!\n"));
+	} else {
+		// enable
+		(void)zte_web_write("upnpEnabled", "1");
+		slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User enable port forward!\n"));
+	}
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_UPNP, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_fw_upnp_set MESSAGE TO MC END"); /*lint !e26*/
+	//cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*************************** wan pppoe ***************************/
+void zte_goform_set_wan_gatewaymode_PPPOE(webs_t wp)
+{
+	char work_state[20] = {0};
+	char *actionLink = NULL;
+	char_t *pppoe_username = NULL;
+	char_t *pppoe_cc = NULL;
+	char_t *eth_dial_mode = NULL;
+
+	pppoe_username = websGetVar(wp, T("pppoe_username"), T(""));
+	pppoe_cc = websGetVar(wp, T("pppoe_cc"), T(""));
+	eth_dial_mode = websGetVar(wp, T("dial_mode"), T(""));
+	actionLink =  websGetVar(wp, T("action_link"), T(""));
+	cfg_set(NV_OPMS_WAN_MODE, "PPPOE");
+	cfg_set("ethwan_mode", "pppoe");
+	zte_write_result_to_web(wp, SUCCESS);
+	cfg_get_item("rj45_state", work_state, sizeof(work_state));
+
+	if (IFSTREQUAL(eth_dial_mode, "auto_dial")) {
+		cfg_set("ethwan_dialmode", "auto");
+		if (0 == strcmp(work_state, "idle")) { //rj45ÒѲåÈë Ôò×Ô¶¯²¦ºÅ ·ñÔòʲô¶¼²»×ö
+			cfg_set("pppoe_username", pppoe_username);
+			cfg_set("pppoe_cc", pppoe_cc);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	} else if (IFSTREQUAL(eth_dial_mode, "on_demand_dial")) {
+		cfg_set("ethwan_dialmode", "ondemand");
+		if (0 == strcmp(work_state, "idle")) { //rj45ÒѲåÈë Ôò×Ô¶¯²¦ºÅ ·ñÔòʲô¶¼²»×ö
+			cfg_set("pppoe_username", pppoe_username);
+			cfg_set("pppoe_cc", pppoe_cc);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	} else if (IFSTREQUAL(eth_dial_mode, "manual_dial")) { //Ö»ÓÐÔÚrj45ÒѾ­²åÈëµÄÇé¿öϲÅÄܹ»ÉèÖÃÊÖ¶¯Ä£Ê½
+		cfg_set("ethwan_dialmode", "manual");
+		if (!strcmp(actionLink, "connect")) {
+			cfg_set("pppoe_username", pppoe_username);
+			cfg_set("pppoe_cc", pppoe_cc);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		} else {
+			netdev_disconnect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	}
+	//cfg_save();
+}
+
+void zte_goform_set_wan_gatewaymode_DHCP(webs_t wp)
+{
+	char work_state[20] = {0};
+	char *actionLink = NULL;
+	char_t *eth_dial_mode = NULL;
+
+	actionLink = websGetVar(wp, T("action_link"), T(""));
+	eth_dial_mode = websGetVar(wp, T("dial_mode"), T(""));
+
+	cfg_set(NV_OPMS_WAN_MODE, "DHCP");
+	cfg_set("ethwan_mode", "dhcp");
+
+	zte_write_result_to_web(wp, SUCCESS);
+
+	cfg_set("ethwan_dialmode", "auto");//dhcp Ò³ÃæÉÏûÓÐÊÖ¶¯ ÔÝʱĬÈÏΪ×Ô¶¯²¦ºÅ
+	cfg_get_item("rj45_state", work_state, sizeof(work_state));
+
+	if (IFSTREQUAL(eth_dial_mode, "auto_dial")) {
+		cfg_set("ethwan_dialmode", "auto");
+		if (0 == strcmp(work_state, "idle"))//rj45ÒѲåÈë Ôò×Ô¶¯²¦ºÅ ·ñÔòʲô¶¼²»×ö
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+	} else if (IFSTREQUAL(eth_dial_mode, "on_demand_dial")) {
+		cfg_set("ethwan_dialmode", "ondemand");
+		if (0 == strcmp(work_state, "idle"))//rj45ÒѲåÈë Ôò×Ô¶¯²¦ºÅ ·ñÔòʲô¶¼²»×ö
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+	} else if (IFSTREQUAL(eth_dial_mode, "manual_dial")) { //Ö»ÓÐÔÚrj45ÒѾ­²åÈëµÄÇé¿öϲÅÄܹ»ÉèÖÃÊÖ¶¯Ä£Ê½
+		cfg_set("ethwan_dialmode", "manual");
+		if (!strcmp(actionLink, "connect")) {
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		} else {
+			netdev_disconnect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	}
+	//cfg_save();
+}
+
+void zte_goform_set_wan_gatewaymode_STATIC(webs_t wp)
+{
+	char work_state[20] = {0};
+	char *actionLink = NULL;
+	char_t *eth_dial_mode = NULL;
+	char_t  *static_wan_ipaddr = NULL;
+	char_t  *static_wan_netmask = NULL;
+	char_t  *static_wan_gateway = NULL;
+	char_t  *static_wan_primary_dns = NULL;
+	char_t  *static_wan_secondary_dns = NULL;
+
+	static_wan_ipaddr = websGetVar(wp, T("static_wan_ipaddr"), T(""));
+	static_wan_netmask = websGetVar(wp, T("static_wan_netmask"), T("0"));
+	static_wan_gateway = websGetVar(wp, T("static_wan_gateway"), T(""));
+	static_wan_primary_dns = websGetVar(wp, T("static_wan_primary_dns"), T(""));
+	static_wan_secondary_dns = websGetVar(wp, T("static_wan_secondary_dns"), T(""));
+	actionLink = websGetVar(wp, T("action_link"), T(""));
+	eth_dial_mode = websGetVar(wp, T("dial_mode"), T(""));
+
+	cfg_set("ethwan_mode", "static");
+	cfg_set(NV_OPMS_WAN_MODE, "STATIC");
+	zte_write_result_to_web(wp, SUCCESS);
+	cfg_get_item("rj45_state", work_state, sizeof(work_state));
+
+	if (IFSTREQUAL(eth_dial_mode, "auto_dial")) {
+		cfg_set("ethwan_dialmode", "auto");
+		if (0 == strcmp(work_state, "idle")) { //rj45ÒѲåÈë Ôò×Ô¶¯²¦ºÅ ·ñÔòʲô¶¼²»×ö
+			cfg_set("static_wan_ipaddr", static_wan_ipaddr);
+			cfg_set("static_wan_netmask", static_wan_netmask);
+			cfg_set("static_wan_gateway", static_wan_gateway);
+			cfg_set("static_wan_primary_dns", static_wan_primary_dns);
+			cfg_set("static_wan_secondary_dns", static_wan_secondary_dns);
+			cfg_set("static_ethwan_ip", static_wan_ipaddr);
+			cfg_set("static_ethwan_nw", static_wan_netmask);
+			cfg_set("static_ethwan_gw", static_wan_gateway);
+			cfg_set("static_ethwan_pridns", static_wan_primary_dns);
+			cfg_set("static_ethwan_secdns", static_wan_secondary_dns);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	} else if (IFSTREQUAL(eth_dial_mode, "on_demand_dial")) {
+		cfg_set("ethwan_dialmode", "ondemand");
+		if (0 == strcmp(work_state, "idle")) { //rj45ÒѲåÈë Ôò×Ô¶¯²¦ºÅ ·ñÔòʲô¶¼²»×ö
+			cfg_set("static_wan_ipaddr", static_wan_ipaddr);
+			cfg_set("static_wan_netmask", static_wan_netmask);
+			cfg_set("static_wan_gateway", static_wan_gateway);
+			cfg_set("static_wan_primary_dns", static_wan_primary_dns);
+			cfg_set("static_wan_secondary_dns", static_wan_secondary_dns);
+			cfg_set("static_ethwan_ip", static_wan_ipaddr);
+			cfg_set("static_ethwan_nw", static_wan_netmask);
+			cfg_set("static_ethwan_gw", static_wan_gateway);
+			cfg_set("static_ethwan_pridns", static_wan_primary_dns);
+			cfg_set("static_ethwan_secdns", static_wan_secondary_dns);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	} else if (IFSTREQUAL(eth_dial_mode, "manual_dial")) { //Ö»ÓÐÔÚrj45ÒѾ­²åÈëµÄÇé¿öϲÅÄܹ»ÉèÖÃÊÖ¶¯Ä£Ê½
+		cfg_set("ethwan_dialmode", "manual");
+		if (!strcmp(actionLink, "connect")) {
+			cfg_set("static_wan_ipaddr", static_wan_ipaddr);
+			cfg_set("static_wan_netmask", static_wan_netmask);
+			cfg_set("static_wan_gateway", static_wan_gateway);
+			cfg_set("static_wan_primary_dns", static_wan_primary_dns);
+			cfg_set("static_wan_secondary_dns", static_wan_secondary_dns);
+			cfg_set("static_ethwan_ip", static_wan_ipaddr);
+			cfg_set("static_ethwan_nw", static_wan_netmask);
+			cfg_set("static_ethwan_gw", static_wan_gateway);
+			cfg_set("static_ethwan_pridns", static_wan_primary_dns);
+			cfg_set("static_ethwan_secdns", static_wan_secondary_dns);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		} else {
+			netdev_disconnect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	}
+	//cfg_save();
+}
+
+void zte_goform_set_wan_gatewaymode_AUTO(webs_t wp)
+{
+	char work_state[20] = {0};
+	char_t *pppoe_username = NULL;
+	char_t *pppoe_cc = NULL;
+	char_t *actionLink = NULL;
+	char_t *eth_dial_mode = NULL;
+
+	pppoe_username = websGetVar(wp, T("pppoe_username"), T(""));
+	pppoe_cc = websGetVar(wp, T("pppoe_cc"), T(""));
+	actionLink =  websGetVar(wp, T("action_link"), T(""));
+	eth_dial_mode = websGetVar(wp, T("dial_mode"), T(""));
+
+	cfg_set("ethwan_mode", "auto");
+	cfg_set("ethwan_dialmode", "auto");
+	cfg_set(NV_OPMS_WAN_MODE, "AUTO");
+
+	zte_write_result_to_web(wp, SUCCESS);
+
+	cfg_get_item("rj45_state", work_state, sizeof(work_state));
+
+	if (IFSTREQUAL(eth_dial_mode, "auto_dial")) {
+		cfg_set("ethwan_dialmode", "auto");
+		if (0 == strcmp(work_state, "idle")) { //rj45ÒѲåÈë Ôò×Ô¶¯²¦ºÅ ·ñÔòʲô¶¼²»×ö
+			cfg_set("pppoe_username", pppoe_username);
+			cfg_set("pppoe_cc", pppoe_cc);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	} else if (IFSTREQUAL(eth_dial_mode, "on_demand_dial")) {
+		cfg_set("ethwan_dialmode", "ondemand");
+		if (0 == strcmp(work_state, "idle")) { //rj45ÒѲåÈë Ôò×Ô¶¯²¦ºÅ ·ñÔòʲô¶¼²»×ö
+			cfg_set("pppoe_username", pppoe_username);
+			cfg_set("pppoe_cc", pppoe_cc);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	} else if (IFSTREQUAL(eth_dial_mode, "manual_dial")) { //Ö»ÓÐÔÚrj45ÒѾ­²åÈëµÄÇé¿öϲÅÄܹ»ÉèÖÃÊÖ¶¯Ä£Ê½
+		cfg_set("ethwan_dialmode", "manual");
+		if (!strcmp(actionLink, "connect")) {
+			cfg_set("pppoe_username", pppoe_username);
+			cfg_set("pppoe_cc", pppoe_cc);
+			netdev_connect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		} else {
+			netdev_disconnect_internet(RJ45_WAN_DEV, MODULE_ID_WEB_CGI);
+		}
+	}
+	//cfg_save();
+}
+
+void zte_goform_set_operation_mode(webs_t wp)
+{
+	char_t	*mode = NULL;
+	char	oldMode[128] = {0};
+	char buf[NV_ITEM_STRING_LEN_20] = {0};
+
+	cfg_get_item(NV_BLC_WAN_MODE, oldMode, sizeof(oldMode));
+	mode = websGetVar(wp, T("opMode"), T("PPP"));
+	cfg_set(NV_BLC_WAN_MODE, mode);
+
+	if (!strcmp(mode, oldMode)) {
+		zte_write_result_to_web(wp, FAILURE);
+	} else {
+		zte_write_result_to_web(wp, SUCCESS);
+		slog(MISC_PRINT, SLOG_NORMAL,"zte_goform_set_operation_mode: send MSG_CMD_RESTART_REQUEST\n");
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL, 0);
+	}
+}
+
+
+//Æô¶¯pingÕï¶Ï
+void zte_ping_diagnostics_start(webs_t wp)
+{
+	char_t *diag_addr = NULL;
+	char_t *repetition_count = NULL;
+	char_t *time_out = NULL;
+	char_t *data_size = NULL;
+	char_t *diag_interface = NULL;
+
+	diag_addr        = websGetVar(wp, T("ping_diag_addr"), T(""));
+	repetition_count = websGetVar(wp, T("ping_repetition_count"), T(""));
+	time_out         = websGetVar(wp, T("ping_time_out"), T(""));
+	data_size        = websGetVar(wp, T("ping_data_size"), T(""));
+	diag_interface   = websGetVar(wp, T("ping_diag_interface"), T(""));
+
+	cfg_set("ping_result", "");
+
+	if ('\0' == (*diag_addr) || '\0' == (*repetition_count) || atoi(repetition_count) < 1) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	(void)zte_web_write("ping_diag_addr", diag_addr);
+
+	if ('\0' != (*repetition_count))
+		(void)zte_web_write("ping_repetition_count", repetition_count);
+
+	if ('\0' != (*time_out))
+		(void)zte_web_write("ping_time_out", time_out);
+
+	if ('\0' != (*data_size))
+		(void)zte_web_write("ping_data_size", data_size);
+
+	if ('\0' != (*diag_interface))
+		(void)zte_web_write("ping_diag_interface", diag_interface);
+
+	//cfg_save();
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_NET_PING_DIAGNOSTICS, 0, NULL, 0);
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+//¹Ø±ÕpingÕï¶Ï
+void zte_ping_diagnostics_stop(webs_t wp)
+{
+	system("killall ping");
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+void zte_ping_result_clear(webs_t wp)
+{
+	cfg_set("ping_result", "");
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/wifi/zte_web_lan.c b/lynq/MD310EU/ap/app/goahead/interface5.0/wifi/zte_web_lan.c
new file mode 100755
index 0000000..2eed67f
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/wifi/zte_web_lan.c
@@ -0,0 +1,2116 @@
+
+/************************************************************************
+* °æÈ¨ËùÓÐ (C)2010, ÉîÛÚÊÐÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+*
+* ÎļþÃû³Æ£º zte_web_lan.c
+* Îļþ±êʶ£º
+* ÄÚÈÝÕªÒª£º
+* ÆäËü˵Ã÷£º
+* µ±Ç°°æ±¾£º V0.1
+* ×÷    Õߣº zyt
+* Íê³ÉÈÕÆÚ£º 2010-11-06
+*
+* Ð޸ļǼ1£º
+* ÐÞ¸ÄÄÚÈÝ£º³õʼ°æ±¾
+************************************************************************/
+
+/**************************************************************************
+* Ð޸ıàºÅ : й¦ÄÜ
+* ÐÞ ¸Ä ÈË : chenjie10092374
+* ÐÞ¸ÄÈÕÆÚ : 2014.6.24
+* ÐÞ¸ÄÄÚÈÝ : Ìí¼ÓÖ§³Öufi monitor¹¦ÄÜ´¦Àí´úÂë
+**************************************************************************/
+#include   <ctype.h>
+
+#include "zte_web_interface.h"
+#include "./net/zte_web_net_other.h"
+#include "netotherapi.h"
+
+#define WDS_DISABLE "0"
+#define WDS_ROOTAP "1"
+#define WDS_CLIENT "2"
+#define WDS_REPEATER "3"
+#define WIFI_MAX_STA_NUM 32 //kw 3
+
+
+#define NV_WRITE(nv_name, str, ret)  do{ ret = zte_web_write(nv_name, (char *)str);}while(0)
+
+static int zte_wlan_ssid1_basic_set(webs_t wp, unsigned int *wifi_set_flags);
+static int zte_lan_ssid1_security_set(webs_t wp, unsigned int *wifi_set_flags);
+static int zte_wlan_ssid2_basic_set(webs_t wp, unsigned int *wifi_set_flags);
+static int zte_lan_ssid2_security_set(webs_t wp, unsigned int *wifi_set_flags);
+
+static int get_random(unsigned char* buf, size_t len);
+
+
+enum {WIFI_COVERAGE_LEN = 16};
+/**
+ * @brief wifi share mode setting's struct
+ * @param wep_key_index
+ * @param wep_key1_mode
+ * @param wep_key2_mode
+ * @param wep_key3_mode
+ * @param wep_key4_mode
+ * @param wep_key1
+ * @param wep_key2
+ * @param wep_key3
+ * @param wep_key4
+ * @note
+ * @warning
+ */
+typedef struct {
+	uint8 wep_key_index[WF_WPS_KEY_INDEX_LEN];
+	uint8 wep_key1_mode[WF_KEY_MODE_LEN];
+	uint8 wep_key2_mode[WF_KEY_MODE_LEN];
+	uint8 wep_key3_mode[WF_KEY_MODE_LEN];
+	uint8 wep_key4_mode[WF_KEY_MODE_LEN];
+	uint8 wep_key1[WF_WEP_KEY_MAX_LEN];
+	uint8 wep_key2[WF_WEP_KEY_MAX_LEN];
+	uint8 wep_key3[WF_WEP_KEY_MAX_LEN];
+	uint8 wep_key4[WF_WEP_KEY_MAX_LEN];
+} zte_wifi_open_and_share_mode_s_type;
+/*wifi WPA/WPA2 mode setting*/
+typedef struct {
+	uint8 pre_share_key[WF_WPA_KEY_MAX_LEN];
+} zte_wifi_wpa_and_wpa2_mode_s_type;
+
+static char * str2upper(const char * in, char * out)
+{
+	char *p1 = in;
+	char  *p2 = out;
+	if (in == NULL || out == NULL) return NULL;
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s]  in=%s\n", __FILE__, in);
+
+	while (*p1   != '\0') {
+		//if (isalpha(*p1)) {//cov m
+		if ((*p1) >= 'a' && (*p1) <= 'z') {
+			*p2   = toupper(*p1);
+		} else {
+			*p2  =  *p1;
+		}
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s]  UPPER = %c[%d],  Lower=%c[%d]\n", __FILE__, *p2, *p2, *p1, *p1);
+		p1++;
+		p2++;
+	}
+
+	*p2 = '\0';
+	return out;
+
+}
+
+static int validate_pin_code(unsigned long code)
+{
+	unsigned long accum = 0;
+	accum += 3 * ((code / 10000000) % 10);
+	accum += 1 * ((code / 1000000) % 10);
+	accum += 3 * ((code / 100000) % 10);
+	accum += 1 * ((code / 10000) % 10);
+	accum += 3 * ((code / 1000) % 10);
+	accum += 1 * ((code / 100) % 10);
+	accum += 3 * ((code / 10) % 10);
+	accum += 1 * ((code / 1) % 10);
+	return (0 == (accum % 10));
+}
+static int zte_Safe_valid_SpecialCharForSSID(char single_data)
+{
+	/*if(single_data == '&') return 0;
+	else if(single_data == '.') return 0;
+	else if(single_data == '`') return 0;
+	else if(single_data == '\\') return 0;
+	else*/
+	return 1;
+}
+
+
+static data_safe_result_type_t zte_Safe_noSpecialCharForSSID(char *str)
+{
+#if 0 //kw 3
+	int i = 0;
+	int len = 0;
+	if (NULL == str) {
+		return 0;
+	}
+
+	len = strlen(str);
+	for (i = 0; i < len; i++) {
+		if (zte_Safe_valid_SpecialCharForSSID(str[i]) != 0) {
+			continue;
+		} else {
+			return 0;
+		}
+	}
+#endif
+	return 1;
+}
+
+void wlan_set_change_ssid_key_status()
+{
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MMI, MSG_CMD_MODIFY_SSID_KEY, 0, NULL, 0);
+}
+
+
+void wifi_work_mode_set_basic()
+{
+	char m_ssid_enable[20] = {0};
+	char system_restore_flg[32] = {0};
+	char MAX_Access_num[16] = {0};
+	char m_MAX_Access_num[16] = {0};
+	char MAX_Station_num[16] = {0};
+
+	char num_buf[12] = {0};
+	char m_num_buf[12] = {0};
+	int max_sta_num = 0;
+	int max_num = 0;
+	int m_max_num = 0;
+	char max_access_bak[16] = {0};
+	char max_station_bak[16] = {0};
+	cfg_get_item("MAX_Access_num_bbak", max_access_bak, sizeof(max_access_bak));
+	cfg_get_item("MAX_Station_num_bak", max_station_bak, sizeof(max_station_bak));
+	slog(MISC_PRINT, SLOG_ERR,"MAX_Access_num_bbak:%s,MAX_Station_num_bak:%s\n",max_access_bak,max_station_bak);
+	if(strlen(max_station_bak) != 0 && strcmp(max_station_bak, "0")){	
+		cfg_set("MAX_Station_num",max_station_bak);
+		cfg_set("MAX_Station_num_bak","0");
+	}
+	if(strlen(max_access_bak) != 0 && strcmp(max_access_bak, "0")){
+		cfg_set("MAX_Access_num", max_access_bak);	
+	}	
+
+	//wifi workmode set
+	cfg_get_item("m_ssid_enable", m_ssid_enable, sizeof(m_ssid_enable));
+	cfg_get_item("system_restore_flg", system_restore_flg, sizeof(system_restore_flg));
+
+	if (!strcmp(m_ssid_enable, "1")) {
+		cfg_set("AP_STARTMODE", "multi");
+		if (!strcmp(system_restore_flg, "first_restore")) {
+			cfg_set("system_restore_flg", "not_first_restore");
+			slog(MISC_PRINT, SLOG_DEBUG,"is first config access num.....\n");
+
+			cfg_get_item("MAX_Access_num", MAX_Access_num, sizeof(MAX_Access_num));
+			max_num = atoi(MAX_Access_num);
+			if (max_num > 1 && max_num < 33) {
+				sprintf(num_buf, "%d", max_num / 2);
+				slog(MISC_PRINT, SLOG_DEBUG,"num_buf = %s\n", num_buf);
+				zte_web_write("MAX_Access_num", num_buf);
+				zte_web_write("m_MAX_Access_num", num_buf);
+			}
+		}
+
+		cfg_get_item("MAX_Station_num", MAX_Station_num, sizeof(MAX_Station_num));
+		cfg_get_item("MAX_Access_num", MAX_Access_num, sizeof(MAX_Access_num));
+		cfg_get_item("m_MAX_Access_num", m_MAX_Access_num, sizeof(m_MAX_Access_num));
+
+		zte_web_write("MAX_Access_num_bak", MAX_Access_num);
+
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s],MAX_Access_num_bak=%s\n", __FILE__, MAX_Access_num);
+
+		max_sta_num = atoi(MAX_Station_num);
+		max_num = atoi(MAX_Access_num);
+		m_max_num = atoi(m_MAX_Access_num);
+		if ((max_sta_num < 0 || max_sta_num > WIFI_MAX_STA_NUM) ||
+			(max_num < 0 || max_num > WIFI_MAX_STA_NUM)) { //kw 3
+			slog(MISC_PRINT, SLOG_ERR,"\n error max_sta_num parameter\n");
+			return;
+		}
+
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s],MAX_Station_num=%s,MAX_Access_num=%s,m_MAX_Access_num=%s\n", __FILE__, MAX_Station_num, MAX_Access_num, m_MAX_Access_num);
+		if (max_num == max_sta_num) {
+			sprintf(m_num_buf, "%d", max_sta_num / 2);
+			zte_web_write("MAX_Access_num", m_num_buf);
+			zte_web_write("m_MAX_Access_num", m_num_buf);
+		} else {
+			if (max_num < max_sta_num) { // ʵ¼ÊÉÏ£¬³ýÁ˵ÈÓÚ×î´óÖµ£¬¾ÍÊÇСÓÚ×î´óÖµ£¬´Ë´¦ÅжÏÎÞÒâÒå
+				m_max_num = max_sta_num - max_num;
+				sprintf(m_num_buf, "%d", m_max_num);
+				zte_web_write("m_MAX_Access_num", m_num_buf);
+			}
+
+		}
+
+	} else if (!strcmp(m_ssid_enable, "0")) {
+		cfg_set("AP_STARTMODE", "standard");
+		cfg_get_item("MAX_Access_num_bak", MAX_Access_num, sizeof(MAX_Access_num));
+		zte_web_write("MAX_Access_num", MAX_Access_num);
+	} else {
+		slog(MISC_PRINT, SLOG_ERR,"\n error wifi_work_mode_set parameter\n");
+		return;
+	}
+}
+
+void zte_lan_stop_apsta()
+{
+	zte_web_write("wifi_sta_connection", "0");
+	//zte_web_write("blc_switch", "00");
+	zte_web_write("user_initiate_disconnect", "0"); //Óû§Ö÷¶¯Á¬½Ó״̬£¬Í˳ö¸ÉԤģʽ
+	zte_web_write("manual_d_wifi", "0");
+
+	slog(MISC_PRINT, SLOG_NORMAL,"[zte_lan_stop_apsta]MSG_CMD_WIFI_STATION_CLOSE_OPEN_MSSID\n", 0, NULL);
+
+	//zte_send_message(MODULE_ID_WIFI, MSG_CMD_WIFI_STATION_CLOSE_OPEN_MSSID, 0,  NULL);
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_STATION_CLOSE_OPEN_MSSID, 0, NULL, 0);
+}
+
+void zte_wlan_basic_set(webs_t wp)
+{
+	char_t *wifi_on = NULL, *old_wifi_on = NULL;
+	char_t *radio_off = NULL;
+	char_t  *wirelessmode = NULL, *old_wirelessmode = NULL;
+	char_t  *countrycode = NULL, *old_countrycode = NULL;
+	//char_t  *ssid = NULL, *old_ssid = NULL;
+	char_t  *broadcastssid = NULL, *old_broadcastssid = NULL ;
+	char_t  *channel = NULL, *old_channel = NULL;
+	//char_t *abg_rate = NULL,*old_abg_rate = NULL;
+	//char_t *NoForwarding = NULL,*old_NoForwarding = NULL;
+	char_t *MAX_Access_num = NULL, *old_MAX_Access_num = NULL;
+	char_t *m_ssid_enable = NULL, *old_m_ssid_enable = NULL;
+	//char_t *m_SSID = NULL,*old_m_SSID = NULL;
+	//char_t *m_HideSSID = NULL,*old_m_HideSSID = NULL;
+	//char_t *m_NoForwarding = NULL,*old_m_NoForwarding =NULL;
+	char_t *wifi_11n_cap = NULL, *old_wifi_11n_cap = NULL;
+	//char_t  *channel_JP = NULL, *old_channel_JP = NULL;
+	char_t  *wifi_band = NULL, *old_wifi_band = NULL;
+
+	//int Access_num = 0;
+	unsigned int wifi_set_flags = 0;
+	char wifi_set_flags_str[NV_ITEM_STRING_LEN_20] = {0};
+	char wifi_sta_connection[8] = {0};
+
+	zte_topsw_state_e_type nv_ret = ZTE_NVIO_DONE;
+	char nv_basic[NVIO_WIFI_MAX_LEN] = {0}; // for nv read and write
+//cov m
+#define NV_READ(nv_name, str, ret) do{ret = zte_web_read(nv_name, nv_basic); str = nv_basic;}while(0)
+	/*lint -e717*/
+	//#define NV_WRITE(nv_name, str, ret)  do{ ret = zte_web_write(nv_name, (char *)str);}while(0)
+
+	slog(WIFI_PRINT, SLOG_ERR, "zte_wlan_basic_set enter \n");
+
+	//reset wifi_set_flags
+	(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, "");
+
+	//wifiEnabled or not
+	memset(nv_basic, 0, sizeof(nv_basic));
+	wifi_on = websGetVar(wp, T("wifiEnabled"), NULL);
+	if (wifi_on != NULL) {
+		if (STR_EQUAL(wifi_on, "0")) {
+			slog(MISC_PRINT, SLOG_ERR, T("UFIx User disable WIFI swtich!\n"));
+		} else if (STR_EQUAL(wifi_on, "1")) {
+			slog(MISC_PRINT, SLOG_ERR, T("UFIx User enable WIFI swtich!\n"));
+		}
+		NV_READ("wifiEnabled", old_wifi_on, nv_ret);
+		printf("[%s:%s]old_wifi_on=%s, nv_ret=%d\n", __FILE__, __FUNCTION__, old_wifi_on, nv_ret);
+		//NV_READ("RadioOff", radio_off, nv_ret);
+		//printf("[%s:%s]radio_off=%s, nv_ret=%d",__FILE__, __FUNCTION__, radio_off,nv_ret);
+		if (!STR_EQUAL(wifi_on, old_wifi_on)) { //kw 3
+			//send_to_mc = TRUE;
+			wifi_set_flags |= ZTE_WLAN_ON_OFF_SET;
+			NV_WRITE("wifiEnabled", wifi_on, nv_ret);
+
+#if 0
+			if (STR_EQUAL(wifi_on, "0") && STR_EQUAL(radio_off, "1")) {
+				NV_WRITE("wifiEnabled", wifi_on, nv_ret);
+				NV_WRITE("RadioOff", wifi_on, nv_ret);
+				NV_WRITE("RadioOn", wifi_on, nv_ret);
+
+			} else if (STR_EQUAL(wifi_on, "1")) {
+				NV_WRITE("wifiEnabled", wifi_on, nv_ret);
+				NV_WRITE("RadioOn", wifi_on, nv_ret);
+			}
+#endif
+		}
+		printf("[%s:%s]wifi_on:[%s]\n", __FILE__, __FUNCTION__, wifi_on);
+	}
+
+	//wifiMode
+	memset(nv_basic, 0, sizeof(nv_basic));
+	wirelessmode = websGetVar(wp, T("wifiMode"), NULL);
+	if (wirelessmode != NULL) {
+		slog(MISC_PRINT, SLOG_ERR, T("UFIx User set WIFI advanced settings!\n"));
+		printf("[%s:%s]wirelessmode:%s\n", __FILE__, __FUNCTION__, wirelessmode);   /*lint !e26*/
+		NV_READ("WirelessMode", old_wirelessmode, nv_ret);
+		printf("[%s:%s]old_wirelessmode=%s, nv_ret=%d\n", __FILE__, __FUNCTION__, old_wirelessmode, nv_ret); /*lint !e26*/
+		if (!STR_EQUAL(wirelessmode, old_wirelessmode)) { //kw 3
+			wifi_set_flags |= ZTE_WLAN_WIRELESS_MODE_SET;
+			NV_WRITE("WirelessMode", wirelessmode, nv_ret);
+			printf("[%s:%s]wirelessmode is :%s\n", __FILE__, __FUNCTION__, wirelessmode);       /*lint !e26*/
+		}
+	}
+
+	/* country code*/
+	memset(nv_basic, 0, sizeof(nv_basic));
+	countrycode = websGetVar(wp, T("countryCode"), NULL);
+	if (countrycode != NULL) {
+#ifdef WEBS_SECURITY
+		zte_web_read("wifi_sta_connection", wifi_sta_connection);
+		if(wifi_sta_connection[0] == '1')
+		{
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+#endif		
+		NV_READ("CountryCode", old_countrycode, nv_ret);
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]old_countrycode=%s, nv_ret=%d\n", __FILE__, __FUNCTION__, old_countrycode, nv_ret);  /*lint !e26*/
+		if (!STR_EQUAL(countrycode, old_countrycode)) { //kw 3
+			wifi_set_flags |= ZTE_WLAN_COUNTRY_SET;
+			NV_WRITE("CountryCode", countrycode, nv_ret);
+		}
+
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]countrycode:%s\n", __FILE__, __FUNCTION__, countrycode);         /*lint !e26*/
+	}
+
+#if 0  //²»ÊôÓڸ߼¶É䯵²ÎÊý
+	//broadcastSsidEnabled
+	memset(nv_basic, 0, sizeof(nv_basic));
+	broadcastssid = websGetVar(wp, T("broadcastSsidEnabled"), NULL);
+	if (broadcastssid != NULL) {
+		NV_READ("HideSSID", old_broadcastssid, nv_ret);
+		printf("[%s:%s]old_broadcastssid=%s, nv_ret=%d\n", __FILE__, __FUNCTION__, old_broadcastssid, nv_ret);  /*lint !e26*/
+		if ((nv_ret ==  ZTE_NVIO_DONE &&
+		     !STR_EQUAL(broadcastssid, old_broadcastssid)) ||
+		    (nv_ret !=  ZTE_NVIO_DONE)) {
+			//send_to_mc = TRUE;
+			wifi_set_flags |= ZTE_WLAN_BROADCAST_SET;
+			NV_WRITE("HideSSID", broadcastssid, nv_ret);
+		}
+		printf("[%s:%s]broadcastssid:%s\n", __FILE__, __FUNCTION__, broadcastssid);     /*lint !e26*/
+	}
+#endif
+	//selectedChannel
+	memset(nv_basic, 0, sizeof(nv_basic));
+	channel = websGetVar(wp, T("selectedChannel"), NULL);
+	if (channel != NULL) {
+		NV_READ("Channel", old_channel, nv_ret);
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]old_channel=%s, nv_ret=%d\n", __FILE__, __FUNCTION__, old_channel, nv_ret);  /*lint !e26*/
+		if (!STR_EQUAL(channel, old_channel)) { //kw 3
+			//send_to_mc = TRUE;
+			wifi_set_flags |= ZTE_WLAN_CHANNEL_SET;
+			NV_WRITE("Channel", channel, nv_ret);
+		}
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]channel:%s\n", __FILE__, __FUNCTION__, channel); /*lint !e26*/
+	}
+
+	//band setting
+	memset(nv_basic, 0, sizeof(nv_basic));
+	wifi_band = websGetVar(wp, T("wifi_band"), NULL);
+	if (wifi_band != NULL) {
+		NV_READ("wifi_band", old_wifi_band, nv_ret);
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]old_wifi_band=%s, nv_ret=%d\n", __FILE__, __FUNCTION__, old_wifi_band, nv_ret);      /*lint !e26*/
+		if (!STR_EQUAL(wifi_band, old_wifi_band)) { //kw 3
+			wifi_set_flags |= ZTE_WLAN_WIFI_BAND_SET;
+			NV_WRITE("wifi_band", wifi_band, nv_ret);
+		}
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]wifi_band:%s\n", __FILE__, __FUNCTION__, wifi_band);         /*lint !e26*/
+	}
+
+
+	//set wifi rate
+#if 0
+	memset(nv_basic, 0, sizeof(nv_basic));
+	abg_rate = websGetVar(wp, T("abg_rate"), NULL);
+	if (abg_rate != NULL) {
+		NV_READ("HT_MCS", old_abg_rate, nv_ret);
+		printf("old_abg_rate=%s, nv_ret=%d", old_abg_rate, nv_ret);  /*lint !e26*/
+		if ((nv_ret ==  ZTE_NVIO_DONE &&
+		     !STR_EQUAL(abg_rate, old_abg_rate)) ||
+		    (nv_ret !=  ZTE_NVIO_DONE)) {
+			wifi_set_flags |= ZTE_WLAN_DATA_RATE_SET;
+			NV_WRITE("HT_MCS", abg_rate, nv_ret);
+		}
+
+		printf("abg_rate:%s", abg_rate); /*lint !e26*/
+	}
+#endif
+
+#if 0 // not belong to RF parameters
+	//set  MAX_Access_num
+	memset(nv_basic, 0, sizeof(nv_basic));
+	MAX_Access_num = websGetVar(wp, T("MAX_Access_num"), NULL);
+	if (MAX_Access_num != NULL) {
+		NV_READ("MAX_Access_num", old_MAX_Access_num, nv_ret);
+		printf("[%s:%s]old_MAX_Access_num=%s, nv_ret=%d\n", __FILE__, __FUNCTION__, old_MAX_Access_num, nv_ret);    /*lint !e26*/
+		if ((nv_ret ==  ZTE_NVIO_DONE &&
+		     !STR_EQUAL(MAX_Access_num, old_MAX_Access_num)) ||
+		    (nv_ret !=  ZTE_NVIO_DONE)) {
+			wifi_set_flags |= ZTE_WLAN_MAX_ACCESS_NUM_SET;
+			NV_WRITE("MAX_Access_num", MAX_Access_num, nv_ret);
+			NV_WRITE("MAX_Access_num_user_set", "1", nv_ret);
+		}
+
+		printf("[%s:%s]MAX_Access_num:%s\n", __FILE__, __FUNCTION__, MAX_Access_num);   /*lint !e26*/
+	}
+#endif
+	//set  m_ssid_enable
+	memset(nv_basic, 0, sizeof(nv_basic));
+	m_ssid_enable = websGetVar(wp, T("m_ssid_enable"), NULL);
+	if (m_ssid_enable != NULL) {
+#if 1
+		NV_READ("m_ssid_enable", old_m_ssid_enable, nv_ret);
+		slog(MISC_PRINT, SLOG_DEBUG,"old_m_ssid_enable=%s, nv_ret=%d\n", old_m_ssid_enable, nv_ret);/*lint !e26*/
+		if (!STR_EQUAL(m_ssid_enable, old_m_ssid_enable)) { //kw 3
+			wifi_set_flags |= ZTE_WLAN_SET_AP_MSSID;
+			NV_WRITE("m_ssid_enable", m_ssid_enable, nv_ret);
+			wlan_set_change_ssid_key_status();//added by dujiajiao
+			wifi_work_mode_set_basic();
+		}
+#else
+		if (!strcmp(m_ssid_enable, "1")) {
+			NV_WRITE("m_ssid_enable", "0", nv_ret);
+		}
+#endif
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]m_ssid_enable:%s\n", __FILE__, __FUNCTION__, m_ssid_enable); /*lint !e26*/
+	}
+
+	//set  wifi_11n_cap
+	memset(nv_basic, 0, sizeof(nv_basic));
+	NV_READ("wifi_11n_cap", old_wifi_11n_cap, nv_ret);
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]old_wifi_11n_cap=%s, nv_ret=%d\n", __FILE__, __FUNCTION__, old_wifi_11n_cap, nv_ret); /*lint !e26*/
+	wifi_11n_cap = websGetVar(wp, T("wifi_11n_cap"), NULL);
+	if (wifi_11n_cap != NULL) {
+		if (!STR_EQUAL(wifi_11n_cap, old_wifi_11n_cap)) { //kw 3
+			wifi_set_flags |= ZTE_WLAN_WIRELESS_MODE_SET;
+			NV_WRITE("wifi_11n_cap", wifi_11n_cap, nv_ret);
+		}
+
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]wifi_11n_cap:%s\n", __FILE__, __FUNCTION__, wifi_11n_cap);       /*lint !e26*/
+	}
+
+	//last, write the wifi_set_flags
+	(void)snprintf(wifi_set_flags_str, sizeof(wifi_set_flags_str) - 1, "%u", wifi_set_flags);
+	(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, wifi_set_flags_str);
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]wifi_set_flags:[0x%x] to [%s]\n", __FILE__, __FUNCTION__, wifi_set_flags, wifi_set_flags_str); /*lint !e26*/
+
+	if (0 != wifi_set_flags) {
+		unsigned int  flags = 0;
+		UCHAR  flag_str[8] = {0};
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]send wifi para to wlan-server@basic_set\n", __FILE__, __FUNCTION__); /*lint !e26*/
+
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]m_ssid_enable=%s,wifi_on=%s\n", __FILE__, __FUNCTION__, m_ssid_enable, wifi_on); /*lint !e26*/
+
+		if (NULL != wifi_on && (wifi_set_flags & ZTE_WLAN_ON_OFF_SET)) {
+//¿ªÆôwifiʱºò£¬Èç¹ûͬʱ¿ªÆôMSSID£¬»¹ÊÇÖ»ÉèÖÿªÆôwifi µÄflags£¬ÒòΪMSSIDµÄnvÒѾ­ÉèÖùýÁË
+
+			if (0 == atoi(wifi_on))
+				flags = WIFI_ADVANCED_CLOSE;
+			else if (m_ssid_enable != NULL && 1 == atoi(m_ssid_enable)) { // ͬʱ¿ªÆômultisssid£¬ÒªÔ¤·Àapsta Ò»²¢¿ªÆôµÄÇé¿ö
+				flags = WIFI_ADVANCED_OPEN_VA01;
+			} else
+				flags = WIFI_ADVANCED_OPEN;
+
+		} else if (wifi_set_flags & ZTE_WLAN_SET_AP_MSSID) { // ÔÚwifi¿ª¹Ø¿ªÆôµÄ״̬Ï£¬¶Ô Multi SSID ½øÐпª¹ØÇл»
+			if (1 == atoi(m_ssid_enable))
+				flags = WIFI_ADVANCED_OPEN_VA1;
+			else
+				flags = WIFI_ADVANCED_CLOSE_MSSID;
+
+		} else { // ÉèÖø߼¶²ÎÊýÉ䯵
+			flags = WIFI_ADVANCED_RF;
+		}
+		snprintf(flag_str,sizeof(flag_str), "%d", flags);
+		zte_web_read("wifi_sta_connection", wifi_sta_connection);
+
+
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]m_ssid_enable=%s,wifi_on=%s\n", __FILE__, __FUNCTION__, m_ssid_enable, wifi_on); /*lint !e26*/
+
+//when open mssid , need close apsta at same time
+		if ((flags == WIFI_ADVANCED_OPEN_VA1) &&  atoi(wifi_sta_connection) == 1) {
+			zte_lan_stop_apsta();
+		} else {
+			//if(0 != zte_send_message(MODULE_ID_WIFI, MSG_CMD_WIFI_ADVANCED, strlen(flag_str)+1,  flag_str))
+			if (0 != ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_ADVANCED, strlen(flag_str) + 1, flag_str, 0)) {
+				zte_write_result_to_web(wp, FAILURE);
+				return;
+			}
+		}
+		slog(WIFI_PRINT, SLOG_ERR, "[%s:%s]wifi set cmd done! \n", __FILE__, __FUNCTION__); /*lint !e26*/
+	}
+	zte_write_result_to_web(wp, SUCCESS);
+
+}
+
+void zte_wlan_mac_filter_set(webs_t wp)
+{
+	char_t *ACL_mode = NULL;
+	char_t *old_ACL_mode = NULL;
+	char_t *wifi_mac_black_list = NULL;
+	char_t *wifi_mac_white_list = NULL;
+	char_t *old_wifi_mac_black_list = NULL;
+	char_t *old_wifi_mac_white_list = NULL;
+	char_t *wifi_hostname_black_list = NULL;
+	char_t *wifi_hostname_white_list = NULL;
+	unsigned int wifi_set_flags = 0;
+	char wifi_set_flags_str[NV_ITEM_STRING_LEN_20] = {0};
+	char accesscontrollist0[720] = {0};
+	zte_topsw_state_e_type nv_ret = ZTE_NVIO_DONE;
+	char nv_basic[NVIO_WIFI_MAX_LEN] = {0}; // for nv read and write
+	char nv_mac[720] = {0};
+//cov m
+#define NV_READ(nv_name, str, ret)  do{ret = zte_web_read(nv_name, nv_basic); str = nv_basic;}while(0)
+#define NV_READ_MAC(nv_name, str, ret)  do{ret = zte_web_read(nv_name, nv_mac); str = nv_mac;}while(0)
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]zte_wlan_mac_filter_set.\n", __FILE__, __FUNCTION__); /*lint !e26*/
+	memset(nv_basic, 0, sizeof(nv_basic));
+	NV_READ("ACL_mode", old_ACL_mode, nv_ret);
+	ACL_mode = websGetVar(wp, T("ACL_mode"), T(""));
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s] ACL_mode =%s,nv_ret = %d  old_ACL_mode = %s \n", __FILE__, __FUNCTION__, ACL_mode, nv_ret, old_ACL_mode);
+	if (ACL_mode != NULL) {
+		if (!strcmp(ACL_mode, "2")) {
+			slog(MISC_PRINT, SLOG_ERR, T("UFIx User enable black list!\n"));
+		} else if (!strcmp(ACL_mode, "0")) {
+			slog(MISC_PRINT, SLOG_ERR, T("UFIx User disable black list!\n"));
+		}
+		if (!STR_EQUAL(ACL_mode, old_ACL_mode)) { //kw 3
+			wifi_set_flags |= ZTE_WLAN_ACL_SET;
+			NV_WRITE("ACL_mode", ACL_mode, nv_ret);
+		}
+
+	} else {//klocwork
+		slog(MISC_PRINT, SLOG_ERR,"[%s:%s]ACL_mode:no such para.", __FILE__, __FUNCTION__); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	memset(nv_mac, 0, sizeof(nv_mac));
+	if (!strcmp(ACL_mode, "2")) {
+		char  black_list[720] = {0};
+		NV_READ_MAC("wifi_mac_black_list", old_wifi_mac_black_list, nv_ret);
+		wifi_mac_black_list = websGetVar(wp, T("wifi_mac_black_list"), T(""));
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s] wifi_mac_black_list = %s, old_wifi_mac_black_list=%s \n", __FILE__, wifi_mac_black_list, old_wifi_mac_black_list);
+		//cov m
+		if ((wifi_mac_black_list != NULL) && (strlen(wifi_mac_black_list) < sizeof(black_list))) {
+			str2upper(wifi_mac_black_list, black_list);
+			if (!STR_EQUAL(black_list, old_wifi_mac_black_list)) { //kw 3
+				wifi_set_flags |= ZTE_WLAN_ACL_SET;
+				NV_WRITE("wifi_mac_black_list", black_list, nv_ret);
+			}
+
+		}
+		wifi_hostname_black_list = websGetVar(wp, T("wifi_hostname_black_list"), T(""));
+		if (wifi_hostname_black_list != NULL)//klocwork
+			(void)zte_web_write("wifi_hostname_black_list", wifi_hostname_black_list);
+	} else if (!strcmp(ACL_mode, "1")) {
+		char  white_list[720] = {0};
+		NV_READ_MAC("wifi_mac_white_list", old_wifi_mac_white_list, nv_ret);
+		wifi_mac_white_list = websGetVar(wp, T("wifi_mac_white_list"), T(""));
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s] wifi_mac_white_list = %s,old_wifi_mac_white_list=%s \n", __FILE__,  wifi_mac_white_list, old_wifi_mac_white_list);
+		//cov m
+		if ((wifi_mac_white_list != NULL)  && (strlen(wifi_mac_white_list) < sizeof(white_list))) {
+			str2upper(wifi_mac_white_list, white_list);
+			if (!STR_EQUAL(white_list, old_wifi_mac_white_list)) { //kw 3
+				wifi_set_flags |= ZTE_WLAN_ACL_SET;
+				NV_WRITE("wifi_mac_white_list", white_list, nv_ret);
+			}
+
+		}
+		wifi_hostname_white_list = websGetVar(wp, T("wifi_hostname_white_list"), T(""));
+		if (wifi_hostname_white_list != NULL)//klocwork
+			(void)zte_web_write("wifi_hostname_white_list", wifi_hostname_white_list);
+	}
+	if ('\0' == *ACL_mode) {
+		slog(MISC_PRINT, SLOG_ERR,"[%s:%s]ACL_mode:invalid input para.", __FILE__, __FUNCTION__); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	//(void)zte_web_write("ACL_mode",ACL_mode);
+	//(void)zte_web_write("wifi_mac_black_list", wifi_mac_black_list);
+
+
+/*
+	if (!strcmp(ACL_mode, "2")) {
+		(void)zte_web_write("wifi_hostname_black_list", wifi_hostname_black_list);
+	} else if (!strcmp(ACL_mode, "1")) {
+		(void)zte_web_write("wifi_hostname_white_list", wifi_hostname_white_list);
+	}
+*/
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s] wifi_mac_black_list=%s ,wifi_mac_white_list=%s, wifi_set_flags=%d\n",
+	       __FILE__, wifi_mac_black_list, wifi_mac_white_list, wifi_set_flags);
+
+	if (wifi_set_flags != 0) {
+		(void)snprintf(wifi_set_flags_str, sizeof(wifi_set_flags_str) - 1, "%u", wifi_set_flags);
+		(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, wifi_set_flags_str);
+		//zte_send_message(MODULE_ID_WIFI,MSG_CMD_WIFI_MAC,0,NULL);
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_MAC, 0, NULL, 0);
+
+		slog(MISC_PRINT, SLOG_NORMAL,"[%s:%s] MSG_CMD_WIFI_MAC  send to wlan-server!\n", __FILE__, __FUNCTION__); /*lint !e26*/
+	} else {
+		slog(MISC_PRINT, SLOG_NORMAL,"[%s:%s]do not deal\n", __FILE__, __FUNCTION__);
+	}
+
+	zte_write_result_to_web(wp, SUCCESS);
+
+}
+
+void zte_wlan_wps_mode_set(webs_t wp)
+
+{
+	slog(MISC_PRINT, SLOG_ERR, T("UFIx User set wps mode!\n"));
+
+	char *wps_mode = NULL;
+	char *WPS_SSID = NULL;
+	char *wps_pin = NULL;
+
+//    char pinIsValidate[10] = {0};
+	char auth_mode[NV_ITEM_STRING_LEN_20] = {0};
+	char encrypType[WF_ENCRY_TYPE_LEN] = {0};
+	char wps_state[NV_ITEM_STRING_LEN_50] = {0};
+	int  pin_len = 0;
+	unsigned int wifi_set_flags = 0;
+	char wifi_set_flags_str[NV_ITEM_STRING_LEN_20] = {0};
+
+	char *wifi_wps_index = NULL;
+	char  wps_msg[16] = {0};
+
+	wps_mode = websGetVar(wp, T("wps_mode"), T(""));
+	WPS_SSID = websGetVar(wp, T("WPS_SSID"), T(""));
+	wifi_wps_index = websGetVar(wp, T("wifi_wps_index"), T(""));
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s] wifi_wps_index = %s\n", __FILE__, __FUNCTION__, wifi_wps_index);
+
+	if (('\0' == *wps_mode) || ('\0'  == *WPS_SSID)) {
+		slog(MISC_PRINT, SLOG_ERR,"[%s:%s]zte_lan_wps_set:invalid input para.\n wps_mode is [%s]\n WPS_SSID is [%s]", __FILE__, __FUNCTION__, wps_mode, WPS_SSID); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	(void) zte_web_read(NV_WIFI_WPS_STATE, wps_state);
+	if (0 == strcmp(wps_state, "1")) {
+		slog(MISC_PRINT, SLOG_ERR,"zte_lan_wps_set:invalid operate, wps in processing..");/*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (0 == strcmp(wps_mode, WPS_MODE_PBC)) {
+		(void)zte_web_write(NV_WIFI_WPS_STATE, "1");
+		(void)zte_web_write(NV_WIFI_WPS_MODE, wps_mode);
+		(void)zte_web_write(NV_WIFI_WPS_SSID, WPS_SSID);
+	} else if (0 == strcmp(wps_mode, WPS_MODE_PIN)) {
+		wps_pin = websGetVar(wp, T("wps_pin"), T(""));
+		//add by liuyingnan for server safe for xss attack start
+		if (DATA_NO_SAFE == zte_Safe_noSpecialChar(wps_pin)) {
+			slog(MISC_PRINT, SLOG_ERR,"[%s:%s]Get Data is no Safe:wps_pin:%s\n", __FILE__, __FUNCTION__, wps_pin); /*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+
+		//printf(" ---- zte_wlan_wps_mode_set len is %s\n", wps_pin);
+		if (wps_pin == NULL) {
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+
+		pin_len = strlen(wps_pin);
+		if ((pin_len == 0) || ((pin_len != 4) && (pin_len != 8))) {
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+		int wps_pin_num = atoi(wps_pin);
+		if(wps_pin_num<0 || wps_pin_num> INT_MAX-1)
+		{
+			wps_pin_num = 0;
+		}
+		if ((pin_len == 8) && !validate_pin_code(wps_pin_num)) {
+			zte_write_result_to_web(wp, FAILURE);
+			slog(MISC_PRINT, SLOG_ERR,"%s PIN check failed\n", __FUNCTION__);
+			return;
+		}
+
+
+		//add by liuyingnan for server safe for xss attack end
+		(void)zte_web_write(NV_WIFI_WPS_STATE, "1");
+		(void)zte_web_write(NV_WIFI_WPS_MODE, wps_mode);
+		(void)zte_web_write(NV_WIFI_WPS_SSID, WPS_SSID);
+		(void)zte_web_write(NV_WIFI_WPS_PIN, wps_pin);
+	} else {
+		slog(MISC_PRINT, SLOG_ERR,"[%s][%s]invalid wps_mode[%s].", __FILE__, __FUNCTION__, wps_mode); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	wifi_set_flags |= ZTE_WLAN_WPS_SET;
+
+	//last, write the wifi_set_flags
+	(void)snprintf(wifi_set_flags_str, sizeof(wifi_set_flags_str) - 1, "%u", wifi_set_flags);
+	(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, wifi_set_flags_str);
+
+	slog(MISC_PRINT, SLOG_NORMAL,"[%s][%s] send to wlan-server wps cmd\n", __FILE__, __FUNCTION__);
+
+
+	if (wifi_wps_index != NULL) {
+		zte_web_write(NV_WIFI_WPS_INDEX, wifi_wps_index);
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s] wifi_wps_index = %s\n", __FILE__, __FUNCTION__, wifi_wps_index);
+	}
+
+	//zte_send_message(MODULE_ID_WIFI,MSG_CMD_WIFI_WPS,0,NULL);
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_WPS, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]wifi set cmd done!", __FILE__, __FUNCTION__); /*lint !e26*/
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+
+
+void zte_wlan_web_ssid1_set(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_DEBUG, T("UFIx User set WIFI SSID settings!\n"));
+
+	unsigned int wifi_set_flags = 0;
+	char wifi_set_flags_str[NV_ITEM_STRING_LEN_20] = {0};
+	zte_topsw_state_e_type ret = ZTE_NVIO_DONE;
+
+	(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, "");
+
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_web_ssid1_set:+++++++++++++++++======\n");
+	if (FALSE == zte_wlan_ssid1_basic_set(wp, &wifi_set_flags)) {
+		slog(MISC_PRINT, SLOG_ERR,"zte_wlan_web_ssid1_set: zte_wlan_ssid1_basic_set failure .\n");/*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (-1 == zte_lan_ssid1_security_set(wp, &wifi_set_flags)) {
+		slog(MISC_PRINT, SLOG_ERR,"call zte_lan_ssid1_security_set failure .\n");/*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	(void)snprintf(wifi_set_flags_str, sizeof(wifi_set_flags_str) - 1, "%u", wifi_set_flags);
+	(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, wifi_set_flags_str);
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_web_ssid1_set: wifi_set_flags [%u] to [%s].\n", wifi_set_flags, wifi_set_flags_str); /*lint !e26*/
+
+	if (0 != wifi_set_flags) {
+		slog(MISC_PRINT, SLOG_NORMAL,"send wifi para to wlan-server@ssid1\n");/*lint !e26*/
+		//zte_send_message(MODULE_ID_WIFI,MSG_CMD_WIFI_SSID,NULL,NULL);
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_CFG_AP, 0, NULL, 0);
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]wifi set cmd done!", __FILE__, __FUNCTION__); /*lint !e26*/
+	}
+	zte_write_result_to_web(wp, SUCCESS);
+
+}
+
+
+
+void zte_wlan_ssid2_set(webs_t wp)
+{
+
+	unsigned int wifi_set_flags = 0;
+	char wifi_set_flags_str[NV_ITEM_STRING_LEN_20] = {0};
+	zte_topsw_state_e_type ret = ZTE_NVIO_DONE;
+
+	(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, "");
+
+	if (FALSE == zte_wlan_ssid2_basic_set(wp, &wifi_set_flags)) {
+		slog(MISC_PRINT, SLOG_ERR,"zte_wlan_ssid2_set: zte_wlan_ssid2_basic_set failure .");/*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (-1 == zte_lan_ssid2_security_set(wp, &wifi_set_flags)) {
+		slog(MISC_PRINT, SLOG_ERR,"call zte_lan_ssid2_security_set fail.\n .");/*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	(void)snprintf(wifi_set_flags_str, sizeof(wifi_set_flags_str) - 1, "%u", wifi_set_flags);
+	(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, wifi_set_flags_str);
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_ssid2_set: wifi_set_flags [%u] to [%s].", wifi_set_flags, wifi_set_flags_str);
+
+	if (0 != wifi_set_flags) {
+		slog(MISC_PRINT, SLOG_NORMAL,"send wifi para to wlan-server@ssid2");/*lint !e26*/
+		//zte_send_message(MODULE_ID_WIFI,MSG_CMD_WIFI_SSID_M,NULL,NULL);
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_CFG_AP2, 0, NULL, 0);
+		slog(MISC_PRINT, SLOG_DEBUG,"wifi set cmd done!");        /*lint !e26*/
+	}
+	zte_write_result_to_web(wp, SUCCESS);
+
+}
+
+
+
+/**********************************************************************
+* Function:        zte_wlan_sleep_set
+* Description:     to set the wifi sleep mode
+* Input:           http info
+* Output:
+* Return:           0:ok;-1:fail
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/07/11    V1.0        zhouti       first version
+**********************************************************************/
+void zte_wlan_sleep_set(webs_t wp)
+{
+	char_t *sleepMode = NULL;
+	char_t *wifi_sleep_mode = NULL;
+	//char_t *wifi_mac_black_list = NULL;
+	//char_t *wifi_hostname_black_list = NULL;
+	unsigned int wifi_set_flags = 0;
+	char wifi_set_flags_str[NV_ITEM_STRING_LEN_20] = {0};
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]zte_wlan_sleep_set.", __FILE__, __FUNCTION__); /*lint !e26*/
+	//printf("zhouti zte_wlan_sleep_set------------------------\n");
+	sleepMode = websGetVar(wp, T("sysIdleTimeToSleep"), T(""));
+	wifi_sleep_mode = websGetVar(wp, T("sysWifiSleepMode"), T(""));
+
+	if (NULL == sleepMode || '\0' == *sleepMode) {
+		slog(MISC_PRINT, SLOG_ERR,"sleepMode:invalid input para.");/*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	//printf("zhouti zte_wlan_sleep_set sleepMode is %s\n", sleepMode);
+	(void)zte_web_write("Sleep_interval", sleepMode);
+	(void)zte_web_write("wifi_sleep_mode", wifi_sleep_mode);
+	// (void)zte_web_write("wifi_mac_black_list", wifi_mac_black_list);
+	// (void)zte_web_write("wifi_hostname_black_list", wifi_hostname_black_list);
+
+
+	wifi_set_flags |= ZTE_WLAN_SET_AP_SLEEPTIMER;
+
+	(void)snprintf(wifi_set_flags_str, sizeof(wifi_set_flags_str) - 1, "%u", wifi_set_flags);
+	(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, wifi_set_flags_str);
+
+	slog(MISC_PRINT, SLOG_NORMAL,"send wifi para to wlan-mac_filter_set@basic_set");/*lint !e26*/
+	//zte_send_message(MODULE_ID_WIFI, MSG_CMD_WIFI_SLEEP, 0, NULL);
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_SLEEP, 0, NULL, 0);
+	//printf("wifi set cmd done!");/*lint !e26*/
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+static int check_web_input_wifi(char *str, int len)
+{
+	int i = 0;
+	if (str == NULL || len <= 0 || strlen(str) < len) {
+		return 0;
+	}
+	for (i = 0; i < len; i++) {
+		if (strchr("`$&*\\[];:\'\"<>,",str[i]) || !isprint(str[i])) {
+			return 0;
+		}
+	}
+	return 1;
+}
+
+/**********************************************************************
+* Function:        zte_wlan_coverage_set
+* Description:     to set the wifi coverage
+* Input:           http info
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2014/05/27    V1.0        zhouti       first version
+**********************************************************************/
+void zte_wlan_coverage_set(webs_t wp)
+{
+	char_t *wifi_coverage = NULL;
+	char_t old_wifi_coverage[WIFI_COVERAGE_LEN + 1] = {0};
+	unsigned int wifi_set_flags = 0;
+	char wifi_set_flags_str[NV_ITEM_STRING_LEN_20] = {0};
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_coverage_set.");
+	//printf("zhouti zte_wlan_coverage_set------------------------\n");
+	wifi_coverage = websGetVar(wp, T(NV_WIFI_COVERAGE), T(""));
+
+	if (NULL == wifi_coverage || '\0' == *wifi_coverage) {
+		slog(MISC_PRINT, SLOG_ERR,"[%s][%s]coverage: invalid input para.", __FILE__, __FUNCTION__);
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	(void)zte_web_read(NV_WIFI_COVERAGE, old_wifi_coverage);
+	if (strcmp(wifi_coverage, old_wifi_coverage)) { //kw 3
+		(void)zte_web_write(NV_WIFI_COVERAGE, wifi_coverage);
+
+		wifi_set_flags |= ZTE_WLAN_POWER_SET;
+
+		(void)snprintf(wifi_set_flags_str, sizeof(wifi_set_flags_str) - 1, "%u", wifi_set_flags);
+		(void)zte_web_write(WIFI_NV_ITEM_WIFI_SET_FLAGS, wifi_set_flags_str);
+
+		slog(MISC_PRINT, SLOG_NORMAL,"send wifi para to wlan-mac_filter_set@basic_set");/*lint !e26*/
+		//zte_send_message(MODULE_ID_WIFI,MSG_CMD_WIFI_COVERAGE,0,NULL);
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_COVERAGE, 0, NULL, 0);
+		//printf("wifi set cmd done!");/*lint !e26*/
+	}
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+static int zte_wlan_ssid1_basic_set(webs_t wp, unsigned int *wifi_set_flags)
+{
+
+	char_t  *ssid = NULL;
+	char_t  *broadcastssid = NULL ;
+	char_t  *NoForwarding = NULL ;
+	char_t *MAX_Access_num = NULL;
+	zte_topsw_state_e_type status = ZTE_NVIO_MAX;
+	char nv_tmp[NVIO_WIFI_MAX_LEN] = {0};
+	char_t  *wirelessmode = NULL;
+	char_t  *countrycode = NULL;
+	char_t  *channel = NULL;
+	char_t *wifi_11n_cap = NULL;
+	char_t  *wifi_band = NULL;
+	char_t  *show_qrcode_flag = NULL;//main ssid show qrcode flag
+
+	char wifi_sta_connection[8] = {0};
+
+	cfg_get_item("wifi_sta_connection", wifi_sta_connection, sizeof(wifi_sta_connection));
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]wifi_sta_connection=%s\n", __FILE__, __FUNCTION__, wifi_sta_connection);
+
+	//ssid
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	ssid = websGetVar(wp, T("ssid"), NULL);
+#ifdef WEBS_SECURITY
+		if(ssid && !check_web_input_wifi(ssid,strlen(ssid)))
+		{
+			slog(MISC_PRINT, SLOG_ERR,"[goahead]ssid1=%s\n",ssid);
+			return FALSE;
+		}
+#endif
+	if (ssid != NULL  && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		(void)zte_web_read("SSID1", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]old_ssid=[%s], ssid=[%s]", __FILE__, __FUNCTION__, nv_tmp, ssid); /*lint !e26*/
+		//add by liuyingnan for server safe for xss attack start
+#if 0 //kw 3
+		if (DATA_NO_SAFE == zte_Safe_noSpecialCharForSSID(ssid)) {
+			slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]Get Data is no Safe:ssid:%s\n", __FILE__, __FUNCTION__, ssid); /*lint !e26*/
+			return FALSE;
+		}
+#endif
+		//add by liuyingnan for server safe for xss attack end
+		if (0 != strcmp(ssid, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_SSID_SET;
+			status = zte_web_write("SSID1", ssid);
+			wlan_set_change_ssid_key_status();
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]zte_wlan_ssid1_basic_set: write nv [SSID1] fail.", __FILE__, __FUNCTION__); /*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+	//broadcastSsidEnabled
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	broadcastssid = websGetVar(wp, T("broadcastSsidEnabled"), NULL);
+
+	if (broadcastssid != NULL   && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		(void)zte_web_read("HideSSID", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"old_HideSSID=[%s], HideSSID=[%s]", nv_tmp, broadcastssid);  /*lint !e26*/
+		if (0 != strcmp(broadcastssid, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_BROADCAST_SET;
+			status = zte_web_write("HideSSID", broadcastssid);
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_ssid1_basic_set: write nv [HideSSID] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+#if 0
+	//set  NoForwarding(ap isolated)
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	NoForwarding = websGetVar(wp, T("NoForwarding"), NULL);
+	if (NoForwarding != NULL   && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		(void)zte_web_read("NoForwarding", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"old_NoForwarding=[%s], NoForwarding=[%s]", nv_tmp, NoForwarding);/*lint !e26*/
+		if (0 != strcmp(NoForwarding, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_AP_ISOLATION_SET;
+			status = zte_web_write("NoForwarding", NoForwarding);
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_ssid1_basic_set: write nv [NoForwarding] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+#endif
+	//set  MAX_Access_num
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	MAX_Access_num = websGetVar(wp, T("MAX_Access_num"), NULL);
+	if (MAX_Access_num != NULL   && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		(void)zte_web_read("MAX_Access_num", nv_tmp);
+
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]old_MAX_Access_num=[%s], MAX_Access_num=[%s]\n", __FILE__, __FUNCTION__, nv_tmp, MAX_Access_num);
+
+		if (0 != strcmp(MAX_Access_num, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_MAX_ACCESS_NUM_SET;
+			zte_web_write("MAX_Access_num", MAX_Access_num); //kw 3		
+			zte_web_write("MAX_Access_num_user_set", "1");
+		}
+	}
+	//set  show_qrcode_flag
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	show_qrcode_flag = websGetVar(wp, T("show_qrcode_flag"), NULL);
+	if (show_qrcode_flag != NULL) {
+		(void)zte_web_read("show_qrcode_flag", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]ssid1:old_show_qrcode_flag=[%s], show_qrcode_flag=[%s]\n", __FILE__, __FUNCTION__, nv_tmp, show_qrcode_flag);
+
+		if (0 != strcmp(show_qrcode_flag, nv_tmp)) {
+			status = zte_web_write("show_qrcode_flag", show_qrcode_flag);
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_ssid1_basic_set: write nv [show_qrcode_flag] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+
+
+#if 0
+	//wifiMode
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	wirelessmode = websGetVar(wp, T("wifiMode"), NULL);
+	if (wirelessmode != NULL && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		printf("wirelessmode:%s", wirelessmode);    /*lint !e26*/
+		(void)zte_web_read("WirelessMode", nv_tmp);
+		printf("[%s][%s]old_WirelessMode=[%s], wirelessmode=[%s]", __FILE__, __FUNCTION__, nv_tmp, wirelessmode); /*lint !e26*/
+		if (0 != strcmp(wirelessmode, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_WIRELESS_MODE_SET;
+			status = zte_web_write("WirelessMode", wirelessmode);
+			if (ZTE_NVIO_DONE != status) {
+				printf("zte_wlan_ssid1_basic_set: write nv [WirelessMode] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+	/* country code*/
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	countrycode = websGetVar(wp, T("countryCode"), NULL);
+	if (countrycode != NULL && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		(void)zte_web_read("CountryCode", nv_tmp);
+		printf("[%s][%s]old_countrycode=%s, countrycode = %s", __FILE__, __FUNCTION__, nv_tmp, countrycode); /*lint !e26*/
+		if (0 != strcmp(countrycode, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_COUNTRY_SET;
+			status = zte_web_write("CountryCode", countrycode);
+			if (ZTE_NVIO_DONE != status) {
+				printf("[%s][%s]zte_wlan_ssid1_basic_set: write nv [CountryCode] fail.", __FILE__, __FUNCTION__); /*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+	//selectedChannel
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	channel = websGetVar(wp, T("selectedChannel"), NULL);
+	if (channel != NULL && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		(void)zte_web_read("Channel", nv_tmp);
+		printf("[%s][%s]old_channel=%s, channel = %s", __FILE__, __FUNCTION__, nv_tmp, channel); /*lint !e26*/
+		if (0 != strcmp(channel, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_CHANNEL_SET;
+			status = zte_web_write("Channel", channel);
+			if (ZTE_NVIO_DONE != status) {
+				printf("zte_wlan_ssid1_basic_set: write nv [Channel] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+	//band setting
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	wifi_band = websGetVar(wp, T("wifi_band"), NULL);
+	if (wifi_band != NULL && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		(void)zte_web_read("wifi_band", nv_tmp);
+		printf("[%s][%s]old_wifi_band=%s, wifi_band = %s", __FILE__, __FUNCTION__, nv_tmp, wifi_band); /*lint !e26*/
+		if (0 != strcmp(wifi_band, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_WIFI_BAND_SET;
+			status = zte_web_write("wifi_band", channel);
+			if (ZTE_NVIO_DONE != status) {
+				printf("zte_wlan_ssid1_basic_set: write nv [wifi_band] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+	//set  wifi_11n_cap
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	wifi_11n_cap = websGetVar(wp, T("wifi_11n_cap"), NULL);
+	if (wifi_11n_cap != NULL && !(wp->flags & WEBS_XML_CLIENT_REQUEST)) {
+		(void)zte_web_read("wifi_11n_cap", nv_tmp);
+		printf("[%s][%s]old_wifi_11n_cap=%s, wifi_11n_cap=%s", __FILE__, __FUNCTION__, nv_tmp, wifi_11n_cap); /*lint !e26*/
+		if (0 != strcmp(wifi_11n_cap, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_WIRELESS_MODE_SET;
+			status = zte_web_write("wifi_11n_cap", wifi_11n_cap);
+			if (ZTE_NVIO_DONE != status) {
+				printf("zte_wlan_ssid1_basic_set: write nv [wifi_11n_cap] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+#endif
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_ssid1_basic_set:  wifi basic setup success.");/*lint !e26*/
+	return TRUE;
+
+}
+
+static int zte_wlan_ssid2_basic_set(webs_t wp, unsigned int *wifi_set_flags)
+{
+	char_t  *ssid = NULL;
+	char_t  *broadcastssid = NULL ;
+	char_t  *NoForwarding = NULL ;
+	char_t *MAX_Access_num = NULL;
+	char_t  *show_qrcode_flag = NULL;//guest ssid show qrcode flag
+	zte_topsw_state_e_type status = ZTE_NVIO_MAX;
+	char nv_tmp[NVIO_WIFI_MAX_LEN] = {0};
+
+	if ((NULL == wp) || (NULL == wifi_set_flags)) {
+		return FALSE;
+	}
+
+	//ssid
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	ssid = websGetVar(wp, T("m_SSID"), NULL);
+#ifdef WEBS_SECURITY
+		if(ssid && !check_web_input_wifi(ssid,strlen(ssid)))
+		{
+			slog(MISC_PRINT, SLOG_ERR,"[goahead]ssid2=%s\n",ssid);
+			return FALSE;
+		}
+#endif
+	if (ssid != NULL) {
+		//add by liuyingnan for server safe for xss attack start
+		if (DATA_NO_SAFE == zte_Safe_noSpecialChar(ssid)) {
+			slog(MISC_PRINT, SLOG_DEBUG,"Get Data is no Safe:ssid:%s\n", ssid); /*lint !e26*/
+			return FALSE;
+		}
+		//add by liuyingnan for server safe for xss attack end
+		(void)zte_web_read("m_SSID", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"old_m_SSID=[%s], m_SSID=[%s]", nv_tmp, ssid);    /*lint !e26*/
+		if (0 != strcmp(ssid, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_SET_AP_MSSID;
+			status = zte_web_write("m_SSID", ssid);
+			wlan_set_change_ssid_key_status();//added by dujiajiao
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_ERR,"zte_wlan_ssid2_basic_set: write nv [m_SSID] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+	//broadcastSsidEnabled
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	broadcastssid = websGetVar(wp, T("m_HideSSID"), NULL);
+	if (broadcastssid != NULL) {
+		(void)zte_web_read("m_HideSSID", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"old_m_HideSSID=[%s], m_HideSSID=[%s]", nv_tmp, broadcastssid);   /*lint !e26*/
+		if (0 != strcmp(broadcastssid, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_SET_AP_MSSID;
+			status = zte_web_write("m_HideSSID", broadcastssid);
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_ERR,"zte_wlan_ssid2_basic_set: write nv [m_HideSSID] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+
+	//set  NoForwarding
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	NoForwarding = websGetVar(wp, T("m_NoForwarding"), NULL);
+	if (NoForwarding != NULL) {
+		(void)zte_web_read("m_NoForwarding", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"old_m_NoForwarding=[%s], m_NoForwarding=[%s]", nv_tmp, NoForwarding);/*lint !e26*/
+		if (0 != strcmp(NoForwarding, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_SET_AP_MSSID;
+			status = zte_web_write("m_NoForwarding", NoForwarding);
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_ERR,"zte_wlan_ssid1_basic_set: write nv [m_NoForwarding] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+	//set  MAX_Access_num
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	MAX_Access_num = websGetVar(wp, T("m_MAX_Access_num"), NULL);
+	if (MAX_Access_num != NULL) {
+		(void)zte_web_read("m_MAX_Access_num", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"old_m_MAX_Access_num=[%s], m_MAX_Access_num=[%s]", nv_tmp, MAX_Access_num);/*lint !e26*/
+		if (0 != strcmp(MAX_Access_num, nv_tmp)) {
+			*wifi_set_flags |= ZTE_WLAN_SET_AP_MSSID;
+			status = zte_web_write("m_MAX_Access_num", MAX_Access_num);
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_ERR,"zte_wlan_ssid2_basic_set: write nv [MAX_Access_num] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+	//set  show_qrcode_flag
+	memset(nv_tmp, 0, sizeof(nv_tmp));
+	show_qrcode_flag = websGetVar(wp, T("m_show_qrcode_flag"), NULL);
+	if (show_qrcode_flag != NULL) {
+		(void)zte_web_read("m_show_qrcode_flag", nv_tmp);
+		slog(MISC_PRINT, SLOG_DEBUG,"ssid2: old_show_qrcode_flag=[%s], show_qrcode_flag=[%s]", nv_tmp, show_qrcode_flag);/*lint !e26*/
+		if (0 != strcmp(show_qrcode_flag, nv_tmp)) {
+			status = zte_web_write("m_show_qrcode_flag", show_qrcode_flag);
+			if (ZTE_NVIO_DONE != status) {
+				slog(MISC_PRINT, SLOG_ERR,"zte_wlan_ssid2_basic_set: write nv [show_qrcode_flag] fail.");/*lint !e26*/
+				return FALSE;
+			}
+		}
+	}
+
+
+
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_wlan_ssid2_basic_set:  wifi basic setup success.");/*lint !e26*/
+	return TRUE;
+
+}
+
+static int zte_lan_ssid1_security_set(webs_t wp, unsigned int *wifi_set_flags)
+{
+#define KEY_INDEX_MAX 5
+
+	char_t *security_mode = NULL;
+	char *encryp_type = NULL;
+	int i = 0;
+	char_t *pass_phrase_str = NULL;
+	//add by liuyingnan for Server safe start
+	int pass_phrase_str_decode_length = 0;
+	char_t *pass_phrase_str_decode = NULL;
+#ifdef WEBS_SECURITY
+	char_t *pass_phrase_b64_encode = NULL;
+#endif
+	char_t zte_pass_phrase_str[WIFI_PSW_DEFAULT_LENGTH] = {0};
+	int zte_pass_phrase_len = 0;
+	//add by liuyingnan for Server safe end
+
+	char_t *DefaultKeyID = NULL;
+	char_t * KeyType[KEY_INDEX_MAX];
+	char_t * KeyStr[KEY_INDEX_MAX];
+
+	char_t *cipher_str = NULL;
+	char_t wpa_encry_type[WF_ENCRY_TYPE_LEN] = {0};
+
+	zte_topsw_state_e_type nv_ret = ZTE_NVIO_DONE;    /*lint -e550*/
+
+	uint8 nv_au_mode[WF_AU_MODE_LEN] = {0};
+	uint8 nv_ecry_type[WF_ENCRY_TYPE_LEN] = {0};
+	char_t  psw[NV_ITEM_VALUE_DEFAULT_STRING_LEN] = {0};
+	//char nv_basic[NVIO_WIFI_MAX_LEN]={0}; // for nv read and write
+
+	/*lint -e717*/
+#define SECURITY_NV_WRITE(nv_name, str, ret)  do{ ret = zte_web_write(nv_name, (char *)str);}while(0)
+
+	memset(KeyType, 0, sizeof(KeyType)); //set 0
+	memset(KeyStr, 0, sizeof(KeyStr));     //set 0
+
+	if ((NULL == wp) || (NULL == wifi_set_flags)) {
+		slog(MISC_PRINT, SLOG_ERR,"[%s][%s]input para is null.\n", __FILE__, __FUNCTION__); /*lint !e26*/
+		return -1;
+	}
+
+	security_mode = websGetVar(wp, T("security_mode"), NULL);
+	if (security_mode != NULL) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]security_mode = [%s]", __FILE__, __FUNCTION__, security_mode); /*lint !e26*/
+
+		encryp_type = websGetVar(wp, T("security_shared_mode"), NULL);
+		if (NULL == encryp_type) {
+			slog(MISC_PRINT, SLOG_ERR,"encryp_type == NULL");/*lint !e26*/
+			return -1;
+		}
+
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]encryp_type = [%s]", __FILE__, __FUNCTION__, encryp_type); /*lint !e26*/
+
+		if (STR_EQUAL(security_mode, WF_AU_OPEN)  || STR_EQUAL(security_mode, WF_AU_SHARE)) {
+			if ((STR_EQUAL(security_mode, WF_AU_OPEN) && STR_EQUAL(encryp_type, WF_ENCRY_WEP)) ||
+			    (STR_EQUAL(security_mode, WF_AU_SHARE))) { //&&STR_EQUAL(wifi_encry_type, WF_AU_OPEN)) )
+				zte_wifi_open_and_share_mode_s_type nv_open_and_share_s;
+				memset(&nv_open_and_share_s, 0, sizeof(zte_wifi_open_and_share_mode_s_type));
+
+				//read nv
+				(void)zte_web_read("AuthMode", nv_au_mode);
+				(void)zte_web_read("EncrypType", nv_ecry_type);
+				(void)zte_web_read("DefaultKeyID", nv_open_and_share_s.wep_key_index);
+				(void)zte_web_read("Key1Str1", nv_open_and_share_s.wep_key1);
+				(void)zte_web_read("Key2Str1", nv_open_and_share_s.wep_key2);
+				(void)zte_web_read("Key3Str1", nv_open_and_share_s.wep_key3);
+				(void)zte_web_read("Key4Str1", nv_open_and_share_s.wep_key4);
+				(void)zte_web_read("Key1Type", nv_open_and_share_s.wep_key1_mode);
+				(void)zte_web_read("Key2Type", nv_open_and_share_s.wep_key2_mode);
+				(void)zte_web_read("Key3Type", nv_open_and_share_s.wep_key3_mode);
+				(void)zte_web_read("Key4Type", nv_open_and_share_s.wep_key4_mode);
+
+				DefaultKeyID = websGetVar(wp, T("wep_default_key"), "");
+				KeyStr[1] = websGetVar(wp, T("wep_key_1"), "");
+				KeyStr[2] = websGetVar(wp, T("wep_key_2"), "");
+				KeyStr[3] = websGetVar(wp, T("wep_key_3"), "");
+				KeyStr[4] = websGetVar(wp, T("wep_key_4"), "");
+				KeyType[1] = websGetVar(wp, T("WEP1Select"), "");
+				KeyType[2] = websGetVar(wp, T("WEP2Select"), "");
+				KeyType[3] = websGetVar(wp, T("WEP3Select"), "");
+				KeyType[4] = websGetVar(wp, T("WEP4Select"), "");
+
+				//when the wifi setting has changed,then set them
+				if (STR_EQUAL(security_mode, nv_au_mode) && STR_EQUAL(encryp_type, nv_ecry_type) \
+				    && STR_EQUAL(DefaultKeyID, nv_open_and_share_s.wep_key_index) \
+				    && STR_EQUAL(KeyStr[1], nv_open_and_share_s.wep_key1) && STR_EQUAL(KeyStr[2], nv_open_and_share_s.wep_key2) && STR_EQUAL(KeyStr[3], nv_open_and_share_s.wep_key3) && STR_EQUAL(KeyStr[4], nv_open_and_share_s.wep_key4) \
+				    && STR_EQUAL(KeyType[1], nv_open_and_share_s.wep_key1_mode) && STR_EQUAL(KeyType[2], nv_open_and_share_s.wep_key2_mode) && STR_EQUAL(KeyType[3], nv_open_and_share_s.wep_key3_mode) && STR_EQUAL(KeyType[4], nv_open_and_share_s.wep_key4_mode)) {
+
+					slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]wifi:[%s][%s] not changed.\n", __FILE__, __FUNCTION__, security_mode, encryp_type); /*lint !e26*/
+				} else {
+					SECURITY_NV_WRITE("AuthMode", security_mode, nv_ret);
+					SECURITY_NV_WRITE("EncrypType", encryp_type, nv_ret);
+
+					SECURITY_NV_WRITE("DefaultKeyID", DefaultKeyID, nv_ret);
+
+					SECURITY_NV_WRITE("Key1Str1", KeyStr[1], nv_ret);
+					SECURITY_NV_WRITE("Key2Str1", KeyStr[2], nv_ret);
+					SECURITY_NV_WRITE("Key3Str1", KeyStr[3], nv_ret);
+					SECURITY_NV_WRITE("Key4Str1", KeyStr[4], nv_ret);
+
+					SECURITY_NV_WRITE("Key1Type", KeyType[1], nv_ret);
+					SECURITY_NV_WRITE("Key2Type", KeyType[2], nv_ret);
+					SECURITY_NV_WRITE("Key3Type", KeyType[3], nv_ret);
+					SECURITY_NV_WRITE("Key4Type", KeyType[4], nv_ret);
+
+					*wifi_set_flags |= ZTE_WLAN_BASIC_SECURITY_SET;
+					wlan_set_change_ssid_key_status();
+				}
+			} else if (STR_EQUAL(security_mode, WF_AU_OPEN) && STR_EQUAL(encryp_type, WF_ENCRY_NONE)) {
+				(void)zte_web_read("AuthMode",nv_au_mode);
+				(void)zte_web_read("EncrypType", nv_ecry_type);
+
+				if (STR_EQUAL(security_mode, nv_au_mode) && STR_EQUAL(encryp_type, nv_ecry_type)) {
+					printf("[%s][%s]wifi:[%s][%s] not changed.\n", __FILE__, __FUNCTION__, security_mode, encryp_type); /*lint !e26*/
+				} else {
+					SECURITY_NV_WRITE("AuthMode", security_mode, nv_ret);
+					SECURITY_NV_WRITE("EncrypType", encryp_type, nv_ret);
+					SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_ENCODE, "", nv_ret);
+					SECURITY_NV_WRITE(NV_WIFI_WPA_PASS, "", nv_ret);
+					SECURITY_NV_WRITE("Key1Str1", "", nv_ret);
+					SECURITY_NV_WRITE("Key2Str1", "", nv_ret);
+					SECURITY_NV_WRITE("Key3Str1", "", nv_ret);
+					SECURITY_NV_WRITE("Key4Str1", "", nv_ret);
+					*wifi_set_flags |= ZTE_WLAN_BASIC_SECURITY_SET;
+					wlan_set_change_ssid_key_status();
+				}
+			} else {
+				//wifi_au_mode or encrype invalid
+				slog(MISC_PRINT, SLOG_ERR,"[%s][%s]wifi:[%s][%s] is invalid.\n", __FILE__, __FUNCTION__, security_mode, encryp_type); /*lint !e26*/
+				return -1;
+			}
+		} else if (STR_EQUAL(security_mode, WF_AU_WPA)  || STR_EQUAL(security_mode, WF_AU_WPA2) ||
+		           STR_EQUAL(security_mode, WF_AU_WPA_WPA2) || STR_EQUAL(security_mode, WF_AU_WPA3) || STR_EQUAL(security_mode, WF_AU_WPA2_WPA3)) {
+			zte_wifi_wpa_and_wpa2_mode_s_type nv_wpa_and_wpa2;
+			memset(&nv_wpa_and_wpa2, 0, sizeof(zte_wifi_wpa_and_wpa2_mode_s_type));
+
+			pass_phrase_str = websGetVar(wp, T("passphrase"), "");
+			int j = 0;
+			for (i = 0; i < strlen(pass_phrase_str) && j < NV_ITEM_VALUE_DEFAULT_STRING_LEN; i++) {
+				if (pass_phrase_str[i] != '\r' && pass_phrase_str[i] != '\n') {
+					psw[j] = pass_phrase_str[i];
+					j++;
+				}
+			}
+			pass_phrase_str = psw;
+			if (wp->flags & WEBS_XML_CLIENT_REQUEST) {
+				cipher_str = websGetVar(wp, T("cipher"), "");
+			} else {
+#ifndef CONFIG_CHINA_UNICOM
+				if (STR_EQUAL(security_mode, WF_AU_WPA_WPA2)) {
+					cipher_str = websGetVar(wp, T("cipher_str"), "");
+				} else
+#endif
+				{
+					cipher_str = websGetVar(wp, T("cipher"), "");
+				}
+			}
+			slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]pass_phrase_str = %s", __FILE__, __FUNCTION__, pass_phrase_str); /*lint !e26*/
+			slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]cipher_str = %s", __FILE__, __FUNCTION__, cipher_str); /*lint !e26*/
+			//add by liuyingnan for server safe for xss attack start
+			if (DATA_NO_SAFE == zte_Safe_noSpecialChar(pass_phrase_str)) {
+				slog(MISC_PRINT, SLOG_ERR,"Get Data is no Safe:ssid:%s\n", pass_phrase_str); /*lint !e26*/
+				return -1;
+			}
+			//add by liuyingnan for server safe for xss attack end
+
+			switch (cipher_str[0]) {
+			case '0':
+				strncpy(wpa_encry_type, WF_ENCRY_TKIP, sizeof(wpa_encry_type) - 1);
+				break;
+			case '1':
+				strncpy(wpa_encry_type, WF_ENCRY_AES, sizeof(wpa_encry_type) - 1);
+				break;
+			case '2':
+				strncpy(wpa_encry_type, WF_ENCRY_TKIP_AES, sizeof(wpa_encry_type) - 1);
+				break;
+			default:
+				slog(MISC_PRINT, SLOG_ERR,"unvalid encry type [%c]", encryp_type[0], 0, 0);
+				return -1;
+			}
+
+			(void)zte_web_read("AuthMode", nv_au_mode);
+			(void)zte_web_read("EncrypType", nv_ecry_type);
+			(void)zte_web_read(NV_WIFI_WPA_PASS, nv_wpa_and_wpa2.pre_share_key);
+
+			if (STR_EQUAL(security_mode, nv_au_mode) && STR_EQUAL(wpa_encry_type, nv_ecry_type) && STR_EQUAL(pass_phrase_str, nv_wpa_and_wpa2.pre_share_key)) {
+
+				slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]wifi:[%s][%s] not changed.\n", __FILE__, __FUNCTION__, security_mode, wpa_encry_type); /*lint !e26*/
+			} else {
+				SECURITY_NV_WRITE("AuthMode", security_mode, nv_ret);
+				SECURITY_NV_WRITE("EncrypType", wpa_encry_type, nv_ret);
+#ifndef CONFIG_CHINA_UNICOM
+				if (STR_EQUAL(security_mode, WF_AU_WPA_WPA2)) {
+#endif
+					SECURITY_NV_WRITE("cipher_str", cipher_str, nv_ret);
+#ifndef CONFIG_CHINA_UNICOM
+				}
+#endif
+				//add by liuyingnan for Server safe start
+				slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]pass_phrase_str:%s.\n", __FILE__, __FUNCTION__, pass_phrase_str); /*lint !e26*/
+#ifdef WEBS_SECURITY
+				pass_phrase_str_decode = js_aes_decode(pass_phrase_str, strlen(pass_phrase_str), (unsigned int*)&pass_phrase_str_decode_length);
+#else
+				pass_phrase_str_decode = (char*)zte_base64_decode((const unsigned char *)pass_phrase_str, strlen(pass_phrase_str), (unsigned int*)&pass_phrase_str_decode_length);
+#endif
+				slog(MISC_PRINT, SLOG_DEBUG,"[%s][%s]login2 -> zte_password:%s.\n", __FILE__, __FUNCTION__, pass_phrase_str_decode); /*lint !e26*/
+
+				if (NULL == pass_phrase_str_decode) {
+					slog(MISC_PRINT, SLOG_DEBUG,"pass_phrase_str_decode: psw is empty.\n");/*lint !e26*/
+					free(pass_phrase_str_decode);
+					return -1;
+				}
+				zte_pass_phrase_len = (pass_phrase_str_decode_length < sizeof(zte_pass_phrase_str) ? pass_phrase_str_decode_length : sizeof(zte_pass_phrase_str) - 1);
+				snprintf(zte_pass_phrase_str,zte_pass_phrase_len+1,"%s",pass_phrase_str_decode);
+				//strncpy(zte_pass_phrase_str, pass_phrase_str_decode, zte_pass_phrase_len);
+				free(pass_phrase_str_decode);
+				slog(MISC_PRINT, SLOG_DEBUG,"login3 -> zte_psw_admin:%s.\n", zte_pass_phrase_str); //cov m
+#ifdef WEBS_SECURITY
+				if(zte_pass_phrase_str && !check_web_input_wifi(zte_pass_phrase_str,strlen(zte_pass_phrase_str)))
+				{
+					slog(MISC_PRINT, SLOG_ERR,"[goahead]wifipass1=%s\n",zte_pass_phrase_str);
+					return -1;
+				}
+				pass_phrase_b64_encode = zte_base64_encode(zte_pass_phrase_str, strlen(zte_pass_phrase_str));
+				if (NULL == pass_phrase_b64_encode) {
+					slog(MISC_PRINT, SLOG_DEBUG,"pass_phrase_b64_encode: psw is NULL.\n");/*lint !e26*/
+					return -1;
+				}
+				SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_ENCODE, pass_phrase_b64_encode, nv_ret);
+				free(pass_phrase_b64_encode);
+				SECURITY_NV_WRITE(NV_WIFI_WPA_PASS, zte_pass_phrase_str, nv_ret);
+				SECURITY_NV_WRITE("WPAPSK1_enaes", pass_phrase_str, nv_ret);
+#else
+				SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_ENCODE, pass_phrase_str, nv_ret);
+				SECURITY_NV_WRITE(NV_WIFI_WPA_PASS, zte_pass_phrase_str, nv_ret);
+#endif
+				//add by liuyingnan for Server safe end
+				//SECURITY_NV_WRITE(NV_WIFI_WPA_PASS, pass_phrase_str, nv_ret);
+
+				*wifi_set_flags |= ZTE_WLAN_BASIC_SECURITY_SET;
+				wlan_set_change_ssid_key_status();
+			}
+		} else {
+			// other security mode is invalid
+			slog(MISC_PRINT, SLOG_ERR,"ERROR:security mode  is invalid", 0, 0, 0);/*lint !e26*/
+			return -1;
+		}
+	} else {
+		//security_mode is NULL
+		slog(MISC_PRINT, SLOG_ERR,"ERROR:security_mode is NULL ", 0, 0, 0);/*lint !e26*/
+		return -1;
+	}
+
+	return 0;
+
+}
+
+/**********************************************************************
+* Function:         zte_lan_ssid2_security_set
+* Description:     to set the wifi security paras for SSID2
+* Input:           http info
+* Output:
+* Return:           0:ok;-1:fail
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/07/11    V1.0        chenyi       first version
+**********************************************************************/
+/*lint -e{818,830}*/
+static int zte_lan_ssid2_security_set(webs_t wp, unsigned int *wifi_set_flags) /*lint !e533*/
+{
+#define KEY_INDEX_MAX 5
+
+	char_t *security_mode = NULL;
+	char *encryp_type = NULL;
+
+	char_t *pass_phrase_str = NULL;
+	//add by liuyingnan for Server safe start
+	int pass_phrase_str_decode_length = 0;
+	char_t *pass_phrase_str_decode = NULL;
+#ifdef WEBS_SECURITY
+	char_t *pass_phrase_b64_encode = NULL;
+#endif
+	char_t zte_pass_phrase_str[WIFI_PSW_DEFAULT_LENGTH] = {0};
+	int zte_pass_phrase_len = 0;
+	//add by liuyingnan for Server safe end
+
+	char_t *DefaultKeyID = NULL;
+	char_t * KeyType[KEY_INDEX_MAX];
+	char_t * KeyStr[KEY_INDEX_MAX];
+
+	char_t *cipher_str = NULL;
+	char_t wpa_encry_type[WF_ENCRY_TYPE_LEN] = {0};
+
+	zte_topsw_state_e_type nv_ret = ZTE_NVIO_DONE;    /*lint -e550*/
+
+	uint8 nv_au_mode[WF_AU_MODE_LEN] = {0};
+	uint8 nv_ecry_type[WF_ENCRY_TYPE_LEN] = {0};
+
+	//char nv_basic[NVIO_WIFI_MAX_LEN]={0}; // for nv read and write
+
+	/*lint -e717*/
+#define SECURITY_NV_WRITE(nv_name, str, ret)  do{ ret = zte_web_write(nv_name, (char *)str);}while(0)
+
+	memset(KeyType, 0, sizeof(KeyType)); //set 0
+	memset(KeyStr, 0, sizeof(KeyStr));     //set 0
+
+	if ((NULL == wp) || (NULL == wifi_set_flags)) {
+		slog(MISC_PRINT, SLOG_ERR,"input para is null.\n");/*lint !e26*/
+		return -1;
+	}
+
+	security_mode = websGetVar(wp, T("m_AuthMode"), NULL);
+	if (security_mode != NULL) {
+		slog(MISC_PRINT, SLOG_DEBUG,"security_mode = [%s]", security_mode);/*lint !e26*/
+
+		encryp_type = websGetVar(wp, T("m_EncrypType"), NULL);
+		if (NULL == encryp_type) {
+			slog(MISC_PRINT, SLOG_DEBUG,"encryp_type == NULL", 0, 0, 0);/*lint !e26*/
+			return -1;
+		}
+
+		slog(MISC_PRINT, SLOG_DEBUG,"encryp_type = [%s]", encryp_type);  /*lint !e26*/
+
+		if (STR_EQUAL(security_mode, WF_AU_OPEN)  || STR_EQUAL(security_mode, WF_AU_SHARE)) {
+			if ((STR_EQUAL(security_mode, WF_AU_OPEN) && STR_EQUAL(encryp_type, WF_ENCRY_WEP)) ||
+			    (STR_EQUAL(security_mode, WF_AU_SHARE))) { //&&STR_EQUAL(wifi_encry_type, WF_AU_OPEN)) )
+				zte_wifi_open_and_share_mode_s_type nv_open_and_share_s;
+				memset(&nv_open_and_share_s, 0, sizeof(zte_wifi_open_and_share_mode_s_type));
+
+				//read nv
+				(void)zte_web_read("m_AuthMode", nv_au_mode);
+				(void)zte_web_read("m_EncrypType", nv_ecry_type);
+				(void)zte_web_read("m_DefaultKeyID", nv_open_and_share_s.wep_key_index);
+				(void)zte_web_read("m_Key1Str1", nv_open_and_share_s.wep_key1);
+				(void)zte_web_read("m_Key2Str1", nv_open_and_share_s.wep_key2);
+				(void)zte_web_read("m_Key3Str1", nv_open_and_share_s.wep_key3);
+				(void)zte_web_read("m_Key4Str1", nv_open_and_share_s.wep_key4);
+				(void)zte_web_read("m_Key1Type", nv_open_and_share_s.wep_key1_mode);
+				(void)zte_web_read("m_Key2Type", nv_open_and_share_s.wep_key2_mode);
+				(void)zte_web_read("m_Key3Type", nv_open_and_share_s.wep_key3_mode);
+				(void)zte_web_read("m_Key4Type", nv_open_and_share_s.wep_key4_mode);
+
+				DefaultKeyID = websGetVar(wp, T("m_DefaultKeyID"), "");
+				KeyStr[1] = websGetVar(wp, T("m_Key1Str1"), "");
+				KeyStr[2] = websGetVar(wp, T("m_Key2Str1"), "");
+				KeyStr[3] = websGetVar(wp, T("m_Key3Str1"), "");
+				KeyStr[4] = websGetVar(wp, T("m_Key4Str1"), "");
+				KeyType[1] = websGetVar(wp, T("m_Key1Type"), "");
+				KeyType[2] = websGetVar(wp, T("m_Key2Type"), "");
+				KeyType[3] = websGetVar(wp, T("m_Key3Type"), "");
+				KeyType[4] = websGetVar(wp, T("m_Key4Type"), "");
+
+				//when the wifi setting has changed,then set them
+				if (STR_EQUAL(security_mode, nv_au_mode) && STR_EQUAL(encryp_type, nv_ecry_type) \
+				    && STR_EQUAL(DefaultKeyID, nv_open_and_share_s.wep_key_index) \
+				    && STR_EQUAL(KeyStr[1], nv_open_and_share_s.wep_key1) && STR_EQUAL(KeyStr[2], nv_open_and_share_s.wep_key2) && STR_EQUAL(KeyStr[3], nv_open_and_share_s.wep_key3) && STR_EQUAL(KeyStr[4], nv_open_and_share_s.wep_key4) \
+				    && STR_EQUAL(KeyType[1], nv_open_and_share_s.wep_key1_mode) && STR_EQUAL(KeyType[2], nv_open_and_share_s.wep_key2_mode) && STR_EQUAL(KeyType[3], nv_open_and_share_s.wep_key3_mode) && STR_EQUAL(KeyType[4], nv_open_and_share_s.wep_key4_mode)) {
+
+					printf("wifi:[%s][%s] not changed.\n", security_mode, encryp_type); /*lint !e26*/
+				} else {
+					SECURITY_NV_WRITE("m_AuthMode", security_mode, nv_ret);
+					SECURITY_NV_WRITE("m_EncrypType", encryp_type, nv_ret);
+
+					SECURITY_NV_WRITE("m_DefaultKeyID", DefaultKeyID, nv_ret);
+
+					SECURITY_NV_WRITE("m_Key1Str1", KeyStr[1], nv_ret);
+					SECURITY_NV_WRITE("m_Key2Str1", KeyStr[2], nv_ret);
+					SECURITY_NV_WRITE("m_Key3Str1", KeyStr[3], nv_ret);
+					SECURITY_NV_WRITE("m_Key4Str1", KeyStr[4], nv_ret);
+
+					SECURITY_NV_WRITE("m_Key1Type", KeyType[1], nv_ret);
+					SECURITY_NV_WRITE("m_Key2Type", KeyType[2], nv_ret);
+					SECURITY_NV_WRITE("m_Key3Type", KeyType[3], nv_ret);
+					SECURITY_NV_WRITE("m_Key4Type", KeyType[4], nv_ret);
+
+					*wifi_set_flags |= ZTE_WLAN_SET_AP_MSSID;
+					wlan_set_change_ssid_key_status(); //added by dujiajiao
+				}
+			} else if (STR_EQUAL(security_mode, WF_AU_OPEN) && STR_EQUAL(encryp_type, WF_ENCRY_NONE)) {
+				(void)zte_web_read("m_AuthMode", nv_au_mode);
+				(void)zte_web_read("m_EncrypType", nv_ecry_type);
+
+				if (STR_EQUAL(security_mode, nv_au_mode) && STR_EQUAL(encryp_type, nv_ecry_type)) {
+					slog(MISC_PRINT, SLOG_NORMAL,"wifi:[%s][%s] not changed.\n", security_mode, encryp_type); /*lint !e26*/
+				} else {
+					SECURITY_NV_WRITE("m_AuthMode", security_mode, nv_ret);
+					SECURITY_NV_WRITE("m_EncrypType", encryp_type, nv_ret);
+					/* added by dujiajiao, in open&no encrypt condition, there is no password  */
+					SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_M_ENCODE, "", nv_ret);
+					SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_M, "", nv_ret);
+					SECURITY_NV_WRITE("m_Key1Str1", "", nv_ret);
+					SECURITY_NV_WRITE("m_Key2Str1", "", nv_ret);
+					SECURITY_NV_WRITE("m_Key3Str1", "", nv_ret);
+					SECURITY_NV_WRITE("m_Key4Str1", "", nv_ret);
+					/*added by dujiajiao end */
+					*wifi_set_flags |= ZTE_WLAN_SET_AP_MSSID;
+					wlan_set_change_ssid_key_status(); //added by dujiajiao
+				}
+			} else {
+				//wifi_au_mode or encrype invalid
+				slog(MISC_PRINT, SLOG_ERR,"wifi:[%s][%s] is invalid.\n", security_mode, encryp_type); /*lint !e26*/
+				return -1;
+			}
+		} else if (STR_EQUAL(security_mode, WF_AU_WPA)  || STR_EQUAL(security_mode, WF_AU_WPA2) ||
+		           STR_EQUAL(security_mode, WF_AU_WPA_WPA2) || STR_EQUAL(security_mode, WF_AU_WPA3) || STR_EQUAL(security_mode, WF_AU_WPA2_WPA3)) {
+			zte_wifi_wpa_and_wpa2_mode_s_type nv_wpa_and_wpa2;
+			memset(&nv_wpa_and_wpa2, 0, sizeof(zte_wifi_wpa_and_wpa2_mode_s_type));
+
+			pass_phrase_str = websGetVar(wp, T(NV_WIFI_WPA_PASS_M), "");
+			cipher_str = websGetVar(wp, T("cipher"), "");
+
+			slog(MISC_PRINT, SLOG_DEBUG,"pass_phrase_str = %s", pass_phrase_str);     /*lint !e26*/
+			slog(MISC_PRINT, SLOG_DEBUG,"cipher_str = %s", cipher_str);  /*lint !e26*/
+
+			//add by liuyingnan for server safe for xss attack start
+			if (DATA_NO_SAFE == zte_Safe_noSpecialChar(pass_phrase_str)) {
+				printf("Get Data is no Safe:ssid:%s\n", pass_phrase_str); /*lint !e26*/
+				return -1;
+			}
+			//add by liuyingnan for server safe for xss attack end
+
+			switch (cipher_str[0]) {
+			case '0':
+				strncpy(wpa_encry_type, WF_ENCRY_TKIP, sizeof(wpa_encry_type) - 1);
+				break;
+			case '1':
+				strncpy(wpa_encry_type, WF_ENCRY_AES, sizeof(wpa_encry_type) - 1);
+				break;
+			case '2':
+				strncpy(wpa_encry_type, WF_ENCRY_TKIP_AES, sizeof(wpa_encry_type) - 1);
+				break;
+			default:
+				printf("unvalid encry type [%c]", encryp_type[0]);/*lint !e26*/
+				return -1;
+			}
+
+			(void)zte_web_read("m_AuthMode", nv_au_mode);
+			(void)zte_web_read("m_EncrypType", nv_ecry_type);
+			(void)zte_web_read(NV_WIFI_WPA_PASS_M, nv_wpa_and_wpa2.pre_share_key);
+
+			if (STR_EQUAL(security_mode, nv_au_mode) && STR_EQUAL(wpa_encry_type, nv_ecry_type) && STR_EQUAL(pass_phrase_str, nv_wpa_and_wpa2.pre_share_key)) {
+
+				slog(MISC_PRINT, SLOG_NORMAL,"wifi:[%s][%s] not changed.\n", security_mode, wpa_encry_type); /*lint !e26*/
+			} else {
+				SECURITY_NV_WRITE("m_AuthMode", security_mode, nv_ret);
+				SECURITY_NV_WRITE("m_EncrypType", wpa_encry_type, nv_ret);
+				//add by liuyingnan for Server safe start
+				slog(MISC_PRINT, SLOG_DEBUG,"pass_phrase_str:%s.\n", pass_phrase_str); /*lint !e26*/
+#ifdef WEBS_SECURITY
+				pass_phrase_str_decode = js_aes_decode(pass_phrase_str, strlen(pass_phrase_str), (unsigned int)&pass_phrase_str_decode_length);
+#else
+				pass_phrase_str_decode = (char*)zte_base64_decode((const unsigned char *)pass_phrase_str, strlen(pass_phrase_str), (unsigned int)&pass_phrase_str_decode_length);
+#endif
+				slog(MISC_PRINT, SLOG_DEBUG,"pass_phrase_str_decode:%s.\n", pass_phrase_str_decode); /*lint !e26*/
+
+				if (NULL == pass_phrase_str_decode) {
+					slog(MISC_PRINT, SLOG_DEBUG,"pass_phrase_str_decode: psw is empty.\n");/*lint !e26*/
+					free(pass_phrase_str_decode);
+					return -1;
+				}		
+				zte_pass_phrase_len = (pass_phrase_str_decode_length < sizeof(zte_pass_phrase_str) ? pass_phrase_str_decode_length : sizeof(zte_pass_phrase_str) - 1);
+				snprintf(zte_pass_phrase_str,zte_pass_phrase_len+1,"%s",pass_phrase_str_decode);
+				//strncpy(zte_pass_phrase_str, pass_phrase_str_decode, zte_pass_phrase_len);
+				free(pass_phrase_str_decode);
+				slog(MISC_PRINT, SLOG_DEBUG,"login3 -> zte_pass_phrase_str:%s.\n", zte_pass_phrase_str); //cov m
+#ifdef WEBS_SECURITY
+				if(zte_pass_phrase_str && !check_web_input_wifi(zte_pass_phrase_str,strlen(zte_pass_phrase_str)))
+				{
+					slog(MISC_PRINT, SLOG_ERR,"[goahead]wifipass2=%s\n",zte_pass_phrase_str);
+					return -1;
+				}
+				pass_phrase_b64_encode = zte_base64_encode(zte_pass_phrase_str, strlen(zte_pass_phrase_str));
+				if (NULL == pass_phrase_b64_encode) {
+					slog(MISC_PRINT, SLOG_DEBUG,"pass_phrase_b64_encode: psw is NULL.\n");/*lint !e26*/
+					return -1;
+				}
+				SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_M_ENCODE, pass_phrase_b64_encode, nv_ret);
+				free(pass_phrase_b64_encode);
+				SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_M, zte_pass_phrase_str, nv_ret);
+				SECURITY_NV_WRITE("m_WPAPSK1_enaes", pass_phrase_str, nv_ret);
+#else
+				SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_M_ENCODE, pass_phrase_str, nv_ret);
+				SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_M, zte_pass_phrase_str, nv_ret);
+#endif
+				//add by liuyingnan for Server safe end
+				//SECURITY_NV_WRITE(NV_WIFI_WPA_PASS_M, pass_phrase_str, nv_ret);
+
+				*wifi_set_flags |= ZTE_WLAN_SET_AP_MSSID;
+				wlan_set_change_ssid_key_status(); //added by dujiajiao
+			}
+		} else {
+			// other security mode is invalid
+			slog(MISC_PRINT, SLOG_ERR,"ERROR:security mode  is invalid");/*lint !e26*/
+			return -1;
+		}
+	} else {
+		//security_mode is NULL
+		slog(MISC_PRINT, SLOG_ERR,"ERROR:security_mode is NULL ");/*lint !e26*/
+		return -1;
+	}
+
+	return 0;
+
+}
+
+void zte_wlan_set_tsw(webs_t wp)
+{
+	char * openEnable = NULL;
+	char * closeEnable = NULL;
+	char * openTime = NULL;
+	char * closeTime = NULL;
+	char old_open_time[16] = {0};
+	char old_close_time[16] = {0};
+	char old_open_enable[16] = {0};
+	char tsw_sleep_time_hour[16] = {0};
+	char tsw_sleep_time_min[16] = {0};
+	char tsw_wake_time_hour[16] = {0};
+	char tsw_wake_time_min[16] = {0};
+	char *tmp = NULL;
+	int tsw_change_flag = 0;
+	cfg_get_item("openEnable", old_open_enable, sizeof(old_open_enable));
+
+	cfg_get_item("openTime", old_open_time, sizeof(old_open_time));
+
+	cfg_get_item("closeTime", old_close_time, sizeof(old_close_time));
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s]old_open_enable=%s,old_open_time=%s,old_close_time=%s\n", __FUNCTION__, old_open_enable, old_open_time, old_close_time);
+	openEnable = websGetVar(wp, T("openEnable"), T(""));
+	closeEnable = websGetVar(wp, T("closeEnable"), T(""));
+	openTime = websGetVar(wp, T("openTime"), T(""));
+	closeTime = websGetVar(wp, T("closeTime"), T(""));
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s]openEnable=%s,closeEnable=%s,openTime=%s,closeTime=%s\n", __FUNCTION__, openEnable, closeEnable, openTime, closeTime);
+
+	//check the param: openEnable & closeEnable
+	if (NULL == openEnable || '\0' == *openEnable || NULL == closeEnable || '\0' == *closeEnable) {
+		slog(MISC_PRINT, SLOG_ERR,"zte_wlan_set_tsw: **open/close**invalid input para.\n");/*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	//if swtich is open , then check the param: openTime & closeTime
+	if (strcmp(openEnable, "1") == 0) {
+		if (NULL == openTime || '\0' == *openTime || NULL == closeTime || '\0' == *closeTime) {
+			slog(MISC_PRINT, SLOG_ERR,"zte_wlan_set_tsw: **open**invalid input para:openTime /closeTime.\n");/*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+	}
+	cfg_set("openEnable", openEnable);
+	cfg_set("closeEnable", closeEnable);
+
+	//send msg to wlan-server to close timing sleep wake up
+	if (strcmp(openEnable, "0") == 0 && strcmp(old_open_enable, "1") == 0) {
+		tsw_change_flag = 1;
+		slog(MISC_PRINT, SLOG_NORMAL,"send to wlan-server : MSG_CMD_WIFI_TSW_CLOSE\n");
+		//zte_send_message(MODULE_ID_WIFI,MSG_CMD_WIFI_TSW_CLOSE,0,NULL);
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_TSW_CLOSE, 0, NULL, 0);
+
+	}
+	// 1.if current openEnable is 1, and old_open_enable is 0, then send msg to wlan-server to setup tsw
+	// 2. if current openEnable is 1,  and openTime is changed or closeTime changed, then send msg to wlan-server to setup tsw
+	else if ((strcmp(openEnable, "1") == 0 && strcmp(old_open_enable, "0") == 0) || \
+	         ((strcmp(openEnable, "1") == 0)  && (strcmp(openTime, old_open_time) != 0 || strcmp(closeTime, old_close_time) != 0))) {
+		tsw_change_flag = 1;
+
+		cfg_set("openTime", openTime);
+		cfg_set("closeTime", closeTime);
+		snprintf(tsw_wake_time_hour, 3, "%s", openTime);
+		snprintf(tsw_wake_time_min, 3, "%s", openTime + 3);
+		snprintf(tsw_sleep_time_hour, 3, "%s", closeTime);
+		snprintf(tsw_sleep_time_min, 3, "%s", closeTime + 3);
+		slog(MISC_PRINT, SLOG_DEBUG,"tsw_wake_time_hour:%s,tsw_wake_time_min:%s\n", tsw_wake_time_hour, tsw_wake_time_min);
+		slog(MISC_PRINT, SLOG_DEBUG,"tsw_sleep_time_hour:%s,tsw_sleep_time_min:%s\n", tsw_sleep_time_hour, tsw_sleep_time_min);
+		cfg_set("tsw_wake_time_hour", tsw_wake_time_hour);
+
+		cfg_set("tsw_wake_time_min", tsw_wake_time_min);
+		cfg_set("tsw_sleep_time_hour", tsw_sleep_time_hour);
+
+		cfg_set("tsw_sleep_time_min", tsw_sleep_time_min);
+
+		slog(MISC_PRINT, SLOG_NORMAL,"send msg to wlan-server : MSG_CMD_WIFI_TSW_SET\n ");
+		//zte_send_message(MODULE_ID_WIFI,MSG_CMD_WIFI_TSW_SET,0,NULL);
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_TSW_SET, 0, NULL, 0);
+	}
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+static void zte_get_cur_user_mac(struct list_head *Dhcp_info_list)
+{
+	struct in_addr addr;
+	char ipaddress[16] = {0};
+	char client_mac_addr[18] = {0};
+	char old_client_mac_addr[18] = {0};
+	DHCPOFFERADDR_LIST_t * p_dhcp_info  = NULL;
+
+	cfg_get_item("client_mac_address", old_client_mac_addr, sizeof(old_client_mac_addr));
+	cfg_get_item(NV_USER_IP_ADDR, ipaddress, sizeof(ipaddress));
+	list_for_each_entry(p_dhcp_info, Dhcp_info_list, list) {
+		addr.s_addr = p_dhcp_info->dhcp_info.ip;
+		if ((strcmp(ipaddress, "") != 0) && (strcmp(inet_ntoa(addr), "")) && (!strcmp(ipaddress, inet_ntoa(addr)))) {
+			snprintf(client_mac_addr, 18, "%02X:%02X:%02X:%02X:%02X:%02X", p_dhcp_info->dhcp_info.mac[0], p_dhcp_info->dhcp_info.mac[1], p_dhcp_info->dhcp_info.mac[2], p_dhcp_info->dhcp_info.mac[3], p_dhcp_info->dhcp_info.mac[4], p_dhcp_info->dhcp_info.mac[5]);
+			if (strcmp(client_mac_addr, old_client_mac_addr)) {
+				cfg_set("client_mac_address", client_mac_addr);
+				break;
+			}
+		}
+	}
+}
+
+static DHCPOFFERADDR_LIST_t *find_match_sta(struct list_head *dhcp_info_list,  RT_802_11_MAC_ENTRY * pEntry)
+{
+	DHCPOFFERADDR_LIST_t * p_dhcp_info = NULL;
+
+	list_for_each_entry(p_dhcp_info, dhcp_info_list, list) {
+		//  printf("[%s] p_dhcp_info:%d\n", __FUNCTION__, p_dhcp_info);
+
+
+		if ((p_dhcp_info->dhcp_info.mac[0] == pEntry->Addr[0]) && (p_dhcp_info->dhcp_info.mac[1] == pEntry->Addr[1]) &&
+		    (p_dhcp_info->dhcp_info.mac[2] == pEntry->Addr[2]) && (p_dhcp_info->dhcp_info.mac[3] == pEntry->Addr[3]) &&
+		    (p_dhcp_info->dhcp_info.mac[4] == pEntry->Addr[4]) && (p_dhcp_info->dhcp_info.mac[5] == pEntry->Addr[5])) {
+
+			return p_dhcp_info;
+
+		}
+	}
+
+
+	return  NULL;
+
+}
+
+//»ñÈ¡wifi lan¿ÚÐÅÏ¢: wifi·Ö¿ªÔ­Òò£¬ÁÚ¾ÓÁбíºÍlease¶¼ÎÞ·¨Çø·ÖË­ÊÇwifi£¬Ö»ÓÐwifiоƬ֪µÀ
+void zte_wlan_get_station_list(webs_t wp)
+{
+	int i      = 0;
+	int result = 0;
+
+	BOOL first 	= TRUE;
+	BOOL match  = FALSE;
+
+	struct in_addr ipAddr                   = {0};
+	RT_802_11_MAC_TABLE staList             = {0};
+	DHCPOFFERADDR_LIST_t * p_dhcp_info   = NULL;
+
+	struct list_head dhcp_info_list;
+	INIT_LIST_HEAD(&dhcp_info_list);
+
+	zte_get_wifi_sta_list(&staList);
+	if (staList.Num > MAX_NUMBER_OF_MAC) {//kw 2,3
+		slog(MISC_PRINT, SLOG_ERR, "sta_count err, Num=%d\n", staList.Num);
+		return;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s]staList.Num:%d\n", __FUNCTION__, staList.Num);
+	slog(MISC_PRINT, SLOG_DEBUG,"[%s]sta_list->ConnectedTime:%d\n", __FUNCTION__, staList.Entry[0].ConnectedTime);
+	if (0 == staList.Num) {
+		cfg_set("client_mac_address", ""); //added by dujiajiao 2016-2-24
+	}
+
+	result = zte_get_mac_list_from_lease(&dhcp_info_list);
+
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"%s\":["), CMD_WIFI_STATION_LIST);
+
+	/*
+	        if(-1 == result || -2 == result || -3 == result)
+	        {
+	    	    (void)websWrite(wp, T("]}"));
+	            safe_free(dhcp_info_list);
+	            return;
+	        }
+	*/
+
+	if (0 == result) {
+		zte_get_cur_user_mac(&dhcp_info_list);//added by dujiajiao 2016-2-24
+	}
+
+
+	for (i = 0; i < staList.Num; i++) {
+
+		if (first == FALSE) {
+			(void)websWrite(wp, T(","));
+		} else {
+			first = FALSE;
+		}
+
+		if (staList.Entry[i].ConnectedTime) {
+			(void)websWrite(wp, T("{\"%s\":%ld,"), WIFI_STATION_CONNECTTIME, staList.Entry[i].ConnectedTime);
+		} else {
+			(void)websWrite(wp, T("{\"%s\":\"--\","), WIFI_STATION_CONNECTTIME);
+		}
+
+		/*do not use macro,  the SSID_index = 0 in broadcom*/
+		slog(MISC_PRINT, SLOG_DEBUG,"[%s]SSID_index:%d\n", __FUNCTION__, staList.Entry[i].SSID_index);
+
+		if (staList.Entry[i].SSID_index) {
+			(void)websWrite(wp, T("\"%s\":\"%d\","), WIFI_SSID_INDEX, staList.Entry[i].SSID_index);
+		}
+
+		(void)websWrite(wp, T("\"%s\":\"wifi\","), WIFI_STATION_DEVTYPE);
+
+
+		(void)websWrite(wp, T("\"%s\":\"%02X:%02X:%02X:%02X:%02X:%02X\","), WIFI_STATION_MAC, \
+		                staList.Entry[i].Addr[0], staList.Entry[i].Addr[1], staList.Entry[i].Addr[2], staList.Entry[i].Addr[3], staList.Entry[i].Addr[4], staList.Entry[i].Addr[5]);
+
+		if ((p_dhcp_info = find_match_sta(&dhcp_info_list,  &staList.Entry[i])) != NULL) {
+
+
+			slog(MISC_PRINT, SLOG_DEBUG,"[%s] dhcp_info.mac= %02X %02X %02X %02X %02X %02X \n", __FUNCTION__, \
+			       p_dhcp_info->dhcp_info.mac[0], p_dhcp_info->dhcp_info.mac[1], p_dhcp_info->dhcp_info.mac[2], \
+			       p_dhcp_info->dhcp_info.mac[3], p_dhcp_info->dhcp_info.mac[4], p_dhcp_info->dhcp_info.mac[5]);
+
+			if (p_dhcp_info->dhcp_info.ip != NULL) {
+
+				slog(MISC_PRINT, SLOG_DEBUG,"[%s]dhcp_info_ip:%d\n", __FUNCTION__, p_dhcp_info->dhcp_info.ip);
+
+			}
+
+			ipAddr.s_addr = p_dhcp_info->dhcp_info.ip;
+
+			if (strlen(p_dhcp_info->dhcp_info.host_name) > 0) { //kw 3 ??
+				(void)websWrite(wp, T("\"%s\":\"%s\","), WIFI_STATION_HOSTNAME, p_dhcp_info->dhcp_info.host_name);
+			} else {
+				(void)websWrite(wp, T("\"%s\":\"--\","), WIFI_STATION_HOSTNAME);
+			}
+
+			if (inet_ntoa(ipAddr)) {
+				(void)websWrite(wp, T("\"%s\":\"%s\","), WIFI_STATION_IPADDR, inet_ntoa(ipAddr));
+				slog(MISC_PRINT, SLOG_DEBUG,"[%s]dhcp_info_ip-inet_ntoa:%s\n", __FUNCTION__, inet_ntoa(ipAddr));
+			} else {
+				(void)websWrite(wp, T("\"%s\":\"--\","), WIFI_STATION_IPADDR);
+			}
+
+			if (zte_is_static_dhcp_ip(inet_ntoa(ipAddr))) {
+				//(void)websWrite(wp,T("\"%s\":-1,"),WIFI_STATION_VALIDTIME);
+				(void)websWrite(wp, T("\"%s\":\"STATIC\"}"), WIFI_STATION_IPTYPE);
+			} else {
+				//(void)websWrite(wp,T("\"%s\":%ld,"),WIFI_STATION_VALIDTIME, dhcpInfo.expires);
+				(void)websWrite(wp, T("\"%s\":\"DHCP\"}"), WIFI_STATION_IPTYPE);
+			}
+			match = FALSE;
+		} else {
+//1.  dchp  not  give an IP
+//2.  customer set a static ip
+			slog(MISC_PRINT, SLOG_DEBUG,"[%s:%s]do not match ++++++++ \n", __FILE__, __FUNCTION__);
+
+			(void)websWrite(wp, T("\"%s\":\"--\","), WIFI_STATION_HOSTNAME);
+			(void)websWrite(wp, T("\"%s\":\"--\","), WIFI_STATION_IPADDR);
+			(void)websWrite(wp, T("\"%s\":\"--\"}"), WIFI_STATION_IPTYPE);
+		}
+
+	}
+
+	(void)websWrite(wp, T("]}"));
+
+	free_dhcp_list(&dhcp_info_list);
+}
+
+
+static unsigned int wps_pin_checksum(unsigned long pin)
+{
+	unsigned long int accum = 0;
+	while (pin) {
+		accum += 3 * (pin % 10);
+		pin /= 10;
+		accum += pin % 10;
+		pin /= 10;
+	}
+
+	return (10 - accum % 10) % 10;
+}
+
+int os_get_time(struct os_time *t)
+{
+	int res = 0;
+	struct timeval tv;
+	res = gettimeofday(&tv, NULL);
+	t->sec = tv.tv_sec;
+	t->usec = tv.tv_usec;
+	return res;
+}
+static int get_random(unsigned char* buf, size_t len)
+{
+	FILE* f;
+	size_t rc;
+
+	f = fopen("/dev/urandom", "rb");
+	if (f == NULL) {
+		slog(MISC_PRINT, SLOG_ERR,"Could not open /dev/urandom.\n");
+		return -1;
+	}
+
+	rc = fread(buf, 1, len, f);
+	//kw 3
+	fclose(f);
+
+	//printf("rc is %d, buf is %s\n", rc, buf);
+	return rc != len ? -1 : 0;
+}
+
+int random_get_bytes(void* buf, size_t len)
+{
+	int ret;
+	unsigned char* bytes = buf;
+
+	ret = get_random(buf, len);
+	return ret;
+}
+
+static int wps_generate_pin(void)
+{
+	unsigned int val = 0;
+
+	/*Generate seven random digits for the PIN*/
+	if (random_get_bytes((unsigned char *) &val, sizeof(val)) < 0) {
+		struct os_time now;
+		os_get_time(&now);
+		val = random() ^ now.sec ^ now.usec;
+	} else {//klocwork
+		if (val > 0xFFFFFFF0) {
+			struct os_time now;
+			os_get_time(&now);
+			val = random() ^ now.sec ^ now.usec;
+		}
+	}
+	val %= 10000000;
+	//printf("val is %ld\n", val);
+	/*Append checksum digit*/
+	return val * 10 + wps_pin_checksum(val);
+}
+
+void zte_wlan_get_wps_pin(webs_t wp)
+{
+	unsigned long pincode = 0;
+	char pin[9] = {0};
+
+	pincode = wps_generate_pin();
+	snprintf(pin,sizeof(pin), "%08d", pincode);
+
+	(void)zte_web_write(NV_WIFI_WPS_AP_PIN, pin);
+	web_feedback_header(wp);
+	zte_rest_cmd_write_head(wp);
+	zte_rest_cmd_write(wp, NV_WIFI_WPS_AP_PIN, pin, 0);
+	zte_rest_cmd_write_foot(wp);
+}
+
+void zte_wlan_get_wps_defpin(webs_t wp)
+{
+	//unsigned long defpincode = 0;
+	char pin[9] = {0};
+	(void)zte_web_read(NV_WIFI_WPS_DEF_PIN, pin);
+
+	web_feedback_header(wp);
+	zte_rest_cmd_write_head(wp);
+	zte_rest_cmd_write(wp, NV_WIFI_WPS_DEF_PIN, pin, 0);
+	zte_rest_cmd_write_foot(wp);
+}
+
+
+
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_interface.h b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_interface.h
new file mode 100755
index 0000000..855f808
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_interface.h
@@ -0,0 +1,1131 @@
+/**
+ * @file zte_web_interface.h
+ * @brief Public APIs of Sanechips
+ *
+ * Copyright (C) 2017 Sanechips Technology Co., Ltd.
+ * @author Hong Wu <wu.hong@sanechips.com.cn>
+ * @defgroup si_ap_app_webserver_id si_ap_app_webserver
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+
+#ifndef ZTE_WEB_INTERFACE_H
+#define ZTE_WEB_INTERFACE_H
+
+/*******************************************************************************
+ *                           Include header files                              *
+ ******************************************************************************/
+#include <time.h>
+#include "../server/webs.h"
+#include "message.h"
+//#include "errorcode.h"
+#include "cfg_nv_def.h"
+#include "cfg_api.h"
+#include "zte_web_mgmt.h"
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include "softap_api.h"
+#include "netotherapi.h"
+#include "net/zte_web_net_lan.h"
+#include "net/zte_web_net_wan.h"
+#include "net/zte_web_net_other.h"
+
+/*******************************************************************************
+ *                             Macro definitions                               *
+ ******************************************************************************/
+#define cprintf(fmt, args...) do {  \
+    FILE *fp = fopen("/dev/console", "w");  \
+    if (fp) {   \
+        fprintf(fp, fmt, ## args);  \
+        fclose(fp); \
+    }   \
+} while (0)
+
+#define WEBLOG cprintf
+#define IFSTREQUAL(str1, str2) (strcmp((str1), (str2))?0:1)
+#define STR_EQUAL(a,b) ( strcmp((char*)a, (char*)b)==0 )
+#ifndef uint8
+#define uint8 unsigned char
+#endif
+
+#define ID "id"
+#define NAME "name"
+#define SITE "site"
+#define SUCCESS "success"
+#define FAILURE "failure"
+#define EXIST "exist"
+#define NOEXIST "noexist"
+#define PROCESSING "processing"
+#define MSG_INVALID_WEB_PARAM    "MSG_INVALID_WEB_PARAM"
+#define ZTE_MC_OK_S  (0)
+
+#define CFG_BUF_LENGTH 512
+#define CONFIG_DEFAULT_LENGTH  64
+
+#define DIAGLOG_DATA_PATH    "/etc_ro/web/diaglog"
+
+/*** define about NV ***/
+#define NV_ITEM_VALUE_DEFAULT_STRING_LEN 128
+#define NV_ITEM_VALUE_BOOLEAN_LEN 1
+#define NV_ITEM_VALUE_YES_NO_LEN 5
+#define NV_ITEM_VALUE_IP_LEN          20
+#define NV_ITEM_MODE_STRING_LEN   25
+#define NV_ITEM_ADMIN_STRING_LEN 25
+#define NV_ITEM_VALUE_APN_STRING_LEN 400
+#define NV_ITEM_VALUE_NW_LIST_STRING_LEN 700
+#define NV_ITEM_STRING_LEN_5  5
+#define NV_ITEM_STRING_LEN_10  10
+#define NV_ITEM_STRING_LEN_20  20
+#define NV_ITEM_STRING_LEN_50  50
+#define NV_ITEM_STRING_LEN_64  64
+#define NV_ITEM_STRING_LEN_150  150
+#define NV_ITEM_STRING_LEN_200  200
+#define NV_FW_RULE_MAX_LEN_V6 400
+#define NV_ITEM_VALUE_STRING_LEN 50
+#define NVIO_MAX_LEN 1500
+#define NVIO_TMP_LEN 512
+#define NVIO_DEFAULT_LEN 50
+#define NV_ITEM_VALUE_STRING_LEN 50
+#define NV_ITEM_VALUE_MAX_LEN        1024
+#define zte_web_write(xx_item, xx_value) zte_nvconfig_write(xx_item, xx_value,(int)strlen(xx_value))
+#define zte_web_read(xx_item, xx_value) zte_nvconfig_read(xx_item, xx_value,sizeof(xx_value)) //modified,-1 deleted
+
+/*webuiÕʺÅ*/
+#define LOGIN_SUCCESS "0"
+#define LOGIN_FAIL "1"
+#define LOGIN_DUPLICATE_USER "2"
+#define LOGIN_BAD_PASSWORD "3"
+#define LOGIN_ALREADY_LOGGED "4"
+#define LOGIN_USER_NAME_NOT_EXSIT  "5"
+#define LOGIN_TIMEOUT  600 //timeout after webui login 
+#define LOGIN_PSW_MIN_LEN 1
+#define LOGIN_PSW_MAX_LEN 32
+#define LOGIN_FAIL_LOCK_TIME 300//the lock time after  login failed
+#define LOGIN_FAIL_TIMES "5"
+#define LOGIN_RECORD_TIME  32
+
+#define COOKIE_SESSION_SIZE  32
+#define COOKIE_TOKEN_TIMEOUT  30
+
+#define NV_LANGUAGE "Language"
+#define NV_LOGINFO "loginfo"
+#define NV_USER_IP_ADDR "user_ip_addr"
+#define NV_LOGIN_LOCK_TIME "login_lock_time"
+#define NV_LAST_LOGIN_TIME "last_login_time"
+#define NV_USER_LOGIN_TIMEMARK "user_login_timemark"
+#define NV_COOKIE_ID "cookie_id"
+#define NV_WEB_TOKEN "web_token"
+
+/* ¿ìËÙÉèÖà */
+#define MAX_QUICK_SET_NUM 10
+
+/*Á÷Á¿Í³¼Æ*/
+#define ZTE_WEB_DATA_STATISTICS_CLEAR_ALL "ALL"
+#define ZTE_WEB_DATA_STATISTICS_CLEAR_TOTAL "TOTAL"
+#define ZTE_WEB_DATA_STATISTICS_CLEAR_CURRENT "CURRENT"
+
+
+
+//wan module
+#define ZTE_DAILNUM_LEN 8
+#define ZTE_ADDR_LEN 16
+#define ZTE_SEL_TYPE 8
+#define ZTE_PDP_TYPE_LEN 12
+#define ZTE_AUTH_TYPE_LEN 8
+#define ZTE_WAN_UMTS_MAX_PROFILE_NAME_LEN 32
+#define ZTE_WAN_UMTS_MAX_APN_STRING_LEN 104
+#define ZTE_WAN_UMTS_MAX_USERNAME_STRING_LEN 65
+#define ZTE_WAN_UMTS_MAX_PASSWD_STRING_LEN 65
+#define ZTE_USSD_DATA_TO_WEB_LEN  900
+#define CMD_CONNECTION_MODE  "ConnectionMode"
+
+//pbm module
+#define CMD_PBM_DATA_INFO "pbm_data_info"
+#define CMD_PBM_DATA_TOTAL "pbm_data_total"
+#define CMD_PBM_CAPACITY_INFO "pbm_capacity_info"
+
+//sms module
+#define CMD_SMS_PAGE_DATA "sms_page_data"
+#define CMD_SMS_PARAMETER_INFO "sms_parameter_info"
+#define CMD_SMS_STATUS_INFO "sms_cmd_status_info"
+#define CMD_SMS_CAPACITY_INFO "sms_capacity_info"
+#define CMD_SMS_STATUS_RPT_DATA "sms_status_rpt_data"
+#define CMD_SMS_DATA_TOTAL "sms_data_total"
+#define CMD_SMS_UNREAD_COUNT "sms_unread_count"
+#define CMD_BROADCAST_DATA "broadcast_data"
+#define NV_SMS_UNREAD_NUM  "sms_unread_num"
+
+//APN
+#define APN_SAVE_AND_SET_DEFAULT "0"
+#define APN_ONLY_SET_DEFAULT "1"
+#define ZTE_WEB_ACT_AUTO  "auto"
+#define ZTE_WEB_ACT_MANUAL "manual"
+#define ZTE_WEB_ACT_SAVE "save"
+#define ZTE_WEB_ACT_SETDEFAULT "set_default"
+#define ZTE_WEB_ACT_SAVE_AND_SETDEFAULT "set_save_and_default"
+#define ZTE_WEB_ACT_DELETE "delete"
+#define ZTE_WEB_DIAL_MODE_AUTO "auto_dial"
+#define ZTE_WEB_DIAL_MODE_MANUAL "manual_dial"
+#define ZTE_WEB_DIAL_MODE_DEMAND  "demand_dial"
+#define ZTE_WEB_MANUAL_DIAL_ACTION_CONN "connect"
+#define ZTE_WEB_MANUAL_DIAL_ACTION_DISCONN "disconnect"
+
+//nv for data limit settings
+#define NV_DATA_VOLUME_LIMIT_SWITCH "data_volume_limit_switch" /*0:disable;1:enable*/
+#define NV_DATA_VOLUME_LIMIT_UNIT  "data_volume_limit_unit" /*time/data*/
+#define NV_DATA_VOLUME_LIMIT_SIZE "data_volume_limit_size"
+#define NV_DATA_VOLUME_ALERT_PERCENT "data_volume_alert_percent"
+#define DATA_VOLUME_LIMIT_UNIT_TIME "time"
+#define DATA_VOLUME_LIMIT_UNIT_DATA "data"
+#define NV_HTTPSHARE_STATUS "HTTP_SHARE_STATUS"
+#define NV_HTTPSHARE_WR_AUTH "HTTP_SHARE_WR_AUTH"
+#define NV_HTTPSHARE_FILE "HTTP_SHARE_FILE"
+
+//other fluxstat
+#define NV_DATA_TRAFFIC_SIM_PROVINCE   "sim_home_location"
+#define NV_DATA_TRAFFIC_SWITCH              "is_traffic_aline_on"
+#define NV_DATA_TRAFFIC_MONTH_TOTAL   "traffic_month_total"
+#define NV_DATA_TRAFFIC_MONTH_USED   "traffic_month_used"
+
+//fota module
+#define FOTA_ACTION_CANCEL_DOWNLOAD "0"
+#define FOTA_ACTION_CONFIRM_DOWNLOAD "1"
+#define FOTA_ACTION_DOWNLOADING_USER_CLICK_CANCEL "2"
+//#define FOTA_UPDATE_VERSION "version"
+#define FOTA_UPGRADE_RESULT "upgrade_result"
+//#define FOTA_PACK_SIZE_INFO "pack_size_info"
+//#define FOTA_UPDATE_INFO "update_info"
+//#define FOTA_SETTINGS_INFO "GetUpgAutoSetting"
+//#define FOTA_NEW_VERSION_STATE "new_version_state"
+
+//NET
+#define HOSTANME "hostname"
+#define MAC "mac"
+#define ADDR "ip"
+#define DOMAIN "domain"
+#define MAC_ADDR "mac_addr"
+#define DEVICES "devices"
+#define SITELIST "siteList"
+#define CMD_LAN_STATION_LIST "lan_station_list"
+#define CMD_CHILDREN_DEVICE_LIST "childGroupList"
+#define CMD_WHITE_SITE_LIST "site_white_list"
+#define CMD_GET_USER_MAC_ADDR  "get_user_mac_addr"
+#define CMD_CURRENT_STATICADDR_LIST "current_static_addr_list"
+#define CMD_GET_POWERON_TIME     "get_poweron_time"
+#define CMD_GET_LAN_DEV_INFO     "get_lan_dev_info" //you wen ti
+#define CMD_GETDDNS_STATUS "getddns_status"
+#define CMD_USSD_DATA_INFO "ussd_data_info"
+#define CMD_GET_DEVICE_MODE  "get_device_mode"
+
+//SD
+#define STR_SDCARD_MODE_OPT "sdcard_mode_option"
+
+
+/*useradded module start*/
+#define CMD_GET_SAMPLE "station_list"
+/*useradded module end*/
+
+/****************************All the Goform ID************************************/
+
+//#define GOFORM_MGMT_SET_WEB_DATA "SET_WEB_DATA"
+//#define GOFORM_MGMT_GUEST_USER_CONTROL "GUEST_USER_CONTROL"
+#define GOFORM_MGMT_SET_EXTERNAL_NV  "SET_EXTERNAL_NV"
+/*management start*/
+#define GOFORM_MGMT_SET_WEB_LANGUAGE  "SET_WEB_LANGUAGE"
+#define GOFORM_MGMT_SET_DEVICEMODE "SET_DEVICE_MODE"
+#define GOFORM_MGMT_LOGIN_IP  "LOGIN"
+#define GOFORM_MGMT_LOGOUT_IP "LOGOUT"
+#define GOFORM_MGMT_CHANGE_PASSWORD  "CHANGE_PASSWORD"
+#define GOFORM_MGMT_CHANGE_ACCOUNT  "CHANGE_ACCOUNT"
+#define GOFORM_MGMT_RESTORE_FACTORY_SETTINGS  "RESTORE_FACTORY_SETTINGS"
+#define GOFORM_MGMT_REBOOT "REBOOT_DEVICE"
+#define GOFORM_MGMT_POWEROFF    "TURN_OFF_DEVICE"
+#define GOFORM_MGMT_POWER_ON_SPEED "MGMT_CONTROL_POWER_ON_SPEED"
+#define GOFORM_MGMT_QUICK_SETUP "QUICK_SETUP_EX"
+//#define GOFORM_SET_WORK_TYPE "SET_WORK_TYPE"
+#define GOFORM_MGMT_SNTP "SNTP"
+#define GOFORM_MGMT_SYSLOG  "SYSLOG"
+#define GOFORM_MGMT_SCHEDULE_SETTING "SCHEDULE_SETTING"
+//#define GOFORM_HTTP_REDIRECT "HTTP_REDIRECT"
+/*management end*/
+
+/*wan module start*/
+#define GOFORM_WAN_LOCK_FREQUENCY "LOCK_FREQUENCY"
+#define GOFORM_WAN_SET_NETWORK "SET_NETWORK"
+#define GOFORM_WAN_SET_CONNECTION_MODE "SET_CONNECTION_MODE"
+#define GOFORM_WAN_CONNECT_NETWORK "CONNECT_NETWORK"
+#define GOFORM_WAN_DISCONNECT_NETWORK "DISCONNECT_NETWORK"
+#define GOFORM_WAN_SCAN_NETWORK "SCAN_NETWORK"
+#define GOFORM_WAN_SET_BEARER_PREFERENCE "SET_BEARER_PREFERENCE"
+//#define GOFORM_WAN_SET_CONN_SETTING "SET_CONN_SETTING"
+//#define GOFORM_WAN_CANCEL_AUTO_RECONNECT "CANCEL_AUTO_RECONNECT"
+#define GOFORM_WAN_UNLOCK_NETWORK "UNLOCK_NETWORK"
+//statistics module
+#define GOFORM_WAN_RESET_DATA_COUNTER "RESET_DATA_COUNTER"
+#define GOFORM_WAN_DATA_LIMIT_SETTING "DATA_LIMIT_SETTING"
+#define GOFORM_WAN_DATA_FLOW_CALIBRATION_MANUAL "FLOW_CALIBRATION_MANUAL"
+#define GOFORM_SNTP_GETDATASTATIC  "SNTP_Getdatastatic"
+//pin,puk module
+#define GOFORM_MGMT_ENTER_PIN "ENTER_PIN"
+#define GOFORM_MGMT_DISABLE_PIN "DISABLE_PIN"
+#define GOFORM_MGMT_ENABLE_PIN "ENABLE_PIN"
+//#define GOFORM_MGMT_MODIFY_PIN "MODIFY_PIN"
+#define GOFORM_MGMT_ENTER_PUK "ENTER_PUK"
+#define GOFORM_MGMT_AUTO_PIN "AUTO_PIN"
+//pbm
+#define GOFORM_PBM_CONTACT_ADD "PBM_CONTACT_ADD"
+#define GOFORM_PBM_CONTACT_DEL "PBM_CONTACT_DEL"
+//sms module
+#define GOFORM_SMS_SET_MSG_CENTER  "SET_MESSAGE_CENTER"
+#define GOFORM_SMS_DELETE_SMS  "DELETE_SMS"
+#define GOFORM_SMS_DELETE_SMS_ALL  "ALL_DELETE_SMS"
+#define GOFORM_SMS_MOVE_TO_SIM  "MOVE_TO_SIM"
+#define GOFORM_SMS_SAVE_SMS  "SAVE_SMS"
+#define GOFORM_SMS_SEND_SMS  "SEND_SMS"
+#define GOFORM_SMS_SET_MSG_READ "SET_MSG_READ"
+//ussd module
+//#define GOFORM_USSD_SEND_CMD "SEND_USSD_CMD"
+#define GOFORM_USSD_PROCESS "USSD_PROCESS"
+//apn module
+#define GOFORM_WAN_APN_PROC_EX  "APN_PROC_EX"
+/*wan module end*/
+
+/*wifi module start*/
+#define GOFORM_WLAN_SET "SET_WIFI_INFO"
+//#define GOFORM_WIFI_SET_FOR_SLEEP "SET_WIFI_INFO_FOR_SLEEP"
+//#define GOFORM_SET_SHOW_SSID_KEY_OLED  "SET_SHOW_SSID_KEY_OLED"
+#define GOFORM_WLAN_MAC_FILTER "WIFI_MAC_FILTER"
+#define GOFORM_WLAN_WPS_SET "WIFI_WPS_SET"
+#define GOFORM_WLAN_SSID1_SET  "SET_WIFI_SSID1_SETTINGS"
+#define GOFORM_WLAN_SSID2_SET  "SET_WIFI_SSID2_SETTINGS"
+#define GOFORM_WLAN_WIFI_SLEEP_SET "SET_WIFI_SLEEP_INFO"
+#define GOFORM_WLAN_WIFI_COVERAGE_SET "SET_WIFI_COVERAGE"
+#define GOFORM_WLAN_SET_TSW "SAVE_TSW"
+#define GOFORM_PARENT_CONTROL_SET "SAVE_TIME_LIMITED"
+//wifi station start
+#define GOFORM_WLAN_WIFI_STA_CONTROL "WIFI_STA_CONTROL"
+#define GOFORM_WLAN_WIFI_SPOT_PROFILE_UPDATE "WIFI_SPOT_PROFILE_UPDATE"
+#define GOFORM_WLAN_SET_STA_CON "WLAN_SET_STA_CON"
+#define GOFORM_WLAN_SET_STA_DISCON "WLAN_SET_STA_DISCON"
+#define GOFORM_WLAN_SET_STA_REFRESH "WLAN_SET_STA_REFRESH"
+/*wifi module end*/
+
+/*router module start*/
+#define GOFORM_ROUTER_DEL_IP_PORT_FILETER "DEL_IP_PORT_FILETER"
+#define GOFORM_ROUTER_ADD_IP_PORT_FILETER_V4V6 "ADD_IP_PORT_FILETER_V4V6"//ÉèÖö˿ڹýÂËÐÅÏ¢
+#define GOFORM_ROUTER_DEL_IP_PORT_FILETER_V4V6 "DEL_IP_PORT_FILETER_V4V6"
+#define GOFORM_ROUTER_ADD_PORT_FORWARE "FW_FORWARD_ADD"
+#define GOFORM_ROUTER_DEL_PORT_FORWARE "FW_FORWARD_DEL"
+#define GOFORM_ROUTER_ADD_PORT_MAP "ADD_PORT_MAP"
+#define GOFORM_ROUTER_DEL_PORT_MAP "DEL_PORT_MAP"
+#define GOFORM_ROUTER_BASIC_SETTING "BASIC_SETTING"
+#define GOFORM_ROUTER_FORWARD_SETTING "VIRTUAL_SERVER"
+#define GOFORM_ROUTER_SYSTEM_SECURITY "FW_SYS"
+#define GOFORM_ROUTER_DHCP_SETTING "DHCP_SETTING"
+#define GOFORM_ROUTER_STATIC_DHCP_SETTING "STATIC_DHCP_SETTING"
+#define GOFORM_ROUTER_UPNP_SETTING  "UPNP_SETTING"
+#define GOFORM_ROUTER_DMZ_SETTING "DMZ_SETTING"
+#define GOFORM_ROUTER_EDIT_HOSTNAME "EDIT_HOSTNAME"
+#define GOFORM_BIND_STATIC_ADDRESS_SET "SET_BIND_STATIC_ADDRESS"
+#define GOFORM_BIND_STATIC_ADDRESS_ADD "BIND_STATIC_ADDRESS_ADD"
+#define GOFORM_BIND_STATIC_ADDRESS_DEL "BIND_STATIC_ADDRESS_DEL"
+#define GOFORM_ADD_CHILDREN_DEVICE "ADD_DEVICE"
+#define GOFORM_DEL_CHILDREN_DEVICE "DEL_DEVICE"
+#define GOFORM_ADD_WHITE_SITE "ADD_WHITE_SITE"
+#define GOFORM_REMOVE_WHITE_SITE "REMOVE_WHITE_SITE"
+#define GOFORM_URL_FILTER_DELETE "URL_FILTER_DELETE"
+#define GOFORM_URL_FILTER_ADD "URL_FILTER_ADD"
+#define GOFORM_DDNS "DDNS"
+//#define GOFORM_DNS_MODE_SET "SET_DNS_MODE"
+//#define GOFORM_DNS_SERVER_SET "SET_DNS_SERVER"
+
+// wan pppoe *
+#define GOFORM_SET_OPERATION_MODE    "OPERATION_MODE"
+//#define GOFORM_SET_WAN_GATEWAYMODE    "WAN_GATEWAYMODE"
+#define GOFORM_SET_WAN_GATEWAYMODE_PPPOE    "WAN_GATEWAYMODE_PPPOE"
+#define GOFORM_SET_WAN_GATEWAYMODE_DHCP    "WAN_GATEWAYMODE_DHCP"
+#define GOFORM_SET_WAN_GATEWAYMODE_STATIC    "WAN_GATEWAYMODE_STATIC"
+#define GOFORM_SET_WAN_GATEWAYMODE_AUTO    "WAN_GATEWAYMODE_AUTO"
+/*router module end*/
+
+/*httpShare module start*/
+#define GOFORM_HTTPSHARE_GETCARD_VAULE "HTTPSHARE_GETCARD_VALUE"
+#define GOFORM_HTTPSHARE_ENTERFOLD "HTTPSHARE_ENTERFOLD"
+#define GOFORM_HTTPSHARE_NEW "HTTPSHARE_NEW"
+#define GOFORM_HTTPSHARE_DEL "HTTPSHARE_DEL"
+#define GOFORM_HTTPSHARE_FILE_RENAME "HTTPSHARE_FILE_RENAME"
+#define GOFORM_HTTPSHARE_AUTH_SET "HTTPSHARE_AUTH_SET"
+#define GOFORM_HTTPSHARE_MODE_SET "HTTPSHARE_MODE_SET"
+#define GOFORM_HTTPSHARE_CHECK_FILE "GOFORM_HTTPSHARE_CHECK_FILE"
+#define CMD_HTTPSHARE_GETCARD_VAULE "HTTPSHARE_GETCARD_VALUE"
+#define CMD_HTTPSHARE_GETCARD_NMEA "HTTPSHARE_GETCARD_NAME"
+#define CMD_HTTPSHARE_AUTH_GET "HTTPSHARE_AUTH_GET"
+/*httpShare module end*/
+
+/*FOTA module start*/
+#define GOFORM_SET_FOTAAUTOUPDATE "IF_UPGRADE"
+#define GOFORM_SET_FOTASETTINGS "SetUpgAutoSetting"
+#define GOFORM_SET_FOTAMANUALUPG "SetUpgManualSetting"
+#define GOFORM_SET_FOTAWEFOTAUPG "SetUpgWefotaSetting"
+/*FOTA module end*/
+
+/*ping test*/
+#define GOFORM_PING_DIAGNOSTICS_START "PINT_DIAGNOSTICS_START"
+#define GOFORM_PING_DIAGNOSTICS_STOP "PINT_DIAGNOSTICS_STOP"
+#define GOFORM_PING_RESULT_CLEAR "PING_RESULT_CLEAR"
+/*ping test*/
+
+/*useradded module start*/
+#define GOFORM_SET_SAMPLE "GOFORM_SET_SAMPLE"
+/*useradded module end*/
+
+#define GOFORM_SET_NETWORK_ADB "NETWORK_ADB"
+#define GOFORM_COMMAND "COMMAND"
+#define GOFORM_NETWORK_INFO "NETWORK_INFO"
+
+/****************************All the web pages' URL************************************/
+#define ZTE_WEB_PAGE_LOGIN_NAME   			"index.html"
+#define ZTE_WEB_MOBILE_PAGE_LOGIN_NAME      "mobile.html"
+
+#define ZTE_WEB_PAGE_MSG                	"/message.asp"
+#define ZTE_WEB_PAGE_NET_CONNECT       		"/air_network/net_connect.asp"
+#define ZTE_WEB_PAGE_PPP_CONNECTING  		"/air_network/pppconnect.asp"
+#define ZTE_WEB_PAGE_PPP_DISCONNECT  		"/air_network/pppdisconnect.asp"
+
+/*******************************************************************************
+ *                             Type definitions                                *
+ ******************************************************************************/
+/**
+ * @brief time
+ * @param sec second
+ * @param usec Microsecond
+ * @note
+ * @warning
+ */
+struct os_time {
+	long sec;
+	long usec;
+};
+
+
+/**
+ * @brief goform/cmd table's struct
+ * @param goform_id the message id extract from URL
+ * @param proc_func the handler of this goform_id
+ * @note
+ * @warning
+ */
+typedef struct web_goform_struct {
+	char goform_id[50];
+	void (*proc_func)(webs_t wp);
+} web_goform_type;
+
+/*******************************************************************************
+ *                       Global variable declarations                          *
+ ******************************************************************************/
+typedef enum _data_safe_result_type_t {
+	DATA_NO_SAFE = 0,
+	DATA_SAFE = 1
+} data_safe_result_type_t;
+
+typedef enum {
+	ZTE_NVIO_FAIL = 0,
+	ZTE_NVIO_DONE = 1,
+	ZTE_NVIO_BUSY = 2,
+	ZTE_NVIO_BADCMD = 3,
+	ZTE_NVIO_MAX
+} zte_topsw_state_e_type;
+
+
+
+/*******************************************************************************
+ *                       Global function declarations                          *
+ ******************************************************************************/
+/**
+* @brief Get current systime
+*
+* @param
+*
+* @return currentTime
+* @note
+* @warning
+*/
+int zte_web_getCurrentTime();
+
+/**
+* @brief the entry of zte code in goahead.
+*
+* @param
+*
+* @return currentTime
+* @note
+* @warning
+*/
+extern void zte_web_init();
+
+/**
+ * @brief Read the NV's value from the nv file.
+ *
+ * @param item  Pointer to the NV's name.
+ * @param data  Pointer to the NV's value.
+ * @param dataLen  data's length.
+ *
+ * @return zte_topsw_state_e_type result number
+ * @note
+ * @warning
+ */
+zte_topsw_state_e_type zte_nvconfig_read(char *item, char *data, int dataLen);
+
+/**
+* @brief Write the NV's name and value into the nv file.
+*
+* @param item  Pointer to the NV's name.
+* @param data  Pointer to the NV's value.
+* @param dataLen  data's length.
+*
+* @return zte_topsw_state_e_type result number
+* @note
+* @warning
+*/
+zte_topsw_state_e_type zte_nvconfig_write(char *item, char *data, int dataLen);
+
+/**
+* @brief goform entry from web pages to get fw para, call the related functions according to the cmd
+*
+* @param wp  HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+void zte_goform_get_cmd_process(webs_t wp, char *path, char *query);
+
+/**
+* @brief goform entry from web pages to set fw para, call the related functions according to the goformId
+*
+* @param wp  HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+void zte_goform_set_cmd_process(webs_t wp, char *path, char *query);
+
+/**
+* @brief Feed back web page at top location.
+*
+* @param i_wp HTTP Request Info.
+* @param i_pageName The page name.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_webs_feedback_top(webs_t i_wp, char *i_pageName);
+
+/**
+* @brief Check whether the login timeout.
+*
+* @param i_wp HTTP Request Info.
+* @param i_pageName The page name.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_mgmt_login_timeout_check();
+
+/**
+* @brief Send SMS.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_sms_send_msg_process(webs_t wp);
+
+/**
+* @brief Save SMS.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_sms_save_msg_process(webs_t wp);
+
+/**
+* @brief Delete message.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_sms_delete_msg_process(webs_t wp);
+
+/**
+* @brief Move message to SIM.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_sms_move_to_sim_msg_process(webs_t wp);
+
+/**
+* @brief Delete all messages.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_goform_sms_alldel_msg_process(webs_t wp);
+
+/**
+* @brief Set SMS related parameters.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_sms_set_message_center(webs_t wp);
+
+/**
+* @brief To set the viewed message as read.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_sms_view_msg_process(webs_t wp);
+
+/**
+* @brief Add new contact.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_goform_pbm_contact_add_process(webs_t wp);
+
+/**
+* @brief Delete contact.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_goform_pbm_contact_del_process(webs_t wp);
+
+/**
+* @brief Set WiFi basic parameter.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_basic_set(webs_t wp);
+
+/**
+* @brief Set WiFi MAC filter parameters.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_mac_filter_set(webs_t wp);
+
+/**
+* @brief Set WiFi WPS mode.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_wps_mode_set(webs_t wp);
+
+/**
+* @brief Set WiFi sleep and wake up at regular time.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_set_tsw(webs_t wp);
+
+/**
+* @brief Set WiFi SSID1 parameters.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_web_ssid1_set(webs_t wp);
+
+/**
+* @brief Set WiFi SSID2 parameters.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_ssid2_set(webs_t wp);
+
+/**
+* @brief To set the WiFi sleep mode.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_sleep_set(webs_t wp);
+
+/**
+* @brief Set WiFi coverage mode.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_coverage_set(webs_t wp);
+
+/**
+* @brief Set WiFi apstation parameters.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_station_set(webs_t wp);
+
+/**
+* @brief Update the wifi spot profile.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_station_spot_profile_update(webs_t wp);
+
+/**
+* @brief Connect to wifi spot.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_station_connect(webs_t wp);
+
+/**
+* @brief Disconnect wifi spot.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_station_disconnect(webs_t wp);
+
+/**
+* @brief Scan the wifi spot.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_station_refresh(webs_t wp);
+
+/**
+* @brief Get the wlan port's information.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wlan_get_station_list(webs_t wp);
+extern void zte_wlan_get_wps_pin(webs_t wp);
+extern void zte_wlan_get_wps_defpin(webs_t wp);
+
+
+
+/**
+* @brief Register network after manual search.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_set_network(webs_t wp);
+
+/**
+* @brief Set connect mode.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_set_connection_mode(webs_t wp);
+
+/**
+* @brief Connect to the network.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_connect_network(webs_t wp);
+
+/**
+* @brief Disonnect the network.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_disconnect_network(webs_t wp);
+
+/**
+* @brief Scan the network.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_scan_network(webs_t wp);
+
+/**
+* @brief Set the mode of searching network.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_network_select(webs_t wp);
+
+/**
+* @brief Set the management of network flow.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_data_limit_setting(webs_t wp);
+
+/**
+* @brief Calibrate the network flow by manual.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_data_flow_calibration_manual(webs_t wp);
+
+
+/**
+* @brief Clear the network flow records.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_wan_data_statistics_clear_process(webs_t wp, char_t *path, char_t *query);//11
+
+/**
+* @brief Init the httpshare.
+*
+* @param
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpshare_init();
+
+/**
+* @brief Get file list from httpshare's database.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_enterFold(webs_t wp);
+
+/**
+* @brief Creat a new folder.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_new(webs_t wp);
+
+/**
+* @brief Delete file or folder from SD card.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_del(webs_t wp);
+
+/**
+* @brief Set the httpshare's configs.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_auth_set(webs_t wp);
+
+/**
+* @brief Set the SD card's mode:usb mode or httpshare mode.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_modeset(webs_t wp);
+
+/**
+* @brief Creat a new folder.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_rename(webs_t wp);
+
+/**
+* @brief Check file exists.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_check_file(webs_t wp);
+
+/**
+* @brief Get the httpshare's configs.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_auth_get(webs_t wp);
+
+/**
+* @brief Get the SD card's name:"MicroSD Card".
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_getcard_name(webs_t wp);
+
+/**
+* @brief Get the SD card's available capacity and total capacity.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_httpShare_getcard_value(webs_t wp);
+
+/**
+* @brief Ussd's operator process.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_goform_ussd_process(webs_t wp);
+
+/**
+* @brief Handle the auto or manual apn set for ipv4ipv6.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_form_multi_apn_proc_ex(webs_t wp);
+
+/**
+* @brief Set the user's selection:update or cancel.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_fota_update(webs_t wp);
+
+/**
+* @brief Set the fota's configs.
+*
+* @param wp HTTP Request Info.
+*
+* @return
+* @note
+* @warning
+*/
+extern void zte_fota_settings(webs_t wp);
+extern void zte_fota_manual_upgrade(webs_t wp);
+extern void zte_wefota_upgrade(webs_t wp);
+
+
+extern void zte_init_login_psw_time(void);
+extern int zte_apn_param_check(webs_t  wp, char * type);
+extern void zte_get_login_lock_time(webs_t wp);
+extern void zte_get_login_status_value(webs_t wp, char *login_status);
+extern void zte_get_ddns_status(webs_t wp);
+extern void zte_dhcpv6_state_set(webs_t wp);
+extern void zte_mtu_set(webs_t wp);
+extern void zte_dns_mode_set(webs_t wp);
+//extern void zte_dns_server_set(webs_t wp);
+extern void zte_ping_diagnostics_start(webs_t wp);
+extern void zte_ping_diagnostics_stop(webs_t wp);
+extern void zte_ping_result_clear(webs_t wp);
+extern void zte_get_poweron_time(webs_t wp);
+extern void zte_get_lan_dev_info(webs_t wp);
+extern void zte_goform_set_external_nv(webs_t wp);
+extern void zte_goform_set_work_type(webs_t wp);
+
+//other sntp + fluxstat + parent_control_set
+extern void zte_goform_sntp_getdatastatic_process(webs_t wp);
+extern void zte_parent_control_set(webs_t wp);//parent mode time control
+
+/*useradded module start*/
+extern void zte_goform_set_sample(webs_t wp);
+/*useradded module end*/
+
+extern void zte_goform_set_network_adb(webs_t wp);
+extern void zte_goform_set_command(webs_t wp);
+extern void zte_goform_get_network_info(webs_t wp);
+
+/**
+* @brief Data to be decoded.
+*
+* @param src Data to be decoded.
+* @param len Length of the data to be decoded.
+* @param out_len Pointer to output length variable.
+*
+* @return Allocated buffer of out_len bytes of decoded data,or NULL on failure
+* @note Caller is responsible for freeing the returned buffer.
+* @warning
+*/
+extern unsigned char * zte_base64_decode(const unsigned char *src, size_t len, size_t *out_len);
+#ifdef WEBS_SECURITY
+extern char *zte_base64_encode(const char *data, int data_len);
+#endif
+
+extern int zte_Safe_valid_SpecialChar(char single_data);
+extern int zte_Safe_valid_SpecialChar_other(char single_data);
+extern int zte_valid_length_str(char *string_s, int min, int max);
+
+extern data_safe_result_type_t zte_Safe_isMacValid(char *str);
+extern data_safe_result_type_t zte_Safe_isIpValid(char *str);
+extern data_safe_result_type_t zte_Safe_isNumOnly(char *str);
+extern data_safe_result_type_t zte_Safe_noSpecialChar(char *str);
+extern data_safe_result_type_t zte_Safe_noSpecialChar_other(char *str);
+extern data_safe_result_type_t zte_Safe_isStringOnly(char *str);
+extern data_safe_result_type_t zte_Safe_isNumorStringOnly(char *str);
+
+extern int web_set_pwd(char *buf);
+extern void web_init_pwd(void);
+extern int web_check_pwd(char* buf);
+
+extern int web_aes_init(void);
+
+#endif
+
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_mgmt.c b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_mgmt.c
new file mode 100755
index 0000000..7059673
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_mgmt.c
@@ -0,0 +1,4205 @@
+/************************************************************************
+* °æÈ¨ËùÓÐ (C)2010, ÉîÛÚÊÐÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+*
+* ÎļþÃû³Æ£º zte_web_mgmt.c
+* Îļþ±êʶ£º
+* ÄÚÈÝÕªÒª£º
+* ÆäËü˵Ã÷£º
+* µ±Ç°°æ±¾£º V0.1
+* ×÷    Õߣº zyt
+* Íê³ÉÈÕÆÚ£º 2010-11-06
+*
+* Ð޸ļǼ1£º
+* ÐÞ¸ÄÄÚÈÝ£º³õʼ°æ±¾
+
+
+*  	ECµ¥ºÅ:EC616000235556  ¿ª·¢¹ÊÕÏ
+*   ¹ÊÕÏÖ÷Ìâ:¿ª»ú¸üÐÂʧ°ÜºóÁ¢¼´ÖØÆô£¬ÖØÆôºóÈÔÏÔʾ¸üÐÂʧ°ÜÎÊÌâ / Ôö¼Ówebui fota´¦Àílog
+*   ÐÞ¸Äʱ¼ä:20140715
+************************************************************************/
+#include <sys/time.h>
+#include <sys/types.h>
+#include <string.h>
+#include <pthread.h>
+#include <dirent.h>
+#include <stdlib.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+
+#include <openssl/aes.h>
+#include <curl/curl.h>
+#include <ctype.h>
+
+#include "zte_web_interface.h"
+#include "zte_web_get_fw_para.h"
+#include "zte_web_mgmt_wifi.h"
+#include "fota_common.h"
+#include "nv_api.h"
+#include "libkey.h"
+
+/****************************************************************************
+* È«¾Ö±äÁ¿¶¨ÒåÇø
+****************************************************************************/
+/* password check result*/
+typedef enum _psw_check_result_type_t {
+	PSW_EMPTY = 0,
+	PSW_OK = 1,
+	PSW_TOO_LONG = 2,
+	PSW_TIME_OUT = 3,
+	PSW_OTHER = 4
+} psw_check_result_type_t;
+
+typedef enum {
+	PIN_MANAGE_DISABLE = 0,
+	PIN_MANAGE_ENABLE,
+	PIN_MANAGE_MODIFY
+} emPIN_MANAGE_ACTION;
+
+typedef struct UNLOCK_PARA {
+	char    unlock_code[20];
+} UNLOCK_PARA_ST;
+
+//quick setting
+typedef void (*funcWPType)(webs_t);
+
+pthread_mutex_t g_login_timemark_mutex = PTHREAD_MUTEX_INITIALIZER;
+#define TIME_SEM_KEY_1 0x0A2B
+#define TIME_SEM_KEY_2  0x3A4B
+
+//bsim
+typedef struct
+{
+	unsigned int pubKeyRsaE[32];
+	unsigned int pubKeyRsaN[32];
+	unsigned int secureFlag;
+	unsigned int pubKeyHash[4];
+	unsigned int secureDevId[3];
+}T_ZDrvEfuse_Secure;
+
+#define EFUSE_IOC_MAGIC 	'E'
+#define EFUSE_GET_DATA 		_IOWR(EFUSE_IOC_MAGIC, 1, char *)
+#define PPPOE_CODE_LEN 		32 //webui limit 30
+
+static unsigned char web_aes_key[16] = {0};
+
+#define APNCONFIG_NUM_MAX 10
+//bsim end
+
+/****************************************************************************
+* staticº¯ÊýÉùÃ÷Çø
+****************************************************************************/
+void deal_quick_setup_apn_ex(webs_t wp);
+void deal_quick_setup_wifi_basic(webs_t wp);
+void deal_quick_setup_wifi_security(webs_t wp);
+int zte_mgmt_handle_account(webs_t wp);
+void zte_setLastLoginTime();
+int zte_checkLoginTime();
+void zte_reduct_login_times();
+psw_check_result_type_t zte_password_check(webs_t wp, char* psw);
+static void wait_verify(char *wait_name, char *wait_value);
+static void zte_mgmt_enable_pin(webs_t wp, char_t *old_pin);
+static void zte_mgmt_modify_pin(webs_t wp, char_t *old_pin, char_t *new_pin);
+void deal_quick_setup_wifi_basic(webs_t wp);
+void deal_quick_setup_wifi_security(webs_t wp);
+static void deal_quick_setup_wps(webs_t wp);
+static char *split_str_by_sep(char *src, char *sep, char *dst, int len);
+static void set_apn_to_cfg(APN_PROFILE *apn_profile, IPV6_APN_PROFILE *ipv6_apn_profile);
+#ifdef WEBS_SECURITY
+static void js_aes_wifi_encode(void);
+#endif
+
+/* ¿ìËÙÉèÖà */
+const funcWPType G_ZQUICK_SET[MAX_QUICK_SET_NUM] = {
+	deal_quick_setup_apn_ex,
+	deal_quick_setup_wifi_basic,
+	deal_quick_setup_wifi_security,
+	zte_mgmt_handle_account,
+	quick_dhcp_set
+};
+
+/******************************************************
+* Function: void zte_mgmt_login(webs_t wp)
+* Description:  deal with the login goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_mgmt_login(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User login!\n"));
+	char_t *psw = NULL;
+	char_t *user = NULL;
+	char_t  *save_flag = NULL;
+	char_t *ip_address = NULL;
+
+	int  user_name_len = 0;
+	char_t *pUser = NULL;
+	char user_name[CONFIG_DEFAULT_LENGTH] = {0};
+	int zte_password_len = 0;
+	char_t *zte_password = NULL;
+	char zte_psw_admin[CONFIG_DEFAULT_LENGTH] = {0};
+	psw_check_result_type_t psw_cheak_result = PSW_EMPTY;
+	char  buf[CONFIG_DEFAULT_LENGTH] = {0};
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[login] zte_mgmt_login  enter====\n");
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR,"[login] zte_mgmt_login: wp is null.");/*lint !e26*/
+		zte_write_result_to_web(wp, LOGIN_FAIL);
+		return;
+	}
+
+	psw = websGetVar(wp, T("password"), T(""));
+	user = websGetVar(wp, T("username"), NULL);
+
+	if ('\0' == (*psw)) {
+		slog(MISC_PRINT, SLOG_ERR,"[login] zte_mgmt_login: psw is empty.");/*lint !e26*/
+		zte_write_result_to_web(wp, LOGIN_FAIL);
+		return;
+	}
+
+	if (user != NULL) {
+		slog(MISC_PRINT, SLOG_DEBUG," zte_mgmt_login  user = %s\n", user);
+		pUser = (char *)zte_base64_decode((const unsigned char *)user, strlen(user), (unsigned int*)&user_name_len);
+		if (NULL == pUser) {
+			zte_write_result_to_web(wp, LOGIN_FAIL);
+			return;
+		}
+
+		//strncpy(user_name, pUser, user_name_len);
+		if(user_name_len < sizeof(user_name))
+			snprintf(user_name,user_name_len+1,"%s",pUser);
+		else
+			snprintf(user_name,sizeof(user_name),"%s",pUser);
+		free(pUser);
+
+		slog(MISC_PRINT, SLOG_DEBUG," zte_mgmt_login  user_name = %s\n", user_name);
+		cfg_get_item("admin_user", buf, sizeof(buf));
+		if (0 != strcmp(user_name, buf)) {
+			slog(MISC_PRINT, SLOG_ERR," zte_mgmt_login user_name fail \n");
+			zte_write_result_to_web(wp, LOGIN_USER_NAME_NOT_EXSIT);
+			return;
+		}
+		slog(MISC_PRINT, SLOG_DEBUG," zte_mgmt_login uername correct \n");
+	}
+	slog(MISC_PRINT, SLOG_DEBUG,"[login] login1 -> zte_password_encode:%s.\n", psw); /*lint !e26*/
+#ifdef WEBS_SECURITY
+	zte_password = js_aes_decode(psw, strlen(psw), (unsigned int*)&zte_password_len);
+#else
+	zte_password = (char *)zte_base64_decode((const unsigned char *)psw, strlen(psw), (unsigned int*)&zte_password_len);
+#endif
+	slog(MISC_PRINT, SLOG_DEBUG,"[login] login2 -> zte_password:%s.\n", zte_password); /*lint !e26*/
+
+	if (NULL == zte_password) {
+		slog(MISC_PRINT, SLOG_ERR,"[login] zte_mgmt_login: psw is empty.\n");/*lint !e26*/
+		zte_write_result_to_web(wp, LOGIN_FAIL);
+		return;
+	}
+	//zte_password will long than zte_password_len, then strncpy zte_password_len data to zte_psw_admin
+	if(zte_password_len < sizeof(zte_psw_admin))
+		snprintf(zte_psw_admin,zte_password_len+1,"%s",zte_password);
+	else
+		snprintf(zte_psw_admin,sizeof(zte_psw_admin),"%s",zte_password);
+	//strncpy(zte_psw_admin, zte_password, zte_password_len);
+	free(zte_password);
+	slog(MISC_PRINT, SLOG_DEBUG,"[login] login3 -> zte_psw_admin:%s.\n", zte_psw_admin); /*lint !e26*/
+	psw_cheak_result = zte_password_check(wp, zte_psw_admin);
+
+	if (psw_cheak_result != PSW_OK) {
+		slog(MISC_PRINT, SLOG_ERR,"[login] zte_mgmt_login psw_cheak_result != PSW_OK\n");
+		zte_write_result_to_web(wp, LOGIN_FAIL);
+		return;
+	}
+
+	//get request ip addr
+	ip_address = websGetRequestIpaddr(wp);
+#if 0 // kw 3	
+	if (NULL == ip_address) {
+		slog(MISC_PRINT, SLOG_ERR,"[login] zte_mgmt_login: ip_address is null.\n");/*lint !e26*/
+		zte_write_result_to_web(wp, LOGIN_FAIL);
+		return;
+	}
+#endif
+	//memset(&buf, 0, sizeof(buf));
+	//cfg_get_item("admin_Password", buf, sizeof(buf));
+	//if (0 == strcmp(zte_psw_admin, buf)) {
+	if (0 == web_check_pwd(zte_psw_admin)) {
+		save_flag = websGetVar(wp, T("save_login"), T(""));
+		if (('\0' != (*save_flag)) && (IFSTREQUAL("1", save_flag))) {
+			cfg_set("psw_save", zte_psw_admin);
+		}
+	} else {
+		zte_reduct_login_times();
+		slog(MISC_PRINT, SLOG_ERR,"[login] zte_mgmt_login: error pass.");/*lint !e26*/
+		zte_write_result_to_web(wp, LOGIN_BAD_PASSWORD);
+		security_log(MODULE_ID_WEB_CGI,"web login err pwd ip=%s",ip_address);
+		return;
+	}
+
+	if (zte_mgmt_login_timemark_set()) {
+		char id[COOKIE_SESSION_SIZE+1] = {0};
+		int ret = web_make_salt_base64(id, sizeof(id));
+		if(ret == 0)
+		{
+			slog(MISC_PRINT, SLOG_ERR,"[login] web_get_cookie_id fail\n");
+			zte_write_result_to_web(wp, LOGIN_FAIL);
+			return;
+		}
+		(void)zte_web_write(NV_USER_IP_ADDR, ip_address);
+		(void)zte_web_write(NV_LOGINFO, "ok");
+		(void)zte_web_write("save_login", save_flag);
+		(void)zte_web_write("psw_fail_num_str", LOGIN_FAIL_TIMES);
+		(void)zte_web_write(NV_COOKIE_ID, id);
+#ifdef WEBS_SECURITY
+		js_aes_wifi_encode();
+#endif
+		//zte_write_result_to_web(wp, LOGIN_SUCCESS);
+		websWrite(wp, T("HTTP/1.1 200 OK\n"));
+		websWrite(wp, T("Server: %s\r\n"), WEBS_NAME);
+#ifdef WEBINSPECT_FIX
+		websWrite(wp, T("X-Frame-Options: SAMEORIGIN\n"));
+#endif	
+		websWrite(wp, T("Pragma: no-cache\n"));
+		websWrite(wp, T("Cache-control: no-cache\n"));
+		websWrite(wp, T("Content-Type: text/html\n"));
+#ifdef WEBS_SECURITY
+		websWrite(wp, T("Expires: 0\n"));
+		if (websSSLIsOpen())
+			websWrite(wp, T("Set-Cookie: id=%s; secure; HttpOnly; SameSite=Lax;\n"),id);
+		else
+			websWrite(wp, T("Set-Cookie: id=%s; HttpOnly; SameSite=Lax;\n"),id);
+#endif		
+		websWrite(wp, T("\n"));
+		if (wp->flags & WEBS_XML_CLIENT_REQUEST) {
+			zte_rest_result_write(wp, LOGIN_SUCCESS);
+		} else {
+			websWrite(wp, T("{\"result\":\"%s\"}"), LOGIN_SUCCESS);
+		}
+		security_log(MODULE_ID_WEB_CGI,"web login suc ip=%s",ip_address);
+		return;
+	} else {
+		slog(MISC_PRINT, SLOG_ERR,"[login] zte_mgmt_login_timemark_set fail\n");
+		zte_write_result_to_web(wp, LOGIN_FAIL);
+		return;
+	}
+}
+/******************************************************
+* Function: int zte_mgmt_login_timemark_set()
+* Description:  save the setting operate time
+* Input:
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+*******************************************************/
+int zte_mgmt_login_timemark_set()
+{
+	char_t login_timemark[NV_ITEM_STRING_LEN_64] = {0};
+	long timemark = 0;
+	int sem_id = -1;
+
+	int rc = TRUE;
+
+	sem_id = get_sem(TIME_SEM_KEY_2);
+	if (sem_id != -1) {
+		sem_p(sem_id);
+	}
+
+	timemark = time(0);
+	sprintf(login_timemark, "%ld", timemark);
+	if(ZTE_NVIO_DONE != zte_web_write(NV_USER_LOGIN_TIMEMARK, login_timemark))
+	{
+	    rc = FALSE; // kw 3
+	}
+
+	if (sem_id != -1) {
+		sem_v(sem_id);
+	}
+
+	return rc;
+}
+void zte_mgmt_login_timeout_check()
+{
+	char_t user_login_timemark[NV_ITEM_STRING_LEN_64] = {0};
+	char_t login_info[NV_ITEM_STRING_LEN_20] = {0};
+
+	long time_now = 0;
+	int sem_id = -1;
+	long luser_login_timemark = 0;
+
+	zte_web_read(NV_LOGINFO, login_info);
+
+	if (0 == strcmp(login_info, "ok")) {
+		zte_web_read(NV_USER_LOGIN_TIMEMARK, user_login_timemark);
+		luser_login_timemark =  atol(user_login_timemark);
+		if(luser_login_timemark < 0 || luser_login_timemark > LONG_MAX-1){
+            luser_login_timemark = LONG_MAX;
+			slog(MISC_PRINT, SLOG_DEBUG, "zte_mgmt_login_timemark_check: user_login_timemark is out of range [0, LONG_MAX).");
+		}
+
+		sem_id = get_sem(TIME_SEM_KEY_2);
+		if (sem_id != -1) {
+			sem_p(sem_id);
+		}
+		//timemark_check = time(0) - luser_login_timemark;
+		time_now = time(0);
+		if (sem_id != -1) {
+			sem_v(sem_id);
+		}
+
+		if ((time_now - luser_login_timemark) > LOGIN_TIMEOUT) {
+			slog(MISC_PRINT, SLOG_DEBUG, "zte_mgmt_login_timemark_check: the login is timeout .");
+			(void)zte_web_write(NV_USER_IP_ADDR, "");
+			(void)zte_web_write(NV_LOGINFO, "timeout");
+			(void)zte_web_write(NV_COOKIE_ID, "");
+			(void)zte_web_write(NV_WEB_TOKEN, "");
+			(void)zte_web_write(NV_USER_LOGIN_TIMEMARK, "0");
+			security_log(MODULE_ID_WEB_CGI,"web logout timeout");
+			return;
+		}
+#ifdef WEBS_SECURITY
+		static long time_update_token = 0;
+		if ((time_now - time_update_token) > COOKIE_TOKEN_TIMEOUT) {
+			time_update_token = time_now;
+			(void)zte_web_write(NV_WEB_TOKEN, "");
+		}
+#endif		
+	}
+
+}
+/******************************************************
+* Function: void zte_mgmt_logout(webs_t wp)
+* Description:  deal with the logout goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_mgmt_logout(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User logout!\n"));
+
+	if (NULL == wp) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	cfg_set(NV_USER_IP_ADDR, "");
+	cfg_set(NV_LOGINFO, "");
+	cfg_set(NV_COOKIE_ID, "");
+	cfg_set(NV_WEB_TOKEN, "");
+	zte_write_result_to_web(wp, SUCCESS);
+	security_log(MODULE_ID_WEB_CGI,"web logout");
+}
+
+/******************************************************
+* Function: void zte_mgmt_set_language(webs_t wp)
+* Description:  deal with the set language goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt              create
+*2012/09/14                  liuyingnan     modification
+*******************************************************/
+void zte_mgmt_set_language(webs_t wp)
+{
+	char_t* language = websGetVar(wp, T("Language"), T("en"));
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User set language!\n"));
+
+	cfg_set(NV_LANGUAGE, language);
+
+	//cfg_save();
+	if ('\0' == (*language)) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_mgmt_set_language: web para:[language] is empty string.\n"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+
+	zte_write_result_to_web(wp, SUCCESS);
+	return;
+
+
+}
+
+
+/******************************************************
+* Function: void zte_mgmt_set_devicemode(webs_t wp)
+* Description:  user/develop mode switch
+* Input:  HTTP page info(debug_enable = 1 develop mode)
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* Feb 27, 2014    V1.0      jhy              create
+*******************************************************/
+void zte_mgmt_set_devicemode(webs_t wp)
+{
+	char_t* debug_enable = websGetVar(wp, T("debug_enable"), T(""));
+	char_t* auth = websGetVar(wp, T("auth"), T(""));
+
+	char strCfgGetItem[16] = {0};
+	nv_get_item(NV_RO, "usb_modetype", strCfgGetItem, sizeof(strCfgGetItem));
+
+	slog(MISC_PRINT, SLOG_NORMAL,"[goahead]debug_enable->%s current->%s\n", debug_enable, strCfgGetItem);
+	if((strcmp(strCfgGetItem,"user")== 0)&&(atoi(debug_enable) != 0))
+	{
+/*	 	if(verify_device_key(auth,strlen(auth),SEED,strlen(SEED)) != 1)
+	    {
+			slog(MISC_PRINT, SLOG_ERR, "zte_mgmt_set_devicemode: auth %s fail.\n",auth);
+			zte_write_result_to_web(wp, "set_devicemode fail:auth fail!");
+			return;
+	    }*/
+	}
+
+	if ('\0' == (*debug_enable)) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_mgmt_set_devicemode: web para:[debug_enable] is empty string.\n");
+		zte_write_result_to_web(wp, "set_devicemode fail:parameter debug_enable is empty!");
+		return;
+	}
+
+	if (atoi(debug_enable) < 0 || atoi(debug_enable) > 3) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_mgmt_set_devicemode: web para:[debug_enable] is illegal string.\n"); 
+		zte_write_result_to_web(wp, "set_devicemode fail:parameter debug_enable is illegal!");
+		return;
+	}
+    char ss[20] = {0};
+    unsigned char bootmode[] = {0x54,0x4D};
+	switch (atoi(debug_enable)) {
+	case 0:
+		slog(MISC_PRINT, SLOG_NORMAL,"[goahead]debug_enable->user\n");
+		nv_set_item(NV_RO, "usb_modetype", "user", 1);
+		bootmode[1] =0x00;
+		amt_set_bootmode(bootmode);
+		break;
+	case 1:
+		slog(MISC_PRINT, SLOG_NORMAL,"[goahead]debug_enable->debug\n");
+		nv_set_item(NV_RO, "usb_modetype", "debug", 1);
+		bootmode[1] =0x01;
+		amt_set_bootmode(bootmode);
+		break;
+	case 2:
+		slog(MISC_PRINT, SLOG_NORMAL,"[goahead]debug_enable->factory\n");
+		nv_set_item(NV_RO, "usb_modetype", "factory", 1);
+		bootmode[1] =0x02;
+		amt_set_bootmode(bootmode);
+		break;
+	case 3:
+		slog(MISC_PRINT, SLOG_NORMAL,"[goahead]debug_enable->amt\n");
+		//nv_set_item(NV_RO, "usb_modetype", "amt", 1);
+		amt_set_bootmode(bootmode);
+		break;
+	default:
+		slog(MISC_PRINT, SLOG_NORMAL,"[goahead]error!\n");
+		zte_write_result_to_web(wp, "set_devicemode fail:parameter debug_enable is illegal!");
+		return;;
+	}
+	nv_commit(NV_RO);////default_parameter_roÖеÄNV±£´æ±ØÐëÓÃnv_commit²»ÄÜÓÃcfg_save
+	zte_write_result_to_web(wp, "set_devicemode successfully!");
+
+}
+
+/******************************************************
+* Function: void zte_mgmt_restore(webs_t wp)
+* Description:  deal with the restore goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_mgmt_restore(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL,"webui reset send message to blc\n");
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_RESET_REQUEST, 0, NULL, 0);
+	system("sleep 2");//WH:delete?
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+
+/******************************************************
+* Function: void zte_mgmt_poweroff(webs_t wp)
+* Description:  deal with the poweroff goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2015/5/26      V1.0      lsl            create
+*******************************************************/
+void zte_mgmt_poweroff(webs_t wp)
+{
+	zte_write_result_to_web(wp, SUCCESS);
+	slog(MISC_PRINT, SLOG_NORMAL,"webui poweroff send message to blc\n");
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_POWEROFF_REQUEST, 0, NULL, 0);
+}
+
+/******************************************************
+* Function: void zte_mgmt_control_power_on_speed(webs_t wp)
+* Description:  deal with the power_on_speed goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2015/5/26      V1.0      lsl            create
+*******************************************************/
+void zte_mgmt_control_power_on_speed(webs_t wp)
+{
+	char_t* mgmt_quicken_power_on = websGetVar(wp, T("mgmt_quicken_power_on"), T(""));
+
+	if ('\0' == (*mgmt_quicken_power_on)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	} else if (strcmp(mgmt_quicken_power_on, "0") != 0 && strcmp(mgmt_quicken_power_on, "1") != 0) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	cfg_set("mgmt_quicken_power_on", mgmt_quicken_power_on);
+	cfg_save();
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/******************************************************
+* Function: void zte_goform_mgmt_reboot_process(webs_t wp)
+* Description:  deal with the restore goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_goform_mgmt_reboot_process(webs_t wp)
+{
+	MSG_BUF stMsg         = {0};
+	SINT32        iMsgSize      = sizeof(MSG_BUF) - sizeof(SINT32);
+	char buf[NV_ITEM_STRING_LEN_20] = {0};
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User reboot!\n"));
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL, 0);
+}
+
+
+void zte_goform_mgmt_syslog_process(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_goform_mgmt_syslog_process coming\n"); /*lint !e26*/
+	char_t *syslog_mode = NULL;
+	/* get value from web page */
+	syslog_mode = websGetVar(wp, T("syslog_mode"), T("all"));
+
+	char_t *syslog_flag = NULL;
+	/* get value from web page */
+	syslog_flag = websGetVar(wp, T("syslog_flag"), T("close"));
+
+	if (strcmp(syslog_flag, "close") == 0) {
+		cfg_set("debug_level", "0");
+		zte_write_result_to_web(wp, SUCCESS);
+	} else if (strcmp(syslog_flag, "delete") == 0) {
+		slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User delete syslog!\n"));
+		slog(MISC_PRINT, SLOG_DEBUG, "delete syslog====\n"); /*lint !e26*/
+		//system("cat /dev/null > /var/log/webshow_messages");
+		system("cat /dev/null > /usr/netlog/misc.log");
+		system("cat /dev/null > /etc_ro/web/webshow_messages");
+
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		//cfg_set("debug_level","7");/*added by jhy */
+		if (0 == strcmp("ufi", syslog_mode)) {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("mkdir -p /etc_ro/web");
+			system("log.sh UFI");
+			cfg_set("syslog_mode", "ufi");
+		}/*added by jhy */
+		else if (0 == strcmp("wan_connect", syslog_mode)) {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("log.sh wan_connect info");
+			cfg_set("syslog_mode", "wan_connect");
+		} else if (0 == strcmp("voip", syslog_mode)) {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("log.sh voip info");
+			cfg_set("syslog_mode", "voip");
+		} else if (0 == strcmp("sms", syslog_mode)) {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("log.sh sms info");
+			cfg_set("syslog_mode", "sms");
+		} else if (0 == strcmp("tr069", syslog_mode)) {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("log.sh tr069 info");
+			cfg_set("syslog_mode", "tr069");
+		} else if (0 == strcmp("dlna", syslog_mode)) {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("log.sh dlna info");
+			cfg_set("syslog_mode", "dlna");
+		} else if (0 == strcmp("wlan", syslog_mode)) {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("log.sh wlan info");
+			cfg_set("syslog_mode", "wlan");
+		} else if (0 == strcmp("router", syslog_mode)) {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("log.sh router info");
+			cfg_set("syslog_mode", "router");
+		} else {
+			slog(MISC_PRINT, SLOG_DEBUG, "syslog_mode=====%s\n", syslog_mode); /*lint !e26*/
+			system("log.sh all info");
+			cfg_set("syslog_mode", "all");
+		}
+
+		zte_write_result_to_web(wp, SUCCESS);
+	}
+
+}
+
+
+/******************************************************
+* Function: void zte_mgmt_change_password(webs_t wp)
+* Description:  deal with the user account modify goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_mgmt_change_password(webs_t wp)
+{
+	char_t *old_pass = NULL;
+	char_t *new_pass = NULL;
+	char_t *current_psw = NULL;
+	char_t *new_psw = NULL;
+	int current_psw_len = 0;
+	int new_psw_len = 0;
+	char new_psw_admin[CONFIG_DEFAULT_LENGTH] = {0};
+	char old_psw_admin[CONFIG_DEFAULT_LENGTH] = {0};
+	//char admin_psw_buf[CONFIG_DEFAULT_LENGTH] = {0};
+
+	old_pass = websGetVar(wp, T("oldPassword"), T(""));
+	new_pass = websGetVar(wp, T("newPassword"), T(""));
+
+	if (0 == strlen(old_pass) || 0 == strlen(new_pass)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	slog(MISC_PRINT, SLOG_DEBUG, "user_modify:new_psw_encode:%s\n", new_pass); /*lint !e26*/
+#ifdef WEBS_SECURITY
+	current_psw = js_aes_decode(old_pass, strlen(old_pass), (unsigned int *)&current_psw_len);
+	new_psw = js_aes_decode(new_pass, strlen(new_pass), (unsigned int *)&new_psw_len);
+#else
+	current_psw = (char*)zte_base64_decode((const unsigned char *)old_pass, strlen(old_pass), (unsigned int *)&current_psw_len);
+	new_psw = (char*)zte_base64_decode((const unsigned char *)new_pass, strlen(new_pass), (unsigned int *)&new_psw_len);
+#endif
+
+	if (NULL == current_psw || NULL == new_psw) {
+		slog(MISC_PRINT, SLOG_ERR, "current_psw or new_psw is NULL\n"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		free(current_psw);
+		free(new_psw);
+		return;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "user_modify:new_psw:%s\n", new_psw); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "user_modify:new_psw_len:%d\n", new_psw_len); /*lint !e26*/
+	if(current_psw_len < sizeof(old_psw_admin))
+		snprintf(old_psw_admin,current_psw_len+1,"%s",current_psw);
+	else
+		snprintf(old_psw_admin,sizeof(old_psw_admin),"%s",current_psw);
+	//strncpy(old_psw_admin, current_psw, CONFIG_DEFAULT_LENGTH-1);
+	if(new_psw_len < sizeof(new_psw_admin))
+		snprintf(new_psw_admin,new_psw_len+1,"%s",new_psw);
+	else
+		snprintf(new_psw_admin,sizeof(new_psw_admin),"%s",new_psw);
+	//strncpy(new_psw_admin, new_psw, CONFIG_DEFAULT_LENGTH-1);
+	free(current_psw);
+	free(new_psw);
+	slog(MISC_PRINT, SLOG_DEBUG, "user_modify:new_psw_admin:%s\n", new_psw_admin); /*lint !e26*/
+
+	if (LOGIN_PSW_MIN_LEN > new_psw_len || LOGIN_PSW_MAX_LEN < new_psw_len) {
+		slog(MISC_PRINT, SLOG_ERR, "new_psw_len is too long\n"); /*lint !e26*/
+		cfg_set("data_safe", "failed");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	if (DATA_NO_SAFE == zte_Safe_noSpecialChar(old_psw_admin)
+	    || DATA_NO_SAFE == zte_Safe_noSpecialChar(new_psw_admin)) {
+		slog(MISC_PRINT, SLOG_ERR, "Get Data is no Safe:old_pass:%s,new_pass:%s\n", old_psw_admin, new_psw_admin); /*lint !e26*/
+		cfg_set("data_safe", "failed");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	//cfg_get_item("admin_Password", admin_psw_buf, sizeof(admin_psw_buf));
+	//if (0 != strcmp(old_psw_admin, admin_psw_buf)) {
+	if (0 != web_check_pwd(old_psw_admin)) {
+#ifdef WEBS_SECURITY
+		cfg_set(NV_USER_IP_ADDR, "");
+		cfg_set(NV_LOGINFO, "");
+		cfg_set(NV_COOKIE_ID, "");
+		cfg_set(NV_WEB_TOKEN, "");
+		security_log(MODULE_ID_WEB_CGI,"web changepwd fail logout");
+#endif		
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User change passwd!\n"));
+
+	//cfg_set("admin_Password", new_psw_admin);
+	web_set_pwd(new_psw_admin);
+	//cfg_set("user_save", "");
+	cfg_set("psw_save", "");
+	cfg_set("save_login", "");
+	cfg_set("psw_changed", "1");/*³õʼÃÜÂëÐ޸ıêʶ*/
+/*
+	char cmd[82] = {0};
+	sprintf(cmd, "mksmbpasswd.sh \'%s\'", new_psw_admin);
+	system(cmd);
+	system("killall smbd");
+	system("killall nmbd");
+	system("smbd -D");
+	system("nmbd -D");
+*/	
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+int zte_mgmt_check_password(webs_t wp)
+{
+	char_t *tmp_old_psw = NULL;
+	char_t *old_psw = NULL;
+	int old_psw_len = 0;
+	char old_psw_admin[CONFIG_DEFAULT_LENGTH] = {0};
+	//char admin_psw_buf[CONFIG_DEFAULT_LENGTH] = {0};
+
+	tmp_old_psw = websGetVar(wp, T("oldPassword"), NULL);
+	if (NULL != tmp_old_psw) {
+		old_psw = (char*)zte_base64_decode((const unsigned char *)tmp_old_psw, strlen(tmp_old_psw), (unsigned int *)&old_psw_len);
+		if (NULL == old_psw) {
+			slog(MISC_PRINT, SLOG_DEBUG, "current_psw or new_psw is NULL\n"); /*lint !e26*/
+			return -1;
+		}
+		slog(MISC_PRINT, SLOG_NORMAL,"zte_mgmt_check_password  old_psw:%s!\n", old_psw);
+		if(old_psw_len < sizeof(old_psw_admin))
+			snprintf(old_psw_admin,old_psw_len+1,"%s",old_psw);
+		else
+			snprintf(old_psw_admin,sizeof(old_psw_admin),"%s",old_psw);
+		//strncpy(old_psw_admin, old_psw, CONFIG_DEFAULT_LENGTH-1);
+		free(old_psw);
+
+		if (DATA_NO_SAFE == zte_Safe_noSpecialChar(old_psw_admin)) {
+			slog(MISC_PRINT, SLOG_ERR,"zte_mgmt_check_password  old_psw_admin Get Data is no Safe!\n");
+			cfg_set("data_safe", "failed");
+			return -1;
+		}
+
+		//cfg_get_item("admin_Password", admin_psw_buf, sizeof(admin_psw_buf));
+		//if (0 != strcmp(old_psw_admin, admin_psw_buf)) {
+		if (0 != web_check_pwd(old_psw_admin)) {
+#ifdef WEBS_SECURITY
+			cfg_set(NV_USER_IP_ADDR, "");
+			cfg_set(NV_LOGINFO, "");
+			cfg_set(NV_COOKIE_ID, "");
+			cfg_set(NV_WEB_TOKEN, "");
+			security_log(MODULE_ID_WEB_CGI,"web checkpwd fail logout");
+#endif			
+			slog(MISC_PRINT, SLOG_ERR,"zte_mgmt_check_password  admin_Password fail!\n");
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
+int zte_mgmt_handle_account(webs_t wp)
+{
+	char_t *tmp_new_user = NULL;
+	char_t *tmp_new_psw = NULL;
+	char_t *new_user = NULL;
+	char_t *new_psw = NULL;
+	int new_psw_len = 0;
+	int new_user_len = 0;
+	char new_user_admin[CONFIG_DEFAULT_LENGTH] = {0};
+	char new_psw_admin[CONFIG_DEFAULT_LENGTH] = {0};
+
+	tmp_new_psw = websGetVar(wp, T("newPassword"), NULL);
+	tmp_new_user = websGetVar(wp, T("newUserName"), NULL);
+
+	if (NULL == tmp_new_psw || NULL == tmp_new_user) {
+		return -1;
+	}
+
+	new_psw = (char*)zte_base64_decode((const unsigned char *)tmp_new_psw, strlen(tmp_new_psw), (unsigned int *)&new_psw_len);
+	if (NULL == new_psw) {
+		slog(MISC_PRINT, SLOG_ERR, "new_psw is NULL\n"); /*lint !e26*/
+		return -1;
+	}
+	new_user = (char*)zte_base64_decode((const unsigned char *)tmp_new_user, strlen(tmp_new_user), (unsigned int *)&new_user_len);
+
+	if (NULL == new_user) {
+		free(new_psw);
+		slog(MISC_PRINT, SLOG_ERR, "new_user is NULL\n"); /*lint !e26*/
+		return -1;
+	}
+
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_mgmt_handle_account  new_psw:%s!\n", new_psw);
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_mgmt_handle_account  new_user:%s!\n", new_user);
+	if(new_psw_len < sizeof(new_psw_admin))
+		snprintf(new_psw_admin,new_psw_len+1,"%s",new_psw);
+	else
+		snprintf(new_psw_admin,sizeof(new_psw_admin),"%s",new_psw);
+	//strncpy(new_psw_admin, new_psw, CONFIG_DEFAULT_LENGTH-1);
+	if(new_user_len < sizeof(new_user_admin))
+		snprintf(new_user_admin,new_user_len+1,"%s",new_psw);
+	else
+		snprintf(new_user_admin,sizeof(new_user_admin),"%s",new_psw);
+	//strncpy(new_user_admin, new_user, CONFIG_DEFAULT_LENGTH-1);
+	free(new_psw);
+	free(new_user);
+
+	if (LOGIN_PSW_MIN_LEN > new_psw_len || LOGIN_PSW_MAX_LEN < new_psw_len) {
+		slog(MISC_PRINT, SLOG_ERR,"zte_mgmt_handle_account  new_psw_len is too long!\n");
+		cfg_set("data_safe", "failed");
+		return -1;
+	}
+
+	if (LOGIN_PSW_MIN_LEN > new_user_len || LOGIN_PSW_MAX_LEN < new_user_len) {
+		slog(MISC_PRINT, SLOG_ERR,"zte_mgmt_handle_account  new_user_len is too long!\n");
+		cfg_set("data_safe", "failed");
+		return -1;
+	}
+
+	if (DATA_NO_SAFE == zte_Safe_noSpecialChar(new_psw_admin)
+	    || DATA_NO_SAFE == zte_Safe_noSpecialChar(new_user_admin)) {
+		slog(MISC_PRINT, SLOG_ERR,"zte_mgmt_handle_account  Get Data is no Safe!\n");
+		cfg_set("data_safe", "failed");
+		return -1;
+	}
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User change account!\n"));
+
+	cfg_set("admin_user", new_user_admin);
+	//cfg_set("admin_Password", new_psw_admin);
+	web_set_pwd(new_psw_admin);
+	//cfg_set("user_save", "");
+	cfg_set("psw_save", "");
+	cfg_set("save_login", "");
+	//cfg_save();
+/*
+	char cmd[82] = {0};
+	sprintf(cmd, "mksmbpasswd.sh \'%s\'", new_psw_admin);
+	system(cmd);
+	system("killall smbd");
+	system("killall nmbd");
+	system("smbd -D");
+	system("nmbd -D");
+*/	
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_mgmt_handle_account  success!\n");
+	return 0;
+}
+
+void zte_mgmt_change_account(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL,"zte_mgmt_change_account ====================!\n");
+
+	if (0 != zte_mgmt_check_password(wp)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (0 != zte_mgmt_handle_account(wp)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+
+/******************************************************
+* Function: void zte_mgmt_pin_input(webs_t wp)
+* Description:  deal with the pin code input goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_mgmt_pin_input(webs_t wp)
+{
+	char                *pPinCode   = NULL;
+	UINT32              length      = 0;
+	T_zAt_CpinPukSet    para        = {0};
+	UINT32              ret         = 0;
+	char                modem_main_state[NV_ITEM_STRING_LEN_50] = {0};
+
+	pPinCode    = websGetVar(wp, T("PinNumber"), T(""));
+	length      = strlen(pPinCode);
+	if (0 == length || length >= sizeof(para.pin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	strncpy(para.pin, pPinCode,sizeof(para.pin)-1);
+	cfg_set(NV_PIN_PUK_PROCESS, "begin");
+	ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_VERIFY_PIN_REQ, sizeof(T_zAt_CpinPukSet), (UCHAR *)&para, 0);
+	if (0 != ret) {
+		cfg_set(NV_PIN_PUK_PROCESS, "");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	wait_verify(NV_PIN_PUK_PROCESS, "end");
+
+	(void)sleep(1);
+	(void)zte_web_read(NV_MODEM_MAIN_STATE, modem_main_state);
+
+	if (0 != strcmp(modem_main_state, "modem_waitpin")) {
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		zte_write_result_to_web(wp, FAILURE);
+	}
+}
+/******************************************************
+* Function: void zte_mgmt_puk_input(webs_t wp)
+* Description:  deal with the puk code input goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_mgmt_puk_input(webs_t wp)
+{
+	char                *pPukCode   = NULL;
+	char                *pNewPin    = NULL;
+	int                 length      = 0;
+	int                 ret         = 0;
+	T_zAt_CpinPukSet    para        = {0};
+	CHAR modem_main_state[NV_ITEM_STRING_LEN_50] = {0};
+
+	pPukCode    = websGetVar(wp, T("PUKNumber"), T(""));
+	pNewPin     = websGetVar(wp, T("PinNumber"), T(""));
+
+	length = strlen(pPukCode);
+	if (0 == length || length >= sizeof(para.pin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	length = strlen(pNewPin);
+	if (0 == length || length >= sizeof(para.newpin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	strncpy(para.pin, pPukCode,sizeof(para.pin)-1);
+	strncpy(para.newpin, pNewPin,sizeof(para.newpin)-1);
+	cfg_set(NV_PIN_PUK_PROCESS, "begin");
+	ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_VERIFY_PUK_REQ, sizeof(T_zAt_CpinPukSet), (UCHAR *)&para, 0);
+	if (0 != ret) {
+		cfg_set(NV_PIN_PUK_PROCESS, "");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	wait_verify(NV_PIN_PUK_PROCESS, "end");
+
+	(void)sleep(1);
+	(void)zte_web_read("pinset_result", modem_main_state);
+
+	if (0 != strcmp(modem_main_state, "fail")) {
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		zte_write_result_to_web(wp, FAILURE);
+	}
+}
+
+void zte_mgmt_auto_pin(webs_t wp)
+{
+	char                *pPinEable   = NULL;
+	char                *pPinCode    = NULL;
+	int                 length      = 0;
+
+	pPinEable    = websGetVar(wp, T("auto_simpin"), T(""));
+	pPinCode     = websGetVar(wp, T("auto_simpin_code"), T(""));
+
+	length = strlen(pPinCode);
+	if (0 == length || length > 8) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	length = strlen(pPinEable);
+	if (1 != length) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	cfg_set("auto_simpin", pPinEable);
+	cfg_set("auto_simpin_code", pPinCode);
+	zte_write_result_to_web(wp, SUCCESS);
+
+}
+/******************************************************
+* Function: void zte_mgmt_unlock_network(webs_t wp)
+* Description:  deal with the unlock code input goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_mgmt_unlock_network(webs_t wp)
+{
+	char *unlock_code = NULL;
+	UNLOCK_PARA_ST para;
+	int length = 0;
+	int ret = 0;
+
+	memset(&para, 0, sizeof(UNLOCK_PARA_ST));
+
+	unlock_code = websGetVar(wp, T("unlock_network_code"), T(""));
+	slog(MISC_PRINT, SLOG_DEBUG, "unlock_code=%s", unlock_code); /*lint !e26*/
+	length = strlen(unlock_code);
+	if (0 == length || length >= sizeof(para.unlock_code)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	strncpy(para.unlock_code, unlock_code,sizeof(para.unlock_code)-1);
+	ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_UNLOCK_REQ, sizeof(UNLOCK_PARA_ST), (UCHAR *)&para, 0);
+	if (0 != ret) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	wait_verify("unlock_at_wait", "0");
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+
+/*PINÂë½ûÓÃ*/
+void zte_mgmt_disable_pin(webs_t wp)
+{
+	char            *pOldPin    = NULL;
+	T_zAt_PinManage para        = {0};
+	int             length      = 0;
+	int             ret         = 0;
+	char            pin_manage_result[NV_ITEM_STRING_LEN_5] = {0};
+
+	pOldPin = websGetVar(wp, T("OldPinNumber"), T(""));
+	length = strlen(pOldPin);
+	if (0 == length || length >= sizeof(para.oldPin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	strncpy(para.oldPin, pOldPin,sizeof(para.oldPin)-1);
+	para.action = PIN_MANAGE_DISABLE;
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User disable pin!\n"));
+
+	(void)zte_web_write("pin_manage_process", "begin");
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_goform_mgmt_pin_mgmt_process send message: ZUFI_MODULE_ID_AT_MAIN, MSG_CMD_WEB_REQ_PIN_MANAGE");
+	ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_PIN_MANAGE_REQ, sizeof(T_zAt_PinManage), (UCHAR *)&para, 0);
+	if (0 != ret) {
+		cfg_set("pin_manage_process", "");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	/*ÉèÖõȴýpinÂë¹ÜÀí¶¯×÷AT´¦Àí½áÊø*/
+	wait_verify("pin_manage_process", "end");
+
+	(void)zte_web_read("pin_manage_result", pin_manage_result);
+	(void)zte_web_write("pin_manage_result", "");
+
+	if (0 == strcmp(pin_manage_result, "0")) {
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		zte_write_result_to_web(wp, FAILURE);
+	}
+}
+
+/*PINÂëÆôÓûòÐÞ¸Ä*/
+void zte_mgmt_pin_enable_or_modify(webs_t wp)
+{
+	CHAR *pOldPin = NULL;
+	CHAR *pNewPin = NULL;
+
+	if (NULL == wp) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	pOldPin = websGetVar(wp, T("OldPinNumber"), T(""));
+	pNewPin = websGetVar(wp, T("NewPinNumber"), T(""));
+
+	slog(MISC_PRINT, SLOG_DEBUG, "web para:[OldPinNumber] is [%s].", pOldPin);
+	slog(MISC_PRINT, SLOG_DEBUG, "web para:[NewPinNumber] is [%s].", pNewPin);
+
+	if ('\0' == (*pOldPin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (0 == strcmp(pNewPin, "")) {
+		zte_mgmt_enable_pin(wp, pOldPin);
+	} else {
+		zte_mgmt_modify_pin(wp, pOldPin, pNewPin);
+	}
+
+
+}
+static void zte_mgmt_enable_pin(webs_t wp, CHAR *pOldPin)
+{
+	T_zAt_PinManage para                                    = {0};
+	int             ret                                     = 0;
+	char            pin_manage_result[NV_ITEM_STRING_LEN_5] = {0};
+
+
+	if ((NULL == wp) || (NULL == pOldPin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	strncpy(para.oldPin, pOldPin,sizeof(para.oldPin)-1);
+	para.action = PIN_MANAGE_ENABLE;
+	if ('\0' == (*pOldPin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User enable pin!\n"));
+
+	(void)zte_web_write("pin_manage_process", "begin");
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_mgmt_enable_pin send message : ZUFI_MODULE_ID_AT_MAIN, MSG_CMD_WEB_REQ_PIN_MANAGE.");
+	ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_PIN_MANAGE_REQ, sizeof(T_zAt_PinManage), (UCHAR *)&para, 0);
+	if (0 != ret) {
+		cfg_set("pin_manage_process", "");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	/*ÉèÖõȴýpinÂë¹ÜÀí¶¯×÷AT´¦Àí½áÊø*/
+	wait_verify("pin_manage_process", "end");
+
+	(void)zte_web_read("pin_manage_result", pin_manage_result);
+	(void)zte_web_write("pin_manage_result", "");
+
+	if (0 == strcmp(pin_manage_result, "0")) {
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		zte_write_result_to_web(wp, FAILURE);
+	}
+}
+
+/**********************************************************************
+* Function:         zte_mgmt_modify_pin
+* Description:      to modify pin
+* Input:           wp: the web para;old_pin: old pin number; new_pin:new pin number
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2011/11/16    V1.0        chenyi       first version
+**********************************************************************/
+
+static void zte_mgmt_modify_pin(webs_t wp, CHAR *pOldPin, CHAR *pNewPin)
+{
+	int             length                                  = 0;
+	int             ret                                     = 0;
+	T_zAt_PinManage para                                    = {0};
+	char            pin_manage_result[NV_ITEM_STRING_LEN_5] = {0};
+
+	if ((NULL == wp) || (NULL == pOldPin) || (NULL == pNewPin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (('\0' == (*pOldPin)) || ('\0' == (*pNewPin))) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	length = strlen(pNewPin);
+	if (0 == length || length >= sizeof(para.newPin)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User modify pin!\n"));
+
+	para.action = PIN_MANAGE_MODIFY;
+	strncpy(para.oldPin, pOldPin,sizeof(para.oldPin)-1);
+	strncpy(para.newPin, pNewPin,sizeof(para.newPin)-1);
+	(void)zte_web_write("pin_manage_process", "begin");
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_mgmt_modify_pin send message : ZUFI_MODULE_ID_AT_MAIN, MSG_CMD_WEB_REQ_PIN_MANAGE.");
+	ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_PIN_MANAGE_REQ, sizeof(T_zAt_PinManage), (UCHAR *)&para, 0);
+	if (0 != ret) {
+		cfg_set("pin_manage_process", "");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	/*ÉèÖõȴýpinÂë¹ÜÀí¶¯×÷AT´¦Àí½áÊø*/
+	wait_verify("pin_manage_process", "end");
+
+
+	(void)zte_web_read("pin_manage_result", pin_manage_result);
+	(void)zte_web_write("pin_manage_result", "");
+
+	if (0 == strcmp(pin_manage_result, "0")) {
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		zte_write_result_to_web(wp, FAILURE);
+	}
+}
+/******************************************************
+* Function: void zte_quick_setup(webs_t wp)
+* Description:  deal with the quick setup goform
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void zte_quick_setup(webs_t wp)
+{
+	int iFunc = 0;
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User quick setup!\n"));
+
+	for (iFunc = 0; iFunc < MAX_QUICK_SET_NUM; iFunc++) {
+		if (G_ZQUICK_SET[iFunc] != NULL) {
+			G_ZQUICK_SET[iFunc](wp);
+		}
+	}
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+int save_data_to_file(char *file_path, unsigned char *data, int len)
+{
+	int file_fd = -1;
+	int ret  = -1;
+
+
+	if (NULL == file_path || NULL == data) {
+		slog(MISC_PRINT, SLOG_ERR,"Input para is invalid, null point!");
+		return -1;
+	}
+
+	// O_TRUNC:½«Îļþ³¤¶È½Ø¶ÏΪ0£¬×öΪÐÂÎļþдÈë
+	file_fd = open(file_path, O_RDWR | O_CREAT | O_TRUNC | O_SYNC, 777);
+	if (file_fd < 0) {
+		slog(MISC_PRINT, SLOG_ERR,"Open file fail, error:%s, file path:%s", strerror(errno), file_path);
+		return -1;
+	}
+
+	ret = write(file_fd, (void *)data, len);
+	if (ret != len) {
+		slog(MISC_PRINT, SLOG_ERR,"Write data to file fail, error:%s, file path:%s", strerror(errno), file_path);
+		goto error;
+	}
+
+	ret = fsync(file_fd);
+	if (ret < 0) {
+		slog(MISC_PRINT, SLOG_ERR,"Sync Failed:%s, file path:%s", strerror(errno), file_path);
+		goto error;
+	}
+
+
+	ret = 0;
+	goto end;
+
+error:
+	ret = -1;
+
+end:
+	close(file_fd);
+
+	file_fd = -1;
+
+	return ret;
+
+}
+
+void zte_goform_mgmt_schedule_setting_process(webs_t wp)
+{
+	char *schedule_enable = NULL;
+	char *schedule_hour = NULL;
+	char *schedule_minute = NULL;
+
+	schedule_enable = websGetVar(wp, T("scheduleEnabled"), T(""));
+
+	if(0 == strcmp("1", schedule_enable))
+	{
+		schedule_hour = websGetVar(wp, T("scheduleHour"), T(""));
+		schedule_minute = websGetVar(wp, T("scheduleMinute"), T(""));
+		cfg_set("schedule_restart_enable", schedule_enable);
+		cfg_set("schedule_restart_hour", schedule_hour);
+		cfg_set("schedule_restart_minute", schedule_minute);
+
+		zte_write_result_to_web(wp, SUCCESS);
+		return;
+	}
+	else if(0 == strcmp("0", schedule_enable))
+	{
+		cfg_set("schedule_restart_enable", schedule_enable);
+		cfg_set("schedule_restart_hour", "0");
+		cfg_set("schedule_restart_minute", "0");
+
+		zte_write_result_to_web(wp, SUCCESS);
+		return;
+	}
+
+	zte_write_result_to_web(wp, FAILURE);
+	return;
+}
+
+/******************************************************
+* Function: void zte_goform_mgmt_sntp_process(webs_t wp)
+* Description:  deal with the sntp
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2011/04/13     V1.0      mengyuan            create
+*******************************************************/
+void zte_goform_mgmt_sntp_process(webs_t wp)
+{
+	MSG_BUF msg;
+	int lTgtMsgID = 0;
+	char *mode = NULL;
+	char *sntp_server0 = NULL;
+	char *sntp_server1 = NULL;
+	char *sntp_server2 = NULL;
+	char *sntp_timezone = NULL;
+	int result = 0;
+	LONG msgSize = sizeof(MSG_BUF) - sizeof(LONG);
+	char *ntp_server = NULL;
+	int sem_id = 0;
+	char state[NV_ITEM_STRING_LEN_20] = {0};
+	char sntp_timezone_tmp[NV_ITEM_STRING_LEN_64] = {0};
+	//char cmd[100] = {0};
+
+	memset(&msg, 1, sizeof(MSG_BUF));
+	mode = websGetVar(wp, T("manualsettime"), T(""));
+	cfg_set("sntp_time_set_mode", mode);
+
+	sntp_server0 = websGetVar(wp, T("sntp_server1_ip"), T(""));
+	sntp_server1 = websGetVar(wp, T("sntp_server2_ip"), T(""));
+	sntp_server2 = websGetVar(wp, T("sntp_server3_ip"), T(""));
+	cfg_set("sntp_server0", sntp_server0);
+	cfg_set("sntp_server1", sntp_server1);
+	cfg_set("sntp_server2", sntp_server2);
+
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User set sntp time!\n"));
+
+	if (strcmp(sntp_server0, "Other") == 0) {
+		cfg_set("sntp_other_server0", websGetVar(wp, T("sntp_other_server0"), T("")));
+	}
+	if (strcmp(sntp_server1, "Other") == 0) {
+		cfg_set("sntp_other_server1", websGetVar(wp, T("sntp_other_server1"), T("")));
+	}
+	if (strcmp(sntp_server2, "Other") == 0) {
+		cfg_set("sntp_other_server2", websGetVar(wp, T("sntp_other_server2"), T("")));
+	}
+	cfg_set("sntp_timezone_index", websGetVar(wp, T("sntp_timezone_index"), T("")));
+	//cfg_set("sntp_timezone", websGetVar(wp, T("timezone"), T("")));
+	cfg_set("sntp_dst_enable", websGetVar(wp, T("DaylightEnabled"), T("")));
+
+	cfg_set("manual_time_year", websGetVar(wp, T("time_year"), T("")));
+	cfg_set("manual_time_month", websGetVar(wp, T("time_month"), T("")));
+	cfg_set("manual_time_day", websGetVar(wp, T("time_day"), T("")));
+	cfg_set("manual_time_hour", websGetVar(wp, T("time_hour"), T("")));
+	cfg_set("manual_time_minute", websGetVar(wp, T("time_minute"), T("")));
+	cfg_set("manual_time_second", websGetVar(wp, T("time_second"), T("")));
+	//ÉèÖÃÊ±Çø
+	sntp_timezone = websGetVar(wp, T("timezone"), T(""));
+	cfg_set("sntp_timezone", sntp_timezone);
+
+	//memset(cmd, 0, 100);
+        //sprintf(cmd, "echo  \"%s\" > /etc_rw/TZ", sntp_timezone);
+    //system(cmd);
+    snprintf(sntp_timezone_tmp,sizeof(sntp_timezone_tmp),"%s\n",sntp_timezone);
+	save_data_to_file("/etc_rw/TZ",sntp_timezone_tmp,strlen(sntp_timezone_tmp));
+
+	if (strcmp(mode, "manual") == 0) {
+		sem_id = get_sem(TIME_SEM_KEY_1);
+		if (sem_id != -1) {
+			sem_p(sem_id);
+			slog(MISC_PRINT, SLOG_DEBUG,"[MANUAL] manual_set_time, sem_p, sem_id = %d\r\n", sem_id);
+		}
+
+		result = manual_set_time();
+
+		if (sem_id != -1) {
+			sem_v(sem_id);
+			slog(MISC_PRINT, SLOG_DEBUG,"[MANUAL] manual_set_time, sem_v, sem_id = %d\r\n", sem_id);
+		}
+
+		cfg_set("sntp_year", websGetVar(wp, T("time_year"), T("")));
+		cfg_set("sntp_month", websGetVar(wp, T("time_month"), T("")));
+		cfg_set("sntp_day", websGetVar(wp, T("time_day"), T("")));
+		cfg_set("sntp_hour", websGetVar(wp, T("time_hour"), T("")));
+		cfg_set("sntp_minute", websGetVar(wp, T("time_minute"), T("")));
+		cfg_set("sntp_second", websGetVar(wp, T("time_second"), T("")));
+		cfg_set("sntp_process_result", "success");
+		if (result < 0) {
+			zte_write_result_to_web(wp, FAILURE);
+		} else {
+			if (!zte_mgmt_login_timemark_set()) {
+				slog(MISC_PRINT, SLOG_ERR, "[ERROR]zte_goform_whitelist_check -> timemark set error .\n"); /*lint !e26*/
+			}
+			cfg_save();
+			zte_write_result_to_web(wp, SUCCESS);
+		}
+	} else if (strcmp(mode, "auto") == 0) {
+		cfg_get_item("sntp_process_state", state, sizeof(state));
+		if (strcmp(state, "over") != 0) {
+			zte_write_result_to_web(wp, PROCESSING);
+			slog(MISC_PRINT, SLOG_DEBUG,"[SNTP] already runing return \n");
+			return;
+		}
+		cfg_set("sntp_process_state", "idle");
+		//cfg_set("systime_mode", "auto");
+		//cfg_set("sntp_cmd_from", "WEBUI");
+		cfg_set("sntp_process_result", "");
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_SNTP, MSG_CMD_SNTP_START, 0, NULL, 0);
+		cfg_save();
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		sem_id = get_sem(TIME_SEM_KEY_1);
+		if (sem_id != -1) {
+			sem_p(sem_id);
+			slog(MISC_PRINT, SLOG_DEBUG,"[MANUAL] manual_set_time, sem_p, sem_id = %d\r\n", sem_id);
+		}
+
+		result = manual_set_time();
+
+		if (sem_id != -1) {
+			sem_v(sem_id);
+			slog(MISC_PRINT, SLOG_DEBUG,"[MANUAL] manual_set_time, sem_v, sem_id = %d\r\n", sem_id);
+		}
+
+		cfg_set("sntp_year", websGetVar(wp, T("time_year"), T("")));
+		cfg_set("sntp_month", websGetVar(wp, T("time_month"), T("")));
+		cfg_set("sntp_day", websGetVar(wp, T("time_day"), T("")));
+		cfg_set("sntp_hour", websGetVar(wp, T("time_hour"), T("")));
+		cfg_set("sntp_minute", websGetVar(wp, T("time_minute"), T("")));
+		cfg_set("sntp_second", websGetVar(wp, T("time_second"), T("")));
+
+		if (result < 0) {
+			zte_write_result_to_web(wp, FAILURE);
+		} else {
+			if (!zte_mgmt_login_timemark_set()) {
+				slog(MISC_PRINT, SLOG_ERR, "[ERROR]zte_goform_whitelist_check -> timemark set error .\n"); /*lint !e26*/
+			}
+			cfg_save();
+			zte_write_result_to_web(wp, SUCCESS);
+		}
+	}
+}
+
+static void wait_verify(char *wait_name, char *wait_value)
+{
+	int i = 0;
+	char buf[NV_ITEM_STRING_LEN_200] = {0};
+
+	if (NULL == wait_name || NULL == wait_value) {
+		return;
+	}
+
+	for (i = 0; i < 10; i++) {
+		sleep(2);
+		cfg_get_item(wait_name, buf, sizeof(buf));
+		if (0 == strcmp(wait_value, buf)) {
+			break;
+		}
+	}
+	return;
+}
+
+
+void deal_quick_setup_wifi_basic(webs_t wp)
+{
+	deal_quick_setup_wifi_basic_mgmt(wp);
+}
+static int deal_quick_setup_auto_apn_set()
+{
+	APN_PROFILE  newProfile = { 0 };
+	char ppp_status[NV_ITEM_STRING_LEN_50] = {0};
+
+	get_autoapn_profile(&newProfile);
+	set_apn_to_cfg(&newProfile, NULL);
+	cfg_set("ipv6_wan_apn", newProfile.apn_name); 
+
+	cfg_get_item("ppp_status", ppp_status, sizeof(ppp_status));
+	if (0 == strcmp("ppp_disconnected", ppp_status) || 0 == strcmp("ppp_ready", ppp_status)) {
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_APN_SET_REQ, 0, NULL, 0);
+	}
+	return 0;
+}
+static void set_apn_to_cfg(APN_PROFILE *apn_profile, IPV6_APN_PROFILE *ipv6_apn_profile)
+{
+	if (apn_profile != NULL) {
+		cfg_set("m_profile_name", apn_profile->profile_name);
+		cfg_set("wan_apn", apn_profile->apn_name);
+		cfg_set("apn_select", apn_profile->apn_select);
+		cfg_set("wan_dial", apn_profile->dial_num);
+		cfg_set("ppp_auth_mode", apn_profile->ppp_auth_mode);
+		cfg_set("ppp_username", apn_profile->ppp_username);
+		cfg_set("ppp_passtmp", apn_profile->ppp_passwd);
+		cfg_set("pdp_type", apn_profile->pdp_type);
+		cfg_set("ipv6_pdp_type", apn_profile->pdp_type);
+		cfg_set("pdp_select", apn_profile->pdp_select);
+		cfg_set("pdp_addr", apn_profile->pdp_addr);
+		apn_encrypt_code();
+	}
+
+	if (ipv6_apn_profile != NULL) {
+		cfg_set("m_profile_name", ipv6_apn_profile->profile_name);
+		cfg_set("ipv6_wan_apn", ipv6_apn_profile->apn_name);
+		cfg_set("apn_select", ipv6_apn_profile->apn_select);
+		cfg_set("wan_dial", ipv6_apn_profile->dial_num);
+		cfg_set(NV_IPV6_PPP_AUTH_MODE, ipv6_apn_profile->ppp_auth_mode);
+		cfg_set("ipv6_ppp_username", ipv6_apn_profile->ppp_username);
+		cfg_set("ipv6_ppp_passtmp", ipv6_apn_profile->ppp_passwd);
+		cfg_set("pdp_type", ipv6_apn_profile->pdp_type);
+		cfg_set("ipv6_pdp_type", ipv6_apn_profile->pdp_type);
+		cfg_set("pdp_select", ipv6_apn_profile->pdp_select);
+		cfg_set("pdp_addr", ipv6_apn_profile->pdp_addr);
+		ipv6apn_encrypt_code();
+	}
+}
+
+
+static void deal_quick_setup_manual_apn_set(webs_t wp)
+{
+	IPV6_APN_PROFILE newIpv6Profile = { 0 };
+	APN_PROFILE      newProfile     = { 0 };
+	int              index_apn      = atoi(websGetVar(wp, "index", T("")));
+	char            *pdp_type       = websGetVar(wp, "pdp_type", T(""));
+	char            *apn_name      = websGetVar(wp, "wan_apn", T(""));
+	char            *ipv6_wan_apn      = websGetVar(wp, "ipv6_wan_apn", T(""));
+	char ppp_status[NV_ITEM_STRING_LEN_50] = {0};
+	char            *ppp_auth_mode      = websGetVar(wp, "ppp_auth_mode", T(""));
+	char            *ppp_username      = websGetVar(wp, "ppp_username", T(""));
+	char            *ppp_passwd      = websGetVar(wp, "ppp_passtmp", T(""));
+	char            *ipv6_pdp_auth_mode      = websGetVar(wp, NV_IPV6_PPP_AUTH_MODE, T(""));
+	char            *ipv6_ppp_username      = websGetVar(wp, "ipv6_ppp_username", T(""));
+	char            *ipv6_ppp_passwd      = websGetVar(wp, "ipv6_ppp_passtmp", T(""));
+
+	slog(MISC_PRINT, SLOG_NORMAL,"[goahead] deal_quick_setup_manual_apn_set wan_apn %s. %s.\n", apn_name,ppp_username);
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User manual apn set!\n"));
+	if (0 == strcmp(pdp_type, "IPv6")) {
+		get_ipv6apn_profile_by_index(index_apn, &newIpv6Profile);
+		strncpy(newIpv6Profile.apn_name, ipv6_wan_apn,sizeof(newIpv6Profile.apn_name)-1);
+		strncpy(newIpv6Profile.ppp_auth_mode, ipv6_pdp_auth_mode,sizeof(newIpv6Profile.ppp_auth_mode)-1);
+		strncpy(newIpv6Profile.ppp_username, ipv6_ppp_username,sizeof(newIpv6Profile.ppp_username)-1);
+		strncpy(newIpv6Profile.ppp_passwd, ipv6_ppp_passwd,sizeof(newIpv6Profile.ppp_passwd)-1);
+		set_ipv6_apn_profile_by_index(index_apn, &newIpv6Profile);
+		set_ipv6_apn_prof_aes_by_index(index_apn, &newIpv6Profile);
+
+		set_apn_to_cfg(NULL, &newIpv6Profile);
+	} else if (0 == strcmp(pdp_type, "IPv4v6")) {
+		get_ipv4v6apn_profile_by_index(index_apn, &newProfile, &newIpv6Profile);
+		strncpy(newProfile.apn_name, apn_name,sizeof(newProfile.apn_name)-1);
+		strncpy(newProfile.ppp_auth_mode, ppp_auth_mode,sizeof(newProfile.ppp_auth_mode)-1);
+		strncpy(newProfile.ppp_username, ppp_username,sizeof(newProfile.ppp_username)-1);
+		strncpy(newProfile.ppp_passwd, ppp_passwd,sizeof(newProfile.ppp_passwd)-1);
+
+		strncpy(newIpv6Profile.apn_name, ipv6_wan_apn,sizeof(newIpv6Profile.apn_name)-1);
+		strncpy(newIpv6Profile.ppp_auth_mode, ipv6_pdp_auth_mode,sizeof(newIpv6Profile.ppp_auth_mode)-1);
+		strncpy(newIpv6Profile.ppp_username, ipv6_ppp_username,sizeof(newIpv6Profile.ppp_username)-1);
+		strncpy(newIpv6Profile.ppp_passwd, ipv6_ppp_passwd,sizeof(newIpv6Profile.ppp_passwd)-1);
+		set_ipv4v6_apn_profile_by_index(index_apn, &newProfile, &newIpv6Profile);
+		set_ipv4v6_apn_prof_aes_by_index(index_apn, &newProfile, &newIpv6Profile);
+
+		set_apn_to_cfg(&newProfile, &newIpv6Profile);
+	} else {
+		get_apn_profile_by_index(index_apn, &newProfile);
+		strncpy(newProfile.apn_name, apn_name,sizeof(newProfile.apn_name)-1);
+		strncpy(newProfile.ppp_auth_mode, ppp_auth_mode,sizeof(newProfile.ppp_auth_mode)-1);
+		strncpy(newProfile.ppp_username, ppp_username,sizeof(newProfile.ppp_username)-1);
+		strncpy(newProfile.ppp_passwd, ppp_passwd,sizeof(newProfile.ppp_passwd)-1);
+		set_apn_profile_by_index(index_apn, &newProfile);
+		set_apn_prof_aes_by_index(index_apn, &newProfile);
+
+		set_apn_to_cfg(&newProfile, NULL);
+	}
+
+	cfg_get_item("ppp_status", ppp_status, sizeof(ppp_status));
+	if (0 == strcmp("ppp_disconnected", ppp_status) || 0 == strcmp("ppp_ready", ppp_status)) {
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_APN_SET_REQ, 0, NULL, 0);
+	}
+}
+
+void deal_quick_setup_apn_ex(webs_t wp)
+{
+	if (strcmp(ZTE_WEB_ACT_MANUAL, websGetVar(wp, "apn_mode", T(""))) == 0) {
+		zte_web_write("apn_mode", ZTE_WEB_ACT_MANUAL);
+		deal_quick_setup_manual_apn_set(wp);
+	} else {
+		zte_web_write("apn_mode", ZTE_WEB_ACT_AUTO);
+		deal_quick_setup_auto_apn_set();  //  cov low, deal_quick_setup_auto_apn_set does not need parameter
+	}
+}
+
+void deal_quick_setup_wifi_security(webs_t wp)
+{
+	deal_quick_setup_wifi_security_mgmt(wp);
+}
+
+static void deal_quick_setup_wps(webs_t wp)
+{
+	deal_quick_setup_wps_mgmt(wp);
+}
+/******************************************************
+* Function: void get_apn_profile_by_index(int index, APN_PROFILE *profile)
+* Description:  get a apn profile by index from config
+* Input:  index:the index of apn profile which to get
+* Output: profile:the result of apn profile config after splited
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void get_apn_profile_by_index(int index, APN_PROFILE *profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+	char *pos_begin = NULL;
+
+	if (NULL == profile) {
+		return;
+	}
+	//È¡Ã÷ÎÄAPN_configtmp,Õâʱ²»ÓÃÈ¡ÃÜÎÄ
+	sprintf(cfg_name, "APN_configtmp%d", index);
+
+	cfg_get_item(cfg_name, cfg_value, sizeof(cfg_value));
+	pos_begin = cfg_value;
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->profile_name, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->apn_name, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->apn_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->dial_num, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_auth_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_username, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_passwd, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_type, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_addr, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->dns_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->prefer_dns_manual, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->standby_dns_manual, PROFILE_MEMBER_LEN);
+	return;
+}
+
+void get_ipv6apn_profile_by_index(int index, IPV6_APN_PROFILE *profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+	char *pos_begin = NULL;
+
+	if (NULL == profile) {
+		return;
+	}
+
+	sprintf(cfg_name, "ipv6_APN_configtmp%d", index);
+
+	cfg_get_item(cfg_name, cfg_value, sizeof(cfg_value));
+	slog(MISC_PRINT, SLOG_DEBUG, "get_ipv6apn_profile_by_index  cfg_value=%s", cfg_value); /*lint !e26*/
+
+	pos_begin = cfg_value;
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->profile_name, PROFILE_MEMBER_LEN);
+	slog(MISC_PRINT, SLOG_DEBUG, "========= profile->profile_name=%s=======", profile->profile_name); /*lint !e26*/
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->apn_name, PROFILE_APN_LEN);
+	slog(MISC_PRINT, SLOG_DEBUG, "=========profile->apn_name=%s=======", profile->apn_name); /*lint !e26*/
+
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->apn_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->dial_num, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_auth_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_username, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_passwd, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_type, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_addr, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->dns_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->prefer_dns_manual, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->standby_dns_manual, PROFILE_MEMBER_LEN);
+	return;
+}
+
+
+void get_ipv4v6apn_profile_by_index(int index, APN_PROFILE *profile, IPV6_APN_PROFILE *ipv6profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+	char *pos_begin = NULL;
+
+	char ipv6_cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char ipv6_cfg_value[APNCONFIG_MEMORY] = {0};
+	char *ipv6_pos_begin = NULL;
+
+
+	if (NULL == profile) {
+		return;
+	}
+	if (NULL == ipv6profile) {
+		return;
+	}
+
+	sprintf(cfg_name, "APN_configtmp%d", index);
+	cfg_get_item(cfg_name, cfg_value, sizeof(cfg_value));
+	pos_begin = cfg_value;
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->profile_name, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->apn_name, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->apn_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->dial_num, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_auth_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_username, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_passwd, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_type, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_addr, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->dns_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->prefer_dns_manual, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->standby_dns_manual, PROFILE_MEMBER_LEN);
+
+
+	sprintf(ipv6_cfg_name, "ipv6_APN_configtmp%d", index);
+	cfg_get_item(ipv6_cfg_name, ipv6_cfg_value, sizeof(ipv6_cfg_value));
+	ipv6_pos_begin = ipv6_cfg_value;
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->profile_name, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->apn_name, PROFILE_APN_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->apn_select, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->dial_num, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->ppp_auth_mode, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->ppp_username, PROFILE_APN_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->ppp_passwd, PROFILE_APN_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->pdp_type, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->pdp_select, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->pdp_addr, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->dns_mode, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->prefer_dns_manual, PROFILE_MEMBER_LEN);
+	ipv6_pos_begin = split_str_by_sep(ipv6_pos_begin, "($)", ipv6profile->standby_dns_manual, PROFILE_MEMBER_LEN);
+
+
+	return;
+}
+
+
+
+void get_autoapn_profile(APN_PROFILE *profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+	char *pos_begin = NULL;
+	char buf[NV_ITEM_STRING_LEN_20] = {0};
+
+	int auto_apn_index = 0;
+	slog(MISC_PRINT, SLOG_DEBUG, "get_autoapn_profile\n"); /*lint !e26*/
+
+	cfg_get_item("auto_apn_index", buf, sizeof(buf));
+	auto_apn_index = atoi(buf);
+	slog(MISC_PRINT, SLOG_DEBUG, "auto_apn_index=%d\n", auto_apn_index); /*lint !e26*/
+	if (NULL == profile) {
+		return;
+	}
+
+	if (0 != auto_apn_index) {
+		sprintf(cfg_name, "apn_auto_config%d", auto_apn_index);
+	} else {
+		sprintf(cfg_name, "apn_auto_config");
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "cfg_name=%s\n", cfg_name); /*lint !e26*/
+
+	cfg_get_item(cfg_name, cfg_value, sizeof(cfg_value));
+	pos_begin = cfg_value;
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->profile_name, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->apn_name, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->apn_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->dial_num, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_auth_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_username, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->ppp_passwd, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_type, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->pdp_addr, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->dns_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->prefer_dns_manual, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile->standby_dns_manual, PROFILE_MEMBER_LEN);
+	return;
+}
+
+/******************************************************
+* Function: void set_apn_profile_by_index(int index, APN_PROFILE *profile)
+* Description:  set a apn profile into config by index
+* Input:  index:the index of apn profile which to set
+*         profile:the struct of apn profile.
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/11/26     V1.0      zyt            create
+*******************************************************/
+void set_apn_profile_by_index(int index, APN_PROFILE *profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+
+	if (NULL == profile) {
+		return;
+	}
+
+	sprintf(cfg_name, "APN_configtmp%d", index);
+	if (0 == strcmp(profile->pdp_type, "IPv6")) {
+		snprintf(cfg_value, APNCONFIG_MEMORY,
+		         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+		         profile->profile_name,
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "");
+	} else {
+		snprintf(cfg_value, APNCONFIG_MEMORY,
+		         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+		         profile->profile_name,
+		         profile->apn_name,
+		         profile->apn_select,
+		         profile->dial_num,
+		         profile->ppp_auth_mode,
+		         profile->ppp_username,
+		         profile->ppp_passwd,
+		         profile->pdp_type,
+		         profile->pdp_select,
+		         profile->pdp_addr,
+		         profile->dns_mode,
+		         profile->prefer_dns_manual,
+		         profile->standby_dns_manual);
+	}
+	cfg_set(cfg_name, cfg_value);
+
+	return;
+}
+
+void set_ipv6_apn_profile_by_index(int index, IPV6_APN_PROFILE *profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+
+	if (NULL == profile) {
+		return;
+	}
+
+	sprintf(cfg_name, "ipv6_APN_configtmp%d", index);
+	if (0 == strcmp(profile->pdp_type, "IP")) {
+		slog(MISC_PRINT, SLOG_DEBUG, "pdp_type=IP  cpsnprintf "); /*lint !e26*/
+		snprintf(cfg_value, APNCONFIG_MEMORY,
+		         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+		         profile->profile_name,
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "");
+	} else {
+		slog(MISC_PRINT, SLOG_DEBUG, "pdp_type=else  cpsnprintf "); /*lint !e26*/
+		slog(MISC_PRINT, SLOG_DEBUG, "profile->profile_name=%s ", profile->profile_name); /*lint !e26*/
+		snprintf(cfg_value, APNCONFIG_MEMORY,
+		         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+		         profile->profile_name,
+		         profile->apn_name,
+		         profile->apn_select,
+		         profile->dial_num,
+		         profile->ppp_auth_mode,
+		         profile->ppp_username,
+		         profile->ppp_passwd,
+		         profile->pdp_type,
+		         profile->pdp_select,
+		         profile->pdp_addr,
+		         profile->dns_mode,
+		         profile->prefer_dns_manual,
+		         profile->standby_dns_manual);
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "cfg_value=%s", cfg_value); /*lint !e26*/
+	cfg_set(cfg_name, cfg_value);
+
+	return;
+}
+
+void set_ipv4v6_apn_profile_by_index(int index, APN_PROFILE *profile, IPV6_APN_PROFILE *ipv6profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+
+	if (NULL == profile) {
+		return;
+	}
+
+	sprintf(cfg_name, "APN_configtmp%d", index);
+	snprintf(cfg_value, APNCONFIG_MEMORY,
+	         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+	         profile->profile_name,
+	         profile->apn_name,
+	         profile->apn_select,
+	         profile->dial_num,
+	         profile->ppp_auth_mode,
+	         profile->ppp_username,
+	         profile->ppp_passwd,
+	         profile->pdp_type,
+	         profile->pdp_select,
+	         profile->pdp_addr,
+	         profile->dns_mode,
+	         profile->prefer_dns_manual,
+	         profile->standby_dns_manual);
+
+	cfg_set(cfg_name, cfg_value);
+
+	memset(cfg_name, 0, sizeof(cfg_name));
+	memset(cfg_value, 0, sizeof(cfg_value));
+	sprintf(cfg_name, "ipv6_APN_configtmp%d", index);
+	snprintf(cfg_value, APNCONFIG_MEMORY,
+	         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+	         ipv6profile->profile_name,
+	         ipv6profile->apn_name,
+	         ipv6profile->apn_select,
+	         ipv6profile->dial_num,
+	         ipv6profile->ppp_auth_mode,
+	         ipv6profile->ppp_username,
+	         ipv6profile->ppp_passwd,
+	         ipv6profile->pdp_type,
+	         ipv6profile->pdp_select,
+	         ipv6profile->pdp_addr,
+	         ipv6profile->dns_mode,
+	         ipv6profile->prefer_dns_manual,
+	         ipv6profile->standby_dns_manual);
+
+	cfg_set(cfg_name, cfg_value);
+
+	return;
+}
+
+static char *split_str_by_sep(char *src, char *sep, char *dst, int len)
+{
+	char *pos_begin = NULL;
+	char *pos_end = NULL;
+
+	if (NULL == src || NULL == sep || NULL == dst || 0 == len) {
+		return NULL;
+	}
+
+	pos_begin = src;
+	pos_end = strstr(pos_begin, sep);
+
+	if (NULL == pos_end) {
+		return NULL;
+	}
+
+	if (len <= (pos_end - pos_begin)) {
+		return NULL;
+	}
+
+	strncpy(dst, pos_begin, pos_end - pos_begin);
+	pos_end += strlen(sep);
+	return pos_end;
+}
+
+void zte_mgmt_set_login_timemark()
+{
+	char login_timemark[NV_ITEM_STRING_LEN_20] = {0};
+	long now_timemark = time(0);
+
+	sprintf(login_timemark, "%ld", now_timemark);
+	zte_web_write(NV_USER_LOGIN_TIMEMARK, login_timemark);
+	slog(MISC_PRINT, SLOG_NORMAL,"[SNTP] [manual] timemark, user_login_timemark=%ld\n", now_timemark);
+}
+
+int manual_set_time()
+{
+	struct timeval tp;
+	time_t nowtime;
+	time_t SynBeforeTime = 0;
+	int ltime = 0, mtime = 0, ntime = 0;
+	char SynSystemTotal[16] = {0};
+	char SynPppTotal[16] = {0};
+	char SynSecond[16] = {0};
+	int year = 0, month = 0, day = 0;
+	int hour = 0, minute = 0, second = 0;
+	int days = 0;
+	int LeapYear = 0;
+	int CommonYear = 0;
+	int YearTotal = 0;
+	int count;
+	int flag = 0;
+	int i;
+	int ret = 0;
+	char buf[NV_ITEM_STRING_LEN_10] = {0};
+	char ppp_status[NV_ITEM_STRING_LEN_50] = {0};
+    struct tm timeToSet = {0};
+    int dataLen = 0;
+	cfg_get_item("manual_time_year", buf, sizeof(buf));
+	year = atoi(buf);
+	if(year < 1970 || year > 2100)//for kw
+	{
+		return -1;
+	}
+
+	memset(&buf, 0, sizeof(buf));
+	cfg_get_item("manual_time_month", buf, sizeof(buf));
+	month = atoi(buf);
+	if(month<1 || month>12)
+	{
+	    month = 1;
+	}
+
+	memset(&buf, 0, sizeof(buf));
+	cfg_get_item("manual_time_day", buf, sizeof(buf));
+	day = atoi(buf);
+	if(day<1 || day>31)
+	{
+	    day = 1;
+	}	
+
+	memset(&buf, 0, sizeof(buf));
+	cfg_get_item("manual_time_hour", buf, sizeof(buf));
+	hour = atoi(buf);
+	if(hour<0 || hour>24)
+	{
+	    hour = 0;
+	}	
+
+	memset(&buf, 0, sizeof(buf));
+	cfg_get_item("manual_time_minute", buf, sizeof(buf));
+	minute = atoi(buf);
+	if(minute<0 || minute>60)
+	{
+	    minute = 0;
+	}		
+
+	memset(&buf, 0, sizeof(buf));
+	cfg_get_item("manual_time_second", buf, sizeof(buf));
+	second = atoi(buf);
+	if(second<0 || second>60)
+	{
+	    second = 0;
+	}	
+
+	YearTotal = year - 1970;
+	for (count = 0; count < YearTotal; count++) {
+		i = 1971 + count;
+		if (i % 4 == 0 && i % 100 != 0) {
+			if (YearTotal == count + 1) {
+				CommonYear++;
+			} else {
+				LeapYear++;
+			}
+			continue;
+		} else if (i % 400 == 0) {
+			if (YearTotal == count + 1) {
+				CommonYear++;
+			} else {
+				LeapYear++;
+			}
+			continue;
+		} else {
+			CommonYear++;
+		}
+	}
+
+	/****************flag==1±íʾµ±ÄêΪÈòÄê*************************/
+	if (year % 4 == 0 && year % 100 != 0) {
+		flag = 1;
+	} else if (year % 400 == 0) {
+		flag = 1;
+	} else {
+		flag = 0;
+	}
+
+	switch (month - 1) {
+	case 0:
+		days = day;
+		break;
+	case 1:
+		days = 31 + day;
+		break;
+	case 2:
+		days = 31 + 28 + day;
+		break;
+	case 3:
+		days = 31 + 28 + 31 + day;
+		break;
+	case 4:
+		days = 31 + 28 + 31 + 30 + day;
+		break;
+	case 5:
+		days = 31 + 28 + 31 + 30 + 31 + day;
+		break;
+	case 6:
+		days = 31 + 28 + 31 + 30 + 31 + 30 + day;
+		break;
+	case 7:
+		days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + day;
+		break;
+	case 8:
+		days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + day;
+		break;
+	case 9:
+		days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;
+		break;
+	case 10:
+		days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;
+		break;
+	case 11:
+		days = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;
+		break;
+	}
+	if ((month - 1) >= 2 && 1 == flag) {
+		days++;
+	}
+
+
+	nowtime = COMMONYEARSEC * CommonYear + LEAPYEARSEC * LeapYear + (days - 1) * DAYSEC + hour * 3600 + minute * 60 + second;
+	tp.tv_usec = 0;
+	tp.tv_sec = nowtime;
+
+	time(&SynBeforeTime);
+	slog(MISC_PRINT, SLOG_DEBUG, "Now time  is %d", SynBeforeTime); /*lint !e26*/
+
+	cfg_get_item("syn_after_time", SynSecond, sizeof(SynSecond));
+	sscanf(SynSecond, "%d", &ltime);
+	if(ltime < 0 || ltime > INT_MAX-1)  // kw 3
+	{
+	    ltime = 0;
+	}	
+
+	cfg_get_item("syn_system_total", SynSystemTotal, sizeof(SynSystemTotal));
+
+	sscanf(SynSystemTotal, "%d", &mtime);
+	if(mtime < 0 || mtime > INT_MAX-1)  // kw 3
+	{
+	    mtime = 0;
+	}
+
+	if (0 != mtime) {
+		mtime += (SynBeforeTime - ltime);
+	} else {
+		mtime = (SynBeforeTime - JAN_2000);
+	}
+	sprintf(SynSystemTotal, "%d", mtime);
+	cfg_set("syn_system_total", SynSystemTotal);
+
+	cfg_get_item("ppp_status", ppp_status, sizeof(ppp_status));
+	if ((0 == strcmp(ppp_status, "ppp_connected")) || (0 == strcmp(ppp_status, "ipv6_connected")) || (0 == strcmp(ppp_status, "ipv4_ipv6_connected"))) {
+		cfg_get_item("syn_ppp_total", SynPppTotal, sizeof(SynPppTotal));
+
+		sscanf(SynPppTotal, "%d", &mtime);
+    	if(mtime < 0 || mtime >  INT_MAX-1)  // kw 3
+    	{
+    	    mtime = 0;
+    	}		
+		if (0 != mtime) {
+			mtime += (SynBeforeTime - ltime);
+		} else {
+			memset(&SynSecond, 0, sizeof(SynSecond));
+			cfg_get_item("ppp_start_time", SynSecond, sizeof(SynSecond));
+
+ 			sscanf(SynSecond, "%d", &ntime);
+        	if(ntime < 0 || ntime >  INT_MAX-1)  // kw 3
+        	{
+        	    ntime = 0;
+        	}	
+
+			mtime = SynBeforeTime - ntime;
+		}
+		sprintf(SynPppTotal, "%d", mtime);
+		cfg_set("syn_ppp_total", SynPppTotal);
+		cfg_set("syn_order_flag", "ppp_on");
+	} else {
+		cfg_set("syn_order_flag", "ppp_off");
+		cfg_set("syn_ppp_total", "0");
+	}
+
+    timeToSet.tm_year = year-1900;
+    timeToSet.tm_mon = month-1;
+    timeToSet.tm_mday = day;    
+    timeToSet.tm_hour = hour;
+    timeToSet.tm_min = minute; 
+    timeToSet.tm_sec = second; 
+    dataLen = sizeof(struct tm);
+    slog(MISC_PRINT, SLOG_DEBUG, "SetTime:year:%d, mon:%d, day:%d, hour:%d, min:%d, sec:%d \n", 
+            timeToSet.tm_year, timeToSet.tm_mon, timeToSet.tm_mday, 
+            timeToSet.tm_hour, timeToSet.tm_min, timeToSet.tm_sec );
+    ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_SNTP, MSG_CMD_SNTP_SET_TIME, 
+                                    dataLen, &timeToSet, 0);
+	if (0 != ret) {
+		slog(MISC_PRINT, SLOG_ERR, "send MSG_CMD_SNTP_SET_TIME to sntp fail!");
+	}
+
+	ret = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_SYCTIME_SET_REQ, 0, NULL, 0);
+	if (0 != ret) {
+		slog(MISC_PRINT, SLOG_ERR, "sync time to cp fail!");
+	}
+
+	memset(&buf, 0, sizeof(buf));
+	cfg_get_item("outdate_delete", buf, sizeof(buf));
+	if (0 == strcmp(buf, "1")) {
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_SMS, MSG_CMD_SMS_OUTDATE_CHECK, 0, NULL, 0);
+	}
+
+	sprintf(SynSecond, "%d", (int)(time((time_t *)NULL)));
+	cfg_set("syn_after_time", SynSecond);
+	//cfg_set("systime_mode", "manual");
+	cfg_set("need_clear_traffic_data", "yes");
+	zte_mgmt_set_login_timemark();
+	return 0;
+}
+char * timei2s(int itime)
+{
+	static char buf[64];
+	int hours, min, sec;
+	memset(buf, 0, 64);
+
+	hours = itime / 3600;
+	min   = (itime / 60) % 60;
+	sec   = itime % 60;
+
+	sprintf(buf, "%d:%02d:%02d", hours, min, sec);
+	return buf ;
+}
+void timeen2ch(char *time)
+{
+	char timetmp[128] = {0};
+	char year[5] = {0};
+	char month[4] = {0};
+	char day[3] = {0};
+	char weekday[4] = {0};
+	char nowtime[16] = {0};
+	char hour[4] = {0};
+	char second[4] = {0};
+	char minute[4] = {0};
+	//int imonth;
+	char imonth[4] = {0};
+	strncpy(timetmp, time,sizeof(timetmp)-1);
+	char *loc = timetmp;
+	char *tmp = NULL;
+	memset(time, 0, 128);
+	char str_buf[10] = {0};
+	int temp;
+	int month_temp;
+
+	while (*loc == ' ') {
+		loc++;
+	}
+	tmp = strtok(loc, " ");
+	if(tmp == NULL) return;
+	strncpy(weekday, tmp, sizeof(weekday)-1);
+	tmp = strtok(NULL, " ");
+	if(tmp == NULL) return;
+	strncpy(month, tmp, sizeof(month)-1);
+	tmp = strtok(NULL, " ");
+	if(tmp == NULL) return;
+	strncpy(day, tmp, sizeof(day)-1);
+	slog(MISC_PRINT, SLOG_DEBUG, "strlen(tmp)=%d", strlen(tmp)); /*lint !e26*/
+	if (strlen(tmp) == 1) {
+		temp = atoi(tmp);
+		slog(MISC_PRINT, SLOG_DEBUG, "====temp=%d", temp); /*lint !e26*/
+		if(temp < 10 && temp > 0)
+			snprintf(day,sizeof(day), "0%d", temp);
+		slog(MISC_PRINT, SLOG_DEBUG, "====day=%s", day); /*lint !e26*/
+	} else {
+		strncpy(day, tmp,sizeof(day)-1);
+	}
+	tmp = strtok(NULL, " ");
+	if(tmp == NULL) return;
+	strncpy(nowtime, tmp, sizeof(nowtime)-1);
+	tmp = strtok(NULL, " ");
+	if(tmp == NULL) return;
+	strncpy(year, tmp, sizeof(year)-1);
+	if (0 == strcmp("Jan", month)) {
+		strncpy(imonth, "01", sizeof(imonth)-1);
+	} else if (0 == strcmp("Feb", month)) {
+		strncpy(imonth, "02", sizeof(imonth)-1);
+	} else if (0 == strcmp("Mar", month)) {
+		strncpy(imonth, "03", sizeof(imonth)-1);
+	} else if (0 == strcmp("Apr", month)) {
+		strncpy(imonth, "04", sizeof(imonth)-1);
+	} else if (0 == strcmp("May", month)) {
+		strncpy(imonth, "05", sizeof(imonth)-1);
+	} else if (0 == strcmp("Jun", month)) {
+		strncpy(imonth, "06", sizeof(imonth)-1);
+	} else if (0 == strcmp("Jul", month)) {
+		strncpy(imonth, "07", sizeof(imonth)-1);
+	} else if (0 == strcmp("Aug", month)) {
+		strncpy(imonth, "08", sizeof(imonth)-1);
+	} else if (0 == strcmp("Sep", month)) {
+		strncpy(imonth, "09", sizeof(imonth)-1);
+	} else if (0 == strcmp("Oct", month)) {
+		strncpy(imonth, "10", sizeof(imonth)-1);
+	} else if (0 == strcmp("Nov", month)) {
+		strncpy(imonth, "11", sizeof(imonth)-1);
+	} else if (0 == strcmp("Dec", month)) {
+		strncpy(imonth, "12", sizeof(imonth)-1);
+	}
+	sprintf(time, "%s-%s-%s&nbsp;&nbsp;&nbsp;%s", year, imonth, day, nowtime);
+	slog(MISC_PRINT, SLOG_DEBUG, "====nowtime=%s", nowtime); /*lint !e26*/
+
+
+	tmp = strtok(nowtime, ":");
+	if(tmp == NULL) return;
+	strncpy(hour, tmp,sizeof(hour)-1);
+	slog(MISC_PRINT, SLOG_DEBUG, "====hour=%s", hour); /*lint !e26*/
+	tmp = strtok(NULL, ":");
+	if(tmp == NULL) return;
+	strncpy(minute, tmp,sizeof(minute)-1);
+	slog(MISC_PRINT, SLOG_DEBUG, "====minute=%s", minute); /*lint !e26*/
+	tmp = strtok(NULL, ":");
+	if(tmp == NULL) return;
+	strncpy(second, tmp,sizeof(second)-1);
+	slog(MISC_PRINT, SLOG_DEBUG, "====second=%s", second); /*lint !e26*/
+	cfg_set("sntp_hour", hour);
+	cfg_set("sntp_minute", minute);
+	cfg_set("sntp_second", second);
+
+	cfg_set("sntp_year", year);
+	cfg_set("sntp_month", imonth);
+	cfg_set("sntp_day", day);
+}
+void datastatic(char *rec, char *send, char *onlinetime, char *runtime, char *localtime)
+{
+	char         Receive_Amount[20] = {0};
+	char		 Transmit_Amount[20] = {0};
+	char         syn_system_total[20] = {0};
+	char         syn_after_time[20] = {0};
+	char         syn_ppp_total[20] = {0};
+	char         ppp_start_time[20] = {0};
+	char		 timestr[128] = {0};
+	int  	     mtime;
+	int			 ltime;
+	int			 ntime;
+	int          otime;
+	time_t 		 timenow;
+	char  ppp_status[NV_ITEM_STRING_LEN_50] = {0};
+	char  buf[NV_ITEM_STRING_LEN_20] = {0};
+
+	cfg_get_item("syn_system_total", syn_system_total, sizeof(syn_system_total));
+
+	sscanf(syn_system_total, "%d", &ltime);
+    if(ltime < 0 || ltime >  INT_MAX-1)  // kw 3
+    {
+        ltime = 0;
+    }	
+	cfg_get_item("syn_after_time", syn_after_time, sizeof(syn_after_time));
+
+	sscanf(syn_after_time, "%d", &ntime);
+    if(ntime < 0 || ntime >  INT_MAX-1)  // kw 3
+    {
+        ntime = 0;
+    }		
+	cfg_get_item("ppp_start_time", ppp_start_time, sizeof(ppp_start_time));
+
+	sscanf(ppp_start_time, "%d", &otime);
+    if(otime < 0 || otime >  INT_MAX-1)  // kw 3
+    {
+        otime = 0;
+    }		
+
+	cfg_get_item("ppp_status", ppp_status, sizeof(ppp_status));
+	if ((0 != strcmp(ppp_status, "ppp_connected")) && (0 != strcmp(ppp_status, "ipv6_connected")) && (0 != strcmp(ppp_status, "ipv4_ipv6_connected"))) {
+		cfg_set("syn_ppp_total", "0");
+	}
+
+	cfg_get_item("syn_ppp_total", syn_ppp_total, sizeof(syn_ppp_total));
+
+	sscanf(syn_ppp_total, "%d", &mtime);
+    if(mtime < 0 || mtime >  INT_MAX-1)  // kw 3
+    {
+        mtime = 0;
+    }		
+
+	time(&timenow);
+	if (ntime == 0) {
+		strncpy(onlinetime, timei2s(timenow - otime), 63);
+		strncpy(runtime, timei2s(timenow - JAN_2000), 63);
+	} else {
+		cfg_get_item("syn_order_flag", buf, sizeof(buf));
+		if (0 == strcmp(buf, "ppp_on")) {
+			strncpy(onlinetime, timei2s(timenow - ntime + mtime), 63);
+		} else {
+			strncpy(onlinetime, timei2s(timenow - otime), 63);
+		}
+		strncpy(runtime, timei2s(timenow - ntime + ltime), 63);
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "----runtime=%s", runtime); /*lint !e26*/
+	strncpy(timestr, ctime(&timenow),sizeof(timestr)-1);
+	slog(MISC_PRINT, SLOG_DEBUG, "----timestr=%s", timestr); /*lint !e26*/
+	timeen2ch(timestr);
+	strncpy(localtime, timestr,sizeof(localtime)-1);
+	slog(MISC_PRINT, SLOG_DEBUG, "----localtime=%s", localtime); /*lint !e26*/
+
+}
+
+void zte_goform_sntp_getdatastatic_process(webs_t wp)
+{
+	char receive[30], send[30], onlinetime[64], runtime[64], localtime[128];
+
+	memset(receive, 0, 30);
+	memset(send, 0, 30);
+	memset(onlinetime, 0, 64);
+	memset(runtime, 0, 64);
+	memset(localtime, 0, 128);
+
+	datastatic(receive, send, onlinetime, runtime, localtime);
+
+	websWrite(wp, T("{\"receive\":\"%s\",\"send\":\"%s\",\"onlinetime\":\"%s\",\"runtime\":\"%s\",\"localtime\":\"%s\"}"), receive, send, onlinetime, runtime, localtime);
+}
+
+
+typedef struct LOG_FILES {
+	char filename[64];
+} LOG_FILES;
+
+int start_diaglog()
+{
+	int ret = 0;
+	slog(MISC_PRINT, SLOG_NORMAL, "start_diaglog"); /*lint !e26*/
+	system("/sbin/diaglog &");
+	return ret;
+}
+
+int stop_diaglog()
+{
+	int ret = 0;
+	slog(MISC_PRINT, SLOG_NORMAL, "get killall SIGINT"); /*lint !e26*/
+	system("killall -9 diaglog");//SIGINT=2
+	return ret;
+}
+#if 0
+int del_diaglog(char *fllename)
+{
+	slog(MISC_PRINT, SLOG_NORMAL, "del log name=%s", fllename); /*lint !e26*/
+	int ret = 0;
+	char cmd[128];
+	sprintf(cmd, "rm %s", fllename);
+	system(cmd);
+	return ret;
+}
+#endif
+
+int getDiaglogFile(LOG_FILES *files, int n_files)
+{
+	char ext[] = ".dlf";
+	int i = 0;
+
+	DIR *dp;
+	struct dirent *entry;
+
+	dp = opendir(DIAGLOG_DATA_PATH);
+	if (dp == NULL) {
+		slog(MISC_PRINT, SLOG_ERR, "dp==NULL");
+		return 0;
+	}
+
+	i = 0;
+	while ((entry = readdir(dp)) != NULL && (i < n_files)) {
+		{
+			int len = strlen(entry->d_name);
+			if ((len > strlen(ext)) && !strcmp(entry->d_name + len - strlen(ext), ext)) { //*.dlf *.zm
+				strncpy(files[i].filename, entry->d_name, sizeof(files[i].filename)-1);
+				slog(MISC_PRINT, SLOG_DEBUG, "entry->d_name=%s", entry->d_name);
+				i++;
+			}
+		}
+	}
+	closedir(dp);
+
+	return i;
+
+}
+
+
+void getdialog_url(int eid, webs_t wp, int argc, char_t **argv)
+{
+	char filename[128] = {0};
+	LOG_FILES files[10];
+	int n, i;
+	char *p = filename;
+	n = getDiaglogFile(files, 10);
+	i = 0;
+	if (n > 0) {
+		while (i < n) {
+			slog(MISC_PRINT, SLOG_DEBUG, "i=%d", i); /*lint !e26*/
+			strcpy(p, files[i].filename);
+			p += strlen(files[i].filename);
+			*p = ';';
+			p++;
+			slog(MISC_PRINT, SLOG_DEBUG, "filename=%s", files[i].filename); /*lint !e26*/
+			i++;
+		}
+		websWrite(wp, T(filename));
+	} else {
+		websWrite(wp, T(""));
+	}
+}
+
+/******************************************************
+* Function: zte_fota_get_upgrade_result
+* Description: get fota upgrade result
+* Input:  http request info
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2013/03/14        V1.0     chenyi        create
+*******************************************************/
+void zte_fota_get_upgrade_result(webs_t wp)
+{
+	zte_topsw_state_e_type nv_result = ZTE_NVIO_MAX;
+
+	char nv_upgrade_result[NV_ITEM_STRING_LEN_50] = {0};
+
+	nv_result = zte_web_read(NV_FOTA_UPGRADE_RESULT, nv_upgrade_result);
+	if (ZTE_NVIO_DONE != nv_result) {
+		slog(MISC_PRINT, SLOG_ERR,"read nv [%s] fail.\n", NV_FOTA_UPGRADE_RESULT);
+	}
+
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"%s\":\"%s\"}"), FOTA_UPGRADE_RESULT, nv_upgrade_result);
+
+	if ((0 == strcmp("success", nv_upgrade_result)) || (0 == strcmp("fail", nv_upgrade_result))) {
+		(void)zte_web_write(NV_FOTA_UPGRADE_RESULT, ""); //reset
+
+		// ÖØÖÃNVºó±£´æ¸ÃNV²ÎÊý£¬±ÜÃâÒò¿ìËÙÖØÆô£¬NVÐÂֵδ±£´æµ¼Öµĸüнá¹ûÖØ¸´Éϱ¨ÎÊÌâ
+		//cfg_save();
+	    slog(MISC_PRINT, SLOG_ERR,"reset nv [%s]. nv_upgrade_result:%s\n", NV_FOTA_UPGRADE_RESULT, nv_upgrade_result);
+	}
+}
+
+#if 0
+/******************************************************
+* Function: zte_fota_get_dp_pack_info
+* Description: get fota dp info
+* Input:  http request info
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2013/01/06        V1.0     chenyi        create
+*******************************************************/
+void zte_fota_get_dp_pack_info(webs_t wp)
+{
+	char dp_total_size[NV_ITEM_STRING_LEN_50] = {0};
+	char dp_download_size[NV_ITEM_STRING_LEN_50] = {0};
+
+	//get dp pack info
+	(void)zte_web_read(NV_FOTA_PKG_TOTAL_SIZE, dp_total_size);
+	(void)zte_web_read(NV_FOTA_PKG_DL_SIZE, dp_download_size);
+
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"%s\":\"%s\",\"%s\":\"%s\"}"), \
+	                NV_FOTA_PKG_TOTAL_SIZE, dp_total_size, NV_FOTA_PKG_DL_SIZE, dp_download_size);
+}
+#endif
+/**********************************************************************
+* Function:         zte_fota_update
+* Description:      send msg to fota update module
+* Input:            wp:the web para;
+* Output:
+* Return:
+* Others:         add from uFi
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+*
+**********************************************************************/
+int zte_fota_SendMsg2DM(int cmd)
+{
+	slog(MISC_PRINT, SLOG_NORMAL,"goahead  send cmd=%d to fota\n", cmd);
+	return ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_DM_WEBUI_AT, cmd, 0, NULL,  0);
+}
+
+void zte_fota_update(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User check new version!\n"));
+	char *update_action = NULL;
+	zte_topsw_state_e_type nv_result = ZTE_NVIO_MAX;
+	char new_version_state[NV_ITEM_STRING_LEN_150] = {0};
+	BOOL new_state_version_check = FALSE;
+	int iDlPara = -1;
+
+	if (NULL == wp) {
+		return;
+	}
+
+	update_action = websGetVar(wp, T("select_op"), T(""));
+	slog(MISC_PRINT, SLOG_DEBUG,"websGetVar FOTA upgrade action[%s].\n", update_action);
+
+	if ('\0' == *update_action) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+
+	//ÓëdeviceUiµÄ»¥³â±£»¤´¦Àí
+	zte_web_read(NV_FOTA_NEW_VERSION_STATE, new_version_state);
+
+	if ((0 == strcmp(update_action, FOTA_ACTION_CONFIRM_DOWNLOAD)) || (0 == strcmp(update_action, FOTA_ACTION_CANCEL_DOWNLOAD))) {
+		if ((0 == strcmp(new_version_state, HAS_OPTIONAL)) || (0 == strcmp(new_version_state, HAS_CRITICAL))) {
+			new_state_version_check = TRUE;
+		}
+		if (!new_state_version_check) {
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+	}
+
+	if (0 == strcmp(update_action, FOTA_ACTION_CONFIRM_DOWNLOAD)) {
+		zte_web_write(NV_FOTA_UPGRADE_SELECTOR, "accept");
+		//zte_web_write(NV_FOTA_NEED_USER_CONFIRM,"0");
+		slog(MISC_PRINT, SLOG_DEBUG,"web :zte_fota_update. update_action = FOTA_ACTION_CONFIRM_DOWNLOAD, set NV_FOTA_UPGRADE_SELECTOR accept!\n");
+		//zte_fota_SendMsg2DM(MSG_CMD_FOTA_WEBUI_START_DOWNLOAD);
+		//ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_DM_WEBUI_AT,MSG_CMD_FOTA_WEBUI_START_DOWNLOAD, 2, "1", 0);
+		iDlPara = 1;
+		ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_DM_WEBUI_AT, MSG_CMD_FOTADL_REQ, sizeof(iDlPara), (UCHAR *)(&iDlPara), 0);
+	} else if (0 == strcmp(update_action, FOTA_ACTION_CANCEL_DOWNLOAD)) {
+		(void)zte_web_write(NV_FOTA_UPGRADE_SELECTOR, "cancel");
+		zte_web_write(NV_FOTA_NEW_VERSION_STATE, IDLE);
+		zte_web_write(NV_FOTA_CURR_UPGRADE_STATE, IDLE);
+
+		slog(MISC_PRINT, SLOG_DEBUG,"web :zte_fota_update. update_action = FOTA_ACTION_CANCEL_DOWNLOAD, set NV_FOTA_UPGRADE_SELECTOR cancel!\n");
+		zte_write_result_to_web(wp, SUCCESS);
+		return; //no need to send msg to ota module
+	} else if (0 == strcmp(update_action, "check")) {
+		slog(MISC_PRINT, SLOG_DEBUG,"goahead :zte_fota_update.  begin to check!!\n");
+		zte_fota_SendMsg2DM(MSG_CMD_FOTA_WEBUI_START_FOTA);
+	}
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/**********************************************************************
+* Function:         zte_fota_settings
+* Description:      to set fota settings
+* Input:            wp:the web para;dm_nextpollingtime;dm_pollingcycle;pollingswitch;
+* Output:
+* Return:
+* Others:         add from uFi
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+*
+**********************************************************************/
+void zte_fota_settings(webs_t wp)
+{
+	char_t *updateMode = NULL;
+	char_t *allowRoamingUpdate = NULL;
+	zte_topsw_state_e_type status = ZTE_NVIO_MAX;
+
+	if (NULL == wp) {
+		return;
+	}
+
+	updateMode = websGetVar(wp, T("UpgMode"), T(""));
+	allowRoamingUpdate = websGetVar(wp, T("UpgRoamPermission"), T(""));
+
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_fota_settings web para:[updateMode] is [%s].\n", updateMode);
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_fota_settings web para:[allowRoamingUpdate] is [%s].\n", allowRoamingUpdate);
+
+	if ('\0' == (*updateMode)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	status = zte_web_write("fota_allowRoamingUpdate", allowRoamingUpdate);
+	if (ZTE_NVIO_DONE != status) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+
+	status = zte_web_write("fota_updateMode", updateMode);
+	if (ZTE_NVIO_DONE != status) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	zte_fota_SendMsg2DM(MSG_CMD_FOTA_WEBUI_CHANGE_PARAMETER);
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+static int fota_is_file_exist(const char* path)
+{
+	if ( (path == NULL) || (*path == '\0') )
+		return FALSE;
+	if (access(path, R_OK) != 0)
+		return FALSE;
+
+	return TRUE;
+}
+
+static int fota_read_file(const char*path, char*buf, size_t sz)
+{
+	int fd = -1;
+	size_t cnt;
+
+	fd = open(path, O_RDONLY, 0);
+	if(fd < 0)
+	{
+		slog(MISC_PRINT, SLOG_DEBUG,"fota_read_file failed to open %s: %s\n", path, strerror(errno));
+		cnt = -1;
+		return cnt;
+	}
+	cnt = read(fd, buf, sz - 1);
+	if(cnt <= 0)
+	{
+		slog(MISC_PRINT, SLOG_DEBUG, "failed to read %s: %s\n", path, strerror(errno));
+		close(fd);
+		cnt = -1;
+		return cnt;
+	}
+	buf[cnt] = '\0';
+	if(buf[cnt - 1] == '\n')
+	{
+		cnt--;
+		buf[cnt] = '\0';
+	}
+	close(fd);
+
+	return cnt;
+}
+
+static int fota_read_file_int(const char* path, int *val)
+{
+	char buf[32];
+	char *end;
+	int ret;
+	int tmp;
+
+	ret = fota_read_file(path, buf, sizeof(buf));
+	if(ret < 0)
+		return -1;
+
+	errno = 0;
+	tmp = strtol(buf, &end, 0);
+	if (errno == ERANGE) {
+		slog(MISC_PRINT, SLOG_DEBUG, "strtol errno %d: %s\n", errno, strerror(errno));
+	}
+
+	if ((end == buf) || ((end < buf + sizeof(buf)) && (*end != '\0')))
+	{
+		return -1;
+	}
+
+	*val = tmp;
+
+	return 0;
+}
+
+static int fota_get_update_status(int *fota_status)
+{
+
+	int status = 0;
+	int ret = 0;
+	if(!fota_is_file_exist(FOTA_UPDATE_STATUS_FILE)) {
+		*fota_status = -1;
+		return -1;
+	}
+	ret = fota_read_file_int(FOTA_UPDATE_STATUS_FILE, &status);
+	if(ret < 0) {
+		*fota_status = -1;
+		return -1;
+	}
+	*fota_status = status;
+	return 0;
+}
+
+// »Øµ÷º¯Êý£¬ÓÃÓÚ½«ÏÂÔØµÄÊý¾ÝдÈëÎļþ
+size_t fota_upgrade_write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+	size_t written = fwrite(ptr, size, nmemb, stream);
+
+	return written;
+}
+
+void zte_fota_manual_upgrade(webs_t wp)
+{
+	int result;
+    int upgradeStatus;
+	char_t *url = NULL;
+	zte_topsw_state_e_type status = ZTE_NVIO_MAX;
+	CURL *curl;
+	CURLcode res;
+	FILE *fp;
+
+	if (NULL == wp) {
+		return;
+	}
+	url = websGetVar(wp, T("UpgURL"), T(""));
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_fota_manual_upgrade web para:[UpgURL] is [%s].\n", url);
+	if ('\0' == (*url)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	status = zte_web_write("fota_manualUpgradeURL", url);
+	if (ZTE_NVIO_DONE != status) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	curl_global_init(CURL_GLOBAL_DEFAULT);
+	curl = curl_easy_init();
+	if(curl)
+	{
+		system("rm -rf /cache/zte_fota");
+		system("mkdir /cache/zte_fota");
+		fp = fopen("/cache/zte_fota/delta.package", "w");
+		if (fp == NULL)
+		{
+			zte_write_result_to_web(wp, FAILURE);
+			curl_easy_cleanup(curl);
+			curl_global_cleanup();
+			return;
+		}
+		curl_easy_setopt(curl, CURLOPT_URL, url);
+		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fota_upgrade_write_data);
+		curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
+		// Ö´ÐÐÏÂÔØ
+		res = curl_easy_perform(curl);
+		if(res != CURLE_OK)
+		{
+			slog(MISC_PRINT, SLOG_DEBUG, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
+			fclose(fp);
+			curl_easy_cleanup(curl);
+			curl_global_cleanup();
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+		fclose(fp);
+		curl_easy_cleanup(curl);
+	}
+
+	curl_global_cleanup();
+	system("fota_upi -u verify");
+	result = fota_get_update_status(&upgradeStatus);
+	if(result < 0)
+	{
+		slog(MISC_PRINT, SLOG_DEBUG, "failed to read the update_status file\n");
+		zte_write_result_to_web(wp, FAILURE);
+	}
+	else if(upgradeStatus != 0)
+	{
+		slog(MISC_PRINT, SLOG_DEBUG, "verify failed\n");
+		zte_write_result_to_web(wp, FAILURE);
+	}
+	else
+	{
+		zte_write_result_to_web(wp, SUCCESS);
+		system("fota_upi -u recovery &");
+	}
+}
+
+void zte_wefota_upgrade(webs_t wp)
+{
+	if (NULL == wp) {
+		return;
+	}
+	char buf[32] = {0};
+	int max_count = 0;
+
+	cfg_set("wefota_current_upgrade_state", "idle");
+	cfg_set("wefota_new_version_state", "checking");
+	system("killall wefota");
+	system("/sbin/wefota &");
+	sleep(1);
+	
+	while(max_count < 20)
+	{
+		cfg_get_item("wefota_new_version_state", buf, sizeof(buf));
+		if (!strcmp("checking", buf))
+		{
+			max_count++;
+			sleep(1);
+		}
+		else
+		{
+			break;
+		}
+	}
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+void zte_goform_set_network_adb(webs_t wp)
+{
+	MSG_BUF stMsg         = {0};
+	SINT32        iMsgSize      = sizeof(MSG_BUF) - sizeof(SINT32);
+	char buf[NV_ITEM_STRING_LEN_20] = {0};
+	char goform_id[32] = {0};
+	char value[32] = {0};
+	char *fromid = NULL;
+	char *arg = NULL;
+	char *tmp = NULL;
+
+	fromid = strstr(wp->url, "goformId=");
+	if (fromid != NULL)
+	{
+		fromid += strlen("goformId=");
+		strncpy(goform_id, fromid, sizeof(goform_id) - 1);
+		tmp = strchr(goform_id, '=');
+		if (tmp != NULL)
+		{
+			*tmp = '\0';
+			arg = tmp + 1;
+			strncpy(value, arg, sizeof(value) - 1);
+		}
+	}
+
+	if (!strcmp(value, "network"))
+	{
+		cfg_set("use_network_adb", "network");
+		cfg_set("service.adb.tcp.port", "5555");
+		system("killall adbd");
+		system("adbd tcp:5555 &");
+	}
+	else if (!strcmp(value, "usb"))
+	{
+		cfg_set("use_network_adb", "usb");
+		cfg_set("service.adb.tcp.port", "");
+		system("killall adbd");
+		system("adbd &");
+	}
+	else
+	{
+		slog(MISC_PRINT, SLOG_NORMAL, T("arg error!\n"));
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+static void url_decode(char *str)
+{
+	char *src = str;
+	char *dst = str;
+
+	while (*src)
+	{
+		if (*src == '%' && isxdigit(src[1]) && isxdigit(src[2]))
+		{
+			// Èç¹ûÕÒµ½ %XX ¸ñʽµÄ±àÂ룬½«Æäת»»Îª¶ÔÓ¦µÄ×Ö·û
+			char hex[3];
+			hex[0] = src[1];
+			hex[1] = src[2];
+			hex[2] = '\0';
+			*dst++ = (char)strtol(hex, NULL, 16);
+			src += 3;  // Ìø¹ý %XX
+		}
+		else
+		{
+			// ·ñÔò£¬Ö±½Ó¸´ÖÆ×Ö·û
+			*dst++ = *src++;
+		}
+	}
+
+	*dst = '\0';
+}
+
+static void executeCommand(const char *command, char *result, int size)
+{
+	if (command == NULL || strlen(command) == 0)
+	{
+		return;
+	}
+
+	FILE *pipe = popen(command, "r");
+	if (pipe == NULL)
+	{
+		printf("popen = NULL\n");
+		perror("popen failed");
+		return;
+	}
+	int nread = fread(result, 1, size, pipe);
+	if (nread > 0)
+	{
+		result[nread - 1] = '\0';
+	}
+	pclose(pipe);
+
+	return;
+}
+
+static void replace_slash_with_backslash(char *str)
+{
+	if (str == NULL)
+	{
+		return;
+	}
+	int i = 0;
+
+	for (i = 0; str[i] != '\0'; i++)
+	{
+		if (str[i] == '/')
+		{
+			str[i] = '\\';
+		}
+	}
+}
+
+static void parse_at_response(const char *response, char **params, int *param_count, char *at, int count)
+{
+	const char *start = strstr(response, at);
+	if (start == NULL)
+	{
+		printf("Response does not contain the expected prefix.\n");
+		return;
+	}
+
+	start += strlen(at);
+	char *token = strtok((char *)start, ",");
+	*param_count = 0;
+
+	while (token != NULL && *param_count < count)
+	{
+		params[(*param_count)++] = token;
+		token = strtok(NULL, ",");
+	}
+}
+
+#define MIN_RSRQ_VALUE -19.5  // „1¤7„1¤7§³dB0ö5
+#define STEP_SIZE 0.5          // 0‹7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤704„1¤7„1¤7„1¤7
+#define MAX_RSRQ_INDEX 34      // „1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7„1¤7
+
+static float get_rsrq_db_value(int rsrq_index)
+{
+    if (rsrq_index < 0 || rsrq_index > MAX_RSRQ_INDEX)
+	{
+        return -1000.0;
+    }
+
+    float lower_bound = MIN_RSRQ_VALUE + rsrq_index * STEP_SIZE;
+
+    return lower_bound;
+}
+
+void zte_goform_get_network_info(webs_t wp)
+{
+	char response[1024];
+	char tmp[16] = {0};
+	char plmn[16] = {0};
+	char *params[15];
+	int param_count = 0;
+	int i = 0;
+	char rsrp[16] = {0};
+	char cell_id[16] = {0};
+
+	executeCommand("at at+ZSINR 2>&1", response, sizeof(response));
+	const char *start = strstr(response, "+ZSINR: ");
+	if (start != NULL)
+	{
+		start += strlen("+ZSINR: ");
+		char *sinr = strtok((char *)start, ",");
+		if (atoi(sinr) == -20)
+		{
+			cfg_set("lte_sinr", "--");
+			web_feedback_header(wp);
+			(void)websWrite(wp, T("{\"%s\":\"%s\","), "lte_sinr", "--");
+		}
+		else
+		{
+			cfg_set("lte_sinr", sinr);
+			web_feedback_header(wp);
+			(void)websWrite(wp, T("{\"%s\":\"%s dB\","), "lte_sinr", sinr);
+		}
+	}
+	else
+	{
+		cfg_set("lte_sinr", "--");
+		web_feedback_header(wp);
+		(void)websWrite(wp, T("{\"%s\":\"%s\","), "lte_sinr", "--");
+	}
+
+	executeCommand("at at+ZEMSCIQ=1 2>&1", response, sizeof(response));
+	if (strstr(response, "+CME ERROR:") != NULL)
+	{
+		printf("----No network\n");
+		cfg_set("lte_plmn", "--");
+		cfg_set("lte_pci", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrp", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrq", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_plmn", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_cellid", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_pci", "--");
+		(void)websWrite(wp, T("\"%s\":\"%s\"}"), "lte_band", "--");
+	}
+	else
+	{
+		parse_at_response(response, params, &param_count, "+ZEMSCIQ: ", 12);
+		for (i = 0; i < param_count; i++)
+		{
+			printf("Parameter[%d]: %s\n", i, params[i]);
+		}
+		printf("======set lte_plmn=%s lte_pci=%s lte_band=%s lte_rsrq=%s\n", params[5], params[6], params[8], params[10]);
+		float db_value = get_rsrq_db_value(atoi(params[10]));
+		if (db_value == -1000.0)
+		{
+			cfg_set("lte_rsrq", " ");
+		}
+		else
+		{
+			sprintf(tmp, "%d", (int)db_value);
+			cfg_set("lte_rsrq", tmp);
+		}
+
+		snprintf(plmn, strlen(params[5]) - 1, "%s", params[5] + 1);
+		cfg_set("lte_plmn", plmn);
+		cfg_set("lte_pci", params[6]);
+		cfg_get_item("cell_id", cell_id, sizeof(cell_id));
+		cfg_get_item("lte_rsrp", rsrp, sizeof(rsrp));
+		if (strlen(rsrp) == 0)
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrp", "--");
+		}
+		else
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s dBm\","), "lte_rsrp", rsrp);
+		}
+		if (strlen(tmp) == 0)
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_rsrq", "--");
+		}
+		else
+		{
+			(void)websWrite(wp, T("\"%s\":\"%s dB\","), "lte_rsrq", tmp);
+		}
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_plmn", plmn);
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_cellid", cell_id);
+		(void)websWrite(wp, T("\"%s\":\"%s\","), "lte_band", params[8]);
+		(void)websWrite(wp, T("\"%s\":\"%s\"}"), "lte_pci", params[6]);
+	}
+
+	return;
+}
+
+void zte_goform_set_command(webs_t wp)
+{
+	MSG_BUF stMsg = {0};
+	SINT32 iMsgSize = sizeof(MSG_BUF) - sizeof(SINT32);
+	char buf[NV_ITEM_STRING_LEN_20] = {0};
+	char goform_id[256] = {0};
+	char value[128] = {0};
+	char *fromid = NULL;
+	char *arg = NULL;
+	char *tmp = NULL;
+	char *result[256] = {0};
+
+	fromid = strstr(wp->url, "goformId=");
+	if (fromid != NULL)
+	{
+		fromid += strlen("goformId=");
+		strncpy(goform_id, fromid, sizeof(goform_id) - 1);
+		tmp = strchr(goform_id, '=');
+		if (tmp != NULL)
+		{
+			*tmp = '\0';
+			arg = tmp + 1;
+			strncpy(value, arg, sizeof(value) - 1);
+			printf("value:%s\n", value);
+			if (value[0] != '[' || value[strlen(value) - 1] != ']')
+			{
+				snprintf(result, sizeof(result) - 1, "%s", "failure:Wrong format");
+				zte_write_result_to_web(wp, result);
+				return;
+			}
+			memset(value, 0, sizeof(value));
+			strcpy(value, arg + 1);
+			value[strlen(value) - 1] = '\0';
+			printf("url command is:%s\n", value);
+			url_decode(value);
+			snprintf(value + strlen(value), sizeof(value) - strlen(value) - 1, " 2>&1");
+			printf("new command is:%s\n", value);
+			// windows»á½«×ªÒå×Ö·û \ ±äΪ /           Ô¤ÆÚ    at "at+zflag=\"BOOT\",0" ʵ¼Ê at "at+zflag=/"BOOT/",0"
+			if (strstr(value, "/\"") != NULL)
+			{
+				replace_slash_with_backslash(value);
+				printf("replace value:%s\n", value);
+			}
+			executeCommand(value, result, sizeof(result));
+			printf("Command Output:\n%s\n", result);
+			zte_write_result_to_web(wp, result);
+			return;
+		}
+	}
+
+	zte_write_result_to_web(wp, FAILURE);
+	return;
+}
+
+#if 0
+
+/**********************************************************************
+* Function:         zte_get_fota_settings
+* Description:      to get fota  settings
+* Input:            wp:the web para;
+* Output:
+* Return:
+* Others:         add from uFi
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+*
+**********************************************************************/
+void zte_get_fota_settings(webs_t wp)
+{
+	zte_topsw_state_e_type status = ZTE_NVIO_MAX;
+
+	char_t updateMode[NV_ITEM_STRING_LEN_20] = {0};
+	char_t updateIntervalDay[NV_ITEM_STRING_LEN_20] = {0};
+	char_t allowRoamingUpdate[NV_ITEM_STRING_LEN_20] = {0};
+
+	status = zte_web_read("fota_allowRoamingUpdate", allowRoamingUpdate);
+	if (ZTE_NVIO_DONE != status) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	status = zte_web_read("fota_updateIntervalDay", updateIntervalDay);
+	if (ZTE_NVIO_DONE != status) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	status = zte_web_read("fota_updateMode", updateMode);
+	if (ZTE_NVIO_DONE != status) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	WEBLOG("zte_get_fota_settings:[updateMode] is [%s].\n", updateMode);
+	WEBLOG("zte_get_fota_settings:[updateIntervalDay] is [%s].\n", updateIntervalDay);
+	WEBLOG("zte_get_fota_settings:[allowRoamingUpdate] is [%s].\n", allowRoamingUpdate);
+
+	web_feedback_header(wp);
+	zte_rest_cmd_write_head(wp);
+
+	if ('\0' != *updateMode)
+		zte_rest_cmd_write(wp, "UpgMode", updateMode, 1);
+	else
+		zte_rest_cmd_write(wp, "UpgMode", "0", 1);
+
+	if ('\0' != *updateIntervalDay)
+		zte_rest_cmd_write(wp, "UpgIntervalDay", updateIntervalDay, 1);
+	else
+		zte_rest_cmd_write(wp, "UpgIntervalDay", "1", 1);
+
+	if ('\0' != *allowRoamingUpdate)
+		zte_rest_cmd_write(wp, "UpgRoamPermission", allowRoamingUpdate, 0);
+	else
+		zte_rest_cmd_write(wp, "UpgRoamPermission", "0", 0);
+
+	zte_rest_cmd_write_foot(wp);
+}
+
+
+/******************************************************
+* Function: zte_fota_get_update_info
+* Description: get fota update info
+* Input:  http request info
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2013/01/06        V1.0     chenyi        create
+*******************************************************/
+void zte_fota_get_update_info(webs_t wp)
+{
+	char version[NV_ITEM_STRING_LEN_64 + 1] = {0};
+
+	(void)zte_web_read(NV_FOTA_VERSION, version);
+
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"%s\":\"%s\"}"), FOTA_UPDATE_VERSION, version);
+}
+#endif
+
+void zte_wan_lock_frequency_process(webs_t wp)
+{
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_wan_lock_frequency_process coming");
+	CHAR *actionlte = NULL;
+	CHAR *uarfcnlte = NULL;
+	CHAR *cellParaIdlte = NULL;
+
+	/* get value from web page */
+	actionlte = websGetVar(wp, T("actionlte"), T(""));
+	uarfcnlte = websGetVar(wp, T("uarfcnlte"), T(""));
+	cellParaIdlte = websGetVar(wp, T("cellParaIdlte"), T(""));
+
+	cfg_set("actionlte", actionlte);
+	cfg_set("uarfcnlte", uarfcnlte);
+	cfg_set("cellParaIdlte", cellParaIdlte);
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_CELL_LOCK_REQ, 0, NULL, 0);
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+void zte_setLastLoginTime()
+{
+	int curr_time = 0;
+	char login_time[LOGIN_RECORD_TIME] = {0};
+	curr_time = zte_web_getCurrentTime();
+	sprintf(login_time, "%d", curr_time);
+	(void)zte_web_write(NV_LAST_LOGIN_TIME, login_time);
+}
+
+int zte_checkLoginTime()
+{
+	char last_record_time[LOGIN_RECORD_TIME] = {0};
+	int last_record_time_num = 0;
+	int curr_record_time_num = 0;
+	int lock_time = 0;
+	zte_web_read(NV_LAST_LOGIN_TIME, last_record_time);
+	last_record_time_num = atoi(last_record_time);
+    if(last_record_time_num < 0 || last_record_time_num >  INT_MAX-1)  // kw 3
+    {
+        last_record_time_num = 0;
+    }	
+
+	curr_record_time_num = zte_web_getCurrentTime();
+	lock_time = curr_record_time_num - last_record_time_num;
+	if (lock_time < LOGIN_FAIL_LOCK_TIME) {
+		return -1;
+	} else {
+		return 1;
+	}
+}
+
+void zte_reduct_login_times()
+{
+	char psw_fail_num_str[12] = {0};
+	int login_times = 0;
+	zte_web_read("psw_fail_num_str", psw_fail_num_str);
+	login_times = atoi(psw_fail_num_str);
+    if(login_times < 0 || login_times >  INT_MAX-1)  // kw 3
+    {
+        login_times = 0;
+    }
+
+	login_times--;
+	sprintf(psw_fail_num_str, "%d", login_times);
+	(void)zte_web_write("psw_fail_num_str", psw_fail_num_str);
+}
+/******************************************************
+* Function: void zte_password_check(webs_t wp)
+* Description:  password check when login
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+*
+*******************************************************/
+psw_check_result_type_t zte_password_check(webs_t wp, char* psw)
+{
+	int psw_len = 0;
+	int psw_fail_num = 0;
+	char psw_fail_num_str[10] = {0};
+	int check_lock = 0;
+
+	if (NULL == psw) {
+		slog(MISC_PRINT, SLOG_DEBUG, "zte_mgmt_login: psw is empty.");
+		return PSW_EMPTY;
+	}
+
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_mgmt_login:psw:%s", psw);
+	//don't foget add the nv psw_fail_num_str
+	zte_web_read("psw_fail_num_str", psw_fail_num_str);
+	psw_fail_num = atoi(psw_fail_num_str);
+	psw_len = strlen(psw);
+
+	if (0 == psw_len) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_mgmt_login: psw is empty.");
+		return PSW_EMPTY;
+	}
+
+	if (psw_fail_num <= 0) {
+		check_lock = zte_checkLoginTime(); // check the current time if it is time out
+		if (check_lock < 0) {
+			slog(MISC_PRINT, SLOG_ERR, "zte_mgmt_login: psw number use out.");
+			return PSW_TIME_OUT;
+//		} else if (check_lock > 0) { // kw 3
+		}else{
+			slog(MISC_PRINT, SLOG_DEBUG, "zte_mgmt_login: login time out, can login.");
+			(void)zte_web_write("psw_fail_num_str", LOGIN_FAIL_TIMES);
+		}
+	}
+	zte_setLastLoginTime();  //record current time to nv
+	if (LOGIN_PSW_MIN_LEN > psw_len || LOGIN_PSW_MAX_LEN < psw_len) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_mgmt_login: psw is too long.");
+		return PSW_TOO_LONG;
+	} else {
+		return PSW_OK;
+	}
+}
+
+void zte_get_ddns_status(webs_t wp)
+{
+	char * line = NULL;
+	size_t len = 0;
+	int lsize = 0; //klocwork
+	char path_conf[100] = {0};
+	char path_file[500] = {0};
+	cfg_get_item("path_conf", path_conf, sizeof(path_conf));
+	sprintf(path_file, "%s/inadyn.status", path_conf);
+	FILE *proc_file = fopen(path_file, "r");
+
+	if (proc_file == NULL) {
+		//websWrite(wp, T("4"));
+		websWrite(wp, T("{\"%s\":\"%s\"}"), "getddns_status", "4");
+		return;
+	}
+	if ((lsize = getline(&line, &len, proc_file)) != -1 && line) {
+		if (strstr(line, "RC_IP_INVALID_REMOTE_ADDR")) {
+			//websWrite(wp, T("2"));
+			websWrite(wp, T("{\"%s\":\"%s\"}"), "getddns_status", "2");
+		} else if (strstr(line, "RC_DYNDNS_RSP_NOTOK")) {
+			//websWrite(wp, T("1"));
+			websWrite(wp, T("{\"%s\":\"%s\"}"), "getddns_status", "1");
+		} else if (strstr(line, "RC_OK")) {
+			//websWrite(wp, T("0"));
+			websWrite(wp, T("{\"%s\":\"%s\"}"), "getddns_status", "0");
+		} else if (strstr(line, "RC_REGISTERING")) {
+			//websWrite(wp, T("3"));
+			websWrite(wp, T("{\"%s\":\"%s\"}"), "getddns_status", "3");
+		} else {
+			//websWrite(wp, T("5"));
+			websWrite(wp, T("{\"%s\":\"%s\"}"), "getddns_status", "5");
+		}
+	} else {
+		//websWrite(wp, T("-1"));
+		websWrite(wp, T("{\"%s\":\"%s\"}"), "getddns_status", "-1");
+	}
+	if (line) {
+		free(line);
+	}
+	fclose(proc_file);
+	return;
+
+}
+
+void zte_goform_set_work_type(webs_t wp)
+{
+	char_t *work_type = NULL;
+	work_type = websGetVar(wp, T("work_type"), T(""));
+
+	slog(MISC_PRINT, SLOG_DEBUG,"[zyl]zte_goform_set_work_type:work_type->%s\n", work_type);
+
+	if (work_type == NULL) {
+		slog(MISC_PRINT, SLOG_ERR,"[zyl]zte_goform_set_work_type:empty!\n");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	if ((strncmp(work_type, "0", 1) == 0) || (strncmp(work_type, "1", 1) == 0)) {
+		char LanEnable[5] = {0};
+		(void)zte_web_read("LanEnable", LanEnable);
+		if (strncmp(LanEnable, work_type, 1) == 0) {
+			return zte_write_result_to_web(wp, SUCCESS);
+		}
+		(void)zte_web_write("LanEnable", work_type);
+		slog(MISC_PRINT, SLOG_DEBUG,"[zyl]zte_goform_set_work_type:work_type->%s\n", work_type);
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL, 0);
+		slog(MISC_PRINT, SLOG_NORMAL,"[zyl]zte_goform_set_work_type:device reboot now\n");
+		zte_write_result_to_web(wp, SUCCESS);
+		return;
+	} else {
+		slog(MISC_PRINT, SLOG_ERR,"[zyl]zte_goform_set_work_type:work_type->%s error!\n", work_type);
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+}
+
+/******************************************************
+* Function: void zte_goform_set_sample(webs_t wp)
+* Description:  example function
+* Input:  HTTP page info
+* Output:
+* Return:  none
+* Others:
+* Modify Date    Version   Author         Modification
+*
+*******************************************************/
+void zte_goform_set_sample(webs_t wp)
+{
+	//´ÓWEBÇëÇóÖлñÈ¡²ÎÊý,ûÓвÎÊýÔò²»ÐèÒªÕâÒ»²½
+
+	// ÉèÖÃNV»ò·¢ÏûÏ¢¸øÏàӦģ¿é
+	//ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_PDP_ACT_REQ, 0, NULL, 0);
+
+	//·µ»ØJSON ¸ñʽ½á¹û£¬Èç¹ûÐèÒª²éѯÉèÖýá¹ûÔòÐèÒªwebuiͨ¹ý»ñÈ¡ppp_statusÕâ¸öNVÖµÀ´»ñÈ¡
+	zte_write_result_to_web(wp, SUCCESS);
+	return;
+}
+
+//bsim
+static int bs_string2bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
+{
+    int i=0;
+
+    //УÑé²ÎÊý
+    if(pSrc ==  NULL || pDst == NULL || nSrcLength < 0)
+    {
+        return -1;
+    }
+
+    for(i = 0; i < nSrcLength; i += 2)
+    {
+        // Êä³ö¸ß4λ
+        if(*pSrc >= '0' && *pSrc <= '9')
+        {
+            *pDst = (*pSrc - '0') << 4;
+        }
+        else
+        {
+            *pDst = ((toupper(*pSrc) - 'A') + 10) << 4;
+        }
+
+        pSrc++;
+
+        // Êä³öµÍ4λ
+        if(*pSrc >= '0' && *pSrc <= '9')
+        {
+            *pDst |= *pSrc - '0';
+        }
+        else
+        {
+            *pDst |= (toupper(*pSrc) - 'A') + 10;
+        }
+
+        pSrc++;
+        pDst++;
+    }
+
+    // ·µ»ØÄ¿±êÊý¾Ý³¤¶È
+    return nSrcLength / 2;
+}
+
+static int bs_bytes2string(const unsigned char* pSrc, char* pDst, int nSrcLength)
+{
+    const char tab[]="0123456789ABCDEF";	// 0x0-0xfµÄ×Ö·û²éÕÒ±í
+    int i = 0;
+
+    //УÑé²ÎÊý
+    if(pSrc ==  NULL || pDst == NULL || nSrcLength < 0)
+    {
+        return -1;
+    }
+
+    for(i=0; i<nSrcLength; i++)
+    {
+        *pDst++ = tab[*pSrc >> 4];		// Êä³öµÍ4λ
+        *pDst++ = tab[*pSrc & 0x0f];	// Êä³ö¸ß4λ
+        pSrc++;
+    }
+
+    // ·µ»ØÄ¿±ê×Ö·û´®³¤¶È
+    return nSrcLength * 2;
+}
+
+static int bs_aes_init_key(unsigned char *aes_key, int k_len)
+{
+	int efuse_fd = -1;
+	T_ZDrvEfuse_Secure efuse = {0};
+
+	memset(&efuse, 0, sizeof(efuse));
+	efuse_fd = open("/dev/efuse", O_RDWR);
+	if (efuse_fd < 0) {
+		printf("wifi_aes_init_key efuse open errno=%d\n", errno);
+		return 0;
+	}
+	if(ioctl(efuse_fd , EFUSE_GET_DATA, &efuse) != 0) {
+		printf("wifi_aes_init_key efuse ioctl errno=%d\n", errno);
+		close(efuse_fd);
+		return 0;
+	}
+	close(efuse_fd);
+	memcpy(aes_key, efuse.pubKeyHash, k_len);
+
+	return 1;
+}
+
+static int bs_aes_encrypt(char* in, int len, char* out, unsigned char* key, int key_len)
+{
+    if (!in || !out || !key || len <=0 || (len%AES_BLOCK_SIZE)!=0 || (key_len!=16 && key_len!=24 && key_len!=32)) {
+		printf("bs_aes_encrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);
+        return 0;
+    }
+
+    AES_KEY aes = {0}; //cov h
+    if (AES_set_encrypt_key(key, key_len*8, &aes) < 0) {
+		printf("bs_aes_encrypt AES_set_encrypt_key err\n");
+        return 0;
+    }
+
+    int en_len = 0;
+    while (en_len < len) {
+        AES_encrypt((unsigned char*)in, (unsigned char*)out, &aes);
+        in	+= AES_BLOCK_SIZE;
+        out += AES_BLOCK_SIZE;
+        en_len += AES_BLOCK_SIZE;
+    }
+
+    return 1;
+}
+
+static int bs_aes_decrypt(char* in, int len, char* out, char* key, int key_len)
+{
+    if (!in || !out || !key || len <=0 || (len%AES_BLOCK_SIZE)!=0 || (key_len!=16 && key_len!=24 && key_len!=32)) {
+		printf("bs_aes_decrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);
+        return 0;
+    }
+
+    AES_KEY aes = {0}; //cov h
+    if (AES_set_decrypt_key((unsigned char*)key, key_len*8, &aes) < 0) {
+		printf("bs_aes_decrypt AES_set_decrypt_key err\n");
+        return 0;
+    }
+
+    int en_len = 0;
+    while (en_len < len) {
+        AES_decrypt((unsigned char*)in, (unsigned char*)out, &aes);
+        in	+= AES_BLOCK_SIZE;
+        out += AES_BLOCK_SIZE;
+        en_len += AES_BLOCK_SIZE;
+    }
+
+    return 1;
+}
+
+static int bs_aes_cbc_encrypt(char* in, int len, char* out, unsigned char* key, int key_len)
+{
+    if (!in || !out || !key || len <=0 || (len%AES_BLOCK_SIZE)!=0 || (key_len!=16 && key_len!=24 && key_len!=32)) {
+		printf("bs_aes_encrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);
+        return 0;
+    }
+
+    AES_KEY aes = {0}; //cov h
+    if (AES_set_encrypt_key(key, key_len*8, &aes) < 0) {
+		printf("bs_aes_encrypt AES_set_encrypt_key err\n");
+        return 0;
+    }
+
+	unsigned char iv[AES_BLOCK_SIZE] = {0};
+	memcpy(iv, key, AES_BLOCK_SIZE);
+
+    AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, 
+			&aes, iv, AES_ENCRYPT);
+
+
+    return 1;
+}
+
+static int bs_aes_cbc_decrypt(char* in, int len, char* out, char* key, int key_len)
+{
+    if (!in || !out || !key || len <=0 || (len%AES_BLOCK_SIZE)!=0 || (key_len!=16 && key_len!=24 && key_len!=32)) {
+		printf("bs_aes_decrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);
+        return 0;
+    }
+
+    AES_KEY aes = {0}; //cov h
+    if (AES_set_decrypt_key((unsigned char*)key, key_len*8, &aes) < 0) {
+		printf("bs_aes_decrypt AES_set_decrypt_key err\n");
+        return 0;
+    }
+
+	unsigned char iv[AES_BLOCK_SIZE] = {0};
+	memcpy(iv, key, AES_BLOCK_SIZE);
+
+    AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, 
+			&aes, iv, AES_DECRYPT);
+
+    return 1;
+}
+
+
+static int apn_profile_encrypt_code(char *w_code, int len, char *b_aes, char *s_aes)
+{
+	bs_aes_encrypt(w_code, len, b_aes, web_aes_key, sizeof(web_aes_key));
+	bs_bytes2string(b_aes, s_aes, len);
+
+	printf("encrypt apn_profile w_code=%s, s_aes=%s\n", w_code, s_aes);
+
+	return 1;
+}
+
+void set_apn_prof_aes_by_index(int index, APN_PROFILE *profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+
+	if (NULL == profile) {
+		return;
+	}
+
+	sprintf(cfg_name, "APN_config%d", index);
+	if (0 == strcmp(profile->pdp_type, "IPv6")) {
+		snprintf(cfg_value, APNCONFIG_MEMORY,
+				 "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+				 profile->profile_name,
+				 "",
+				 "",
+				 "",
+				 "",
+				 "",
+				 "",
+				 "",
+				 "",
+				 "",
+				 "",
+				 "",
+				 "");
+	} else {
+		char ppp_aes[PROFILE_APN_AES_LEN] = {0};
+		char ppp_aes_b[PROFILE_APN_LEN - 1] = {0};
+		apn_profile_encrypt_code(profile->ppp_passwd, PROFILE_APN_LEN - 1 , ppp_aes_b, ppp_aes);
+		snprintf(cfg_value, APNCONFIG_MEMORY,
+				 "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+				 profile->profile_name,
+				 profile->apn_name,
+				 profile->apn_select,
+				 profile->dial_num,
+				 profile->ppp_auth_mode,
+				 profile->ppp_username,
+				 ppp_aes,//profile->ppp_passwd,
+				 profile->pdp_type,
+				 profile->pdp_select,
+				 profile->pdp_addr,
+				 profile->dns_mode,
+				 profile->prefer_dns_manual,
+				 profile->standby_dns_manual);
+	}
+	cfg_set(cfg_name, cfg_value);
+
+	return;
+}
+
+void set_ipv6_apn_prof_aes_by_index(int index, IPV6_APN_PROFILE *profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+
+	if (NULL == profile) {
+		return;
+	}
+
+	sprintf(cfg_name, "ipv6_APN_config%d", index);
+	if (0 == strcmp(profile->pdp_type, "IP")) {
+		slog(MISC_PRINT, SLOG_DEBUG, "pdp_type=IP  cpsnprintf "); /*lint !e26*/
+		snprintf(cfg_value, APNCONFIG_MEMORY,
+		         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+		         profile->profile_name,
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "",
+		         "");
+	} else {
+		char ppp_aes[PROFILE_APN_AES_LEN] = {0};
+		char ppp_aes_b[PROFILE_APN_LEN - 1] = {0};
+		apn_profile_encrypt_code(profile->ppp_passwd, PROFILE_APN_LEN - 1 , ppp_aes_b, ppp_aes);
+		slog(MISC_PRINT, SLOG_DEBUG, "pdp_type=else  cpsnprintf "); /*lint !e26*/
+		slog(MISC_PRINT, SLOG_DEBUG, "profile->profile_name=%s ", profile->profile_name); /*lint !e26*/
+		snprintf(cfg_value, APNCONFIG_MEMORY,
+		         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+		         profile->profile_name,
+		         profile->apn_name,
+		         profile->apn_select,
+		         profile->dial_num,
+		         profile->ppp_auth_mode,
+		         profile->ppp_username,
+		         ppp_aes,//profile->ppp_passwd,
+		         profile->pdp_type,
+		         profile->pdp_select,
+		         profile->pdp_addr,
+		         profile->dns_mode,
+		         profile->prefer_dns_manual,
+		         profile->standby_dns_manual);
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "cfg_value=%s", cfg_value); /*lint !e26*/
+	cfg_set(cfg_name, cfg_value);
+
+	return;
+}
+
+void set_ipv4v6_apn_prof_aes_by_index(int index, APN_PROFILE *profile, IPV6_APN_PROFILE *ipv6profile)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+	char ppp_aes[PROFILE_APN_AES_LEN] = {0};
+	char ppp_aes_b[PROFILE_APN_LEN - 1] = {0};
+
+	if (NULL == profile) {
+		return;
+	}
+
+	sprintf(cfg_name, "APN_config%d", index);
+	apn_profile_encrypt_code(profile->ppp_passwd, PROFILE_APN_LEN - 1 , ppp_aes_b, ppp_aes);	
+	snprintf(cfg_value, APNCONFIG_MEMORY,
+	         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+	         profile->profile_name,
+	         profile->apn_name,
+	         profile->apn_select,
+	         profile->dial_num,
+	         profile->ppp_auth_mode,
+	         profile->ppp_username,
+	         ppp_aes,//profile->ppp_passwd,
+	         profile->pdp_type,
+	         profile->pdp_select,
+	         profile->pdp_addr,
+	         profile->dns_mode,
+	         profile->prefer_dns_manual,
+	         profile->standby_dns_manual);
+	cfg_set(cfg_name, cfg_value);
+
+	memset(cfg_name, 0, sizeof(cfg_name));
+	memset(cfg_value, 0, sizeof(cfg_value));
+	memset(ppp_aes, 0, sizeof(ppp_aes));
+	memset(ppp_aes_b, 0, sizeof(ppp_aes_b));
+	sprintf(cfg_name, "ipv6_APN_config%d", index);
+	apn_profile_encrypt_code(ipv6profile->ppp_passwd, PROFILE_APN_LEN - 1 , ppp_aes_b, ppp_aes);	
+	snprintf(cfg_value, APNCONFIG_MEMORY,
+	         "%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)%s($)",
+	         ipv6profile->profile_name,
+	         ipv6profile->apn_name,
+	         ipv6profile->apn_select,
+	         ipv6profile->dial_num,
+	         ipv6profile->ppp_auth_mode,
+	         ipv6profile->ppp_username,
+	         ppp_aes,//ipv6profile->ppp_passwd,
+	         ipv6profile->pdp_type,
+	         ipv6profile->pdp_select,
+	         ipv6profile->pdp_addr,
+	         ipv6profile->dns_mode,
+	         ipv6profile->prefer_dns_manual,
+	         ipv6profile->standby_dns_manual);
+	cfg_set(cfg_name, cfg_value);
+
+	return;
+}
+
+//APN_config0~n
+static void apn_decode_profile_by_index(int index)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+	char ppp_aes[PROFILE_APN_AES_LEN] = {0};
+	char b_aes[PROFILE_APN_LEN] = {0};
+	//char ppp_s[PROFILE_APN_LEN] = {0};
+	char *pos_begin = NULL;
+	APN_PROFILE profile = {0};
+
+	sprintf(cfg_name, "APN_config%d", index);
+	cfg_get_item(cfg_name, cfg_value, sizeof(cfg_value));
+	if (strlen(cfg_value) == 0)
+		return;
+	pos_begin = cfg_value;
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.profile_name, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.apn_name, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.apn_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.dial_num, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.ppp_auth_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.ppp_username, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", ppp_aes, PROFILE_APN_AES_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.pdp_type, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.pdp_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.pdp_addr, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.dns_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.prefer_dns_manual, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.standby_dns_manual, PROFILE_MEMBER_LEN);
+
+	if (strlen(ppp_aes) == (PROFILE_APN_AES_LEN - 1)) {
+		bs_string2bytes(ppp_aes, b_aes, PROFILE_APN_AES_LEN - 1);
+		bs_aes_decrypt(b_aes, PROFILE_APN_LEN - 1, profile.ppp_passwd, web_aes_key, sizeof(web_aes_key));
+//		printf("decrypt ppp_tmp[%d]=%s\n", index, profile.ppp_passwd);
+	} else if (strlen(ppp_aes) > 0){
+		//fotaÉý¼¶À´µÄÃ÷ÎÄ
+		strncpy(profile.ppp_passwd, ppp_aes,sizeof(profile.ppp_passwd)-1);
+		set_apn_prof_aes_by_index(index, &profile);
+//		printf("decrypt fota ppp_tmp[%d]=%s\n", index, profile.ppp_passwd);
+	}
+
+	set_apn_profile_by_index(index, &profile);
+
+	return;
+}
+
+static void ipv6apn_decode_profile_by_index(int index)
+{
+	char cfg_name[PROFILE_MEMBER_LEN] = {0};
+	char cfg_value[APNCONFIG_MEMORY] = {0};
+	char ppp_aes[PROFILE_APN_AES_LEN] = {0};
+	char b_aes[PROFILE_APN_LEN] = {0};
+	char *pos_begin = NULL;
+	IPV6_APN_PROFILE profile = {0};
+
+
+	sprintf(cfg_name, "ipv6_APN_config%d", index);
+	cfg_get_item(cfg_name, cfg_value, sizeof(cfg_value));
+	if (strlen(cfg_value) == 0)
+		return;
+	pos_begin = cfg_value;
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.profile_name, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.apn_name, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.apn_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.dial_num, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.ppp_auth_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.ppp_username, PROFILE_APN_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", ppp_aes, PROFILE_APN_AES_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.pdp_type, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.pdp_select, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.pdp_addr, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.dns_mode, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.prefer_dns_manual, PROFILE_MEMBER_LEN);
+	pos_begin = split_str_by_sep(pos_begin, "($)", profile.standby_dns_manual, PROFILE_MEMBER_LEN);
+
+	if (strlen(ppp_aes) == (PROFILE_APN_AES_LEN - 1)) {
+		bs_string2bytes(ppp_aes, b_aes, PROFILE_APN_AES_LEN - 1);
+		bs_aes_decrypt(b_aes, PROFILE_APN_LEN - 1, profile.ppp_passwd, web_aes_key, sizeof(web_aes_key));
+//		printf("decrypt ppp_v6tmp[%d]=%s\n", index, profile.ppp_passwd);
+	} else if (strlen(ppp_aes) > 0){
+		//fotaÉý¼¶À´µÄÃ÷ÎÄ
+		strncpy(profile.ppp_passwd, ppp_aes,sizeof(profile.ppp_passwd)-1);
+		set_ipv6_apn_prof_aes_by_index(index, &profile);
+//		printf("decrypt fota ppp_v6tmp[%d]=%s\n", index, profile.ppp_passwd);
+	}
+	set_ipv6_apn_profile_by_index(index, &profile);
+
+	return;
+}
+
+static int apn_profile_decrypt_code(void)
+{
+	int index = 0;//APN_config0ÊÇDefault,¿É²»´¦Àí?
+
+	for (index = 0; index < APNCONFIG_NUM_MAX; index++) {
+		apn_decode_profile_by_index(index);
+		ipv6apn_decode_profile_by_index(index);
+	} 
+
+	return 1;
+}
+
+int apn_encrypt_code(void)
+{
+	char w_code[PROFILE_APN_LEN] = {0};
+	char b_aes[PROFILE_APN_LEN] = {0};
+	char s_aes[PROFILE_APN_AES_LEN] = {0};
+
+	cfg_get_item("ppp_passtmp", w_code, sizeof(w_code));
+	bs_aes_encrypt(w_code, PROFILE_APN_LEN - 1, b_aes, web_aes_key, sizeof(web_aes_key));
+	bs_bytes2string(b_aes, s_aes, PROFILE_APN_LEN - 1);
+	cfg_set("ppp_passwd", s_aes);
+	printf("apn_encrypt_code w_code=%s, s_aes=%s\n", w_code, s_aes);
+
+	return 1;
+}
+
+int ipv6apn_encrypt_code(void)
+{
+	char w_code[PROFILE_APN_LEN] = {0};
+	char b_aes[PROFILE_APN_LEN] = {0};
+	char s_aes[PROFILE_APN_AES_LEN] = {0};
+
+	cfg_get_item("ipv6_ppp_passtmp", w_code, sizeof(w_code));
+	bs_aes_encrypt(w_code, PROFILE_APN_LEN - 1, b_aes, web_aes_key, sizeof(web_aes_key));
+	bs_bytes2string(b_aes, s_aes, PROFILE_APN_LEN - 1);
+	cfg_set("ipv6_ppp_passwd", s_aes);
+	printf("ipv6apn_encrypt_code w_code=%s, s_aes=%s\n", w_code, s_aes);
+
+	return 1;
+}
+#if 0
+//2±íʾfota´ÓÀϰ汾ÍùÉÏÉý¼¶£¬ppp_password´æµÄÊÇÃ÷ÎÄÃÜÂ룬а汾ÊÇÃÜÎÄ
+static int apn_decrypt_code(void)
+{
+	char w_code[PROFILE_APN_LEN]= {0};
+	char b_aes[PROFILE_APN_LEN] = {0};
+	char s_aes[PROFILE_APN_AES_LEN] = {0};
+	int flag = 0;
+
+	cfg_get_item("ppp_passwd", s_aes, sizeof(s_aes));
+	if (strlen(s_aes) == (PROFILE_APN_AES_LEN - 1)) {
+		bs_string2bytes(s_aes, b_aes, PROFILE_APN_AES_LEN - 1);
+		bs_aes_decrypt(b_aes, PROFILE_APN_LEN - 1, w_code, web_aes_key, sizeof(web_aes_key));
+		cfg_set("ppp_passtmp", w_code);
+		printf("apn_decrypt_code w_code=%s, s_aes=%s\n", w_code, s_aes);
+	} else if (strlen(s_aes) > 0){
+		cfg_set("ppp_passtmp", s_aes);
+		return 2;
+	}
+
+	return 1;
+}
+
+static int ipv6apn_decrypt_code(void)
+{
+	char w_code[PROFILE_APN_LEN]= {0};
+	char b_aes[PROFILE_APN_LEN] = {0};
+	char s_aes[PROFILE_APN_AES_LEN] = {0};
+	int flag = 0;
+
+	cfg_get_item("ipv6_ppp_passwd", s_aes, sizeof(s_aes));
+	if (strlen(s_aes) == (PROFILE_APN_AES_LEN - 1)) {
+		bs_string2bytes(s_aes, b_aes, PROFILE_APN_AES_LEN - 1);
+		bs_aes_decrypt(b_aes, PROFILE_APN_LEN - 1, w_code, web_aes_key, sizeof(web_aes_key));
+		cfg_set("ipv6_ppp_passtmp", w_code);
+		printf("apn_decrypt_code w_code=%s, s_aes=%s\n", w_code, s_aes);
+	} else if (strlen(s_aes) > 0){
+		cfg_set("ipv6_ppp_passtmp", s_aes);
+		return 2;
+	}
+
+	return 1;
+}
+#endif
+#ifdef WEBS_SECURITY
+static void js_aes_wifi_encode(void)
+{	
+	char js_aes_key[24 + 1]={0};
+	char imei_buf[15 + 1] = {0};
+	char rnum_buf[9 + 1] = {0};
+
+	char wificode[WIFI_PSW_DEFAULT_LENGTH] = {0};
+	char b_aes[WIFI_PSW_DEFAULT_LENGTH] = {0};
+	char *basestr = NULL;
+
+	cfg_get_item("imei", imei_buf, sizeof(imei_buf));
+	cfg_get_item("rnum_js", rnum_buf, sizeof(rnum_buf));
+	snprintf(js_aes_key, sizeof(js_aes_key), "%s%sFFFFFFFFFFFFFFF", rnum_buf, imei_buf);
+
+	cfg_get_item("WPAPSK1", wificode, sizeof(wificode));
+	bs_aes_cbc_encrypt(wificode, sizeof(wificode)-1, b_aes, js_aes_key, sizeof(js_aes_key)-1);
+	basestr = zte_base64_encode(b_aes, sizeof(b_aes)-1);
+	if (NULL == basestr) {
+		slog(MISC_PRINT, SLOG_ERR, "basestr is NULL.\n");/*lint !e26*/
+		return;
+	}
+	(void)zte_web_write("WPAPSK1_enaes", basestr);
+	free(basestr);
+	basestr = NULL;
+
+	memset(wificode, 0, sizeof(wificode));
+	cfg_get_item("m_WPAPSK1", wificode, sizeof(wificode));
+	bs_aes_cbc_encrypt(wificode, sizeof(wificode)-1, b_aes, js_aes_key, sizeof(js_aes_key)-1);
+	basestr = zte_base64_encode(b_aes, sizeof(b_aes)-1);
+	if (NULL == basestr) {
+		slog(MISC_PRINT, SLOG_ERR, "basestr-m is NULL.\n");/*lint !e26*/
+		return;
+	}
+	(void)zte_web_write("m_WPAPSK1_enaes", basestr);
+	free(basestr);
+	basestr = NULL;
+
+}
+
+
+static void js_aes_rand(void)
+{
+    char rstr[10] = {0};
+    unsigned int rnum = 0;
+
+    srand( (unsigned)time( NULL ) );
+    rnum = rand();
+    rnum %= 1000000000;   
+
+    snprintf((char *)rstr, sizeof(rstr), "%09ld", rnum);        
+    cfg_set("rnum_js", rstr);
+}
+//cbc
+char *js_aes_decode(char *src, size_t len, size_t *out_len)
+{
+	unsigned char *aes_password = NULL;
+	size_t aes_len = 0;
+
+	char *out = NULL;
+
+	char js_aes_key[24 + 1]={0};
+	char imei_buf[15 + 1] = {0};
+	char rnum_buf[9 + 1] = {0};
+
+	aes_password = (char *)zte_base64_decode((const unsigned char *)src, len, (unsigned int*)&aes_len);
+	if (aes_password == NULL)
+		return NULL;
+
+
+	out = malloc(aes_len + 1);
+	if (out == NULL) {
+		free(aes_password);
+		return NULL;
+	}
+	memset(out, 0, aes_len + 1);
+
+	cfg_get_item("imei", imei_buf, sizeof(imei_buf));
+	cfg_get_item("rnum_js", rnum_buf, sizeof(rnum_buf));
+	snprintf(js_aes_key, sizeof(js_aes_key), "%s%sFFFFFFFFFFFFFFF", rnum_buf, imei_buf);
+
+	bs_aes_cbc_decrypt(aes_password, aes_len, out, js_aes_key, sizeof(js_aes_key)-1);
+	//printf("decrypt js_aes_decode[%d]=%s\n", aes_len, out);
+
+	free(aes_password);
+
+	if (strlen(out) > aes_len) {
+		free(out);
+		return NULL;
+	}
+
+	*out_len = strlen(out);
+
+	return out;
+}
+#endif
+int web_aes_init(void)
+{
+	bs_aes_init_key(web_aes_key, sizeof(web_aes_key));
+	apn_profile_decrypt_code();
+#ifdef WEBS_SECURITY
+	js_aes_rand();
+#endif
+	return 1;
+}
+
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_mgmt.h b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_mgmt.h
new file mode 100755
index 0000000..7ffc4c7
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_mgmt.h
@@ -0,0 +1,125 @@
+/************************************************************************
+* °æÈ¨ËùÓÐ (C)2010, ÉîÛÚÊÐÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+*
+* ÎļþÃû³Æ£º zte_web_mgmt.h
+* Îļþ±êʶ£º
+* ÄÚÈÝÕªÒª£º
+* ÆäËü˵Ã÷£º
+* µ±Ç°°æ±¾£º V0.1
+* ×÷    Õߣº zyt
+* Íê³ÉÈÕÆÚ£º 2010-11-24
+*
+* Ð޸ļǼ1£º
+* ÐÞ¸ÄÄÚÈÝ£º³õʼ°æ±¾
+************************************************************************/
+
+#ifndef ZTE_WEB_MGMT_H
+#define ZTE_WEB_MGMT_H
+
+#define APNCONFIG_MEMORY 1024
+#define PROFILE_MEMBER_LEN 32
+#define PROFILE_APN_LEN 65
+#define PROFILE_APN_AES_LEN 129
+#define DAYSEC 86400
+#define COMMONYEARSEC 31536000
+#define LEAPYEARSEC 31622400
+#define JAN_2000   946684791
+typedef struct tag_APN_PROFILE {
+	char profile_name[PROFILE_MEMBER_LEN];
+	char apn_name[PROFILE_APN_LEN];
+	char apn_select[PROFILE_MEMBER_LEN];
+	char dial_num[PROFILE_MEMBER_LEN];
+	char ppp_auth_mode[PROFILE_MEMBER_LEN];
+	char ppp_username[PROFILE_APN_LEN];
+	char ppp_passwd[PROFILE_APN_LEN];
+	char pdp_type[PROFILE_MEMBER_LEN];
+	char pdp_select[PROFILE_MEMBER_LEN];
+	char pdp_addr[PROFILE_MEMBER_LEN];
+	char dns_mode[PROFILE_MEMBER_LEN];
+	char prefer_dns_manual[PROFILE_MEMBER_LEN];
+	char standby_dns_manual[PROFILE_MEMBER_LEN];
+} APN_PROFILE;
+
+
+typedef struct tag_IPv6_APN_PROFILE {
+	char profile_name[PROFILE_MEMBER_LEN];
+	char apn_name[PROFILE_APN_LEN];
+	char apn_select[PROFILE_MEMBER_LEN];
+	char dial_num[PROFILE_MEMBER_LEN];
+	char ppp_auth_mode[PROFILE_MEMBER_LEN];
+	char ppp_username[PROFILE_APN_LEN];
+	char ppp_passwd[PROFILE_APN_LEN];
+	char pdp_type[PROFILE_MEMBER_LEN];
+	char pdp_select[PROFILE_MEMBER_LEN];
+	char pdp_addr[PROFILE_MEMBER_LEN];
+	char dns_mode[PROFILE_MEMBER_LEN];
+	char prefer_dns_manual[PROFILE_MEMBER_LEN];
+	char standby_dns_manual[PROFILE_MEMBER_LEN];
+} IPV6_APN_PROFILE;
+
+
+/* management */
+extern void zte_mgmt_login(webs_t wp);//11
+extern void zte_mgmt_logout(webs_t wp);//11
+extern void zte_mgmt_set_language(webs_t wp);//11
+extern void zte_mgmt_restore(webs_t wp);//11
+extern void zte_mgmt_poweroff(webs_t wp);
+extern void zte_mgmt_control_power_on_speed(webs_t wp);
+extern void zte_mgmt_change_password(webs_t wp);//11
+extern void zte_mgmt_change_account(webs_t wp);//
+extern void zte_goform_mgmt_set_not_login_process(webs_t wp);
+extern void zte_mgmt_disable_pin(webs_t wp);//11
+extern void zte_mgmt_pin_input(webs_t wp);//11
+extern void zte_mgmt_puk_input(webs_t wp);//11
+extern void zte_mgmt_auto_pin(webs_t wp);
+extern void zte_mgmt_pin_enable_or_modify(webs_t wp);//11
+extern void zte_mgmt_unlock_network(webs_t wp);//11
+extern void zte_goform_mgmt_pin_mgmt_process(webs_t wp);
+extern void zte_quick_setup(webs_t wp);//11
+//extern void zte_quick_set_first(webs_t wp);//11
+void deal_quick_setup_apn_ex(webs_t wp);
+extern void zte_mgmt_set_devicemode(webs_t wp);
+
+extern void zte_goform_mgmt_schedule_setting_process(webs_t wp);
+
+extern void zte_goform_mgmt_sntp_process(webs_t wp);
+
+
+extern void zte_goform_mgmt_reboot_process(webs_t wp);
+extern void zte_goform_mgmt_syslog_process(webs_t wp);
+
+extern void get_autoapn_profile(APN_PROFILE *apn_profile);
+extern void get_apn_profile_by_index(int index, APN_PROFILE *profile);
+extern void get_ipv6apn_profile_by_index(int index, IPV6_APN_PROFILE *ipv6profile);
+extern void get_ipv4v6apn_profile_by_index(int index, APN_PROFILE *profile, IPV6_APN_PROFILE *ipv6profile);
+extern void get_autoapn_profile(APN_PROFILE *profile);
+extern void set_apn_profile_by_index(int index, APN_PROFILE *profile);
+extern void set_ipv6_apn_profile_by_index(int index, IPV6_APN_PROFILE *ipv6profile);
+extern void set_ipv4v6_apn_profile_by_index(int index, APN_PROFILE *profile, IPV6_APN_PROFILE *ipv6profile);
+extern void set_apn_prof_aes_by_index(int index, APN_PROFILE *profile);
+extern void set_ipv6_apn_prof_aes_by_index(int index, IPV6_APN_PROFILE *profile);
+extern void set_ipv4v6_apn_prof_aes_by_index(int index, APN_PROFILE *profile, IPV6_APN_PROFILE *ipv6profile);
+extern int apn_encrypt_code(void);
+extern int ipv6apn_encrypt_code(void);
+
+extern void zte_wan_lock_frequency_process(webs_t wp);
+
+extern int manual_set_time();
+
+extern void getdialog_url(int eid, webs_t wp, int argc, char_t **argv);
+extern void getddns_status(int eid, webs_t wp, int argc, char_t **argv);
+extern char * timei2s(int);
+extern void timeen2ch(char *);
+extern void datastatic(char *, char *, char *, char *, char *);
+
+extern int zte_fota_notifyPushMsg(int cmd);
+
+extern void zte_fota_get_upgrade_result(webs_t wp);
+extern void zte_fota_get_dp_pack_info(webs_t wp);
+extern void zte_fota_get_update_info(webs_t wp);
+//extern void zte_fota_get_dm_last_check_time(webs_t wp);
+#ifdef WEBS_SECURITY
+extern char *js_aes_decode(char *src, size_t len, size_t *out_len);
+#endif
+#endif
+
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_pbm.c b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_pbm.c
new file mode 100755
index 0000000..a58d0a5
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_pbm.c
@@ -0,0 +1,965 @@
+/************************************************************************
+* °æÈ¨ËùÓÐ (C)2010, ÉîÛÚÊÐÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+*
+* ÎļþÃû³Æ£º zte_web_pbm.c
+* Îļþ±êʶ£º
+* ÄÚÈÝÕªÒª£º
+* ÆäËü˵Ã÷£º
+* µ±Ç°°æ±¾£º V0.1
+* ×÷    Õߣº zyt
+* Íê³ÉÈÕÆÚ£º 2010-11-06
+*
+* Ð޸ļǼ1£º
+* ÐÞ¸ÄÄÚÈÝ£º³õʼ°æ±¾
+************************************************************************/
+
+#include "zte_web_interface.h"
+//#include "../../phonebook/phonebook.h"
+#include "zte_web_get_fw_para.h"
+#include "zte_web_pbm.h"
+
+static void zte_web_pbm_feed_back_empty(webs_t wp);
+
+#define IFSTREQUAL(str1, str2) (strcmp((str1), (str2))?0:1)
+
+int zte_web_pbm_check_can_process()
+{
+	char flag[20] = {0};
+
+	(void)zte_web_read(ZTE_PBM_NV, flag);
+	if (0 == strcmp(flag, PBM_OPRATING)) {
+		slog(MISC_PRINT, SLOG_DEBUG,"[PB] zte_web_pbm_check_can_process flag=%s, not can process.\n", flag);
+		return 0;
+	} else {
+		slog(MISC_PRINT, SLOG_DEBUG,"[PB] zte_web_pbm_check_can_process flag=%s, can process.\n", flag);
+		return -1;
+	}
+}
+
+static data_safe_result_type_t zte_Safe_noSpecialChar_ucs2(char *str)
+{
+	int i = 0;
+	int len = 0;
+	if (NULL == str || strlen(str) < 4) {
+		return 0;
+	}
+	len = strlen(str);
+	for (i = 0; i < len; i=i+4) {
+		if (str[i] == '0' && str[i+1] == '0') {
+			if(str[i+2] == '2') {//"'/
+				if(str[i+3] == '2' || str[i+3] == '7' || str[i+3] == 'f' || str[i+3] == 'F')
+					return 0;
+			} else if(str[i+2] == '3') {//<>
+				if(str[i+3] == 'c' || str[i+3] == 'C' || str[i+3] == 'e' || str[i+3] == 'E')
+					return 0;
+			} else if(str[i+2] == '5') {/* \ */
+				if(str[i+3] == 'c' || str[i+3] == 'C')
+					return 0;
+			}
+		}
+	}
+	return 1;
+
+}
+
+/**********************************************************************
+* Function:         zte_web_pbm_contact_saveto_sim
+* Description:
+* Input:            wp:web para;sim_contact_location:save location
+* Output:
+* Return:           void
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120926    V1.0        liuyingnan        first version
+**********************************************************************/
+static void zte_web_pbm_contact_saveto_sim(webs_t wp, int sim_contact_location)
+{
+	/*contact added type*/
+	zte_pbm_create_ext_record_s_type sim_contact_add;
+	int ret_code = 0;
+	//add by liuyingnan for server safe start
+	char* pbm_name = NULL;
+	char* pbm_mobilephone_num = NULL;
+	//add by liuyingnan for server safe end
+
+	/*LOG*/
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_web_pbm->zte_web_pbm_contact_saveto_sim()."); /*lint !e26*/
+
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_goform_pbm_contact_add_process(): invalid input.."); /*lint !e26*/
+		return;
+	}
+
+	//add by liuyingnan for server safe for xss attack start
+	pbm_name = websGetVar(wp, T("name"), T(""));
+	pbm_mobilephone_num = websGetVar(wp, T("mobilephone_num"), T(""));
+
+	if (PBM_MAX_TEXT_LENGTH < strlen(pbm_name) || PBM_MAX_NUM_LENGTH < strlen(pbm_mobilephone_num)
+		||DATA_NO_SAFE == zte_Safe_noSpecialChar_ucs2(pbm_name)
+		|| DATA_NO_SAFE == zte_Safe_noSpecialChar(pbm_mobilephone_num)
+		) {
+		slog(MISC_PRINT, SLOG_ERR, "Get Data is no Safe:pbm_name:%s\n", pbm_name); /*lint !e26*/
+		cfg_set("data_safe", "failed");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	//add by liuyingnan for server safe for xss attack end
+
+	/*init contact_add*/
+	memset(&sim_contact_add, 0, sizeof(sim_contact_add));
+	/*set struct value*/
+	sim_contact_add.zte_pbm_del_id = atoi(websGetVar(wp, T("delId"), T("-1")));
+	sim_contact_add.zte_pbm_location = sim_contact_location;
+	sim_contact_add.zte_pbm_id = atoi(websGetVar(wp, T("edit_index"), T("")));
+
+	memcpy(sim_contact_add.zte_pbm_name, websGetVar(wp, T("name"), T("")),
+	       sizeof(sim_contact_add.zte_pbm_name));
+	memcpy(sim_contact_add.zte_pbm_number, websGetVar(wp, T("mobilephone_num"), T("")),
+	       sizeof(sim_contact_add.zte_pbm_number));
+	memcpy(sim_contact_add.zte_pbm_anr, websGetVar(wp, T("homephone_num"), T("")),
+	       sizeof(sim_contact_add.zte_pbm_anr));
+	memcpy(sim_contact_add.zte_pbm_anr1, websGetVar(wp, T("officephone_num"), T("")),
+	       sizeof(sim_contact_add.zte_pbm_anr1));
+	memcpy(sim_contact_add.zte_pbm_email, websGetVar(wp, T("email"), T("")),
+	       sizeof(sim_contact_add.zte_pbm_email));
+	memcpy(sim_contact_add.zte_pbm_sne, websGetVar(wp, T("nick_name"), T("")),
+	       sizeof(sim_contact_add.zte_pbm_sne));
+	if (sim_contact_add.zte_pbm_number[ZTE_WEB_PBM_NUMBER_TYPE_START] ==
+	    ZTE_WEB_PBM_NUMBER_TYPE_SPLIT) {
+		sim_contact_add.zte_pbm_type = ZTE_WEB_PBM_NUMBER_TYPE_1;
+	} else {
+		sim_contact_add.zte_pbm_type = ZTE_WEB_PBM_NUMBER_TYPE_2;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_web_pbm_contact_saveto_sim:send messsage to mc start"); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "sim_contact_add.zte_pbm_id:%d", sim_contact_add.zte_pbm_id); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "sim_contact_add.name:%s", sim_contact_add.zte_pbm_name); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "sim_contact_add.mobilephone_num:%s", sim_contact_add.zte_pbm_number); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "sim_contact_add.zte_pbm_type:%d", sim_contact_add.zte_pbm_type); /*lint !e26*/
+
+	/*send msg to mc*/
+	//ret_code = zte_send_message(ZUFI_MODULE_ID_AT_LOCAL,ZTE_PBM_WRITE_REC_MSG, sizeof(sim_contact_add), (char*)&sim_contact_add);
+	(void)zte_web_write(ZTE_PBM_NV, PBM_OPRATING);
+	ret_code = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_PB, MSG_CMD_WRITE_PB, sizeof(sim_contact_add), (char*)&sim_contact_add, 0);
+	if (ret_code != 0) {
+		slog(MISC_PRINT, SLOG_ERR, "mc lib relay pbm  send create modify record  fail"); /*lint !e26*/
+		(void)zte_web_write(ZTE_PBM_NV, "14");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_web_pbm_contact_saveto_sim:send messsage to mc end"); /*lint !e26*/
+	/*goto web page*/
+	zte_write_result_to_web(wp, "success");
+	return;
+}
+/**********************************************************************
+* Function:         zte_web_pbm_contact_saveto_pc
+* Description:       wp:web para;pc_contact_location:save location
+* Input:            null
+* Output:           null
+* Return:           void
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120926    V1.0        liuyingnan        first version
+**********************************************************************/
+static void zte_web_pbm_contact_saveto_pc(webs_t wp, int pc_contact_location)
+{
+	/*contact added type*/
+	zte_pbm_create_ext_record_s_type pc_contact_add;
+	int ret_code = 0;
+	//add by liuyingnan for server safe start
+	char* pbm_name = NULL;
+	char* pbm_mobilephone_num = NULL;
+	//add by liuyingnan for server safe end
+	/*LOG*/
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_web_pbm->zte_web_pbm_contact_saveto_pc()."); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG,"[PB] zte_web_pbm_contact_saveto_pc entry\n");
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_web_pbm_contact_saveto_pc(): invalid input.."); /*lint !e26*/
+		return;
+	}
+	//add by liuyingnan for server safe for xss attack start
+	pbm_name = websGetVar(wp, T("name"), T(""));
+	pbm_mobilephone_num = websGetVar(wp, T("mobilephone_num"), T(""));
+	slog(MISC_PRINT, SLOG_DEBUG,"[PB] zte_web_pbm_contact_saveto_pc entry1\n");
+	if (PBM_MAX_TEXT_LENGTH < strlen(pbm_name) || PBM_MAX_NUM_LENGTH < strlen(pbm_mobilephone_num)
+		||DATA_NO_SAFE == zte_Safe_noSpecialChar_ucs2(pbm_name)
+		|| DATA_NO_SAFE == zte_Safe_noSpecialChar(pbm_mobilephone_num)
+		) {
+		slog(MISC_PRINT, SLOG_ERR, "Get Data is no Safe:pbm_name:%s\n", pbm_name); /*lint !e26*/
+		cfg_set("data_safe", "failed");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	//add by liuyingnan for server safe for xss attack end
+	slog(MISC_PRINT, SLOG_DEBUG,"[PB] zte_web_pbm_contact_saveto_pc entry2\n");
+	/*init contact_add*/
+	memset(&pc_contact_add, 0, sizeof(pc_contact_add));
+	/*set struct value*/
+	pc_contact_add.zte_pbm_del_id = atoi(websGetVar(wp, T("delId"), T("-1")));
+	pc_contact_add.zte_pbm_location = pc_contact_location;
+	pc_contact_add.zte_pbm_id = atoi(websGetVar(wp, T("add_index_pc"), T("")));
+	memcpy(pc_contact_add.zte_pbm_name, websGetVar(wp, T("name"), T("")),
+	       sizeof(pc_contact_add.zte_pbm_name));
+	memcpy(pc_contact_add.zte_pbm_number, websGetVar(wp, T("mobilephone_num"), T("")),
+	       sizeof(pc_contact_add.zte_pbm_number));
+	memcpy(pc_contact_add.zte_pbm_anr, websGetVar(wp, T("homephone_num"), T("")),
+	       sizeof(pc_contact_add.zte_pbm_anr));
+	memcpy(pc_contact_add.zte_pbm_anr1, websGetVar(wp, T("officephone_num"), T("")),
+	       sizeof(pc_contact_add.zte_pbm_anr1));
+	memcpy(pc_contact_add.zte_pbm_email, websGetVar(wp, T("email"), T("")),
+	       sizeof(pc_contact_add.zte_pbm_email));
+	memcpy(pc_contact_add.zte_pbm_sne, websGetVar(wp, T("nick_name"), T("")),
+	       sizeof(pc_contact_add.zte_pbm_sne));
+	memcpy(pc_contact_add.zte_pbm_group, websGetVar(wp, T("groupchoose"), T("")),
+	       sizeof(pc_contact_add.zte_pbm_group));
+
+	if (pc_contact_add.zte_pbm_number[ZTE_WEB_PBM_NUMBER_TYPE_START] ==
+	    ZTE_WEB_PBM_NUMBER_TYPE_SPLIT) {
+		pc_contact_add.zte_pbm_type = ZTE_WEB_PBM_NUMBER_TYPE_1;
+	} else {
+		pc_contact_add.zte_pbm_type = ZTE_WEB_PBM_NUMBER_TYPE_2;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_web_pbm_contact_saveto_pc:send messsage to mc start"); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "sim_contact_add.zte_pbm_id:%d", pc_contact_add.zte_pbm_id); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "sim_contact_add.name:%s", pc_contact_add.zte_pbm_name); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "sim_contact_add.mobilephone_num:%s", pc_contact_add.zte_pbm_number); /*lint !e26*/
+	slog(MISC_PRINT, SLOG_DEBUG, "sim_contact_add.zte_pbm_type:%d", pc_contact_add.zte_pbm_type); /*lint !e26*/
+	printf("[PB] zte_web_pbm_contact_saveto_pc entry3\n");
+	/*send msg to mc*/
+	//ret_code = zte_send_message(ZUFI_MODULE_ID_AT_LOCAL,ZTE_PBM_WRITE_REC_MSG, sizeof(pc_contact_add), (char*)&pc_contact_add);
+	(void)zte_web_write(ZTE_PBM_NV, PBM_OPRATING);
+	ret_code = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_PB, MSG_CMD_WRITE_PB, sizeof(pc_contact_add), (char*)&pc_contact_add, 0);
+	if (ret_code != 0) {
+		slog(MISC_PRINT, SLOG_ERR, "mc lib relay pbm  send create modify record  fail"); /*lint !e26*/
+		(void)zte_web_write(ZTE_PBM_NV, "14");
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	printf("zte_web_pbm_contact_saveto_pc:%d,%d,%d,%d\n", ret_code, MODULE_ID_WEB_CGI, MODULE_ID_PB, MSG_CMD_WRITE_PB);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_web_pbm_contact_saveto_pc:send messsage to mc end"); /*lint !e26*/
+	/*goto web page*/
+	zte_write_result_to_web(wp, "success");
+}
+
+/**********************************************************************
+* Function:         zte_web_pbm_utils_parseStr
+* Description:
+* Input:
+* Output:
+* Return:           void
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120409    V1.0        chenyi        first version
+**********************************************************************/
+static  int zte_web_pbm_utils_parseStr
+(
+    char *input,  char *output, int srcLen, int destLen, char separator
+)
+{
+	/*index*/
+	int input_ind = 0;
+	int dest_ind = 0;
+	int all_ind = 0;
+
+	/*check input*/
+	if (NULL == input || NULL == output || srcLen == 0 || destLen == 0) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_web_pbm_utils_parseStr():invalid input."); /*lint !e26*/
+		return 0;
+	}
+
+	/*handler*/
+	for (input_ind = 0; input_ind < srcLen; input_ind++) {
+		if ('\0' == input[input_ind]) {
+			*(output + destLen * dest_ind + all_ind) = '\0';
+			return dest_ind + 1;
+		}
+
+		if (separator == input[input_ind]) {
+			*(output + destLen * dest_ind + all_ind)  = '\0';
+			if ('\0' != input[input_ind + 1]) {
+				all_ind = 0;
+				dest_ind++;
+			}
+		} else {
+			*(output + destLen * dest_ind + all_ind)  = input[input_ind];
+			all_ind++;
+		}
+	}
+
+	/*return value*/
+	return dest_ind;
+}
+
+
+/**********************************************************************
+* Function:         zte_web_pbm_contact_del_part
+* Description:
+* Input:            web para
+* Output:
+* Return:           void
+*                   Others: reason of error.
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120409    V1.0        chenyi        first version
+**********************************************************************/
+static void zte_web_pbm_contact_del_part(webs_t wp)
+{
+	int ret_code = 0;
+	/*deleted index get from page*/
+	char del_index[PBM_WEB_MAX_CHAR_LEN] = {0};
+	/*split deleted index*/
+	char split_index[ZTE_PB_INDEX_MAX][ZTE_WEB_PBM_REC_LEN];
+	/*flag of contact number*/
+	/*index for for circle*/
+	int num_ind = 0;
+	/*data struct */
+	zte_pbm_del_multi_records_s_type sendto_data;
+
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_web_pbm_contact_del_part(): invalid input.."); /*lint !e26*/
+		return;
+	}
+
+	/*init*/
+	memset(del_index, 0, sizeof(del_index));
+	memset(&sendto_data, 0, sizeof(sendto_data));
+	memset(split_index, 0, sizeof(split_index));
+
+	/*set data struct*/
+	//sendto_data.zte_del_pbm_location = atoi(websGetVar(wp,T("savelocation1"), T("")));
+	memcpy(del_index, websGetVar(wp, T("delete_id"), T("")), sizeof(del_index));
+	sendto_data.zte_del_pbm_total = zte_web_pbm_utils_parseStr(del_index, (char *)split_index,
+	                                (int)ZTE_PB_INDEX_MAX, (int)ZTE_WEB_PBM_REC_LEN, (char)ZTE_WEB_PBM_INDEX_SPLIT_FLAG);
+	slog(MISC_PRINT, SLOG_DEBUG,"liuyingnan sendto_data.zte_del_pbm_total:%d", sendto_data.zte_del_pbm_total); /*lint !e26*/
+
+	/*del one contact*/
+	if (ZTE_WEB_PBM_DEL_MULT_OR_ONE_FLAG == sendto_data.zte_del_pbm_total) {
+		sendto_data.zte_del_pbm_id[ZTE_WEB_PBM_DEL_ONE_IND] = atoi(split_index[ZTE_WEB_PBM_DEL_ONE_IND]);
+
+#if 0
+		if (-1 == zte_mc_relay_pbm_del_one_record(&sendto_data)) {
+			slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_web_pbm_contact_del_part():delete one contact failed."); /*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+#endif
+		slog(MISC_PRINT, SLOG_NORMAL, "zte_web_pbm_contact_del_part:send messsage start"); /*lint !e26*/
+		//ret_code = zte_send_message(ZUFI_MODULE_ID_AT_LOCAL,ZTE_PBM_DEL_A_REC_MSG, sizeof(sendto_data), (char*)&sendto_data);
+		ret_code = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_PB, MSG_CMD_DEL_A_PB, sizeof(sendto_data), (char*)&sendto_data, 0);
+		slog(MISC_PRINT, SLOG_DEBUG, "zte_web_pbm_contact_del_part:send messsage end"); /*lint !e26*/
+		if (ret_code != 0) {
+			slog(MISC_PRINT, SLOG_ERR, "mc lib relay pbm  send DEL A record  fail"); /*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+	} else {
+		/*handler*/
+		for (num_ind = 0; num_ind < sendto_data.zte_del_pbm_total; num_ind ++) {
+			sendto_data.zte_del_pbm_id[num_ind] = atoi(split_index[num_ind]);
+			printf("zte_web_pbm->zte_web_pbm_contact_del_part():split_index=[%d]", sendto_data.zte_del_pbm_id[num_ind]); /*lint !e26*/
+		}
+
+		/*handler*/
+#if 0
+		if (-1 == zte_mc_relay_pbm_del_multi_record(&sendto_data)) {
+			slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_web_pbm_contact_del_part():delete mult contact failed."); /*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+#endif
+		//ret_code = zte_send_message(ZUFI_MODULE_ID_AT_LOCAL,ZTE_PBM_DEL_MUTI_REC_MSG, sizeof(sendto_data), (char*)&sendto_data);
+		ret_code = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_PB, MSG_CMD_DEL_MUTI_PB, sizeof(sendto_data), (char*)&sendto_data, 0);
+		if (ret_code != 0) {
+			slog(MISC_PRINT, SLOG_ERR, "mc lib relay pbm  send DEL MUTI record  fail"); /*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+	}
+	/*goto differ page*/
+	(void)zte_web_write(ZTE_PBM_NV, PBM_OPRATING);
+	zte_write_result_to_web(wp, "success");
+	//zte_web_pbm_goto_diff_page(wp,sendto_data.zte_del_pbm_location);
+}
+/**********************************************************************
+* Function:         zte_web_pbm_contact_del_all
+* Description:
+* Input:            web para
+* Output:           null
+* Return:           void
+*                   Others: reason of error.
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120409    V1.0        chenyi        first version
+**********************************************************************/
+static void zte_web_pbm_contact_del_all(webs_t wp)
+{
+	int ret_code = 0;
+	/*data struct*/
+	zte_pbm_del_multi_records_s_type sendto_data;
+
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_web_pbm_contact_del_all(): invalid input.."); /*lint !e26*/
+		return;
+	}
+
+	/*init*/
+	memset(&sendto_data, 0, sizeof(sendto_data));
+
+	/*set data struct*/
+	sendto_data.zte_del_pbm_location = atoi(websGetVar(wp, T("del_all_location"), T("")));
+	slog(MISC_PRINT, SLOG_DEBUG, "liuyingnan sendto_data.zte_del_pbm_location:%d", sendto_data.zte_del_pbm_location); /*lint !e26*/
+
+	/*handler del all*/
+	//(void)zte_mc_relay_pbm_del_all_record(&sendto_data);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_web_pbm_contact_del_all:send messsage start"); /*lint !e26*/
+	//ret_code = zte_send_message(ZUFI_MODULE_ID_AT_LOCAL,ZTE_PBM_DEL_ALL_REC_MSG, sizeof(sendto_data), (char*)&sendto_data);
+	ret_code = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_PB, MSG_CMD_DEL_ALL_PB, sizeof(sendto_data), (char*)&sendto_data, 0);
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_web_pbm_contact_del_all:send messsage end"); /*lint !e26*/
+	if (ret_code != 0) {
+		slog(MISC_PRINT, SLOG_ERR, "mc lib relay pbm  send DEL ALL record  fail"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	/*goto differ page*/
+	(void)zte_web_write(ZTE_PBM_NV, PBM_OPRATING);
+	zte_write_result_to_web(wp, "success");
+	//zte_web_pbm_goto_diff_page(wp,sendto_data.zte_del_pbm_location);
+}
+/**********************************************************************
+* Function:         zte_web_pbm_contact_del_by_group
+* Description:
+* Input:            web para
+* Output:
+* Return:           void
+*                   Others: reason of error.
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120711    V1.0        chenyi        first version
+**********************************************************************/
+static void zte_web_pbm_contact_del_by_group(webs_t wp)
+{
+	int ret_code = 0;
+	zte_pbm_del_multi_records_s_type sendto_data;
+	char *group = NULL;
+
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_web_pbm_contact_del_by_group(): invalid input.."); /*lint !e26*/
+		return;
+	}
+
+	/*init*/
+	memset(&sendto_data, 0, sizeof(zte_pbm_del_multi_records_s_type));
+
+	group = websGetVar(wp, T("del_group"), T(""));
+	slog(MISC_PRINT, SLOG_DEBUG, "liuyingnan group:%s", group); /*lint !e26*/
+	if (0 == strcmp(group, "")) {
+		slog(MISC_PRINT, SLOG_ERR, "pbm:group is empty.\n"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	/*set data struct*/
+	sendto_data.zte_del_pbm_location = atoi(websGetVar(wp, T("del_all_location"), T("0")));
+	slog(MISC_PRINT, SLOG_DEBUG, "liuyingnan sendto_data.zte_del_pbm_location:%d", sendto_data.zte_del_pbm_location); /*lint !e26*/
+
+	if (ZTE_NVIO_DONE != zte_web_write("pbm_group", group)) {
+		slog(MISC_PRINT, SLOG_ERR, "write the nv [pbm_group] failure.\n"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	(void)zte_web_write(ZTE_PBM_NV, PBM_OPRATING);
+
+#if 0
+	if (ZTE_MC_OK_S != zte_mc_relay_pbm_del_all_record(&sendto_data)) {
+		slog(MISC_PRINT, SLOG_ERR, "call zte_mc_relay_pbm_del_all_record fail.\n"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+	} else {
+		zte_write_result_to_web(wp, SUCCESS);
+	}
+#endif
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_web_pbm_contact_del_by_group:send messsage start"); /*lint !e26*/
+	//ret_code = zte_send_message(ZUFI_MODULE_ID_AT_LOCAL,ZTE_PBM_DEL_ALL_REC_MSG, sizeof(sendto_data), (char*)&sendto_data);
+	ret_code = ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_PB, MSG_CMD_DEL_ALL_PB, sizeof(sendto_data), (char*)&sendto_data, 0);
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_web_pbm_contact_del_by_group:send messsage end"); /*lint !e26*/
+	if (ret_code != 0) {
+		slog(MISC_PRINT, SLOG_ERR, "mc lib relay pbm  send DEL record by group  fail"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	zte_write_result_to_web(wp, "success");
+}
+
+
+/**********************************************************************
+* Function:         zte_goform_pbm_contact_add_process
+* Description:
+* Input:            null
+* Output:           null
+* Return:           void
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120926    V1.0        liuyingnan        first version
+**********************************************************************/
+void zte_goform_pbm_contact_add_process(webs_t wp)
+{
+	/*contact location*/
+	int contact_location = 0;
+
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_goform_pbm_contact_add_process(): invalid input.."); /*lint !e26*/
+		return;
+	}
+
+	if (0 == zte_web_pbm_check_can_process()) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	/*get the saved mem*/
+	contact_location = atoi(websGetVar(wp, T("location"), T("")));
+	slog(MISC_PRINT, SLOG_DEBUG,"[PB] zte_web_pbm_check_can_process contact_location=%d, can process.\n", contact_location);
+	/*goto different mem handler*/
+	switch (contact_location) {
+	case ZTE_WEB_PBM_CONTACT_SIM: { /*goto sim mem handler*/
+		slog(MISC_PRINT, SLOG_DEBUG,"[PB] zte_web_pbm_check_can_process sim=%d, can process.\n", ZTE_WEB_PBM_CONTACT_SIM);
+		zte_web_pbm_contact_saveto_sim(wp, ZTE_WEB_PBM_CONTACT_SIM);
+		break;
+	}
+	case ZTE_WEB_PBM_CONTACT_PC: { /*goto pc mem handler*/
+		slog(MISC_PRINT, SLOG_DEBUG,"[PB] zte_web_pbm_check_can_process pc=%d, can process.\n", ZTE_WEB_PBM_CONTACT_PC);
+		zte_web_pbm_contact_saveto_pc(wp, ZTE_WEB_PBM_CONTACT_PC);
+		break;
+	}
+
+	default: { /*unknown mem*/
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_goform_pbm_contact_add_process():unknown pbm mem."); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+	}
+	}
+}
+
+void zte_goform_pbm_contact_del_process(webs_t wp)
+{
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_web_pbm_contact_del_all(): invalid input.."); /*lint !e26*/
+		return;
+	}
+
+	if (0 == zte_web_pbm_check_can_process()) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	/*del the given index contact in specified mem*/
+	if (0 == strcmp(websGetVar(wp, T("del_option"), T("")), ZTE_WEB_PBM_PAGE_DEL_PART)) {
+		zte_web_pbm_contact_del_part(wp);
+	}
+
+	/*del all the contact in specified mem*/
+	else if (0 == strcmp(websGetVar(wp, T("del_option"), T("")), ZTE_WEB_PBM_PAGE_DEL_ALL)) {
+		zte_web_pbm_contact_del_all(wp);
+	}
+	//delete the pbm data by group
+	else if (0 == strcmp(websGetVar(wp, T("del_option"), T("")), ZTE_WEB_PBM_DEL_BY_GROUP)) {
+		zte_web_pbm_contact_del_by_group(wp);
+	}
+
+	else {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_pbm->zte_goform_pbm_contact_del_process():unknown pbm del."); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+	}
+
+}
+
+
+/**********************************************************************
+* Function:         zte_get_pbm_data
+* Description:      to get the pbm data info
+* Input:            the web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/04/10    V1.0        chenyi       first version
+**********************************************************************/
+void zte_get_pbm_data(webs_t wp)
+{
+	zte_pbm_query_req_s_type pbm_query_req;
+	zte_pbm_query_resp_s_type *p_pbm_query_result = NULL;
+	int result = 0;
+	int i = 0;
+	char_t *page = NULL;
+	char_t *data_per_page = NULL;
+	char_t *mem_store = NULL;
+
+	memset(&pbm_query_req, 0, sizeof(zte_pbm_query_req_s_type));
+
+	page = websGetVar(wp, "page", T(""));
+	data_per_page = websGetVar(wp, "data_per_page", T(""));
+	mem_store = websGetVar(wp, "mem_store", T(""));
+
+	if (('\0' == *page) || ('\0' == *data_per_page) || ('\0' == *mem_store)) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_get_pbm_data: invalid web para.\n"); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		return ;
+	}
+	int tmp_page = atoi(page);
+	int tmp_num_per_page = atoi(data_per_page);
+	int location = atoi(mem_store);
+	if((tmp_page < 0 || tmp_page > 255)
+		||(tmp_num_per_page < 0 || tmp_num_per_page > 255)
+		||(location < PBM_LOCATION_SIM || location > PBM_LOCATION_MAX)){
+		slog(MISC_PRINT, SLOG_ERR, "zte_get_pbm_data:err[%d,%d,%d]\n", tmp_page,tmp_num_per_page,location); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		return ;
+	}
+	pbm_query_req.page = (uint8)tmp_page;
+	pbm_query_req.num_per_page = (uint8)tmp_num_per_page;
+	pbm_query_req.location = (zte_pbm_location_e_type)location; //0:sim;1:device
+
+	slog(MISC_PRINT, SLOG_DEBUG, "pbm_query_req:[%u,%u,%d].\n", pbm_query_req.page, pbm_query_req.num_per_page, pbm_query_req.location); /*lint !e26*/
+
+	p_pbm_query_result = (zte_pbm_query_resp_s_type*)malloc(4 + sizeof(zte_pbm_create_ext_record_s_type) * (pbm_query_req.num_per_page));
+	if (NULL == p_pbm_query_result) {
+		slog(MISC_PRINT, SLOG_ERR, "malloc pbm result mem fail.\n"); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		return ;/*lint !e429*/
+	}
+
+	memset(p_pbm_query_result, 0, (4 + sizeof(zte_pbm_create_ext_record_s_type) * (pbm_query_req.num_per_page)));	/*lint !e668*/
+
+	slog(MISC_PRINT, SLOG_DEBUG, "GET PBM DATA FROM DB START.\n"); /*lint !e26*/
+	result = zte_libpbm_get_rec_data(&pbm_query_req, p_pbm_query_result);
+	slog(MISC_PRINT, SLOG_DEBUG, "GET PBM DATA FROM DB END.\n"); /*lint !e26*/
+
+	if (-1 == result) {
+		slog(MISC_PRINT, SLOG_ERR, "call zte_libpbm_get_rec_data fail.\n"); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		//free
+//		if (NULL != p_pbm_query_result) {  // kw 3
+			free(p_pbm_query_result);
+			p_pbm_query_result = NULL;
+//		}
+		return ;
+	}
+
+	slog(MISC_PRINT, SLOG_DEBUG, "total query count [%u].\n", (*p_pbm_query_result).count); /*lint !e26*/
+
+	if (0 == (*p_pbm_query_result).count) {
+		zte_web_pbm_feed_back_empty(wp);
+		//free
+//		if (NULL != p_pbm_query_result) {  kw 3
+			free(p_pbm_query_result);
+			p_pbm_query_result = NULL;
+//		}
+		return ;
+	}
+
+	//write the pbm data to web
+	for (i = 0; i < (*p_pbm_query_result).count; i++) {
+		if (0 == i) {
+			web_feedback_header(wp);
+			zte_rest_get_pbm_data_head(wp);
+			if (0 == pbm_query_req.location) {
+				zte_rest_get_pbm_data_sim(wp, p_pbm_query_result, i, 0);
+			} else {
+				zte_rest_get_pbm_data_other(wp, p_pbm_query_result, i, 0);
+			}
+		} else {
+			if (0 == pbm_query_req.location) {
+				zte_rest_get_pbm_data_sim(wp, p_pbm_query_result, i, 1);
+			} else {
+				zte_rest_get_pbm_data_other(wp, p_pbm_query_result, i, 1);
+			}
+		}
+	}
+	zte_rest_get_pbm_data_foot(wp);
+	//(void)websWrite(wp, T("]}"));
+
+	//free
+//	if (NULL != p_pbm_query_result) { // kw 3
+		free(p_pbm_query_result);
+		p_pbm_query_result = NULL;
+//	}
+}
+
+/**********************************************************************
+* Function:         zte_get_pbm_data_total
+* Description:      to get the total pbm data
+* Input:            the web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/04/10    V1.0        chenyi       first version
+**********************************************************************/
+void zte_get_pbm_data_total(webs_t wp)
+{
+	zte_pbm_query_req_s_type pbm_query_req;
+	zte_pbm_query_resp_s_type *p_pbm_query_result = NULL;
+	int result = 0;
+	int i = 0;
+	char_t *page = NULL;
+	char_t *data_per_page = NULL;
+	char_t *mem_store = NULL;
+	char *pbm_group = NULL;
+
+	int total_pages = 0;
+	int leave_nums = 0;
+	int curr_page = 0;
+	int total_pbm = 0;
+
+	int idata_per_page = 0;
+
+	memset(&pbm_query_req, 0, sizeof(zte_pbm_query_req_s_type));
+
+	page = websGetVar(wp, "page", T(""));
+	data_per_page = websGetVar(wp, "data_per_page", T(""));
+	mem_store = websGetVar(wp, "mem_store", T(""));
+	pbm_group = websGetVar(wp, "pbm_group", T("")); //not to check whether is empty
+
+	if (('\0' == *page) || ('\0' == *data_per_page) || ('\0' == *mem_store)) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_get_pbm_data: invalid web para.\n"); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		return ;
+	}
+
+
+#if 0
+    //calculate the total pages
+    total_pages = (atoi(data_per_page)) / PBM_PAGE_RECORD_MAX_NUM;
+    leave_nums = (atoi(data_per_page)) % PBM_PAGE_RECORD_MAX_NUM;
+    
+    if (0 != leave_nums) {
+    	total_pages++;
+    }
+
+#else
+	idata_per_page = atoi(data_per_page);
+	if(idata_per_page < 0 || idata_per_page >  INT_MAX-1)
+	{
+	    total_pages = 1;
+		leave_nums = 0;
+	}
+	else
+	{
+    	//calculate the total pages
+    	total_pages = idata_per_page / PBM_PAGE_RECORD_MAX_NUM;
+    	leave_nums = idata_per_page % PBM_PAGE_RECORD_MAX_NUM;
+    
+    	if (0 != leave_nums) {
+    		total_pages++;
+    	}
+	}
+#endif
+
+	slog(MISC_PRINT, SLOG_DEBUG, "pbm:total_pages,leave_nums:[%d][%d]", total_pages, leave_nums); /*lint !e26*/
+
+	p_pbm_query_result = (zte_pbm_query_resp_s_type*)malloc(4 + sizeof(zte_pbm_create_ext_record_s_type) * PBM_PAGE_RECORD_MAX_NUM);
+	if (NULL == p_pbm_query_result) {
+		slog(MISC_PRINT, SLOG_ERR, "malloc pbm result mem fail.\n"); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		return ;/*lint !e429*/
+	}
+
+	(void)zte_web_write("pbm_group", pbm_group); //only wrtite one time
+
+	for (curr_page = 0; curr_page < total_pages; curr_page++) {
+
+		//reset
+		memset(&pbm_query_req, 0, sizeof(zte_pbm_query_req_s_type));
+
+		pbm_query_req.page = curr_page;
+		pbm_query_req.num_per_page = PBM_PAGE_RECORD_MAX_NUM;
+		/*lint -e64*/
+		pbm_query_req.location = atoi(mem_store); //0:sim;1:device
+
+		slog(MISC_PRINT, SLOG_DEBUG, "pbm_query_req:[%u,%u,%d].\n", pbm_query_req.page, pbm_query_req.num_per_page, pbm_query_req.location); /*lint !e26*/
+
+		//reset
+		memset(p_pbm_query_result, 0, 4 + sizeof(zte_pbm_create_ext_record_s_type)*PBM_PAGE_RECORD_MAX_NUM); /*lint !e668*/
+
+		slog(MISC_PRINT, SLOG_NORMAL, "GET PBM DATA FROM DB START.\n"); /*lint !e26*/
+		result = zte_libpbm_get_rec_data(&pbm_query_req, p_pbm_query_result);
+		slog(MISC_PRINT, SLOG_DEBUG, "GET PBM DATA FROM DB END.\n"); /*lint !e26*/
+
+		if (-1 == result) {
+			slog(MISC_PRINT, SLOG_DEBUG, "read pbm page [%d] fail.\n", curr_page); /*lint !e26*/
+			//free
+//			if (NULL != p_pbm_query_result) {  // kw 3
+				free(p_pbm_query_result);
+				p_pbm_query_result = NULL;
+//			}
+
+			if (0 == curr_page) {
+				zte_web_pbm_feed_back_empty(wp);
+				return ;
+			} else {
+				break;
+			}
+		}
+
+		slog(MISC_PRINT, SLOG_DEBUG, "pbm:total query count [%u].\n", (*p_pbm_query_result).count); /*lint !e26*/
+
+		if (0 == (*p_pbm_query_result).count) {
+			//free
+//			if (NULL != p_pbm_query_result) {  // kw 3
+				free(p_pbm_query_result);
+				p_pbm_query_result = NULL;
+//			}
+
+			if (0 == curr_page) {
+				zte_web_pbm_feed_back_empty(wp);
+				return ;
+			} else {
+				break;
+			}
+		}
+
+		//write the pbm data to web
+		for (i = 0; (i < (*p_pbm_query_result).count) && (total_pbm < atoi(data_per_page)); i++, total_pbm++) {
+			if ((0 == i) && (0 == curr_page)) {
+				web_feedback_header(wp);
+				zte_rest_get_pbm_data_head(wp);
+				if (0 == pbm_query_req.location) {
+					zte_rest_get_pbm_data_sim(wp, p_pbm_query_result, i, 0);
+				} else {
+					zte_rest_get_pbm_data_other(wp, p_pbm_query_result, i, 0);
+				}
+			} else {
+				if (0 == pbm_query_req.location) {
+					zte_rest_get_pbm_data_sim(wp, p_pbm_query_result, i, 1);
+				} else {
+					zte_rest_get_pbm_data_other(wp, p_pbm_query_result, i, 1);
+				}
+			}
+		}
+
+	}
+
+
+	zte_rest_get_pbm_data_foot(wp);
+	//free
+//	if (NULL != p_pbm_query_result) {  // kw 3
+		free(p_pbm_query_result);
+		p_pbm_query_result = NULL;
+//	}
+}
+
+/**********************************************************************
+* Function:         zte_get_pbm_parameter_info
+* Description:      to get the pbm parameter info
+* Input:            the web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/04/10    V1.0        chenyi       first version
+**********************************************************************/
+void zte_get_pbm_parameter_info(webs_t wp)
+{
+	zte_pbm_query_req_s_type pbm_para_query_info;
+	zte_pbm_sim_capability_s_type pbm_sim_capability_s;
+	zte_pbm_device_capability_s_type pbm_device_capability_s;
+	char *pbm_location = NULL;
+	int result = 0;
+
+	//initialize
+	memset(&pbm_para_query_info, 0, sizeof(zte_pbm_query_req_s_type));
+	memset(&pbm_sim_capability_s, 0, sizeof(zte_pbm_sim_capability_s_type));
+	memset(&pbm_device_capability_s, 0, sizeof(zte_pbm_device_capability_s_type));
+
+	pbm_location = websGetVar(wp, "pbm_location", T(""));
+
+	if (0 == strcmp(pbm_location, "")) {
+		slog(MISC_PRINT, SLOG_ERR, "pbm_location is empty.\n"); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		return;
+	}
+
+	slog(MISC_PRINT, SLOG_DEBUG, "pbm_location is [%s].\n", pbm_location); /*lint !e26*/
+
+	if (0 == strcmp(pbm_location, PBM_NATIVE)) {
+		pbm_para_query_info.location = PBM_LOCATION_DEVICE;
+	} else if (0 == strcmp(pbm_location, PBM_SIM)) {
+		pbm_para_query_info.location = PBM_LOCATION_SIM;
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "invalid pbm_location[%s].\n", pbm_location); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		return;
+	}
+	slog(MISC_PRINT, SLOG_NORMAL, "GET PBM DATA FROM DB START.\n"); /*lint !e26*/
+	result = zte_libpbm_get_capability(&pbm_para_query_info, &pbm_sim_capability_s, &pbm_device_capability_s);
+	slog(MISC_PRINT, SLOG_DEBUG, "GET PBM DATA FROM DB END.\n"); /*lint !e26*/
+	if (-1 == result) {
+		slog(MISC_PRINT, SLOG_ERR, "call zte_libpbm_get_capability fail.\n"); /*lint !e26*/
+		zte_web_pbm_feed_back_empty(wp);
+		return ;
+	}
+
+	web_feedback_header(wp);
+	if (0 == strcmp(pbm_location, PBM_NATIVE)) {
+		zte_rest_cmd_write_head(wp);
+		zte_rest_cmd_write_int(wp, PBM_DEV_MAX_RECORD_NUM, pbm_device_capability_s.max_record_number, 1);
+		zte_rest_cmd_write_int(wp, PBM_DEV_USED_RECORD_NUM, pbm_device_capability_s.used_record_number, 0);
+		zte_rest_cmd_write_foot(wp);
+	} else {
+		zte_rest_cmd_write_head(wp);
+		zte_rest_cmd_write_int(wp, PBM_SIM_SIM_TYPE, pbm_sim_capability_s.sim_type, 1);
+		zte_rest_cmd_write_int(wp, PBM_SIM_MAX_RECORD_NUM, pbm_sim_capability_s.max_record_number, 1);
+		zte_rest_cmd_write_int(wp, PBM_SIM_USED_RECORD_NUM, pbm_sim_capability_s.used_record_number, 1);
+		zte_rest_cmd_write_int(wp, PBM_SIM_MAX_NAME_LEN, pbm_sim_capability_s.max_name_len, 1);
+		zte_rest_cmd_write_int(wp, PBM_SIM_MAX_NUMBER_LEN, pbm_sim_capability_s.max_number_len, 0);
+		zte_rest_cmd_write_foot(wp);
+	}
+}
+
+/**********************************************************************
+* Function:         zte_web_pbm_feed_back_empty
+* Description:      to write empty info to web
+* Input:            the web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/04/10    V1.0        chenyi       first version
+**********************************************************************/
+
+static void zte_web_pbm_feed_back_empty(webs_t wp)
+{
+	if (NULL == wp) {
+		return;
+	}
+
+	web_feedback_header(wp);
+	if (wp->flags & WEBS_XML_CLIENT_REQUEST) {
+		websWrite(wp, T("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
+		websWrite(wp, T("<%s>empty</%s>\n"), PBM_DATA, PBM_DATA);
+	} else {
+		(void)websWrite(wp, T("{\"%s\":[]}"), PBM_DATA);
+	}
+	//(void)websWrite(wp, T("{\"%s\":[]}"),PBM_DATA);
+}
+//added by chenyi for handle the http request end 20111118
+
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_util.c b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_util.c
new file mode 100755
index 0000000..aa3a5dd
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_util.c
@@ -0,0 +1,927 @@
+/**
+ * @file zte_web_util.c
+ * @brief goform mesage processing
+ *
+ * Copyright (C) 2017 Sanechips Technology Co., Ltd.
+ * @author Hong Wu <wu.hong@sanechips.com.cn>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+
+/*******************************************************************************
+ *                           Include header files                              *
+ ******************************************************************************/
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<sys/ioctl.h>
+#include	<arpa/inet.h>
+#include	<net/if.h>
+#include	<net/route.h>
+#ifdef CONFIG_DEFAULTS_KERNEL_2_6_21
+#include	<linux/types.h>
+#include	<linux/socket.h>
+#endif
+#include    <string.h>
+#include    <dirent.h>
+#include	"webs.h"
+//#include	"linux/autoconf.h"
+#include    <sys/time.h>
+#include    <signal.h>
+#include    "zte_web_interface.h"
+#include    "zte_web_get_fw_para.h"
+
+/*******************************************************************************
+ *                             Macro definitions                               *
+ ******************************************************************************/
+
+#define MAX_MOBILE_KEY_WORD_SIZE    20  /*¹Ø¼ü×Ö³¤¶ÈÔݶ¨20*/
+#define MAX_PAGE_PATH_SIZE          128
+//#define MAX_GOFORM_TABLE_SIZE       256
+
+/*******************************************************************************
+ *                        Local function declarations                          *
+ ******************************************************************************/
+static int getSysUptime(int eid, webs_t wp, int argc, char_t **argv);
+static int zte_goform_whitelist_check(webs_t wp);
+static int zte_goform_blacklist_check(webs_t wp);
+/*******************************************************************************
+ *                         Local variable definitions                          *
+ ******************************************************************************/
+/****Define the HEADER and FOOTER of web page****/
+static const char * const zte_web_page_header =
+    "<head>"
+    "<title>-</title>"
+    "</head>"
+    "<body bgcolor=white>"
+    "<p>"
+    "<font size=3 face=arial>"
+    "<p>"
+    "<font size=2 face=arial>"
+    ;
+
+static const char * const zte_web_page_footer =
+    "<p>"
+    "<p>"
+    "<font face=arial></b></font><br>"
+    "<script> "
+    " timer = setTimeout('location.replace(\"%s\")', 100) "
+    "</script> "
+    "<p>"
+    "</body>"
+    ;
+
+static const char * const zte_web_page_top =
+    "<p>"
+    "<p>"
+    "<font face=arial></b></font><br>"
+    "<script> "
+    " timer = setTimeout('top.location.replace(\"%s\")', 100) "
+    "</script> "
+    "<p>"
+    "</body>"
+    ;
+//multi_dataΪ¿Õ£¬ÇÒÒѵǽ²ÅÄÜ»ñÈ¡µ½,¸ÃÁÐ±í²»¿ÉËæÒâÔö¼Ó¾¡Á¿ÓÃNV
+static web_goform_type web_goform_get_cmd_table[] = {
+	/**********  ¹²Í¬ ***********/
+	//{CMD_GET_DEVICE_MODE, zte_get_device_mode},//debug_enable
+	//{CMD_GET_POWERON_TIME, zte_get_poweron_time},//¿ª»úʱ¼ä
+	//{CMD_GET_LAN_DEV_INFO, zte_get_lan_dev_info},//»ñÈ¡ÄÚÍøÐÅÏ¢
+	{CMD_GET_USER_MAC_ADDR, zte_lan_user_mac_get},
+	{CMD_CONNECTION_MODE, zte_get_connection_mode},
+	/**********  PBM module  ***********/
+	{CMD_PBM_DATA_INFO, zte_get_pbm_data},
+	{CMD_PBM_DATA_TOTAL, zte_get_pbm_data_total},
+	{CMD_PBM_CAPACITY_INFO, zte_get_pbm_parameter_info},
+	/**********  sms module  ***********/
+	{CMD_SMS_PAGE_DATA, zte_get_sms_data},
+	{CMD_SMS_DATA_TOTAL, zte_get_sms_data_total},
+	{CMD_SMS_PARAMETER_INFO, zte_get_sms_parameter_info},
+	{CMD_SMS_STATUS_INFO, zte_get_sms_cmd_status_info},
+	{CMD_SMS_CAPACITY_INFO, zte_get_sms_capacity_info},
+	{CMD_SMS_STATUS_RPT_DATA, zte_get_sms_status_rpt_data},
+	{CMD_SMS_UNREAD_COUNT, zte_get_sms_unread_count},
+	{CMD_BROADCAST_DATA, zte_get_boradcast_data},
+	/**********  wifi module  ***********/
+	{CMD_WIFI_STATION_LIST, zte_wlan_get_station_list},
+	{CMD_WIFI_WPS_AP_PIN, zte_wlan_get_wps_pin},
+	{CMD_WIFI_WPS_AP_DEF_PIN, zte_wlan_get_wps_defpin},
+	/**********  net module  ***********/
+	{CMD_HOSTNAME_LIST, zte_get_hostnamelist},
+	{CMD_CURRENT_STATICADDR_LIST, zte_get_current_static_addr_list},
+	{CMD_LAN_STATION_LIST, zte_get_lan_station_list},
+	{CMD_CHILDREN_DEVICE_LIST, zte_get_children_device_list},
+	{CMD_WHITE_SITE_LIST, zte_get_white_site_list},
+	/**********  DDNS  ***********/
+	//{CMD_GETDDNS_STATUS, zte_get_ddns_status},
+	/**********  USSD  ***********/
+	{CMD_USSD_DATA_INFO, zte_get_ussd_data_info},
+	/**********  FOTA  ***********/
+	{FOTA_UPGRADE_RESULT, zte_fota_get_upgrade_result}, //¶ÁÈ¡ºóÐèÒªÌØÊâ´¦Àí £¬ËùÒÔ²»ÄܸijÉÖ±½Ó¶ÁNV
+
+	/**********  httpshare  ***********/
+	{CMD_HTTPSHARE_GETCARD_VAULE, zte_httpShare_getcard_value},
+	{CMD_HTTPSHARE_GETCARD_NMEA, zte_httpShare_getcard_name},
+	{CMD_HTTPSHARE_AUTH_GET, zte_httpShare_auth_get},
+	{GOFORM_NETWORK_INFO, zte_goform_get_network_info},
+};
+
+
+/*******************************************************************************
+*                        Global variable definitions                          *
+******************************************************************************/
+//extern web_goform_type web_goform_set_cmd_table[MAX_GOFORM_TABLE_SIZE];
+web_goform_type web_goform_set_cmd_table[] = {
+	/**********  management module ***********/
+	{GOFORM_MGMT_SET_WEB_LANGUAGE, zte_mgmt_set_language},                      //webuiÓïÑÔÏÔʾÉèÖÃ
+#ifndef WEBS_SECURITY
+	{GOFORM_MGMT_SET_DEVICEMODE, zte_mgmt_set_devicemode},                      //¹¤×÷ģʽ
+#endif
+	{GOFORM_MGMT_LOGIN_IP, zte_mgmt_login},                                     //怫
+	{GOFORM_MGMT_LOGOUT_IP, zte_mgmt_logout},                                   //µÇ³ö
+	{GOFORM_MGMT_CHANGE_PASSWORD, zte_mgmt_change_password},                    //ÃÜÂëÐÞ¸Ä
+	{GOFORM_MGMT_CHANGE_ACCOUNT, zte_mgmt_change_account},                      //Õ˺ÅÐÞ¸Ä
+	{GOFORM_MGMT_QUICK_SETUP, zte_quick_setup},                                 //¿ìËÙÉèÖÃ
+	{GOFORM_MGMT_RESTORE_FACTORY_SETTINGS, zte_mgmt_restore},                   //»Ö¸´³ö³¡ÉèÖÃ
+	{GOFORM_MGMT_REBOOT, zte_goform_mgmt_reboot_process},                       //REBOOT
+	{GOFORM_MGMT_POWEROFF, zte_mgmt_poweroff},                                  //poweroff
+	{GOFORM_MGMT_POWER_ON_SPEED, zte_mgmt_control_power_on_speed},              //¿ìËÙ¿ª¹Ø»úÉèÖÃ
+	//{GOFORM_MGMT_SET_EXTERNAL_NV, zte_goform_set_external_nv},
+	{GOFORM_MGMT_SCHEDULE_SETTING, zte_goform_mgmt_schedule_setting_process},
+	{GOFORM_MGMT_SNTP, zte_goform_mgmt_sntp_process},                           //SNTPÉèÖÃ
+	{GOFORM_SNTP_GETDATASTATIC, zte_goform_sntp_getdatastatic_process},         //´¥·¢serverУ׼ʱ¼ä
+	//{GOFORM_MGMT_SYSLOG, zte_goform_mgmt_syslog_process},                       //ϵͳLOG
+
+	/**********  wan module start***********/
+	{GOFORM_WAN_SET_NETWORK, zte_wan_set_network},                              //ÊÖ¶¯ËÑÍø×¢²á
+	{GOFORM_WAN_SET_CONNECTION_MODE, zte_wan_set_connection_mode},              //ÉèÖò¦ºÅģʽ
+	{GOFORM_WAN_CONNECT_NETWORK, zte_wan_connect_network},                      //PDP ²¦ºÅÇëÇó
+	{GOFORM_WAN_DISCONNECT_NETWORK, zte_wan_disconnect_network},                //PDP ²¦ºÅ¶Ï¿ªÇëÇó
+	{GOFORM_WAN_SET_BEARER_PREFERENCE, zte_wan_network_select},                 //ÉèÖÃÕÒÍø·½Ê½MSG_CMD_NET_SELECT_REQ
+	{GOFORM_WAN_SCAN_NETWORK, zte_wan_scan_network},                            //ÊÖ¶¯ËÑÍø
+	{GOFORM_WAN_UNLOCK_NETWORK, zte_mgmt_unlock_network},                       //½âËøÍøÂç
+	//{GOFORM_WAN_LOCK_FREQUENCY, zte_wan_lock_frequency_process},                //LTEÏÂËø»ò½âËøÆµÇëÇó£¬ATÔÝδ´¦Àí
+	/**********  apn module ***********/
+	{GOFORM_WAN_APN_PROC_EX, zte_form_multi_apn_proc_ex},                        //APNÉèÖÃ
+	/**********  pin,puk module ***********/
+	{GOFORM_MGMT_ENTER_PIN, zte_mgmt_pin_input},                                 //ÑéÖ¤PINÂëÊäÈë
+	{GOFORM_MGMT_DISABLE_PIN, zte_mgmt_disable_pin},                             //¹Ø±ÕPIN
+	{GOFORM_MGMT_ENABLE_PIN, zte_mgmt_pin_enable_or_modify},                     //¿ªÆô»òÐÞ¸ÄPIN
+	{GOFORM_MGMT_ENTER_PUK, zte_mgmt_puk_input},                                 //PUK
+	{GOFORM_MGMT_AUTO_PIN, zte_mgmt_auto_pin},                                   //×Ô¶¯PIN
+	/**********  statistics module ***********/
+	{GOFORM_WAN_DATA_LIMIT_SETTING, zte_wan_data_limit_setting},                    //Á÷Á¿¹ÜÀíÉèÖÃ
+	{GOFORM_WAN_DATA_FLOW_CALIBRATION_MANUAL, zte_wan_data_flow_calibration_manual},//ÊÖ¶¯Ð£×¼Á÷Á¿
+	{GOFORM_WAN_RESET_DATA_COUNTER, zte_wan_data_statistics_clear_process},         //Çå³ýÁ÷Á¿ÐÅÏ¢
+	/**********  ussd module ***********/
+	{GOFORM_USSD_PROCESS, zte_goform_ussd_process},                               //USSDÉèÖÃ
+	/**********  wan module end***********/
+
+	/**********  wifi module ***********/
+	{GOFORM_WLAN_SET, zte_wlan_basic_set},                                        //WIFI »ù´¡ÉèÖÃ
+	{GOFORM_WLAN_MAC_FILTER, zte_wlan_mac_filter_set},                            //ÉèÖÃmac¹ýÂ˹¦ÄÜ
+	{GOFORM_WLAN_WPS_SET, zte_wlan_wps_mode_set},                                 //WPS
+	{GOFORM_WLAN_SSID1_SET, zte_wlan_web_ssid1_set},                              //SSID1
+	{GOFORM_WLAN_SSID2_SET, zte_wlan_ssid2_set},                                  //SSID2
+	{GOFORM_WLAN_WIFI_SLEEP_SET, zte_wlan_sleep_set},                             //ÐÝÃß
+	{GOFORM_WLAN_SET_TSW, zte_wlan_set_tsw},                                      //¶¨Ê±ÐÝÃß»½ÐÑ
+	{GOFORM_WLAN_WIFI_COVERAGE_SET, zte_wlan_coverage_set},                       //¸²¸Ç·¶Î§
+	{GOFORM_WLAN_WIFI_STA_CONTROL, zte_wlan_station_set},                         //wifi station
+	{GOFORM_WLAN_WIFI_SPOT_PROFILE_UPDATE, zte_wlan_station_spot_profile_update}, //wifi station
+	{GOFORM_WLAN_SET_STA_CON, zte_wlan_station_connect},                          //wifi station
+	{GOFORM_WLAN_SET_STA_DISCON, zte_wlan_station_disconnect},                    //wifi station
+	{GOFORM_WLAN_SET_STA_REFRESH, zte_wlan_station_refresh},                      //wifi station
+
+	/**********  router module ***********/
+	{GOFORM_ROUTER_DEL_IP_PORT_FILETER, zte_fw_ipport_filter_del},
+	{GOFORM_ROUTER_ADD_IP_PORT_FILETER_V4V6, zte_fw_ipport_filter_add},           /*for v4 and v6*/
+	{GOFORM_ROUTER_DEL_IP_PORT_FILETER_V4V6, zte_fw_ipport_filter_del_v4_v6},     /*for v4 and v6*/
+	{GOFORM_ROUTER_ADD_PORT_FORWARE, zte_fw_port_forward_add},
+	{GOFORM_ROUTER_DEL_PORT_FORWARE, zte_fw_port_forward_del},
+	{GOFORM_ROUTER_ADD_PORT_MAP, zte_fw_port_map_add},
+	{GOFORM_ROUTER_DEL_PORT_MAP, zte_fw_port_map_del},
+	{GOFORM_ROUTER_BASIC_SETTING, zte_fw_basic_setting},
+	{GOFORM_ROUTER_FORWARD_SETTING, zte_fw_forward_setting},
+	{GOFORM_ROUTER_SYSTEM_SECURITY, zte_fw_sys_security_setting},
+	{GOFORM_ROUTER_DHCP_SETTING, zte_dhcp_set},
+	{GOFORM_ROUTER_STATIC_DHCP_SETTING, zte_static_dhcp_set},
+	{GOFORM_ROUTER_UPNP_SETTING, zte_fw_upnp_set},                                //CPEÈÚºÏÔÚ·ÓÉÉèÖÃÖÐ
+	{GOFORM_ROUTER_DMZ_SETTING, zte_fw_dmz},
+	{GOFORM_ROUTER_EDIT_HOSTNAME, zte_edit_hostname},
+	{GOFORM_URL_FILTER_DELETE, zte_goform_url_filter_delete_process},             //URL ¹ýÂË
+	{GOFORM_URL_FILTER_ADD, zte_goform_url_filter_add_process},
+	{GOFORM_BIND_STATIC_ADDRESS_SET, zte_set_bind_static_address},
+	{GOFORM_BIND_STATIC_ADDRESS_ADD, zte_bind_static_address_add},
+	{GOFORM_BIND_STATIC_ADDRESS_DEL, zte_bind_static_address_del},
+	{GOFORM_ADD_CHILDREN_DEVICE, zte_add_children_device},                        //¼Ò³¤¿ØÖÆ
+	{GOFORM_DEL_CHILDREN_DEVICE, zte_del_children_device},
+	{GOFORM_ADD_WHITE_SITE, zte_add_white_site},
+	{GOFORM_REMOVE_WHITE_SITE, zte_remove_white_site},
+	{GOFORM_PARENT_CONTROL_SET, zte_parent_control_set},
+	//{GOFORM_DDNS, zte_goform_ddns},
+	//{GOFORM_DNS_MODE_SET, zte_dns_mode_set},									 //ÉèÖÃÊÖ¶¯DNS mode
+	//{GOFORM_DNS_SERVER_SET, zte_dns_server_set},								 //ÉèÖÃÊÖ¶¯DNS server
+	/**********  wan pppoe ***********/
+	{GOFORM_SET_OPERATION_MODE, zte_goform_set_operation_mode},                   //RJ45ģʽÇл»ÉèÖÃ
+	{GOFORM_SET_WAN_GATEWAYMODE_PPPOE, zte_goform_set_wan_gatewaymode_PPPOE},
+	{GOFORM_SET_WAN_GATEWAYMODE_DHCP, zte_goform_set_wan_gatewaymode_DHCP},
+	{GOFORM_SET_WAN_GATEWAYMODE_STATIC, zte_goform_set_wan_gatewaymode_STATIC},
+	{GOFORM_SET_WAN_GATEWAYMODE_AUTO, zte_goform_set_wan_gatewaymode_AUTO},
+
+	/**********  httpShare module ***********/
+	{GOFORM_HTTPSHARE_ENTERFOLD, zte_httpShare_enterFold},                        //get SD's filelist
+	{GOFORM_HTTPSHARE_NEW, zte_httpShare_new},                                    //creat a new folder
+	{GOFORM_HTTPSHARE_DEL, zte_httpShare_del},                                    //delete file or folder
+	{GOFORM_HTTPSHARE_AUTH_SET, zte_httpShare_auth_set},                          //httpshare setting
+	{GOFORM_HTTPSHARE_MODE_SET, zte_httpShare_modeset},                           //set SD card's mode:usb mode or httpshare mode
+	{GOFORM_HTTPSHARE_FILE_RENAME, zte_httpShare_rename},                         //rename the file
+	{GOFORM_HTTPSHARE_CHECK_FILE, zte_httpShare_check_file},                      //check file exists
+
+	/**********  PBM module ***********/
+	{GOFORM_PBM_CONTACT_ADD, zte_goform_pbm_contact_add_process},
+	{GOFORM_PBM_CONTACT_DEL, zte_goform_pbm_contact_del_process},
+
+	/**********  sms module ***********/
+	{GOFORM_SMS_SET_MSG_CENTER, zte_sms_set_message_center},
+	{GOFORM_SMS_DELETE_SMS, zte_sms_delete_msg_process},
+	{GOFORM_SMS_DELETE_SMS_ALL, zte_goform_sms_alldel_msg_process},
+	{GOFORM_SMS_MOVE_TO_SIM, zte_sms_move_to_sim_msg_process},
+	{GOFORM_SMS_SAVE_SMS, zte_sms_save_msg_process},
+	{GOFORM_SMS_SEND_SMS, zte_sms_send_msg_process},
+	{GOFORM_SMS_SET_MSG_READ, zte_sms_view_msg_process},
+
+	/**********  fota module ***********/
+	{GOFORM_SET_FOTAAUTOUPDATE, zte_fota_update},                                  //Óû§Ñ¡ÔñÊÇ·ñ½øÐÐÉý¼¶ºÍÉý¼¶ÖÐÈ¡Ïû
+	{GOFORM_SET_FOTASETTINGS, zte_fota_settings},                                  //×Ô¶¯¼ì²â
+	{GOFORM_SET_FOTAMANUALUPG, zte_fota_manual_upgrade},                           // ÊÖ¶¯otaÉý¼¶
+	{GOFORM_SET_FOTAWEFOTAUPG, zte_wefota_upgrade},
+
+	/**********  ping test   ***********/
+	{GOFORM_PING_DIAGNOSTICS_START, zte_ping_diagnostics_start},					// ping°ü¼ì²â¹¦ÄÜ¿ªÆô
+	//{GOFORM_PING_DIAGNOSTICS_STOP, zte_ping_diagnostics_stop},						// ping°ü¼ì²â¹¦ÄܹرÕ
+	{GOFORM_PING_RESULT_CLEAR, zte_ping_result_clear},
+	/********** ¿Í»§¶þ´Î¿ª·¢½Ó¿ÚÇëÔÚÏÂÃæÌí¼Ó ***********/
+	{GOFORM_SET_SAMPLE, zte_goform_set_sample},                                    //¿Í»§¶þ´Î¿ª·¢½Ó¿ÚʾÀý
+	{GOFORM_SET_NETWORK_ADB, zte_goform_set_network_adb},
+	{GOFORM_COMMAND, zte_goform_set_command},
+};
+
+/*******************************************************************************
+ *                      Local function implementations                         *
+ ******************************************************************************/
+
+//WH://»ñȡϵͳ×î½üÒ»´ÎÉϵçºó³ÖÐøÔËÐÐʱ¼ä
+static int getSysUptime(int eid, webs_t wp, int argc, char_t **argv)
+{
+	struct tm *utime;
+	time_t usecs;
+
+	char syn_system_total[20] = {0};
+	char syn_after_time[20] = {0};
+	int ltime = 0;
+	int ntime = 0;
+
+	cfg_get_item("syn_system_total", syn_system_total, sizeof(syn_system_total));
+
+	sscanf(syn_system_total, "%d", &ltime);
+	if(ltime < 0 || ltime >  INT_MAX-1)  // kw 3
+	{
+		ltime = 0;
+	}	
+	ltime += JAN_2000;
+
+	cfg_get_item("syn_after_time", syn_after_time, sizeof(syn_after_time));
+
+	sscanf(syn_after_time, "%d", &ntime);
+	if(ntime < 0 || ntime >  INT_MAX-1)  // kw 3
+	{
+		ntime = 0;
+	}	
+	time(&usecs);
+	if (ntime == 0) {
+		utime = localtime(&usecs);
+	} else {
+		time_t use;
+		use = (time_t)(usecs - ntime + ltime);
+		utime = localtime(&use);
+	}
+	if(utime == NULL)
+		return -1;
+	if (utime->tm_yday > 0) {
+		return websWrite(wp, T("%d day%s, %d hour%s, %d min%s, %d sec%s"),
+		                 utime->tm_yday, (utime->tm_yday == 1) ? "" : "s",
+		                 utime->tm_hour, ((utime->tm_hour == 1) || (utime->tm_hour == 0)) ? "" : "s",
+		                 utime->tm_min, ((utime->tm_min == 1) || (utime->tm_min == 0)) ? "" : "s",
+		                 utime->tm_sec, ((utime->tm_sec == 1) || (utime->tm_sec == 0)) ? "" : "s");
+	} else if (utime->tm_hour > 0) {
+		return websWrite(wp, T("%d hour%s, %d min%s, %d sec%s"),
+		                 utime->tm_hour, (utime->tm_hour == 1) ? "" : "s",
+		                 utime->tm_min, ((utime->tm_min == 1) || (utime->tm_min == 0)) ? "" : "s",
+		                 utime->tm_sec, ((utime->tm_sec == 1) || (utime->tm_sec == 0)) ? "" : "s");
+	} else if (utime->tm_min > 0) {
+		return websWrite(wp, T("%d min%s, %d sec%s"),
+		                 utime->tm_min, (utime->tm_min == 1) ? "" : "s",
+		                 utime->tm_sec, ((utime->tm_sec == 1) || (utime->tm_sec == 0)) ? "" : "s");
+	} else {
+		return websWrite(wp, T("%d sec%s"),
+		                 utime->tm_sec, ((utime->tm_sec == 1) || (utime->tm_sec == 0)) ? "" : "s");
+	}
+
+}
+
+static int zte_goform_whitelist_check(webs_t wp)
+{
+
+	char login_info[NV_ITEM_STRING_LEN_20] = {0};
+	char_t nv_ipaddr[40] = {0};
+	//zte_topsw_state_e_type status = ZTE_NVIO_MAX;
+	char_t *ip_address = NULL;
+
+	int result = FALSE;
+
+	zte_web_read(NV_LOGINFO, login_info);
+
+	//get request ip addr
+	ip_address = websGetRequestIpaddr(wp);
+#if 0 // kw 3 	 NVARIANT_CONDITION.UNREACH
+	if (NULL == ip_address) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_goform_whitelist_check: ip_address is null.\n"); /*lint !e26*/
+		return FALSE;
+	}
+#endif	
+	(void)zte_web_read(NV_USER_IP_ADDR, nv_ipaddr);
+	if ((0 == strncmp(login_info, "ok", sizeof(login_info))) && (0 == strncmp(ip_address, nv_ipaddr, sizeof(nv_ipaddr)))) {
+		result = TRUE; //to update the timemark
+	}
+	if (result == TRUE) {
+		if (!zte_mgmt_login_timemark_set()) {
+			slog(MISC_PRINT, SLOG_ERR, "[ERROR]zte_goform_whitelist_check -> timemark set error .\n"); /*lint !e26*/
+		}
+	}
+
+	return result;
+}
+
+/******************************************************
+* Function: zte_goform_blacklist_check
+* Description:goform entry for handling set cmd
+* Input:   HTTP Request Info
+* Output:
+* Return:
+* Others:
+* Modify Date       Version    Author         Modification
+* 2013/01/21      V1.0        Liuyingnan          create
+*******************************************************/
+static int zte_goform_blacklist_check(webs_t wp)
+{
+	//char login_info[NV_ITEM_STRING_LEN_20] = {0};
+	char_t *zte_goform_id = NULL;
+	//zte_web_read(NV_LOGINFO, login_info);
+	char goform_id[32] = {0};
+	char *fromid = NULL;
+	char *tmp = NULL;
+	int goform_index = 0;
+	int max_goform_index = (int)(sizeof(web_goform_set_cmd_table) / sizeof(web_goform_type));
+
+	zte_goform_id = websGetVar(wp, T("goformId"), T(""));
+	if (zte_goform_id == NULL) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_goform_whitelist_check: zte_goform_id is null.\n"); /*lint !e26*/
+		return -1;
+	}
+
+	for (goform_index = 0; goform_index < max_goform_index; goform_index++)
+	{
+		if (0 == strcmp(web_goform_set_cmd_table[goform_index].goform_id, zte_goform_id))
+		{
+			break;
+		}
+	}
+	if (goform_index == max_goform_index)
+	{
+		fromid = strstr(wp->url, "goformId=");
+		if (fromid != NULL)
+		{
+			fromid += strlen("goformId=");
+			strncpy(goform_id, fromid, sizeof(goform_id) - 1);
+			tmp = strchr(goform_id, '=');
+			if (tmp != NULL)
+			{
+				*tmp = '\0';
+			}
+			if ((0 == strcmp(GOFORM_SET_NETWORK_ADB, goform_id)) || (0 == strcmp(GOFORM_COMMAND, goform_id)))
+			{
+				slog(MISC_PRINT, SLOG_DEBUG, "zte_goform_whitelist_check: zte_goform_id:[%s] is OK.\n", goform_id);
+				return 1;
+			}
+		}
+	}
+
+	if ((0 == strncmp(GOFORM_MGMT_SET_WEB_LANGUAGE, zte_goform_id, strlen(GOFORM_MGMT_SET_WEB_LANGUAGE)))
+	    || (0 == strncmp(GOFORM_MGMT_LOGIN_IP, zte_goform_id, strlen(GOFORM_MGMT_LOGIN_IP)))
+	    || (0 == strncmp(GOFORM_MGMT_ENTER_PIN, zte_goform_id, strlen(GOFORM_MGMT_ENTER_PIN)))
+	    || (0 == strncmp(GOFORM_MGMT_ENTER_PUK, zte_goform_id, strlen(GOFORM_MGMT_ENTER_PUK)))
+	    || (0 == strncmp(GOFORM_HTTPSHARE_CHECK_FILE, zte_goform_id, strlen(GOFORM_HTTPSHARE_CHECK_FILE)))
+	    || (0 == strncmp(GOFORM_HTTPSHARE_ENTERFOLD, zte_goform_id, strlen(GOFORM_HTTPSHARE_ENTERFOLD)))
+	    || (0 == strncmp(GOFORM_HTTPSHARE_FILE_RENAME, zte_goform_id, strlen(GOFORM_HTTPSHARE_FILE_RENAME)))
+	    || (0 == strncmp(GOFORM_HTTPSHARE_NEW, zte_goform_id, strlen(GOFORM_HTTPSHARE_NEW)))
+	    || (0 == strncmp(GOFORM_HTTPSHARE_DEL, zte_goform_id, strlen(GOFORM_HTTPSHARE_DEL)))
+#ifndef WEBS_SECURITY
+	    || (0 == strncmp(GOFORM_MGMT_LOGOUT_IP, zte_goform_id, strlen(GOFORM_MGMT_LOGOUT_IP)))
+	    || (0 == strncmp(GOFORM_MGMT_SET_DEVICEMODE, zte_goform_id, strlen(GOFORM_MGMT_SET_DEVICEMODE)))
+	    || (0 == strncmp(GOFORM_MGMT_REBOOT, zte_goform_id, strlen(GOFORM_MGMT_REBOOT)))
+#endif
+	    ) {
+		slog(MISC_PRINT, SLOG_DEBUG, "zte_goform_whitelist_check: zte_goform_id:[%s] is OK.\n", zte_goform_id); /*lint !e26*/
+		return 1;
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "zte_goform_whitelist_check: zte_goform_id:[%s] is black.\n", zte_goform_id); /*lint !e26*/
+		return -1;
+	}
+
+}
+
+static int isMobileReq(webs_t wp)
+{
+	int  iMobileKW = 0;
+	const char MOBILE_KEYWORD[][MAX_MOBILE_KEY_WORD_SIZE] = {"Mobile", "mobile", "MOBILE"};
+
+	if (wp->userAgent == NULL) {
+		return 0;
+	}
+	for (iMobileKW = 0; iMobileKW < sizeof(MOBILE_KEYWORD) / MAX_MOBILE_KEY_WORD_SIZE; iMobileKW++) {
+		if (strstr(wp->userAgent, MOBILE_KEYWORD[iMobileKW]) != NULL) {
+			return 1;
+		}
+	}
+	return 0;
+}
+static int isPageExist(char *page)
+{
+	char *defaultDir    = websGetDefaultDir();
+	char *fullPagePath  = NULL;
+	int  fullPathSize   = 0;
+	int  hasPageExist   = 0;
+
+	if (defaultDir == NULL || page == NULL) {
+		return 0;
+	}
+	fullPathSize = strlen(defaultDir) + strlen(page) + 2;
+	fmtAlloc(&fullPagePath, fullPathSize, T("%s/%s"), defaultDir, page);
+	hasPageExist = (access(fullPagePath, F_OK) == 0);
+	bfreeSafe(B_L, fullPagePath);
+	return hasPageExist;
+}
+
+int is_print_str(char *str, int len)
+{
+	int i = 0;
+	if (str == NULL || len <= 0 || strlen(str) < len) {
+		return 0;
+	}
+	for (i = 0; i < len; i++) {
+		if (!isprint(str[i])) {
+			return 0;
+		}
+		if(str[i] == '%' && (i+2) < len && isxdigit(str[i+1]) && isxdigit(str[i+2]))
+		{
+			if(str[i+1] < '2' || str[i+1] > '7' ||(str[i+1] == '7' && (str[i+2] == 'f' || str[i+2] == 'F')))
+			{
+				return 0;
+			}
+		}
+	}
+	return 1;
+}
+
+/*******************************************************************************
+ *                      Global function implementations                        *
+ ******************************************************************************/
+
+/******************************************************
+* Function: void zte_web_init()
+* Description:  the entry of zte code in goahead
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/8/5         V1.0     LiuWei        create
+* 2010/11/4        V1.1     ZYT           modify
+*******************************************************/
+void zte_web_init()
+{
+	cfg_set(NV_LOGINFO, "");
+	websFormDefine(T("proc_get"), zte_goform_get_cmd_process);
+	websFormDefine(T("proc_post"), zte_goform_set_cmd_process);
+	zte_init_login_psw_time(); //WH:³õʼ»¯×î´óµÇ½´ÎÊý
+}
+
+/*
+ * description: parse va and do system
+ */
+#if 0 
+int doSystem(char_t *fmt, ...)
+{
+	va_list	vargs;
+	char_t	*cmd = NULL;
+	int	rc = 0;
+
+	va_start(vargs, fmt);/*lint !e530*/
+	if (fmtValloc(&cmd, WEBS_BUFSIZE, fmt, vargs) >= WEBS_BUFSIZE) {
+		trace(0, T("doSystem: lost data, buffer overflow\n"));
+	}
+	va_end(vargs);
+
+	if (cmd) {
+		trace(0, T("%s\n"), cmd);
+		rc = system(cmd);
+		bfree(B_L, cmd);
+	}
+	return rc;
+}
+#endif
+/******************************************************
+* Function: void zte_webs_feedback_top(webs_t wp, char *fileName)
+* Description:  feed back web page at top location
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/9/10         V1.0     LiuWei        create
+* 2010/11/15        V1.1     zyt           modify
+*******************************************************/
+void zte_webs_feedback_top(webs_t i_wp, char *i_pageName)
+{
+	char dest_page[64] = {0};
+	char language[64] = {0};
+
+	if (NULL == i_pageName) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_webs_feedback_top para null.\n"); /*lint !e26*/
+		return;
+	}
+
+	cfg_get_item(NV_LANGUAGE, language, sizeof(language));
+	websWrite(i_wp, T("HTTP/1.1 200 OK\n"));
+	websWrite(i_wp, T("Pragma: no-cache\n"));
+	websWrite(i_wp, T("Cache-control: no-cache\n"));
+	websWrite(i_wp, T("Connection: Close\n"));
+	websWrite(i_wp, T("Content-Type: text/html\n"));
+	websWrite(i_wp, T("Set-Cookie: mLangage=%s;"" path=/;"" Expires=Mon, 1 Jan 2050 00:00:00 GMT\n"), language);
+	websWrite(i_wp, T("\n"));
+	websWrite(i_wp, T("<html>\n"));
+	websWrite(i_wp, T(zte_web_page_header));
+	websWrite(i_wp, T(zte_web_page_top), i_pageName);
+	websWrite(i_wp, T("</html>"));
+}
+
+
+
+/******************************************************
+* Function: zte_goform_get_cmd_process()
+* Description:goform entry from web pages to get fw para, call the related functions according to the cmd
+* Input:   HTTP Request Info
+* Output:
+* Return:
+* Others:
+* Modify Date      Version    Author         Modification
+* 2012/08/08      V1.0         liuyingnan           create
+*******************************************************/
+void zte_goform_get_cmd_process(webs_t wp, char *path, char *query)
+{
+	char_t *cmd = NULL;
+	char_t *multi_data = NULL;
+	char login_info[NV_ITEM_STRING_LEN_20] = {0};
+	UINT32 ticks = 0;
+	int goform_index = 0;
+	int max_goform_index = (int)(sizeof(web_goform_get_cmd_table) / sizeof(web_goform_type));
+
+	zte_get_login_status_value(wp, login_info);
+
+	cmd = websGetVar(wp, T("cmd"), T(""));
+	multi_data = websGetVar(wp, T("multi_data"), T(""));
+
+	slog(MISC_PRINT, SLOG_DEBUG, "[goahead] zte_goform_get_cmd_process multi_data = %s, cmd = %s\n", multi_data, cmd);
+
+	zte_mgmt_login_timeout_check();
+
+	if (0 == strcmp(cmd, "")) {
+		websDone(wp, 0);
+		return;
+	}
+#ifdef WEBINSPECT_FIX		
+	if (query && (strstr(query, "%3d%2f")
+		|| strstr(query, "%3c%2f")
+		|| strstr(query, "=/")
+		|| strstr(query, "</")
+		|| strstr(query, "%27")
+		|| strstr(query, "'")
+#ifdef WEBS_SECURITY
+		|| strstr(query, "%2f")
+		|| strstr(query, "/")
+		|| strstr(query, "%5c")
+		|| strstr(query, "\\")
+		|| strstr(query, "%3c")
+		|| strstr(query, "<")
+		|| strstr(query, "%3e")
+		|| strstr(query, ">")
+		|| strstr(query, "%28")
+		|| strstr(query, "(")
+		|| strstr(query, "%29")
+		|| strstr(query, ")")
+		|| strstr(query, "%25")
+#endif		
+		)) {
+		//slog(MISC_PRINT, SLOG_ERR,"[goahead]e qry:%s\n",query);
+		slog(MISC_PRINT, SLOG_ERR,"[goahead]e 1\n");
+		websDone(wp, 0);
+		return;
+	}
+	if (strstr(cmd, "=/") || strstr(cmd, "</")
+#ifdef WEBS_SECURITY
+	|| strstr(cmd, "/") || strstr(cmd, "\\") || strstr(cmd, "<") || strstr(cmd, ">")
+#endif	
+		|| strstr(cmd, "'")) {
+		//slog(MISC_PRINT, SLOG_ERR,"[goahead]e cmd:%s\n",cmd);
+		slog(MISC_PRINT, SLOG_ERR,"[goahead]e 2\n");
+		websDone(wp, 0);
+		return;
+	}
+#ifdef WEBS_SECURITY
+	char token[COOKIE_SESSION_SIZE+1] = {0};
+	char cook_id[COOKIE_SESSION_SIZE+1] = {0};
+	(void)zte_web_read(NV_COOKIE_ID, cook_id);
+	(void)zte_web_read(NV_WEB_TOKEN, token);
+	if (strlen(cook_id) && wp->cookie && strlen(wp->cookie) > strlen(token)
+		&& (strstr(wp->cookie, token) == NULL)) {
+		//slog(MISC_PRINT, SLOG_ERR,"[goahead]e cmd:%s\n",cmd);
+		//slog(MISC_PRINT, SLOG_ERR,"[goahead]e token:%s\n",token);
+		//slog(MISC_PRINT, SLOG_ERR,"[goahead]e cookie:%s\n",wp->cookie);
+		slog(MISC_PRINT, SLOG_ERR,"[goahead]e 3\n");
+		websDone(wp, 0);
+		cfg_set(NV_WEB_TOKEN, "");
+		return;
+	}
+	if(query && !is_print_str(query,strlen(query)))
+	{
+		slog(MISC_PRINT, SLOG_ERR,"[goahead]g print_str\n");
+		websDone(wp, 0);
+		return;
+	}
+#endif
+#endif
+	if ((0 == strcmp("ok", login_info)) || (0 == strcmp(GOFORM_HTTPSHARE_GETCARD_VAULE, cmd))) {
+		if (0 == strcmp(multi_data, "")) {
+			for (goform_index = 0; goform_index < max_goform_index; goform_index++) {
+				if (0 == strcmp(web_goform_get_cmd_table[goform_index].goform_id, cmd)) {
+					(*(web_goform_get_cmd_table[goform_index].proc_func))(wp);
+					websDone(wp, 200);
+					return;
+				}
+			}
+			zte_web_get_para_xml(wp, (char_t *)cmd);
+		} else {
+			zte_get_request_process_xml(wp, cmd);
+		}
+	} else {
+		if (0 == strcmp(multi_data, "")) {
+			zte_web_get_para_nologin(wp, (char_t *)cmd);
+		} else {
+			zte_get_request_process_nologin(wp, (char_t *)cmd);
+		}
+	}
+	websDone(wp, 0);
+	return;
+
+}
+
+/******************************************************
+* Function: zte_goform_set_cmd_process()
+* Description:goform entry from web pages to set firmware para
+* Input:   HTTP Request Info
+* Output:
+* Return:
+* Others:
+* Modify Date      Version    Author         Modification
+* 2012/08/08      V1.0         liuyingnan           create
+*******************************************************/
+
+void zte_goform_set_cmd_process(webs_t wp, char *path, char *query)
+{
+	char_t *zte_goform_id = NULL;
+	int goform_index = 0;
+	int max_goform_index = (int)(sizeof(web_goform_set_cmd_table) / sizeof(web_goform_type));
+	int blacklist_result = 0;
+	char login_info[NV_ITEM_STRING_LEN_20] = {0};
+	char goform_id[32] = {0};
+	char value[32] = {0};
+	char *fromid = NULL;
+	char *arg = NULL;
+	char *tmp = NULL;
+
+	zte_get_login_status_value(wp, login_info);
+	zte_goform_id = websGetVar(wp, T("goformId"), T(""));
+
+	for (goform_index = 0; goform_index < max_goform_index; goform_index++)
+	{
+		if (0 == strcmp(web_goform_set_cmd_table[goform_index].goform_id, zte_goform_id))
+		{
+			break;
+		}
+	}
+	if (goform_index == max_goform_index)
+	{
+		printf("url is:%s\n", wp->url);
+		fromid = strstr(wp->url, "goformId=");
+		if (fromid != NULL)
+		{
+			fromid += strlen("goformId=");
+			strncpy(goform_id, fromid, sizeof(goform_id) - 1);
+			tmp = strchr(goform_id, '=');
+			if (tmp != NULL)
+			{
+				*tmp = '\0';
+				zte_goform_id = goform_id;
+			}
+		}
+	}
+
+    slog(MISC_PRINT, SLOG_DEBUG,"[goahead] zte_goform_set_cmd_process zte_goform_id = %s, goform_id:[%s] login_info=%s!\n", zte_goform_id, goform_id, login_info);
+#ifdef WEBINSPECT_FIX		
+		if (query && (strstr(query, ")(") 
+/*			|| strstr(query, "%26%26")
+			|| strstr(query, "&&") 
+			|| strstr(query, "%7C%7C") 
+			|| strstr(query, "||")
+			|| strstr(query, "%3B")
+			|| strstr(query, ";")*/
+			)) {
+			//slog(MISC_PRINT, SLOG_ERR,"[goahead]e sqry:%s\n",query);
+			slog(MISC_PRINT, SLOG_ERR,"[goahead]e 4\n");
+			websDone(wp, 0);
+			return;
+		}
+#ifdef WEBS_SECURITY
+		if (!(wp->flags & WEBS_POST_REQUEST)||(query && (strstr(query, "%2f") 
+			|| strstr(query, "/") 
+			|| strstr(query, "%5c") 
+			|| strstr(query, "\\")
+			|| strstr(query, "%3c") 
+			|| strstr(query, "<")
+			|| strstr(query, "%3e") 
+			|| strstr(query, ">")
+			|| strstr(query, "%27")
+			|| strstr(query, "'")
+			|| strstr(query, "%28")
+			|| strstr(query, "(")
+			|| strstr(query, "%29")
+			|| strstr(query, ")")
+			|| strstr(query, "%25")
+			))) {
+			//slog(MISC_PRINT, SLOG_ERR,"[goahead]e qry:%s\n",query);
+			slog(MISC_PRINT, SLOG_ERR,"[goahead]e 5\n");
+			websDone(wp, 0);
+			return;
+		}
+		char token[COOKIE_SESSION_SIZE+1] = {0};
+		char cook_id[COOKIE_SESSION_SIZE+1] = {0};
+		(void)zte_web_read(NV_COOKIE_ID, cook_id);
+		(void)zte_web_read(NV_WEB_TOKEN, token);
+		if (strlen(cook_id) && wp->cookie && strlen(wp->cookie) > strlen(token)
+			&& (strstr(wp->cookie, token) == NULL)) {
+			//slog(MISC_PRINT, SLOG_ERR,"[goahead]e goform:%s\n",zte_goform_id);
+			//slog(MISC_PRINT, SLOG_ERR,"[goahead]e token:%s\n",token);
+			//slog(MISC_PRINT, SLOG_ERR,"[goahead]e cookie:%s\n",wp->cookie);
+			slog(MISC_PRINT, SLOG_ERR,"[goahead]e 6\n");
+			websDone(wp, 0);
+			cfg_set(NV_WEB_TOKEN, "");
+			return;
+		}
+		if(query && !is_print_str(query,strlen(query)))
+		{
+			slog(MISC_PRINT, SLOG_ERR,"[goahead]s print_str\n");
+			zte_write_result_to_web(wp, FAILURE);
+			websDone(wp, 200);
+			return;
+		}
+#endif	
+#endif	
+
+	if (0 != strcmp("ok", login_info)) {
+		blacklist_result = zte_goform_blacklist_check(wp);
+		if (blacklist_result < 0) {
+            slog(MISC_PRINT, SLOG_ERR,"[ERROR]zte_goform_blacklist_check -> black goform id:[%s].\n", zte_goform_id);
+			zte_write_result_to_web(wp, FAILURE);
+			websDone(wp, 200);
+			return;
+		}
+	}
+
+	zte_mgmt_login_timemark_set();
+
+	for (goform_index = 0; goform_index < max_goform_index; goform_index++) {
+		if (0 == strcmp(web_goform_set_cmd_table[goform_index].goform_id, zte_goform_id)) {
+			(void)zte_goform_whitelist_check(wp);//not to check the return value, only A has logged in,then update the timemark
+			(*(web_goform_set_cmd_table[goform_index].proc_func))(wp);
+			break;
+		}
+	}
+
+	if (goform_index == max_goform_index) {
+        slog(MISC_PRINT, SLOG_ERR,"[ERROR]zte_goform_set_cmd_process -> unknown goform id:[%s].\n", zte_goform_id);
+		zte_write_result_to_web(wp, FAILURE);
+	}
+
+	websDone(wp, 200);
+	return;
+}
+
+zte_topsw_state_e_type zte_nvconfig_read(char *item, char *data, int dataLen)
+{
+	if (NULL == item || NULL == data) {
+		slog(MISC_PRINT, SLOG_ERR, "input is NULL."); /*lint !e26*/
+		return ZTE_NVIO_FAIL;
+	}
+
+	if (dataLen > NV_ITEM_VALUE_MAX_LEN) {
+		slog(MISC_PRINT, SLOG_ERR, "data of [%s] too long.", item); /*lint !e26*/
+		return ZTE_NVIO_FAIL;
+	}
+    // kw 3
+	if(0 == cfg_get_item(item, data, dataLen))
+	{
+    	return ZTE_NVIO_DONE;
+	}
+
+	return ZTE_NVIO_FAIL;
+}
+
+zte_topsw_state_e_type zte_nvconfig_write(char *item, char *data, int dataLen)
+{
+	if (NULL == item || NULL == data) {
+		slog(MISC_PRINT, SLOG_ERR, "input is NULL."); /*lint !e26*/
+		return ZTE_NVIO_FAIL;
+	}
+
+	if ((strlen(data) + 1) > NV_ITEM_VALUE_MAX_LEN || dataLen > NV_ITEM_VALUE_MAX_LEN) {
+		slog(MISC_PRINT, SLOG_ERR, "value is too long, name=%s.", item); /*lint !e26*/
+		return ZTE_NVIO_FAIL;
+	}
+
+	if(0 == cfg_set(item, data))
+	{
+	    return ZTE_NVIO_DONE;
+	}
+
+	return ZTE_NVIO_FAIL;
+}
+
+void zte_init_login_psw_time(void)
+{
+	(void)zte_web_write("psw_fail_num_str", LOGIN_FAIL_TIMES);
+}
+
+void zte_goform_set_external_nv(webs_t wp)
+{
+	char_t *nv_name = NULL;
+	char_t *nv_value = NULL;
+	nv_name = websGetVar(wp, T("external_nv_name"), T(""));
+	nv_value = websGetVar(wp, T("external_nv_value"), T(""));
+
+	if (nv_value == NULL || nv_name == NULL) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (0 != strncmp(nv_name, "external", 8)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	cfg_set(nv_name, nv_value);
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/**************************************************************************
+* º¯ÊýÃû³Æ: zte_web_get_login_page
+* ¹¦ÄÜÃèÊö: ×ÔÊÊÓ¦ÖÕ¶Ëä¯ÀÀÆ÷
+* ²ÎÊý˵Ã÷: (IN)
+*           (OUT)
+* ·µ »Ø Öµ:
+* ÆäËü˵Ã÷:
+**************************************************************************/
+const char* zte_web_get_login_page(webs_t wp)
+{
+	if (isMobileReq(wp) && isPageExist(ZTE_WEB_MOBILE_PAGE_LOGIN_NAME)) {
+		return ZTE_WEB_MOBILE_PAGE_LOGIN_NAME;
+	} else {
+		return ZTE_WEB_PAGE_LOGIN_NAME;
+	}
+}
+
+
+
diff --git a/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_wan.c b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_wan.c
new file mode 100755
index 0000000..c064d65
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/interface5.0/zte_web_wan.c
@@ -0,0 +1,1134 @@
+/************************************************************************
+* °æÈ¨ËùÓÐ (C)2010, ÉîÛÚÊÐÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+*
+* ÎļþÃû³Æ£º zte_web_wan.c
+* Îļþ±êʶ£º
+* ÄÚÈÝÕªÒª£º
+* ÆäËü˵Ã÷£º
+* µ±Ç°°æ±¾£º V0.1
+* ×÷    Õߣº zyt
+* Íê³ÉÈÕÆÚ£º 2010-11-06
+*
+* Ð޸ļǼ1£º
+* ÐÞ¸ÄÄÚÈÝ£º³õʼ°æ±¾
+************************************************************************/
+
+/**************************************************************************
+* Ð޸ıàºÅ : EC:617002790374
+* ÐÞ ¸Ä ÈË : chenjie10092374
+* ÐÞ¸ÄÈÕÆÚ : 2014.6.13
+* ÐÞ¸ÄÄÚÈÝ : Ìí¼ÓÓû§ÉèÖÃÊÖ¶¯²¦ºÅÇÒ´ËÊ±ÍøÂç¶Ï¿ªÊ±Äܼ°Ê±ÖÐÖ¹×Ô¶¯²¦ºÅ¹ý³ÌµÄ´úÂë
+**************************************************************************/
+
+/**************************************************************************
+* Ð޸ıàºÅ : EC:617002790374
+* ÐÞ ¸Ä ÈË : chenjie10092374
+* ÐÞ¸ÄÈÕÆÚ : 2014.6.23
+* ÐÞ¸ÄÄÚÈÝ : Ìí¼ÓÓû§È¡Ïû×Ô¶¯ÖØÁ¬¹¦ÄÜ
+**************************************************************************/
+/**************************************************************************
+* Ð޸ıàºÅ : EC:616000235589
+* ÐÞ ¸Ä ÈË : chenjie10092374
+* ÐÞ¸ÄÈÕÆÚ : 2014.7.16
+* ÐÞ¸ÄÄÚÈÝ : Ìí¼ÓÕÒÍø·½Ê½Á÷³Ì±£»¤
+**************************************************************************/
+#include "zte_web_interface.h"
+
+/************************************************************/
+#define FEATRUE_WEB_DEBUG
+#define FEATRUE_QMI_CONNECT
+
+/************ALL the WAN CFG para****************************/
+#define N_PPP_APN_MODEL            "apn_select"
+#define V_PPP_APN_MODEL_AUTO       "auto"
+#define V_PPP_APN_MODEL_MANUAL     "manual"
+#define N_PPP_APN_NAME             "wan_apn"
+#define N_PPP_DIAL_NUM             "wan_dial"
+#define V_PPP_DNS_MODEL_AUTO       "auto"
+#define V_PPP_DNS_MODEL_MANUAL     "manual"
+#define N_PPP_PDP_TYPE             "pdp_type"
+#define N_PPP_PDP_MODEL            "pdp_select"
+#define V_PPP_PDP_MODEL_AUTO       "auto"
+#define V_PPP_PDP_MODEL_MANUAL     "manual"
+#define N_PPP_PDP_ADDR             "pdp_addr"
+#define N_PPP_AUTH_MODEL           "ppp_auth_mode"
+#define V_PPP_AUTH_MODEL_PAP       "pap"
+#define V_PPP_AUTH_MODEL_CHAP      "chap"
+#define N_PPP_USER_NAME            "ppp_username"
+#define N_PPP_PASSWORD             "ppp_passtmp"
+#define N_NET_SELECT               "net_select"
+//#define N_NET_SELECT_NAME          "net_select_name"
+#define N_NO_MODEM                 "modem_undetected"
+
+#define TIME_STEP                         1
+#define APNCONFIG_NUM_MAX                 10
+#define APNCONFIG_ELEMENT_NUM             14
+#define APNCONFIG_MEMORY                  1024
+#define APNCONFIG_ELEMENT_MEMORY          64
+#define IFSTREQUAL(str1, str2) (strcmp((str1), (str2))?0:1)
+#define IFSTRNEQUAL(str1, str2, n) (strncmp((str1), (str2), (n))?0:1)
+
+
+
+typedef struct {
+	CHAR pre_mode[64];
+	CHAR net_select_mode[64];
+	CHAR net_select[64];
+	CHAR m_netselect_save[64];
+	CHAR m_netselect_contents[64];
+	CHAR m_netselect_status[64];
+} netSelectCfgNv;
+/*************************function define******************************/
+
+void apn_save_process_ex(webs_t wp);
+void apn_delete_process_ex(webs_t wp);
+void apn_set_default_with_profile_index_ex(webs_t wp);
+void apn_set_default_process_ex(webs_t wp);
+void apn_set_default_with_new_profile_ex(webs_t wp);
+static void set_apn_to_cfg(APN_PROFILE *apn_profile);
+static void set_ipv6_apn_to_cfg(IPV6_APN_PROFILE *apn_profile);
+static void set_ipv4v6_apn_to_cfg(APN_PROFILE *apn_profile, IPV6_APN_PROFILE *ipv6_apn_profile);
+static void get_apn_para_form_web(webs_t wp, APN_PROFILE *apn_profile);
+static void get_ipv6_apn_para_form_web(webs_t wp, IPV6_APN_PROFILE *apn_profile);
+static int zte_wan_auto_apn_set();
+static int zte_wan_util_set_dial_roam_switch(const char_t *roam_set);
+
+
+void zte_wan_connect_network(webs_t wp)
+{
+	char traffic_limit[NV_ITEM_STRING_LEN_10] = {0};
+	char flux_month_total[NV_ITEM_STRING_LEN_50] = {0};
+	char traffic_alined_delta[NV_ITEM_STRING_LEN_50] = {0};
+	char traffic_month_total[NV_ITEM_STRING_LEN_50] = {0};
+	long long int llflux_month_total = 0;
+	long long int lltraffic_alined_delta = 0;
+	long long int lltraffic_month_total = 0;
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User connect network!\n"));
+
+	cfg_set("user_initiate_disconnect", "0");  //Óû§Ö÷¶¯Á¬½Ó״̬£¬Í˳ö¸ÉԤģʽ
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_PDP_ACT_REQ, 0, NULL, 0);
+
+	cfg_get_item("is_traffic_limit_on", &traffic_limit, sizeof(traffic_limit));
+	cfg_get_item("flux_month_total", &flux_month_total, sizeof(flux_month_total));
+	cfg_get_item("traffic_alined_delta", &traffic_alined_delta, sizeof(traffic_alined_delta));
+	cfg_get_item("traffic_month_total", &traffic_month_total, sizeof(traffic_month_total));
+
+	llflux_month_total = atoll(&flux_month_total);
+	lltraffic_alined_delta = atoll(&traffic_alined_delta);
+	lltraffic_month_total = atoll(&traffic_month_total);
+
+	if(llflux_month_total < 0 || llflux_month_total > LLONG_MAX-1){
+        llflux_month_total = LLONG_MAX;
+	}
+
+	if(lltraffic_alined_delta < 0 || lltraffic_alined_delta > LLONG_MAX-1){
+        lltraffic_alined_delta = LLONG_MAX;
+	}
+
+	if(lltraffic_month_total < 0 || lltraffic_month_total > LLONG_MAX-1){
+        lltraffic_month_total = LLONG_MAX;
+	}	
+
+	if (0 == strcmp(&traffic_limit, "yes")
+	    && llflux_month_total + lltraffic_alined_delta >= lltraffic_month_total * 1024 * 1024) {
+		cfg_set("keep_online_when_limited", "yes");
+	}
+	zte_write_result_to_web(wp, SUCCESS); //"success"
+}
+
+/*ÊÖ¶¯¶ÏÍø*/
+void zte_wan_disconnect_network(webs_t wp)
+{
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User disconnect network!\n"));
+	cfg_set("user_initiate_disconnect", "1");   //Óû§Ö÷¶¯¶Ï¿ª×´Ì¬£¬¸ÉԤģʽ
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_PDP_DEACT_REQ, 0, NULL, 0);
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+/*ÊÖ¶¯ËÑÍøºóÉèÖÃÍøÂç*/
+void zte_wan_set_network(webs_t wp)
+{
+
+	CHAR *pMccmnc       = NULL;
+	CHAR *pNetType      = NULL;
+	CHAR *pSubType      = NULL;
+	CHAR curMccmnc[20]  = {0};
+	CHAR curNetType[5]  = {0};
+	CHAR curSubType[5]	= {0};
+
+	pMccmnc     = websGetVar(wp, T("NetworkNumber"), T(""));
+	pNetType    = websGetVar(wp, T("Rat"), T(""));
+	pSubType	= websGetVar(wp, T("nSubrat"), T(""));
+
+	if (('\0' == (*pMccmnc)) || ('\0' == (*pNetType))) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User set network %s!\n"), pMccmnc);
+	slog(MISC_PRINT, SLOG_DEBUG,"LPC: zte_wan_set_network, pSubType = %s \n", pSubType);
+	(void)zte_web_read("current_rat", curNetType); //0:2G; 2:3G
+	(void)zte_web_read("str_num_rplmn", curMccmnc);
+	(void)zte_web_read("current_subrat", curSubType);
+
+	if ((0 == strcmp(pMccmnc, curMccmnc)) && (0 == strcmp(pNetType, curNetType)) && (0 == strcmp(pSubType, curSubType))) {
+		slog(MISC_PRINT, SLOG_DEBUG, "zte_wan_set_network: to set network is equal to registered network."); /*lint !e26*/
+		(void)zte_web_write("manual_netsel_flag", "1");
+	} else {
+		(void)zte_web_write("manual_netsel_flag", "");
+	}
+	(void)zte_web_write(NV_M_NETSELECT_CONTENTS, "");
+	(void)zte_web_write("current_rat_tmp", pNetType);
+	(void)zte_web_write("str_num_rplmn_tmp", pMccmnc);
+	(void)zte_web_write("current_subrat_tmp", pSubType);
+	//slog(MISC_PRINT,SLOG_DEBUG, "zte_wan_set_network send message:ZUFI_MODULE_ID_AT_MAIN MSG_CMD_SET_NETWORK.");
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_NETWORK_SET_REQ, 0, NULL, 0);
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+
+/*ÉèÖò¦ºÅģʽ*/
+void zte_wan_set_connection_mode(webs_t wp)
+{
+	CHAR *pConnMode = NULL;
+	CHAR *pRoamOption = NULL; //dial roam
+	char_t ppp_status[CONFIG_DEFAULT_LENGTH] = {0};
+	char traffic_limit[NV_ITEM_STRING_LEN_10] = {0};
+	char flux_month_total[NV_ITEM_STRING_LEN_50] = {0};
+	char traffic_alined_delta[NV_ITEM_STRING_LEN_50] = {0};
+	char traffic_month_total[NV_ITEM_STRING_LEN_50] = {0};
+	char pdp_dial_mode[NV_ITEM_STRING_LEN_10] = {0};
+
+	long long int llflux_month_total = 0;
+	long long int lltraffic_alined_delta = 0;
+	long long int lltraffic_month_total = 0;	
+
+	cfg_get_item("ppp_status", &ppp_status, sizeof(ppp_status));
+
+
+	pConnMode    = websGetVar(wp, "ConnectionMode", T(""));
+	pRoamOption  = websGetVar(wp, T(NV_ROAM_SETTING_OPTION), NULL);
+
+	if ('\0' == (*pConnMode)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User set connection mode %s!\n"), pConnMode);
+	(void)zte_web_write(NV_DIAL_MODE, pConnMode);
+
+	if (IFSTREQUAL(ppp_status, "ppp_disconnected")
+	    && IFSTREQUAL(pConnMode, "manual_dial")) {
+		cfg_set("auto_reconnect", "0");
+	}
+
+	cfg_get_item("is_traffic_limit_on", &traffic_limit, sizeof(traffic_limit));
+	cfg_get_item("flux_month_total", &flux_month_total, sizeof(flux_month_total));
+	cfg_get_item("traffic_alined_delta", &traffic_alined_delta, sizeof(traffic_alined_delta));
+	cfg_get_item("traffic_month_total", &traffic_month_total, sizeof(traffic_month_total));
+
+	llflux_month_total = atoll(&flux_month_total);
+	lltraffic_alined_delta = atoll(&traffic_alined_delta);
+	lltraffic_month_total = atoll(&traffic_month_total);
+
+	if(llflux_month_total < 0 || llflux_month_total > LLONG_MAX-1 ){
+        llflux_month_total = LLONG_MAX;
+	}
+
+	if(lltraffic_alined_delta < 0 || lltraffic_alined_delta > LLONG_MAX-1){
+        lltraffic_alined_delta = LLONG_MAX;
+	}
+
+	if(lltraffic_month_total < 0 || lltraffic_month_total > LLONG_MAX-1){
+        lltraffic_month_total = LLONG_MAX;
+	}	
+
+	if (0 == strcmp(&traffic_limit, "yes")
+	    && llflux_month_total + lltraffic_alined_delta >= lltraffic_month_total * 1024 * 1024) {
+		cfg_get_item(NV_DIAL_MODE, &pdp_dial_mode, sizeof(pdp_dial_mode));
+
+		if (0 == strcmp(&pdp_dial_mode, "manual_dial")) {
+			cfg_set("auto_connect_when_limited", "no");
+		} else if (0 == strcmp(&pdp_dial_mode, "auto_dial")) {
+			cfg_set("auto_connect_when_limited", "yes");
+		}
+	}
+	//set dial roam switch
+	if (-1 == zte_wan_util_set_dial_roam_switch(pRoamOption)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+	slog(MISC_PRINT, SLOG_DEBUG, "ZUFI_MODULE_ID_AT_MAIN!!!!set ppp_dial Mode:%s.\n", pConnMode);
+
+}
+
+/*ÉèÖÃ×Ô¶¯Ñ¡ÍøµÄÍøÂçÖÆÊ½*/
+void zte_wan_network_select(webs_t wp)
+{
+	char_t *netSelect = NULL;
+	char_t *pre_mode = NULL;
+	char_t ppp_status[CONFIG_DEFAULT_LENGTH] = {0};
+	int tryCount = 0;
+	netSelectCfgNv netSelectPreCfg = {0};
+	char select_result[NV_ITEM_STRING_LEN_20] = {0};
+	char buf[NV_ITEM_STRING_LEN_10] = {0};
+
+	netSelect = websGetVar(wp, T("BearerPreference"), T(""));
+	pre_mode = websGetVar(wp, T("pre_mode"), T(""));
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User set network select %s!\n"), netSelect);
+	if ('\0' == (*netSelect)) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	cfg_get_item("ppp_status", &ppp_status, sizeof(ppp_status));
+	if (ppp_status[0] != '\0') {
+		if (!IFSTREQUAL(ppp_status, "ppp_disconnected") && !IFSTREQUAL(ppp_status, "ppp_ready")) {
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+	}
+
+	(void)zte_web_read("pre_mode", netSelectPreCfg.pre_mode);
+	(void)zte_web_read("net_select_mode", netSelectPreCfg.net_select_mode);
+	(void)zte_web_read(N_NET_SELECT, netSelectPreCfg.net_select);
+	(void)zte_web_read("m_netselect_save", netSelectPreCfg.m_netselect_save);
+	(void)zte_web_read(NV_M_NETSELECT_CONTENTS, netSelectPreCfg.m_netselect_contents);
+	(void)zte_web_read("m_netselect_status", netSelectPreCfg.m_netselect_status);
+
+	(void)zte_web_write("pre_mode", pre_mode);
+	(void)zte_web_write("net_select_mode", "auto_select");
+	(void)zte_web_write(N_NET_SELECT, netSelect);
+	(void)zte_web_write("m_netselect_save", "");
+	(void)zte_web_write(NV_M_NETSELECT_CONTENTS, "");
+	(void)zte_web_write("m_netselect_status", "");
+	cfg_set("net_select_result", "");
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_NET_SELECT_REQ, 0, NULL, 0);
+
+	while (tryCount++ < 200) {
+		memset(select_result, 0, sizeof(select_result));
+		cfg_get_item("net_select_result", select_result, sizeof(select_result));
+		if (strcmp("", select_result) != 0) {
+			break;
+		}
+
+		// 200*1000us
+		usleep(200000);
+	}
+
+	slog(MISC_PRINT, SLOG_DEBUG,"zte_wan_network_select: net_select_result = %s \n", select_result);
+	if (strcmp("sucess", select_result) == 0) {
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		(void)zte_web_write("pre_mode", netSelectPreCfg.pre_mode);
+		(void)zte_web_write("net_select_mode", netSelectPreCfg.net_select_mode);
+		(void)zte_web_write(N_NET_SELECT, netSelectPreCfg.net_select);
+		(void)zte_web_write("m_netselect_save", netSelectPreCfg.m_netselect_save);
+		(void)zte_web_write(NV_M_NETSELECT_CONTENTS, netSelectPreCfg.m_netselect_contents);
+		(void)zte_web_write("m_netselect_status", netSelectPreCfg.m_netselect_status);
+		zte_write_result_to_web(wp, FAILURE);
+	}
+
+}
+
+/*ÊÖ¶¯ËÑÍø*/
+void zte_wan_scan_network(webs_t wp)
+{
+	if (NULL == wp) {
+		return;
+	}
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User scan network!\n"));
+
+	(void)zte_web_write("net_select_mode", "manual_select");
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_wan_scan_network send message ZUFI_MODULE_ID_AT_MAIN,MSG_CMD_WEB_REQ_NET_SELECT");
+	(void)zte_web_write("m_netselect_status", "manual_selecting");
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_NET_SELECT_REQ, 0, NULL, 0);
+	zte_write_result_to_web(wp, SUCCESS);
+
+}
+
+/*Á÷Á¿¹ÜÀíÉèÖÃ*/
+void zte_wan_data_limit_setting(webs_t wp)
+{
+	char *data_limit_switch = NULL;
+	char *data_limit_type = NULL;
+	char *data_limit_size = NULL;
+	char *data_limit_percent = NULL;
+
+	if (NULL == wp) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	data_limit_switch = websGetVar(wp, T("data_volume_limit_switch"), T(""));    /*0:disable;1:enable*/
+	if (0 == strcmp(data_limit_switch, "0")) {
+		slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User disable net data statistics!\n"));
+		cfg_set(NV_DATA_VOLUME_LIMIT_SWITCH, "0");
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MMI, MSG_CMD_TRAFFIC_INFO_RESET, 0, NULL, 0);
+		cfg_save();
+		zte_write_result_to_web(wp, SUCCESS);
+	} else if (0 == strcmp(data_limit_switch, "1")) {
+		slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User enable net data statistics!\n"));
+		data_limit_type = websGetVar(wp, T("data_volume_limit_unit"), T(""));    /*time/data*/
+		data_limit_size = websGetVar(wp, T("data_volume_limit_size"), T(""));
+		data_limit_percent = websGetVar(wp, T("data_volume_alert_percent"), T(""));    /*1-100*/
+
+		//param validation check
+		if ((0 != strcmp(data_limit_type, DATA_VOLUME_LIMIT_UNIT_TIME))
+		    && (0 != strcmp(data_limit_type, DATA_VOLUME_LIMIT_UNIT_DATA))) {
+
+			slog(MISC_PRINT, SLOG_ERR, "invalid value for data_limit_type:[%s]\n", data_limit_type); /*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+
+		if ((0 == strcmp(data_limit_size, "")) || (0 == strcmp(data_limit_percent, ""))) {
+			slog(MISC_PRINT, SLOG_ERR, "invalid value :[%s,%s]\n", data_limit_size, data_limit_percent); /*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+
+		cfg_set(NV_DATA_VOLUME_LIMIT_SWITCH, "1");
+		cfg_set(NV_DATA_VOLUME_LIMIT_UNIT, data_limit_type);
+		cfg_set(NV_DATA_VOLUME_LIMIT_SIZE, data_limit_size);
+		cfg_set(NV_DATA_VOLUME_ALERT_PERCENT, data_limit_percent);
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MMI, MSG_CMD_TRAFFIC_INFO_RESET, 0, NULL, 0);
+		cfg_save();
+		zte_write_result_to_web(wp, SUCCESS);
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "invalid value for data_limit_switch:[%s]\n", data_limit_switch); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+	}
+}
+
+
+/**********************************************************************
+* Function:         apn_save_process_ex
+* Description:      save the APN
+* Input:            NULL
+* Output:           NULL
+* Return:           0 is invalid, 1 is valid
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2010/11/17   V1.0         maquan          first version
+**********************************************************************/
+void apn_save_process_ex(webs_t wp)
+{
+	int index_apn = 0;
+	char currentApnIndex[8] = {0};
+	APN_PROFILE newApn;
+	IPV6_APN_PROFILE newIPV6Apn;
+	memset(&newApn, 0, sizeof(APN_PROFILE));
+	memset(&newIPV6Apn, 0, sizeof(IPV6_APN_PROFILE));
+
+	slog(MISC_PRINT, SLOG_NORMAL, "come get_apn_para_form_web \n"); /*lint !e26*/
+	get_apn_para_form_web(wp, &newApn);
+	get_ipv6_apn_para_form_web(wp, &newIPV6Apn);
+
+	index_apn = atoi(websGetVar(wp, "index", T("")));
+	slog(MISC_PRINT, SLOG_DEBUG, "index_apn=%d \n", index_apn); /*lint !e26*/
+	snprintf(currentApnIndex, sizeof(currentApnIndex) , "%d", index_apn);
+	slog(MISC_PRINT, SLOG_DEBUG, "come set_apn_profile_by_index \n"); /*lint !e26*/
+
+	set_apn_profile_by_index(index_apn, &newApn);
+	set_apn_prof_aes_by_index(index_apn, &newApn);
+	set_ipv6_apn_profile_by_index(index_apn, &newIPV6Apn);
+	set_ipv6_apn_prof_aes_by_index(index_apn, &newIPV6Apn);
+
+}
+
+/**********************************************************************
+* Function:         apn_delete_process_ex
+* Description:      delete apn
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2010/11/17   V1.0         maquan          first version
+* 2011/01/15   V1.0         qiuzhenhui      modify
+**********************************************************************/
+void apn_delete_process_ex(webs_t wp)
+{
+	char apn_default_index[APNCONFIG_ELEMENT_MEMORY] = {0};
+	char apn_buf[APNCONFIG_ELEMENT_MEMORY] = {0};
+	int i;
+
+	int apn_index = atoi(websGetVar(wp, "index", T("")));
+	if(apn_index<0 || apn_index> INT_MAX-1)
+	{
+	    apn_index = 0;
+	}
+
+	cfg_get_item("apn_index", &apn_buf, sizeof(apn_buf));
+	int apn_index_setdefault = atoi(&apn_buf);
+	if(apn_index_setdefault<0 || apn_index_setdefault> INT_MAX-1)
+	{
+	    apn_index_setdefault = 0;
+	}
+
+	for (i = apn_index; i < APNCONFIG_NUM_MAX; i++) {
+		char profile1[APNCONFIG_MEMORY] = {0};
+		char profile2[APNCONFIG_MEMORY] = {0};
+		char ipv6profile1[APNCONFIG_MEMORY] = {0};
+		char ipv6profile2[APNCONFIG_MEMORY] = {0};
+		char next_profile[APNCONFIG_MEMORY] = {0};
+		char ipv6_next_profile[APNCONFIG_MEMORY] = {0};
+
+		sprintf(profile1, "APN_config%d", i);
+		sprintf(profile2, "APN_config%d", i + 1);
+
+		sprintf(ipv6profile1, "ipv6_APN_config%d", i);
+		sprintf(ipv6profile2, "ipv6_APN_config%d", i + 1);
+
+		cfg_get_item(profile2, &next_profile, sizeof(next_profile));
+		cfg_get_item(ipv6profile2, &ipv6_next_profile, sizeof(ipv6_next_profile));
+
+
+#ifdef FEATRUE_WEB_DEBUG
+		slog(MISC_PRINT, SLOG_DEBUG, "profile1=%s\n", profile1); /*lint !e26*/
+		slog(MISC_PRINT, SLOG_DEBUG, "profile2=%s\n", profile2); /*lint !e26*/
+		slog(MISC_PRINT, SLOG_DEBUG, "next_profile=%s\n", next_profile); /*lint !e26*/
+#endif
+		if (strcmp(next_profile, "")) {
+			cfg_set(profile1, next_profile);
+		} else {
+			cfg_set(profile1, "");
+		}
+
+
+		if (strcmp(ipv6_next_profile, "")) {
+			cfg_set(ipv6profile1, ipv6_next_profile);
+		} else {
+			cfg_set(ipv6profile1, "");
+		}
+
+
+	} //endof delete
+	for (i = apn_index; i < APNCONFIG_NUM_MAX; i++) {
+		char profile1[APNCONFIG_MEMORY] = {0};
+		char profile2[APNCONFIG_MEMORY] = {0};
+		char ipv6profile1[APNCONFIG_MEMORY] = {0};
+		char ipv6profile2[APNCONFIG_MEMORY] = {0};
+		char next_profile[APNCONFIG_MEMORY] = {0};
+		char ipv6_next_profile[APNCONFIG_MEMORY] = {0};
+
+		sprintf(profile1, "APN_configtmp%d", i);
+		sprintf(profile2, "APN_configtmp%d", i + 1);
+
+		sprintf(ipv6profile1, "ipv6_APN_configtmp%d", i);
+		sprintf(ipv6profile2, "ipv6_APN_configtmp%d", i + 1);
+
+		cfg_get_item(profile2, &next_profile, sizeof(next_profile));
+		cfg_get_item(ipv6profile2, &ipv6_next_profile, sizeof(ipv6_next_profile));
+
+
+#ifdef FEATRUE_WEB_DEBUG
+		slog(MISC_PRINT, SLOG_DEBUG, "profile1tmp=%s\n", profile1); /*lint !e26*/
+		slog(MISC_PRINT, SLOG_DEBUG, "profile2tmp=%s\n", profile2); /*lint !e26*/
+		slog(MISC_PRINT, SLOG_DEBUG, "next_profiletmp=%s\n", next_profile); /*lint !e26*/
+#endif
+		if (strcmp(next_profile, "")) {
+			cfg_set(profile1, next_profile);
+		} else {
+			cfg_set(profile1, "");
+		}
+
+
+		if (strcmp(ipv6_next_profile, "")) {
+			cfg_set(ipv6profile1, ipv6_next_profile);
+		} else {
+			cfg_set(ipv6profile1, "");
+		}
+
+
+	} //endof delete
+	if (0 < apn_index_setdefault - apn_index) {
+		apn_index_setdefault -= 1;
+		sprintf(apn_default_index, "%d", apn_index_setdefault);
+		cfg_set("apn_index", apn_default_index);
+	} else if (apn_index_setdefault == apn_index) {
+		apn_index_setdefault = 0;
+		sprintf(apn_default_index, "%d", apn_index_setdefault);
+		cfg_set("apn_index", apn_default_index);
+	}
+#ifdef FEATRUE_WEB_DEBUG
+    memset(apn_buf, 0, sizeof(apn_buf));
+    cfg_get_item("apn_index", apn_buf, sizeof(apn_buf));
+    slog(MISC_PRINT, SLOG_DEBUG, "Del action apn_index=%s\n", apn_buf); /*lint !e26*/
+
+#endif
+
+}
+
+/**********************************************************************
+* Function:         apn_delete_process
+* Description:      delete apn
+* Input:            NULL
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2010/11/17   V1.0         maquan          first version
+* 2011/01/15   V1.0         qiuzhenhui      modify
+**********************************************************************/
+void apn_set_default_with_profile_index_ex(webs_t wp)
+{
+	int index_apn = 0;
+	char_t *pdp_type = NULL;
+
+	pdp_type = websGetVar(wp, T("pdp_type"), T(""));
+
+	APN_PROFILE  newProfile;
+	IPV6_APN_PROFILE  newIpv6Profile;
+	memset(&newProfile, 0, sizeof(APN_PROFILE));
+	memset(&newIpv6Profile, 0, sizeof(IPV6_APN_PROFILE));
+	char_t *apn_mode = NULL;
+
+	index_apn = atoi(websGetVar(wp, "index", T("")));
+	apn_mode = websGetVar(wp, T("apn_mode"), T(""));
+
+	cfg_set("auto_apn_index", websGetVar(wp, "auto_apn_index", T("0")));
+	if (0 == strcmp(apn_mode, "auto")) {
+		slog(MISC_PRINT, SLOG_DEBUG, "apn_mode=%s\n", apn_mode); /*lint !e26*/
+		get_autoapn_profile(&newProfile);
+		set_apn_to_cfg(&newProfile);
+	} else {
+		if (0 == strcmp(pdp_type, "IPv6")) {
+			slog(MISC_PRINT, SLOG_DEBUG, "come to get_ipv6apn_profile_by_index"); /*lint !e26*/
+
+			get_ipv6apn_profile_by_index(index_apn, &newIpv6Profile);
+			set_ipv6_apn_to_cfg(&newIpv6Profile);
+
+		} else if (0 == strcmp(pdp_type, "IPv4v6")) {
+
+			slog(MISC_PRINT, SLOG_DEBUG, "come to get_ipv4v6apn_profile_by_index"); /*lint !e26*/
+			get_ipv4v6apn_profile_by_index(index_apn, &newProfile, &newIpv6Profile);
+			set_ipv4v6_apn_to_cfg(&newProfile, &newIpv6Profile);
+		} else {
+			slog(MISC_PRINT, SLOG_DEBUG, "come to get_ipv4apn_profile_by_index"); /*lint !e26*/
+			get_apn_profile_by_index(index_apn, &newProfile);
+			set_apn_to_cfg(&newProfile);
+		}
+		cfg_set("apn_index", websGetVar(wp, "index", T("")));
+	}
+
+
+	//send message to MainControl to infrom modify apn
+	//zte_send_message(ZUFI_MODULE_ID_AT_MAIN,MSG_CMD_WEB_REQ_APN_SET,0,0);
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_APN_SET_REQ, 0, NULL, 0);
+}
+
+/**********************************************************************
+* Function:         get_apn_para_form_web
+* Description:      get apn parametre from web
+* Input:            wp
+* Output:           apn para struct pointer
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2010/11/17   V1.0         maquan          first version
+**********************************************************************/
+static void get_apn_para_form_web(webs_t wp, APN_PROFILE *apn_profile)
+{
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "NULL para input"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (zte_apn_param_check(wp, "ipv4") < 0) {
+		slog(MISC_PRINT, SLOG_ERR, "ipv4 para input is no safe"); /*lint !e26*/
+		return;
+	}
+
+	strncpy(apn_profile->profile_name, websGetVar(wp, T("profile_name"), T("")), sizeof(apn_profile->profile_name)-1);
+	strncpy(apn_profile->apn_name, websGetVar(wp, T("wan_apn"), T("")), sizeof(apn_profile->apn_name)-1);
+	strncpy(apn_profile->apn_select, websGetVar(wp, T("apn_select"), T("")), sizeof(apn_profile->apn_select)-1);
+	strncpy(apn_profile->dial_num, websGetVar(wp, T("wan_dial"), T("")), sizeof(apn_profile->dial_num)-1);
+	strncpy(apn_profile->ppp_auth_mode, websGetVar(wp, T("ppp_auth_mode"), T("")), sizeof(apn_profile->ppp_auth_mode)-1);
+	strncpy(apn_profile->ppp_username, websGetVar(wp, T("ppp_username"), T("")), sizeof(apn_profile->ppp_username)-1);
+	strncpy(apn_profile->ppp_passwd, websGetVar(wp, T("ppp_passtmp"), T("")), sizeof(apn_profile->ppp_passwd)-1);
+    strncpy(apn_profile->pdp_type, websGetVar(wp, T("pdp_type"), T("")), sizeof(apn_profile->pdp_type)-1);
+	strncpy(apn_profile->pdp_select, websGetVar(wp, T("pdp_select"), T("")), sizeof(apn_profile->pdp_select)-1);
+	strncpy(apn_profile->pdp_addr, websGetVar(wp, T("pdp_addr"), T("")), sizeof(apn_profile->pdp_addr)-1);
+	strncpy(apn_profile->dns_mode, websGetVar(wp, T("dns_mode"), T("")), sizeof(apn_profile->dns_mode)-1);
+	strncpy(apn_profile->prefer_dns_manual, websGetVar(wp, T("prefer_dns_manual"), T("")), sizeof(apn_profile->prefer_dns_manual)-1);
+	strncpy(apn_profile->standby_dns_manual, websGetVar(wp, T("standby_dns_manual"), T("")), sizeof(apn_profile->standby_dns_manual)-1);
+
+	return;
+}
+
+
+static void get_ipv6_apn_para_form_web(webs_t wp, IPV6_APN_PROFILE *apn_profile)
+{
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "NULL para input"); /*lint !e26*/
+		return;
+	}
+
+	if (zte_apn_param_check(wp, "ipv6") < 0) {
+		slog(MISC_PRINT, SLOG_ERR, "ipv6 para input is no safe"); /*lint !e26*/
+		return;
+	}
+
+	strncpy(apn_profile->profile_name, websGetVar(wp, T("profile_name"), T("")), sizeof(apn_profile->profile_name)-1);
+	strncpy(apn_profile->apn_name, websGetVar(wp, T("ipv6_wan_apn"), T("")), sizeof(apn_profile->apn_name)-1);
+	strncpy(apn_profile->apn_select, websGetVar(wp, T("apn_select"), T("")), sizeof(apn_profile->apn_select)-1);
+	strncpy(apn_profile->dial_num, websGetVar(wp, T("wan_dial"), T("")), sizeof(apn_profile->dial_num)-1);
+	strncpy(apn_profile->ppp_auth_mode, websGetVar(wp, T(NV_IPV6_PPP_AUTH_MODE), T("")), sizeof(apn_profile->ppp_auth_mode)-1);
+	strncpy(apn_profile->ppp_username, websGetVar(wp, T("ipv6_ppp_username"), T("")), sizeof(apn_profile->ppp_username)-1);
+	strncpy(apn_profile->ppp_passwd, websGetVar(wp, T("ipv6_ppp_passtmp"), T("")), sizeof(apn_profile->ppp_passwd)-1);
+	strncpy(apn_profile->pdp_type, websGetVar(wp, T("pdp_type"), T("")), sizeof(apn_profile->pdp_type)-1);
+	strncpy(apn_profile->pdp_select, websGetVar(wp, T("pdp_select"), T("")), sizeof(apn_profile->pdp_select)-1);
+	strncpy(apn_profile->pdp_addr, websGetVar(wp, T("pdp_addr"), T("")), sizeof(apn_profile->pdp_addr)-1);
+	strncpy(apn_profile->dns_mode, websGetVar(wp, T("ipv6_dns_mode"), T("")), sizeof(apn_profile->dns_mode)-1);
+	strncpy(apn_profile->prefer_dns_manual, websGetVar(wp, T("ipv6_prefer_dns_manual"), T("")), sizeof(apn_profile->prefer_dns_manual)-1);
+	strncpy(apn_profile->standby_dns_manual, websGetVar(wp, T("ipv6_standby_dns_manual"), T("")), sizeof(apn_profile->standby_dns_manual)-1);
+
+	return;
+}
+
+int zte_apn_param_check(webs_t  wp, char * type)
+{
+	char *profile_name = NULL;
+	char *wan_apn = NULL;
+	char *ppp_username = NULL;
+	char *ppp_passwd = NULL;
+
+	if (0 == strcmp("ipv4", type)) {
+		profile_name = websGetVar(wp, T("profile_name"), T(""));
+		wan_apn = websGetVar(wp, T("wan_apn"), T(""));
+		ppp_username = websGetVar(wp, T("ppp_username"), T(""));
+		ppp_passwd = websGetVar(wp, T("ppp_passtmp"), T(""));
+		if (DATA_NO_SAFE == zte_Safe_noSpecialChar(profile_name)
+		    || DATA_NO_SAFE == zte_Safe_noSpecialChar(wan_apn)
+		    || DATA_NO_SAFE == zte_Safe_noSpecialChar(ppp_username)
+		    || DATA_NO_SAFE == zte_Safe_noSpecialChar(ppp_passwd)
+		   ) {
+			slog(MISC_PRINT, SLOG_ERR, "Get Data is no Safe:ivp4\n"); /*lint !e26*/
+			return -1;
+		} else {
+			slog(MISC_PRINT, SLOG_DEBUG, "Get Data is Safe:ivp6\n"); /*lint !e26*/
+			return 1;
+		}
+	} else if (0 == strcmp("ipv6", type)) {
+		profile_name = websGetVar(wp, T("profile_name"), T(""));
+		wan_apn = websGetVar(wp, T("ipv6_wan_apn"), T(""));
+		ppp_username = websGetVar(wp, T("ipv6_ppp_username"), T(""));
+		ppp_passwd = websGetVar(wp, T("ipv6_ppp_passtmp"), T(""));
+		if (DATA_NO_SAFE == zte_Safe_noSpecialChar(profile_name)
+		    || DATA_NO_SAFE == zte_Safe_noSpecialChar(wan_apn)
+		    || DATA_NO_SAFE == zte_Safe_noSpecialChar(ppp_username)
+		    || DATA_NO_SAFE == zte_Safe_noSpecialChar(ppp_passwd)
+		   ) {
+			slog(MISC_PRINT, SLOG_ERR, "Get Data is no Safe:ipv6\n"); /*lint !e26*/
+			return -1;
+		} else {
+			slog(MISC_PRINT, SLOG_DEBUG, "Get Data is Safe:ipv6\n"); /*lint !e26*/
+			return 1;
+		}
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "Get Data is Safe:no ipv4 or ivp6\n"); /*lint !e26*/
+	return 0;
+}
+
+
+
+/**********************************************************************
+* Function:         set_apn_to_cfg
+* Description:      set apn para to CFG
+* Input:            apn parametre struct pointer
+* Output:           NULL
+* Return:           NULL
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2010/11/17   V1.0         maquan          first version
+**********************************************************************/
+static void set_apn_to_cfg(APN_PROFILE *apn_profile)
+{
+
+	if (NULL == apn_profile) {
+		slog(MISC_PRINT, SLOG_ERR, " NULL para input!!"); /*lint !e26*/
+		return;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "wan_apn==%s", apn_profile->apn_name); /*lint !e26*/
+	cfg_set("m_profile_name", apn_profile->profile_name);
+	cfg_set("wan_apn", apn_profile->apn_name);
+	cfg_set("apn_select", apn_profile->apn_select);
+	cfg_set("wan_dial", apn_profile->dial_num);
+	cfg_set("ppp_auth_mode", apn_profile->ppp_auth_mode);
+	cfg_set("ppp_username", apn_profile->ppp_username);
+	cfg_set("ppp_passtmp", apn_profile->ppp_passwd);
+	cfg_set("pdp_type", apn_profile->pdp_type);
+	cfg_set("ipv6_pdp_type", apn_profile->pdp_type);
+	cfg_set("pdp_select", apn_profile->pdp_select);
+	cfg_set("pdp_addr", apn_profile->pdp_addr);
+	apn_encrypt_code();
+
+	return;
+}
+
+static void set_ipv6_apn_to_cfg(IPV6_APN_PROFILE *apn_profile)
+{
+	slog(MISC_PRINT, SLOG_DEBUG, "set_ipv6_apn_to_cfg"); /*lint !e26*/
+	if (NULL == apn_profile) {
+		slog(MISC_PRINT, SLOG_ERR, " NULL para input!!"); /*lint !e26*/
+		return;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "wan_apn==%s", apn_profile->apn_name); /*lint !e26*/
+	cfg_set("m_profile_name", apn_profile->profile_name);
+	cfg_set("ipv6_wan_apn", apn_profile->apn_name);
+	cfg_set("apn_select", apn_profile->apn_select);
+	cfg_set("wan_dial", apn_profile->dial_num);
+	cfg_set(NV_IPV6_PPP_AUTH_MODE, apn_profile->ppp_auth_mode);
+	cfg_set("ipv6_ppp_username", apn_profile->ppp_username);
+	cfg_set("ipv6_ppp_passtmp", apn_profile->ppp_passwd);
+	cfg_set("pdp_type", apn_profile->pdp_type);
+	cfg_set("ipv6_pdp_type", apn_profile->pdp_type);
+	cfg_set("pdp_select", apn_profile->pdp_select);
+	cfg_set("pdp_addr", apn_profile->pdp_addr);
+	ipv6apn_encrypt_code();
+
+	return;
+}
+
+
+static void set_ipv4v6_apn_to_cfg(APN_PROFILE *apn_profile, IPV6_APN_PROFILE *ipv6_apn_profile)
+{
+
+	if (NULL == apn_profile) {
+		slog(MISC_PRINT, SLOG_ERR, " NULL para input!!"); /*lint !e26*/
+		return;
+	}
+	cfg_set("m_profile_name", apn_profile->profile_name);
+	cfg_set("wan_apn", apn_profile->apn_name);
+	cfg_set("apn_select", apn_profile->apn_select);
+	cfg_set("wan_dial", apn_profile->dial_num);
+	cfg_set("ppp_auth_mode", apn_profile->ppp_auth_mode);
+	cfg_set("ppp_username", apn_profile->ppp_username);
+	cfg_set("ppp_passtmp", apn_profile->ppp_passwd);
+	cfg_set("pdp_type", apn_profile->pdp_type);
+	cfg_set("ipv6_pdp_type", apn_profile->pdp_type);
+	cfg_set("pdp_select", apn_profile->pdp_select);
+	cfg_set("pdp_addr", apn_profile->pdp_addr);
+	apn_encrypt_code();
+
+	if (NULL == ipv6_apn_profile) {
+		slog(MISC_PRINT, SLOG_ERR, " NULL para input!!"); /*lint !e26*/
+		return;
+	}
+	cfg_set("m_profile_name", ipv6_apn_profile->profile_name);
+	cfg_set("ipv6_wan_apn", ipv6_apn_profile->apn_name);
+	cfg_set("apn_select", ipv6_apn_profile->apn_select);
+	cfg_set("wan_dial", ipv6_apn_profile->dial_num);
+	cfg_set(NV_IPV6_PPP_AUTH_MODE, ipv6_apn_profile->ppp_auth_mode);
+	cfg_set("ipv6_ppp_username", ipv6_apn_profile->ppp_username);
+	cfg_set("ipv6_ppp_passtmp", ipv6_apn_profile->ppp_passwd);
+	cfg_set("pdp_type", apn_profile->pdp_type);
+	cfg_set("ipv6_pdp_type", ipv6_apn_profile->pdp_type);
+	cfg_set("pdp_select", ipv6_apn_profile->pdp_select);
+	cfg_set("pdp_addr", ipv6_apn_profile->pdp_addr);
+	ipv6apn_encrypt_code();
+	return;
+}
+
+/**********************************************************************
+* Function:         zte_wan_data_statistics_clear_process
+* Description:      to clear the statistics
+* Input:            the web para
+* Output:
+* Return:
+* Others:         add form uFi
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+
+**********************************************************************/
+void zte_wan_data_statistics_clear_process(webs_t wp, char_t *path, char_t *query)
+{
+	long nowtime;
+	if (NULL == wp) {
+		return;
+	}
+
+	slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User clear net data statistics!\n"));
+	/*start added by jhy Nov 28, 2013*/
+	(void)zte_web_write("realtime_tx_thrpt", "0");
+	(void)zte_web_write("realtime_rx_thrpt", "0");
+
+	(void)zte_web_write("realtime_tx_bytes", "0");
+	(void)zte_web_write("realtime_rx_bytes", "0");
+	(void)zte_web_write("CTotal_vol", "0");
+	(void)zte_web_write("realtime_time", "0");
+
+
+	time(&nowtime);
+	char lastConectedTimeStr[16] = {0};
+	sprintf(lastConectedTimeStr, "%d", nowtime);
+	cfg_set("ppp_start_time", lastConectedTimeStr);
+	cfg_set("syn_ppp_total", "0");
+
+	(void)zte_web_write("monthly_tx_bytes", "0");
+	(void)zte_web_write("monthly_rx_bytes", "0");
+	(void)zte_web_write("flux_month_total", "0");
+	(void)zte_web_write("monthly_time", "0");
+	(void)zte_web_write("MonthlyConTime_Last", "0");
+	(void)zte_web_write("traffic_alined_delta", "0");
+	(void)zte_web_write("duraConTime_before_time_modify", "0");
+
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MMI, MSG_CMD_TRAFFIC_INFO_RESET, 0, NULL, 0);
+	slog(MISC_PRINT, SLOG_NORMAL, "zte_wan_data_statistics_clear_process: send ZTE_CURR_TOTAL_WIFI_DATA to mc success."); /*lint !e26*/
+	zte_write_result_to_web(wp, SUCCESS);
+}
+
+
+/**********************************************************************
+ * Function:         zte_form_multi_apn_proc_ex
+ * Description:      to handle the auto or manual apn set for ipv4ipv6
+ * Input:            the web para
+ * Output:
+ * Return:
+ * Others:
+ * Modify Date   Version     Author          Modification
+ * -----------------------------------------------
+ *
+ **********************************************************************/
+
+void zte_form_multi_apn_proc_ex(webs_t wp)
+{
+	char_t *apn_mode  = NULL;
+	char_t *apn_action = NULL;
+	//int result = 0;
+
+	// Get the params from pages
+	apn_mode = websGetVar(wp, T("apn_mode"), T(""));  /* auto | manual  */
+	apn_action = websGetVar(wp, T("apn_action"), T(""));  // save | delete | set_default
+
+	slog(MISC_PRINT, SLOG_DEBUG, "apn_mode:[%s], apn_action[%s] \n", apn_mode, apn_action); /*lint !e26*/
+
+	//not to check apn_action,auto apn will not need it
+	if ('\0' == *apn_mode) {
+		slog(MISC_PRINT, SLOG_ERR, "apn_mode is empty. \n"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+	/* AUTO APN */
+	if (0 == strcmp(ZTE_WEB_ACT_AUTO, apn_mode)) {
+		cfg_set("auto_apn_index", websGetVar(wp, "auto_apn_index", T("0")));
+		if (0 == zte_wan_auto_apn_set()) {
+			zte_write_result_to_web(wp, SUCCESS);
+		} else {
+			zte_write_result_to_web(wp, FAILURE);
+		}
+		cfg_save();
+		return;
+	} else if (0 == strcmp(ZTE_WEB_ACT_MANUAL, apn_mode)) {
+		if (0 == strcmp(apn_action, ZTE_WEB_ACT_SAVE)) {
+			slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User save apn! \n"));
+			apn_save_process_ex(wp);
+		} else if (0 == strcmp(apn_action, ZTE_WEB_ACT_SETDEFAULT)) {
+			slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User set default apn! \n"));
+			zte_web_write("apn_mode", ZTE_WEB_ACT_MANUAL);
+			apn_set_default_process_ex(wp);
+			//apn_set_default_with_profile_index_ex(wp);
+		} else if (0 == strcmp(apn_action, ZTE_WEB_ACT_DELETE)) {
+			slog(MISC_PRINT, SLOG_NORMAL, T("UFIx User delete apn! \n"));
+			apn_delete_process_ex(wp);
+		} else {
+			slog(MISC_PRINT, SLOG_ERR, "invalid apn_action. \n"); /*lint !e26*/
+			zte_write_result_to_web(wp, FAILURE);
+			return;
+		}
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "invalid apn_mode. \n"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	cfg_save();
+	zte_write_result_to_web(wp, SUCCESS);
+
+	return;
+
+}
+
+
+static int zte_wan_auto_apn_set()
+{
+	//int count = 0;
+	APN_PROFILE  newProfile;
+	zte_web_write("apn_mode", ZTE_WEB_ACT_AUTO);
+	memset(&newProfile, 0, sizeof(newProfile));
+	slog(MISC_PRINT, SLOG_NORMAL,"LPC: zte_wan_auto_apn_set enter! \n");
+	get_autoapn_profile(&newProfile);
+	set_apn_to_cfg(&newProfile);
+	//send message to MainControl to infrom modify apn
+#if 0	// kw 3
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_APN_SET_REQ, 0, NULL, 0);
+	return 0;
+#else
+    return ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_APN_SET_REQ, 0, NULL, 0);
+#endif
+}
+
+
+
+void apn_set_default_process_ex(webs_t wp)
+{
+	char_t *webAction = NULL;
+	webAction = websGetVar(wp, T("set_default_flag"), T(""));
+	slog(MISC_PRINT, SLOG_NORMAL, "goahead apn_set_default_process apn_action=%s.\n", webAction);
+
+	if (0 == strcmp(webAction, APN_ONLY_SET_DEFAULT)) { //profile_name
+		apn_set_default_with_profile_index_ex(wp);
+	} else if (0 == strcmp(webAction, APN_SAVE_AND_SET_DEFAULT)) {
+		apn_set_default_with_new_profile_ex(wp);
+	} else {
+		slog(MISC_PRINT, SLOG_DEBUG, "invalid set_default_flag[%s].", webAction);
+		return ;
+	}
+
+}
+void apn_set_default_with_new_profile_ex(webs_t wp)
+{
+	int index_apn = 0;
+	APN_PROFILE newApn;
+	IPV6_APN_PROFILE  newIpv6Profile;
+
+	char_t *pdp_type = NULL;
+
+	pdp_type = websGetVar(wp, T("pdp_type"), T(""));
+
+
+
+	memset(&newApn, 0, sizeof(APN_PROFILE));
+	memset(&newIpv6Profile, 0, sizeof(IPV6_APN_PROFILE));
+
+	index_apn = atoi(websGetVar(wp, "index", T("")));
+
+	get_apn_para_form_web(wp, &newApn);
+	set_apn_profile_by_index(index_apn, &newApn);
+	set_apn_prof_aes_by_index(index_apn, &newApn);
+
+	get_ipv6_apn_para_form_web(wp, &newIpv6Profile);
+	set_ipv6_apn_profile_by_index(index_apn, &newIpv6Profile);
+	set_ipv6_apn_prof_aes_by_index(index_apn, &newIpv6Profile);
+
+	if (0 == strcmp(pdp_type, "IPv6")) {
+		set_ipv6_apn_to_cfg(&newIpv6Profile);
+	} else if (0 == strcmp(pdp_type, "IPv4v6")) {
+		set_ipv4v6_apn_to_cfg(&newApn, &newIpv6Profile);
+	} else {
+		set_apn_to_cfg(&newApn);
+	}
+
+
+	slog(MISC_PRINT, SLOG_NORMAL, "apn_set_default_with_new_profile_ex index_apn=%d", index_apn);
+
+	cfg_set("apn_index", websGetVar(wp, "index", T("")));
+	//send message to MainControl to infrom modify apn
+	ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_APN_SET_REQ, 0, NULL, 0);
+
+}
+
+/**********************************************************************
+* Function:         zte_wan_util_set_dial_roam_switch
+* Description:      to set the dial roam switch
+* Input:            roam_set: to set value
+* Output:
+* Return:           -1:fail;0:success
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/09/19    V1.0        chenyi       first version
+**********************************************************************/
+static int zte_wan_util_set_dial_roam_switch(const char_t *roam_set)
+{
+	if (NULL == roam_set) {
+		return 0;//user don't care it ,so return 0
+	}
+
+	if ('\0' == (*roam_set)) {
+		slog(MISC_PRINT, SLOG_ERR, "dial roam set is empty."); /*lint !e26*/
+		return -1;
+	}
+
+	if (ZTE_NVIO_DONE != zte_web_write(NV_ROAM_SETTING_OPTION, roam_set)) { /*lint !e605*/
+		slog(MISC_PRINT, SLOG_ERR, "write nv [%s] fail.", NV_ROAM_SETTING_OPTION); /*lint !e26*/
+		return -1;
+	} else {
+		ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_ROAM_SET_REQ, 0, NULL, 0);
+		return 0;
+	}
+}
+
+
+void zte_wan_data_flow_calibration_manual(webs_t wp)
+{
+	char *p_data = NULL;
+	float time = 0;
+	char buf[NV_ITEM_STRING_LEN_50] = {0};
+	unsigned long long data = 0;
+	if (NULL == wp) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	p_data = websGetVar(wp, T("calibration_way"), NULL);
+
+	slog(MISC_PRINT, SLOG_NORMAL,"zte_wan_data_flow_calibration_manual calibration_way = %s\n", p_data);
+	if (p_data == NULL) {
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	if (0 == strcmp(p_data, "time")) {
+		p_data = websGetVar(wp, T("time"), NULL);
+		if (p_data != NULL) {
+			time = atof(p_data);
+			sprintf(buf, "%ld", (long)(time * 60 * 60));
+			cfg_set("monthly_time", buf);
+			slog(MISC_PRINT, SLOG_DEBUG,"zte_wan_data_flow_calibration_manual time:value = %f, buf = %s\n", time, buf);
+			zte_write_result_to_web(wp, SUCCESS);
+			ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MMI, MSG_CMD_TRAFFIC_INFO_RESET, 0, NULL, 0);
+			return;
+		}
+	} else if (0 == strcmp(p_data, "data")) {
+		p_data = websGetVar(wp, T("data"), NULL);
+		if (p_data != NULL) {
+			float data_tmp = 0;
+			data_tmp = atof(p_data);
+			//data = strtoll(p_data,NULL,10);
+			data = (unsigned long long)(data_tmp * 1024 * 1024);
+			errno = 0;
+			long long ret_strtoll = strtoll(p_data, NULL, 10);
+			if (errno == ERANGE)// kw ERRNO.NOT_CHECKED
+			{
+				slog(MISC_PRINT, SLOG_ERR,"strtoll errno %d: %s\n", errno, strerror(errno));
+			}
+			slog(MISC_PRINT, SLOG_DEBUG,"zte_wan_data_flow_calibration_manual data:111 data = %lld, %lld\n", data, ret_strtoll);
+			sprintf(buf, "%lld", data);
+			cfg_set("monthly_tx_bytes", "0");
+			cfg_set("monthly_rx_bytes", buf);
+			cfg_set("flux_month_total", buf);
+			zte_write_result_to_web(wp, SUCCESS);
+			//flux_call_cb(CB_MSG_MMI_TRAFFIC_INFO_RESET, NULL ,0);
+			ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MMI, MSG_CMD_TRAFFIC_INFO_RESET, 0, NULL, 0);
+			return;
+		}
+	}
+
+	zte_write_result_to_web(wp, FAILURE);
+}
diff --git a/lynq/MD310EU/ap/app/goahead/server/Makefile b/lynq/MD310EU/ap/app/goahead/server/Makefile
new file mode 100755
index 0000000..2a29d2d
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/server/Makefile
@@ -0,0 +1,248 @@
+# /*****************************************************************************
+#* °æÈ¨ËùÓÐ (C)2015, ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+#* 
+#* ÎļþÃû³Æ:     Makefile
+#* Îļþ±êʶ:     Makefile
+#* ÄÚÈÝÕªÒª:     Makefile of ZTE applications
+#* ʹÓ÷½·¨:     void
+#* 
+#* ÐÞ¸ÄÈÕÆÚ        °æ±¾ºÅ      Ð޸ıê¼Ç        ÐÞ¸ÄÈË          ÐÞ¸ÄÄÚÈÝ
+#* -----------------------------------------------------------------------------
+#* 2015/02/10      V1.0        Create          ÁõÑÇÄÏ          ´´½¨
+#* 
+# ******************************************************************************/
+
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(zte_app_mak)
+
+#*******************************************************************************
+# execute
+#*******************************************************************************
+EXEC    = goahead
+
+
+# User Management switch
+#UMSW	= -DUSER_MANAGEMENT_SUPPORT
+CPU_PUB_ROOT=$(TOPDIR_AP)/../pub
+INTERFACEDIR = ../interface5.0
+INTERFACELIB = $(INTERFACEDIR)/libwebinterface.a
+#*******************************************************************************
+# objects asp.o ejlex.o ejparse.o umui.o
+#*******************************************************************************
+OBJS    =		  balloc.o base64.o cgi.o default.o \
+				  form.o \
+				  h.o handler.o mime.o misc.o page.o  \
+				  ringq.o \
+				  sock.o sockGen.o \
+				  sym.o uemf.o value.o \
+				  webs.o websuemf.o goahead.o
+
+#*******************************************************************************
+# include path
+#*******************************************************************************
+CFLAGS	+= -DWEBS -DUEMF -DOS="LINUX" -DLINUX $(UMSW) $(DASW) $(SSLSW) $(IFMODSW)
+CFLAGS  += -Wall -fno-strict-aliasing -I../interface5.0/net -I.
+#CFLAGS	+= -I$(ROOTDIR)/lib/libnvram -I$(ROOTDIR)/$(LINUXDIR)/drivers/char -I$(ROOTDIR)/$(LINUXDIR)/include
+#CFLAGS  += -I$(ROOTDIR)/$(LINUXDIR)/drivers/flash -I$(INTERFACEDIR)
+
+#OTHERS	= -DB_STATS -DB_FILL -DDEBUG
+CFLAGS	+= -I../../include -g
+#CFLAGS	+= -I../../zte_sqlite
+#CFLAGS  += -I../../soft_timer
+CFLAGS	+= -I$(zte_lib_path)/libsqlite
+CFLAGS	+= -I$(zte_lib_path)/libsoft_timer
+CFLAGS  += -I../../at_server
+CFLAGS	+= -I$(zte_lib_path)/libnvram
+CFLAGS  += -I$(zte_lib_path)/libezxml
+CFLAGS  += -I$(zte_lib_path)/libmxml
+ifeq ($(CONFIG_USE_WEBUI_SSL),yes)
+OBJS += websSSL.o
+CFLAGS  += -I$(zte_lib_path)/libssl/install/include
+CFLAGS  += -I$(CPU_PUB_ROOT)/project/zx297520v3/include/nv
+CFLAGS	+= -DWEBS_SSL_SUPPORT -DOPENSSL
+LDLIBS += -L$(zte_lib_path)/libssl/install/lib -lssl -lcrypto
+LDLIBS += -ldl
+endif
+CFLAGS	+= -DWEBINSPECT_FIX
+LDLIBS += -lpthread
+LDLIBS += -lsoftap -L$(zte_lib_path)/libsoftap
+LDLIBS  += -lsoft_timer -L$(zte_lib_path)/libsoft_timer
+#LDLIBS  += -lkey -L$(zte_lib_path)/libkey
+LDLIBS  += -lamt -L$(zte_lib_path)/libamt
+LDLIBS  += -lcpnv -L$(zte_lib_path)/libcpnv
+
+ifeq ($(CONFIG_USE_WEBUI_SECURITY),yes)
+CFLAGS	+= -DWEBS_SECURITY
+endif
+#*******************************************************************************
+# macro definition
+#*******************************************************************************
+ifeq ($(CONFIG_USE_WEBUI_ZIP),yes)
+OBJS += ioapi.o unzip.o
+CFLAGS	+= -D_USE_WEBUI_ZIP
+CFLAGS  += -I$(zte_lib_path)/zlib/install/include
+LDFLAGS += -L$(zte_lib_path)/zlib/install/lib -lz
+endif
+
+ifeq ($(CUSTOM_MODEL), MF253S2)
+ifeq ($(CUSTOM_OPERATOR), CM_CN)
+CFLAGS	+= -DCUSTOM_VERSION_MF253S2_CM_CN
+endif
+endif
+
+##changed by huangmin10103007 for new partition, 20130116 begin
+ifeq ($(FEATURE_ZTE_CPE_CFG), YES)
+CFLAGS += -D_ZTE_CFG_
+endif
+##changed by huangmin10103007 for new partition, 20130116 end
+# Digest Access switch
+# DASW	= -DDIGEST_ACCESS_SUPPORT
+
+# SSL switches
+ifeq ("$(CONFIG_USER_GOAHEAD_SSL)", "y")
+SSLPATCHFILE = matrix_ssl.o sslSocket.o
+MATRIXDIR = $(ROOTDIR)/user/matrixssl-1.8.3
+SSLINC = $(MATRIXDIR)
+SSLLIB = $(MATRIXDIR)/src/libmatrixsslstatic.a
+SSLSW = -DWEBS_SSL_SUPPORT -DMATRIX_SSL -I$(SSLINC)
+endif
+
+#CONF_H	= $(ROOTDIR)/$(LINUXDIR)/include/linux/autoconf.h
+#CONF_H	= $(LINUX_DIR)/include/linux/autoconf.h
+#UCONF_H	= $(ROOTDIR)/config/autoconf.h
+
+#BUSYCONF_H = $(USR_DIR)/busybox-1.15.0/include/autoconf.h
+#UCONF_H	= $(CFG_DIR)/autoconf.h
+
+ifeq ($(FEATURE_DLNA), YES)
+# DLNA settings(libztedlna.so)
+LDLIBS += -L../../DMS -lztedlna -lpthread
+endif
+
+#*******************************************************************************
+# library
+#*******************************************************************************
+LDLIBS	+= -lnvram -lzte_pbm -lsqlite -lwlan_interface
+ifeq ($(LINUX_TYPE),uClinux)
+LDLIBS	+= -lpthread
+else
+LDLIBS	+= -lpthread
+endif
+
+
+ifeq ($(FEATURE_DLNA), YES)
+LDLIBS	+= -L../../DMS -lztedlna
+endif
+
+LDFLAGS	+= $(SSLLIB) $(IFMODLIB) $(INTERFACELIB) -lm -lgcc_s
+
+#LDFLAGS += -Wl,-elf2flt=-s131072
+
+CFLAGS += -I$(zte_lib_path)/libssl/install/include
+LDLIBS += -L$(zte_lib_path)/libssl/install/lib -lcrypto
+CFLAGS += -I$(zte_lib_path)/libcurl/install/include
+LDLIBS += -L$(zte_lib_path)/libcurl/install/lib -lcurl
+
+#*******************************************************************************
+# library path
+#*******************************************************************************
+LDLIBS  += -L$(zte_lib_path)/libnvram
+#LDLIBS  += -L$(zte_lib_path)/libsoft_timer
+LDLIBS  += -L$(zte_lib_path)/libsqlite
+LDLIBS  += -L$(zte_lib_path)/libzte_pbm
+LDLIBS  += -L$(zte_lib_path)/libmxml
+LDLIBS  += -L$(zte_lib_path)/libwlan_interface
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all:$(EXEC)
+
+#
+#	Primary link
+#
+#$(CC) -o $@ $(OBJS) $(LDFLAGS) $(EXTRALIBS) $(LDLIBS)
+$(EXEC): $(OBJS) $(INTERFACELIB)
+	#$(LD)  -o $@ $(OBJS) $(LDFLAGS)  $(LDLIBS)
+	$(CC) -o $@ $(OBJS) $(LDFLAGS) $(EXTRALIBS) $(LDLIBS)
+
+root_fs:
+	cp $(EXEC) $(EXEC).elf
+	$(ROMFSINST) /bin/$(EXEC)
+
+romfs:
+	cp $(EXEC) $(EXEC).elf
+	$(ROMFSINST)  /bin/$(EXEC)
+
+clean:
+	-rm -f $(EXEC) *.o *.elf
+
+#
+#	Dependencies
+#
+asp.o:  webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+balloc.o: balloc.c uemf.h
+
+base64.o:  base64.c webs.h wsIntrn.h  ej.h ejIntrn.h uemf.h
+
+cgi.o:  webs.h wsIntrn.h uemf.h
+
+default.o:  default.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h $(CONF_H)
+
+ejlex.o:  ejlex.c ej.h ejIntrn.h uemf.h
+
+ejparse.o:  ejparse.c ej.h ejIntrn.h uemf.h
+
+emfdb.o:  emfdb.h wsIntrn.h uemf.h
+
+form.o:  form.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+h.o:  h.c uemf.h
+
+handler.o:  handler.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+md5c.o:  md5.h wsIntrn.h uemf.h
+
+mime.o:  mime.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+misc.o:  misc.c uemf.h
+
+page.o:  page.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+ringq.o:  ringq.c uemf.h
+
+rom.o:  rom.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+security.o:  security.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+sock.o:  sock.c uemf.h
+
+sockGen.o:  sockGen.c uemf.h $(CONF_H)
+
+sym.o:  sym.c uemf.h
+
+uemf.o:  uemf.c uemf.h
+
+um.o:  webs.h wsIntrn.h um.h uemf.h
+
+umui.o:  webs.h wsIntrn.h um.h uemf.h
+
+url.o:  url.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+value.o:  value.c uemf.h
+
+webrom.o:  webrom.c webs.h wsIntrn.h uemf.h
+
+webs.o:  webs.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h $(CONF_H)
+
+websda.o:  webs.h wsIntrn.h websda.h uemf.h
+
+websuemf.o:  websuemf.c webs.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+websSSL.o:  websSSL.c websSSL.h wsIntrn.h ej.h ejIntrn.h uemf.h
+
+#goahead.o:  goahead.c wsIntrn.h webs.h ej.h ejIntrn.h uemf.h $(CONF_H) $(UCONF_H) $(BUSYCONF_H)
+goahead.o:  goahead.c wsIntrn.h webs.h ej.h ejIntrn.h uemf.h $(CONF_H) $(BUSYCONF_H)
diff --git a/lynq/MD310EU/ap/app/goahead/server/cgi.c b/lynq/MD310EU/ap/app/goahead/server/cgi.c
new file mode 100755
index 0000000..8bf5bb3
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/server/cgi.c
@@ -0,0 +1,313 @@
+#include	"wsIntrn.h"
+#include	<sys/types.h>
+#include	<sys/wait.h>
+#include	"uemf.h"
+
+static int		cgiMax;			
+typedef struct {				
+	webs_t	wp;					
+	long	fplacemark;			
+	int		handle;				
+	char_t	**envp;				
+	char_t	**argp;				
+	char_t	*cgiPath;			
+	char_t	*stdOut;			
+	char_t	*stdIn;				
+} cgiRec;
+static cgiRec	**cgiList;		
+
+int websCgiProcess(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg, 
+		char_t *url, char_t *path, char_t* query)
+{
+	
+		int 		n, envpsize, argpsize, pHandle, cid;
+		char_t		*cp, *cgiName, *cgiPath, **argp, **envp, **ep;
+		char_t		cgiBuf[FNAMESIZE], *stdIn, *stdOut, cwd[FNAMESIZE];
+		sym_t		*s;
+		cgiRec		*cgip;
+		a_assert(path && *path == '/');
+		a_assert(url && *url);
+		a_assert(websValid(wp));
+		websStats.cgiHits++;
+		char *cgipath_temp = NULL;
+		gstrncpy(cgiBuf, path, TSZ(cgiBuf)-1);
+		cgipath_temp = gstrchr(&cgiBuf[1], '/');
+		if(cgipath_temp!=NULL)
+		{
+			cgipath_temp++;
+		}else
+		{
+			websError(wp, 200, T("cgiBuf error,check path"));
+						
+			return 1;
+		}
+		printf("[goahead]cgipath_temp->%s.\n",cgipath_temp);
+		//if ((cgiName = gstrchr(&cgiBuf[1], '/')) == NULL) {
+		if ((cgiName = gstrchr(cgipath_temp, '/')) == NULL) {
+	
+			if((cgiName = gstrchr(&cgiBuf[1], '/')) == NULL)
+			{
+				websError(wp, 200, T("Missing CGI name"));
+				
+				return 1;
+			}
+		}
+		cgiName++;
+		printf("[goahead]cgiName->%s.\n",cgiName);
+		if ((cp = gstrchr(cgiName, '/')) != NULL) {
+			*cp = '\0';
+		}
+	//	fmtAlloc(&cgiPath, FNAMESIZE, T("%s/%s/%s"), websGetDefaultDir(),
+	//		CGI_BIN, cgiName);
+		fmtAlloc(&cgiPath, FNAMESIZE, T("%s/%s"),"/sbin", cgiName);
+		{
+			gstat_t 	sbuf;
+			if (gstat(cgiPath, &sbuf) != 0 || (sbuf.st_mode & S_IFREG) == 0) {
+				system("rm -rf /tmp/firmware_tmp_file");
+				websError(wp, 200, T("CGI process file does not exist"));
+				bfree(B_L, cgiPath);
+				return 1;
+			}
+			if (gaccess(cgiPath, X_OK) != 0) {
+				websError(wp, 200, T("CGI process file is not executable"));
+				bfree(B_L, cgiPath);
+				return 1;
+			}
+		}
+		ggetcwd(cwd, FNAMESIZE);
+		if ((cp = gstrrchr(cgiPath, '/')) != NULL) {
+			*cp = '\0';
+			gchdir(cgiPath);
+			*cp = '/';
+		}
+		argpsize = 10;
+		argp = balloc(B_L, argpsize * sizeof(char_t *));
+		if(argp == NULL){
+			bfreeSafe(B_L, cgiPath);
+			return 1;
+		}
+		*argp = cgiPath;
+		n = 1;
+		if (gstrchr(query, '=') == NULL) {
+			websDecodeUrl(query, query, gstrlen(query));
+			for (cp = gstrtok(query, T(" ")); cp != NULL; ) {
+				*(argp+n) = cp;
+				n++;
+				if (n >= argpsize) {
+					argpsize *= 2;
+					argp = brealloc(B_L, argp, argpsize * sizeof(char_t *));
+					if(argp == NULL){
+						bfreeSafe(B_L, cgiPath);
+						return 1;
+					}
+				}
+				cp = gstrtok(NULL, T(" "));
+			}
+		}
+		*(argp+n) = NULL;
+		envpsize = WEBS_SYM_INIT;
+		envp = balloc(B_L, envpsize * sizeof(char_t *));
+		if(envp == NULL){
+			bfreeSafe(B_L, cgiPath);
+			bfreeSafe(B_L, argp);
+			return 1;
+		}
+		n = 0;
+		fmtAlloc(envp+n, FNAMESIZE, T("%s=%s"),T("PATH_TRANSLATED"), cgiPath);
+		n++;
+		fmtAlloc(envp+n, FNAMESIZE, T("%s=%s/%s"),T("SCRIPT_NAME"),
+			CGI_BIN, cgiName);
+		n++;
+		fmtAlloc(envp+n, FNAMESIZE, T("%s=%s"),T("REMOTE_USER"), wp->userName);
+		n++;
+		fmtAlloc(envp+n, FNAMESIZE, T("%s=%s"),T("AUTH_TYPE"), wp->authType);
+		n++;
+		for (s = symFirst(wp->cgiVars); s != NULL; s = symNext(wp->cgiVars)) {
+			if (s->content.valid && s->content.type == string &&
+				gstrcmp(s->name.value.string, T("REMOTE_HOST")) != 0 &&
+				gstrcmp(s->name.value.string, T("HTTP_AUTHORIZATION")) != 0) {
+				fmtAlloc(envp+n, FNAMESIZE, T("%s=%s"), s->name.value.string,
+					s->content.value.string);
+				n++;
+				if (n >= envpsize) {
+					envpsize *= 2;
+					envp = brealloc(B_L, envp, envpsize * sizeof(char_t *));
+					if(envp == NULL){
+						bfreeSafe(B_L, cgiPath);
+						bfreeSafe(B_L, argp);
+						return 1;
+					}
+				}
+			}
+		}
+		if (wp->flags & WEBS_CGI_UPLOAD)
+		{
+	
+			if((wp->has_firmware_upload_clean)||(wp->flags & WEBS_CGI_FIRMWARE_UPLOAD))
+			{
+				fmtAlloc(envp+n, FNAMESIZE, T("%s=%s"), T("UPLOAD_FILENAME"), FIRMWARE_TMP_FILE); 
+			}
+			else
+			{					
+				fmtAlloc(envp+n, FNAMESIZE, T("%s=%s"), T("UPLOAD_FILENAME"), wp->cgiStdin);		
+			}
+			n++;
+		}
+		*(envp+n) = NULL;
+		if (wp->cgiStdin == NULL) {
+			wp->cgiStdin = websGetCgiCommName(wp);
+		} 
+		stdIn = wp->cgiStdin;
+		stdOut = websGetCgiCommName(wp);
+		printf("[goahead]cgiPath->%s.\n",cgiPath);
+	
+		if ((pHandle = websLaunchCgiProc(cgiPath, argp, envp, stdIn, stdOut)) 
+			== -1) {
+			system("rm -rf /tmp/firmware_tmp_file");
+			websError(wp, 200, T("failed to spawn CGI task"));
+			for (ep = envp; *ep != NULL; ep++) {
+				bfreeSafe(B_L, *ep);
+			}
+			bfreeSafe(B_L, cgiPath);
+			bfreeSafe(B_L, argp);
+			bfreeSafe(B_L, envp);
+			bfreeSafe(B_L, stdOut);
+		} else {
+			cid = hAllocEntry((void***) &cgiList, &cgiMax, sizeof(cgiRec));
+			if(cgiList){
+			cgip = cgiList[cid];
+			cgip->handle = pHandle;
+			cgip->stdIn = stdIn;
+			cgip->stdOut = stdOut;
+			cgip->cgiPath = cgiPath;
+			cgip->argp = argp;
+			cgip->envp = envp;
+			cgip->wp = wp;
+			cgip->fplacemark = 0;
+			websTimeoutCancel(wp);
+			}
+			else
+			{
+				bfreeSafe(B_L, cgiPath);
+				bfreeSafe(B_L, argp);
+				bfreeSafe(B_L, envp);
+				bfreeSafe(B_L, stdOut);
+			}
+		}
+		gchdir(cwd);
+		return 1;
+
+}
+
+int websCgiHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg, 
+		char_t *url, char_t *path, char_t* query)
+{
+	if(!(wp->flags & WEBS_POST_REQUEST))
+	{
+		//websError(wp, 200, T("NOT POST REQUEST"));
+		printf("[goahead]NOT POST REQUEST.\n");
+		websDone(wp, 0);
+		return 1;
+	}
+
+	if (wp->flags & WEBS_CGI_HTTPSHARE_UPLOAD)
+	{
+		printf("[httpshare]call zte_process_cgi_end.\n");
+		return zte_process_cgi_end(wp);
+	}else if(wp->flags & WEBS_CGI_UPLOAD)
+	{
+		printf("[goahead]call upload cgi.\n");
+		return websCgiProcess(wp, urlPrefix, webDir, arg,url, path, query);
+	}else
+	{
+		//websError(wp, 200, T("NOT CGI OR HTTPSHARE,RETURN ERROR"));
+		printf("[goahead]wrong cgi request.\n");
+		websDone(wp, 0);
+		return 1;
+	}
+
+}
+
+void websCgiGatherOutput (cgiRec *cgip)
+{
+	gstat_t	sbuf;
+	char_t	cgiBuf[FNAMESIZE];
+	if ((gstat(cgip->stdOut, &sbuf) == 0) && 
+		(sbuf.st_size > cgip->fplacemark)) {
+		int fdout;
+		fdout = gopen(cgip->stdOut, O_RDONLY | O_BINARY, 0444 );
+		if (fdout >= 0) {
+			webs_t	wp = cgip->wp;
+			int		nRead;
+			int		rc;
+			if (cgip->fplacemark == 0) {
+				websWrite(wp, T("HTTP/1.0 200 OK\n"));
+			}	
+			if(glseek(fdout, cgip->fplacemark, SEEK_SET) < 0)
+			{
+			    printf("[goahead]glseek fail.\n");
+			}
+			while ((nRead = gread(fdout, cgiBuf, FNAMESIZE)) > 0) {
+				rc = websWriteBlock(wp, cgiBuf, nRead);
+				if (rc < 0) {
+					//todo: cov m
+				}
+				cgip->fplacemark += nRead;
+			}
+			gclose(fdout);
+		}
+	}
+}
+
+void websCgiCleanup()
+{
+	cgiRec	*cgip;
+	webs_t	wp;
+	char_t	**ep;
+	int		cid, nTries;
+	for (cid = 0; cid < cgiMax; cid++) {
+		if ((cgip = cgiList[cid]) != NULL) {
+			int exit_status;
+			wp = cgip->wp;
+			websCgiGatherOutput (cgip);
+			if ( websCheckCgiProc(cgip->handle, &exit_status) == 0) {
+				nTries = 0;
+				while ((cgip->fplacemark == 0) && (nTries < 100)) {
+					websCgiGatherOutput(cgip);
+					if (cgip->fplacemark == 0) {
+					}
+					nTries++;
+				}
+				gunlink(cgip->stdIn);
+				gunlink(cgip->stdOut);
+				cgiMax = hFree((void***) &cgiList, cid);
+				for (ep = cgip->envp; ep != NULL && *ep != NULL; ep++) {
+					bfreeSafe(B_L, *ep);
+				}
+				bfreeSafe(B_L, cgip->cgiPath);
+				bfreeSafe(B_L, cgip->argp);
+				bfreeSafe(B_L, cgip->envp);
+				bfreeSafe(B_L, cgip->stdOut);
+				bfreeSafe(B_L, cgip);
+				if(wp->has_firmware_upload_clean){
+					if (WIFEXITED(exit_status) && WEXITSTATUS(exit_status) != 0) {
+						if (cgip->fplacemark == 0) { //cov h
+							websError(wp, 200, T("CGI generated no output"));
+						} else {
+							websDone(wp, 200);
+						}
+						return;
+					}
+					sync();
+					//doSystem("sleep 3 && reboot &");
+				}
+				if (cgip->fplacemark == 0) { //cov h
+					websError(wp, 200, T("CGI generated no output"));
+				} else {
+					websDone(wp, 200);
+				}
+			}
+		}
+	}
+}
+
diff --git a/lynq/MD310EU/ap/app/goahead/server/goahead.c b/lynq/MD310EU/ap/app/goahead/server/goahead.c
new file mode 100755
index 0000000..3fe84c3
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/server/goahead.c
@@ -0,0 +1,339 @@
+#include	"uemf.h"
+#include	"wsIntrn.h"
+#include	<signal.h>
+#include	<unistd.h> 
+#include	<sys/types.h>
+#include	<sys/wait.h>
+#include    <sched.h>
+#ifdef WEBS_SSL_SUPPORT
+#include	"websSSL.h"
+#endif
+#include "../interface5.0/zte_web_interface.h"
+
+static char_t		*rootWeb = T("etc_ro/web");			/* Root web directory */
+static int			port = 80;						/* Server port */
+static int			retries = 5;					/* Server port retries */
+static int			finished;						/* Finished flag */
+
+/****************************** Forward Declarations **************************/
+
+static int 	initWebs();
+static int  websHomePageHandler(webs_t wp, char_t *urlPrefix, char_t *webDir,
+				int arg, char_t *url, char_t *path, char_t *query);
+extern void defaultErrorHandler(int etype, char_t *msg);
+extern void defaultTraceHandler(int level, char_t *buf);
+
+//added by liuyingnan for PC Client begin, 20120829
+extern int websXMLPostHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg, char_t *url, char_t *path, char_t *query);
+//added by liuyingnan for PC Client end, 20120829
+
+int main(int argc, char** argv)
+{
+    int rs;
+    struct sched_param param;
+
+    loglevel_init();
+	slog(MISC_PRINT, SLOG_DEBUG, "goahead main\n");
+	bopen(NULL, (60 * 1024), B_USE_MALLOC);
+	signal(SIGPIPE, SIG_IGN);
+	if (initWebs() < 0) {
+		slog(MISC_PRINT, SLOG_ERR, "goahead initWebs failed.");
+		return -1;
+	}
+
+#ifdef WEBS_SSL_SUPPORT
+	websSSLOpen();
+#endif
+	web_init_pwd();
+	web_aes_init();
+
+	slog(MISC_PRINT, SLOG_NORMAL,"[goahead] enter working\n");
+	while (!finished) {
+		if (socketReady(-1) || socketSelect(-1, 1000)) {         
+			socketProcess(-1);
+		}
+		websCgiCleanup();
+		emfSchedProcess();
+	}
+
+#ifdef WEBS_SSL_SUPPORT
+	websSSLClose();
+#endif
+
+	websCloseServer();
+	socketClose();
+	bclose();
+	return 0;
+}
+
+static int initWebs()
+{
+	struct in_addr	intaddr;
+	const char			lan_ip[128] = {0};
+	char			host[128], dir[128], webdir[128];
+	char			*cp;
+	char_t			wbuf[128];
+	socketOpen();
+
+	cfg_get_item("lan_ipaddr", lan_ip, sizeof(lan_ip));
+	if (0 == strcmp(lan_ip, "")) {
+		slog(MISC_PRINT, SLOG_ERR, "goahead initWebs failed: lan_ip is NULL!");
+		return -1;
+	}
+	intaddr.s_addr = inet_addr(lan_ip);
+	if (intaddr.s_addr == INADDR_NONE) {
+		slog(MISC_PRINT, SLOG_ERR, "goahead initWebs failed: lan_ip is %s, INADDR_NONE!", lan_ip);
+		return -1;
+	}
+	getcwd(dir, sizeof(dir)); 
+	if ((cp = strrchr(dir, '/'))) {
+		*cp = '\0';
+	}
+    snprintf(webdir, sizeof(webdir), "%s/%s", dir, rootWeb);
+    slog(MISC_PRINT,SLOG_DEBUG, "goahead initWebs info: webdir is %s!",webdir);
+	websSetDefaultDir(webdir);
+	cp = inet_ntoa(intaddr);
+	ascToUni(wbuf, cp, min(strlen(cp) + 1, sizeof(wbuf)));
+	websSetIpaddr(wbuf);
+	websSetHost(wbuf);
+	websSetDefaultPage(T(ZTE_WEB_PAGE_LOGIN_NAME));
+	websOpenServer(port, retries);
+	//websUrlHandlerDefine(T(""), NULL, 0, websSecurityHandler, WEBS_HANDLER_FIRST);
+	websUrlHandlerDefine(T("/reqproc"), NULL, 0, websFormHandler, 0);
+#ifndef WEBS_SECURITY
+	websUrlHandlerDefine(T("/cgi-bin"), NULL, 0, websCgiHandler, 0);
+    //websUrlHandlerDefine(T("/api/xmlclient/post"), NULL, 0, websXMLPostHandler, 0);
+	websUrlHandlerDefine(T("/mmc2"), NULL, 0, websCgiDownLoadHandler, 0);//http share
+#endif	
+	websUrlHandlerDefine(T(""), NULL, 0, websDefaultHandler, WEBS_HANDLER_LAST); 
+	zte_web_init();
+	zte_httpshare_init();//httpshare
+	websUrlHandlerDefine(T("/"), NULL, 0, websHomePageHandler, 0); 
+
+	system("rm -rf /tmp/firmware_tmp_file");
+	return 0;
+}
+
+static int websHomePageHandler(webs_t wp, char_t *urlPrefix, char_t *webDir,
+                               int arg, char_t *url, char_t *path, char_t *query)
+{
+    if (*url == '\0' || gstrcmp(url, T("/")) == 0) 
+    {
+        websRedirect(wp, zte_web_get_login_page(wp)); /*×ÔÊÊÓ¦ÖÕ¶Ëä¯ÀÀÆ÷*/
+        return 1;
+    }
+    return 0;
+}
+
+void defaultErrorHandler(int etype, char_t *msg)
+{
+	printf("[goahead]e %s\n",msg);
+}
+
+void defaultTraceHandler(int level, char_t *buf)
+{
+	if (buf) {
+		printf("[goahead]t %s\n",buf);
+	}
+}
+
+char_t *websGetCgiCommName(webs_t wp)
+{
+	char_t	*pname1, *pname2;
+
+	pname1 = (char_t *)tempnam(T("/var"), T("cgi"));
+	pname2 = bstrdup(B_L, pname1);
+	free(pname1);
+	return pname2;
+}
+
+int websLaunchCgiProc(char_t *cgiPath, char_t **argp, char_t **envp,
+					  char_t *stdIn, char_t *stdOut)
+{
+	int	pid, fdin, fdout, hstdin, hstdout, rc;
+
+	fdin = fdout = hstdin = hstdout = rc = -1; 
+	if ((fdin = open(stdIn, O_RDWR | O_CREAT, 0666)) < 0 ||
+		(fdout = open(stdOut, O_RDWR | O_CREAT, 0666)) < 0 ||
+		(hstdin = dup(0)) == -1 ||
+		(hstdout = dup(1)) == -1 ||
+		dup2(fdin, 0) == -1 ||
+		dup2(fdout, 1) == -1) {
+		goto DONE;
+	}
+		
+ 	rc = pid = fork();
+ 	if (pid == 0) {
+        int result = execve(cgiPath, argp, envp);
+        slog(MISC_PRINT,SLOG_DEBUG, "content-type: text/html Execution of cgi process :%d", result);
+		exit (0);
+	} 
+
+DONE:
+	if (hstdout >= 0) {
+		dup2(hstdout, 1);
+      close(hstdout);
+	}
+	if (hstdin >= 0) {
+		dup2(hstdin, 0);
+      close(hstdin);
+	}
+	if (fdout >= 0) {
+		close(fdout);
+	}
+	if (fdin >= 0) {
+		close(fdin);
+	}
+	return rc;
+}
+
+int websCheckCgiProc(int handle, int *status)
+{
+	if (waitpid(handle, status, WNOHANG) == handle) {
+		return 0;
+	} else {
+		return 1;
+	}
+}
+
+static int i64c(int i)
+{
+	i &= 0x3f;
+	if (i == 0)
+		return '.';
+	if (i == 1)
+		return '/';
+	if (i < 12)
+		return ('0' - 2 + i);
+	if (i < 38)
+		return ('A' - 12 + i);
+	return ('a' - 38 + i);
+}
+
+static int web_make_salt(char *p, int cnt /*, int x */)
+{
+	/* was: x += ... */
+	int x = getpid() + (int)time(0);
+	do {
+		/* x = (x*1664525 + 1013904223) % 2^32 generator is lame
+		 * (low-order bit is not "random", etc...),
+		 * but for our purposes it is good enough */
+		x = x*1664525 + 1013904223;
+		/* BTW, Park and Miller's "minimal standard generator" is
+		 * x = x*16807 % ((2^31)-1)
+		 * It has no problem with visibly alternating lowest bit
+		 * but is also weak in cryptographic sense + needs div,
+		 * which needs more code (and slower) on many CPUs */
+		*p++ = i64c(x >> 16);
+		*p++ = i64c(x >> 22);
+	} while (--cnt);
+	*p = '\0';
+	return x;
+}
+
+int web_set_pwd(char *buf)
+{
+	if(buf == NULL)
+		return -1;
+	int bufLen = strlen(buf);
+	if(bufLen <= 0 || bufLen > LOGIN_PSW_MAX_LEN)
+		return -1;
+#ifdef WEBS_SSL_SUPPORT
+	char salt[LOGIN_PSW_MAX_LEN+1]={0};
+	web_make_salt(salt,(sizeof(salt)-1)/2);
+	slog(MISC_PRINT,SLOG_DEBUG, "[goahead]salt %s\n",salt);
+	unsigned char md[LOGIN_PSW_MAX_LEN] = {0};
+	{
+		unsigned char src[LOGIN_PSW_MAX_LEN*2+1] = {0};
+		memcpy(src,salt,LOGIN_PSW_MAX_LEN);
+		memcpy(src+LOGIN_PSW_MAX_LEN,buf,bufLen);
+		SHA256((const unsigned char *)src, bufLen+LOGIN_PSW_MAX_LEN, md);
+	}
+	{
+		char i = 0; 
+		char str_md[LOGIN_PSW_MAX_LEN*2+1] = {0};
+		for(i = 0; i < LOGIN_PSW_MAX_LEN; i++)
+		{
+			sprintf(str_md+i+i,"%02x", md[i]);
+		}
+		char psw_buf[100] = {0};
+		snprintf(psw_buf,sizeof(psw_buf),"%s%s",salt,str_md);
+		slog(MISC_PRINT,SLOG_DEBUG, "goahead]set_pw %s\n",psw_buf);
+		return cfg_set("admin_Password", psw_buf);
+	}
+#else
+	return cfg_set("admin_Password", buf);
+#endif
+}
+
+void web_init_pwd(void)
+{
+#ifdef WEBS_SSL_SUPPORT
+	char psw_buf[LOGIN_PSW_MAX_LEN*3+1] = {0};
+	cfg_get_item("admin_Password", psw_buf, sizeof(psw_buf));
+	slog(MISC_PRINT,SLOG_DEBUG, "[goahead]init_pw %s\n",psw_buf);
+	if(strlen(psw_buf) <= LOGIN_PSW_MAX_LEN)
+	{
+		web_set_pwd(psw_buf);
+	}
+#endif	
+}
+
+int web_check_pwd(char* buf)
+{
+	char psw_buf[LOGIN_PSW_MAX_LEN*3+1] = {0};
+	if(buf == NULL)
+		return -1;
+	int bufLen = strlen(buf);
+	if(bufLen <= 0 || bufLen > LOGIN_PSW_MAX_LEN)
+		return -1;
+	cfg_get_item("admin_Password", psw_buf, sizeof(psw_buf));
+	slog(MISC_PRINT,SLOG_DEBUG, "[goahead]check_pw in %s\n",buf);
+	slog(MISC_PRINT,SLOG_DEBUG, "[goahead]check_pw src %s\n",psw_buf);
+#ifdef WEBS_SSL_SUPPORT
+	unsigned char md[LOGIN_PSW_MAX_LEN] = {0};
+	{
+		unsigned char src[LOGIN_PSW_MAX_LEN*2+1] = {0};
+		memcpy(src,psw_buf,LOGIN_PSW_MAX_LEN);
+		memcpy(src+LOGIN_PSW_MAX_LEN,buf,bufLen);
+		SHA256((const unsigned char *)src, bufLen+LOGIN_PSW_MAX_LEN, md);
+	}
+	{
+		char i = 0;	
+		char str_md[65] = {0};
+		for(i = 0; i < LOGIN_PSW_MAX_LEN; i++)
+		{
+			sprintf(str_md+i+i,"%02x", md[i]);
+		}
+		return strncmp(str_md,psw_buf+LOGIN_PSW_MAX_LEN,sizeof(str_md)-1);
+	}
+#else
+	if(bufLen != strlen(psw_buf))
+		return -1;
+
+	return strncmp(buf,psw_buf,bufLen);;
+#endif
+}
+
+int web_make_salt_base64(char *buf, int len)
+{
+	int salt_len;
+	char *salt;
+	if(buf == NULL || len < 5)
+	{
+		return 0;
+	}
+	salt_len = (len - 1)/4*3;
+	salt = balloc(B_L, salt_len+1);
+	if(salt == NULL)
+	{
+		return 0;
+	}
+	web_make_salt(salt,salt_len/2);
+	websEncode64(buf, salt, len);
+	bfree(B_L, salt);
+	*(buf + len -1) = '\0';
+	slog(MISC_PRINT,SLOG_DEBUG, "[goahead]salt_base64=%s\n",buf);
+	return strlen(buf);
+}
+
diff --git a/lynq/MD310EU/ap/app/goahead/server/webs.c b/lynq/MD310EU/ap/app/goahead/server/webs.c
new file mode 100755
index 0000000..93d50e0
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/server/webs.c
@@ -0,0 +1,2303 @@
+#include	"wsIntrn.h"
+#ifdef DIGEST_ACCESS_SUPPORT
+	#include	"websda.h"
+#endif
+#include "../interface5.0/zte_web_interface.h"
+//#include "../interface5.0/zte_rest_comm_interface.h"
+
+websStatsType	websStats;				
+webs_t			*webs;					
+sym_fd_t		websMime;				
+int				websMax;				
+int				websPort;				
+char_t			websHost[64];			
+char_t			websIpaddr[64];			
+char_t			*websHostUrl = NULL;	
+char_t			*websIpaddrUrl = NULL;	
+//added by liuyingnan for PC Client begin, 20120829
+char websRecvHttpBuffer[HTTP_BUFFER_SIZE] = {0};
+char websRecvHttpBuffer_XML[HTTP_BUFFER_SIZE] = {0};
+
+extern void zte_change_wp_query(webs_t wp,char_t *xml_str);
+//added by liuyingnan for PC Client begin, 20120829
+
+websErrorType websErrors[] = {
+	{ 200, T("Data follows") },
+	{ 204, T("No Content") },
+	{ 301, T("Redirect") },
+	{ 302, T("Redirect") },
+	{ 304, T("Use local copy") },
+	{ 400, T("Page not found") },
+	{ 401, T("Unauthorized") },
+	{ 403, T("Forbidden") },
+	{ 404, T("Site or Page Not Found") },
+	{ 405, T("Access Denied") },
+	{ 500, T("Web Error") },
+	{ 501, T("Not Implemented") },
+	{ 503, T("Site Temporarily Unavailable. Try again.") },
+	{ 0, NULL }
+};
+
+typedef enum { 
+	RET_DATA_ERROR = -1,
+	RET_FAILED = 0, 
+	RET_OK = 1, 
+} ERROR_CODE;
+
+
+#ifdef FEATURE_ZTE_WEB_TCARD
+//added by guo shoupeng 10124224 for http share 20111001 start
+
+typedef enum { 
+	RET_FAILED = 0, 
+	RET_OK = 1, 
+	RET_UNKNOWN = 3,	
+	MALLOC_FIALED = 4,
+	SD_NONE = 5,
+	USB_OUT = 6,
+	USER_MALLOC_FAILED = 7,
+	UPLOAD_FILE_LIMITED = 8,
+	USER_UNKNOWN = 9,	
+} ERROR_CODE;
+
+//added by guo shoupeng 10124224 for http share 20111001 end
+#endif
+
+
+
+static int 		websGetInput(webs_t wp, char_t **ptext, int *nbytes);
+static int 		websParseFirst(webs_t wp, char_t *text);
+static int 	websParseRequest(webs_t wp);
+static void		websSocketEvent(int sid, int mask, int data);
+static int		websGetTimeSinceMark(webs_t wp);
+
+static int		websListenSock;					
+static char_t	websRealm[64] = T("GoAhead");	
+
+static int		websOpenCount = 0;		
+
+
+int websOpenServer(int port, int retries)
+{
+	websMimeType	*mt;
+
+	if (++websOpenCount != 1) {
+		return websPort;
+	}
+
+	a_assert(port > 0);
+	a_assert(retries >= 0);
+
+	webs = NULL;
+	websMax = 0;
+
+	websMime = symOpen(WEBS_SYM_INIT * 4);
+	a_assert(websMime >= 0);
+	if(websMime < 0)  // cov M NEGATIVE_RETURNS
+	{
+	    return -1;
+	}
+	for (mt = websMimeList; mt->type; mt++) {
+		symEnter(websMime, mt->ext, valueString(mt->type, 0), 0);
+	}
+
+#if 1
+    // kw 3 INVARIANT_CONDITION.UNREACH websUrlHandlerOpen only return 0
+    websUrlHandlerOpen();
+#else
+	if (websUrlHandlerOpen() < 0) {
+		return -1;
+	}
+#endif	
+	websFormOpen();
+
+	return websOpenListen(port, retries);
+}
+
+
+
+void websCloseServer()
+{
+	webs_t	wp;
+	int		wid;
+
+	if (--websOpenCount > 0) {
+		return;
+	}
+
+	websCloseListen();
+
+	for (wid = websMax; webs && wid >= 0; wid--) {
+		if ((wp = webs[wid]) == NULL) {
+			continue;
+		}
+		socketCloseConnection(wp->sid);
+		websFree(wp);
+	}
+
+	symClose(websMime);
+	websFormClose();
+	websUrlHandlerClose();
+}
+
+
+void websCloseListen()
+{
+	if (websListenSock >= 0) {
+		socketCloseConnection(websListenSock);
+		websListenSock = -1;
+	}
+	bfreeSafe(B_L, websHostUrl);
+	bfreeSafe(B_L, websIpaddrUrl);
+	websIpaddrUrl = websHostUrl = NULL;
+}
+
+
+int websOpenListen(int port, int retries)
+{
+	int		i, orig;
+
+	a_assert(port > 0);
+	a_assert(retries >= 0);
+	
+	orig = port;
+
+	for (i = 0; i <= retries; i++) {
+		websListenSock = socketOpenConnection6(NULL, port, websAccept, 0);
+		if (websListenSock >= 0) {
+			break;
+		}
+		port++;
+	}
+	if (i > retries) {
+		error(E_L, E_USER, T("Couldn't open a socket on ports %d - %d"),
+			orig, port - 1);
+		return -1;
+	} 
+
+	websPort = port;
+	bfreeSafe(B_L, websHostUrl);
+	bfreeSafe(B_L, websIpaddrUrl);
+	websIpaddrUrl = websHostUrl = NULL;
+
+	if (port == 80) {
+		websHostUrl = bstrdup(B_L, websHost);
+		websIpaddrUrl = bstrdup(B_L, websIpaddr);
+	} else {
+		fmtAlloc(&websHostUrl, WEBS_MAX_URL + 80, T("%s:%d"), websHost, port);
+		fmtAlloc(&websIpaddrUrl, WEBS_MAX_URL + 80, T("%s:%d"), 
+			websIpaddr, port);
+	}
+	trace(0, T("webs: Listening for HTTP requests at address %s\n"),
+		websIpaddrUrl);
+
+	return port;
+}
+
+
+static void websSocketEvent(int sid, int mask, int iwp)
+{
+	webs_t	wp;
+
+	wp = (webs_t) iwp;
+	a_assert(wp);
+
+	if (! websValid(wp)) {
+		return;
+	}
+
+	if (mask & SOCKET_READABLE) {
+		websReadEvent(wp);
+	} 
+	if (mask & SOCKET_WRITABLE) {
+		if (websValid(wp) && wp->writeSocket) {
+			(*wp->writeSocket)(wp);
+		}
+	} 
+}
+
+int websAccept(int sid, char *ipaddr, int port, int listenSid)
+{
+	webs_t	wp;
+	int		wid;
+
+	a_assert(ipaddr && *ipaddr);
+	a_assert(sid >= 0);
+	a_assert(port >= 0);
+
+	if ((wid = websAlloc(sid)) < 0) {
+		return -1;
+	}
+	wp = webs[wid];
+	a_assert(wp);
+	wp->listenSid = listenSid;
+
+	ascToUni(wp->ipaddr, ipaddr, min(sizeof(wp->ipaddr), strlen(ipaddr) + 1));
+
+	if (gstrcmp(wp->ipaddr, T("127.0.0.1")) == 0 || 
+			gstrcmp(wp->ipaddr, websIpaddr) == 0 || 
+			gstrcmp(wp->ipaddr, websHost) == 0) {
+		wp->flags |= WEBS_LOCAL_REQUEST;
+	}
+
+	socketCreateHandler(sid, SOCKET_READABLE, websSocketEvent, (int) wp);
+
+	wp->timeout = emfSchedCallback(WEBS_TIMEOUT, websTimeout, (void *) wp);
+	//trace(8, T("webs: accept request\n"));
+	return 0;
+}
+
+
+
+#ifdef FEATURE_ZTE_WEB_TCARD
+//added by guo shoupeng 10124224 for http share 20120110 start
+static int read_bytes = 0;
+//added by guo shoupeng 10124224 for http share 20120110 end
+#endif
+
+void websReadEvent(webs_t wp)
+{
+	char_t 	*text;
+	int		rc, nbytes, len, done, fd;
+
+	a_assert(wp);
+	a_assert(websValid(wp));
+
+	websSetTimeMark(wp);
+	
+	static unsigned int timer = 0;
+
+	text = NULL;
+	fd = -1;
+	for (done = 0; !done; ) {
+		if (text) {
+			bfree(B_L, text);
+			text = NULL;
+		}
+
+
+#ifdef FEATURE_ZTE_WEB_TCARD
+//added by guo shoupeng 10124224 for http share 20120110 start
+		if( read_bytes > UPLOAD_INTERVAL)
+		{
+			read_bytes = 0;
+			break;
+		}
+//added by guo shoupeng 10124224 for http share 20120110 end
+#endif
+		assert(wp);
+		assert(websValid(wp));		
+		while ((rc = websGetInput(wp, &text, &nbytes)) == 0) {
+			;
+		}
+
+
+		if (rc < 0) {
+            if(websValid(wp) && (wp->flags & WEBS_CGI_REQUEST ))
+            {
+                //printf("\n +++sockettt upload websSetTimeMark+++ \n");
+                websSetTimeMark(wp);
+            }
+			break;
+		}
+		if(text == NULL)
+			break;//for kw
+
+		switch(wp->state) {
+		case WEBS_BEGIN:
+
+			if (websParseFirst(wp, text) < 0) {
+				done++;
+				break;
+			}
+			wp->state = WEBS_HEADER;
+			break;
+		
+		case WEBS_HEADER:
+
+			if (ringqLen(&wp->header) > 0) {
+				ringqPutStr(&wp->header, T("\n"));
+			}
+			ringqPutStr(&wp->header, text);
+			break;
+
+		case WEBS_POST_CLEN:
+
+#ifndef __NO_CGI_BIN
+			if (wp->flags & WEBS_CGI_REQUEST) {
+
+				//if(!(wp->flags & WEBS_CGI_FIRMWARE_UPLOAD))
+				if(wp->flags & WEBS_CGI_HTTPSHARE_UPLOAD)
+				{
+					if( timer ==0)
+                    {
+                        websSetLoginTimemark(wp);
+						printf("[httpshare]upload reset login state~\n");
+                    }
+					ERROR_CODE ret = zte_process_cgi_recv(wp, wp->clen,text, nbytes);	
+
+					if(RET_DATA_ERROR == ret || RET_FAILED == ret)
+					{												  
+						websError(wp, 404, T("Bad state"));
+						printf("[httpshare]ret->%d\n",ret);
+						done++; 						  
+						break;		  
+					} 
+					
+					timer++;
+					timer=timer-(timer>>11<<11);  //timer%2^11
+				}else if(wp->flags & WEBS_CGI_UPLOAD)
+				{
+					if (fd == -1) 
+					{
+						if(wp->flags & WEBS_CGI_FIRMWARE_UPLOAD )
+						{
+							fd = gopen(FIRMWARE_TMP_FILE, O_CREAT | O_WRONLY | O_BINARY | O_APPEND, 0666);
+							printf("[goahead]open cgi temp file\n");
+						}
+						else
+					  	{
+							fd = gopen(wp->cgiStdin, O_CREAT | O_WRONLY | O_BINARY | O_APPEND, 0666);
+	                    }
+					}
+                    if(fd < 0){
+                        break;
+					}
+						
+					
+					gwrite(fd, text, nbytes);
+				}else
+				{
+					websError(wp, 404, T("Bad state"));
+					printf("[goahead]bad cgi request\n");
+					done++; 						  
+					break;
+				}
+
+
+			} else 
+#endif
+			//added by liuyingnan for PC Client begin, 20120829
+            if(wp->flags & WEBS_REST_CLIENT_REQUEST){
+                printf("%s", "websReadEvent: pc client post");
+                if (nbytes > (HTTP_BUFFER_SIZE-gstrlen(websRecvHttpBuffer)-1))
+                {
+                    gstrncpy(websRecvHttpBuffer+gstrlen(websRecvHttpBuffer), text, HTTP_BUFFER_SIZE-gstrlen(websRecvHttpBuffer)-1);
+                }
+                else
+                {
+                    gstrncpy(websRecvHttpBuffer+gstrlen(websRecvHttpBuffer), text, nbytes);
+                }
+            } else  if(wp->flags & WEBS_XML_CLIENT_REQUEST){
+            if (nbytes > (HTTP_BUFFER_SIZE-gstrlen(websRecvHttpBuffer_XML)-1))
+            {
+                gstrncpy(websRecvHttpBuffer_XML+gstrlen(websRecvHttpBuffer_XML), text, HTTP_BUFFER_SIZE-gstrlen(websRecvHttpBuffer_XML)-1);
+            }
+            else
+            {
+                gstrncpy(websRecvHttpBuffer_XML+gstrlen(websRecvHttpBuffer_XML), text, nbytes);
+            }
+            } else    
+			//added by liuyingnan for PC Client end, 20120829
+
+
+
+			if (wp->query) {
+				if (wp->query[0] && !(wp->flags & WEBS_POST_DATA)) {
+
+					len = gstrlen(wp->query);
+					wp->query = brealloc(B_L, wp->query, (len + gstrlen(text) +
+						2) * sizeof(char_t));
+					if(wp->query == NULL)
+						break;//for kw
+					wp->query[len++] = '&';
+					gstrcpy(&wp->query[len], text);
+
+				} else {
+
+               //if (text != NULL)//for kw
+               {
+                  len = gstrlen(wp->query);
+                  wp->query = brealloc(B_L, wp->query, (len +	gstrlen(text) +
+                     1) * sizeof(char_t));
+                  if (wp->query) {
+                     gstrcpy(&wp->query[len], text);
+                  }
+               }
+				}
+
+			} else {
+				wp->query = bstrdup(B_L, text);
+			}
+#if 0 //for kw			
+            //Add By liuyingnan for XML COMM API START
+            if(wp->flags & WEBS_XML_CLIENT_REQUEST)
+            {
+                slog(MISC_PRINT,SLOG_DEBUG,"[websReadEvent]:zte_change_wp_query function:%s\n",websRecvHttpBuffer_XML);
+                //zte_change_wp_query(wp,websRecvHttpBuffer_Json);
+                zte_change_wp_query(wp,websRecvHttpBuffer_XML);
+                memset(websRecvHttpBuffer_XML,0,HTTP_BUFFER_SIZE);
+                slog(MISC_PRINT,SLOG_DEBUG,"[out the function]:wp->query:%s\n",wp->query);
+            } 
+            //Add By liuyingnan for XML COMM API END
+#endif
+            
+			wp->flags |= WEBS_POST_DATA;
+			wp->clen -= nbytes;
+			if (wp->clen > 0) {
+				if (nbytes > 0) {
+					break;
+				}
+				done++;
+				break;
+			}
+#ifdef FEATURE_ZTE_WEB_TCARD
+//added by guo shoupeng 10124224 for http share 20120110 start
+			else
+			{
+			    zte_efs_write(wp);
+			}
+//added by guo shoupeng 10124224 for http share 20120110 end
+#endif	
+
+			if (fd != -1) {
+				gclose (fd);
+				fd = -1;
+			}
+			websUrlHandlerRequest(wp);
+			done++;
+			break;
+
+		case WEBS_POST:
+
+
+#ifndef __NO_CGI_BIN
+			if (wp->flags & WEBS_CGI_REQUEST) {
+				if (fd == -1) {
+					fd = gopen(wp->cgiStdin, O_CREAT | O_WRONLY | O_BINARY,
+						0666);
+				}
+
+				if(fd < 0){
+                    break;
+				}
+				gwrite(fd, text, gstrlen(text));
+				gwrite(fd, T("\n"), sizeof(char_t));
+			} else
+#endif
+			if (wp->query && *wp->query && !(wp->flags & WEBS_POST_DATA)) {
+				len = gstrlen(wp->query);
+				wp->query = brealloc(B_L, wp->query, (len + gstrlen(text) +
+					2) * sizeof(char_t));
+				if (wp->query) {
+					wp->query[len++] = '&';
+					gstrcpy(&wp->query[len], text);
+				}
+
+			} else {
+				wp->query = bstrdup(B_L, text);
+			}
+			wp->flags |= WEBS_POST_DATA;
+			done++;
+			break;
+
+		default:
+			websError(wp, 404, T("Bad state"));
+			done++;
+			break;
+		}
+	}
+
+	if (fd != -1) {
+		fd = gclose (fd);
+	}
+
+	if (text) {
+		bfree(B_L, text);
+	}
+}
+char_t	htmExt[] = T(".htm");
+int websUrlParse(char_t *url, char_t **pbuf, char_t **phost, char_t **ppath, 
+	char_t **pport, char_t **pquery, char_t **pproto, char_t **ptag, 
+	char_t **pext)
+{
+	char_t		*hostbuf, *portbuf, *buf;
+	int			c, len, ulen;
+	char_t		*tok, *cp, *host, *path, *port, *proto, *tag, *query, *ext;
+
+	a_assert(url);
+	a_assert(pbuf);
+
+	ulen = gstrlen(url);
+
+	len = ulen * 2 + MAX_PORT_LEN + 3;
+	if ((buf = balloc(B_L, len * sizeof(char_t))) == NULL) {
+		return -1;
+	}
+	portbuf = &buf[len - MAX_PORT_LEN - 1];
+	hostbuf = &buf[ulen+1];
+
+ 	websDecodeUrl(buf, url, ulen);
+
+	url = buf;
+
+	if(portbuf == NULL) //for kw 20210312
+		return -1;
+	
+	stritoa(websGetPort(), portbuf, MAX_PORT_LEN);
+	port = portbuf;
+	path = T("/");
+	proto = T("http");
+	host = T("localhost");
+	query = T("");
+	ext = htmExt;
+	tag = T("");
+
+	if (gstrncmp(url, T("http://"), 7) == 0) {
+		tok = &url[7];
+		tok[-3] = '\0';
+		proto = url;
+		host = tok;
+		for (cp = tok; *cp; cp++) {
+			if (*cp == '/') {
+				break;
+			}
+			if (*cp == ':') {
+				*cp++ = '\0';
+				port = cp;
+				tok = cp;
+			}
+		}
+		if ((cp = gstrchr(tok, '/')) != NULL) {
+
+			c = *cp;
+			*cp = '\0';
+			gstrncpy(hostbuf, host, ulen);
+			gstrncpy(portbuf, port, MAX_PORT_LEN);
+			*cp = c;
+			host = hostbuf;
+			port = portbuf;
+			path = cp;
+			tok = cp;
+		}
+
+	} else {
+		path = url;
+		tok = url;
+	}
+
+	if ((cp = gstrchr(tok, '?')) != NULL) {
+		*cp++ = '\0';
+		query = cp;
+		path = tok;
+		tok = query;
+	} 
+
+	if ((cp = gstrchr(tok, '#')) != NULL) {
+		*cp++ = '\0';
+		if (*query == 0) {
+			path = tok;
+		}
+	}
+
+	if (pext) {
+
+		if ((cp = gstrrchr(path, '.')) != NULL) {
+			const char_t* garbage = T("/\\");
+			int length = gstrcspn(cp, garbage);
+			int garbageLength = gstrspn(cp + length, garbage);
+			int ok = (length + garbageLength == (int) gstrlen(cp));
+
+			if (ok) {
+				cp[length] = '\0';
+				ext = cp;
+			}
+		}
+	}
+
+	if (phost)
+		*phost = host;
+	if (ppath)
+		*ppath = path;
+	if (pport)
+		*pport = port;
+	if (pproto)
+		*pproto = proto;
+	if (pquery)
+		*pquery = query;
+	if (ptag)
+		*ptag = tag;
+	if (pext)
+		*pext = ext;
+	*pbuf = buf;
+	return 0;
+}
+
+char_t *websUrlType(char_t *url, char_t *buf, int charCnt)
+{
+	char_t	*ext = NULL; //cov
+	char_t	*tmp_buf;
+	sym_t	*psym;
+
+	a_assert(url && *url);
+	a_assert(buf && charCnt > 0);
+
+	if (url == NULL || *url == '\0') {
+		gstrcpy(buf, T("text/plain"));
+		return buf;
+	}
+	if (websUrlParse(url, &tmp_buf, NULL, NULL, NULL, NULL, NULL, 
+			NULL, &ext) < 0) {
+		gstrcpy(buf, T("text/plain"));
+		return buf;
+	}
+	strlower(ext);
+
+	if ((psym = symLookup(websMime, ext)) != NULL) {
+		gstrncpy(buf, psym->content.value.string, charCnt);
+	} else {
+		gstrcpy(buf, T("text/plain"));
+	}
+	bfree(B_L, tmp_buf);
+	return buf;
+}
+
+static int websParseFirst(webs_t wp, char_t *text)
+{
+	char_t 	*op, *proto, *protoVer, *url, *host, *query, *path, *port, *ext;
+	char_t	*buf;
+	int		testPort;
+
+#ifdef FEATURE_ZTE_WEB_TCARD
+//added by guo shoupeng 10124224 for http share 20111001 start
+	char *page_att=NULL;
+//added by guo shoupeng 10124224 for http share 20111001 end
+#endif
+	a_assert(websValid(wp));
+	a_assert(text && *text);
+#ifdef WEBINSPECT_FIX	
+	if(text && (!is_print_str(text,strlen(text)) || strstr(text, "HTTP") == NULL))
+	{
+		websDone(wp, 0);
+		slog(MISC_PRINT, SLOG_ERR,"[goahead]es\n");
+		return -1;
+	}
+#endif
+	op = gstrtok(text, T(" \t"));
+	if (op == NULL || *op == '\0') {
+		websError(wp, 400, T("Bad HTTP request"));
+		return -1;
+	}
+	if (gstrcmp(op, T("GET")) != 0) {
+		if (gstrcmp(op, T("POST")) == 0) {
+			wp->flags |= WEBS_POST_REQUEST;
+		} else if (gstrcmp(op, T("HEAD")) == 0) {
+			wp->flags |= WEBS_HEAD_REQUEST;
+		} else {
+			websError(wp, 400, T("Bad request type"));
+			return -1;
+		}
+	}
+
+	websSetVar(wp, T("REQUEST_METHOD"), op);
+
+	url = gstrtok(NULL, T(" \t\n"));
+	if (url == NULL || *url == '\0') {
+		websError(wp, 400, T("Bad HTTP request"));
+		return -1;
+	}
+	protoVer = gstrtok(NULL, T(" \t\n"));
+
+	host = path = port = proto = query = ext = NULL;
+	if (websUrlParse(url, &buf, &host, &path, &port, &query, &proto, 
+			NULL, &ext) < 0) {
+		websError(wp, 400, T("Bad URL format"));
+		return -1;
+	}
+
+	wp->url = bstrdup(B_L, url);
+
+#ifndef __NO_CGI_BIN
+
+
+	if ((gstrstr(url, CGI_BIN) != NULL)&&((wp->flags & WEBS_POST_REQUEST))) {
+		wp->flags |= WEBS_CGI_REQUEST;
+		
+		printf("[goahead]set WEBS_CGI_REQUEST \n");
+
+		// special case: upload.cgi
+		
+		if(gstrstr(url, CGI_BIN_UPLOAD) != NULL)
+		{
+			if(gstrstr(url, CGI_FIRMWARE_UPLOAD) != NULL){
+				wp->flags |= WEBS_CGI_FIRMWARE_UPLOAD;
+				system("rm -rf /tmp/firmware_tmp_file");
+				zte_mgmt_login_timemark_set();
+				printf("[goahead]set WEBS_CGI_FIRMWARE_UPLOAD \n");
+			}
+			wp->cgiStdin = websGetCgiCommName(wp);
+			printf("[goahead]get cgi name.\n");
+			// ex: upload_setting....
+			wp->flags |= WEBS_CGI_UPLOAD;
+		}
+
+		if(gstrstr(url, CGI_BIN_HTTPSHARE) != NULL)
+		{
+			printf("[httpshare]upload file.\n"); 
+
+			if(!zte_reset_cgi_state(wp))	
+			{
+				printf("[httpshare]upload file.reset cgi state error.\n");
+				bfree(B_L, buf);
+				return -1;
+			}
+			wp->flags |= WEBS_CGI_HTTPSHARE_UPLOAD;
+		}
+	            
+
+	}
+#endif
+
+	wp->query = bstrdup(B_L, query);
+	wp->host = bstrdup(B_L, host);
+	wp->path = bstrdup(B_L, path);
+	wp->protocol = bstrdup(B_L, proto);
+	wp->protoVersion = bstrdup(B_L, protoVer);
+	
+	//added by liuyingnan for PC Client begin, 20120829
+    if (gstrstr(url, "api/client/post") != NULL) {
+        printf("%s", "websParseFirst: pc client post");
+        wp->flags |= WEBS_REST_CLIENT_REQUEST;
+    }
+    //added by huangmin for PC Client end, 20120829
+    if (gstrstr(url, "api/xmlclient/post") != NULL) {
+        wp->flags |= WEBS_XML_CLIENT_REQUEST;
+    }
+	
+	if ((testPort = socketGetPort(wp->listenSid)) >= 0) {
+		wp->port = testPort;
+	} else {
+		wp->port = gatoi(port);
+	}
+
+	if (gstrcmp(ext, T(".asp")) == 0) {
+		wp->flags |= WEBS_ASP;
+	}
+	bfree(B_L, buf);
+
+	websUrlType(url, wp->type, TSZ(wp->type));
+
+	ringqFlush(&wp->header);
+	return 0;
+}
+
+static int websGetInput(webs_t wp, char_t **ptext, int *pnbytes) 
+{
+	char_t	*text;
+	char	buf[WEBS_SOCKET_BUFSIZ+1];
+	int		nbytes, len, clen;
+
+	a_assert(websValid(wp));
+	a_assert(ptext);
+	a_assert(pnbytes);
+
+	if(websValid(wp) == 0 || ptext == NULL || pnbytes == NULL){
+		softap_assert("websGetInput 1");
+		return -1;//for kw
+	}
+
+	*ptext = text = NULL;
+	*pnbytes = 0;
+
+	if (wp->state == WEBS_POST_CLEN) {
+		len = (wp->clen > WEBS_SOCKET_BUFSIZ) ? WEBS_SOCKET_BUFSIZ : wp->clen;
+	} else {
+		len = 0;
+	}
+
+	if (len > 0) {
+
+#ifdef WEBS_SSL_SUPPORT
+		if (wp->flags & WEBS_SECURE) {
+			nbytes = websSSLRead(wp->wsp, buf, len);
+		} else {
+			nbytes = socketRead(wp->sid, buf, len);
+		}
+#else
+		nbytes = socketRead(wp->sid, buf, len);
+#endif
+		if (nbytes < 0) {						/* Error */
+			websDone(wp, 0);
+			return -1;
+
+		}  else if (nbytes == 0) {				/* EOF or No data available */
+			//trace(8, T("@@@@webs 0x%x 0x%x: websGetInput read 0\n"),wp,wp->sid);
+			if (socketEof(wp->sid)) {
+				websDone(wp, 0);
+			}
+			return -1;
+
+		} else {								/* Valid data */
+
+			buf[nbytes] = '\0';
+			if ((text = ballocAscToUni(buf, nbytes)) == NULL) {
+				websError(wp, 503, T("Insufficient memory"));
+				return -1;
+			}
+		}
+
+	} else {
+#ifdef WEBS_SSL_SUPPORT
+		if (wp->flags & WEBS_SECURE) {
+			nbytes = websSSLGets(wp->wsp, &text);
+		} else {
+			nbytes = socketGets(wp->sid, &text);
+		}
+#else
+		nbytes = socketGets(wp->sid, &text);
+#endif
+
+		if (nbytes < 0) {
+			int eof;
+
+#ifdef WEBS_SSL_SUPPORT
+			if (wp->flags & WEBS_SECURE) {
+
+				if (wp->state == WEBS_BEGIN) {
+					eof = 1;
+				} else {
+					eof = websSSLEof(wp->wsp);
+				}
+			} else {
+				eof = socketEof(wp->sid);
+			}
+#else
+			eof = socketEof(wp->sid);
+#endif
+
+			if (eof) {
+
+				if (wp->state == WEBS_POST) {
+					websUrlHandlerRequest(wp);
+				} else {
+					websDone(wp, 0);
+				}
+			} else {
+					trace(8, T("@@@@webs 0x%x 0x%x: websGetInput no eof\n"),wp,wp->sid);
+
+#if 1//def HP_FIX
+				websDone(wp, 0);
+#endif /*HP_FIX*/
+
+			}
+
+#if 0 //def UNUSED
+			if (wp->state == WEBS_HEADER && ringqLen(&wp->header) <= 0) {
+				websParseRequest(wp);
+				websUrlHandlerRequest(wp);
+			}
+#endif
+			bfreeSafe(B_L,text);//for kw
+			return -1;
+
+		} else if (nbytes == 0) {
+			if (wp->state == WEBS_HEADER) {
+
+				if(websParseRequest(wp) != 0){
+					return -1;
+				}
+				if (wp->flags & WEBS_POST_REQUEST) {
+					if (wp->flags & WEBS_CLEN) {
+						wp->state = WEBS_POST_CLEN;
+						clen = wp->clen;
+					} else {
+						wp->state = WEBS_POST;
+						clen = 1;
+					}
+					if (clen > 0) {
+
+						return 0;
+					}
+					return 1;
+				}
+
+				websUrlHandlerRequest(wp);
+			}
+			return -1;
+		}
+	}
+
+//	if(text == NULL || nbytes <= 0){ // kw 3 nbytes <= 0 already return
+    if(text == NULL){
+		softap_assert("websGetInput 2");
+	}
+	a_assert(text);
+	a_assert(nbytes > 0);
+	*ptext = text;
+	*pnbytes = nbytes;
+	return 1;
+}
+
+
+#define isgoodchar(s) (gisalnum((s)) || ((s) == '/') || ((s) == '_') || \
+						((s) == '.')  || ((s) == '-') )
+
+static int websParseRequest(webs_t wp)
+{
+	char_t	*authType, *upperKey, *cp, *browser, *lp, *key, *value;
+	int smugglingFlag = 0;
+	a_assert(websValid(wp));
+
+	websSetVar(wp, T("HTTP_AUTHORIZATION"), T(""));
+
+	browser = NULL;
+	char tmp[4] = T("");
+	for (lp = (char_t*) wp->header.servp; lp && *lp; ) {
+		cp = lp;
+		if ((lp = gstrchr(lp, '\n')) != NULL) {
+			lp++;
+		}
+
+		if ((key = gstrtok(cp, T(": \t\n"))) == NULL) {
+			continue;
+		}
+
+		if ((value = gstrtok(NULL, T("\n"))) == NULL) {
+			//value = T("");
+			value = tmp;// kw OVERWRITE_CONST_CHAR
+		}
+
+		while (gisspace(*value)) {
+			value++;
+		}
+		strlower(key);
+
+		fmtAlloc(&upperKey, (gstrlen(key) + 6), T("HTTP_%s"), key);
+		for (cp = upperKey; *cp; cp++) {
+			if (*cp == '-')
+				*cp = '_';
+		}
+		strupper(upperKey);
+		websSetVar(wp, upperKey, value);
+		bfree(B_L, upperKey);
+
+		if (gstrcmp(key, T("user-agent")) == 0) {
+			if (wp->userAgent)
+				bfree(B_L, wp->userAgent);
+			wp->userAgent = bstrdup(B_L, value);
+
+		} else if (gstricmp(key, T("authorization")) == 0) {
+
+			authType = bstrdup (B_L, value);
+			a_assert (authType);
+
+			cp = authType;
+			while (gisalpha(*cp)) {
+				cp++;
+			}
+			*cp = '\0';
+			if (wp->authType)
+				bfree(B_L, wp->authType);
+			wp->authType = bstrdup(B_L, authType);
+			bfree(B_L, authType);
+
+			if (gstricmp(wp->authType, T("basic")) == 0) {
+				char_t	userAuth[FNAMESIZE];
+
+				if ((cp = gstrchr(value, ' ')) != NULL) {
+					*cp = '\0';
+
+               bfree(B_L, wp->authType);
+					wp->authType = bstrdup(B_L, value);
+					websDecode64(userAuth, ++cp, sizeof(userAuth));
+				} else {
+					websDecode64(userAuth, value, sizeof(userAuth));
+				}
+
+				if ((cp = gstrchr(userAuth, ':')) != NULL) {
+					*cp++ = '\0';
+				}
+				if (wp->password)
+					bfree(B_L, wp->password);
+				if (wp->userName)
+					bfree(B_L, wp->userName);
+				if (cp) {
+					wp->userName = bstrdup(B_L, userAuth);
+					wp->password = bstrdup(B_L, cp);
+				} else {
+					wp->userName = bstrdup(B_L, T(""));
+					wp->password = bstrdup(B_L, T(""));
+				}
+
+				wp->flags |= WEBS_AUTH_BASIC;
+			} else {
+#ifdef DIGEST_ACCESS_SUPPORT
+
+				char_t *np;		
+				char_t tp;		
+				char_t *vp;		
+				char_t *npv;	
+				char_t tpv;		
+
+				wp->flags |= WEBS_AUTH_DIGEST;
+
+ 				cp = value;
+				while (isgoodchar(*cp)) {
+					cp++;
+				}
+				while (!isgoodchar(*cp)) {
+					cp++;
+				}
+
+
+				vp = gstrchr(cp, '=');
+				while (vp) {
+
+					np = cp;
+					while (isgoodchar(*np)) {
+						np++;
+					}
+					tp = *np;
+					*np = 0;
+
+					vp++;
+					while (!isgoodchar(*vp)) {
+						vp++;
+					}
+
+					npv = vp;
+					while (isgoodchar(*npv)) {
+						npv++;
+					}
+					tpv = *npv;
+					*npv = 0;
+
+					if (gstricmp(cp, T("username")) == 0) {
+						wp->userName = bstrdup(B_L, vp);
+					} else if (gstricmp(cp, T("response")) == 0) {
+						wp->digest = bstrdup(B_L, vp);
+					} else if (gstricmp(cp, T("opaque")) == 0) {
+						wp->opaque = bstrdup(B_L, vp);
+					} else if (gstricmp(cp, T("uri")) == 0) {
+						wp->uri = bstrdup(B_L, vp);
+					} else if (gstricmp(cp, T("realm")) == 0) {
+						wp->realm = bstrdup(B_L, vp);
+					} else if (gstricmp(cp, T("nonce")) == 0) {
+						wp->nonce = bstrdup(B_L, vp);
+					} else if (gstricmp(cp, T("nc")) == 0) {
+						wp->nc = bstrdup(B_L, vp);
+					} else if (gstricmp(cp, T("cnonce")) == 0) {
+						wp->cnonce = bstrdup(B_L, vp);
+					} else if (gstricmp(cp, T("qop")) == 0) {
+						wp->qop = bstrdup(B_L, vp);
+					}
+
+					*np = tp;
+					*npv = tpv;
+
+ 					cp = npv;
+					while (*cp && isgoodchar(*cp)) {
+						cp++;
+					}
+					while (*cp && !isgoodchar(*cp)) {
+						cp++;
+					}
+
+					if (*cp) {
+						vp = gstrchr(cp, '=');
+					} else {
+						vp = NULL;
+					}
+				}
+#endif /* DIGEST_ACCESS_SUPPORT */
+			} /* if (gstrcmp(wp->authType)) */
+#ifdef WEBS_SECURITY
+		} else if (gstrcmp(key, T("x-http-method")) == 0) {
+			printf("websParseRequest: key=%s\n",key);
+			websError(wp, 405, T(""));
+			return -1;
+		} else if (gstrcmp(key, T("x-http-method-override")) == 0) {
+			printf("websParseRequest: key=%s\n",key);
+			websError(wp, 405, T(""));
+			return -1;
+		} else if (gstrcmp(key, T("x-method-override")) == 0) {
+			printf("websParseRequest: key=%s\n",key);
+			websError(wp, 405, T(""));
+			return -1;
+		} else if (gstrcmp(key, T("transfer-encoding")) == 0) {
+			printf("websParseRequest: key=%s\n",key);
+			if(smugglingFlag) {
+				websError(wp, 403, T(""));
+				return -1;
+			}
+			smugglingFlag = 1;
+#endif
+
+		} else if (gstrcmp(key, T("content-length")) == 0) {
+
+#ifdef WEBS_SECURITY
+		 if(smugglingFlag) {
+			 websError(wp, 403, T(""));
+			 return -1;
+		 }
+		 smugglingFlag = 1;
+#endif		 
+         wp->clen = gatoi(value);
+         if (wp->clen > 0)
+         {
+			   wp->flags |= WEBS_CLEN;			
+			   websSetVar(wp, T("CONTENT_LENGTH"), value);
+         }
+         else
+         {
+            wp->clen = 0;
+         }
+
+		} else if (gstrcmp(key, T("content-type")) == 0) {
+			websSetVar(wp, T("CONTENT_TYPE"), value);
+
+#ifdef WEBS_KEEP_ALIVE_SUPPORT
+		} else if (gstrcmp(key, T("connection")) == 0) {
+			strlower(value);
+			if (gstrcmp(value, T("keep-alive")) == 0) {
+				wp->flags |= WEBS_KEEP_ALIVE;
+			}
+#endif
+
+#ifdef WEBS_PROXY_SUPPORT
+
+		} else if (gstrcmp(key, T("pragma")) == 0) {
+			char_t	tmp[256];
+			gstrncpy(tmp, value, TSZ(tmp));
+			strlower(tmp);
+			if (gstrstr(tmp, T("no-cache"))) {
+				wp->flags |= WEBS_DONT_USE_CACHE;
+			}
+#endif /* WEBS_PROXY_SUPPORT */
+
+
+		} else if (gstrcmp(key, T("cookie")) == 0) {
+			wp->flags |= WEBS_COOKIE;
+			if (wp->cookie)
+				bfree(B_L, wp->cookie);
+			wp->cookie = bstrdup(B_L, value);
+		} else if (gstrcmp(key, T("referer")) == 0) {
+			if (wp->referer)
+				bfree(B_L, wp->referer);
+			wp->referer = bstrdup(B_L, value);
+
+		}
+	}
+	return 0;
+}
+
+
+int websTestVar(webs_t wp, char_t *var)
+{
+	sym_t		*sp;
+
+	a_assert(websValid(wp));
+
+	if (var == NULL || *var == '\0') {
+		return 0;
+	}
+
+	if ((sp = symLookup(wp->cgiVars, var)) == NULL) {
+		return 0;
+	}
+	return 1;
+}
+
+void websSetVar(webs_t wp, char_t *var, char_t *value)
+{
+	value_t		 v;
+
+	a_assert(websValid(wp));
+
+	if (value) {
+		v = valueString(value, VALUE_ALLOCATE);
+	} else {
+		v = valueString(T(""), VALUE_ALLOCATE);
+	}
+	symEnter(wp->cgiVars, var, v, 0);
+}
+
+
+void websSetEnv(webs_t wp)
+{
+	char_t	portBuf[8];
+	char_t	*keyword, *value, *valCheck, *valNew;
+
+	a_assert(websValid(wp));
+
+	websSetVar(wp, T("QUERY_STRING"), wp->query);
+	websSetVar(wp, T("GATEWAY_INTERFACE"), T("CGI/1.1"));
+	websSetVar(wp, T("SERVER_HOST"), websHost);
+	websSetVar(wp, T("SERVER_NAME"), websHost);
+	websSetVar(wp, T("SERVER_URL"), websHostUrl);
+	websSetVar(wp, T("REMOTE_HOST"), wp->ipaddr);
+	websSetVar(wp, T("REMOTE_ADDR"), wp->ipaddr);
+	websSetVar(wp, T("PATH_INFO"), wp->path);
+	stritoa(websPort, portBuf, sizeof(portBuf));
+	websSetVar(wp, T("SERVER_PORT"), portBuf);
+	websSetVar(wp, T("SERVER_ADDR"), websIpaddr);
+	fmtAlloc(&value, FNAMESIZE, T("%s/%s"), WEBS_NAME, WEBS_VERSION);
+	websSetVar(wp, T("SERVER_SOFTWARE"), value);
+	bfreeSafe(B_L, value);
+	websSetVar(wp, T("SERVER_PROTOCOL"), wp->protoVersion);
+
+	wp->decodedQuery = bstrdup(B_L, wp->query);
+	keyword = gstrtok(wp->decodedQuery, T("&"));
+	char tmp[4] = T("");
+	while (keyword != NULL) {
+		if ((value = gstrchr(keyword, '=')) != NULL) {
+			*value++ = '\0';
+			websDecodeUrl(keyword, keyword, gstrlen(keyword));
+			websDecodeUrl(value, value, gstrlen(value));
+		} else {
+			//value = T("");
+			value = tmp;// kw OVERWRITE_CONST_CHAR
+		}
+
+		if (*keyword) {
+
+			if ((valCheck = websGetVar(wp, keyword, NULL)) != 0) {
+				fmtAlloc(&valNew, 256, T("%s %s"), valCheck, value);
+				websSetVar(wp, keyword, valNew);
+				bfreeSafe(B_L, valNew);
+			} else {
+				websSetVar(wp, keyword, value);
+			}
+		}
+		keyword = gstrtok(NULL, T("&"));
+	}
+
+#ifdef EMF
+
+	websSetEmfEnvironment(wp);
+#endif
+}
+
+
+int websCompareVar(webs_t wp, char_t *var, char_t *value)
+{
+	a_assert(websValid(wp));
+	a_assert(var && *var);
+ 
+	if (gstrcmp(value, websGetVar(wp, var, T(" __UNDEF__ "))) == 0) {
+		return 1;
+	}
+	return 0;
+}
+
+char_t *websGetVar(webs_t wp, char_t *var, char_t *defaultGetValue)
+{
+	sym_t	*sp;
+
+	a_assert(websValid(wp));
+	a_assert(var && *var);
+ 
+	if ((sp = symLookup(wp->cgiVars, var)) != NULL) {
+		a_assert(sp->content.type == string);
+		if (sp->content.value.string) {
+			return sp->content.value.string;
+		} else {
+			return T("");
+		}
+	}
+	return defaultGetValue;
+}
+
+
+void websResponse(webs_t wp, int code, char_t *message, char_t *redirect)
+{
+	char_t		*date;
+
+	a_assert(websValid(wp));
+
+	wp->flags &= ~WEBS_KEEP_ALIVE;
+
+	if ( !(wp->flags & WEBS_HEADER_DONE)) {
+		wp->flags |= WEBS_HEADER_DONE;
+
+		if (redirect != NULL) {
+			websWrite(wp, T("HTTP/1.0 %d %s\r\n"), code, websErrorMsg(code));
+		} else {
+			websWrite(wp, T("HTTP/1.1 %d %s\r\n"), code, websErrorMsg(code));
+		}
+
+
+		websWrite(wp, T("Server: %s\r\n"), WEBS_NAME);
+
+		if ((date = websGetDateString(NULL)) != NULL) {
+			websWrite(wp, T("Date: %s\r\n"), date);
+			bfree(B_L, date);
+		}
+
+		if (code == 401) {
+			if (!(wp->flags & WEBS_AUTH_DIGEST)) {
+				websWrite(wp, T("WWW-Authenticate: Basic realm=\"%s\"\r\n"), 
+					websGetRealm());
+#ifdef DIGEST_ACCESS_SUPPORT
+			} else {
+				char_t *nonce, *opaque;
+
+            /* $$$ before... (note commas instead of semicolons...)
+				nonce = websCalcNonce(wp), 
+				opaque = websCalcOpaque(wp), 
+            $$$ after */
+				nonce = websCalcNonce(wp);
+				opaque = websCalcOpaque(wp); 
+            /* ...$$$ end */
+				websWrite(wp, 
+					T("WWW-Authenticate: Digest realm=\"%s\", domain=\"%s\",")
+					T("qop=\"%s\", nonce=\"%s\", opaque=\"%s\",")
+					T("algorithm=\"%s\", stale=\"%s\"\r\n"), 
+					websGetRealm(),
+					websGetHostUrl(),
+					T("auth"),
+					nonce,
+					opaque, T("MD5"), T("FALSE"));
+				bfree(B_L, nonce);
+				bfree(B_L, opaque);
+#endif
+			}
+		}
+
+		if (wp->flags & WEBS_KEEP_ALIVE) {
+			websWrite(wp, T("Connection: keep-alive\r\n"));
+		}
+#ifdef WEBINSPECT_FIX
+		websWrite(wp, T("X-Frame-Options: SAMEORIGIN\r\n"));
+#endif
+		websWrite(wp, T("Pragma: no-cache\r\nCache-Control: no-cache\r\n"));
+		websWrite(wp, T("Content-Type: text/html\r\n"));
+
+		if (redirect) {
+			websWrite(wp, T("Location: %s\r\n"), redirect);
+		}
+		websWrite(wp, T("\r\n"));
+	}
+
+
+	if ((wp->flags & WEBS_HEAD_REQUEST) == 0 && message && *message) {
+		websWrite(wp, T("%s\r\n"), message);
+	}
+	websDone(wp, code);
+}
+
+void websTimeoutCancel(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	if (wp->timeout >= 0) {
+		emfUnschedCallback(wp->timeout);
+		wp->timeout = -1;
+	}
+}
+
+void websRedirect(webs_t wp, char_t *url)
+{
+	char_t	*msgbuf, *urlbuf, *redirectFmt;
+
+	a_assert(websValid(wp));
+	a_assert(url);
+
+	websStats.redirects++;
+	msgbuf = urlbuf = NULL;
+	
+	if (gstrstr(url, T("%0D")) || gstrstr(url, T("%0A")) 
+		|| gstrstr(url, T("%0d")) || gstrstr(url, T("%0a"))
+		|| gstrstr(url, T("\r")) || gstrstr(url, T("\n"))) {
+		printf("[goahead]Redirect injo %s\n",url);
+		url = T(ZTE_WEB_PAGE_LOGIN_NAME);
+		/*ÓÃÓÚÖØ¶¨ÏòµÄÊäÈë²ÎÊý²»Äܰüº¬»Ø³µºÍ»»ÐÐ×Ö·û£¬ÒÔ·ÀÖ¹HTTPÏìÓ¦²ð·Ö¹¥»÷*/
+	}
+
+
+	if (gstrstr(url, T("http://")) == NULL && gstrstr(url, T("https://")) == NULL) {
+		if (*url == '/') {
+			url++;
+		}
+
+		//redirectFmt = T("http://%s/%s");
+
+#ifdef WEBS_SSL_SUPPORT
+		//if (wp->flags & WEBS_SECURE) {			
+		if (websSSLIsOpen()) {
+			//redirectFmt = T("https://%s/%s");// kw OVERWRITE_CONST_CHAR
+			fmtAlloc(&urlbuf, WEBS_MAX_URL + 80, "https://%s/%s",
+				websGetVar(wp, T("HTTP_HOST"),	websHostUrl), url);
+		}
+		else
+#endif
+		{
+			fmtAlloc(&urlbuf, WEBS_MAX_URL + 80, "http://%s/%s",
+				websGetVar(wp, T("HTTP_HOST"), 	websHostUrl), url);
+		}
+		url = urlbuf;
+		printf("[goahead]Redirect %s\n",url);
+	}
+
+
+	fmtAlloc(&msgbuf, WEBS_MAX_URL + 80, 
+		T("<html><head></head><body>\r\n\
+		This document has moved to a new <a href=\"%s\">location</a>.\r\n\
+		Please update your documents to reflect the new location.\r\n\
+		</body></html>\r\n"), url);
+
+	websResponse(wp, 302, msgbuf, url);
+
+	bfreeSafe(B_L, msgbuf);
+	bfreeSafe(B_L, urlbuf);
+}
+
+static int charCount(const char_t* str, char_t ch);
+
+#define kLt '<'
+#define kLessThan T("&lt;")
+#define kGt '>'
+#define kGreaterThan T("&gt;")
+
+static char_t* websSafeUrl(const char_t* url)
+{
+
+   int ltCount = charCount(url, kLt);
+   int gtCount = charCount(url, kGt);
+   int safeLen = 0;
+   char_t* safeUrl = NULL;
+   char_t* src = NULL;
+   char_t* dest = NULL;
+
+   if (NULL != url)
+   {
+      safeLen = gstrlen(url);
+      if (ltCount == 0 && gtCount == 0)
+      {
+         safeUrl = bstrdup(B_L, (char_t*) url);
+      }
+      else
+      {
+         safeLen += (ltCount * 4);
+         safeLen += (gtCount * 4);
+
+         safeUrl = balloc(B_L, safeLen);
+         if (safeUrl != NULL)
+         {
+            src = (char_t*) url;
+            dest = safeUrl;
+            while (*src)
+            {
+               if (*src == kLt)
+               {
+                  gstrcpy(dest, kLessThan);
+                  dest += gstrlen(kLessThan);
+               }
+               else if (*src == kGt)
+               {
+                  gstrcpy(dest, kGreaterThan);
+                  dest += gstrlen(kGreaterThan);
+               }
+               else
+               {
+                  *dest++ = *src;
+               }
+               ++src;
+            }
+            /* don't forget to terminate the string...*/
+            *dest = '\0';
+         }
+      }
+   }
+   return safeUrl;
+}
+
+static int charCount(const char_t* str, char_t ch)
+{
+   int count = 0;
+   char_t* p = (char_t*) str;
+   
+   if (NULL == str)
+   {
+      return 0;
+   }
+
+   while (1)
+   {
+      p = gstrchr(p, ch);
+      if (NULL == p)
+      {
+         break;
+      }
+
+      ++count;
+      ++p;
+   }
+   return count;
+}
+
+
+char_t *websErrorMsg(int code)
+{
+	websErrorType	*ep;
+
+	for (ep = websErrors; ep->code; ep++) {
+		if (code == ep->code) {
+			return ep->msg;
+		}
+	}
+	a_assert(0);
+	return T("");
+}
+
+
+#ifdef qRichErrorPage
+extern int dmfRichError(webs_t wp, int code, char_t* userMsg);
+#endif
+void websError(webs_t wp, int code, char_t *fmt, ...)
+{
+	va_list		args = {0};
+	char_t		*msg, *userMsg, *buf;
+   char_t*     safeUrl = NULL;
+   char_t*     safeMsg = NULL;
+#ifdef qRichErrorPage
+   static int reEntry = 0;
+   int errorOk;
+#endif
+
+	a_assert(websValid(wp));
+	a_assert(fmt);
+
+	websStats.errors++;
+
+   safeUrl = websSafeUrl(wp->url);
+   bfreeSafe(B_L, wp->url);
+   wp->url = safeUrl;
+
+	va_start(args, fmt);
+	userMsg = NULL;
+	fmtValloc(&userMsg, WEBS_BUFSIZE, fmt, args);
+	va_end(args);
+   safeMsg = websSafeUrl(userMsg);
+   bfreeSafe(B_L, userMsg);
+   userMsg = safeMsg;
+   safeMsg  = NULL;
+
+
+
+#ifdef qRichErrorPage
+   if (!reEntry)
+   {
+
+      reEntry = 1;
+      errorOk = dmfRichError(wp, code, userMsg);
+      reEntry = 0;
+      if (errorOk)
+      {
+         bfreeSafe(B_L, userMsg);
+         return;
+      }
+      
+   }
+   
+#endif
+
+/*	msg = T("<html><head><title>Document Error: %s</title></head>\r\n\
+		<body><h2>Access Error: %s</h2>\r\n\
+		<p>%s</p></body></html>\r\n");*/
+// kw OVERWRITE_CONST_CHAR
+
+	buf = NULL;
+	fmtAlloc(&buf, WEBS_BUFSIZE, "<html><head><title>Document Error: %s</title></head>\r\n\
+		<body><h2>Access Error: %s</h2>\r\n\
+		<p>%s</p></body></html>\r\n", websErrorMsg(code), 
+		websErrorMsg(code), userMsg);
+
+	websResponse(wp, code, buf, NULL);
+	bfreeSafe(B_L, buf);
+	bfreeSafe(B_L, userMsg);
+}
+
+
+int websWriteBlock(webs_t wp, char_t *buf, int nChars)
+{
+	int		len, done;
+	char	*asciiBuf, *pBuf;
+
+	a_assert(wp);
+	a_assert(websValid(wp));
+	a_assert(buf);
+	a_assert(nChars >= 0);
+	if(wp == NULL)
+		return -1;//for kw
+
+	done = len = 0;
+
+	pBuf = asciiBuf = ballocUniToAsc(buf, nChars);
+	if(asciiBuf == NULL)
+		return -1;//for kw
+
+	while (nChars > 0) {  
+#ifdef WEBS_SSL_SUPPORT
+		if (wp->flags & WEBS_SECURE) {
+			if ((len = websSSLWrite(wp->wsp, pBuf, nChars)) < 0) {
+				bfree(B_L, asciiBuf);
+				return -1;
+			}
+			websSSLFlush(wp->wsp);
+		} else {
+			if ((len = socketWrite(wp->sid, pBuf, nChars)) < 0) {
+				bfree(B_L, asciiBuf);
+				return -1;
+			}
+			socketFlush(wp->sid);
+		}
+#else /* ! WEBS_SSL_SUPPORT */
+		if ((len = socketWrite(wp->sid, pBuf, nChars)) < 0) {
+			bfree(B_L, asciiBuf);
+			return -1;
+		}
+		socketFlush(wp->sid);
+#endif /* WEBS_SSL_SUPPORT */
+		nChars -= len;
+		pBuf += len;
+		done += len;
+	}
+
+	bfree(B_L, asciiBuf);
+	return done;
+}
+
+int websWrite(webs_t wp, char_t *fmt, ...)
+{
+	va_list		 vargs = {0};
+	char_t		*buf;
+	int			 rc;
+	
+	a_assert(websValid(wp));
+
+	va_start(vargs, fmt);
+
+	buf = NULL;
+	rc = 0;
+
+	if (fmtValloc(&buf, WEBS_BUFSIZE, fmt, vargs) >= WEBS_BUFSIZE) {
+		trace(0, T("webs: websWrite lost data, buffer overflow\n"));
+	}
+   
+	va_end(vargs);
+	a_assert(buf);
+	if (buf) {
+		rc = websWriteBlock(wp, buf, gstrlen(buf));
+		bfree(B_L, buf);
+	}
+	return rc;
+}
+
+
+void websDecodeUrl(char_t *decoded, char_t *token, int len)
+{
+	char_t	*ip,  *op;
+	int		num, i, c;
+	
+	a_assert(decoded);
+	a_assert(token);
+
+	op = decoded;
+	for (ip = token; *ip && len > 0; ip++, op++) {
+		if (*ip == '+') {
+			*op = ' ';
+		} else if (*ip == '%' && gisxdigit(ip[1]) && gisxdigit(ip[2])) {
+
+			ip++;
+			for (i = 0, num = 0; i < 2; i++, ip++) {
+				c = tolower(*ip);
+				if (c >= 'a' && c <= 'f') {
+					num = (num * 16) + 10 + c - 'a';
+				} else {
+					num = (num * 16) + c - '0';
+				}
+			}
+			*op = (char_t) num;
+			ip--;
+
+		} else {
+			*op = *ip;
+		}
+		len--;
+	}
+	*op = '\0';
+}
+
+int websWriteDataNonBlock(webs_t wp, char *buf, int nChars)
+{
+	int r;
+
+	a_assert(wp);
+	a_assert(websValid(wp));
+	a_assert(buf);
+	a_assert(nChars >= 0);
+
+#ifdef WEBS_SSL_SUPPORT
+	if (wp->flags & WEBS_SECURE) {
+		r = websSSLWrite(wp->wsp, buf, nChars);
+		websSSLFlush(wp->wsp);
+	} else {
+		r = socketWrite(wp->sid, buf, nChars);
+		socketFlush(wp->sid);
+	}
+#else
+	r = socketWrite(wp->sid, buf, nChars);
+	socketFlush(wp->sid);
+#endif
+
+	return r;
+}
+
+
+void websTimeout(void *arg, int id)
+{
+	webs_t		wp;
+	int			delay, tm;
+
+	wp = (webs_t) arg;
+	a_assert(websValid(wp));
+
+	tm = websGetTimeSinceMark(wp) * 1000;
+	trace(8, T("@@websTimeout %d ip:%s url:%s\n"),tm,wp->ipaddr,wp->url);
+	if (tm >= WEBS_TIMEOUT) {
+		websStats.timeouts++;
+		emfUnschedCallback(id);
+
+		wp->timeout = -1;
+		websDone(wp, 404);
+	} else {
+		delay = WEBS_TIMEOUT - tm;
+		a_assert(delay > 0);
+		emfReschedCallback(id, delay);
+	}
+}
+
+void websDone(webs_t wp, int code)
+{
+	a_assert(websValid(wp));
+
+	socketDeleteHandler(wp->sid);
+
+	if (code != 200) {
+		wp->flags &= ~WEBS_KEEP_ALIVE;
+	}
+
+	websPageClose(wp);
+
+#ifdef WEBS_SSL_SUPPORT
+	if (wp->flags & WEBS_SECURE) {
+		websTimeoutCancel(wp);
+		websSSLFlush(wp->wsp);
+		socketCloseConnection(wp->sid);
+		websFree(wp);
+		return;
+	}
+#endif
+
+	if (wp->flags & WEBS_KEEP_ALIVE) {
+		if (socketFlush(wp->sid) == 0) {
+			wp->state = WEBS_BEGIN;
+			wp->flags |= WEBS_REQUEST_DONE;
+			if (wp->header.buf) {
+				ringqFlush(&wp->header);
+			}
+			socketCreateHandler(wp->sid, SOCKET_READABLE, websSocketEvent, 
+				(int) wp);
+			websTimeoutCancel(wp);
+			wp->timeout = emfSchedCallback(WEBS_TIMEOUT, websTimeout,
+				(void *) wp);
+			return;
+		}
+	} else {
+		websTimeoutCancel(wp);
+		socketSetBlock(wp->sid, 1);
+		socketFlush(wp->sid);
+		socketCloseConnection(wp->sid);
+	}
+	websFree(wp);
+}
+
+void websFree(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	if (wp->path)
+		bfree(B_L, wp->path);
+	if (wp->url)
+		bfree(B_L, wp->url);
+	if (wp->host)
+		bfree(B_L, wp->host);
+	if (wp->lpath)
+		bfree(B_L, wp->lpath);
+	if (wp->query)
+		bfree(B_L, wp->query);
+	if (wp->decodedQuery)
+		bfree(B_L, wp->decodedQuery);
+	if (wp->authType)
+		bfree(B_L, wp->authType);
+	if (wp->password)
+		bfree(B_L, wp->password);
+	if (wp->userName)
+		bfree(B_L, wp->userName);
+	if (wp->cookie)
+		bfree(B_L, wp->cookie);
+	if (wp->referer)
+		bfree(B_L, wp->referer);
+	if (wp->userAgent)
+		bfree(B_L, wp->userAgent);
+	if (wp->dir)
+		bfree(B_L, wp->dir);
+	if (wp->protocol)
+		bfree(B_L, wp->protocol);
+	if (wp->protoVersion)
+		bfree(B_L, wp->protoVersion);
+	if (wp->cgiStdin)
+		bfree(B_L, wp->cgiStdin);
+
+
+#ifdef DIGEST_ACCESS_SUPPORT
+	if (wp->realm)
+		bfree(B_L, wp->realm);
+	if (wp->uri)
+		bfree(B_L, wp->uri);
+	if (wp->digest)
+		bfree(B_L, wp->digest);
+	if (wp->opaque)
+		bfree(B_L, wp->opaque);
+	if (wp->nonce)
+		bfree(B_L, wp->nonce);
+	if (wp->nc)
+		bfree(B_L, wp->nc);
+	if (wp->cnonce)
+		bfree(B_L, wp->cnonce);
+	if (wp->qop)
+		bfree(B_L, wp->qop);
+#endif
+#ifdef WEBS_SSL_SUPPORT
+	websSSLFree(wp->wsp);
+#endif
+	symClose(wp->cgiVars);
+
+	if (wp->header.buf) {
+		ringqClose(&wp->header);
+	}
+
+	websMax = hFree((void***) &webs, wp->wid);
+	bfree(B_L, wp);
+	a_assert(websMax >= 0);
+}
+
+
+int websAlloc(int sid)
+{
+	webs_t		wp;
+	int			wid;
+
+	if ((wid = hAllocEntry((void***) &webs, &websMax,
+			sizeof(struct websRec))) < 0) {
+		return -1;
+	}
+	wp = webs[wid];
+
+	wp->wid = wid;
+	wp->sid = sid;
+	wp->state = WEBS_BEGIN;
+	wp->docfd = -1;
+	wp->timeout = -1;
+	wp->dir = NULL;
+	wp->authType = NULL;
+	wp->protocol = NULL;
+	wp->protoVersion = NULL;
+	wp->password = NULL;
+	wp->userName = NULL;
+	wp->cookie = NULL;
+	wp->referer = NULL;
+	wp->has_firmware_upload_clean = 0;
+    wp->has_firmware_upload_shell = 0;
+#ifdef DIGEST_ACCESS_SUPPORT
+	wp->realm = NULL;
+	wp->nonce = NULL;
+	wp->digest = NULL;
+	wp->uri = NULL;
+	wp->opaque = NULL;
+	wp->nc = NULL;
+	wp->cnonce = NULL;
+	wp->qop = NULL;
+#endif
+#ifdef WEBS_SSL_SUPPORT
+	wp->wsp = NULL;
+#endif
+
+	ringqOpen(&wp->header, WEBS_HEADER_BUFINC, WEBS_MAX_HEADER);
+
+	wp->cgiVars = symOpen(WEBS_SYM_INIT);
+
+	return wid;
+}
+
+
+char_t *websGetIpaddrUrl()
+{
+	return websIpaddrUrl;
+}
+
+
+char_t *websGetHostUrl()
+{
+	return websHostUrl;
+}
+
+
+int websGetPort()
+{
+	return websPort;
+}
+
+char_t *websGetHost()
+{
+	return websHost;
+}
+
+
+int websGetRequestBytes(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->numbytes;
+}
+
+
+int websGetRequestFlags(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->flags;
+}
+
+char_t *websGetRequestDir(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	if (wp->dir == NULL) {
+		return T("");
+	}
+
+	return wp->dir;
+}
+
+
+int websGetSid(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->sid;
+}
+
+
+char_t *websGetRequestIpaddr(webs_t wp)
+{
+	a_assert(websValid(wp));
+	return wp->ipaddr;
+}
+
+
+#ifdef FEATURE_ZTE_WEB_TCARD
+//added by guo shoupeng 10124224 for http share 20111001 start
+char_t * websGetURL(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->url;
+}
+
+char_t *websGetFileName(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->cgiStdin;
+}
+
+
+int websGetState(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->state;
+}
+
+int websGetlen(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->clen;
+}
+
+//added by guo shoupeng 10124224 for http share 20111001 end
+#endif
+
+
+char_t *websGetRequestLpath(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->lpath;
+}
+
+
+char_t *websGetRequestPassword(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->password;
+}
+
+char_t *websGetRequestPath(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	if (wp->path == NULL) {
+		return T("");
+	}
+
+	return wp->path;
+}
+
+
+char_t *websGetRequestType(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->type;
+}
+
+
+int websGetRequestWritten(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->written;
+}
+
+
+char_t *websGetRequestUserName(webs_t wp)
+{
+	a_assert(websValid(wp));
+
+	return wp->userName;
+}
+
+void websSetHost(char_t *host)
+{
+	gstrncpy(websHost, host, TSZ(websHost)-1);
+}
+
+
+void websSetIpaddr(char_t *ipaddr)
+{
+	a_assert(ipaddr && *ipaddr);
+
+	gstrncpy(websIpaddr, ipaddr, TSZ(websIpaddr)-1);
+}
+
+void websSetHostUrl(char_t *url)
+{
+	a_assert(url && *url);
+
+	bfreeSafe(B_L, websHostUrl);
+	websHostUrl = gstrdup(B_L, url);
+}
+
+
+void websSetRequestBytes(webs_t wp, int bytes)
+{
+	a_assert(websValid(wp));
+	a_assert(bytes >= 0);
+
+	wp->numbytes = bytes;
+}
+
+
+void websSetRequestLpath(webs_t wp, char_t *lpath)
+{
+	a_assert(websValid(wp));
+	a_assert(lpath && *lpath);
+
+	if (wp->lpath) {
+		bfree(B_L, wp->lpath);
+	}
+	wp->lpath = bstrdup(B_L, lpath);
+	websSetVar(wp, T("PATH_TRANSLATED"), wp->lpath);
+}
+
+void websSetRequestFlags(webs_t wp, int flags)
+{
+	a_assert(websValid(wp));
+
+	wp->flags = flags;
+}
+
+
+void websSetRequestPath(webs_t wp, char_t *dir, char_t *path)
+{
+	char_t	*tmp;
+
+	a_assert(websValid(wp));
+
+	if (dir) { 
+		tmp = wp->dir;
+		wp->dir = bstrdup(B_L, dir);
+		if (tmp) {
+			bfree(B_L, tmp);
+		}
+	}
+	if (path) {
+		tmp = wp->path;
+		wp->path = bstrdup(B_L, path);
+		websSetVar(wp, T("PATH_INFO"), wp->path);
+		if (tmp) {
+			bfree(B_L, tmp);
+		}
+	}
+}
+
+
+void websSetRequestWritten(webs_t wp, int written)
+{
+	a_assert(websValid(wp));
+
+	wp->written = written;
+}
+
+
+void websSetRequestSocketHandler(webs_t wp, int mask, void (*fn)(webs_t wp))
+{
+	a_assert(websValid(wp));
+
+	wp->writeSocket = fn;
+	socketCreateHandler(wp->sid, SOCKET_WRITABLE, websSocketEvent, (int) wp);
+}
+
+
+char_t *websGetDateString(websStatType *sbuf)
+{
+	char_t*	cp, *r;
+	time_t	now;
+
+	if (sbuf == NULL) {
+		time(&now);
+	} else {
+		now = sbuf->mtime;
+	}
+	if ((cp = gctime(&now)) != NULL) {
+		cp[gstrlen(cp) - 1] = '\0';
+		r = bstrdup(B_L, cp);
+		return r;
+	}
+	return NULL;
+}
+
+
+int websValid(webs_t wp)
+{
+	int		wid;
+
+	for (wid = 0; wid < websMax; wid++) {
+		if (wp == webs[wid]) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
+
+void websSetTimeMark(webs_t wp)
+{
+	wp->timestamp = get_sys_uptime();
+}
+
+
+void websSetRealm(char_t *realmName)
+{
+	a_assert(realmName);
+
+	gstrncpy(websRealm, realmName, TSZ(websRealm)-1);
+}
+
+
+char_t *websGetRealm()
+{
+	return websRealm;
+}
+
+
+static int websGetTimeSinceMark(webs_t wp)
+{
+	return get_sys_uptime() - wp->timestamp;
+}
+
+void websSetLoginTimemark(webs_t wp)
+{
+
+    char_t login_timemark[64] = {0};
+    char_t login_info[20] = {0};
+    char_t nv_ipaddr[40] = {0};
+    char_t *ip_address = NULL;
+    zte_topsw_state_e_type status = ZTE_NVIO_MAX;
+    long timemark = 0;    
+    char_t user_login_timemark[64] = {0};
+    long timemark_check = 0;
+	long luser_login_timemark = 0;
+
+  
+    status = zte_web_read(NV_LOGINFO, login_info);
+
+    if(0 == strcmp(login_info,"ok"))
+    {
+
+        zte_web_read("user_login_timemark", user_login_timemark);
+
+        luser_login_timemark = atol(user_login_timemark);
+		if(luser_login_timemark < 0 || luser_login_timemark > LONG_MAX-1){
+            luser_login_timemark = LONG_MAX;
+		}
+		
+        timemark_check = time(0) - luser_login_timemark;  
+        if(timemark_check > LOGIN_TIMEOUT)
+        {
+            (void)zte_web_write(NV_USER_IP_ADDR,"");
+            (void)zte_web_write(NV_LOGINFO,"timeout");
+			(void)zte_web_write(NV_COOKIE_ID, "");
+            (void)zte_web_write(NV_USER_LOGIN_TIMEMARK,"0");
+            slog(MISC_PRINT,SLOG_ERR,"zte_mgmt_login_timemark_check: the login is timeout .\n");
+        }
+        else
+        {
+            ip_address = websGetRequestIpaddr(wp);
+#if 0		 // kw 3 INVARIANT_CONDITION.UNREACH	  wp->ipaddr is array, address can not be null
+            if (NULL == ip_address)
+            {
+                slog(MISC_PRINT,SLOG_ERR,"websSetLoginTimemark: ip_address is null.\n");
+                return ;
+            }
+#endif
+            zte_web_read(NV_USER_IP_ADDR, nv_ipaddr);
+           
+
+            if (0 == strcmp(ip_address,nv_ipaddr))
+            {
+                timemark = time(0);
+                sprintf(login_timemark,"%ld",timemark);  
+                (void)zte_web_write(NV_USER_LOGIN_TIMEMARK, login_timemark);
+            }
+
+         }
+    }  
+
+}
+
diff --git a/lynq/MD310EU/ap/app/goahead/server/webs.h b/lynq/MD310EU/ap/app/goahead/server/webs.h
new file mode 100755
index 0000000..ed80948
--- /dev/null
+++ b/lynq/MD310EU/ap/app/goahead/server/webs.h
@@ -0,0 +1,267 @@
+#ifndef _h_WEBS
+#define _h_WEBS 1
+
+#include	"ej.h"
+#ifdef WEBS_SSL_SUPPORT
+	#include	"websSSL.h"
+#else	
+static inline int websSSLIsOpen()
+{
+	return 0;
+}
+#endif
+
+
+#ifdef WEBINSPECT_FIX 
+#define WEBS_NAME				T("Demo-Webs")
+#else
+#define WEBS_NAME				T("GoAhead-Webs")
+#endif
+#define WEBS_VERSION			T("2.1.8")
+
+#define WEBS_HEADER_BUFINC 		512			
+#define WEBS_ASP_BUFINC			512			
+#define WEBS_MAX_PASS			32			
+
+#define WEBS_BUFSIZE			(8*1024)
+
+#define WEBS_MAX_HEADER			(5 * 1024)	
+#define WEBS_MAX_URL			4096		
+#ifdef FEATURE_ZTE_WEB_TCARD
+//added for http share 20111001 start
+#define WEBS_SOCKET_BUFSIZ		4*1024		
+#else
+#define WEBS_SOCKET_BUFSIZ		4*1024		
+//added for http share 20111001 end
+#endif
+//added for PC Client begin, 20120829
+#define HTTP_BUFFER_SIZE    (5*1024)
+//added for PC Client end, 20120829
+#define WEBS_HTTP_PORT			T("httpPort")
+#define CGI_BIN					T("cgi-bin")
+#define CGI_BIN_UPLOAD			T("cgi-bin/upload/")
+#define CGI_BIN_HTTPSHARE		T("cgi-bin/httpshare/")
+
+
+#define WEBS_LOCAL_PAGE			0x1			
+#define WEBS_KEEP_ALIVE			0x2			
+#define WEBS_DONT_USE_CACHE		0x4			
+#define WEBS_COOKIE				0x8			
+#define WEBS_IF_MODIFIED		0x10		
+#define WEBS_POST_REQUEST		0x20		
+#define WEBS_LOCAL_REQUEST		0x40		
+#define WEBS_HOME_PAGE			0x80		
+#define WEBS_ASP				0x100		 
+#define WEBS_HEAD_REQUEST		0x200		
+#define WEBS_CLEN				0x400		
+#define WEBS_FORM				0x800		
+#define WEBS_REQUEST_DONE		0x1000		
+#define WEBS_POST_DATA			0x2000		
+#define WEBS_CGI_REQUEST		0x4000		
+#define WEBS_SECURE				0x8000		
+#define WEBS_AUTH_BASIC			0x10000		
+#define WEBS_AUTH_DIGEST		0x20000		
+#define WEBS_HEADER_DONE		0x40000		
+#define WEBS_CGI_UPLOAD			0x80000		
+#define WEBS_CGI_FIRMWARE_UPLOAD 0x100000	
+#define WEBS_CGI_HTTPSHARE_UPLOAD 0x200000	
+
+
+#define CGI_UPLOAD				T("upload")
+#define CGI_FIRMWARE_UPLOAD		T("upload.cgi")
+#define CGI_FIRMWARE_WRITE      T("upload.write")
+#define CGI_HTTPSHARE_UPLOAD      T("httpshare.up")
+
+#define FIRMWARE_TMP_FILE                  T("/tmp/firmware_tmp_file")
+//#define FIRMWARE_TMP_FILE                  T("/firmware_tmp_file")
+
+//added by liuyingnan for PC Client begin, 20120829
+#define WEBS_REST_CLIENT_REQUEST       0x200000
+#define WEBS_XML_CLIENT_REQUEST       0x400000
+//added by liuyingnan for PC Client end, 20120829
+
+
+#define WEBS_HANDLER_FIRST	0x1			
+#define WEBS_HANDLER_LAST	0x2			
+
+typedef struct websRec {
+	ringq_t			header;				
+	time_t			since;				
+	sym_fd_t		cgiVars;			
+	sym_fd_t		cgiQuery;			
+	time_t			timestamp;			
+	int				timeout;			
+	char_t			ipaddr[40];			
+	char_t			ifaddr[32];			
+	char_t			type[64];			
+	char_t			*dir;				
+	char_t			*path;				
+	char_t			*url;				
+	char_t			*host;				
+	char_t			*lpath;				
+	char_t			*query;				
+	char_t			*decodedQuery;		
+	char_t			*authType;			
+	char_t			*password;			
+	char_t			*userName;			
+	char_t			*cookie;			
+	char_t			*referer;			
+	char_t			*userAgent;			
+	char_t			*protocol;			
+	char_t			*protoVersion;		
+	int				sid;				
+	int				listenSid;			
+	int				port;				
+	int				state;				
+	int				flags;				
+	int				code;				
+	int				clen;				
+	int				wid;				
+	char_t			*cgiStdin;			
+	int				docfd;				
+	int				numbytes;			
+	int				written;			
+	int				has_firmware_upload_clean; 
+    int				has_firmware_upload_shell; 
+	void			(*writeSocket)(struct websRec *wp);
+#ifdef DIGEST_ACCESS_SUPPORT
+    char_t			*realm;		
+    char_t			*nonce;		
+    char_t			*digest;	
+    char_t			*uri;		
+    char_t			*opaque;	
+    char_t			*nc;		
+    char_t			*cnonce;	
+    char_t			*qop;		
+#endif
+#ifdef WEBS_SSL_SUPPORT
+	websSSL_t		*wsp;		
+#endif
+} websRec;
+
+typedef websRec	*webs_t;
+typedef websRec websType;
+
+extern void 	 websSetDefaultDir(char_t *dir);
+extern void 	 websSetDefaultPage(char_t *page);
+
+extern int		 websAccept(int sid, char *ipaddr, int port, int listenSid);
+extern int 		 websAspDefine(char_t *name, 
+					int (*fn)(int ejid, webs_t wp, int argc, char_t **argv));
+extern int 		 websAspRequest(webs_t wp, char_t *lpath);
+
+extern void  	 websFooter(webs_t wp);
+extern int 		 websFormDefine(char_t *name, void (*fn)(webs_t wp, 
+					char_t *path, char_t *query));
+
+extern int 		 websDecode64(char_t *outbuf, char_t *string, int buflen);
+extern void		 websDecodeUrl(char_t *token, char_t *decoded, int len);
+
+extern void 	 websEncode64(char_t *outbuf, char_t *string, int buflen);
+
+
+extern void		 websCloseListen();
+extern void  	 websDone(webs_t wp, int code);
+
+extern void  	 websError(webs_t wp, int code, char_t *msg, ...);
+extern char_t 	*websErrorMsg(int code);
+
+extern char_t 	*websGetDefaultDir();
+extern char_t 	*websGetDefaultPage();
+
+extern char_t 	*websGetRealm();
+extern int 		 websGetRequestBytes(webs_t wp);
+extern char_t	*websGetRequestDir(webs_t wp);
+extern int		 websGetRequestFlags(webs_t wp);
+
+extern char_t 	*websGetHostUrl();
+extern char_t 	*websGetIpaddrUrl();
+extern char_t 	*websGetPassword();
+extern int		 websGetPort();
+
+extern char_t 	*websGetPublishDir(char_t *path, char_t **urlPrefix);
+extern char_t	*websGetRequestType(webs_t wp);
+extern int 		 websGetRequestWritten(webs_t wp);
+
+extern char_t	*websGetRequestIpaddr(webs_t wp);
+extern int 		websGetSid(webs_t wp);
+extern char_t 	*websGetRequestLpath(webs_t wp);
+extern char_t	*websGetRequestPath(webs_t wp);
+extern char_t	*websGetRequestPassword(webs_t wp);
+
+extern char_t 	*websGetVar(webs_t wp, char_t *var, char_t *def);
+extern int 		 websCompareVar(webs_t wp, char_t *var, char_t *value);
+
+
+extern int 		 websPublish(char_t *urlPrefix, char_t *path);
+extern void		 websRedirect(webs_t wp, char_t *url);
+extern void 	 websSecurityDelete();
+extern int 		 websSecurityHandler(webs_t wp, char_t *urlPrefix, 
+					char_t *webDir, int arg, char_t *url, char_t *path, 
+					char_t *query);
+
+extern void 	 websHeader(webs_t wp);
+extern int		 websOpenListen(int port, int retries);
+extern int 		 websPageOpen(webs_t wp, char_t *lpath, char_t *path,
+					int mode, int perm);
+extern void 	 websPageClose(webs_t wp);
+
+extern void 	 websSetEnv(webs_t wp);
+extern void 	 websSetHost(char_t *host);
+extern void 	 websSetIpaddr(char_t *ipaddr);
+extern void 	 websSetPassword(char_t *password);
+extern void 	 websSetRealm(char_t *realmName);
+
+extern void 	 websSetVar(webs_t wp, char_t *var, char_t *value);
+extern int 		 websTestVar(webs_t wp, char_t *var);
+
+extern int 		 websUrlHandlerDefine(char_t *urlPrefix, char_t *webDir, 
+					int arg, int (*fn)(webs_t wp, char_t *urlPrefix, 
+					char_t *webDir, int arg, char_t *url, char_t *path, 
+					char_t *query), int flags);
+extern int 		 websUrlHandlerDelete(int (*fn)(webs_t wp, char_t *urlPrefix,
+					char_t *webDir, int arg, char_t *url, char_t *path, 
+					char_t *query));
+extern int		 websUrlHandlerRequest(webs_t wp);
+extern int 		 websUrlParse(char_t *url, char_t **buf, char_t **host, 
+					char_t **path, char_t **port, char_t **query, 
+					char_t **proto, char_t **tag, char_t **ext);
+extern char_t 	*websUrlType(char_t *webs, char_t *buf, int charCnt);
+
+extern int 		 websValid(webs_t wp);
+extern int 		 websValidateUrl(webs_t wp, char_t *path);
+
+extern void 	 websSetRequestBytes(webs_t wp, int bytes);
+extern void		 websSetRequestFlags(webs_t wp, int flags);
+extern void 	 websSetRequestLpath(webs_t wp, char_t *lpath);
+extern void 	 websSetRequestPath(webs_t wp, char_t *dir, char_t *path);
+extern char_t	*websGetRequestUserName(webs_t wp);
+extern void 	 websSetRequestWritten(webs_t wp, int written);
+
+extern int 		 websWrite(webs_t wp, char_t* fmt, ...);
+extern int 		 websWriteBlock(webs_t wp, char_t *buf, int nChars);
+extern int 		 websWriteDataNonBlock(webs_t wp, char *buf, int nChars);
+
+
+extern void 	websTimeout(void *arg, int id);
+extern void		websSetTimeMark(webs_t wp);
+extern void		 websTimeoutCancel(webs_t wp);
+
+
+extern int 		websAlloc(int sid);
+extern void 	websFree(webs_t wp);
+
+extern void 	websReadEvent(webs_t wp);
+
+
+extern char websRecvHttpBuffer[HTTP_BUFFER_SIZE];
+extern int is_print_str(char *str, int len);
+
+#ifdef EMF
+extern void 	 websFormExplain(webs_t wp, char_t *path, char_t *query);
+#endif
+
+extern int web_make_salt_base64(char *id, int len);
+
+#endif /* _h_WEBS */
+
diff --git a/lynq/MD310EU/ap/app/include/mmi_msg.h b/lynq/MD310EU/ap/app/include/mmi_msg.h
new file mode 100644
index 0000000..dc820b7
--- /dev/null
+++ b/lynq/MD310EU/ap/app/include/mmi_msg.h
@@ -0,0 +1,92 @@
+/**
+ * @file mmi_msg.h
+ * @brief ÌṩÁËmmiÏûÏ¢½Ó¿ÚºÍÏûÏ¢½á¹¹¶¨Òå
+ *
+ * Copyright (C) 2017 Sanechips Technology Co., Ltd.
+ * @author
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __MMI_MSG_H__
+#define __MMI_MSG_H__
+#include "message.h"
+
+
+/*ϵͳÐÅÏ¢²éѯ*/
+typedef struct {
+	signed long     srvStatus;        /*ϵͳ·þÎñ״̬  */
+	signed long     srvDomain;        /*ϵͳ·þÎñÓò    */
+	signed long     roamStatus;       /*ÂþÓÎ״̬      */
+	signed long     sysMode;          /*ϵͳģʽ      */
+	signed long     simState;         /*SIM¿¨×´Ì¬     */
+	signed long     reserve;          /*±£ÁôÖµ       */
+	signed long     sysSubmode;       /*ϵͳ×Óģʽ    */
+} T_zAt_SysinfoRes;
+
+
+/* ÏûÏ¢½á¹¹Ìå */
+typedef struct {
+	unsigned char sms_unread_ind; //0:ÎÞδ¶Á¶ÌÐÅ£» 1:ÓÐδ¶Á¶ÌÐÅ
+	unsigned char sms_memory_full_ind; //0:²»Âú; 1: Âú
+	unsigned char sms_new_ind;
+	unsigned char sms_is_reading;
+	unsigned char sms_unread_count;
+} T_zUfi_SmsStatusInfoInd;
+
+/* ¹Ø»úÖØÆôÏûϢʵ¼Ê²Ù×÷Öµ */
+typedef enum {
+	Ext_Cmd_Base = 0,
+	Ext_Cmd_REBOOT,
+	Ext_Cmd_POWEROFF,
+	Ext_Cmd_POWEROFF_CHARGING,
+	Ext_Cmd_POWEROFF_FAKE,
+	Ext_Cmd_POWEROFF_CLOCK,
+	Ext_Cmd_MAX
+} T_zUfi_ExtCmd;
+
+struct ext_msg_data {
+	int cmd;
+};
+
+//autotest ×Ô¶¯»¯²âÊÔÏûÏ¢Êý¾Ý
+typedef struct  {
+	SINT32 code;
+	SINT32 value;
+} autotest_key_rspmsg;
+
+//ÇëÎâºì½«mmiÄÚ²¿ÏûϢʹÓõÄÏûÏ¢Â룬ҲÌí¼Óµ½ÕâÀï
+enum mmi_msg_cmd {
+	MSG_CMD_CHANNEL_NETWORK_MODE = MSG_CMD_MMI_BASE,
+	MSG_CMD_MULTI_CONNECT_STATUS,//ÊÇ·ñ´æÔÚ¶à·PDP¼¤»î
+	MSG_CMD_CHANNEL_CONNECT_STATUS,
+	MSG_CMD_SMS_STATUS_INFO_IND,
+	MSG_CMD_OUT_REG_GET_SIGNAL_NUM,
+	MSG_CMD_MODIFY_SSID_KEY,
+	MSG_CMD_GET_TRAFFIC_INFO_START,
+	MSG_CMD_GET_TRAFFIC_INFO_END,
+	MSG_CMD_TRAFFIC_INFO_RESET,
+	MSG_CMD_GET_NET_PROVIDER,
+	MSG_CMD_SET_USB_MODE,
+	MSG_CMD_VOIP_STATUS_INFO,
+	MSG_CMD_STA_COUNT_CHANGE,
+	MSG_CMD_POWEROFF_PLUGOUT_RESULT,
+	MSG_CMD_SOCKET_STATE_CHANGE,    //ÄÚÖÃsocket connect state
+	MSG_CMD_MCUSOCKET_STATE_CHANGE, //ÍâÖÃsocket connect state
+	MSG_CMD_MMIGET_WIFI_STANUM,//ÏÂÃæÊÇMMI ÄÚ²¿Ê¹ÓõÄÏûÏ¢
+	MSG_CMD_MMISTART_BACKLIGHTOFF_TIMER,
+	MSG_CMD_MMICHECK_TIP_INFO,
+	MSG_CMD_MMISHOW_SSID_INFO,
+	MSG_CMD_MMIGET_WIFI_DATA,
+	MSG_CMD_RJ11_STATUS_INFO, //ҢԶcpe
+	MSG_CMD_RJ45_STATUS_INFO,
+//#ifdef _ENABLE_AUTOTEST
+	MSG_CMD_AUTOTEST_KEY_REQ,
+//#endif
+};
+
+#endif
+
diff --git a/lynq/MD310EU/ap/app/qrencode/Makefile b/lynq/MD310EU/ap/app/qrencode/Makefile
new file mode 100755
index 0000000..1acdf99
--- /dev/null
+++ b/lynq/MD310EU/ap/app/qrencode/Makefile
@@ -0,0 +1,59 @@
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+		
+##############USER COMIZE BEGIN################
+EXEC1 = qrencode
+EXEC2 = png2bmp
+EXEC3 = fb
+EXEC4 = fbtest
+OBJS1 = bitstream.o mask.o mmask.o mqrspec.o qrenc.o qrencode.o \
+	qrinput.o qrspec.o rscode.o split.o
+OBJS2 = common.o png2bmp.o
+OBJS3 = fb.o
+OBJS4 = fbtest.o
+
+LDLIBS += -lpng -L$(zte_lib_path)/libpng/install/lib
+LDLIBS += -L$(zte_lib_path)/zlib/install/lib -lz -lm
+CFLAGS += -I./
+CFLAGS += -I$(zte_lib_path)/libpng/install/include
+CFLAGS += -I$(zte_lib_path)/zlib/install/include
+
+
+
+##############USER COMIZE END##################
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC1) $(EXEC2) $(EXEC3) $(EXEC4)
+
+$(EXEC1): $(OBJS1)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+$(EXEC2): $(OBJS2)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+$(EXEC3): $(OBJS3)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+$(EXEC4): $(OBJS4)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+romfs:
+	$(ROMFSINST) $(EXEC1) /sbin/$(EXEC1)
+	$(ROMFSINST) $(EXEC2) /sbin/$(EXEC2)
+	$(ROMFSINST) $(EXEC3) /sbin/$(EXEC3)
+	$(ROMFSINST) $(EXEC4) /sbin/$(EXEC4)
+
+clean:
+	-rm -f $(EXEC1) *.elf *.gdb *.o
+	-rm -f $(EXEC2) *.elf *.gdb *.o
+	-rm -f $(EXEC3) *.elf *.gdb *.o
+	-rm -f $(EXEC4) *.elf *.gdb *.o
+
diff --git a/lynq/MD310EU/ap/app/qrencode/fb.c b/lynq/MD310EU/ap/app/qrencode/fb.c
new file mode 100755
index 0000000..b46a197
--- /dev/null
+++ b/lynq/MD310EU/ap/app/qrencode/fb.c
@@ -0,0 +1,196 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <fcntl.h>

+#include <unistd.h>

+#include <sys/mman.h>

+#include <sys/ioctl.h>

+#include <linux/fb.h>

+

+#pragma pack(1)

+typedef struct {

+    unsigned short bfType;

+    unsigned int bfSize;

+    unsigned short bfReserved1;

+    unsigned short bfReserved2;

+    unsigned int bfOffBits;

+} BMPFILEHEADER;

+

+typedef struct {

+    unsigned int biSize;

+    int biWidth;

+    int biHeight;

+    unsigned short biPlanes;

+    unsigned short biBitCount;

+    unsigned int biCompression;

+    unsigned int biSizeImage;

+    int biXPelsPerMeter;

+    int biYPelsPerMeter;

+    unsigned int biClrUsed;

+    unsigned int biClrImportant;

+} BMPINFOHEADER;

+#pragma pack()

+

+#define SWAP_ENDIAN_USHORT(value) ((unsigned short)((((unsigned short)(value) & 0xFF) << 8) | (((unsigned short)(value) & 0xFF00) >> 8)))

+

+// Convert 24-bit RGB to 16-bit RGB565

+unsigned short rgb24_to_rgb565(unsigned char r, unsigned char g, unsigned char b) {

+	unsigned short color = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);

+    unsigned short swapped = SWAP_ENDIAN_USHORT(color);

+	return swapped;

+}

+

+int main(int argc, char *argv[]) {

+	FILE *fp = NULL;

+	unsigned char *line = NULL;

+    BMPFILEHEADER fileHeader;

+    BMPINFOHEADER infoHeader;

+

+    if (argc < 2) {

+        printf("No para. Please input bmp filepath.\n");

+		return;

+    }

+

+    // Open BMP file

+    fp = fopen(argv[1], "rb");

+    if (!fp) {

+        perror("Cannot open BMP file");

+        return -1;

+    }

+

+    // Read BMP headers

+    if (fread(&fileHeader, sizeof(BMPFILEHEADER), 1, fp) != 1) {

+        perror("Failed to read file header");

+        fclose(fp);

+        return -1;

+    }

+	printf("fileHeader: bfType=%x, bfSize=%u, bfOffBits=%u\n", 

+	fileHeader.bfType, fileHeader.bfSize, fileHeader.bfOffBits);

+

+    if (fread(&infoHeader, sizeof(BMPINFOHEADER), 1, fp) != 1) {

+        perror("Failed to read info header");

+        fclose(fp);

+        return -1;

+    }

+	printf("infoHeader: biSize=%u, biWidth=%d, biHeight=%d\n", 

+	infoHeader.biSize, infoHeader.biWidth, infoHeader.biHeight);

+	printf("infoHeader: biPlanes=%u, biBitCount=%u, biCompression=%u\n", 

+	infoHeader.biPlanes, infoHeader.biBitCount, infoHeader.biCompression);

+	printf("infoHeader: biSizeImage=%u, biXPelsPerMeter=%d, biYPelsPerMeter=%d\n", 

+	infoHeader.biSizeImage, infoHeader.biXPelsPerMeter, infoHeader.biYPelsPerMeter);

+	printf("infoHeader: biClrUsed=%u, biClrImportant=%d\n", 

+	infoHeader.biClrUsed, infoHeader.biClrImportant);

+

+    // Check BMP format

+    if (fileHeader.bfType != 0x4D42) { // ASCII code for "BM"

+        printf("Not a valid BMP file\n");

+        fclose(fp);

+        return -1;

+    }

+

+    // Check bit depth

+    if (infoHeader.biBitCount != 24 && infoHeader.biBitCount != 16) {

+        printf("Only 16-bit or 24-bit BMP supported, current image is %d-bit\n", infoHeader.biBitCount);

+        fclose(fp);

+        return -1;

+    }

+

+    // Open framebuffer device

+    int fbfd = open("/dev/fb0", O_RDWR);

+    if (fbfd < 0) {

+        perror("Cannot open framebuffer device");

+        fclose(fp);

+        return -1;

+    }

+

+    // Get screen information

+    struct fb_var_screeninfo vinfo;

+    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) < 0) {

+        perror("Cannot get screen info");

+        close(fbfd);

+        fclose(fp);

+        return -1;

+    }

+

+    // Check screen color depth

+    if (vinfo.bits_per_pixel != 16) {

+        printf("This program only supports 16-bit color depth display\n");

+        close(fbfd);

+        fclose(fp);

+        return -1;

+    }

+

+    // Calculate screen size and map framebuffer

+    long screensize = vinfo.xres * vinfo.yres * 2; // 16-bit = 2 bytes

+    unsigned char *fbp = mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);

+    if (fbp == MAP_FAILED) {

+        perror("Cannot map framebuffer");

+        close(fbfd);

+        fclose(fp);

+        return -1;

+    }

+

+    // Move file pointer to image data

+    fseek(fp, fileHeader.bfOffBits, SEEK_SET);

+

+    // Prepare to read image data

+    unsigned short *fb16 = (unsigned short *)fbp;

+    int bytes_per_pixel = infoHeader.biBitCount / 8;

+    int padding = (4 - (infoHeader.biWidth * bytes_per_pixel) % 4) % 4;

+    line = malloc(infoHeader.biWidth * bytes_per_pixel + padding);

+

+    if (line == NULL) {

+        perror("Memory allocation failed");

+        munmap(fbp, screensize);

+        close(fbfd);

+        fclose(fp);

+        return -1;

+    }

+

+    // Read and display image data

+    int y = 0;

+    for (y = infoHeader.biHeight - 1; y >= 0; y--) {

+        if (fread(line, infoHeader.biWidth * bytes_per_pixel + padding, 1, fp) != 1) {

+            printf("Failed to read image data\n");

+            free(line);

+            munmap(fbp, screensize);

+            close(fbfd);

+            fclose(fp);

+            return -1;

+        }

+        int x = 0;

+        for (x = 0; x < infoHeader.biWidth; x++) {

+            unsigned short pixel;

+            int location = x + y * vinfo.xres;

+

+            if (infoHeader.biBitCount == 24) {

+                // 24-bit BMP (BGR format)

+                unsigned char b = line[x * 3];

+                unsigned char g = line[x * 3 + 1];

+                unsigned char r = line[x * 3 + 2];

+                pixel = rgb24_to_rgb565(r, g, b);

+            } else {

+                // 16-bit BMP (already in RGB565 format)

+                pixel = *(unsigned short*)&line[x * 2];

+            }

+

+            // Check if within display bounds

+            if (x < vinfo.xres && y < vinfo.yres) {

+                fb16[location] = pixel;

+            }

+        }

+    }

+

+	// To display

+    write(fbfd, "1", 1);

+    usleep(1000*100);

+

+    // Cleanup resources

+    free(line);

+	fclose(fp);

+    munmap(fbp, screensize);

+    close(fbfd);

+

+    printf("Image display completed\n");

+    return 0;

+}
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/qrencode/fbtest.c b/lynq/MD310EU/ap/app/qrencode/fbtest.c
new file mode 100644
index 0000000..df6b0bd
--- /dev/null
+++ b/lynq/MD310EU/ap/app/qrencode/fbtest.c
@@ -0,0 +1,121 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <fcntl.h>

+#include <unistd.h>

+#include <sys/mman.h>

+#include <sys/ioctl.h>

+#include <linux/fb.h>

+

+// Define colors in RGB565 format

+#define COLOR_WHITE  0xFFFF  // 11111 111111 11111

+#define COLOR_BLACK  0x0000  // 00000 000000 00000

+#define COLOR_RED    0xF800  // 11111 000000 00000

+#define COLOR_GREEN  0x07E0  // 00000 111111 00000

+#define COLOR_BLUE   0x001F  // 00000 000000 11111

+

+#define SWAP_ENDIAN_USHORT(value) ((unsigned short)((((unsigned short)(value) & 0xFF) << 8) | (((unsigned short)(value) & 0xFF00) >> 8)))

+

+// Structure to hold color information

+typedef struct {

+    const char* name;

+    unsigned short value;

+} ColorInfo;

+

+// Array of supported colors

+const ColorInfo COLORS[] = {

+    {"WHITE", COLOR_WHITE},

+    {"BLACK", COLOR_BLACK},

+    {"RED", COLOR_RED},

+    {"GREEN", COLOR_GREEN},

+    {"BLUE", COLOR_BLUE}

+};

+

+const int NUM_COLORS = sizeof(COLORS) / sizeof(COLORS[0]);

+int fbfd = 0;

+

+// Function to fill screen with a color

+void fill_screen(unsigned short* fb, int width, int height, unsigned short color) {

+	//unsigned short color = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);

+    unsigned short swapped = SWAP_ENDIAN_USHORT(color);

+	int i = 0;

+    for (i = 0; i < width * height; i++) {

+        fb[i] = swapped;

+    }

+	

+	write(fbfd, "1", 1);

+	usleep(500000);

+}

+

+// Function to display color by name

+int display_color(const char* color_name, unsigned short* fb, int width, int height) {

+	int i = 0;

+    for (i = 0; i < NUM_COLORS; i++) {

+        if (strcmp(color_name, COLORS[i].name) == 0) {

+            fill_screen(fb, width, height, COLORS[i].value);

+            return 0;

+        }

+    }

+    return -1;

+}

+

+int main(int argc, char *argv[]) {

+    if (argc != 2) {

+        printf("Usage: %s [WHITE|BLACK|RED|GREEN|BLUE|AUTO]\n", argv[0]);

+        return -1;

+    }

+

+    // Open framebuffer device

+    fbfd = open("/dev/fb0", O_RDWR);

+    if (fbfd < 0) {

+        perror("Cannot open framebuffer device");

+        return -1;

+    }

+

+    // Get screen information

+    struct fb_var_screeninfo vinfo;

+    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) < 0) {

+        perror("Cannot get screen info");

+        close(fbfd);

+        return -1;

+    }

+

+    // Check if screen is 16-bit

+    if (vinfo.bits_per_pixel != 16) {

+        printf("Only 16-bit display is supported\n");

+        close(fbfd);

+        return -1;

+    }

+

+    // Map framebuffer

+    long screensize = vinfo.xres * vinfo.yres * 2; // 16 bits = 2 bytes

+    unsigned short *fbp = (unsigned short *)mmap(0, screensize, 

+                                               PROT_READ | PROT_WRITE, 

+                                               MAP_SHARED, fbfd, 0);

+    if (fbp == MAP_FAILED) {

+        perror("Cannot map framebuffer");

+        close(fbfd);

+        return -1;

+    }

+

+    if (strcmp(argv[1], "AUTO") == 0) {

+        // Auto mode: display each color

+		int i = 0;

+		for (i = 0; i < NUM_COLORS; i++) {

+			fill_screen(fbp, vinfo.xres, vinfo.yres, COLORS[i].value);

+		}

+    } else {

+        // Single color mode

+        if (display_color(argv[1], fbp, vinfo.xres, vinfo.yres) < 0) {

+            printf("Invalid color. Supported colors: WHITE, BLACK, RED, GREEN, BLUE, AUTO\n");

+            munmap(fbp, screensize);

+            close(fbfd);

+            return -1;

+        }

+    }

+

+    // Cleanup

+    munmap(fbp, screensize);

+    close(fbfd);

+    return 0;

+}
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/wefota/Makefile b/lynq/MD310EU/ap/app/wefota/Makefile
new file mode 100755
index 0000000..c6f70a4
--- /dev/null
+++ b/lynq/MD310EU/ap/app/wefota/Makefile
@@ -0,0 +1,60 @@
+#*******************************************************************************

+# include ZTE application makefile

+#*******************************************************************************

+include $(zte_app_mak)

+include $(COMMON_MK)

+

+CPU_PUB_ROOT=$(TOPDIR_AP)/../pub

+##############USER COMIZE BEGIN################

+EXEC = wefota

+OBJS = wefota_main.o wefota_device.o wefota_socket.o

+

+

+#*******************************************************************************

+# include path

+#*******************************************************************************

+CFLAGS += -I./

+CFLAGS += -I../include

+CFLAGS += -I../zte_comm/nvserver

+CFLAGS += -I$(LIB_DIR)/libnvram

+CFLAGS += -I$(APP_DIR)/include                                                   

+CFLAGS += -g -Werror=implicit-function-declaration 

+

+CFLAGS += -I$(zte_app_path)/include

+CFLAGS += -I$(zte_lib_path)/libnvram

+CFLAGS += -I$(LINUX_DIR)

+CFLAGS += -I$(CPU_PUB_ROOT)/project/zx297520v3/include/nv

+CFLAGS += -O -Dlinux=1 -DHIGH_SPEED=1

+

+CFLAGS += -I$(zte_lib_path)/libsoftap

+CFLAGS += -I$(zte_lib_path)/libsoft_timer

+

+

+#*******************************************************************************

+# library

+#*******************************************************************************

+LDLIBS += -lnvram -L$(zte_lib_path)/libnvram -lpthread

+ifeq ($(LINUX_TYPE),uClinux)

+LDFLAGS += -Wl,--allow-multiple-definition,-elf2flt=-s131072

+endif

+

+

+LDLIBS  += -lsoftap -L$(zte_lib_path)/libsoftap

+LDLIBS  += -lsoft_timer -L$(zte_lib_path)/libsoft_timer

+

+##############USER COMIZE END##################

+

+all: $(EXEC)

+

+$(EXEC): $(OBJS) 

+	$(CC) $(LDFLAGS) -o $@ $(OBJS)  -Wl,--start-group $(LDLIBS) -Wl,--end-group

+	@cp $@ $@.elf

+

+

+romfs:

+	$(ROMFSINST)  /sbin/$(EXEC)

+

+clean:

+	-rm -f $(EXEC) *.elf *.gdb *.o

+

+

diff --git a/lynq/MD310EU/ap/app/wefota/wefota_device.c b/lynq/MD310EU/ap/app/wefota/wefota_device.c
new file mode 100755
index 0000000..a9657af
--- /dev/null
+++ b/lynq/MD310EU/ap/app/wefota/wefota_device.c
@@ -0,0 +1,263 @@
+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+#include <time.h>

+#include <unistd.h>

+#include <fcntl.h>

+#include "wefota_device.h"

+

+static int g_first_check_tesk = 0;

+

+int get_iccid(char *iccid)

+{

+    if (iccid == NULL) {

+        return -1;

+    }

+    char buf[32] = {0}  ;

+    cfg_get_item("sim_iccid", buf, sizeof(buf));

+    strcpy(iccid, buf);

+    return 0;

+}

+

+int get_imei(char *imei)

+{

+    if (imei == NULL) {

+        return -1;

+    }

+    char buf[32] = {0};

+    cfg_get_item("imei", buf, sizeof(buf));

+    strcpy(imei, buf);

+    return 0;

+}

+

+int get_version(char *version)

+{

+    if (version == NULL) {

+        return -1;

+    }

+    char buf[30] = {0};

+    cfg_get_item("wa_version", buf, sizeof(buf));

+    strcpy(version, buf);

+    return 0;

+}

+

+int is_data_connected(void)

+{

+    char buf[32] = {0};

+    cfg_get_item("ppp_status", buf, sizeof(buf));

+    if (strcmp(buf, "ppp_connected") == 0) {

+        return 1;

+    }

+    return 0;

+}

+

+int get_wefota_server1_cfg(char *ip, int *port)

+{

+    if (ip == NULL || port == NULL) {

+        return -1;

+    }

+    char buf[32] = {0};

+    cfg_get_item("wefota_server1_ip", buf, sizeof(buf));

+    strcpy(ip, buf);

+    cfg_get_item("wefota_server1_port", buf, sizeof(buf));

+    *port = atoi(buf);

+    return 0;

+}

+

+int set_wefota_server2_cfg(const char *ip, int port)

+{

+    if (ip == NULL) {

+        return -1;

+    }

+    cfg_set("wefota_server2_ip", ip);

+    char buf[32] = {0}; 

+    sprintf(buf, "%d", port);

+    cfg_set("wefota_server2_port", buf);

+    return 0;

+}

+

+int set_wefota_current_upgrade_state_cfg(const char *state)

+{

+    cfg_set("wefota_current_upgrade_state", state);

+

+    return 0;

+}

+

+int set_wefota_new_version_state_cfg(const char *state)

+{

+    cfg_set("wefota_new_version_state", state);

+

+    return 0;

+}

+

+int get_last_work_time(int *time, int *interval)

+{

+    if (time == NULL || interval == NULL) {

+        return -1;

+    }

+    char buf[32] = {0};

+    cfg_get_item("wefota_last_work_time", buf, sizeof(buf));

+    *time = atoi(buf);

+    cfg_get_item("wefota_last_work_interval", buf, sizeof(buf));

+    *interval = atoi(buf);

+    return 0;

+}

+

+int set_last_work_time(int time, int interval)

+{

+    char buf[32] = {0};

+    sprintf(buf, "%d", time);

+    cfg_set("wefota_last_work_time", buf);

+    sprintf(buf, "%d", interval);

+    cfg_set("wefota_last_work_interval", buf);

+    return 0;

+}

+

+static int fota_is_file_exist(const char* path)

+{

+	if ( (path == NULL) || (*path == '\0') )

+		return 0;

+	if (access(path, R_OK) != 0)

+		return 0;

+

+	return 1;

+}

+

+static int fota_read_file(const char*path, char*buf, size_t sz)

+{

+	int fd = -1;

+	size_t cnt;

+

+	fd = open(path, O_RDONLY, 0);

+	if(fd < 0)

+	{

+		printf("fota_read_file failed to open %s\n", path);

+		cnt = -1;

+		return cnt;

+	}

+	cnt = read(fd, buf, sz - 1);

+	if(cnt <= 0)

+	{

+		printf("failed to read %s\n", path);

+		close(fd);

+		cnt = -1;

+		return cnt;

+	}

+	buf[cnt] = '\0';

+	if(buf[cnt - 1] == '\n')

+	{

+		cnt--;

+		buf[cnt] = '\0';

+	}

+	close(fd);

+

+	return cnt;

+}

+

+static int fota_read_file_int(const char* path, int *val)

+{

+	char buf[32];

+	char *end;

+	int ret;

+	int tmp;

+

+	ret = fota_read_file(path, buf, sizeof(buf));

+	if(ret < 0)

+		return -1;

+

+	tmp = strtol(buf, &end, 0);

+	if ((end == buf) || ((end < buf + sizeof(buf)) && (*end != '\0')))

+	{

+		return -1;

+	}

+

+	*val = tmp;

+

+	return 0;

+}

+

+static int fota_get_update_status(int *fota_status)

+{

+

+	int status = 0;

+	int ret = 0;

+	if(!fota_is_file_exist(FOTA_UPDATE_STATUS_FILE))

+	{

+		*fota_status = -1;

+		return -1;

+	}

+	ret = fota_read_file_int(FOTA_UPDATE_STATUS_FILE, &status);

+	if(ret < 0) {

+		*fota_status = -1;

+		return -1;

+	}

+	*fota_status = status;

+	return 0;

+}

+

+int start_wefota_install(void)

+{

+	int upgradeStatus = 0;

+	int result = 0;

+	

+	system("fota_upi -u verify");

+	result = fota_get_update_status(&upgradeStatus);

+	if(result < 0)

+	{

+		printf("failed to read the update_status file\n");

+		set_wefota_current_upgrade_state_cfg("upgrade_error");

+		return -1;

+	}

+	else if(upgradeStatus != 0)

+	{

+		set_wefota_current_upgrade_state_cfg("upgrade_file_error");

+		printf("verify failed\n");

+		return -1;

+	}

+	else

+	{

+		set_wefota_current_upgrade_state_cfg("upgrade_success");

+		printf("verify success, start upgrade!\n");

+		system("fota_upi -u recovery");

+	}

+

+    return 0;

+}

+

+int wait_fota_conditions(void)

+{

+    // wait for data connected

+    while (1) {

+        if (is_data_connected()) {

+            break;

+        }

+		set_wefota_new_version_state_cfg("bad_network");

+        sleep(10);

+    }

+

+    // wait for sntp time sync

+    //sleep(10);

+    srand(time(NULL));

+

+    // wait for fota time

+    while (1) {

+		set_wefota_current_upgrade_state_cfg("idle");

+        int last_time = 0;

+        int interval = 0;

+        get_last_work_time(&last_time, &interval);

+        int cur_time = time(NULL);

+        if ((last_time + interval < cur_time) || g_first_check_tesk == 0) {

+            break;

+        }

+        sleep(10);

+    }

+

+    g_first_check_tesk = 1;

+	set_wefota_current_upgrade_state_cfg("checking");

+	set_wefota_new_version_state_cfg("checking");

+    //set last work time

+    int interval = FOTA_INTERVAL_MIN + rand() % FOTA_INTERVAL_RANDOM;

+    set_last_work_time(time(NULL), interval);

+    

+    return 0;

+}

diff --git a/lynq/MD310EU/ap/app/wefota/wefota_device.h b/lynq/MD310EU/ap/app/wefota/wefota_device.h
new file mode 100755
index 0000000..fa67f81
--- /dev/null
+++ b/lynq/MD310EU/ap/app/wefota/wefota_device.h
@@ -0,0 +1,24 @@
+#ifndef _WEFOTA_DEVICE_H_

+#define _WEFOTA_DEVICE_H_

+

+#include "cfg_api.h"

+

+#define FOTA_INTERVAL_MIN (3600 * 24)

+#define FOTA_INTERVAL_RANDOM (3600 * 2)

+#define FOTA_DOWNLOAD_FILEPATH "/cache/zte_fota/delta.package"

+#define FOTA_UPDATE_STATUS_FILE "/cache/zte_fota/update_status"

+

+int get_iccid(char *iccid);

+int get_imei(char *imei);

+int get_version(char *version);

+int is_data_connected(void);

+int get_wefota_server1_cfg(char *ip, int *port);

+int set_wefota_server2_cfg(const char *ip, int port);

+int get_last_work_time(int *time, int *interval);

+int set_last_work_time(int time, int interval);

+int start_wefota_install(void);

+int wait_fota_conditions(void);

+int set_wefota_current_upgrade_state_cfg(const char *state);

+int set_wefota_new_version_state_cfg(const char *state);

+

+#endif
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/wefota/wefota_main.c b/lynq/MD310EU/ap/app/wefota/wefota_main.c
new file mode 100755
index 0000000..aca9839
--- /dev/null
+++ b/lynq/MD310EU/ap/app/wefota/wefota_main.c
@@ -0,0 +1,797 @@
+#include <stdio.h>

+#include <string.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <fcntl.h>

+#include "wefota_main.h"

+#include "wefota_socket.h"

+#include "wefota_device.h"

+

+#define RECV_WHOLE_PACK 1

+

+static FOTA_Status s_status = FOTA_STATUS_IDLE;

+static struct sockaddr_in s_server1_addr = {0};

+static struct sockaddr_in s_server2_addr = {0};

+static unsigned char s_req[WEFOTA_REQ_MAX_LEN] = {0};

+static unsigned char s_resp[WEFOTA_RESP_MAX_LEN] = {0};

+static char s_destVersion[32] = {0};

+static VerID s_verID = {0};

+static DiffPackInfo s_diffpack_info = {0};

+static unsigned int s_costTime = 0;

+static unsigned int s_pack_date_count = 0;

+static DiffPackDataReq s_diffpack_data_req = {0};

+

+const WeFOTA_MSG s_wefota_msg_table[] = {

+    {FOTA_STATUS_IDLE, 0xFF, 0, 0x00, 0}, // no use

+    {FOTA_STATUS_GET_IP_1, 0x10, 0, 0x11, 18},

+    {FOTA_STATUS_CHECK_TASK, 0xBF, 32, 0xC0, 41},

+    {FOTA_STATUS_GET_IP_2, 0x10, 0, 0x11, 18},

+    {FOTA_STATUS_GET_VER_ID, 0x04, 68, 0x05, 12},

+    {FOTA_STATUS_GET_DIFF_PACK_ID, 0x00, 12, 0x02, 35},

+    {FOTA_STATUS_GET_DIFF_PACK_DATA, 0x01, 23, 0x03, WEFOTA_RESP_DIFF_PACK_DATA_MAX_LEN},

+    {FOTA_STATUS_GET_DIFF_PACK_END, 0x30, 19, 0x33, 0},

+    {FOTA_STATUS_INSTALL_DIFF_PACK, 0xFF, 0, 0x00, 0}, // no use

+    {FOTA_STATUS_MAX, 0xFF, 0, 0x00, 0}, // no use

+};

+

+void set_fota_status(FOTA_Status status) {

+    s_status = status;

+}

+

+FOTA_Status get_fota_status(void) {

+    return s_status;

+}

+

+int wefota_header_init(WeFOTAHeader *hdr) {

+    if(NULL == hdr) {

+        return -1;

+    }

+

+    memset(hdr, 0, sizeof(WeFOTAHeader));

+    hdr->magic = WEFOTA_HEADER_MAGIC; // maybe need htonl

+    hdr->protocol = WEFOTA_HEADER_PROTOCOL;

+    get_iccid(hdr->iccid);

+    get_imei(hdr->devid + 16);

+    hdr->tid = WEFOTA_HEADER_TID;

+    

+    hdr->code = s_wefota_msg_table[s_status].req_code;

+    int count = s_wefota_msg_table[s_status].req_count;

+    hdr->count = htons(count);

+

+	printf("header:[imei:%s]\n", hdr->devid + 16);

+    return count;

+}

+

+int is_valid_resp_hdr(const WeFOTAHeader *hdr) {

+    if(NULL == hdr) {

+        return 0;

+    }

+    if(hdr->magic != WEFOTA_HEADER_MAGIC && hdr->magic != htonl(WEFOTA_HEADER_MAGIC)) {

+        return 0;

+    }

+    if(hdr->protocol != WEFOTA_HEADER_PROTOCOL) {

+        return 0;

+    }

+

+    return 1;

+}

+

+int init_wefota_server1_addr(void) {

+    char ip[16] = {0};

+    int port = 0;

+    get_wefota_server1_cfg(ip, &port);

+    return init_server_addr(&s_server1_addr, ip, port);

+}

+

+int init_wefota_server2_addr(const char *ip, int port) {

+    int ret = init_server_addr(&s_server2_addr, ip, port);

+    if(0 == ret) {

+        set_wefota_server2_cfg(ip, port);

+    }

+    return ret;

+}

+

+int recv_with_retry(int sock, struct sockaddr_in* server_addr, 

+                    unsigned char* response, size_t response_size, int max_retries) {

+    if (NULL == response || response_size < WEFOTA_HEADER_SIZE) {

+        return -1;

+    }

+    int retry_count = 0;

+    int recv_date_err = 0;

+	while (retry_count < max_retries) {

+        do {

+            recv_date_err = 0;

+            WeFOTAHeader *hdr = (WeFOTAHeader *)response;

+            int received = receive_message(sock, hdr, response_size, server_addr);

+            printf("received=%d\n", received);

+            if (received < WEFOTA_HEADER_SIZE) {

+                printf("recv header failed\n");

+                break;

+            }

+            if (0 == is_valid_resp_hdr(hdr)) {

+                printf("recv invalid header\n");

+                break;

+            }

+            printf("recv code=%d, count=%d)\n", hdr->code, hdr->count);

+            if (hdr->count + WEFOTA_HEADER_SIZE != received) {

+                printf("recv count error\n");

+                break;

+            }

+

+			if (s_status == FOTA_STATUS_GET_DIFF_PACK_DATA)

+			{

+				if (hdr->code == s_wefota_msg_table[s_status].resp_code && hdr->count == s_pack_date_count)

+				{

+					DiffPackDataResp * data = (DiffPackDataResp *)(s_resp + WEFOTA_HEADER_SIZE);

+					printf("proc_get_diff_pack_data recv [data->offset %u offset:%u][data->length %u length:%u]\n", 

+					       data->offset, s_diffpack_data_req.offset, data->length, s_diffpack_data_req.length);

+					if (data->offset == s_diffpack_data_req.offset || data->length == s_diffpack_data_req.length) {

+						return received;

+					}

+				}

+				printf("proc_get_diff_pack_data recv wrong data\n");

+				recv_date_err = 1;

+				break;

+			}

+			else

+			{

+            	if (hdr->code == s_wefota_msg_table[s_status].resp_code

+                 	&& hdr->count == s_wefota_msg_table[s_status].resp_count) { // code and count right

+                	return received;

+            	} else { // code or count wrong

+                	break;

+            	}

+			}

+        }while(0);

+

+        printf("retry (%d/%d)\n", retry_count + 1, max_retries);

+		if (recv_date_err == 0)

+		{

+        	retry_count++;

+		}

+    }

+    

+    return -1;

+}

+

+#ifdef RECV_WHOLE_PACK

+int send_with_retry(int sock, const unsigned char* msg, size_t len, struct sockaddr_in* server_addr, 

+                    unsigned char* response, size_t response_size, int max_retries) {

+    if (NULL == msg || NULL == response || 0 == len || response_size < WEFOTA_HEADER_SIZE) {

+        return -1;

+    }

+    int retry_count = 0;

+    while (retry_count < max_retries) {

+        do {

+            if (send_message(sock, msg, len, server_addr) < 0) {

+                printf("send message failed\n");

+                break;

+            }

+#if 0

+            WeFOTAHeader *hdr = (WeFOTAHeader *)response;;

+            int received = receive_message(sock, hdr, response_size, server_addr);

+            printf("received=%d\n", received);

+            if (received < WEFOTA_HEADER_SIZE) {

+                printf("recv header failed\n");

+                break;

+            }

+            if (0 == is_valid_resp_hdr(hdr)) {

+                printf("recv invalid header\n");

+                break;

+            }

+            printf("recv code=%d, count=%d)\n", hdr->code, hdr->count);

+            if (hdr->count + WEFOTA_HEADER_SIZE != received) {

+                printf("recv count error\n");

+                break;

+            }

+

+			if (s_status == FOTA_STATUS_GET_DIFF_PACK_DATA)

+			{

+				if (hdr->code == s_wefota_msg_table[s_status].resp_code && hdr->count == s_pack_date_count)

+				{

+					return received;

+				}

+				else

+				{

+					return -1;

+				}

+			}

+			else

+			{

+            	if (hdr->code == s_wefota_msg_table[s_status].resp_code

+                 	&& hdr->count == s_wefota_msg_table[s_status].resp_count) { // code and count right

+                	return received;

+            	} else { // code or count wrong

+                	return -1;

+            	}

+			}

+#endif

+			int received = recv_with_retry(sock, server_addr, response, response_size, max_retries);

+			if (received > 0)

+			{

+				return received;

+			}

+        }while(0);

+

+        printf("retry (%d/%d)\n", retry_count + 1, max_retries);

+        retry_count++;

+        sleep(WEFOTA_TIMEOUT_SEC);

+    }

+    

+    return -1;

+}

+#else

+int send_with_retry(int sock, const unsigned char* msg, size_t len, struct sockaddr_in* server_addr, 

+                    unsigned char* response, size_t response_size, int max_retries) {

+    if (NULL == msg || NULL == response || 0 == len || response_size < WEFOTA_HEADER_SIZE) {

+        return -1;

+    }

+    int retry_count = 0;

+    while (retry_count < max_retries) {

+        do {

+            if (send_message(sock, msg, len, server_addr) < 0) {

+                printf("send message failed\n");

+                break;

+            }

+

+            WeFOTAHeader *hdr = (WeFOTAHeader *)response;;

+            int received = receive_message(sock, hdr, WEFOTA_HEADER_SIZE, server_addr);

+            printf("received=%d\n", received);

+            if (received != WEFOTA_HEADER_SIZE) {

+                printf("recv header failed\n");

+                break;

+            }

+            if (0 == is_valid_resp_hdr(hdr)) {

+                printf("recv invalid header\n");

+                break;

+            }

+            printf("recv code=%d, count=%d)\n", hdr->code, hdr->count);

+            if (hdr->count + WEFOTA_HEADER_SIZE > response_size) {

+                printf("recv count > response_size\n");

+                break;

+            }

+

+            if (hdr->code == s_wefota_msg_table[s_status].resp_code

+                 && hdr->count == s_wefota_msg_table[s_status].resp_count) { // code and count right

+                if (hdr->count == 0) {

+                    return 0;

+                } else {

+                    received = receive_message(sock, response + WEFOTA_HEADER_SIZE, hdr->count, server_addr);

+                    printf("recv data len=%d\n", received);

+                    return received;

+                }

+            } else { // code or count wrong

+                if (hdr->count == 0) {

+                    return -1;

+                } else {

+                    received = receive_message(sock, response + WEFOTA_HEADER_SIZE, hdr->count, server_addr);

+                    printf("recv data len=%d, drop\n", received);

+                    return -1;

+                }

+            }

+        }while(0);

+

+        printf("retry (%d/%d)\n", retry_count + 1, max_retries);

+        retry_count++;

+        sleep(WEFOTA_TIMEOUT_SEC);

+    }

+    

+    return -1;

+}

+#endif

+

+int proc_get_ip(int sock) {

+    int ret = -1;

+    WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;

+    int count = wefota_header_init(hdr);

+    printf("proc_get_ip send code=%d, count=%d)\n", hdr->code, count);

+

+    if (0 > send_with_retry(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server1_addr, s_resp, sizeof(s_resp), WEFOTA_MAX_RETRIES)) {

+        printf("comm fail\n");

+        return ret;

+    }

+

+    ServerAddr * data = (ServerAddr *)(s_resp + WEFOTA_HEADER_SIZE);

+    ret = init_wefota_server2_addr(data->ip, (int)data->port);

+    return ret;

+}

+

+int proc_get_ip_1(int sock) {

+    set_fota_status(FOTA_STATUS_GET_IP_1);

+    return proc_get_ip(sock);

+}

+

+int proc_check_task(int sock) {

+    set_fota_status(FOTA_STATUS_CHECK_TASK);

+

+    int ret = -1;

+    WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;

+	printf("proc_check_task header\n");

+    int count = wefota_header_init(hdr);

+    printf("proc_check_task send code=%d, count=%d)\n", hdr->code, count);

+

+    char originVersion [32] = {0};

+    get_version(originVersion);

+    memcpy(s_req + WEFOTA_HEADER_SIZE, originVersion, sizeof(originVersion));

+	printf("proc_check_task originVersion:[%s]\n", originVersion);

+

+    if (0 > send_with_retry(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr, s_resp, sizeof(s_resp), WEFOTA_MAX_RETRIES)) {

+        printf("comm fail\n");

+		set_wefota_current_upgrade_state_cfg("check_task_fail");

+		set_wefota_new_version_state_cfg("check_task_fail");

+        return ret;

+    }

+

+    FotaTask * data = (FotaTask *)(s_resp + WEFOTA_HEADER_SIZE);

+	printf("proc_check_task recv:[flag:%d][interval:%u][delay:%u][destVersion:%s]\n", data->flag, data->interval, data->delay, data->destVersion);

+    if (data->flag == 1) {

+        strncpy(s_destVersion, data->destVersion, sizeof(s_destVersion));

+        printf("exist fota task\n");

+		set_wefota_current_upgrade_state_cfg("has_new_version");

+		set_wefota_new_version_state_cfg("has_new_version");

+        return 0;

+    } else {

+		set_wefota_current_upgrade_state_cfg("no_new_version");

+		set_wefota_new_version_state_cfg("no_new_version");

+        printf("no fota task\n");

+        return ret;

+    }

+}

+

+int proc_get_ip_2(int sock) {

+    set_fota_status(FOTA_STATUS_GET_IP_2);

+    return proc_get_ip(sock);

+}

+

+int proc_get_ver_id(int sock) {

+    set_fota_status(FOTA_STATUS_GET_VER_ID);

+

+    char product_id[32] = {0};

+    int ret = -1;

+    WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;

+    int count = wefota_header_init(hdr);

+    printf("proc_get_ver_id send code=%d, count=%d)\n", hdr->code, count);

+

+    Version version = {0};

+    get_version(version.orig_version);

+    strncpy(version.dest_version, s_destVersion, sizeof(version.dest_version));

+    cfg_get_item("wefota_product_id", product_id, sizeof(product_id));

+	strcpy(version.product, product_id);

+    memcpy(s_req + WEFOTA_HEADER_SIZE, &version, sizeof(version));

+

+    if (0 > send_with_retry(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr, s_resp, sizeof(s_resp), WEFOTA_MAX_RETRIES)) {

+        printf("comm fail\n");

+        return ret;

+    }

+

+    VerID * data = (VerID *)(s_resp + WEFOTA_HEADER_SIZE);

+    s_verID = *data;

+    return 0;

+}

+

+int proc_get_diff_pack_id(int sock) {

+    set_fota_status(FOTA_STATUS_GET_DIFF_PACK_ID);

+

+    int ret = -1;

+    WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;

+    int count = wefota_header_init(hdr);

+    printf("proc_get_diff_pack_id send code=%d, count=%d)\n", hdr->code, count);

+

+    memcpy(s_req + WEFOTA_HEADER_SIZE, &s_verID, sizeof(s_verID));

+

+    if (0 > send_with_retry(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr, s_resp, sizeof(s_resp), WEFOTA_MAX_RETRIES)) {

+        printf("comm fail\n");

+        return ret;

+    }

+

+    DiffPackInfo * data = (DiffPackInfo *)(s_resp + WEFOTA_HEADER_SIZE);

+    s_diffpack_info = *data;

+	printf("proc_get_diff_pack_id [diffPackID:%s][MD5:%s][size:%u]\n", s_diffpack_info.diffPackID, s_diffpack_info.MD5, s_diffpack_info.size);

+    if (s_diffpack_info.size == 0) {

+        printf("diff pack size==0\n");

+        return ret;

+    }

+    return 0;

+}

+

+#if 0

+int proc_get_diff_pack_data(int sock) {

+    set_fota_status(FOTA_STATUS_GET_DIFF_PACK_DATA);

+

+    unsigned int startTime = time(NULL);

+    int ret = -1;

+	int recv_packet_retry = 0;

+    WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;

+    int count = wefota_header_init(hdr);

+    printf("proc_get_diff_pack_data send code=%d, count=%d)\n", hdr->code, count);

+	system("rm -rf /cache/zte_fota");

+	system("mkdir /cache/zte_fota");

+    FILE *fp = fopen(FOTA_DOWNLOAD_FILEPATH, "wb");

+    if (NULL == fp) {

+        printf("open file failed\n");

+        return ret;

+    }

+

+    unsigned int size = s_diffpack_info.size;

+    while (size > 0) {

+        unsigned int len = size > WEFOTA_DIFF_PACK_DATA_MAX_LEN ? WEFOTA_DIFF_PACK_DATA_MAX_LEN : size;

+		s_pack_date_count = len + 39;

+        unsigned int offset = s_diffpack_info.size - size;

+        DiffPackDataReq req = {0};

+        memcpy(req.diffPackID, s_diffpack_info.diffPackID, sizeof(req.diffPackID));

+		req.length = len;

+        req.offset = offset;

+		printf("proc_get_diff_pack_data request [offset %d][req.diffPackID %s][len %d][s_pack_date_count:%d][offset %d]\n",

+				offset, req.diffPackID, len, s_pack_date_count, offset);

+        memcpy(s_req + WEFOTA_HEADER_SIZE, &req, sizeof(req));

+		s_diffpack_data_req = req;

+        if (0 > send_with_retry(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr, s_resp, sizeof(s_resp), WEFOTA_MAX_RETRIES)) {

+            printf("comm fail\n");

+            fclose(fp);

+            return ret;

+        }

+

+        DiffPackDataResp * data = (DiffPackDataResp *)(s_resp + WEFOTA_HEADER_SIZE);

+		printf("proc_get_diff_pack_data recv [data->offset %d offset:%d][data->length %d en:%d]\n", data->offset, offset, data->length, len);

+        if (data->offset != offset || data->length != len) {

+            printf("offset or len error\n");

+			if (recv_packet_retry < 3)

+			{

+				printf("offset error, retry\n");

+				recv_packet_retry++;

+				continue;

+			}

+            fclose(fp);

+            return ret;

+        }

+        fwrite(data->data, 1, len, fp);

+        size -= len;

+		recv_packet_retry = 0;

+    }

+

+    fclose(fp);

+    s_costTime = time(NULL) - startTime;

+    return 0;

+}

+#endif

+

+static void send_request(int sockfd, struct sockaddr_in *server_addr, int offset)

+{

+    char request[16];

+    snprintf(request, sizeof(request), "%d", offset);

+    sendto(sockfd, request, strlen(request), 0, (struct sockaddr *)server_addr, sizeof(*server_addr));

+}

+

+static int receive_data(int sockfd, int filefd, struct sockaddr_in *server_addr, socklen_t addr_len, int *received)

+{

+    ssize_t bytes_received;

+    struct sockaddr_in from_addr;

+    socklen_t from_len = sizeof(from_addr);

+

+    bytes_received = recvfrom(sockfd, s_resp, WEFOTA_RESP_MAX_LEN, 0, (struct sockaddr *)&from_addr, &from_len);

+    if (bytes_received < 0)

+	{

+		printf("receive_data received < 0\n");

+        perror("recvfrom failed");

+        return -1;

+    }

+

+    DiffPackDataResp * data = (DiffPackDataResp *)(s_resp + WEFOTA_HEADER_SIZE);

+    int offset = data->offset / 1024;

+

+	printf("receive_data received offset:%u\n", data->offset);

+

+    if (received[offset])

+	{

+        return 0;

+    }

+

+	usleep(10000);

+    if (lseek(filefd, offset * 1024, SEEK_SET) < 0)

+	{

+		printf("receive_data lseek error\n");

+        perror("lseek failed");

+        return -1;

+    }

+    if (write(filefd, data->data, bytes_received - WEFOTA_HEADER_SIZE - 39) < 0)

+	{

+		printf("receive_data write error\n");

+        perror("write failed");

+        return -1;

+    }

+

+    received[offset] = 1;

+    printf("write packet %d,%u\n", offset, data->offset);

+

+    return 0;

+}

+

+int proc_get_diff_pack_data(int sock)

+{

+    set_fota_status(FOTA_STATUS_GET_DIFF_PACK_DATA);

+

+    unsigned int startTime = time(NULL);

+    int ret = -1;

+	int i = 0;

+	int recv_packet_retry = 0;

+    WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;

+    int count = wefota_header_init(hdr);

+    printf("proc_get_diff_pack_data send code=%d, count=%d)\n", hdr->code, count);

+	system("rm -rf /cache/zte_fota");

+	system("mkdir /cache/zte_fota");

+

+    int filefd = open(FOTA_DOWNLOAD_FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, 0644);

+    if (filefd < 0)

+	{

+		printf("proc_get_diff_pack_data open failed\n");

+        perror("file open failed");

+        return ret;

+    }

+

+    unsigned int size = s_diffpack_info.size;

+	int total_packets = size / 1024;

+	if (size % 1024 != 0)

+	{

+		total_packets += 1;

+	}

+	int received[total_packets];

+	fd_set read_fds;

+	int max_fd;

+	struct timeval timeout;

+	int select_result = 0;

+	int max_retry_count = 0;

+

+	memset(received, 0, sizeof(received));

+    while (size > 0)

+	{

+        unsigned int len = size > WEFOTA_DIFF_PACK_DATA_MAX_LEN ? WEFOTA_DIFF_PACK_DATA_MAX_LEN : size;

+		s_pack_date_count = len + 39;

+        unsigned int offset = s_diffpack_info.size - size;

+        DiffPackDataReq req = {0};

+        memcpy(req.diffPackID, s_diffpack_info.diffPackID, sizeof(req.diffPackID));

+		req.length = len;

+        req.offset = offset;

+		printf("proc_get_diff_pack_data send request [offset %u][req.diffPackID %s][len %u][s_pack_date_count:%u][offset %u]\n",

+				offset, req.diffPackID, len, s_pack_date_count, offset);

+        memcpy(s_req + WEFOTA_HEADER_SIZE, &req, sizeof(req));

+		s_diffpack_data_req = req;

+		send_message(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr);

+        size -= len;

+    }

+

+	while (1)

+	{

+        FD_ZERO(&read_fds);

+        FD_SET(sock, &read_fds);

+        max_fd = sock;

+		while (1)

+		{

+			timeout.tv_sec = 3;

+			timeout.tv_usec = 0;

+	        select_result = select(max_fd + 1, &read_fds, NULL, NULL, &timeout);

+	        if (select_result < 0)

+			{

+				printf("proc_get_diff_pack_data select failed\n");

+	            perror("select failed");

+	            break;

+	        }

+			else if (select_result == 0)

+			{

+				printf("proc_get_diff_pack_data No data to read, or timeout\n");

+				break;

+			}

+	        if (FD_ISSET(sock, &read_fds))

+			{

+	            if (receive_data(sock, filefd, &s_server2_addr, sizeof(s_server2_addr), received) < 0)

+				{

+	                break;

+	            }

+	        }

+		}

+

+		if (max_retry_count++ > WEFOTA_MAX_RETRY_COUNT)

+		{

+			printf("proc_get_diff_pack_data reach the maximum retry count, break!!!\n");

+			break;

+		}

+

+        int all_received = 1;

+        for (i = 0; i < total_packets; i++)

+		{

+            if (!received[i])

+			{

+				all_received = 0;

+		        unsigned int len = s_diffpack_info.size - i * 1024 > WEFOTA_DIFF_PACK_DATA_MAX_LEN ? WEFOTA_DIFF_PACK_DATA_MAX_LEN : s_diffpack_info.size - i * 1024;

+				s_pack_date_count = len + 39;

+		        unsigned int offset = i * 1024;

+		        DiffPackDataReq req = {0};

+		        memcpy(req.diffPackID, s_diffpack_info.diffPackID, sizeof(req.diffPackID));

+				req.length = len;

+		        req.offset = offset;

+				printf("Re request, send request [offset %u]\n", offset);

+		        memcpy(s_req + WEFOTA_HEADER_SIZE, &req, sizeof(req));

+				s_diffpack_data_req = req;

+				send_message(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr);

+            }

+        }

+

+        if (all_received)

+		{

+            printf("All packets received successfully.\n");

+            break;

+        }

+    }

+

+    close(filefd);

+    s_costTime = time(NULL) - startTime;

+    return 0;

+}

+

+

+int proc_get_diff_pack_end(int sock) {

+    set_fota_status(FOTA_STATUS_GET_DIFF_PACK_END);

+

+    int ret = -1;

+    WeFOTAHeader * hdr = (WeFOTAHeader *)s_req;

+    int count = wefota_header_init(hdr);

+    printf("proc_get_diff_pack_end send code=%d, count=%d)\n", hdr->code, count);

+

+    DiffPackEnd end = {0};

+    memcpy(end.diffPackID, s_diffpack_info.diffPackID, sizeof(end.diffPackID));

+    end.costTime = s_costTime;

+    memcpy(s_req + WEFOTA_HEADER_SIZE, &end, sizeof(end));

+

+    if (0 > send_with_retry(sock, hdr, WEFOTA_HEADER_SIZE + count, &s_server2_addr, s_resp, sizeof(s_resp), WEFOTA_MAX_RETRIES)) {

+        printf("comm fail\n");

+        return ret;

+    }

+    return 0;

+}

+

+static int verify_md5(const unsigned char *expected_md5, const char *file_path)

+{

+    char command[256];

+	char expected_md5_str[33];

+	char md5sum_output[33];

+	int i = 0;

+

+    snprintf(command, sizeof(command), "md5sum \"%s\"", file_path);

+    FILE *pipe = popen(command, "r");

+    if (!pipe)

+	{

+		printf("verify_md5 pipe error\n");

+        return -1;

+    }

+

+    if (fgets(md5sum_output, sizeof(md5sum_output), pipe) == NULL)

+	{

+		printf("verify_md5 fgets error\n");

+        pclose(pipe);

+        return -1;

+    }

+

+    pclose(pipe);

+

+    for (i = 0; i < 16; ++i)

+	{

+        sprintf(expected_md5_str + i * 2, "%02x", expected_md5[i]);

+    }

+

+    if (strncmp(expected_md5_str, md5sum_output, 32) == 0)

+	{

+		printf("md5 check OK\n");

+        return 1;

+    }

+	else

+	{

+		printf("md5 check error\n");

+        return 0;

+    }

+}

+

+int proc_install_diff_pack(void)

+{

+	const char *file_path = "/cache/zte_fota/delta.package";

+	int result = 0;

+

+	printf("**********proc_install_diff_pack begin \n");

+    set_fota_status(FOTA_STATUS_INSTALL_DIFF_PACK);

+

+	result = verify_md5(s_diffpack_info.MD5, file_path);

+	if (result == 1)

+	{

+		return start_wefota_install();

+	}

+	else

+	{

+		set_wefota_current_upgrade_state_cfg("upgrade_file_md5_error");

+		return -1;

+	}

+	

+}

+

+int wefota_proc(void) {

+	printf("**********wefota_proc\n");

+    int ret = -1;

+    int sock = -1;

+    do {

+        sock = create_udp_socket();

+        if (sock < 0) {

+			set_wefota_new_version_state_cfg("create_socket_fail");

+			set_wefota_current_upgrade_state_cfg("create_socket_fail");

+			printf("**********create_udp_socket socket < 0 \n");

+            break;

+        }

+        

+        ret = init_wefota_server1_addr();

+        if (ret < 0) {

+			set_wefota_new_version_state_cfg("init_server_fail");

+			set_wefota_current_upgrade_state_cfg("init_server_fail");

+			printf("**********init_wefota_server1_addr error \n");

+            break;

+        }

+

+        ret = proc_get_ip_1(sock);

+        if (ret < 0) {

+			set_wefota_new_version_state_cfg("get_server_ip_fail");

+			set_wefota_current_upgrade_state_cfg("get_server_ip_fail");

+			printf("**********proc_get_ip_1 error \n");

+            break;

+        }

+

+        ret = proc_check_task(sock);

+        if (ret < 0) {

+			printf("**********proc_check_task error \n");

+            break;

+        }

+

+        ret = proc_get_ip_2(sock);

+        if (ret < 0) {

+			set_wefota_current_upgrade_state_cfg("get_ip_2_fail");

+			printf("**********proc_get_ip_2 error \n");

+            break;

+        }

+

+        ret = proc_get_ver_id(sock);

+        if (ret < 0) {

+			set_wefota_current_upgrade_state_cfg("get_ver_id_fail");

+			printf("**********proc_get_ver_id error \n");

+            break;

+        }

+

+        ret = proc_get_diff_pack_id(sock);

+        if (ret < 0) {

+			set_wefota_current_upgrade_state_cfg("get_diff_pack_id_fail");

+			printf("**********proc_get_diff_pack_id error \n");

+            break;

+        }

+

+        ret = proc_get_diff_pack_data(sock);

+        if (ret < 0) {

+			set_wefota_current_upgrade_state_cfg("download_fail");

+			printf("**********proc_get_diff_pack_data error \n");

+            break;

+        }

+

+        ret = proc_get_diff_pack_end(sock);

+

+        close_udp_socket(sock);

+        sock = -1;

+

+        ret = proc_install_diff_pack();

+    }while(0);

+    

+    if (sock >= 0) {

+        close_udp_socket(sock);

+    }

+    return ret;

+}

+

+int main(void) {

+	printf("**********main\n");

+    while (1) {

+        wait_fota_conditions();

+        wefota_proc();

+    }

+    return 0;

+}

diff --git a/lynq/MD310EU/ap/app/wefota/wefota_main.h b/lynq/MD310EU/ap/app/wefota/wefota_main.h
new file mode 100755
index 0000000..8b06861
--- /dev/null
+++ b/lynq/MD310EU/ap/app/wefota/wefota_main.h
@@ -0,0 +1,110 @@
+#ifndef _WEFOTA_MAIN_H_

+#define _WEFOTA_MAIN_H_

+

+#define WEFOTA_HEADER_MAGIC 0x41544F46

+#define WEFOTA_HEADER_PROTOCOL 0x80

+#define WEFOTA_HEADER_TID 0x0A

+

+#define WEFOTA_HEADER_SIZE 107

+#define WEFOTA_REQ_MAX_LEN (WEFOTA_HEADER_SIZE + 68)

+

+#define WEFOTA_DIFF_PACK_DATA_MAX_LEN 1024

+#define WEFOTA_RESP_DIFF_PACK_DATA_MAX_LEN (WEFOTA_DIFF_PACK_DATA_MAX_LEN + 39)

+#define WEFOTA_RESP_MAX_LEN (WEFOTA_HEADER_SIZE + WEFOTA_RESP_DIFF_PACK_DATA_MAX_LEN)

+

+#define WEFOTA_MAX_RETRIES 3

+#define WEFOTA_TIMEOUT_SEC 1

+#define WEFOTA_MAX_RETRY_COUNT 60

+

+typedef enum _FOTA_Status{

+    FOTA_STATUS_IDLE = 0,

+    FOTA_STATUS_GET_IP_1,

+    FOTA_STATUS_CHECK_TASK,

+    FOTA_STATUS_GET_IP_2,

+    FOTA_STATUS_GET_VER_ID,

+    FOTA_STATUS_GET_DIFF_PACK_ID,

+    FOTA_STATUS_GET_DIFF_PACK_DATA,

+    FOTA_STATUS_GET_DIFF_PACK_END,

+    FOTA_STATUS_INSTALL_DIFF_PACK,

+    FOTA_STATUS_MAX

+} FOTA_Status;

+

+typedef struct _WeFOTA_MSG{

+    FOTA_Status status;

+    unsigned char req_code;

+    unsigned short req_count;

+    unsigned char resp_code;

+    unsigned short resp_count;

+} WeFOTA_MSG;

+

+#pragma pack(1)

+typedef struct _WeFOTAHeader{

+    unsigned int magic;        // 4 bytes

+    unsigned char protocol;      // 1 byte

+    unsigned char code;          // 1 byte

+    unsigned char cgi[9];        // 9 bytes

+    unsigned char imsi[15];      // 15 bytes

+    unsigned char iccid[20];     // 20 bytes

+    unsigned char devid[32];     // 32 bytes,16 meid and 16 imei

+    unsigned char gps[20];       // 20 bytes

+    unsigned char sig;           // 1 byte

+    unsigned short tid;          // 2 bytes

+    unsigned short count;        // 2 bytes

+} WeFOTAHeader;

+

+typedef struct _ServerAddr{

+    char ip[16];

+    unsigned short port;

+} ServerAddr;

+

+typedef struct _FotaTask{

+    unsigned char flag; 

+    unsigned int interval;

+    unsigned int delay;

+    char destVersion[32];

+} FotaTask;

+

+typedef struct _Version{

+    char product[8];

+    char orig_version[30];

+    char dest_version[30];

+} Version;

+

+typedef struct _VerID{

+    char product[8];

+    unsigned short orig_verid;

+    unsigned short dest_verid;

+} VerID;

+

+typedef struct _DiffPackInfo{

+    unsigned char diffPackID[15];

+    unsigned char MD5[16];

+    unsigned int size;

+} DiffPackInfo;

+

+typedef struct _DiffPackDataReq{

+    unsigned char diffPackID[15];

+    unsigned int offset;

+    unsigned int length;

+} DiffPackDataReq;

+

+typedef struct _DiffPackDataResp{

+    unsigned char diffPackID[15];

+    unsigned char MD5[16];

+    unsigned int offset;

+    unsigned int length;

+    unsigned char data[1024];

+} DiffPackDataResp;

+

+typedef struct _DiffPackEnd{

+    unsigned char diffPackID[15];

+    unsigned int costTime;

+} DiffPackEnd;

+

+#pragma pack()

+

+int wefaota_header_init(WeFOTAHeader *hdr);

+void set_fota_status(FOTA_Status status);

+FOTA_Status get_fota_status(void);

+

+#endif
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/wefota/wefota_socket.c b/lynq/MD310EU/ap/app/wefota/wefota_socket.c
new file mode 100755
index 0000000..35c4ee1
--- /dev/null
+++ b/lynq/MD310EU/ap/app/wefota/wefota_socket.c
@@ -0,0 +1,77 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <unistd.h>

+#include <sys/socket.h>

+#include "wefota_socket.h"

+#include "wefota_main.h"

+#include <errno.h>

+

+#define WEFOTA_RECV_TIMEOUT_SEC 3

+

+int create_udp_socket(void) {

+    int sock = socket(AF_INET, SOCK_DGRAM, 0);

+    if (sock < 0) {

+        perror("socket create failed");

+        return -1;

+    }

+    return sock;

+}

+

+void close_udp_socket(int sock) {

+    if (sock >= 0) {

+        close(sock);

+    }

+}

+

+int init_server_addr(struct sockaddr_in* addr, const char* ip, int port) {

+    if (addr == NULL || ip == NULL || port <= 0) {

+        return -1;

+    }

+

+    memset(addr, 0, sizeof(*addr));

+    addr->sin_family = AF_INET;

+    if (inet_pton(AF_INET, ip, &(addr->sin_addr)) <= 0) {

+        perror("wrong ip address");

+        return -1;

+    }

+    addr->sin_port = htons(port);

+    return 0;

+}

+

+int send_message(int sock, const void* msg, size_t len, struct sockaddr_in* server_addr) {

+    int sent = sendto(sock, msg, len, 0, 

+                         (struct sockaddr*)server_addr, sizeof(*server_addr));

+    if (sent < 0) {

+        perror("send message failed");

+        return -1;

+    }

+    printf("send message end, sent=%d\n", sent);

+    return 0;

+}

+

+int receive_message(int sock, void* response, size_t response_size, struct sockaddr_in* server_addr) {

+    set_recv_timeout(sock, WEFOTA_RECV_TIMEOUT_SEC);

+    socklen_t addr_len = sizeof(*server_addr);

+    int received = recvfrom(sock, response, response_size, 0,

+                               (struct sockaddr*)server_addr, &addr_len);

+	if (received < 0)

+	{

+		printf("error num:%d\n", errno);

+		perror("recvfrom");

+	}

+    printf("recv message end, received=%d\n", received);

+    return received;

+}

+

+int set_recv_timeout(int sock, int timeout_sec) {

+    struct timeval tv;

+    tv.tv_sec = timeout_sec;

+    tv.tv_usec = 0;

+    

+    if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {

+        perror("set socket timeout failed");

+        return -1;

+    }

+    return 0;

+}

diff --git a/lynq/MD310EU/ap/app/wefota/wefota_socket.h b/lynq/MD310EU/ap/app/wefota/wefota_socket.h
new file mode 100755
index 0000000..4c45117
--- /dev/null
+++ b/lynq/MD310EU/ap/app/wefota/wefota_socket.h
@@ -0,0 +1,14 @@
+#ifndef _WEFOTA_SOCKET_H_

+#define _WEFOTA_SOCKET_H_

+

+#include <arpa/inet.h>

+

+

+int create_udp_socket(void);

+void close_udp_socket(int sock);

+int init_server_addr(struct sockaddr_in* addr, const char* ip, int port);

+int send_message(int sock, const void* msg, size_t len, struct sockaddr_in* server_addr);

+int receive_message(int sock, void* response, size_t response_size, struct sockaddr_in* server_addr);

+int set_recv_timeout(int sock, int timeout_sec);

+

+#endif
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/zte_comm/at_ctl/inc/ps_normal.h b/lynq/MD310EU/ap/app/zte_comm/at_ctl/inc/ps_normal.h
new file mode 100755
index 0000000..da5b706
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/at_ctl/inc/ps_normal.h
@@ -0,0 +1,895 @@
+/************************************************************************

+*¹¦ÄܽéÉÜ£º»ù±¾at×¢²á

+*¸ºÔðÈË£ºÎÂÇÙ

+*±¸·ÝÈË£º

+*ÐÞ¸ÄÈÕ£º

+*ÐÞ¸ÄÄÚÈÝ£º

+*°æ±¾ºÅ£º

+************************************************************************/

+#ifndef __PS_NORMAL_H__

+#define __PS_NORMAL_H__

+/*****************************ÒýÓÃÍ·Îļþ****************************/

+#include "sqlite3.h"

+#include "at_msg.h"

+#include "at_com.h"

+#include "at_context.h"

+#include "syncnv.h"

+#include "ppp_dial.h"

+/****************************ºê¶¨Òå****************************/

+/*Êý¾Ý¿â·¾¶*/

+#define ZAPN_DB_PATH                        "/etc_ro/config/auto_apn/auto_apn.db"

+#define ZLOCKNET_DB_PATH                    "/etc_ro/config/db/locknet.db"

+#define ZNETPROVIDER_DB_PATH                "/etc_ro/config/db/netprovider.db"

+#define ZROAM_DB_PATH                       "/etc_ro/config/db/roam.db"

+

+/*<cm_mode>: ÍøÂçģʽ*/

+#define ZAT_SYSCONFIG_MODE_AUTO             2

+#define ZAT_SYSCONFIG_MODE_GSM_ONLY         13

+#define ZAT_SYSCONFIG_MODE_WCDMA_ONLY       14

+#define ZAT_SYSCONFIG_MODE_TD_SCDMA_ONLY    15

+#define ZAT_SYSCONFIG_MODE_LTE              17

+#define	ZAT_SYSCONFIG_MODE_GSM_TD           18

+#define	ZAT_SYSCONFIG_MODE_GSM_LTE          19

+#define	ZAT_SYSCONFIG_MODE_TD_LTE           20

+#define	ZAT_SYSCONFIG_MODE_TD_W             22

+#define	ZAT_SYSCONFIG_MODE_WCDMA_LTE        23

+#define	ZAT_SYSCONFIG_MODE_GSM_TD_LTE       24

+#define	ZAT_SYSCONFIG_MODE_TD_W_LTE         25

+#define	ZAT_SYSCONFIG_MODE_TD_W_GSM         26

+#define	ZAT_SYSCONFIG_MODE_W_GSM_LTE        27

+

+/*<pref_acq>: ÓÅѡģʽ*/

+#define ZAT_SYSCONFIG_PREF_ACQ_AUTO         0

+#define ZAT_SYSCONFIG_PREF_ACQ_GSM_WCDMA    1

+#define ZAT_SYSCONFIG_PREF_ACQ_WCDMA_GSM    2  

+#define ZAT_SYSCONFIG_PREF_ACQ_GSM_LTE      4

+#define ZAT_SYSCONFIG_PREF_ACQ_TDPRE        5

+#define ZAT_SYSCONFIG_PREF_ACQ_LTEPRE       6

+#define ZAT_SYSCONFIG_PREF_ACQ_LTE_GSM      7

+#define ZAT_SYSCONFIG_PREF_ACQ_LTE_W_GSM      12

+

+#define PDP_AUTH_TYPE_NONE                  "none"

+#define PDP_AUTH_TYPE_PAP                  "pap"

+#define PDP_AUTH_TYPE_CHAP                  "chap"

+#define PDP_AUTH_TYPE_PAP_CHAP                  "pap+chap"

+

+#define ZAT_AIRMODE                         "AirMode"

+#define ZAT_POWERON                         "PowerOn"

+#define ZAT_POWEROFF                        "PowerOff"

+

+/*SysinfoÉϱ¨µÄsysmodeÖµ*/

+#define ZAT_SYSINFORES_SYSMODE_CDMA1X       2

+#define ZAT_SYSINFORES_SYSMODE_GSM          3

+#define ZAT_SYSINFORES_SYSMODE_EVDO         4

+#define ZAT_SYSINFORES_SYSMODE_WCDMA        5

+#define ZAT_SYSINFORES_SYSMODE_GPS          6

+#define ZAT_SYSINFORES_SYSMODE_GSM_WCDMA    7

+#define ZAT_SYSINFORES_SYSMODE_EVDO_CDMA1X  8

+#define ZAT_SYSINFORES_SYSMODE_TD_SCDMA     15

+#define ZAT_SYSINFORES_SYSMODE_FDD_LTE      16

+#define ZAT_SYSINFORES_SYSMODE_TDD_LTE      17

+

+#define PDP_AUTH_USER_PWD_LENGTH                65

+

+#define ZAT_PROFILE_MEMBER_LEN 32

+#define LOCK_NET_PLMN_LEN      32

+

+#define ZAT_RES_OPERATOR_MAX_NUM            16         /* AT ÏìÓ¦ÖÐÖ§³ÖµÄ×î´óÔËÓªÉÌÁбí¸öÊý */

+

+/* ϵͳ֧³ÖµÄATÏûÏ¢Ïà¹Ø¶¨Òå */

+#define ZAT_RES_PARAM_MAX_LEN                128//512 cops²»¿ÉÄÜÕâô³¤       /* ATÏìÓ¦²ÎÊýÐÐ×î´ó³¤¶È */

+#define ZAT_RES_PARAM_MAX_NUM                16         /* ATÏìÓ¦²ÎÊý×î´óÐÐÊý */

+

+#define NETWORK_TYPE_INIT                   "Searching"

+

+#define TIMER_FLAG_RESTART 1 /*´Ë¶¨Ê±Æ÷³ÖÐøÓÐЧ*/

+

+#define SIGNALBAR_NUM_MAX      12

+

+//memory modify ZAT_MCC_MAXLEN

+/*Qualcomm listÖж¨ÒåµÄºê*/

+#define ZAT_MCC_MAXLEN                         4

+#define ZAT_NETWORK_PROVIDER_MAXLEN            16

+#define ZAT_NETWORK_PROVIDER_NAME_MAXLEN       64

+#define ZAT_APN_MAXLEN                         32 //»¹ÓиöAPN_MAX_LEN

+#define ZAT_RESERVE_MAXLEN                     68

+#define ZAT_AUTHENTIC_MODE_MAXLEN              12

+#define ZAT_LANGUAGE_ABBREV_MAXLEN             16

+

+#define IPTYPE_MAX_LEN						10

+#define APN_MAX_LEN							100

+/****************************½á¹¹Ìå****************************/

+

+//¶¨ÒåÍøÂçÀàÐÍ

+typedef struct

+{

+    char  *netselect;

+    unsigned char  modeValue;

+    unsigned char  acqOrder;

+} T_zAt_SysConfigParaSet;

+

+/*csqÖ÷¶¯Éϱ¨*/

+typedef struct

+{

+    long rssi;

+    long ber;

+	long act;

+} T_zAt_CsqUnSolicite;

+

+/*ceregÖ÷¶¯Éϱ¨*/

+typedef struct

+{

+    unsigned int stat;

+    char  tac[10];  /*×Ö·û´®ÀàÐÍ£»ÒÔÊ®Áù½øÖƸñʽÏÔʾµÄÁ½×ֽڵı¾µØÇøÓòÂë»ò¸ú×ÙÇøÓòÂë  lac-->tac          */

+    char  ci[30];   /*×Ö·û´®ÀàÐÍ£»Ê®Áù½øÖƸñʽÖеÄËÄ×Ö½ÚµÄGERAN/UTRAN/E-UTRAN»ùÕ¾ID             */

+    unsigned int act;                      /*µ±Ç°ÒÑ×¢²áÍøÂçµÄ½ÓÈë¼¼Êõ                                                  */

+    unsigned int subact;

+} T_zAt_CeregRes;

+

+/*cgregÖ÷¶¯Éϱ¨*/

+typedef struct

+{

+    unsigned int  stat;                    /*µ±Ç°µÄ×¢²á״̬                                    */

+    char   lac[10];    /*λÖÃÂëÐÅÏ¢£¬Á½¸ö×Ö½Ú£¬16½øÖƱíʾ                  */

+    char   ci[30];     /*Ð¡ÇøÐÅÏ¢£¬Á½¸ö×Ö½Ú»ò4¸ö×Ö½Ú£¬16½øÖƱíʾ           */

+    unsigned int  act;                     /*µ±Ç°ÒÑ×¢²áÍøÂçµÄ½ÓÈë¼¼Êõ                          */

+    char   rac[30];    /*×Ö·û´®ÀàÐÍ£»ÒÔÊ®Áù½øÖƸñʽÏÔʾµÄÒ»×ֽڵķÓÉÇøÓòÂë*/

+	unsigned int  subact;

+} T_zAt_CgregRes;

+

+/*cregÖ÷¶¯Éϱ¨*/

+typedef struct

+{

+    unsigned int stat;

+    char  tac[10];  /*×Ö·û´®ÀàÐÍ£»ÒÔÊ®Áù½øÖƸñʽÏÔʾµÄÁ½×ֽڵı¾µØÇøÓòÂë»ò¸ú×ÙÇøÓòÂë  lac-->tac          */

+    char  ci[30];   /*×Ö·û´®ÀàÐÍ£»Ê®Áù½øÖƸñʽÖеÄËÄ×Ö½ÚµÄGERAN/UTRAN/E-UTRAN»ùÕ¾ID             */

+    unsigned int act;                      /*µ±Ç°ÒÑ×¢²áÍøÂçµÄ½ÓÈë¼¼Êõ                                                  */

+    unsigned int subact;

+} T_zAt_CregRes;

+

+/* µ¥ÌõÔËÓªÉÌÐÅÏ¢µÄ¶¨Òå */

+typedef struct 

+{

+    int  stat;

+    char    lalphaOper[70];

+    char    salphaOper[30];

+    char    numericOper[20];

+    int    netType;

+	int    subType;

+} T_zAt_ResOperator;

+

+/* COPS ²âÊÔÏìÓ¦²ÎÊý¶¨Òå */

+typedef struct

+{

+    long              count;

+    T_zAt_ResOperator   oplist[ZAT_RES_OPERATOR_MAX_NUM];

+} T_zAt_CopsTestRes;

+

+/*ËÑÍøCopsÉèÖÃÃüÁî²ÎÊý*/

+typedef struct

+{

+    long  mode;                       /*ÍøÂçÑ¡Ôñģʽ          */

+    long  format;                     /*ÔËÓªÉÌÐÅÏ¢<oper>µÄ¸ñʽ*/

+    char    oper[70];   /*ÔËÓªÉ̵ÄÐÅÏ¢          */

+    long  nettype;                    /*ÍøÂçµÄ״̬±êʶ        */

+	long  subtype;                    /*ÍøÂçµÄ×Ó״̬±êʶ        */

+} T_zAt_CopsSet;

+

+/* COPS ¶ÁÈ¡ÏìÓ¦²ÎÊý¶¨Òå */

+typedef struct 

+{

+    long  mode;

+    long  format;

+    char  oper[70];

+    long  act;  

+    long  subact; 

+} T_zAt_CopsReadRes;

+

+typedef struct

+{

+    char    OperFullName[70];

+    char    OperShortName[30];

+} T_zAt_OperatorName;

+

+typedef struct

+{

+    char profile_name[ZAT_PROFILE_MEMBER_LEN];

+    char apn_name[ZAT_PROFILE_MEMBER_LEN];//Õâ¸ö³¤¶È²»¶Ô£¬APN_MAX_LENÊÇ70

+    char dial_num[ZAT_PROFILE_MEMBER_LEN];

+    char ppp_auth_mode[ZAT_PROFILE_MEMBER_LEN];

+    char ppp_username[ZAT_PROFILE_MEMBER_LEN];

+    char ppp_passwd[ZAT_PROFILE_MEMBER_LEN];

+    char pdp_type[ZAT_PROFILE_MEMBER_LEN];

+} T_zAt_APN_PROFILE;

+

+

+typedef struct

+{

+    unsigned char sysmode;

+    char  *netType;

+} T_zAt_SysInfoSetNetType;

+

+/* at ÏìÓ¦²ÎÊýÁбíÀàÐͶ¨Òå */

+typedef struct 

+{

+    unsigned int  listCount;

+    char    strParasLine[ZAT_RES_PARAM_MAX_NUM][ZAT_RES_PARAM_MAX_LEN];

+} T_zAt_RES_PARAS_LIST;

+

+//״̬±êʶ

+typedef struct

+{

+	int cgdcont_state;//at+cgdcont=

+    int zrap_state;//at+zrap?

+    int powersave_state;//at+powersave

+    int apnset_state;//zgpcoauthºóÊÇ·ñÐèÒª·¢ËÍÆäËüatÃüÁî(ÐèÒª1)

+    int clck_state;//ÉèÖᢲéѯ±ê×¢

+}psnormal_state;

+

+typedef struct {

+	int signalbar0_low;

+    int signalbar0_high;

+	int signalbar1_low;

+	int signalbar1_high;

+	int signalbar2_low;

+	int signalbar2_high;

+	int signalbar3_low;

+	int signalbar3_high;

+	int signalbar4_low;

+	int signalbar4_high; 

+	int signalbar5_low;

+	int signalbar5_high;	

+}T_zAt_SignalBarInfo;

+

+//µ±Ç°Éè±¸ËøÍø×´Ì¬

+typedef struct

+{

+    unsigned int status;

+    unsigned int items;

+} T_zAt_Zsec_Res;

+

+//lteÏÂËø»ò½âËøÆµ²ÎÊý

+typedef struct

+{

+    long actionlte;

+    long  uarfcnlte;

+    long  cellParaIdlte;

+} T_zAt_ZltelcPara;

+

+/*CLCK²éѯÃüÁî*/

+typedef struct

+{

+    unsigned char status;

+    unsigned char uclass;

+} T_zAt_ClckSet_RES;

+

+//MSG_ID_WIFIµÄMSG_CMD_GET_MODE_INFOµÄÏûÏ¢ÖÐʹÓã¬Çë¶Å¼Ò½¿È·¶¨ÊÇ·ñ»¹Ê¹ÓÃ

+typedef struct

+{

+    long sys_mode;

+    long sys_submode;

+} T_zUfi_ModeInfoInd;

+

+//memory modify userName passWord

+typedef struct 

+{

+	char mcc[ZAT_MCC_MAXLEN];     

+	char mnc[ZAT_MCC_MAXLEN];    

+	char networkProvider[ZAT_NETWORK_PROVIDER_MAXLEN];             /*ÔËÓªÉÌ brand          */

+	char networkProviderName[ZAT_NETWORK_PROVIDER_NAME_MAXLEN];    /*ÔËÓªÉÌÃû³Æ operator   */

+	char autoAPN[ZAT_APN_MAXLEN];                                  /*APN                   */

+	char userName[ZAT_AUTHENTIC_MODE_MAXLEN];                                 /*username              */

+	char passWord[ZAT_AUTHENTIC_MODE_MAXLEN];                                 /*password              */

+	char authenticMode[ZAT_AUTHENTIC_MODE_MAXLEN];                 /*authentic mode        */

+}T_zAt_QualcommListNode;

+//7100

+typedef enum

+{

+    MODEM_UNINIT = 0,

+	SIM_READY,

+	SIM_PIN,

+	SIM_PUK,

+	SIM_INVALID,

+	CFUN_OK,

+	CFUN_ERROR,

+	PDP_ACTIVED,

+	PDP_DEACTIVE,

+

+    MODEM_STATE_MAX,

+}T_Modem_State;

+

+typedef struct

+{

+    unsigned char init_stat;     /*see T_Modem_State*/

+    unsigned char net_stat;      /*1,5ÍøÂçÒÑ×¢²á*/

+    unsigned char connect_stat;  /*0δ¼¤»î,1¼¤»î,2¼¤»îÖÐ,3È¥¼¤»îÖÐ*/

+    unsigned char net_opt;       /*0 no support,1 control plane,2 user plane,3 both*/

+} T_AT_State;

+

+typedef struct

+{

+    unsigned char resume_cid;     /*bitmap 3ȫԤÁô*/

+    unsigned char modem_model;     /*yes init modem,no not init*/

+    char ip_type[IPTYPE_MAX_LEN]; /*IP,IPV6,IPV4V6,Non-IP*/

+    char apn[APN_MAX_LEN];        /*apn, same as struct cid_resource_t*/

+

+} T_Cfg_Set;

+

+typedef struct

+{

+   int cid;

+   int data_len;

+   unsigned char *data_addr;

+   int rai;

+   int data_type;

+   int param_num; //²ÎÊý¸öÊý

+   int at_fd;     //Èç¹û>0˵Ã÷ÊÇÆ¬Íâ·¢ÆðµÄ£¬´Ó¸ÃͨµÀ»Ø¸´ÏìÓ¦

+}MSG_ZSODCP;

+

+typedef struct

+{

+   char res;         /*0 OK, 1 2 ERROR, 2 carray error code*/

+   char errcode[7];  /*use if ERROR*/

+}MSG_ZSODCP_RES;

+/*****************************È«¾Ö±äÁ¿****************************/

+

+/****************************³£Á¿****************************/

+static const T_zAt_SysConfigParaSet G_ZAT_SYSCONFIG_CFGPARA_SET[]   =

+{

+    {"GSM_preferred",   ZAT_SYSCONFIG_MODE_AUTO,            ZAT_SYSCONFIG_PREF_ACQ_GSM_WCDMA},

+    {"TD_preferred",    ZAT_SYSCONFIG_MODE_AUTO,            ZAT_SYSCONFIG_PREF_ACQ_WCDMA_GSM},

+    {"Only_GSM",        ZAT_SYSCONFIG_MODE_GSM_ONLY,        ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+    {"Only_WCDMA",      ZAT_SYSCONFIG_MODE_WCDMA_ONLY,      ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+    {"Only_TD",         ZAT_SYSCONFIG_MODE_TD_SCDMA_ONLY,   ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+    {"Only_LTE",        ZAT_SYSCONFIG_MODE_LTE,             ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+    {"GSM_TD",          ZAT_SYSCONFIG_MODE_GSM_TD,          ZAT_SYSCONFIG_PREF_ACQ_GSM_WCDMA},

+    {"TD_GSM",          ZAT_SYSCONFIG_MODE_GSM_TD,          ZAT_SYSCONFIG_PREF_ACQ_WCDMA_GSM},

+    {"GSM_LTE",         ZAT_SYSCONFIG_MODE_GSM_LTE,         ZAT_SYSCONFIG_PREF_ACQ_GSM_LTE},

+    {"LTE_GSM",         ZAT_SYSCONFIG_MODE_GSM_LTE,         ZAT_SYSCONFIG_PREF_ACQ_LTE_GSM},

+    {"GSM_TD_auto",         ZAT_SYSCONFIG_MODE_GSM_TD,         ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+    {"TD_LTE_auto",         ZAT_SYSCONFIG_MODE_TD_LTE,         ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+    {"TD_W",            ZAT_SYSCONFIG_MODE_TD_W,            ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+    {"TD_W_LTE",         ZAT_SYSCONFIG_MODE_TD_W_LTE,       ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+	{"TD_W_GSM",         ZAT_SYSCONFIG_MODE_TD_W_GSM,       ZAT_SYSCONFIG_PREF_ACQ_AUTO},

+};

+

+static const char suffixSignalBarNV[][20] = {

+	{"signalbar0_low"},

+	{"signalbar0_high"},

+	{"signalbar1_low"},

+	{"signalbar1_high"},

+	{"signalbar2_low"},

+	{"signalbar2_high"},

+	{"signalbar3_low"},

+	{"signalbar3_high"},

+	{"signalbar4_low"},

+	{"signalbar4_high"},

+	{"signalbar5_low"},

+	{"signalbar5_high"},

+};

+

+static const char prefixSignalBarNV[][10] = {

+	{""},

+	{"gsm_"},

+	{"wcdma_"},

+	{"tds_"},

+	{"lte_"},

+};

+

+typedef enum

+{

+	ZAT_SIGNALBAR_TYPE_NONE=0,

+	ZAT_SIGNALBAR_TYPE_GSM,

+	ZAT_SIGNALBAR_TYPE_WCDMA,

+	ZAT_SIGNALBAR_TYPE_TDS,

+	ZAT_SIGNALBAR_TYPE_LTE,

+	ZAT_SIGNALBAR_TYPE_MAX

+}T_zAt_SignalBar_Type;

+

+enum ZRAP_TYPE{

+    ZRAP_OTHER_CMD = 0,

+    ZRAP_READ_FIR_CMD,//¿ª»ú²éѯ

+    ZRAP_READ_SEC_CMD,//×Ô¶¯pinÂëÑéÖ¤ºó²éѯ

+};

+

+enum POWERSAVE_TYPE{

+    POWERSAVE_OTHER_CMD = 0,

+    POWERSAVE_CARDERROR_CMD,//²éѯ¿¨×´Ì¬´íÎó

+    POWERSAVE_LOCKNET_CMD,//ËøÍø

+    POWERSAVE_CARDREMOVE_CMD,//°Î¿¨

+};

+

+enum CLCK_TYPE{

+    CLCK_OTHER_CMD = 0,

+    CLCK_SET_CMD,//ÉèÖÃ(pinÂëʹÄÜ)

+    CLCK_REQ_CMD,//²éѯ

+};

+

+typedef enum

+{

+    DB_OK               = 0,

+    DB_ERROR_INVALIDPTR = 100,

+    DB_ERROR_NOTOPENDB,

+    DB_ERROR_FULL,

+    DB_ERROR            = -1

+}DbResult;

+

+/*Web·¢ÏûÏ¢¶ÔPinÂëµÄ²Ù×÷*/

+typedef enum

+{

+    ZAT_PIN_MANAGE_DISABLE = 0,

+    ZAT_PIN_MANAGE_ENABLE,

+    ZAT_PIN_MANAGE_MODIFY

+} T_zAt_PinManageion;

+

+typedef enum

+{

+    ZAT_CLCK_UNLOCK = 0, /*0 ½â³ýËø¶¨        */

+    ZAT_CLCK_LOCK,       /*1 Ëø¶¨            */

+    ZAT_CLCK_QUERY       /*2 ²éѯµ±Ç°Ëø¶¨×´Ì¬*/

+} T_zAt_ClckSetMode;

+

+/*ÓÃÀ´ÉèÖÃSYSINFOÉϱ¨µÄÍøÂçÀàÐÍ*/

+static const T_zAt_SysInfoSetNetType G_ZAT_SYSINFO_SET_NETTYPE[] =

+{

+    {ZAT_SYSINFORES_SYSMODE_CDMA1X,        "CDMA1X"        },

+    {ZAT_SYSINFORES_SYSMODE_GSM,           "GSM"           },

+    {ZAT_SYSINFORES_SYSMODE_EVDO,          "EVDO"          },

+    {ZAT_SYSINFORES_SYSMODE_WCDMA,         "WCDMA"         },

+    {ZAT_SYSINFORES_SYSMODE_GPS,           "GPS"           },

+    {ZAT_SYSINFORES_SYSMODE_GSM_WCDMA,     "GSM/WCDMA"     },

+    {ZAT_SYSINFORES_SYSMODE_EVDO_CDMA1X,   "EVDO/CDMA1X"   },

+    {ZAT_SYSINFORES_SYSMODE_TD_SCDMA,      "TD-SCDMA"      },

+    {ZAT_SYSINFORES_SYSMODE_FDD_LTE,       "FDD-LTE"       },

+    {ZAT_SYSINFORES_SYSMODE_TDD_LTE,       "LTE"           }

+};

+

+/*ÊÊÅäÖÐÒÆ*/

+static const T_zAt_SysInfoSetNetType G_ZAT_SYSINFO_CMCC_NETTYPE[] =

+{

+    {ZAT_SYSINFORES_SYSMODE_GSM,              "G"       },

+    {ZAT_SYSINFORES_SYSMODE_WCDMA,         "3G"     },

+    {ZAT_SYSINFORES_SYSMODE_TD_SCDMA,    "3G"     },

+    {ZAT_SYSINFORES_SYSMODE_FDD_LTE,        "4G"     },

+    {ZAT_SYSINFORES_SYSMODE_TDD_LTE,        "4G"     }

+};

+

+#if 0

+static const T_zAt_SysInfoSetNetType G_ZAT_SYSINFO_SET_SUBNETTYPE[] =

+{

+    {1,        "GSM" },

+    {2,        "GPRS" },

+    {3,        "EDGE" },

+    {4,        "WCDMA" },  //WCDMA

+    {5,        "HSDPA" },  //utran

+    {6,        "HSUPA" },  //utran

+    {7,        "HSPA" },  //utran

+    {8,        "TD_SCDMA" },

+    {9,        "TDD_LTE" },

+    {10,       "FDD_LTE" },

+    {11,       "HSPA+" },  //utran

+};

+#endif

+

+static const T_zAt_SysInfoSetNetType G_ZAT_SYSINFO_SET_SUBNETTYPE[] =

+{

+    {1,        "2G" },

+    {2,        "2G" },

+    {3,        "2G" },

+    {4,        "3G" },  //WCDMA

+    {5,        "3G" },  //utran

+    {6,        "3G" },  //utran

+    {7,        "3G" },  //utran

+    {8,        "3G" },

+    {9,        "4G" },

+    {10,       "4G" },

+    {11,       "3G" },  //utran

+};

+

+static const T_zAt_QualcommListNode  G_ZAT_QUALCOMMLISTNODE[]=

+{

+    /* MCC     MNC      ÔËÓªÉÌ          ÔËÓªÉÌÃû³Æ              APN         User_Name       Pass_Word          Authentic_Mode*/

+    { "460",    "0",	"China Mobile",	"China Mobile Communication Corp.",	"default"	, 	"default",    	"default",		"default"},

+    { "460",    "1",	"China Unicom",	"China Unicom",		"default"	, 	"default",    	"default",		"default"},

+    { "460",    "2",	"China Mobile",	"China Mobile Communication Corp.",	"default", 	"default",    	"default",		"default"},

+    { "460",    "3",	"China Telecom",	"China Telecom",	"default"	, 	"default",    	"default",		"default"},

+    { "460",    "7",	"China Mobile",	"China Mobile Communication Corp.",	"default", 	"default",    	"default",		"default"},

+};

+

+/**************************º¯ÊýÉùÃ÷****************************/

+void normal_regist_init();

+MSG_BUF *normal_getmsg(unsigned short src_id,unsigned short dst_id,unsigned short Msg_cmd,unsigned short us_DataLen,unsigned char *pData);

+

+//zdm ÇëÕ×·áÈ·ÈÏÊÇ·ñÐèҪͬ²½µ½AP²à

+char* zurdy_convert_cmd(void *msg,struct at_context *context);

+int zurdy_auto_act(char *at_paras ,int is_query_report);

+int zschplmn_ok_act(char *at_paras,struct at_context *context,void **next_req,int *next_len);

+void pbsms_init_timerout(void *msg);

+extern int atCcapp_RecvOk(char *at_str,struct at_context *context,void **next_req,int *next_len);

+extern int atCcapp_RecvErr(char *at_str,struct at_context *context,void **next_req,int *next_len);

+/***********atÃüÁî»ñÈ¡****************/

+char* normal_getzrapread();

+

+char* normal_getcpinread();

+

+char* normal_getcpinset(char *pin);

+

+char* normal_getcpukset(char *puk,char *newpin);

+

+char* normal_getcgsn();

+

+char* normal_getcrsmset(char *param);

+

+char* normal_getcimi();

+

+/*¸ù¾Ýµ±Ç°NVÖµ,·µ»ØsysconfigÉèÖÃÃüÁî*/

+char* normal_getsysconfigset();

+

+/*¸ù¾Ýµ±Ç°NVÖµ,·µ»ØcgdcontÉèÖÃÃüÁî*/

+char* normal_getcgdcontset(int cid);

+

+

+/*¸ù¾Ýµ±Ç°NVÖµ,·µ»ØzgpcoauthÉèÖÃÃüÁî*/

+char* normal_getzgpcoauthset(int cid);

+

+char* normal_getcfunset(char *cmdtype);

+

+char* normal_getcgregset(char *param);

+

+char* normal_getceregset(char *param);

+

+char* normal_getzsqrset(char *param);

+

+char* normal_getcopsset(int paramnum,...);

+

+char* normal_getcopstest();

+

+char* normal_getcsq();

+

+char* normal_getzversion();

+

+char* normal_getsyctimeset(long sec,long usec);

+char* normal_getmtnetset(char *mcc);

+char* normal_getboardnumread();

+

+char* normal_getsysinfo();

+

+

+char* normal_getcusdset_clean();

+

+

+char* normal_getcusdset(char *param);

+

+

+char* normal_getclckset(int paramnum,...);

+

+

+char* normal_getcpwdset(char *type,char *oldPin,char *newPin);

+

+char* normal_getzmodeset(int param);

+

+char* normal_getmacread();

+

+char* normal_getmac2read();

+

+char *normal_getzltelcset();

+

+/***********atÃüÁî»ñÈ¡****************/

+

+int normal_count_callback(void *fvarg,int line,char **zresult,char **lname);

+

+

+/*¸ù¾ÝÉ豸ÐͺźÍplmn,²éѯlocknet.db*/

+int normal_islocknetwhitelist(char *pmodel, char *pplmn);

+

+

+/*ËøÍø¼ì²â*/

+BOOL normal_locknetmatch(const char* mcc, const char* mnc);

+

+

+int normal_getsysconfigsetParam(int *mode, int *acqOrder, int *roam);

+

+

+int normal_getauthtype(char* pAuthType);

+

+void normal_cfunOkSet();

+

+

+void *normal_copstimeractstart(VOID *arg);

+

+void normal_copstest_timerout(void *msg);

+

+void normal_calcltesignalbar(long rssi);

+

+void normal_calctdsignalbar(long rssi);

+

+void normal_calcothersignalbar(long rssi);

+

+

+void normal_calcunknowsignalbar(void);

+

+

+void normal_calcsignalbar(T_zAt_SignalBar_Type signalBarType);

+

+

+void normal_calcltesignalstrength(long rssi);

+

+

+void normal_calctdsignalstrength(long rssi);

+

+

+void normal_calcothersignalstrength(long rssi);

+

+

+VOID normal_sysinfosysmodecfgset(long sysModeIn, long sysSubModeIn);

+

+

+VOID normal_sysinfonetworktypeSet(long sysMode,long sysSubmode);

+

+

+long normal_isroam(char *sim_plmn, char *net_plmn);

+

+

+BOOL normal_checkroam(const char* mcc, const char* mnc);

+

+

+VOID normal_simcardcfgreset();

+

+char *normal_findsubstr(const char *pStr, const char *pSubStr);

+

+/*Ô¤´¦Àí*/

+VOID normal_preprocresparalineex(char *pParaLine,int paraSize);

+

+

+/*Ô¤´¦Àí*/

+void normal_preprocresparalist(T_zAt_RES_PARAS_LIST *pParaList, const char *pParas);

+

+VOID normal_recvcopstestrsp(char *at_paras);

+

+

+int normal_getautoapn_callback(void *fvarg,int line,char **zresult,char **lname);

+

+/*»ñÈ¡auto apn*/

+long normal_getautoapn(char *CCMNC);

+

+

+void normal_recvzrapok();

+

+int zmsri_auto_act(char *at_paras ,int is_query_report);

+

+int zupci_auto_act(char *at_paras ,int is_query_report);

+char* start_zutr_cmd(void *msg,struct at_context *context);

+

+int zrefreshind_auto_act(char *at_paras ,int is_query_report);

+

+int zuslot_auto_act(char *at_paras ,int is_query_report);

+

+char* start_start_zmsri(void *msg,struct at_context *context);

+

+char* start_query_csq(void *msg,struct at_context *context);

+

+char* start_verifypin_cmd(void *msg,struct at_context *context);

+

+char* start_verifypuk_cmd(void *msg,struct at_context *context);

+

+char* start_netselect_cmd(void *msg,struct at_context *context);

+

+char *start_pinmanage_cmd(void *msg,struct at_context *context);

+

+char* start_setnetwork_cmd(void *msg,struct at_context *context);

+

+char* start_syctimeset_cmd(void *msg,struct at_context *context);

+

+char *start_ussdset_cmd(void *msg,struct at_context *context);

+

+char *start_ussdcancel_cmd(void *msg,struct at_context *context);

+

+char *start_airmode_cmd(void *msg,struct at_context *context);

+

+char *start_celllock_cmd(void *msg,struct at_context *context);

+

+char *start_imeireq_cmd(void *msg,struct at_context *context);

+

+char *start_zversionreq_cmd(void *msg,struct at_context *context);

+

+char *start_cgdcontset_cmd(void *msg,struct at_context *context);

+

+char *start_query_sysinfo(void *msg,struct at_context *context);

+

+char *start_start_zuslot(void *msg,struct at_context *context);

+

+char *start_setroam_cmd(void *msg,struct at_context *context);

+

+int sysconfigread_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int sysconfigread_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int sysconfig_auto_act( char *at_paras ,int is_query_report);

+

+int  zrap_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  zrap_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int zrap_auto_act( char *at_paras ,int is_query_report);

+

+int cpin_read_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cpin_read_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cpin_set_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cpin_set_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cpin_auto_act(char *at_paras ,int is_query_report);

+

+int  cgsn_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  cgsn_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cgsn_auto_act(char *at_paras ,int is_query_report);

+

+int  crsm_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  crsm_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int crsm_auto_act(char *at_paras ,int is_query_report);

+

+int  cimi_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  cimi_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cimi_auto_act(char *at_paras ,int is_query_report);

+

+int zapnsave_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int zapnsave_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int sysconfig_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int sysconfig_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cgdcont_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cgdcont_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cfun_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cfun_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cgreg_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cgreg_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cereg_set_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cereg_set_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int zsqr_auto_act(char *at_paras ,int is_query_report);

+

+

+int cops_set_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cops_set_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cops_read_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cops_read_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cops_test_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cops_test_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int cops_auto_act(char *at_paras ,int is_query_report);

+

+int  zversion_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int  zversion_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int zversion_auto_act(char *at_paras ,int is_query_report);

+

+

+int  syctime_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  syctime_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+int  zsetmtnet_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  zsetmtnet_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  mac_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int  mac_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int  mac2_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+

+int  mac2_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  zltelc_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  zltelc_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  sysinfo_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  sysinfo_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  cusd_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  clck_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  clck_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  cpwd_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int  cpwd_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int mode_auto_act(char *at_paras ,int is_query_report);

+

+int cereg_auto_act(char *at_paras ,int is_query_report);

+

+int cgreg_auto_act(char *at_paras ,int is_query_report);

+

+int creg_auto_act(char *at_paras ,int is_query_report);

+

+int sysinfo_auto_act(char *at_paras ,int is_query_report);

+

+int mac_auto_act(char *at_paras ,int is_query_report);

+

+int mac2_auto_act(char *at_paras ,int is_query_report);

+

+int clck_auto_act(char *at_paras ,int is_query_report);

+

+int zpbic_auto_act(char *at_paras ,int is_query_report);

+

+int cnum_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int cnum_auto_act( char *at_paras ,int is_query_report);

+

+char* start_query_cnum(void *msg,struct at_context *context);

+

+char *start_getmodeminfo(void *msg,struct at_context *context);

+

+int ziccid_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+

+int ziccid_auto_act( char *at_paras ,int is_query_report);

+

+//iot

+int cciotopt_set_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+int cciotopt_set_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+char* normal_cciotopt_set(void);

+

+char* start_pdpact_cmd(void *msg,struct at_context *context);

+char* start_pdpdeact_cmd(void *msg,struct at_context *context);

+int zmmi_auto_act(char *at_paras ,int is_query_report);

+

+//оƬÈÏÖ¤

+char* start_zeact_cmd(void *msg,struct at_context *context);

+char* start_zmmi_cmd(void *msg,struct at_context *context);

+char* start_zimsamrw_cmd(void *msg,struct at_context *context);

+int  cmd_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+int  cmd_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len);

+int atd_req_rcv_act( char *at_paras,int at_fd,struct at_context *context);

+

+void at_ctl_startisms(void);

+void pbsms_init_msg_proc();

+MSG_BUF *normal_getmsg(unsigned short src_id,unsigned short dst_id,unsigned short Msg_cmd,unsigned short us_DataLen,unsigned char *pData);

+char* start_cvmod_cmd(void *msg,struct at_context *context);

+char* start_zchnelset_cmd(void *msg,struct at_context *context);

+char *start_querycgdcont_cmd(void *msg,struct at_context *context);

+

+int cusd_auto_act(char *at_paras ,int is_query_report);

+

+#endif

diff --git a/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/extat_softap_register.c b/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/extat_softap_register.c
new file mode 100755
index 0000000..7d22ab3
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/extat_softap_register.c
@@ -0,0 +1,839 @@
+/*******************************************************************************

+*À©Õ¹ATÃüÁîʵÏַǵçÐÅÏà¹ØÒµÎñ ʵÀý 

+*À©Õ¹ATÃüÁ¼ÈÖ§³ÖsoftapÖ®ÉϵÄÓû§½ø³Ìͨ¹ýptyÉ豸Óëat_ctl½øÐÐÀ©Õ¹AT½»»¥£¬Ò²Ö§³Ö¿Í»§µÄMCUͨ¹ýuart»òUSBµÈ´®¿ÚͨµÀͨ¹ýÀ©Õ¹ATÃüÁîÓëat_ctl½øÐн»»¥£¬½ø¶øÊµÏÖÓû§¶ÔsoftapµÄͳһ»¯¿ØÖÆ

+*À©Õ¹ATÃüÁîÓësoftapi¶ÔÍâÌṩµÄapiÏûÏ¢Ò»Ò»¶ÔÓ¦£¬ATÃüÁîµÄ¾ßÌå²ÎÊý£¬±£³ÖÓëÏûÏ¢ÌåÄÚÈÝÍêȫһÖÂ

+

+* ºóÐøÐÂÔöÀ©Õ¹ATÃüÁî×¢²á£¬¿ÉÒԲο¼ÈçÏ´úÂëʵÏÖ

+**********************************************************************************/

+#include "softap_api.h"

+#include "at_com.h"

+#include "at_context.h"

+

+int g_atv = 0;

+int g_atq = 0;

+int g_at_d = 0;

+extern int g_mmi_at_led_flag;

+extern int g_mmi_at_lcd_flag;

+

+/* ½«À©Õ¹ATÃüÁî²ÎÊý½âÎö³Éreq_msg_id¶ÔÓ¦µÄÏûÏ¢½á¹¹Ì壬Èç¹ûÏûϢûÓÐÄÚÈÝ£¬res_msg=NULL£¬res_msglen=0

+·µ»ØAT_END_AND_MSG£¬ÓÉ¿ò¼ÜÍùat_fdÖÐд\r\nOK\r\n£¬²¢½«req_msg_id·¢Ë͵½·þÎñ¶Ëapp*/

+struct wifi_opt

+{

+	int  status;

+};

+

+char *  wlan_auth[] = 

+{

+	"OPEN",

+	"WPAPSK",

+	"WPA2PSK",

+	"WPAPSKWPA2PSK",

+	"WPA3Personal",

+	"WPA2WPA3",

+};

+

+char *  wlan_encrp[] = 

+{

+	"NONE",

+	"TKIP",

+	"AES",

+	"TKIPAES",

+};

+

+#if (APP_OS_TYPE == APP_OS_TOS)

+extern SINT32 mmiLcReset(VOID);

+extern UINT32 zOss_ResetNVFactory(VOID);

+#endif

+

+//»Ö¸´³ö³§ÉèÖÃ

+void ext_reset_proc()

+{

+#if (APP_OS_TYPE == APP_OS_TOS)

+#if (PRODUCT_TYPE == PRODUCT_PHONE)

+	mmiLcReset();

+#else

+	zOss_ResetNVFactory();

+#endif

+	//send_soc_msg(FAR_PS, MODULE_ID_MAIN_CTRL, MSG_CMD_RESET_RSP, 0, NULL);

+	platform_send_msg(MODULE_ID_CP_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESET_RSP, 0, NULL);

+#endif

+}

+

+/*

+typedef int (*ser_req_func)(int at_fd, char *at_paras, void ** res_msg, int *res_msglen);

+*/

+int ext_wifi_switch_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+	char *opt = (char *)malloc(sizeof(int));

+	if(opt == NULL)

+		return AT_END;

+	memset(opt, 0 , sizeof(int));

+	strcpy(opt, at_paras);

+	printf("at_paras=%s, opt=%s\n", at_paras, opt);

+	*res_msg = opt;

+	*res_msglen = strlen(opt);

+	return AT_CONTINUE;

+}

+

+/*

+typedef int (*app_rsp_proc)(void *rsp_msg, void**ret, int *retlen);

+

+*/

+int ext_wifi_operate_rsp(void *rsp_msg, void**ret, int *retlen)

+{

+

+	char *at_str = NULL;

+

+	if(AT_RSP_ERR == atoi(rsp_msg))

+	{

+		at_str = at_err_build(ATERR_PROC_FAILED);	

+	}

+	else

+	{

+		at_str = at_ok_build();

+

+	}

+

+	*ret = at_str;

+	*retlen = strlen(at_str);

+

+	 return AT_END;

+}

+

+int ext_wifi_cfg_ssid_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+	wlan_basic_info *opt = (wlan_basic_info *)malloc(sizeof(wlan_basic_info));

+	if(opt == NULL)

+		return AT_END;

+	memset(opt, 0 , sizeof(wlan_basic_info));

+	void *p[1] = {opt->ssid};

+	parse_param2("%s", at_paras, p);

+

+	printf("ssid=%s,auth=%s, encrypt=%s, pwd=%s, max_access=%s, hidessid=%s\n",opt->ssid, opt->authmode, opt->encrypt, opt->pwd, opt->max_access_num, opt->hidessid);

+	*res_msg = opt;

+	*res_msglen = sizeof(wlan_basic_info);

+	return AT_CONTINUE;

+}

+

+int ext_wifi_cfg_auth_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+	wlan_basic_info *opt = (wlan_basic_info *)malloc(sizeof(wlan_basic_info));

+	if(opt == NULL)

+		return AT_END;

+	memset(opt, 0 , sizeof(wlan_basic_info));

+

+	void *p[3] = {opt->authmode, opt->encrypt, opt->pwd};

+	parse_param2("%20s,%10s,%65s", at_paras, p);

+

+	unsigned int auth_index = atoi(opt->authmode);

+	unsigned int encrp_index = atoi(opt->encrypt);

+	if(auth_index < (sizeof(wlan_auth)/sizeof(char *)) && encrp_index < (sizeof(wlan_encrp)/sizeof(char *))){

+	sprintf(opt->authmode, "%s",  wlan_auth[auth_index]);

+	sprintf(opt->encrypt, "%s",  wlan_encrp[encrp_index]);

+	}

+	printf("ssid=%s,auth=%s, encrypt=%s, pwd=%s, max_access=%s, hidessid=%s\n",opt->ssid, opt->authmode, opt->encrypt, opt->pwd, opt->max_access_num, opt->hidessid);

+

+

+	*res_msg = opt;

+	*res_msglen = sizeof(wlan_basic_info);

+	return AT_CONTINUE;

+}

+

+

+int ext_reset_req(int at_fd,char * at_paras,void **res_msg,int * res_msglen)

+{

+	restart_info *opt  = (restart_info *)malloc(sizeof(restart_info));

+	if(opt == NULL)

+		return AT_END;

+	memset(opt, 0 , sizeof(restart_info));

+	opt->action = Restart_Action_RESET;

+	opt->subaction = Operate_By_MCU;

+	printf("ext_reset_req action=%d,subaction=%d\n",opt->action, opt->subaction);

+	*res_msg = opt;

+	*res_msglen = sizeof(restart_info);  

+	return AT_CONTINUE;

+}

+

+int ext_restart_req(int at_fd,char * at_paras,void **res_msg,int * res_msglen)

+{

+	restart_info *opt  = (restart_info *)malloc(sizeof(restart_info));

+	if(opt == NULL)

+		return AT_END;

+	memset(opt, 0 , sizeof(restart_info));

+	void *p[2] = {&opt->action, &opt->subaction}; 

+

+	parse_param2("%d,%d", at_paras, p);

+

+	if (3 != strlen(at_paras) || opt->action < Restart_Action_RESTART || opt->action > Restart_Action_RESET || opt->subaction < Operate_By_MCU || opt->subaction > Operate_By_SOC)

+	{

+		*res_msg = at_err_build(ATERR_PARAM_INVALID);

+		*res_msglen = strlen(*res_msg);

+		return AT_END;

+	}

+

+	printf("ext_restart_req action=%d,subaction=%d ,len=%d \n",opt->action, opt->subaction,strlen(at_paras));

+	*res_msg = opt;

+	*res_msglen = sizeof(restart_info);

+	return AT_CONTINUE;

+}

+

+int ext_restart_rsp(void *rsp_msg, void**ret, int *retlen)

+{

+	char *at_str = NULL;

+

+	at_str = at_ok_build();

+

+	*ret = at_str;

+	*retlen = strlen(at_str);

+

+	return AT_END;

+}

+

+int ext_tc_control_func(char *at_paras, void ** res_msg)

+{

+	int ret = 0;

+	struct tc_control_info my_tc_info = {0};

+	void *p[2] = {&my_tc_info.tc_downlink,&my_tc_info.tc_uplink};

+	ret = parse_param("%d,%d", at_paras, p);

+	if (ret != AT_PARSE_OK)

+		return AT_END;

+	ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL,MSG_CMD_NET_TC_CTRL,sizeof(struct tc_control_info), (unsigned char *)&my_tc_info,0);

+	return AT_CONTINUE;

+}

+

+int ext_atv_set_func(char *at_paras, void ** res_msg)

+{

+	if(at_paras && strlen(at_paras) <= 1)

+	{

+		if(*at_paras == '\0' || *at_paras == '0')

+		{

+			g_atv = 1;

+			return AT_END;

+		}

+		else if( *at_paras == '1')

+		{

+			g_atv = 0;

+			return AT_END;

+		}

+	}

+	*res_msg = at_err_build(ATERR_PARAM_INVALID);;

+	return AT_END;

+}

+

+int ext_atq_set_func(char *at_paras, void ** res_msg)

+{

+	if(at_paras && strlen(at_paras) <= 1)

+	{

+		if(*at_paras == '\0' || *at_paras == '0')

+		{

+			g_atq = 0;

+			return AT_END;

+		}

+		else if( *at_paras == '1')

+		{

+			g_atq = 1;

+			return AT_END;

+		}

+	}

+	*res_msg = at_err_build(ATERR_PARAM_INVALID);;

+	return AT_END;

+}

+

+int ext_at_w_set_func(char *at_paras, void ** res_msg)

+{

+	char nv_atv[12] = {0};

+	char nv_atq[12] = {0};

+	char nv_at_d[12] = {0};

+

+	snprintf(nv_atv,12,"%d",g_atv);

+	snprintf(nv_atq,12,"%d",g_atq);

+	snprintf(nv_at_d,12,"%d",g_at_d);

+

+	cfg_set("at_atv", nv_atv);

+	cfg_set("at_atq", nv_atq);

+	cfg_set("at_at_d", nv_at_d);

+	cfg_save();

+

+	return AT_END;

+}

+

+int ext_at_d0_set_func(char *at_paras, void ** res_msg)

+{

+	g_at_d = 0;

+	return AT_END;

+}

+

+int ext_at_d1_set_func(char *at_paras, void ** res_msg)

+{

+	g_at_d = 1;

+	return AT_END;

+}

+

+int ext_at_d2_set_func(char *at_paras, void ** res_msg)

+{

+	g_at_d = 2;

+	return AT_END;

+}

+

+int ext_at_mac_manage_set_func(char *at_paras, void ** res_msg)

+{

+	char *at_str = malloc(64);

+	int ret = -1;

+	char n1[10] = {0};

+	char n2[10] = {0};

+	char n3[18] = {0};

+	void *p[] = {n1,n2,n3};

+	ret = parse_param("%s,%s,%s", at_paras, p);

+	if (ret != AT_PARSE_OK)

+	{

+		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",ret);

+		return AT_END;

+	}

+	if(strcmp(n1,"read") == 0)

+	{

+		if(strcmp(n2,"wlan") == 0)

+		{

+			char wifi_wlan[18] = {0};

+			cfg_get_item("mac_wlan0", wifi_wlan, sizeof(wifi_wlan));

+			sprintf(at_str,"\r\n+MAC_MANAGE: %s\r\nOK\r\n",wifi_wlan);

+		}

+		else

+			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",100);

+	}

+	else if(strcmp(n1,"write") == 0)

+	{

+		if(strcmp(n2,"wlan") == 0)

+		{

+			char wifi_wlan[20] = {0};

+			sprintf(wifi_wlan,"%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",

+			n3[0],n3[1],n3[2],n3[3],n3[4],n3[5],n3[6],n3[7],n3[8],n3[9],n3[10],n3[11]);

+			cfg_set("mac_wlan0", wifi_wlan);

+			cfg_save();

+			sprintf(at_str,"\r\nOK\r\n");

+		}

+		else

+			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",101);

+

+	}

+	else

+		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",102);

+

+	*res_msg = at_str;

+	return AT_END;

+}

+

+int ext_at_wifi_info_set_func(char *at_paras, void ** res_msg)

+{

+	char *at_str = malloc(64);

+	int ret = -1;

+	char n1[10] = {0};

+	char n2[18] = {0};

+	void *p[] = {n1,n2};

+	ret = parse_param("%s,%s", at_paras, p);

+	if (ret != AT_PARSE_OK)

+	{

+		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",ret);

+		return AT_END;

+	}

+	if(strcmp(n1,"read") == 0)

+	{

+		if(strcmp(n2,"host_ssid_2.4G") == 0)

+		{

+			char wifi_ssid[18] = {0};

+			cfg_get_item("SSID1", wifi_ssid, sizeof(wifi_ssid));

+			sprintf(at_str,"\r\n+WIFI_INFO: %s\r\nOK\r\n",wifi_ssid);

+		}

+		else if(strcmp(n2,"host_passwd_2.4G") == 0)

+		{

+			char wifi_wpapsk[18] = {0};

+			cfg_get_item("WPAPSK1", wifi_wpapsk, sizeof(wifi_wpapsk));

+			sprintf(at_str,"\r\n+WIFI_INFO: %s\r\nOK\r\n",wifi_wpapsk);

+		}

+		else if(strcmp(n2,"host_ssid_5G") == 0)

+		{

+			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",100);

+		}

+		else if(strcmp(n2,"host_passwd_5G") == 0)

+		{

+			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",100);

+		}

+		else if(strcmp(n2,"guest_ssid") == 0)

+		{

+			char wifi_ssid[18] = {0};

+			cfg_get_item("SSID1", wifi_ssid, sizeof(wifi_ssid));

+			sprintf(at_str,"\r\n+WIFI_INFO: %s\r\nOK\r\n",wifi_ssid);

+		}

+		else if(strcmp(n2,"guest_passwd") == 0)

+		{

+			char wifi_wpapsk[18] = {0};

+			cfg_get_item("WPAPSK1", wifi_wpapsk, sizeof(wifi_wpapsk));

+			sprintf(at_str,"\r\n+WIFI_INFO: %s\r\nOK\r\n",wifi_wpapsk);

+		}

+		else

+			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",100);

+	}

+	else

+		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",102);

+

+	*res_msg = at_str;

+	return AT_END;

+}

+

+int ext_at_flag_manage_set_func(char *at_paras, void ** res_msg)

+{

+	char *at_str = malloc(64);

+	int ret = -1;

+	char n1[10] = {0};

+	char n2[16] = {0};

+	char n3[18] = {0};

+	void *p[] = {n1,n2,n3};

+	ret = parse_param("%s,%s,%s", at_paras, p);

+	if (ret != AT_PARSE_OK)

+	{

+		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",ret);

+		return AT_END;

+	}

+	if(strcmp(n1,"read") == 0)

+	{

+		if(strcmp(n2,"wifi_ft") == 0)

+		{

+			char wifi_wlan[18] = {0};

+			cfg_get_item("wifi_ft", wifi_wlan, sizeof(wifi_wlan));

+			sprintf(at_str,"\r\n+FLAG_MANAGE: %s\r\nOK\r\n",wifi_wlan);

+		}

+		else if(strcmp(n2,"wifi_coupling") == 0)

+		{

+			char wifi_wlan[18] = {0};

+			cfg_get_item("wifi_coupling", wifi_wlan, sizeof(wifi_wlan));

+			sprintf(at_str,"\r\n+FLAG_MANAGE: %s\r\nOK\r\n",wifi_wlan);

+		}

+		else

+			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",100);

+	}

+	else if(strcmp(n1,"write") == 0)

+	{

+		if(strcmp(n2,"wifi_ft") == 0)

+		{

+			cfg_set("wifi_ft", n3);

+			cfg_save();

+			sprintf(at_str,"\r\nOK\r\n");

+		}

+		else if(strcmp(n2,"wifi_coupling") == 0)

+		{

+			cfg_set("wifi_coupling", n3);

+			cfg_save();

+			sprintf(at_str,"\r\nOK\r\n");

+		}

+		else

+			sprintf(at_str,"\r\n+CME ERROR: %d\r\n",101);

+

+	}

+	else

+		sprintf(at_str,"\r\n+CME ERROR: %d\r\n",102);

+

+	*res_msg = at_str;

+	return AT_END;

+}

+

+int ext_at_lan_ip_func(char *at_paras, void ** res_msg)

+{

+	char *at_str = malloc(64);

+	char buf[32] = {0};

+

+	cfg_get_item("lan_ipaddr", buf, sizeof(buf));

+	sprintf(at_str, "\r\n+LAN_IP:%s\r\nOK\r\n", buf);

+	*res_msg = at_str;

+

+	return AT_END;

+}

+

+#define CC_PATH "/sys/class/tcpc/type_c_port0/rp_lvl"

+#define ADC1_PATH "/sys/kernel/debug/pmu_zx29/adc1"

+#define ADC2_PATH "/sys/kernel/debug/pmu_zx29/adc2"

+

+char* ext_read_file_func(char *buf)

+{

+	int fd;

+	int ret;

+	char *read_paras = malloc(64);

+	fd = open(buf,O_RDONLY);

+	if (fd < 0)

+	{

+		free(read_paras);

+		return NULL;

+	}

+	ret = read(fd, read_paras, 64);

+	if (ret < 0)

+	{

+		close(fd);

+		free(read_paras);

+		return NULL;

+	}

+	read_paras[ret] = '\0';

+	close(fd);

+	return read_paras;

+}

+

+int ext_at_cc_func(char *at_paras, void ** res_msg)

+{

+	char *buf = ext_read_file_func(CC_PATH);

+	if (buf == NULL)

+	{

+		*res_msg = at_err_build(ATERR_PARAM_INVALID);

+		return AT_END;

+	}

+	char *at_str = malloc(128);

+	sprintf(at_str,"\r\n+CC: %s\r\nOK\r\n",buf);

+	free(buf);

+	*res_msg = at_str;

+	return AT_END;

+}

+

+int ext_at_adc_func(char *at_paras, void ** res_msg)

+{

+	char *adc1_buf = ext_read_file_func(ADC1_PATH);

+	if (adc1_buf == NULL)

+	{

+		*res_msg = at_err_build(ATERR_PARAM_INVALID);

+		return AT_END;

+	}

+	char *adc2_buf = ext_read_file_func(ADC2_PATH);

+	if (adc2_buf == NULL)

+	{

+		*res_msg = at_err_build(ATERR_PARAM_INVALID);

+		free(adc1_buf);

+		return AT_END;

+	}

+	char *at_str = malloc(128);

+	sprintf(at_str,"\r\n+ADC1: %s\r\n+ADC2: %s\r\nOK\r\n",adc1_buf, adc2_buf);

+	free(adc1_buf);

+	free(adc2_buf);

+	*res_msg = at_str;

+	return AT_END;

+}

+

+void set_led_states(char *led_list[], int start_index, int count, int state)

+{

+	int i = 0;

+	char cmd[128];

+	for (i = start_index; i < start_index + count; i++)

+	{

+		memset(cmd, 0, sizeof(cmd));

+		sprintf(cmd,"echo %d > /sys/class/leds/%s/brightness", state , led_list[i]);

+		system(cmd);

+	}

+}

+

+int ext_at_led_func(char *at_paras, void ** res_msg)

+{

+	g_mmi_at_led_flag = 1;

+	int i = 0;

+	char *led_list[9] = {

+					"battery_g_led",

+					"modem_g_led",

+					"wifi_g_led",

+					"battery_r_led",

+					"modem_r_led",

+					"wifi_r_led",

+					"battery_b_led",

+					"modem_b_led",

+					"wifi_b_led",};

+	set_led_states(led_list, 0, 9, 0); // turn off all leds

+	set_led_states(led_list, 0, 3, 1); // turn on all green leds

+	usleep(500000);

+	set_led_states(led_list, 0, 3, 0); // turn off all green leds

+	set_led_states(led_list, 3, 3, 1); // turn on all red leds

+	usleep(500000);

+	set_led_states(led_list, 3, 3, 0); // turn off all red leds

+	set_led_states(led_list, 6, 3, 1); // turn on all blue leds

+	usleep(500000);

+	set_led_states(led_list, 6, 3, 0); // turn off all blue leds

+	return AT_END;

+}

+

+#define BATTERY_VALUE "cat /sys/class/power_supply/battery/voltage_now"

+#define BATTERY_STATE "cat /sys/class/power_supply/charger/status"

+

+char *exec_battery_cmd(char *cmd, char *flag)

+{

+	char out_put[32];

+	char *at_str = malloc(128);

+	if (at_str == NULL)

+	{  

+        return NULL;

+	}

+	FILE *fp;

+	fp = popen(cmd, "r");

+	if (fp == NULL)

+	{

+		free(at_str);

+		return NULL;

+	}

+	if (fgets(out_put, sizeof(out_put), fp) != NULL)

+	{

+		sprintf(at_str, "\r\n+%s: %s\r\nOK\r\n", flag, out_put);

+	}

+	pclose(fp);

+	return at_str;

+}

+

+static void executeCommand(const char *command, char *result, int size)

+{

+	if (command == NULL || strlen(command) == 0)

+	{

+		return;

+	}

+

+	FILE *pipe = popen(command, "r");

+	if (pipe == NULL)

+	{

+		printf("popen = NULL\n");

+		perror("popen failed");

+		return;

+	}

+	int nread = fread(result, 1, size, pipe);

+	if (nread > 0)

+	{

+		result[nread - 1] = '\0';

+	}

+	pclose(pipe);

+

+	return;

+}

+

+int ext_at_battery_func(char *at_paras, void ** res_msg)

+{

+	char result[64] = {0};

+	executeCommand(BATTERY_STATE, result, sizeof(result));

+	printf("read result: %s\n", result);

+	if(strcmp(result, "Charging") == 0)

+	{

+		printf("when Charging, turn off charging\n");

+		system("echo 0 > /sys/class/power_supply/charger/charge_enabled"); //¶ÁÈ¡µçѹʱÏȽûÓóäµç

+		*res_msg = exec_battery_cmd(BATTERY_VALUE,"BATTERY_VALUE");

+		if (*res_msg == NULL)

+		{

+			*res_msg = at_err_build(ATERR_PROC_FAILED);

+		}

+		system("echo 1 > /sys/class/power_supply/charger/charge_enabled");//¶ÁÈ¡Íê³ÉºóʹÄܳäµç

+		return AT_END;

+	}

+

+	*res_msg = exec_battery_cmd(BATTERY_VALUE,"BATTERY_VALUE");

+	if (*res_msg == NULL)

+	{

+		*res_msg = at_err_build(ATERR_PROC_FAILED);

+	}

+

+	return AT_END;

+}

+

+int ext_at_battery_state_func(char *at_paras, void ** res_msg)

+{

+	*res_msg = exec_battery_cmd(BATTERY_STATE,"BATTERY_STATE");

+	if (*res_msg == NULL)

+	{

+		*res_msg = at_err_build(ATERR_PROC_FAILED);

+	}

+	return AT_END;

+}

+extern VOID mmi_set_mode_active(VOID);

+

+int ext_at_lcd_func(char *at_paras, void ** res_msg)

+{

+	mmi_set_mode_active();

+	usleep(500000);

+	g_mmi_at_lcd_flag = 1;

+	int exit_status = system("fbtest AUTO");

+    if (exit_status == 0)

+    {

+        return AT_END;

+    }

+    else

+    {

+        *res_msg = at_err_build(ATERR_PROC_FAILED);

+		return AT_END;

+    }

+}

+

+

+/**

+ * ¶ÁÈ¡ÎļþÄÚÈݵ½×Ö·û´®ÖУ¬°´ÐжÁÈ¡

+ * @param filename ÎļþÃû

+ * @return ¶¯Ì¬·ÖÅäµÄ×Ö·û´®£¬°üº¬ÎļþÄÚÈÝ£¬»òÕßÔÚʧ°Üʱ·µ»ØNULL

+ */

+char* read_file_to_string_by_line(const char* filename) {

+    FILE *file = fopen(filename, "r");

+    if (file == NULL) 

+	{

+        return NULL;

+    }

+

+    // ÏÈ»ñÈ¡Îļþ´óС

+    fseek(file, 0, SEEK_END);

+    size_t file_size = ftell(file);

+    rewind(file);

+

+    // ·ÖÅä³õʼÄÚ´æ

+    char *buffer = (char*)malloc(file_size + 1);

+    if (buffer == NULL) 

+	{

+        fclose(file);

+        return NULL;

+    }

+

+    char line[256] = {0};

+    char fileds[5][256] = {0}; // ÁÙʱ´æ´¢Ã¿Ò»ÐеÄ×Ö¶Î

+    size_t buffer_size = 0;

+	char *token = NULL;

+	int i = 0;

+

+    // ¶ÁÈ¡µÚÒ»Ðе«²»Ê¹ÓÃ

+    if (fgets(line, sizeof(line), file) != NULL) 

+	{

+

+    }

+

+    while (fgets(line, sizeof(line), file) != NULL) 

+	{

+		if(buffer_size >= file_size)

+		{

+			break;

+		}

+

+        token = strtok(line, " \t");

+        i = 0;

+        while(token != NULL && i < 5) 

+		{

+            strcpy(fileds[i], token);

+            token = strtok(NULL, " \t");

+            i++;

+        }

+        if (i >= 5) 

+		{

+            buffer_size += snprintf(buffer + buffer_size, file_size - buffer_size, "+WLAN_STA:%s,%s,%s,%s\n", fileds[0], fileds[1], fileds[2], fileds[4]);

+        }

+    }

+

+    // È·±£×Ö·û´®ÒÔnullÖÕÖ¹

+    buffer[buffer_size] = '\0';

+

+    fclose(file);

+    return buffer;

+}

+

+int ext_at_wlan_station_func(char *at_paras, void ** res_msg)

+{

+	int count = 0;

+	char scan_finish[4] = {0};

+	char *ap_list = NULL;

+	char *at_str = NULL;

+

+	cfg_set("wifi_sta_connection", "1");

+	cfg_set("scan_finish", "0");

+	cfg_set("EX_APLIST", "");

+	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_WIFI, MSG_CMD_WIFI_STATION_OPEN, 0, NULL, 0);

+	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_WIFI, MSG_CMD_WIFI_STATION_SCAN, 0, NULL, 0);

+

+	while(1)

+	{

+		count++;

+		sleep(1);

+		cfg_get_item("scan_finish", scan_finish, sizeof(scan_finish));

+

+		if(13 == count)

+		{

+			at_str = malloc(128);

+			sprintf(at_str, "\r\n+WLAN_STA\r\nDo no have any station\r\nOK\r\n");

+			*res_msg = at_str;

+			break;

+		}

+

+		if(1 == atoi(scan_finish))

+		{

+			ap_list = read_file_to_string_by_line("/tmp/scan_results");

+			if(NULL == ap_list)

+			{

+				at_str = malloc(128);

+				sprintf(at_str, "\r\n+WLAN_STA\r\nDo no have any station\r\nOK\r\n");

+				*res_msg = at_str;

+				break;

+			}

+			at_str = malloc(strlen(ap_list) + 32);

+			sprintf(at_str, "\r\n%s\r\nOK\r\n", ap_list);

+			*res_msg = at_str;

+			break;

+		}

+	}

+

+	cfg_set("wifi_sta_connection", "0");

+	cfg_save();

+	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_WIFI, MSG_CMD_WIFI_STATION_CLOSE, 0, NULL, 0);

+	free(ap_list);

+

+	return AT_END;

+}

+void ext_notelcom_regist()

+{

+    register_serv_func2("ZWIFI=", MODULE_ID_WIFI, 

+							MSG_CMD_WIFI_SWITCH_REQ, 

+							MSG_CMD_WIFI_SWITCH_RSP, 

+							ext_wifi_switch_req, ext_wifi_operate_rsp);

+    register_serv_func2("ZWSSID=", MODULE_ID_WIFI, 

+							MSG_CMD_WIFI_CFG_SSID_REQ, 

+							MSG_CMD_WIFI_CFG_SSID_RSP, 

+							ext_wifi_cfg_ssid_req, ext_wifi_operate_rsp);

+    register_serv_func2("ZWAUTH=", MODULE_ID_WIFI, 

+							MSG_CMD_WIFI_CFG_PWD_REQ, 

+							MSG_CMD_WIFI_CFG_PWD_RSP, 

+							ext_wifi_cfg_auth_req, ext_wifi_operate_rsp);

+

+

+	register_serv_func2("ZRESET",MODULE_ID_MAIN_CTRL,MSG_CMD_RESET_REQUEST,MSG_CMD_RESTART_RSP,ext_reset_req,ext_restart_rsp);//½ö¹©Éú²ú²âÊÔÓÃ

+	register_serv_func2("ZRESTART=",MODULE_ID_MAIN_CTRL,MSG_CMD_RESTART_REQUEST,MSG_CMD_RESTART_RSP,ext_restart_req,ext_restart_rsp);//ZRESTART=0,0,²ÎÊý1±íʾRESET /RESTART£¬²ÎÊý2±íʾʵ¼ÊÖØÆô²Ù×÷ÊÇ·ñÓɱ¾ºË×Ô¼ºÊµÏÖ

+	register_serv_func("TC_CONTROL=",MODULE_ID_MAIN_CTRL,ext_tc_control_func);

+	register_serv_func("ATV", 0, ext_atv_set_func);

+	register_serv_func("ATQ", 0, ext_atq_set_func);

+	register_serv_func("W", 0, ext_at_w_set_func);

+	register_serv_func("W0", 0, ext_at_w_set_func);

+	register_serv_func("D", 0, ext_at_d0_set_func);

+	register_serv_func("D0", 0, ext_at_d0_set_func);

+	register_serv_func("D1", 0, ext_at_d1_set_func);

+	register_serv_func("D2", 0, ext_at_d2_set_func);

+	register_serv_func("mac_manage=", 0, ext_at_mac_manage_set_func);

+	register_serv_func("wifi_info=", 0, ext_at_wifi_info_set_func);

+	register_serv_func("flag_manage=", 0, ext_at_flag_manage_set_func);

+	register_serv_func("LAN_IP?", 0, ext_at_lan_ip_func);

+	register_serv_func("CC", 0, ext_at_cc_func);

+	register_serv_func("ADC", 0, ext_at_adc_func);

+	register_serv_func("LED", 0, ext_at_led_func);

+	register_serv_func("LCD", 0, ext_at_lcd_func);

+	register_serv_func("BATTERY=?", 0, ext_at_battery_func);

+	register_serv_func("BATTERY?", 0, ext_at_battery_state_func);

+	register_serv_func("WLAN_STA", 0, ext_at_wlan_station_func);

+}

+

+void at_comm_init(void)

+{

+	char nv_atv[8] = {0};

+	char nv_atq[8] = {0};

+	char nv_at_d[8] = {0};

+

+	cfg_get_item("at_atv", nv_atv, sizeof(nv_atv));

+	cfg_get_item("at_atq", nv_atq, sizeof(nv_atq));

+	cfg_get_item("at_at_d", nv_at_d, sizeof(nv_at_d));

+	g_atv = atoi(nv_atv);

+	if(g_atv < 0 || g_atv > 1) { 

+		g_atv = 0;

+	}

+	g_atq = atoi(nv_atq);

+	if(g_atq < 0 || g_atq > 1) { 

+		g_atq = 0;

+	}

+	g_at_d = atoi(nv_at_d);

+	if(g_at_d < 0 || g_at_d > 2) { 

+		g_at_d = 0;

+	}

+	at_print(AT_NORMAL, "atv:%d, atq:%d, at&d:%d \n", g_atv, g_atq, g_at_d);

+}

+

diff --git a/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c b/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
new file mode 100755
index 0000000..57944da
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/ps_normal.c
@@ -0,0 +1,5825 @@
+

+/************************************************************************

+*¹¦ÄܽéÉÜ£ºat_ctlºÍPSÏà¹ØµÄʼþʵÏÖºÍÃüÁî´¦Àí½Ó¿Ú£¬°üÀ¨¿ª»ú×Ô¶¯²¦ºÅµÄʼþÁ÷¡¢web ui¾ßÌåµÄÒµÎñ´¦Àí

+*¸ºÔðÈË£º

+*ÐÞ¸ÄÈÕ£º

+*ÐÞ¸ÄÄÚÈÝ£º

+*°æ±¾ºÅ£º

+************************************************************************/

+

+#include "ps_normal.h"

+#include "ps_pdp.h"

+#include "at_context.h"

+#include <sys/time.h>

+#include <time.h>

+#include <limits.h>

+

+#include "rtc_timer.h"

+#if (APP_OS_TYPE == APP_OS_TOS)

+#include "zctrm_ext_locknet.h"

+#endif

+

+//bsim

+#include <openssl/aes.h>

+

+typedef struct

+{

+	unsigned int pubKeyRsaE[32];

+	unsigned int pubKeyRsaN[32];

+	unsigned int secureFlag;

+	unsigned int pubKeyHash[4];

+	unsigned int secureDevId[3];

+}T_ZDrvEfuse_Secure;

+

+#define EFUSE_IOC_MAGIC 	'E'

+#define EFUSE_GET_DATA 		_IOWR(EFUSE_IOC_MAGIC, 1, char *)

+#define PPPOE_CODE_LEN 		32 //webui limit 30

+

+static unsigned char atctl_aes_key[16] = {0};

+

+#define PROFILE_APN_LEN 65

+#define PROFILE_APN_AES_LEN 129

+

+static int apn_encrypt_code(void);

+static int ipv6apn_encrypt_code(void);

+//bsim end

+

+/*CNUMÉϱ¨*/

+typedef struct

+{

+    char    alpha[80];

+    char    number[80];

+    unsigned char  type;

+} T_zAt_CnumRes;

+

+struct time_info{

+	SINT32 time_zone;

+	SINT32 sav_time;

+	char univer_time[64];

+};

+

+//extern AT_PDP_ACT_REQ_INFO * g_pdp_set_info;

+psnormal_state psinfo={0};

+static T_zAt_Zsec_Res g_LockZsec = {0};

+static int cfun_state=0;//ÓÃÓÚ±ê¼Çcfun״̬

+static int g_plmnLen = 5;//ccmnc³¤¶È

+static char mccNum[10] 		= {0};

+static char mncNum[10] 		= {0};

+static int g_zUfi_Mode=-1;//ModeÉϱ¨±ä»¯£¬Óбä³É²Å²éѯSysinfo

+static int g_zUfi_SubMode=-1;//ModeÉϱ¨±ä»¯£¬Óбä³É²Å²éѯSysinfo

+static int g_zUfi_Stat=-1;//CEREG\CREG\CGREG±ä»¯£¬Óб仯²Å²éѯSysinfo

+static int g_isSearchingNetwork = FALSE;

+static int g_zUfi_canPdpDail = TRUE;

+static int g_zUfi_firstCsq = TRUE;

+static char *crsmrsp=NULL;//ÓÃÓڼǼcrsm»Ø¸´½á¹û

+static char *mactozssid=NULL;//¼Ç¼ÊÕµ½µÄMACµØÖ·

+static BOOL g_SimSlotFlag = TRUE;//¼Ç¼sim¿¨²åÈë°Î³ö״̬

+static int sysinfo_flag = 0;

+int g_modem_model = 0;

+int g_support_sms = 0;

+int g_support_pb = 0;

+int g_smspb_init = 0;//Éϱ¨pbÍê³É³õʼ»¯±êÖ¾ 0:δÉϱ¨ 1:ÒÑÉϱ¨

+int g_need_smspb_init = 0;//smsºÍpbÊÇ·ñ¿ÉÒÔ½øÐгõʼ»¯£¬Ã¿´Î¿ª»ú½öÄܽøÐÐÒ»´Î³õʼ»¯²Ù×÷£¬ÖÃΪ0ʱ±íʾ¿ÉÒÔ³õʼ»¯£¬Ò»µ©³õʼ»¯ºó£¬ÖÃΪ1

+#if (APP_OS_TYPE == APP_OS_TOS)

+extern T_zCtrm_LockListPara simLockListPara;

+extern T_zCtrm_SIMPara simPara;

+extern SINT32 g_Sec_Status;

+extern int crsm_reason;

+#endif

+extern struct defcid_mng_t g_defcid_mng;

+char imsi[50] = {0};

+//zdm ÇëÕ×·áÈ·ÈÏÊÇ·ñÐèҪͬ²½µ½AP²à

+//ºóÐøÓÃËøÍøÌæ´ú£¬ÆÕͨ°æ±¾²»Ëø

+char* zurdy_convert_cmd(void *msg,struct at_context *context)

+{   

+    char *at_str = NULL;

+    

+    at_str = (char *)malloc(20);

+    if(at_str == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    strcpy(at_str, "AT+ZSCHPLMN=1\r\n");

+    return at_str;

+}

+

+int zmmi_auto_act(char *at_paras ,int is_query_report)

+{

+	

+	char mode[10] = {0};

+	struct time_info timeinfo = {0};

+	struct tm set_tm = {0};

+	struct timeval time_tv = {0};

+	char temp1[256] = {0};

+	char temp2[256] = {0};

+	void *p[5] = {&timeinfo.time_zone,&timeinfo.sav_time,temp1,temp2,timeinfo.univer_time};

+	int time_zone = 0;

+	

+    cfg_get_item("sntp_time_set_mode", mode, sizeof(mode));

+	if(strcmp(mode, "manual") == 0)

+	{

+		at_print(AT_ERR,"zmmi_auto_act: do not need to nitz \n");

+		return AT_END;

+	}

+	parse_param2("%d,%d,%256s,%256s,%64s", at_paras, p);

+	time_zone = timeinfo.time_zone;// / 4;time_zoneµÄ¼ÆË㷽ʽ²»¶Ô£¬Èç¹ûÊ±ÇøÊÇ+22µÄ»°£¬¾Í»á¶ªÊ§0.5£¬¸Äµ½ÏÂÃæ³ý

+	set_tm.tm_isdst = timeinfo.sav_time;

+	if(0 == strlen(timeinfo.univer_time))

+	{

+		at_print(AT_ERR,"zmmi_auto_act,univer_time invalid");

+		return AT_END;

+	}

+	sscanf(timeinfo.univer_time,"%2d/%2d/%2d,%2d:%2d:%2d",&set_tm.tm_year,

+		&set_tm.tm_mon,&set_tm.tm_mday,&set_tm.tm_hour,&set_tm.tm_min,&set_tm.tm_sec);

+	

+	at_print(AT_ERR, "zmmi_auto_act, year:%d, month:%d, day:%d, hour:%d, min:%d, sec:%d, wday:%d \n", 

+		set_tm.tm_year, set_tm.tm_mon, set_tm.tm_mday, set_tm.tm_hour, set_tm.tm_min, set_tm.tm_sec, set_tm.tm_wday);

+

+	if(set_tm.tm_year < 0 || set_tm.tm_year > INT_MAX-1) // kw 3

+	{

+		set_tm.tm_year = 0;

+	}

+

+	if(set_tm.tm_mon < 0 || set_tm.tm_mon > INT_MAX-1)

+	{

+		set_tm.tm_mon = 0;

+	}

+

+		

+	set_tm.tm_year = set_tm.tm_year + 100;

+	set_tm.tm_mon = set_tm.tm_mon - 1;	

+

+	time_tv.tv_sec = mktime(&set_tm);

+	time_tv.tv_sec = time_tv.tv_sec +	time_zone * 3600 /4;

+		

+	

+	if (0 != settimeofday(&time_tv,NULL))

+	{

+		at_print(AT_ERR,"zmmi_auto_act,set time of system wrong");

+		return AT_END;

+	}

+	rtc_set_time(MODULE_ID_AT_CTL);

+	return AT_END;

+}

+

+char* normal_getsysconfigread()

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+    sprintf(at_next,"AT^SYSCONFIG?\r\n");

+	return at_next;

+}

+

+/***********atÃüÁî»ñÈ¡****************/

+//pin/pukÂëÊ£Óà´ÎÊý²éѯÃüÁî

+char* normal_getzrapread()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+	if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+ZRAP?\r\n");

+	return at_next;

+}

+

+//pinÂë²éѯÃüÁî

+char* normal_getcpinread()

+{

+    char *at_next=NULL;

+    at_next=malloc(16);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,16);

+	sprintf(at_next,"AT+CPIN?\r\n");

+	return at_next;

+}

+

+//pinÂëÉèÖÃÃüÁî

+char* normal_getcpinset(char *pin)

+{

+    if(pin == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	sprintf(at_next,"AT+CPIN=\"%s\"\r\n",pin);

+	return at_next;

+}

+

+//½âpukÂëÃüÁî

+char* normal_getcpukset(char *puk,char *newpin)

+{

+    if(puk == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	sprintf(at_next,"AT+CPIN=\"%s\",\"%s\"\r\n",puk,newpin);

+	return at_next;

+}

+

+//IMEIºÅ»ñÈ¡ÃüÁî

+char* normal_getcgsn()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+CGSN\r\n");

+	return at_next;

+}

+

+//ZICCID»ñÈ¡

+char* normal_getziccid()

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	sprintf(at_next,"AT+ZICCID?\r\n");

+	return at_next;

+}

+

+//ÉèÖÃÓÐÏÞSIM¿¨·ÃÎÊ£¬µ±Ç°×÷ÓÃÖ÷ÒªÊÇ»ñÈ¡PLMNµÄλÊý

+char* normal_getcrsmset(char *param)

+{

+    if(param == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	sprintf(at_next,"AT+CRSM=%s\r\n",param);

+	return at_next;

+}

+

+//IMSIºÅ»ñÈ¡

+char* normal_getcimi()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+CIMI\r\n");

+	return at_next;

+}

+

+//Óû§ºÅÂë»ñÈ¡£¬Ä¿Ç°·µ»ØµÄ¶àΪERROR

+char* normal_CnumRead()

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	sprintf(at_next,"AT+CNUM\r\n");

+    if(AT_CMD_MAX <= strlen(at_next)){softap_assert("");}

+	return at_next;

+}

+

+/*¸ù¾Ýµ±Ç°NVÖµ,·µ»ØsysconfigÉèÖÃÃüÁî*/

+char* normal_getsysconfigset()

+{

+    char *at_next=NULL;

+    int mode = ZAT_SYSCONFIG_MODE_AUTO;

+    int acqorder = ZAT_SYSCONFIG_PREF_ACQ_AUTO;

+	int roam = 1;

+    normal_getsysconfigsetParam(&mode, &acqorder, &roam);

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+    sprintf(at_next,"AT^SYSCONFIG=%d,%d,%d,2\r\n", mode, acqorder, roam);

+	return at_next;

+}

+

+/*¸ù¾Ýµ±Ç°NVÖµ,·µ»Øcgdcont PDPÉÏÏÂÎÄÉèÖÃÃüÁî*/

+char* normal_getcgdcontset(int cid)

+{

+    char *at_next=NULL;

+    char strPdptype[10] = {0};

+    char strAPN[APN_MAX_LEN] = {0};

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+    at_print(AT_DEBUG,"normal_getcgdcontset cid=%d\n",cid);

+    //ÉèÖÃipv4v6µÄÖ§³Ö

+    cfg_get_item(NV_PDP_TYPE,strPdptype,sizeof(strPdptype));

+    cfg_get_item(NV_WAN_APN,strAPN,sizeof(strAPN)); 

+    if(strcmp("IPV6", strPdptype) == 0 || strcmp(strPdptype,"IPv6") == 0)

+    {

+        strncpy(strPdptype, "IPV6",sizeof(strPdptype)-1);

+        cfg_get_item(NV_IPV6_WAN_APN,strAPN,sizeof(strAPN)); 

+    }

+    else if(strcmp(strPdptype,"IPV4V6") == 0 || strcmp(strPdptype,"IPv4v6") == 0)

+    {

+        strncpy(strPdptype, "IPV4V6",sizeof(strPdptype)-1);

+        cfg_get_item(NV_IPV6_WAN_APN,strAPN,sizeof(strAPN)); 

+    }

+    sprintf(at_next,"AT+CGDCONT=%d,\"%s\",\"%s\"\r\n", cid, strPdptype, strAPN);

+    return at_next;

+}

+

+/*¸ù¾Ýµ±Ç°NVÖµ,·µ»Øzgpcoauth¼øÈ¨ÉèÖÃÃüÁî*/

+char* normal_getzgpcoauthset(int cid)

+{

+    char *at_next=NULL;

+    char strAuthtype[10]             = {0};

+    char strPdptype[20 ]  = {0};

+    char strUsename[PDP_AUTH_USER_PWD_LENGTH]  = {0};

+    char strPawd[PDP_AUTH_USER_PWD_LENGTH] = {0};

+    int auth_type = -1;

+    at_print(AT_DEBUG,"normal_getzgpcoauthset cid=%d\n",cid);

+

+    cfg_get_item(NV_PDP_TYPE,strPdptype,sizeof(strPdptype));

+    

+    if(strcmp("IPV6", strPdptype) == 0 || strcmp(strPdptype,"IPv6") == 0)

+    {

+        cfg_get_item(NV_IPV6_PPP_AUTH_MODE,strAuthtype,sizeof(strAuthtype));

+    	cfg_get_item(NV_IPV6_PPP_USERNAME,strUsename,sizeof(strUsename));

+    	cfg_get_item(NV_IPV6_PPP_PASSWD,strPawd,sizeof(strPawd));

+    

+    }

+    else if(strcmp(strPdptype,"IPV4V6") == 0 || strcmp(strPdptype,"IPv4v6") == 0)

+    {

+        cfg_get_item(NV_IPV6_PPP_AUTH_MODE,strAuthtype,sizeof(strAuthtype));

+    	cfg_get_item(NV_IPV6_PPP_USERNAME,strUsename,sizeof(strUsename));

+    	cfg_get_item(NV_IPV6_PPP_PASSWD,strPawd,sizeof(strPawd));

+    }

+    else 

+    {

+

+        cfg_get_item(NV_PPP_AUTH_MODE,strAuthtype,sizeof(strAuthtype));

+        cfg_get_item(NV_PPP_USERNAME,strUsename,sizeof(strUsename));

+        cfg_get_item(NV_PPP_PASSWD,strPawd,sizeof(strPawd));

+    }

+    auth_type = normal_getauthtype(strAuthtype);

+

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+    sprintf(at_next,"AT+ZGPCOAUTH=%d,\"%s\",\"%s\",%d\r\n", cid, strUsename, strPawd, auth_type);

+    return at_next;

+}

+

+

+char* normal_getcfunset(char *cmdtype)

+{

+    char *at_next=NULL;

+

+    at_next=malloc(128);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,128);

+    if(cmdtype != ZUFI_NULL)//ÅжÏÊÇ¿ªÉ䯵»¹ÊǽøÈë·ÉÐÐģʽ²Ù×÷

+    {  

+        if(memcmp(cmdtype, ZAT_POWEROFF, strlen(ZAT_POWEROFF)) == 0)

+        {

+            cfun_state=0;

+        }

+        else if(memcmp(cmdtype, ZAT_AIRMODE, strlen(ZAT_AIRMODE)) == 0)

+        {

+            cfun_state=4;

+			cfg_set(NV_NETWORK_TYPE, "No Service");

+			cfg_set(NV_SUB_NETWORK_TYPE, "No Service");

+        }

+        else

+        {

+            cfun_state=1;

+        }

+    }

+	else

+	{

+        cfun_state=1;	

+	}

+	if(cfun_state == 1)

+    {   	    

+	   	sprintf(at_next,"AT+ZSCHPLMN=1;+CFUN=%d\r\n",cfun_state);

+    }

+	else

+	    sprintf(at_next,"AT+CFUN=%d\r\n",cfun_state);

+	cfg_set("cfun_work", "work");

+	return at_next;

+}

+

+//ÉèÖÃCGREGÖ÷¶¯Éϱ¨

+char* normal_getcgregset(char *param)

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	sprintf(at_next,"AT+CGREG=%s\r\n",param);

+	return at_next;

+}

+

+//ÉèÖÃCEREGÖ÷¶¯Éϱ¨

+char* normal_getceregset(char *param)

+{

+    char *at_next=NULL;

+    at_next=malloc(16);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,16);

+	sprintf(at_next,"AT+CEREG=%s\r\n",param);

+	return at_next;

+}

+

+//×Ô¶¯ËÑÍø»òÊÖ¶¯ËÑÍøÉèÖÃ

+char* normal_getcopsset(int paramnum,...)

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+    va_list ap;    

+    va_start(ap, paramnum);

+    if(paramnum==1)

+    {

+        sprintf(at_next,"AT+COPS=%s\r\n",va_arg(ap,char*));//ÉèÖÃÑ¡ÍøÄ£Ê½£¬Ò»°ã²ÎÊýÖÃΪ0£¬±íʾ×Ô¶¯ËÑÍø

+    }

+    else if(paramnum==2)

+    {

+        sprintf(at_next,"AT+COPS=1,2,\"%s\",%d\r\n",va_arg(ap,char*),va_arg(ap,int));//ÊÖ¶¯ËÑÍøÉèÖ㬲»Ð¯´ø×ÓÖÆÊ½

+    }

+    else if(paramnum==3)

+    {

+        sprintf(at_next,"AT+COPS=1,2,\"%s\",%d,%d\r\n",va_arg(ap,char*),va_arg(ap,int),va_arg(ap,int));	//ÊÖ¶¯ËÑÍøÉèÖã¬Ð¯´ø×ÓÖÆÊ½

+    }

+    else

+    {

+    	free(at_next);

+		va_end(ap);

+        return NULL;

+    }

+    va_end(ap);

+    at_print(AT_DEBUG,"normal_getcopsset %s!\n",at_next);

+    return at_next;

+}

+

+//ÊÖ¶¯ËÑÍøÊ±£¬»ñÈ¡µ±Ç°ÍøÂçÖдæÔÚµÄÔËÓªÉÌÁбí

+char* normal_getcopstest()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+COPS=?\r\n");

+	return at_next;

+}

+

+//·µ»Øµ±Ç°µÄÍøÂçģʽ

+char* normal_getcopsread()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+COPS?\r\n");

+	return at_next;

+}

+

+//²éѯÐźÅÇ¿¶È

+char* normal_getcsq()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+CSQ\r\n");

+    cfg_set(NV_CSQ_DONE, "1");

+	return at_next;

+}

+

+//²éѯÈí¼þÄÚ²¿°æ±¾ºÅÃüÁî

+char* normal_getzversion()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT^ZVERSION\r\n");

+	return at_next;

+}

+

+//ÉèÖÃʱ¼äÃüÁî

+char* normal_getsyctimeset(long sec,long usec)

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+    sprintf(at_next,"AT+SYCTIME=%ld,%ld\r\n",sec,usec);

+    return at_next;

+}

+

+//ÉèÖÃmtnet²âÊÔÃüÁî

+char* normal_getmtnetset(char *mcc)

+{

+    char *at_next=NULL;

+	char mcc_list[256] = {0};

+	

+    cfg_get_item("mtnet_test_mcc", mcc_list, sizeof(mcc_list));

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	if(strlen(mcc_list) > 3 && mcc && strlen(mcc) == 3 && strstr(mcc_list,mcc) != NULL)

+	{

+		sprintf(at_next,"AT+ZSET=\"MTNET_TEST\",1\r\n");

+	}

+	else

+	{

+		sprintf(at_next,"AT+ZSET=\"MTNET_TEST\",0\r\n");

+	}

+    return at_next;

+}

+

+//¶ÁÈ¡°åºÅ(Ŀǰ½á¹ûΪ¿Õ£¬ÊÇ·ñÊDZØÐëÃüÁî??)

+char* normal_getboardnumread()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+BOARDNUM?\r\n");

+	return at_next;

+}

+

+//ϵͳÐÅÏ¢»ñÈ¡

+char* normal_getsysinfo()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT^SYSINFO\r\n");

+	return at_next;

+}

+

+//USSDÈ¡ÏûÃüÁî

+char* normal_getcusdset_clean()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+CUSD=2\r\n");

+	return at_next;

+}

+

+//USSD·¢ËÍÃüÁî

+char* normal_getcusdset(char *param)

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	sprintf(at_next,"AT+CUSD=1,\"%s\",15\r\n",param);

+	return at_next;

+}

+

+char* normal_getclckset(int paramnum,...)

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+    va_list ap;    

+    va_start(ap, paramnum);

+    if(paramnum==2)//²éѯµ±Ç°SIM¿¨×´Ì¬

+    {

+        sprintf(at_next,"AT+CLCK=\"%s\",%d\r\n",va_arg(ap,char*),va_arg(ap,int));

+    }

+    else if(paramnum==3)//¹Ø±Õ»òÕß´ò¿ªPINÂ빦ÄÜ

+    {

+        sprintf(at_next,"AT+CLCK=\"%s\",%d,\"%s\"\r\n",va_arg(ap,char*),va_arg(ap,int),va_arg(ap,char*));

+    }

+    else

+    {

+    	free(at_next);

+		va_end(ap);

+        return NULL;

+    }

+    va_end(ap);

+    return at_next;

+}

+

+char* normal_getcpwdset(char *type,char *oldPin,char *newPin)

+{

+    char *at_next=NULL;

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+	sprintf(at_next,"AT+CPWD=\"%s\",\"%s\",\"%s\"\r\n",type,oldPin,newPin);

+	return at_next;

+}

+

+char* normal_getmacread()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+MAC?\r\n");

+	return at_next;

+}

+

+char* normal_getmac2read()

+{

+    char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+MAC2?\r\n");

+	return at_next;

+}

+

+//LTEËøÆµ,δʹÓÃ

+char *normal_getzltelcset()

+{

+    char *at_next=NULL;

+    T_zAt_ZltelcPara zltelcPara = {0};

+    char actionLte[30] = {0};

+    char uarfcnLte[30] = {0};

+    char cellPara[30] = {0};

+    at_next=malloc(AT_CMD_MAX);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,AT_CMD_MAX);

+    cfg_get_item(NV_ACTIONLTE,actionLte,sizeof(actionLte));

+    cfg_get_item(NV_UARFCNLTE,uarfcnLte,sizeof(uarfcnLte));

+	cfg_get_item(NV_CELLPARAIDLTE,cellPara,sizeof(cellPara));

+    zltelcPara.actionlte        = atoi(actionLte);

+    zltelcPara.uarfcnlte        = atoi(uarfcnLte);

+    zltelcPara.cellParaIdlte    = atoi(cellPara); 

+    sprintf(at_next,"AT+ZLTELC=%d,%d,%d\r\n", (int)zltelcPara.actionlte, (int)zltelcPara.uarfcnlte, (int)zltelcPara.cellParaIdlte); 

+    return at_next;

+}

+/***********atÃüÁî»ñÈ¡****************/

+//»ñÈ¡cidʱÐè´«Èëpdpsetinfo

+int normal_getcurparam(struct pdp_act_req *pdpsetinfo)

+{

+    char strPdptype[10] = {0};

+    char strAPN[APN_MAX_LEN] = {0};

+    //pdpsetinfo->pdp_type=PDP_NORMAL;

+    

+    cfg_get_item(NV_PDP_TYPE,strPdptype,sizeof(strPdptype));

+    cfg_get_item(NV_WAN_APN,strAPN,sizeof(strAPN)); 

+    if(strcmp("IPV6", strPdptype) == 0 || strcmp(strPdptype,"IPv6") == 0)

+    {

+        strncpy(strPdptype, "IPV6",sizeof(strPdptype)-1);

+        cfg_get_item(NV_IPV6_WAN_APN,strAPN,sizeof(strAPN)); 

+    }

+    else if(strcmp(strPdptype,"IPV4V6") == 0 || strcmp(strPdptype,"IPv4v6") == 0)

+    {

+        strncpy(strPdptype, "IPV4V6",sizeof(strPdptype)-1);

+        cfg_get_item(NV_IPV6_WAN_APN,strAPN,sizeof(strAPN)); 

+    }

+    strncpy(pdpsetinfo->comm_info.apn,strAPN,sizeof(pdpsetinfo->comm_info.apn)-1);

+    strncpy(pdpsetinfo->comm_info.ip_type,strPdptype,sizeof(pdpsetinfo->comm_info.ip_type)-1);

+    at_print(AT_DEBUG,"normal_getcurparam apn=%s,apntype=%s\n",pdpsetinfo->comm_info.apn,pdpsetinfo->comm_info.ip_type);

+    

+    char strAuthtype[10]             = {0};

+    char strUsename[PDP_AUTH_USER_PWD_LENGTH]  = {0};

+    char strPawd[PDP_AUTH_USER_PWD_LENGTH] = {0};

+    if(strcmp("IPV6", strPdptype) == 0 || strcmp(strPdptype,"IPv6") == 0)

+    {

+        cfg_get_item(NV_IPV6_PPP_AUTH_MODE,strAuthtype,sizeof(strAuthtype));

+        cfg_get_item(NV_IPV6_PPP_USERNAME,strUsename,sizeof(strUsename));

+        cfg_get_item(NV_IPV6_PPP_PASSWD,strPawd,sizeof(strPawd));

+        

+    }

+    else if(strcmp(strPdptype,"IPV4V6") == 0 || strcmp(strPdptype,"IPv4v6") == 0)

+    {

+        cfg_get_item(NV_IPV6_PPP_AUTH_MODE,strAuthtype,sizeof(strAuthtype));

+        cfg_get_item(NV_IPV6_PPP_USERNAME,strUsename,sizeof(strUsename));

+        cfg_get_item(NV_IPV6_PPP_PASSWD,strPawd,sizeof(strPawd));

+    }

+    else 

+    {

+        

+        cfg_get_item(NV_PPP_AUTH_MODE,strAuthtype,sizeof(strAuthtype));

+        cfg_get_item(NV_PPP_USERNAME,strUsename,sizeof(strUsename));

+        cfg_get_item(NV_PPP_PASSWD,strPawd,sizeof(strPawd));

+    }

+    pdpsetinfo->comm_info.auth_type = normal_getauthtype(strAuthtype);

+    strncpy(pdpsetinfo->comm_info.username,strUsename,sizeof(pdpsetinfo->comm_info.username)-1);

+    strncpy(pdpsetinfo->comm_info.password,strPawd,sizeof(pdpsetinfo->comm_info.password)-1);

+    at_print(AT_DEBUG,"normal_getcurparam authtype=%d,user=%s,psw=%s\n",pdpsetinfo->comm_info.auth_type,pdpsetinfo->comm_info.username,pdpsetinfo->comm_info.password);

+    return 0;

+}

+

+DbResult noraml_dbopen(char *filename, sqlite3**pDb)

+{

+	//zdm tosÁ¬½Ó²»¹ý

+	#if (APP_OS_TYPE == APP_OS_LINUX)

+    sqlite3* pTmpDb = NULL;

+    if(NULL == pDb)

+    {

+        at_print(AT_ERR,"noraml_dbopen:invalide inputs.");/*lint  !e26*/

+        return DB_ERROR_INVALIDPTR;

+    }

+    at_print(AT_DEBUG,"noraml_dbopen:sqlite3_open call");/*lint  !e26*/

+    if(sqlite3_open(filename, &pTmpDb))

+    {

+        at_print(AT_DEBUG,"noraml_dbopen:can not open db,sqlite3_errmsg:%s.",sqlite3_errmsg(pTmpDb));

+        (VOID) sqlite3_close(pTmpDb);

+        return DB_ERROR_NOTOPENDB;

+    }

+    *pDb = pTmpDb;

+	#else

+    softap_assert("");

+	#endif

+	

+    return DB_OK;

+}

+

+DbResult normal_dbclose(sqlite3 *pDb)

+{

+	#if (APP_OS_TYPE == APP_OS_LINUX)

+	

+    if(sqlite3_close(pDb))

+    {

+        at_print(AT_ERR,"normal_dbclose:can not close db");/*lint  !e26*/

+        return DB_ERROR;

+    }

+	#else

+		softap_assert("");

+	#endif

+    return DB_OK;

+}

+

+DbResult normal_execdbsql(char *filename, const char *pSql, sqlite3_callback callback,VOID *pFvarg)

+{

+    sqlite3 *pDb = NULL;

+    char dbErrMsg[128] = {0};

+	#if (APP_OS_TYPE == APP_OS_LINUX)

+    

+    if(DB_OK != noraml_dbopen(filename, &pDb))

+    {

+        at_print(AT_ERR,"normal_execdbsql:open pbm.db failed.");

+        return DB_ERROR_NOTOPENDB;

+    }

+    at_print(AT_DEBUG,"normal_execdbsql:atPb_ExecDbSql:%s\n",pSql);

+    if(sqlite3_exec(pDb,pSql,callback,pFvarg,NULL))

+    {

+        strncpy(dbErrMsg,sqlite3_errmsg(pDb),sizeof(dbErrMsg)-1);

+        at_print(AT_ERR,"normal_execdbsql:can not exec sql,sqlite3_errmsg:%s.",dbErrMsg);

+        (VOID)sqlite3_close(pDb);

+        return DB_ERROR;

+    }

+    (VOID)normal_dbclose(pDb);

+	#else

+		softap_assert("");

+	#endif

+    return DB_OK;

+}

+

+int normal_count_callback(void *fvarg,int line,char **zresult,char **lname)

+{

+	if(1 > line)

+	{

+		at_print(AT_DEBUG,"atBase:record no data.");

+		return -1;

+	}

+	*(int*)fvarg = atoi(zresult[0]);

+	return 0;

+}

+

+/*¸ù¾ÝÉ豸ÐͺźÍplmn,²éѯlocknet.db*/

+int normal_islocknetwhitelist(char *pmodel, char *pplmn)

+{

+    char sql[128] = {0};

+	int lcount = 0;

+    int result = DB_OK;

+    

+    snprintf(sql,128-1,"select count(*) from net_list where product_model=\'%s\' and plmn=\'%s\'", pmodel, pplmn);

+    result = normal_execdbsql(ZLOCKNET_DB_PATH, sql, normal_count_callback, &lcount);

+    if(DB_OK != result)

+    {

+        at_print(AT_DEBUG,"atBase_isLockNetWhiteList error:%d !\n", result); 

+        return -1;

+    }

+    if(lcount > 0)

+    {

+        at_print(AT_DEBUG,"atBase_isLockNetWhiteList succ:%d !\n", lcount); 

+		return 0;

+	}

+	at_print(AT_DEBUG,"atBase_isLockNetWhiteList not int list:%d, model:%s, plmn:%s !\n", lcount, pmodel, pplmn); 

+    return -1;

+}

+

+/*ËøÍø¼ì²â*/

+BOOL normal_locknetmatch(const char* mcc, const char* mnc)

+{

+	char plmn[LOCK_NET_PLMN_LEN] = {0};

+	char product_model[LOCK_NET_PLMN_LEN] = {0};

+	char useLockNet[10] = {0};

+	snprintf(plmn, LOCK_NET_PLMN_LEN-1, "%s%s", mcc, mnc);

+	cfg_get_item("product_model", product_model, sizeof(product_model));

+    cfg_get_item("use_lock_net", useLockNet, sizeof(useLockNet));

+	if(0 == strcmp("yes", useLockNet))

+	{

+		if(normal_islocknetwhitelist(product_model, plmn) == 0)

+		{

+			return TRUE;

+		}

+		return FALSE;

+	}

+	else

+	{

+		return TRUE;

+	}	

+}

+

+/*Ñ¡ÔñÓëwebui NVÅäÖÃÒ»ÖµÄsysconfig²ÎÊý*/

+int normal_getsysconfigsetParam(int *mode, int *acqOrder, int *roam)

+{

+    long  i                           = 0;

+    char    netSelect[20]  = {0};

+    char    modeSelect[20] = {0};

+    long  tableSize                   = sizeof(G_ZAT_SYSCONFIG_CFGPARA_SET)/sizeof(T_zAt_SysConfigParaSet);

+	char needTds[50] = {0};

+    char needGsm[50] = {0};

+    char roamSet[10] = {0};

+    

+    cfg_get_item(NV_NET_SELECT,netSelect,sizeof(netSelect));

+    cfg_get_item(NV_PRE_MODE,modeSelect,sizeof(modeSelect));

+    cfg_get_item(NV_NETWORK_NEED_TDS,needTds,sizeof(needTds));

+    cfg_get_item(NV_NETWORK_NEED_GSM,needGsm,sizeof(needGsm));

+    cfg_get_item(NV_ROAM_SETTING_OPTION,roamSet,sizeof(roamSet));

+	at_print(AT_DEBUG,"atBase_AtSysconfigSet:netSelect:%s! modeSelect:%s roamSet:%s.\n",netSelect,modeSelect,roamSet);

+    if(0 == strcmp(roamSet, "on"))

+	{

+		*roam = 1;

+	}

+	else if(0 == strcmp(roamSet, "off"))

+	{

+		*roam = 0;

+	}

+	else

+	{

+		*roam = 2;

+	}

+    if(0 == strcmp(netSelect, "NETWORK_auto"))  

+    {

+        if(0 == strcmp(modeSelect, "LTE_TD_pre"))

+        {

+            *mode       = ZAT_SYSCONFIG_MODE_GSM_TD_LTE;

+            *acqOrder   = ZAT_SYSCONFIG_PREF_ACQ_LTEPRE;

+            return TRUE;

+        }

+        else if(0 == strcmp(modeSelect, "TD_GSM_pre"))

+        {

+            *mode       = ZAT_SYSCONFIG_MODE_GSM_TD_LTE;

+            *acqOrder   = ZAT_SYSCONFIG_PREF_ACQ_TDPRE;

+            return TRUE;

+        }

+		else if(0 == strcmp(modeSelect, "")) 

+        {        	

+			char auto_acqorder[50] = {0};

+        	

+			cfg_get_item("auto_acqorder",auto_acqorder,sizeof(auto_acqorder));

+

+			//Óû§Ñ¡Ôñ×Ô¶¯ËÑÍø£¬Ê¹ÓÃNV±£´æµÄÍøÂç½ÓÈë´ÎÐò£¬¸ÃNVÓ¦ÔÚ°æ±¾¿ª»úµÚÒ»´Î±£´æÆðÀ´ÁË

+			if(0 == strlen(auto_acqorder))

+			{

+				//softap_assert("");

+				at_print(AT_ERR,"normal_getsysconfigsetParam auto_acqorder null\n");

+			}

+			*mode       = ZAT_SYSCONFIG_MODE_AUTO;

+            *acqOrder   = atoi(auto_acqorder);

+#if 0

+			if((strcmp("yes", needTds) == 0) && (strcmp("yes", needGsm) == 0))

+			{

+				*mode       = ZAT_SYSCONFIG_MODE_AUTO;

+                *acqOrder   = ZAT_SYSCONFIG_PREF_ACQ_AUTO;

+			}

+			else if(strcmp("yes", needGsm) == 0)

+			{

+				*mode       = ZAT_SYSCONFIG_MODE_W_GSM_LTE;

+                *acqOrder   = ZAT_SYSCONFIG_PREF_ACQ_AUTO;

+			}

+			else if(strcmp("yes", needTds) == 0)

+			{

+				*mode       = ZAT_SYSCONFIG_MODE_TD_W_LTE;

+                *acqOrder   = ZAT_SYSCONFIG_PREF_ACQ_AUTO;

+			}

+			else

+			{

+				*mode       = ZAT_SYSCONFIG_MODE_WCDMA_LTE;

+                *acqOrder   = ZAT_SYSCONFIG_PREF_ACQ_LTE_W_GSM;

+			}			

+            return TRUE;

+#endif

+        }

+        else

+        {

+            at_print(AT_DEBUG,"atBase_AtSysconfigSet Value Is not support!\n");

+            return FALSE;

+        }

+    }

+    else

+    {

+        for(i = 0; i < tableSize; i++)

+        {

+            if( 0 ==  strcmp(G_ZAT_SYSCONFIG_CFGPARA_SET[i].netselect, netSelect))

+            {

+                *mode       = G_ZAT_SYSCONFIG_CFGPARA_SET[i].modeValue;

+                *acqOrder   = G_ZAT_SYSCONFIG_CFGPARA_SET[i].acqOrder;

+                

+                at_print(AT_DEBUG,"atBase_AtSysconfigSet:mode:%d/acqOrder:%d.\n",*mode,*acqOrder);

+                return TRUE;

+            }

+        }

+        at_print(AT_DEBUG,"atBase_AtSysconfigSet Error\n");

+        return FALSE;

+    }

+	return FALSE;

+}

+

+int normal_getauthtype(char* pAuthType)

+{

+

+	if(strcmp(PDP_AUTH_TYPE_PAP, pAuthType) == 0 || strcmp("PAP", pAuthType) == 0)

+	{

+		return PAP_AUTH;

+	}

+	else if(strcmp(PDP_AUTH_TYPE_CHAP, pAuthType) == 0 || strcmp("CHAP", pAuthType) == 0)

+	{

+		return CHAP_AUTH;

+	}

+	else if(strcmp(PDP_AUTH_TYPE_PAP_CHAP, pAuthType) == 0)

+	{

+		return PAP_CHAP_AUTH;

+	}

+

+	return NONE_AUTH;

+}

+

+

+//10Ãë²é´ÎÐźţ¬pdpÖØ²¦Ê±ÑÓ0S,5S,10S,10S...

+VOID  *normal_pdptimeractstart(VOID *arg)

+{

+    static UINT32  iCount = 0;

+    iCount++;

+    if(iCount%10 == 0)

+    {

+        char csqDone[50]={0};

+        char networkType[50]={0};

+        cfg_get_item(NV_CSQ_DONE,csqDone,sizeof(csqDone));

+        cfg_get_item(NV_NETWORK_TYPE,networkType,sizeof(networkType));

+        if(0==strcmp("1",csqDone)&&strcmp("No Service",networkType))

+        {   

+            cfg_set(NV_CSQ_DONE, "0");

+            if(0!=ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_AT_CTL,MSG_CMD_QUERY_CSQ_REQ, 0, NULL,04000))

+            {

+                cfg_set(NV_CSQ_DONE, "1");

+            }

+        }	

+    }

+    return ZUFI_NULL;

+}

+

+void normal_cfunOkSet()

+{

+#if(APP_OS_TYPE == APP_OS_TOS)

+	softap_assert("");

+#else 

+    /*´´½¨¶¨Ê±PDPÔÚÏß¶¨Ê±Æ÷*/

+    CreateSoftTimer(PdpTimerID,

+                        TIMER_FLAG_RESTART,

+                        PdpTimer_INTERVAL,

+                        normal_pdptimeractstart,

+                        NULL);

+#endif   

+}

+

+void* normal_copstimeractstart(VOID *arg)

+{

+    static UINT32  iCount = 0;

+    iCount++;

+    if(iCount>=2)

+    {

+        at_print(AT_DEBUG,"normal_copstimeractstart Timeout!\n");

+        struct at_context * context = context_head[NEAR_PS];

+        char at_str[AT_CMD_MAX]="AT\r\n";//¸ù¾Ýmsg_bufÉú³ÉatÖжÏÃüÁÍõÕ׷ḺÔð

+        for(;context;context = context->next)

+        {

+            if(context->context_type == AT_CLIENT && 0 == at_strcmp(context->at_cmd_prefix,"COPS=?"))

+            {

+                at_print(AT_DEBUG,"normal_copstimeractstart write AT!\n");

+                write(context->at_channel->at_fd,at_str, strlen(at_str));//for cov ¶¨Ê±Æ÷Àï²»ÄÜÓÐsleep

+                //at_write(context->at_channel->at_fd,at_str, strlen(at_str));//·¢ËÍÖÕÖ¹at£¬ÍõÕ׷ḺÔðÌîд¾ßÌåµÄat_stlÈ¡ÏûÃüÁî

+            }

+        }

+        iCount=0;

+    }

+    cfg_set(NV_NET_NUM, "0");

+    cfg_set(NV_M_NETSELECT_STATUS, "manual_search_fail");

+    return 0;

+}

+

+void normal_copstest_timerout(void *msg)

+{

+	//zdm º¯Êý¼´Ê¹²»²ÎÓëµ÷Óã¬Ò²»áÁ¬½Ó²»¹ý£¬ÐèÒªÇëÖ§³Ö°ïæ½â¾ö

+	#if (APP_OS_TYPE == APP_OS_LINUX)

+    /*AT+COPS=?¶¨Ê±Æ÷*/

+    CreateSoftTimer(CopstestTimerID,

+                        TIMER_FLAG_RESTART,

+                        CopstestTimer_INTERVAL,

+                        normal_copstimeractstart,

+                        NULL);

+	#endif

+}

+

+void normal_getsignalbarinfo(T_zAt_SignalBarInfo* signalBarInfo, T_zAt_SignalBar_Type signalBarType)

+{

+	UINT8 tableSize = 0;

+	int i, prefixIndex = -1;

+	char signalBarName[30] = {0};

+	int signalBarVal[SIGNALBAR_NUM_MAX] = {0};

+	char strSigbar[10] = { 0 };	

+	       

+	prefixIndex = (int)	signalBarType; 	

+	tableSize = sizeof(suffixSignalBarNV) / 20;

+    at_print(AT_DEBUG,"atBase_GetSignalBarInfo enter, tableSize = %d, prefixIndex = %d!\n", tableSize, prefixIndex); 

+#if 0  // kw 3 UNREACH.RETURN  

+    if(tableSize > SIGNALBAR_NUM_MAX)

+	{

+		return;

+	}

+#endif    

+	for(i = 0; i < tableSize; i++)

+	{

+		memset(strSigbar, 0, 10);

+		memset(signalBarName, 0, 30);

+		snprintf(signalBarName, 30, "%s%s", prefixSignalBarNV[prefixIndex], suffixSignalBarNV[i]);	

+			    

+		cfg_get_item(signalBarName, strSigbar,sizeof(strSigbar));

+		if(strlen(strSigbar) > 0)

+		{

+			signalBarVal[i] = atoi(strSigbar);

+		}

+		else

+		{

+			signalBarVal[i] = -1;

+		}

+	}

+   signalBarInfo->signalbar0_low =  signalBarVal[0];

+   signalBarInfo->signalbar0_high = signalBarVal[1];

+   signalBarInfo->signalbar1_low =  signalBarVal[2];

+   signalBarInfo->signalbar1_high = signalBarVal[3];

+   signalBarInfo->signalbar2_low =  signalBarVal[4];

+   signalBarInfo->signalbar2_high = signalBarVal[5];

+   signalBarInfo->signalbar3_low =  signalBarVal[6];

+   signalBarInfo->signalbar3_high = signalBarVal[7];

+   signalBarInfo->signalbar4_low =  signalBarVal[8];

+   signalBarInfo->signalbar4_high = signalBarVal[9];

+   signalBarInfo->signalbar5_low =  signalBarVal[10];

+   signalBarInfo->signalbar5_high = signalBarVal[11];

+}

+

+/**

+**                 RSSI < - 115dBm     1¸ñ(0-25)

+**  -115dBm <= RSSI < -108 dBm   2¸ñ(26-32)

+**  -108dBm <= RSSI < -102 dBm   3¸ñ(33-38)    

+**  -102dBm <= RSSI < -96 dBm     4¸ñ(39-44)    

+**  -96dBm <= RSSI                      5¸ñ(>=45)    

+**  

+**/

+void normal_calcltesignalbar(long rssi)

+{

+	T_zAt_SignalBarInfo signalBarInfo = {0};

+	normal_getsignalbarinfo(&signalBarInfo, ZAT_SIGNALBAR_TYPE_LTE);

+    printf("atBase_CalcLteSignalBar: %d <= sigbar0 <= %d, %d <= sigbar1 <= %d, %d <= sigbar2 <= %d, %d <= sigbar3 <= %d,%d <= sigbar4 <= %d, %d <= sigbar5 <= %d,!\n", \

+		         signalBarInfo.signalbar0_low, signalBarInfo.signalbar0_high, signalBarInfo.signalbar1_low, signalBarInfo.signalbar1_high,signalBarInfo.signalbar2_low, \

+				 signalBarInfo.signalbar2_high,signalBarInfo.signalbar3_low,signalBarInfo.signalbar3_high,signalBarInfo.signalbar4_low, signalBarInfo.signalbar4_high, \

+		         signalBarInfo.signalbar5_low, signalBarInfo.signalbar5_high); 

+	if((rssi >= signalBarInfo.signalbar0_low) && (rssi <= signalBarInfo.signalbar0_high))

+    {

+        cfg_set("signalbar", "0");

+    }

+	else if((rssi >= signalBarInfo.signalbar1_low) && (rssi <= signalBarInfo.signalbar1_high))

+    {

+        cfg_set("signalbar", "1");

+    }

+    else if((rssi >= signalBarInfo.signalbar2_low) && (rssi <= signalBarInfo.signalbar2_high))

+    {

+        cfg_set("signalbar", "2");

+    }

+    else if((rssi >= signalBarInfo.signalbar3_low) && (rssi <= signalBarInfo.signalbar3_high))

+    {

+        cfg_set("signalbar", "3");

+    }

+    else if((rssi >= signalBarInfo.signalbar4_low) && (rssi <= signalBarInfo.signalbar4_high))

+    {

+        cfg_set("signalbar", "4");

+    }

+	else if(rssi==99)

+    {

+        normal_calcunknowsignalbar();	

+        return;

+    }		

+    else

+    {

+        cfg_set("signalbar", "5");

+    }   

+}

+

+/**

+**            RSSI <= -110dBm   0¸ñ(0-6)

+**  -110dBm < RSSI <= -104 dBm  1¸ñ(7-12)

+**  -104dBm < RSSI <= -98 dBm   2¸ñ(13-18)    

+**  -98dBm < RSSI <= -90 dBm    3¸ñ(19-26)    

+**  -90dBm < RSSI <= -80 dBm    4¸ñ(27-36)    

+**  -80dBm < RSSI               5¸ñ(>=37   )

+**/

+void normal_calctdsignalbar(long rssi)

+{

+	T_zAt_SignalBarInfo signalBarInfo = {0};

+	normal_getsignalbarinfo(&signalBarInfo, ZAT_SIGNALBAR_TYPE_TDS);

+    printf("atBase_CalcTdSignalBar: %d <= sigbar0 <= %d, %d <= sigbar1 <= %d, %d <= sigbar2 <= %d, %d <= sigbar3 <= %d,%d <= sigbar4 <= %d, %d <= sigbar5 <= %d!\n", \

+		         signalBarInfo.signalbar0_low, signalBarInfo.signalbar0_high, signalBarInfo.signalbar1_low, signalBarInfo.signalbar1_high,signalBarInfo.signalbar2_low, \

+				 signalBarInfo.signalbar2_high,signalBarInfo.signalbar3_low,signalBarInfo.signalbar3_high,signalBarInfo.signalbar4_low, signalBarInfo.signalbar4_high, \

+		         signalBarInfo.signalbar5_low, signalBarInfo.signalbar5_high); 

+	if((rssi >= signalBarInfo.signalbar0_low) && (rssi <= signalBarInfo.signalbar0_high))

+    {

+        cfg_set("signalbar", "0");

+    }

+	else if((rssi >= signalBarInfo.signalbar1_low) && (rssi <= signalBarInfo.signalbar1_high))

+    {

+        cfg_set("signalbar", "1");

+    }

+    else if((rssi >= signalBarInfo.signalbar2_low) && (rssi <= signalBarInfo.signalbar2_high))

+    {

+        cfg_set("signalbar", "2");

+    }

+    else if((rssi >= signalBarInfo.signalbar3_low) && (rssi <= signalBarInfo.signalbar3_high))

+    {

+        cfg_set("signalbar", "3");

+    }

+    else if((rssi >= signalBarInfo.signalbar4_low) && (rssi <= signalBarInfo.signalbar4_high))

+    {

+        cfg_set("signalbar", "4");

+    }

+	else if(rssi==99)

+    {

+        normal_calcunknowsignalbar();	

+        return;

+    }

+    else

+    {

+        cfg_set("signalbar", "5");

+    }  

+}

+

+/**

+**                 RSSI <= -110dBm   0¸ñ(0-1)

+**  -110dBm < RSSI <= -104 dBm  1¸ñ(2-4)

+**  -104dBm < RSSI <= -98 dBm   2¸ñ(5-7)    

+**  -98dBm < RSSI <= -90 dBm    3¸ñ(8-11)    

+**  -90dBm < RSSI <= -80 dBm    4¸ñ(12-16)    

+**  -80dBm < RSSI               5¸ñ(>=17   )

+**/

+void normal_calcothersignalbar(long rssi)

+{

+	T_zAt_SignalBarInfo signalBarInfo = {0};

+

+	normal_getsignalbarinfo(&signalBarInfo, ZAT_SIGNALBAR_TYPE_GSM);

+    printf("atBase_CalcOtherSignalBar: %d <= sigbar0 <= %d, %d <= sigbar1 <= %d, %d <= sigbar2 <= %d, %d <= sigbar3 <= %d,%d <= sigbar4 <= %d, %d <= sigbar5 <= %d,!\n", \

+		         signalBarInfo.signalbar0_low, signalBarInfo.signalbar0_high, signalBarInfo.signalbar1_low, signalBarInfo.signalbar1_high,signalBarInfo.signalbar2_low, \

+				 signalBarInfo.signalbar2_high,signalBarInfo.signalbar3_low,signalBarInfo.signalbar3_high,signalBarInfo.signalbar4_low, signalBarInfo.signalbar4_high, \

+		         signalBarInfo.signalbar5_low, signalBarInfo.signalbar5_high); 

+    if(rssi==99)

+    {

+		normal_calcunknowsignalbar();			

+        return;

+    }

+	if((rssi >= signalBarInfo.signalbar0_low) && (rssi <= signalBarInfo.signalbar0_high))

+    {

+        cfg_set("signalbar", "0");

+    }

+	else if((rssi >= signalBarInfo.signalbar1_low) && (rssi <= signalBarInfo.signalbar1_high))

+    {

+        cfg_set("signalbar", "1");

+    }

+    else if((rssi >= signalBarInfo.signalbar2_low) && (rssi <= signalBarInfo.signalbar2_high))

+    {

+        cfg_set("signalbar", "2");

+    }

+    else if((rssi >= signalBarInfo.signalbar3_low) && (rssi <= signalBarInfo.signalbar3_high))

+    {

+        cfg_set("signalbar", "3");

+    }

+    else if((rssi >= signalBarInfo.signalbar4_low) && (rssi <= signalBarInfo.signalbar4_high))

+    {

+        cfg_set("signalbar", "4");

+    }

+    else if((rssi>=signalBarInfo.signalbar5_low) && (rssi<=signalBarInfo.signalbar5_high))

+    {

+        cfg_set("signalbar", "5");

+    }

+}

+

+void normal_calcunknowsignalbar(void)

+{

+    char signalbar_99[30] = {0};

+    char netType[50]={0};

+    cfg_get_item(NV_NETWORK_TYPE,netType,sizeof(netType));

+    cfg_get_item("signalbar_99", signalbar_99,sizeof(signalbar_99));

+    if(strcmp("0", signalbar_99) == 0)

+    {

+        cfg_set("signalbar", "0");

+    }

+    else if (g_zUfi_firstCsq

+            &&0!=strcmp("No Service",netType)

+            &&0!=strcmp("Limited Service",netType)

+            &&0!=strcmp(NETWORK_TYPE_INIT,netType))

+    {

+        cfg_set("signalbar", "3");

+    }

+}

+

+void normal_calcsignalbar(T_zAt_SignalBar_Type signalBarType)

+{	

+    char netType[30] = {0};

+    char strRssi[30] = { 0 };

+    long  csq  = 0;

+    at_print(AT_DEBUG,"normal_calcsignalbar!\n");

+    UINT32 signalbar = 0;

+    char oldSignalbar[10] = {0};

+    char newSignalbar[10] = {0};

+    cfg_get_item("signalbar",oldSignalbar,sizeof(oldSignalbar));

+    at_print(AT_DEBUG,"oldSignalbar=%s!\n",oldSignalbar);

+    

+    cfg_get_item("csq",strRssi,sizeof(strRssi));

+    csq = atoi(strRssi);

+	if(csq < 0 || csq > INT_MAX-1) // kw 3

+	{

+	    csq = 0;

+	}

+    cfg_get_item("network_type",netType,sizeof(netType));

+    if(signalBarType == ZAT_SIGNALBAR_TYPE_LTE)

+    {

+        normal_calcltesignalbar(csq - 100);

+    }

+    else if(signalBarType == ZAT_SIGNALBAR_TYPE_WCDMA)

+    {

+        normal_calctdsignalbar(csq - 100);

+    }

+    else if(signalBarType == ZAT_SIGNALBAR_TYPE_TDS)

+    {

+        normal_calctdsignalbar(csq - 100);

+    }

+    else if(signalBarType == ZAT_SIGNALBAR_TYPE_GSM)

+    {

+        normal_calcothersignalbar(csq);

+    }

+    else if(signalBarType == ZAT_SIGNALBAR_TYPE_NONE)

+    {

+        if(csq == 99 || csq == 199)

+        {

+            normal_calcunknowsignalbar();	

+        }

+    }

+    cfg_get_item("signalbar",newSignalbar,sizeof(newSignalbar));

+    at_print(AT_DEBUG,"newSignalbar=%s!\n",newSignalbar);

+    if(strcmp(newSignalbar, oldSignalbar))

+    {

+        signalbar = atoi(newSignalbar);

+    	if(signalbar > UINT_MAX-1)  // kw 3 cov M

+    	{

+    	    signalbar = UINT_MAX;

+    	}		

+        int result = ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MMI,MSG_CMD_OUT_REG_GET_SIGNAL_NUM, sizeof(signalbar), (UINT8 *)&signalbar,0);

+        at_print(AT_DEBUG,"normal_calcsignalbar %d!\n", result);

+    }

+}

+

+void normal_calcltesignalstrength(long rssi)

+{

+	CHAR rssi_buf[20] = {0};

+	int dbm_val = 0;

+	if(0 == rssi)

+    {

+        snprintf(rssi_buf, 20, "%s", "<-140");		

+    }

+	else if(97 == rssi)

+	{

+		snprintf(rssi_buf, 20, "%s", ">=-44");

+	}

+	else if(99 == rssi)

+	{

+       return;

+	}

+	else if((rssi > 0) && (rssi < 97))

+	{

+		dbm_val = 141 - rssi;

+		snprintf(rssi_buf, 20, "-%d", dbm_val);

+	}

+	cfg_set("lte_rsrp", rssi_buf);

+	cfg_set("rssi", rssi_buf);

+}

+

+void normal_calctdsignalstrength(long rssi)

+{

+	char rssi_buf[20] = {0};

+	int dbm_val = 0;

+	if(0 == rssi)

+    {

+        snprintf(rssi_buf, 20, "%s", "<-115");		

+    }

+	else if(91 == rssi)

+	{

+		snprintf(rssi_buf, 20, "%s", ">=-25");

+	}

+	else if(99 == rssi)

+	{

+       return;

+	}

+	else if((rssi > 0) && (rssi < 91))

+	{

+		dbm_val = 116 - rssi;

+		snprintf(rssi_buf, 20, "-%d", dbm_val);

+	}

+	cfg_set("rscp", rssi_buf);

+	cfg_set("rssi", rssi_buf);

+	cfg_set("lte_rsrp", "");

+}

+

+void normal_calcothersignalstrength(long rssi)

+{

+	char rssi_buf[20] = {0};

+	int dbm_val = 0;

+	if(0 == rssi)

+    {

+        snprintf(rssi_buf, 20, "%s", "<=-113");		

+    }

+	else if(31 == rssi)

+	{

+		snprintf(rssi_buf, 20, "%s", ">=-51");

+	}

+	else if(99 == rssi)

+	{

+       return;

+	}

+	else if((rssi > 0) && (rssi < 31))

+	{

+		dbm_val = 113 - 2*rssi;

+		snprintf(rssi_buf, 20, "-%d", dbm_val);

+	}

+	cfg_set("rssi", rssi_buf);

+	cfg_set("lte_rsrp", "");

+}

+

+void normal_calcsignalstrength(T_zAt_SignalBar_Type signalBarType, long  rssi)

+{	

+	if(signalBarType == ZAT_SIGNALBAR_TYPE_LTE)

+	{

+		normal_calcltesignalstrength(rssi - 100);

+	}

+    else if((signalBarType == ZAT_SIGNALBAR_TYPE_WCDMA) || (signalBarType == ZAT_SIGNALBAR_TYPE_TDS))

+    {

+        normal_calctdsignalstrength(rssi - 100);

+	}

+	else if(signalBarType == ZAT_SIGNALBAR_TYPE_GSM)

+	{

+		normal_calcothersignalstrength(rssi);

+	}

+}

+

+VOID normal_sysinfosysmodecfgset(long sysModeIn, long sysSubModeIn)

+{

+    UINT32 i            =   0;

+    UINT32 tableSize = sizeof(G_ZAT_SYSINFO_SET_NETTYPE)/sizeof(T_zAt_SysInfoSetNetType);

+

+	for(i = 0; i < tableSize; i++)

+    {

+        if(G_ZAT_SYSINFO_SET_NETTYPE[i].sysmode == sysModeIn)

+        {

+            cfg_set(NV_NETWORK_TYPE,G_ZAT_SYSINFO_SET_NETTYPE[i].netType);

+        }

+    }

+	

+	tableSize = sizeof(G_ZAT_SYSINFO_SET_SUBNETTYPE)/sizeof(T_zAt_SysInfoSetNetType);

+	for(i = 0; i < tableSize; i++)

+    {

+        if(G_ZAT_SYSINFO_SET_SUBNETTYPE[i].sysmode == sysSubModeIn)

+        {

+            cfg_set(NV_SUB_NETWORK_TYPE,G_ZAT_SYSINFO_SET_SUBNETTYPE[i].netType);

+        }

+    }

+	

+	return;

+}

+

+VOID normal_sysinfonetworktypeSet(long sysMode,long sysSubmode)

+{

+    UINT32 i            =   0;

+    UINT32 tableSize = sizeof(G_ZAT_SYSINFO_CMCC_NETTYPE)/sizeof(T_zAt_SysInfoSetNetType);

+    if(sysMode==ZAT_SYSINFORES_SYSMODE_GSM && sysSubmode==3)

+    {

+        cfg_set(NV_NETWORK_TYPE,"E");

+        return;

+    }

+    for(i = 0; i < tableSize; i++)

+    {

+        if(G_ZAT_SYSINFO_CMCC_NETTYPE[i].sysmode == sysMode)

+        {

+            cfg_set(NV_NETWORK_TYPE,G_ZAT_SYSINFO_CMCC_NETTYPE[i].netType);

+        }

+    }

+}

+

+long normal_isroam(char *sim_plmn, char *net_plmn)

+{

+    char sql[128] = {0};

+	int lcount = 0;

+    int result = DB_OK;

+	

+    if(ZUFI_NULL == sim_plmn || ZUFI_NULL == net_plmn)

+    {

+		at_print(AT_DEBUG,"atBase_IsRoam paraments error !\n"); 

+        return -1;

+    }

+

+    snprintf(sql,128-1,"select count(*) from roam_list where sim_plmn=\'%s\' and net_plmn=\'%s\'", sim_plmn, net_plmn);

+    result = normal_execdbsql(ZROAM_DB_PATH, sql, normal_count_callback, &lcount);

+    if(DB_OK != result)

+    {

+        at_print(AT_DEBUG,"atBase_IsRoam error:%d !\n", result); 

+        return -1;

+    }

+    if(lcount > 0)

+    {

+        at_print(AT_DEBUG,"atBase_IsRoam succ:%d !\n", lcount); 

+		return 0;

+	}

+	at_print(AT_DEBUG,"atBase_IsRoam not int list:%d, sim_plmn:%s, net_plmn:%s !\n", lcount, sim_plmn, net_plmn); 

+    return -1;

+}

+

+BOOL normal_checkroam(const char* mcc, const char* mnc)

+{

+    char imcc[10] = {0};

+    char imnc[10] = {0};

+	char checkRoam[10] = {0};

+	char sim_plmn[10] = {0};

+	char net_plmn[10] = {0};

+

+    cfg_get_item("check_roam", checkRoam,sizeof(checkRoam));

+	cfg_get_item("mcc", imcc,sizeof(imcc));

+	cfg_get_item("mnc", imnc,sizeof(imnc));

+	if(0 == strcmp("yes", checkRoam))

+	{

+	    snprintf(sim_plmn, 10-1, "%s%s", mcc, mnc);

+	    snprintf(net_plmn, 10-1, "%s%s", imcc, imnc);

+		

+		if(normal_isroam(sim_plmn, net_plmn) == 0)

+		{

+			return TRUE;

+		}

+

+		return FALSE;

+	}

+	else

+	{

+		return FALSE;

+	}	

+

+}

+

+VOID normal_simcardcfgreset()

+{

+	cfg_set(NV_MODEM_MAIN_STATE,"modem_sim_undetected");

+    cfg_set("lte_pci", "");

+	cfg_set("lte_earfcn", "");

+	cfg_set("lte_rsrp", "");

+	cfg_set("lte_sinr", "");

+	cfg_set("sim_zpbic_status","no_card");

+	cfg_set(NV_MSISDN,"");

+	cfg_set(NV_SIMCARD_TYPE,"");

+	cfg_set(NV_IMEI, "");

+	cfg_set(NV_OPER_NUM, "");

+	cfg_set(NV_PDP_STATUS, "0");

+    cfg_set(NV_NETWORK_PROVIDER, "");

+    cfg_set(NV_NETWORK_TYPE, "");

+	cfg_set(NV_SUB_NETWORK_TYPE, "");

+    cfg_set(NV_SIMCARD_ROAM, "");

+    cfg_set(NV_CSQ, "");

+    cfg_set(NV_RSSI, "");

+    cfg_set(NV_ECIO, "");

+    cfg_set(NV_LAC_CODE,"");

+    cfg_set(NV_CELL_ID,"");

+    cfg_set(NV_WAN_IPADDR, "0.0.0.0");

+    cfg_set(NV_WAN_NETMASK,"0.0.0.0");

+    cfg_set(NV_WAN_GATEWAY,"0.0.0.0");

+    cfg_set(NV_PREFER_DNS_AUTO, "0.0.0.0");

+    cfg_set(NV_STANDBY_DNS_AUTO, "0.0.0.0");

+    cfg_set(NV_SIM_PIN, "0");

+    cfg_set(NV_SIM_PUK, "0");

+    cfg_set(NV_PIN_MANAGE_RESULT,"");

+    cfg_set(NV_PINNUMBER,"3");

+    cfg_set(NV_PUKNUMBER,"10");

+    cfg_set(NV_PIN_STATUS,"");

+    cfg_set(NV_PIN_PUK_PROCESS,"");

+    cfg_set(NV_PIN_MANAGE_PROCESS,"");

+    cfg_set(NV_UNLOCK_AT_WAIT,"0");

+    cfg_set(NV_SIM_SPN,"");

+    cfg_set(NV_SEND_PIN_FLAG,"0"); //0:±íʾ±£´æµÄPINÂëûÓз¢ËÍ  £¬1±íʾÒѾ­·¢ËÍ

+    cfg_set(NV_MCC,"");

+    cfg_set(NV_MNC,"");

+    cfg_set(NV_LOCK_UI,"" );

+    cfg_set(NV_ACTION,"");

+    cfg_set(NV_UARFCN,"");

+    cfg_set(NV_CELLPARAID,"");

+    cfg_set(NV_BANDLOCKSET,"");

+    cfg_set(NV_BANDLOCKSTATE,"UnLocked");

+    cfg_set(NV_PPP_DIAL,"");

+    cfg_set(NV_ZCELL_RESULT,"");

+    cfg_set(NV_ZCONSTAT_UP_RESULT, "");

+    cfg_set(NV_CGATT_SET_RESULT, "");

+    cfg_set(NV_ZGIPDNS_RESULT_DEFAULTCID,"0");

+    cfg_set(NV_ZGIPDNS_RESULT_PPPDCID,"0");

+	cfg_set(NV_ZGACT_RESULT_DEFAULTCID,"0");

+	cfg_set(NV_ZGACT_RESULT_PPPDCID,"0");

+    cfg_set(NV_RESETMODEM,"");

+    cfg_set(NV_SIGNALBAR,"");// ÇåÁ㣬·ÀÖ¹²»²åsim¿¨ÖØÆôºó»¹ÓÐÐźŸñÊý

+    //cfg_set(NV_AUTO_RECONNECT,"");//·ÀÖ¹×Ô¶¯²¦ºÅʧ°Ü

+    cfg_set(NV_IPV6_WAN_IPADDR,"");

+    cfg_set(NV_IPV6_WAN_DEFAULT_GW_ADDR,"");

+    cfg_set(NV_IPV6_PREFER_DNS_AUTO,"");

+    cfg_set(NV_IPV6_STANDBY_DNS_AUTO,"");

+    cfg_set(NV_CFUN_STATE,"1");

+    cfg_set(NV_CSQ_DONE, "1");

+    //cfg_set(NV_SD_CARD_STATE,"0");	

+    cfg_set(NV_SIM_IMSI, "");

+    cfg_set(NV_SIM_ICCID,"");

+	cfg_set(NV_ZICCID,"");

+    cfg_set(NV_M_NETSELECT_MODE, "0");

+    cfg_set(NV_SYS_MODE, "");

+    cfg_set(NV_SYS_SUBMODE, "");

+    cfg_set(NV_DAIL_STEP, "1");

+

+    cfg_set(LOCK_CELL_STATE_FLAG, "0");

+    cfg_set("ussd_cancel_flag","no");//ussd

+	

+}

+

+char *normal_findsubstr(const char *pStr, const char *pSubStr)

+{

+    long  i = 0;

+    long  flg = 0;

+    long  nLengthStr = 0;

+    long  nLengthSubStr = 0;

+    const char *pchTemp = ZUFI_NULL;

+    

+    /* È¡µÃÁ½¸ö×Ö·û´®µÄ³¤¶È */

+    nLengthStr      = (long)strlen(pStr);

+    nLengthSubStr   = (long)strlen(pSubStr);

+    if (nLengthStr < nLengthSubStr)

+    {

+        return NULL;

+    }

+    pchTemp = pStr;

+    /* ¿ªÊ¼²éÕÒ */

+    for (i = 0; i <= nLengthStr - nLengthSubStr; i++)

+    {

+        if ('"' == *pchTemp)

+        {

+            if (0 == flg)

+            {

+                flg = 1;

+            }

+            else

+            {

+                flg = 0;

+            }

+        }

+        if ((*pchTemp == *pSubStr) && (0 == flg))

+        {

+            if (0 == at_strncmp(pchTemp, pSubStr, (UINT32)nLengthSubStr))

+            {

+                return (char *) pchTemp;

+            }

+        }

+        pchTemp++;

+    }

+    return NULL;

+}

+

+/*Ô¤´¦Àí*/

+VOID normal_preprocresparalineex(char *pParaLine,int paraSize)

+{

+    UINT32 i = 0;

+    UINT32 length = 0;

+    char *pSource = ZUFI_NULL;

+    char *pDest = ZUFI_NULL;

+    char strDestLine[AT_CMD_MAX] = {0};

+	

+    if (AT_CMD_MAX <= strlen(pParaLine)) /* ²ÎÊý¼ì²é ¡¢³¤¶È¼ì²é*/

+    {

+    	softap_assert("");

+        return;

+    }

+	if(0 == strlen(pParaLine))

+		return;

+    length = (UINT32)strlen(pParaLine);

+    pSource = pParaLine;                /* Ñ­»·´¦Àí */

+    pDest = strDestLine;

+    for (i = 0; i < length; i++)

+    {

+        if ('(' == *pSource)

+        {

+            ;                           /* ×óÀ¨»¡ ɾ³ý */

+        }

+        else if (')' == *pSource)

+        {

+            if (',' == *(pSource + 1))  /* ÓÒÀ¨»¡,ÅжϽô¸úÆäºóµÄÊÇ·ñ¶ººÅ                    */

+            {

+                pSource++;              /* ÊǶººÅ£¬É¾³ýÓÒÀ¨»¡²¢ÔÚÄ¿µÄ´®Öн«¶ººÅת»»Îª·ÖºÅ   */

+                *pDest = ';';

+                pDest++;

+            }

+        }

+        else

+        {

+            *pDest = *pSource;

+            pDest++;

+        }

+        pSource++;

+    }

+    /* ½«Ô¤´¦ÀíºóµÄÄÚÈÝ¿½±´»Ø²ÎÊýÐÐÖÐ */

+    memset(pParaLine, 0, paraSize);

+    strncpy(pParaLine, strDestLine,paraSize-1);

+}

+

+/*Ô¤´¦Àí*/

+void normal_preprocresparalist(T_zAt_RES_PARAS_LIST *pParaList, const char *pParas)

+{

+    long i = 0;

+    char *pHead = ZUFI_NULL;

+    char *pEnd = ZUFI_NULL;

+	

+	if(!at_strcmp(pParas, "OK"))

+	{

+		pParaList->listCount = 0;

+		return;

+	}

+	

+    /* Ñ­»·²éÕÒ';' */

+	

+    pHead = pEnd = (char *) pParas;

+    pEnd = normal_findsubstr(pHead, ";");

+    while (pEnd != ZUFI_NULL)

+    {

+        /* ÕÒµ½';' */

+        /* Ô½½ç±£»¤ */

+        if ((pParaList->listCount >= ZAT_RES_PARAM_MAX_NUM)

+            || (pEnd - pHead >= ZAT_RES_PARAM_MAX_LEN))

+        {

+            return;

+        }

+        /* ¿½±´ÄÚÈÝ */

+        strncpy(pParaList->strParasLine[i], pHead, (UINT32)(pEnd - pHead));

+        pParaList->listCount++;

+        i++;

+        pHead = pEnd + 1;

+        pEnd = normal_findsubstr(pHead, ";");// yx  new  add  2013-5-20

+    }

+	

+    if ((strlen(pHead) != 0) && (pParaList->listCount < ZAT_RES_PARAM_MAX_NUM))

+    {

+        strncpy(pParaList->strParasLine[i], pHead,ZAT_RES_PARAM_MAX_LEN-1);

+        pParaList->listCount++;

+    }

+}

+

+//cops=?ÃüÁîÉϱ¨½á¹û´¦Àí

+VOID normal_recvcopstestrsp(char *at_paras)

+{

+	UINT32 listIndex = 0;

+	UINT32 copsIndex = 0;

+	T_zAt_CopsTestRes		 tPara		 = {0};

+	T_zAt_RES_PARAS_LIST	tParasList	= {0};

+	const char *pCopHeader = NULL;

+	char *pCopEnd = NULL;

+	int len = 0;

+			

+	pCopHeader = at_paras;

+	pCopEnd = normal_findsubstr(pCopHeader, ",,");

+	{

+		char copsContent[AT_CMD_MAX] = {0};

+		if(pCopEnd == NULL)

+		{

+			strncpy(copsContent, at_paras,sizeof(copsContent)-1);

+		}

+		else

+		{

+		    if(pCopEnd - pCopHeader >= sizeof(copsContent))

+			{

+			    len = sizeof(copsContent)-1;

+			}

+		    else

+			{

+			    len = pCopEnd - pCopHeader;

+			}

+			snprintf(copsContent,len+1,"%s",at_paras);

+			//strncpy(copsContent, at_paras, len);

+		}

+		

+		normal_preprocresparalineex(copsContent,sizeof(copsContent));			   /* Ô¤´¦Àí¸´ÔÓ²ÎÊýÐÐ */

+		normal_preprocresparalist(&tParasList, copsContent);   /* Ô¤´¦Àí²ÎÊýÁÐ±í   */

+	}

+	{

+		char operatorInfo[256]	= {0};

+		char copsList[512] = {0};

+		char copsList_tmp[512] = {0};

+		for(listIndex = 0; listIndex < tParasList.listCount; listIndex++)

+		{	

+			void *p[6] = {&tPara.oplist[copsIndex].stat,tPara.oplist[copsIndex].lalphaOper,tPara.oplist[copsIndex].salphaOper,

+					tPara.oplist[copsIndex].numericOper,&tPara.oplist[copsIndex].netType,&tPara.oplist[copsIndex].subType};

+			at_print(AT_DEBUG,"normal_recvcopstestrsp at_paras=%s!\n",tParasList.strParasLine[listIndex]);

+		    parse_param2("%d,%s,%s,%s,%d,%d", tParasList.strParasLine[listIndex], p);

+		    at_print(AT_DEBUG,"normal_recvcopstestrsp stat=%d,lalphaOper=%s,salphaOper=%s,numericOper=%s,netType=%d,subType=%d!\n",

+		    tPara.oplist[copsIndex].stat,tPara.oplist[copsIndex].lalphaOper,tPara.oplist[copsIndex].salphaOper,

+			tPara.oplist[copsIndex].numericOper,tPara.oplist[copsIndex].netType,tPara.oplist[copsIndex].subType);  

+			

+			if(0 == tPara.oplist[copsIndex].stat && 0 ==strcmp("", tPara.oplist[copsIndex].numericOper))

+			{

+				continue;

+			}

+			snprintf(operatorInfo, sizeof(operatorInfo), "%d,%s,%s,%d,%d", 

+				tPara.oplist[copsIndex].stat, tPara.oplist[copsIndex].salphaOper, 

+				tPara.oplist[copsIndex].numericOper, tPara.oplist[copsIndex].netType, tPara.oplist[copsIndex].subType);

+			if(0 == copsIndex)

+			{

+				snprintf(copsList,sizeof(copsList),"%s", operatorInfo);	

+			}

+			else

+			{

+				memcpy(copsList_tmp,copsList,sizeof(copsList_tmp));

+				snprintf(copsList,sizeof(copsList),"%s;%s", copsList_tmp ,operatorInfo); 

+			}

+		    copsIndex++;

+		}

+		char strValue[20] = {0};

+		snprintf(strValue,sizeof(strValue), "%ld", copsIndex);

+		cfg_set(NV_NET_NUM, strValue);

+		cfg_set(NV_M_NETSELECT_CONTENTS, copsList);

+		cfg_set(NV_M_NETSELECT_STATUS, "manual_selected");

+	}

+}

+

+int normal_netprovider_callback(void *fvarg,int line,char **zresult,char **lname)

+{

+	T_zAt_OperatorName operatorName = {0};

+	if(1 > line)

+	{

+		at_print(AT_DEBUG,"atBase: NetProvider record no data.");

+		return -1;

+	}

+    if(zresult[0] != NULL)

+    {

+    	strncpy(operatorName.OperFullName,  zresult[0], sizeof(operatorName.OperFullName)-1);

+    }

+    if(zresult[1] != NULL)

+	{

+    	strncpy(operatorName.OperShortName, zresult[1], sizeof(operatorName.OperShortName)-1);

+		

+	}

+	memcpy(fvarg,&operatorName,sizeof(operatorName));

+	return 0;

+}

+

+

+long normal_number2networkprovider(char *pplmn, T_zAt_OperatorName *opraName)

+{

+    char sql[128] = {0};

+	T_zAt_OperatorName operatorName = {0};

+    int result = DB_OK;

+	

+    if(ZUFI_NULL == pplmn)

+    {

+        return -1;

+    }

+

+    snprintf(sql,128-1,"select full_name,short_name from net_list where plmn=\'%s\' limit 1", pplmn);

+    result = normal_execdbsql(ZNETPROVIDER_DB_PATH, sql, normal_netprovider_callback, &operatorName);

+    if(DB_OK != result)

+    {

+        return ZUFI_FAIL;

+    }

+    at_print(AT_DEBUG,"normal_number2networkprovider OperShortName=%s\n",operatorName.OperShortName);

+	strncpy(opraName->OperShortName, operatorName.OperShortName, sizeof(opraName->OperShortName)-1);

+    if(operatorName.OperFullName[0] == '\0')

+    {

+        return ZUFI_FAIL;

+    }

+	strncpy(opraName->OperFullName, operatorName.OperFullName, sizeof(opraName->OperFullName)-1);

+		

+	return ZUFI_SUCC;

+

+}

+

+long normal_getnetworkprovidername(char *MCC, char *MNC,char *Net_Provider_Name,int len)

+{

+    long   listSize       = 0;

+    long   iCount         = 0;

+    long   mccNum         = 0;

+    long   mncNum         = 0;

+    long   qualListMcc    = 0;

+    long   quallistMnc    = 0;

+	

+    if(ZUFI_NULL == MCC || ZUFI_NULL == MNC ||  ZUFI_NULL == Net_Provider_Name)

+    {

+        at_print(AT_ERR,"the paraments of function is wrong!");

+        return ZUFI_FAIL;

+    }

+    mccNum = atoi( MCC );

+    mncNum = atoi( MNC );

+	

+    listSize = sizeof(G_ZAT_QUALCOMMLISTNODE)/sizeof(T_zAt_QualcommListNode);

+	

+    for(iCount = 0; iCount< listSize; iCount++)

+    {

+        qualListMcc = atoi( G_ZAT_QUALCOMMLISTNODE[iCount].mcc );

+        quallistMnc = atoi( G_ZAT_QUALCOMMLISTNODE[iCount].mnc );

+        if( (qualListMcc == mccNum)  && (quallistMnc == mncNum))

+        {

+            strncpy(Net_Provider_Name,G_ZAT_QUALCOMMLISTNODE[iCount].networkProvider,len-1);

+            break;

+        }

+    }

+	

+    if (iCount < listSize)

+    {

+        /* ÕÒµ½Æ¥ÅäÔËÓªÉÌÃû³Æ */

+        at_print(AT_DEBUG,"get provider name in list  ok !\n");

+        return ZUFI_SUCC;

+    }

+    else

+    {

+        /* δÕÒµ½Æ¥ÅäÔËÓªÉÌÃû³Æ */

+        at_print(AT_DEBUG,"can not get provider name in list!\n");

+        return  ZUFI_FAIL;

+    }

+}

+

+

+VOID normal_recvcopsreadrsp(char * at_paras)

+{

+    char sProvider[70]       = {0};

+    char netProviderName[70] = {0};

+    char sMCC[10]            = {0};

+    char sMNC[10]            = {0};

+	char needCopsNumFormat[10] = {0};

+	T_zAt_CopsReadRes  copsReadPara = {0};

+	T_zAt_OperatorName operatorName = {0};

+	

+	void *p[5] = {&copsReadPara.mode,&copsReadPara.format,copsReadPara.oper,&copsReadPara.act,&copsReadPara.subact};

+	at_print(AT_DEBUG,"normal_recvcopsreadrsp at_paras=%s!\n",at_paras);

+	parse_param2("%d,%d,%s,%d,%d", at_paras, p);

+	at_print(AT_DEBUG,"normal_recvcopsreadrsp mode=%ld,format=%ld,oper=%s,act=%ld,subact=%ld!\n",

+	copsReadPara.mode,copsReadPara.format,copsReadPara.oper,copsReadPara.act,copsReadPara.subact);	

+

+    strncpy(sProvider, copsReadPara.oper, sizeof(sProvider)-1);

+	

+    strncpy(sMCC, sProvider, 3);

+    at_print(AT_DEBUG,"MCC is %s\n", sMCC);

+	

+    strncpy(sMNC, sProvider+3,sizeof(sMNC)-1);

+    at_print(AT_DEBUG,"MNC is %s\n", sMNC);

+	

+    cfg_set(NV_MCC, sMCC);

+    cfg_set(NV_MNC, sMNC);

+    cfg_set(NV_OPER_NUM, copsReadPara.oper);

+    cfg_get_item("need_cops_number_format", needCopsNumFormat, sizeof(needCopsNumFormat));

+    if(0 == strcmp("yes", needCopsNumFormat))

+	{

+		if(2 == copsReadPara.format && ZUFI_SUCC == normal_number2networkprovider(sProvider, &operatorName))

+		{

+			strncpy(netProviderName,operatorName.OperFullName,sizeof(netProviderName)-1);

+			cfg_set("network_provider",netProviderName);

+            at_print(AT_DEBUG,"operator brand found in the Qualcomm list ! \n");

+		}

+		else

+	    {

+	        if(0 == strcmp(copsReadPara.oper,"CHINA MOBILE"))

+	        {

+	            strcpy(copsReadPara.oper, "China Mobile");

+	        }

+	        cfg_set("network_provider",copsReadPara.oper);

+	        at_print(AT_DEBUG,"operator brand not found in the Qualcomm list ! \n");

+	    }

+	}

+	else

+    {

+        if(2 == copsReadPara.format && ZUFI_SUCC == normal_getnetworkprovidername(sMCC, sMNC,netProviderName,sizeof(netProviderName)))

+        {

+            cfg_set(NV_NETWORK_PROVIDER,netProviderName);

+        }

+        else

+        {

+            if(0 == strcmp(copsReadPara.oper,"CHINA MOBILE"))

+            {

+                strncpy(copsReadPara.oper, "China Mobile",sizeof(copsReadPara.oper)-1);

+            }

+            cfg_set(NV_NETWORK_PROVIDER,copsReadPara.oper);    

+            at_print(AT_DEBUG,"operator brand not found in the Qualcomm list ! \n");

+        }

+    }

+    at_print(AT_DEBUG,"normal_recvcopsreadrsp send to mmi MSG_CMD_GET_NET_PROVIDER\n");

+    ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MMI,MSG_CMD_GET_NET_PROVIDER, 0, NULL,0);   

+}

+

+

+int normal_getautoapn_callback(void *fvarg,int line,char **zresult,char **lname)

+{

+    T_zAt_APN_PROFILE para = {0};

+    if(1 > line)

+    {

+        at_print(AT_DEBUG,"zte_sms:record no data.\n");

+        cfg_get_item(NV_PDP_TYPE,para.pdp_type,sizeof(para.pdp_type));

+        return -1;

+    }

+    if(zresult[0] != NULL)

+    {

+        strncpy(para.profile_name, zresult[0], ZAT_PROFILE_MEMBER_LEN - 1);

+    }

+    if(zresult[1] != NULL)

+    {

+        strncpy(para.apn_name, zresult[1], ZAT_PROFILE_MEMBER_LEN - 1);

+        at_print(AT_DEBUG,"atBase_GetAutoApn_Callback: apn_name != NULL!\n");

+    }

+    if(zresult[2] != NULL)

+    {

+        strncpy(para.dial_num, zresult[2], ZAT_PROFILE_MEMBER_LEN - 1);

+    }

+    if(zresult[3] != NULL)

+    {

+        strncpy(para.ppp_auth_mode, zresult[3], ZAT_PROFILE_MEMBER_LEN - 1);

+    }

+    if(zresult[4] != NULL)

+    {

+        strncpy(para.ppp_username, zresult[4], ZAT_PROFILE_MEMBER_LEN - 1);

+        at_print(AT_DEBUG,"atBase_GetAutoApn_Callback: para.ppp_username != NULL!\n");

+    }

+    if(zresult[5] != NULL)

+    {

+        strncpy(para.ppp_passwd, zresult[5], ZAT_PROFILE_MEMBER_LEN - 1);

+    }

+    if(zresult[6] != NULL)

+    {

+        strncpy(para.pdp_type, zresult[6], ZAT_PROFILE_MEMBER_LEN - 1);

+    }    

+    memcpy(fvarg,&para,sizeof(para));

+    

+    return 0;

+}

+

+void normal_get_cardtype(char *ccmnc)

+{

+	if (strcmp(ccmnc, "46000") == 0 || 

+        strcmp(ccmnc, "46002") == 0 || 

+        strcmp(ccmnc, "46007") == 0 ||

+        strcmp(ccmnc, "46008") == 0)

+	{

+		cfg_set(NV_SIMCARD_TYPE, "1");

+	}

+	else if (strcmp(ccmnc, "46001") == 0 || 

+        strcmp(ccmnc, "46006") == 0)

+	{

+		cfg_set(NV_SIMCARD_TYPE, "2");

+	}

+	else if (strcmp(ccmnc, "46003") == 0 || 

+        strcmp(ccmnc, "46005") == 0 ||

+        strcmp(ccmnc, "46011") == 0 )

+	{

+		cfg_set(NV_SIMCARD_TYPE, "3");

+	}

+	else

+	{

+		cfg_set(NV_SIMCARD_TYPE, "4");

+

+	}

+

+}

+

+/*»ñÈ¡auto apn*/

+long normal_getautoapn(char *CCMNC)

+{

+    char sql[128] = {0};

+    char apn_auto_config[256];

+    T_zAt_APN_PROFILE apnpara = {0};

+    DbResult result = DB_OK;

+    char apnMode[50] = {0};

+    cfg_get_item(NV_APN_MODE,apnMode,sizeof(apnMode));

+    

+    snprintf(sql,sizeof(sql),"select ConfigFileName,APN,LoginNumber,AuthType,UserName,Password,PDPType from apn_list where CCMNC='%s' limit 1",CCMNC);

+    result = normal_execdbsql(ZAPN_DB_PATH,sql, normal_getautoapn_callback, &apnpara);

+	

+    at_print(AT_DEBUG,"atBase_GetAutoApn CCMNC:%s!\n",CCMNC);

+    if(DB_OK != result)

+    {

+        return -1;

+    }

+	if(strlen(apnpara.profile_name) == 0)

+	{

+		at_print(AT_ERR,"normal_getautoapn no item CCMNC:%s!\n",CCMNC);

+		return -1;

+	}

+    if(strlen(apnpara.pdp_type) == 0)

+    {

+        strncpy(apnpara.pdp_type, "IP", ZAT_PROFILE_MEMBER_LEN - 1);

+    }

+    

+    if(0 == strcmp("auto", apnMode))

+    {

+        cfg_set(NV_PDP_TYPE, apnpara.pdp_type);

+        if(strcmp("IPv6", apnpara.pdp_type) == 0 || strcmp(apnpara.pdp_type, "IPv4v6") == 0)

+        {

+            cfg_set(NV_IPV6_WAN_APN, apnpara.apn_name);

+    	    cfg_set(NV_IPV6_PDP_TYPE, apnpara.pdp_type);

+    	    cfg_set(NV_WAN_APN, apnpara.apn_name);

+    	    cfg_set(NV_IPV6_PPP_AUTH_MODE, apnpara.ppp_auth_mode);

+			cfg_set(NV_IPV6_PPP_USERNAME,apnpara.ppp_username);

+			cfg_set(NV_IPV6_PPP_PASSWD,apnpara.ppp_passwd);

+			ipv6apn_encrypt_code();

+        }

+        else

+        {

+            cfg_set(NV_WAN_APN, apnpara.apn_name);

+	        cfg_set(NV_PPP_AUTH_MODE, apnpara.ppp_auth_mode);

+			cfg_set(NV_PPP_USERNAME,apnpara.ppp_username);

+			cfg_set(NV_PPP_PASSWD,apnpara.ppp_passwd);

+			apn_encrypt_code();

+        }	

+        cfg_set(NV_M_PROFILE_NAME, apnpara.profile_name);

+		if(g_modem_model)

+		{

+			cfg_set("default_apn", apnpara.apn_name);

+			MSG_BUF *buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_APN_SET_REQ,0,NULL);

+			rcv_clt_req_msg_proc(buf);

+			free(buf);

+		}

+    }

+    snprintf(apn_auto_config, sizeof(apn_auto_config),"%s($)%s($)auto($)%s($)%s($)%s($)%s($)%s($)auto($)($)auto($)($)", 

+		apnpara.profile_name, apnpara.apn_name, apnpara.dial_num, apnpara.ppp_auth_mode, apnpara.ppp_username, 

+		apnpara.ppp_passwd, apnpara.pdp_type);	

+    at_print(AT_DEBUG,"atBase_GetAutoApn apn_auto_config = %s!\n",apn_auto_config);

+    cfg_set(NV_APN_AUTO_CONFIG, apn_auto_config);

+#ifdef MULTI_CPU

+	sync_default_apn(NULL);

+#endif

+    return 0;

+}

+

+void normal_recvzrapok()

+{

+    char modemState[50] = {0};

+    char pinProcess[50] = {0};

+    char pinManage[50] = {0};

+    cfg_get_item(NV_MODEM_MAIN_STATE,modemState,sizeof(modemState));

+    cfg_get_item(NV_PIN_PUK_PROCESS,pinProcess,sizeof(pinProcess));

+    cfg_get_item(NV_PIN_MANAGE_PROCESS,pinManage,sizeof(pinManage));

+    

+    if(strcmp(pinProcess,"begin") == 0

+	    &&0 == strcmp("modem_init_complete",modemState))

+    {

+        cfg_set(NV_PIN_PUK_PROCESS, "end");

+        printf("pin_puk_process = end --- modem_init_complete"); 

+    }

+    /*web pin¡¢pukÂëÑéÖ¤¶¯×÷½áÊøºó£¬·¢ZAT_SYSCONFIGREAD_CMD*/

+    else if(strcmp(pinProcess,"begin") == 0)

+    {

+        cfg_set(NV_PIN_PUK_PROCESS, "end");

+        printf("pin_puk_process = end"); 

+    }

+		

+    /*web pinÂë¹ÜÀí¶¯×÷´¥·¢ZrapºóÎÞÏÂÒ»ÌõAT£¬½«ATÃüÁîÔ´¸³ÖµÎªATMIAN*/

+    if(strcmp(pinManage,"begin") == 0)

+    {

+        printf("pin_manage_process = end");        

+        cfg_set(NV_PIN_MANAGE_PROCESS, "end");

+    }

+}

+

+MSG_BUF *normal_getmsg(unsigned short src_id,unsigned short dst_id,unsigned short Msg_cmd,unsigned short us_DataLen,unsigned char *pData)

+{

+    MSG_BUF *buf=malloc(sizeof(MSG_BUF));

+    if(buf == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(buf, 0, sizeof(MSG_BUF));

+    buf->ulMagic = MSG_MAGIC_WORD;

+    buf->lMsgType = MSG_TYPE_DEFAULT;

+    buf->src_id = src_id;

+    buf->dst_id = dst_id;

+    buf->usMsgCmd = Msg_cmd;

+    buf->usDataLen = us_DataLen;

+    if(us_DataLen > 0)

+    {

+        memcpy(buf->aucDataBuf, pData, us_DataLen);

+    }

+    return buf;

+}

+

+char* normal_zschplmnset(int mode)

+{

+	char *at_next=NULL;

+	at_next=malloc(20);

+ 	if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+ 	memset(at_next,0,20);

+	snprintf(at_next,20,"AT+ZSCHPLMN=%d\r\n",mode);

+	return at_next;

+

+}

+

+int zupci_auto_act(char *at_paras ,int is_query_report)

+{

+    at_print(AT_ERR,"zupci=%s\n",at_paras);

+	MSG_BUF *buf=NULL;

+	buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_ZUTR_REQ,strlen(at_paras),(unsigned char *)at_paras);

+	rcv_clt_req_msg_proc(buf);

+	free(buf);

+    return AT_END;

+}

+

+char* start_zutr_cmd(void *msg,struct at_context *context)

+{

+	int cmd_type=0;

+	int cmd_num=0;

+	int cmd_qual=0;

+	MSG_BUF *buf=NULL;

+	char *at_paras=malloc(strlen((char *)((MSG_BUF*)msg)->aucDataBuf)+1);

+	if(at_paras == NULL)

+		return NULL;

+	memset(at_paras,0,strlen((char *)((MSG_BUF*)msg)->aucDataBuf)+1);

+	strcpy(at_paras,(char *)((MSG_BUF*)msg)->aucDataBuf);

+	

+	void *p[3] = {&cmd_type,&cmd_num,&cmd_qual};

+	at_print(AT_DEBUG,"start_zutr_cmd at_paras=%s!\n",at_paras);

+	parse_param2("%d,%d,%d", at_paras, p);

+	at_print(AT_ERR,"start_zutr_cmd %d,%d,%d!\n",cmd_type,cmd_num,cmd_qual);

+	free(at_paras);

+

+	if(cmd_type == 33 || cmd_type == 34 || cmd_type == 35 || cmd_type == 36 || cmd_type == 37)

+	{

+		char *at_next=NULL;

+		at_next=malloc(64);

+		if(at_next == NULL){

+			softap_assert("");

+			return NULL;

+		}

+		memset(at_next,0,64);

+		if(cmd_type == 33)

+			snprintf(at_next,64,"AT+ZUTR=%d,%d,%d,0\r\n",cmd_type,cmd_qual,cmd_num);

+		else

+			snprintf(at_next,64,"AT+ZUTR=%d,%d,%d,32\r\n",cmd_type,cmd_qual,cmd_num);

+		return at_next;

+	}

+		

+	return NULL;

+}

+

+int zmsri_auto_act(char *at_paras ,int is_query_report)

+{

+    at_print(AT_DEBUG,"modem init start!\n");

+	MSG_BUF *buf=NULL;

+	//int guodian = 0;

+	normal_simcardcfgreset();

+	buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_ZCHNELSET_MSG,0,NULL);

+	rcv_clt_req_msg_proc(buf);

+	free(buf);

+	

+	buf = normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_IMEI_REQ,0,NULL);//modem³õʼ»¯Íê³Éºó£¬²éѯimeiºÅ

+	rcv_clt_req_msg_proc(buf);

+	free(buf);

+	buf = NULL;

+//#ifdef GUODIAN

+//	guodian = 1;

+//#endif

+	if(g_customer_type)

+	{

+		buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_CVMOD_MSG,0,NULL);

+		rcv_clt_req_msg_proc(buf);

+		free(buf);

+	}

+	if(g_modem_model || g_customer_type)

+	{

+		buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_ZMSRI_MSG,0,NULL);

+		rcv_clt_req_msg_proc(buf);

+		free(buf);

+	}

+	if(!g_modem_model)

+	{

+		buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_NITZ_REQ,2,"1");

+		rcv_clt_req_msg_proc(buf);

+		free(buf);

+	}

+    return AT_END;

+}

+

+int zrefreshind_auto_act(char *at_paras ,int is_query_report)

+{

+	at_print(AT_ERR,"zrefreshind start!\n");

+	if(g_modem_model)

+	{

+		char needrestart[50]  = {0};

+		cfg_get_item("need_restart_when_sim_insert",needrestart,sizeof(needrestart));

+		if(strcmp("yes", needrestart) == 0)//ÖØÆô²Ù×÷

+		{

+			at_print(AT_DEBUG,"zrefreshind_auto_act RESTART\n");

+			ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+		}

+		else//²»ÖØÆô²Ù×÷£¬ÖØÐÂ×ßÒ»±é¿ª»úÁ÷³Ì£¬TODO

+		{

+			MSG_BUF *buf=NULL;

+			T_zAt_ZuslotRes zuslotPara = {0};//¸´Óðο¨Á÷³Ì

+			if(g_support_sms)	

+			ipc_send_message2(MODULE_ID_AT_CTL,MODULE_ID_SMS,MSG_CMD_ZUSLOT_IND,sizeof(zuslotPara),(unsigned char *)&zuslotPara,0);

+			if(g_support_pb)	

+			ipc_send_message2(MODULE_ID_AT_CTL,MODULE_ID_PB,MSG_CMD_ZUSLOT_IND,sizeof(zuslotPara),(unsigned char *)&zuslotPara,0);

+			buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_ZMSRI_MSG,0,NULL);

+			rcv_clt_req_msg_proc(buf);

+			free(buf);

+		}

+	}

+	return AT_END;

+}

+

+int zuslot_auto_act(char *at_paras ,int is_query_report)

+{

+    at_print(AT_DEBUG,"zuslot:%s start!\n",at_paras);

+	if(g_modem_model)

+	{

+		MSG_BUF *buf=NULL;

+		buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_ZUSLOT_MSG,strlen(at_paras),(unsigned char *)at_paras);

+		rcv_clt_req_msg_proc(buf);

+		free(buf);

+	}

+	else

+	{

+		cfg_set(NV_AUTO_RECONNECT,"");

+	}

+    return AT_END;

+}

+

+char* start_start_zmsri(void *msg,struct at_context *context)

+{

+	cfg_set("ppp_status", "ppp_disconnected");

+    //psinfo.zrap_state = ZRAP_READ_FIR_CMD;

+    //return normal_getzrapread();

+    return normal_getcfunset(ZAT_POWERON);

+}

+

+//²éѯÐźÅÇ¿¶Èat+csq

+char* start_query_csq(void *msg,struct at_context *context)

+{

+    return normal_getcsq();

+}

+

+

+char* start_verifypin_cmd(void *msg,struct at_context *context)

+{

+    char modemState[50] = {0};

+    if (msg == NULL)

+    {

+        return NULL;

+    }

+    cfg_get_item(NV_MODEM_MAIN_STATE,modemState,sizeof(modemState));

+    at_print(AT_DEBUG,"VerifyPin %s.modem_main_state is %s.\n",((MSG_BUF*)msg)->aucDataBuf,modemState);

+    if(0 == strcmp("modem_waitpin",modemState))//ÐèÒªpinÂë

+    {

+        if(strcmp((char *)((MSG_BUF*)msg)->aucDataBuf, "") != 0)

+        {

+            return normal_getcpinset((char *)((MSG_BUF*)msg)->aucDataBuf);

+        }

+    }

+    return NULL;

+}

+

+char* start_verifypuk_cmd(void *msg,struct at_context *context)

+{

+    T_zAt_CpinPukSet tCpinSet = {0};

+    char modemState[50]   = {0};

+    char pinNumber[50] = {0};

+	

+    if (msg == ZUFI_NULL)

+    {

+		return NULL;

+    }

+    cfg_get_item(NV_MODEM_MAIN_STATE,modemState,sizeof(modemState));

+    cfg_get_item(NV_PINNUMBER,pinNumber,sizeof(pinNumber));

+	at_print(AT_DEBUG,"VerifyPuk modem_main_state is %s.\n", modemState);

+ 	if(0 == strcmp("modem_waitpuk",modemState) || 0 == strcmp("0",pinNumber)) //ÐèÒªpukÂë

+	{

+		memcpy(&tCpinSet,((MSG_BUF*)msg)->aucDataBuf, sizeof(T_zAt_CpinPukSet));

+		

+		at_print(AT_DEBUG,"VerifyPuk puk=%s,newpin=%s\n", tCpinSet.pin, tCpinSet.newpin);

+		if (0 != strcmp(tCpinSet.pin,"") && 0 != strcmp(tCpinSet.newpin,""))

+		{        

+            return normal_getcpukset(tCpinSet.pin, tCpinSet.newpin);

+        }

+    }

+    return NULL;

+}

+

+char* start_netselect_cmd(void *msg,struct at_context *context)

+{

+    char *at_next = NULL;

+    char netMode[50] = {0};

+    cfg_get_item(NV_NET_SELECT_MODE,netMode,sizeof(netMode));

+    if(0 == strcmp("manual_select", netMode))//ÊÖ¶¯ËÑÍø

+    {

+        at_print(AT_DEBUG,"atWeb_NetSelect manual_select!\n");

+        cfg_set("manual_search_network_status", "searching");

+        at_next=normal_getcopstest();

+        normal_copstest_timerout(msg);

+    }

+    else if(0 == strcmp("auto_select", netMode))

+    {

+        at_print(AT_DEBUG,"atWeb_NetSelect auto_select!\n");

+        at_next=normal_getcfunset(ZAT_AIRMODE);

+    }

+	else

+	{

+        at_print(AT_DEBUG,"atWeb_NetSelect ???!\n");

+        at_next=normal_getcfunset(ZAT_AIRMODE);

+	}

+    return at_next;

+}

+

+char *start_pinmanage_cmd(void *msg,struct at_context *context)

+{

+    char *at_next=NULL;

+    char pinMode[10] = {0};

+    T_zAt_PinManage *ptPara = ZUFI_NULL;

+    if(msg == NULL)

+    {

+        return NULL;

+    }

+    ptPara = (T_zAt_PinManage*)(((MSG_BUF*)msg)->aucDataBuf);

+	at_print(AT_DEBUG,"start_pinmanage_webui action=%d,pincode=%s,newpincode=%s!\n",ptPara->action,ptPara->oldPin,ptPara->newPin);

+    if(ZAT_PIN_MANAGE_ENABLE == ptPara->action || ZAT_PIN_MANAGE_DISABLE == ptPara->action)

+    {

+        at_next=normal_getclckset(3,"SC",ptPara->action,ptPara->oldPin);

+        psinfo.clck_state=CLCK_SET_CMD;

+        snprintf(pinMode,sizeof(pinMode), "%d",ptPara->action);

+        cfg_set(NV_CLCK_SET_MODE,pinMode);

+    }

+    else if (ZAT_PIN_MANAGE_MODIFY == ptPara->action)

+    {

+        at_next=normal_getcpwdset("SC",ptPara->oldPin,ptPara->newPin);

+    }

+    return at_next;

+}

+

+char* start_setnetwork_cmd(void *msg,struct at_context *context)

+{

+    char *at_next=NULL;

+    char subType[10] = {0};

+    T_zAt_CopsSet copsSetPara = {0};

+    char netType[30] = {0};

+    cfg_get_item("current_subrat_tmp",subType,sizeof(subType));

+    cfg_get_item(NV_STR_NUM_RPLMN_TMP,copsSetPara.oper,sizeof(copsSetPara.oper));

+    cfg_get_item(NV_CURRENT_RAT_TMP,netType,sizeof(netType));

+    copsSetPara.nettype=atoi(netType);

+    if(0 == strcmp(subType, ""))

+    {

+        copsSetPara.subtype = -1;;

+    }

+    else

+    {

+        copsSetPara.subtype = atoi(subType);

+    }

+    at_print(AT_DEBUG, "atWeb_NetManualselect: %s,--%ld--,%ld\n",copsSetPara.oper,copsSetPara.nettype,copsSetPara.subtype);

+    if(-1 == copsSetPara.subtype)

+    {

+        at_next=normal_getcopsset(2,copsSetPara.oper,copsSetPara.nettype);

+    }

+    else

+    {

+        at_next=normal_getcopsset(3,copsSetPara.oper,copsSetPara.nettype,copsSetPara.subtype);			

+    }	

+    cfg_set(NV_NETWORK_TYPE, "No Service");

+	cfg_set(NV_SUB_NETWORK_TYPE, "No Service");

+

+    return at_next;

+}

+

+char* start_syctimeset_cmd(void *msg,struct at_context *context)

+{

+    struct timeval tp;

+

+    if (0 != gettimeofday(&tp,NULL))

+    {

+        at_print(AT_ERR,"get time of system wrong");

+        return NULL;

+    }

+    return normal_getsyctimeset(tp.tv_sec, tp.tv_usec);

+}

+

+char *start_ussdset_cmd(void *msg,struct at_context *context)

+{

+    char networktype[50]  = {0};

+    char ussdstring[50]  = {0};

+	cfg_get_item("network_type",networktype,sizeof(networktype));

+    if((strcmp("No Service",networktype) == 0) || (strcmp("Limited Service",networktype) == 0) || (strcmp("Searching",networktype) == 0))

+    {

+        cfg_set("ussd_write_flag","1");

+        return NULL;

+    }

+    cfg_get_item("ussd_string",ussdstring,sizeof(ussdstring));

+    return normal_getcusdset(ussdstring);

+}

+

+char *start_ussdcancel_cmd(void *msg,struct at_context *context)

+{

+    char *at_next=NULL;

+    char cancelflag[50]  = {0};

+	cfg_get_item("ussd_cancel_flag",cancelflag,sizeof(cancelflag));

+    if(strcmp(cancelflag,"yes") == 0)

+    {

+        at_next=normal_getcusdset_clean();

+    }

+    else

+    {

+        cfg_set("ussd_write_flag","13");

+    }

+    return at_next;

+}

+

+char *start_airmode_cmd(void *msg,struct at_context *context)

+{

+    char *at_next=NULL;

+    int par = *((int *)(((MSG_BUF*)msg)->aucDataBuf));

+    if(1 == par)

+    {

+        at_next=normal_getcfunset(ZAT_AIRMODE);

+    }

+    else if(0 == par)

+    {

+        at_next=normal_getcfunset(ZAT_POWERON);

+    }

+    return at_next;

+}

+

+//LTEËøÆµ,δʹÓÃ

+char *start_celllock_cmd(void *msg,struct at_context *context)

+{

+    return normal_getzltelcset();

+}

+

+char *start_imeireq_cmd(void *msg,struct at_context *context)

+{

+    return normal_getcgsn();

+}

+

+char *start_zversionreq_cmd(void *msg,struct at_context *context)

+{

+    return normal_getzversion();

+}

+

+char *start_cgdcontset_cmd(void *msg,struct at_context *context)

+{

+	char creg_stat[20] = {0};

+	char cereg_stat[20] = {0};

+	

+	cfg_get_item("cgreg_stat", creg_stat, sizeof(creg_stat));

+	cfg_get_item("cereg_stat", cereg_stat, sizeof(cereg_stat));

+	at_print(AT_ERR,"cgdcontset cgreg =%s, cereg =%s!\n",creg_stat,cereg_stat);

+	if(1 != atoi(creg_stat) && 5 != atoi(creg_stat) && 1 != atoi(cereg_stat) && 5 != atoi(cereg_stat))

+	{//ûËѵ½ÍøÔòÒªÁ¢¼´ÅäÖÃAPN£¬autoapnºÍwebuiÅäÖÃʱÓÐЧ

+		return normal_getcgdcontset(1);

+	}

+	return NULL;

+}

+

+//ϵͳÐÅÏ¢»ñÈ¡ÃüÁîat^sysinfo

+char *start_query_sysinfo(void *msg,struct at_context *context)

+{

+    return normal_getsysinfo();

+}

+

+//zuslotÖ÷¶¯Éϱ¨ÃüÁîµÄ´¦Àí

+char *start_start_zuslot(void *msg,struct at_context *context)

+{

+    T_zAt_ZuslotRes   zuslotPara = {0};

+    char needrestart[50]  = {0};

+    MSG_BUF *buf=NULL;

+    char *at_paras=malloc(strlen((char *)((MSG_BUF*)msg)->aucDataBuf)+1);

+	if(at_paras == NULL)

+		return NULL;

+    memset(at_paras,0,strlen((char *)((MSG_BUF*)msg)->aucDataBuf)+1);

+    strcpy(at_paras,(char *)((MSG_BUF*)msg)->aucDataBuf);

+	

+	void *p[2] = {&zuslotPara.slot,&zuslotPara.slot_state};

+	at_print(AT_DEBUG,"start_start_zuslot at_paras=%s!\n",at_paras);

+	parse_param2("%d,%d", at_paras, p);

+	at_print(AT_DEBUG,"start_start_zuslot slot=%ld,slot_state=%ld!\n",zuslotPara.slot,zuslotPara.slot_state);

+    free(at_paras);

+    if(zuslotPara.slot_state == 0)//°Î¿¨²Ù×÷

+    {	

+        at_print(AT_DEBUG,"zuslot simcard plugout\n");

+        cfg_set(NV_NEED_SIM_PIN,"");

+	    g_SimSlotFlag = FALSE;

+        normal_simcardcfgreset();

+        //¸øsms¡¢pbÄ£¿é·¢ÏûÏ¢£¬nvÖØÖ㬿¨²à¶ÌÐÅ¡¢ÁªÏµÈËɾ³ý

+	    if(g_modem_model)

+	    {

+			if(g_support_sms)	

+            ipc_send_message2(MODULE_ID_AT_CTL,MODULE_ID_SMS,MSG_CMD_ZUSLOT_IND,sizeof(zuslotPara),(unsigned char *)&zuslotPara,0);

+			if(g_support_pb)	

+            ipc_send_message2(MODULE_ID_AT_CTL,MODULE_ID_PB,MSG_CMD_ZUSLOT_IND,sizeof(zuslotPara),(unsigned char *)&zuslotPara,0);

+	    }

+        //psinfo.powersave_state=POWERSAVE_CARDREMOVE_CMD;

+        //return normal_getpowersave();

+    }

+    else if(zuslotPara.slot_state == 1)//²å¿¨²Ù×÷

+    {

+        at_print(AT_DEBUG,"zuslot simcard plugin\n");

+        cfg_get_item("need_restart_when_sim_insert",needrestart,sizeof(needrestart));

+        if(strcmp("yes", needrestart) == 0)//ÖØÆô²Ù×÷

+        {

+            at_print(AT_DEBUG,"zuslot simcard plugin,sendmsg to MODULE_ID_MAIN_CTRL\n");

+            ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+        }

+        else//²»ÖØÆô²Ù×÷£¬ÖØÐÂ×ßÒ»±é¿ª»úÁ÷³Ì

+        {

+            g_SimSlotFlag = TRUE;

+		    g_zUfi_canPdpDail = TRUE;

+			g_need_smspb_init = 0;

+            buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_ZMSRI_MSG,0,NULL);

+            rcv_clt_req_msg_proc(buf);

+            free(buf);

+        }

+    }	

+    return NULL;

+}

+

+char *start_setroam_cmd(void *msg,struct at_context *context)

+{

+    return normal_getsysconfigset();

+}

+

+int sysconfigread_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"sysconfigread_ok_act msg_id=%x!\n",context->msg_id);

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            psinfo.zrap_state = ZRAP_READ_FIR_CMD;

+            *next_req = normal_getzrapread();

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+    }

+    return AT_END;

+}

+

+int sysconfigread_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"zrap_err_act msg_id=%x!\n",context->msg_id);

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            psinfo.zrap_state = ZRAP_READ_FIR_CMD;

+            *next_req = normal_getzrapread();

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+    }

+    return AT_END;

+}

+

+int  zrap_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"zrap_ok_act msg_id=%x!\n",context->msg_id);

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        case MSG_CMD_VERIFY_PIN_REQ:

+        case MSG_CMD_VERIFY_PUK_REQ:

+        {

+            if(psinfo.zrap_state == ZRAP_READ_FIR_CMD)//¿ª»úÁ÷³Ì×ߵķÖÖ§

+            {

+                *next_req = normal_getcpinread();

+				if(*next_req){

+                *next_len = strlen(*next_req);

+                return AT_CONTINUE;

+				}

+            }

+            else if(psinfo.zrap_state == ZRAP_READ_SEC_CMD)//pinºÍpukÂëÑéÖ¤ºó×ߵķÖÖ§

+            {

+                char pinSet[50]={0};

+                normal_recvzrapok();

+                cfg_get_item(NV_PINSET_RESULT,pinSet,sizeof(pinSet));

+                if(0 == strcmp(pinSet,"succ"))

+                {

+                    *next_req = normal_getcgsn();

+					if(*next_req){

+                        *next_len = strlen(*next_req);

+                        return AT_CONTINUE;

+					}

+                }

+            }

+            psinfo.zrap_state=ZRAP_OTHER_CMD;

+            return AT_END;

+        }

+        case MSG_CMD_PIN_NUM_REQ:

+        {

+            *next_req=malloc(10);

+			if(*next_req){

+                *next_len=10;

+                cfg_get_item("pinnumber",*next_req, 10-1);

+                return AT_END;

+			}

+			break; // cov 	M

+        }

+        case MSG_CMD_PIN_MANAGE_REQ:

+        {

+            normal_recvzrapok();

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int  zrap_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        case MSG_CMD_PIN_MANAGE_REQ:

+        case MSG_CMD_VERIFY_PIN_REQ:

+        case MSG_CMD_VERIFY_PUK_REQ:

+        {

+            psinfo.zrap_state=ZRAP_OTHER_CMD;

+            if ((0 == strcmp(at_str, "10"))    /*no sim card*/

+                             ||(0 == strcmp(at_str, "13"))    /*card initialize failed*/

+                             ||(0 == strcmp(at_str, "15")))    /*card error*/

+            {

+                if(0 == strcmp(at_str, "13"))

+                {

+                    cfg_set(NV_MODEM_MAIN_STATE,"modem_sim_destroy");

+                    at_print(AT_DEBUG,"modem_sim_destroy:%s\n",at_str);

+                }

+                else

+                {

+                    cfg_set(NV_MODEM_MAIN_STATE,"modem_sim_undetected");

+                    at_print(AT_DEBUG,"modem_sim_undetected:%s\n",at_str);

+                }

+

+				

+				ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MMI, MSG_CMD_SIM_ABNORMAL_IND, 0, NULL,0);

+				

+                /*³õʼ»¯pbmµÄAP ²àµç»°±¾×¼±¸³É¹¦£¬·ñÔòÎÞ¿¨Ê±webuiתȦ*/

+                cfg_set("pbm_init_flag","0");

+                

+                //½ø·ÉÐÐģʽ

+                //*next_req = normal_getpowersave();

+                //*next_len = strlen(*next_req);

+                //psinfo.powersave_state=POWERSAVE_CARDERROR_CMD;

+                /*struct timeval tp;

+                if (0 != gettimeofday(&tp,NULL))

+                {

+                    at_print(AT_DEBUG,"get time of system wrong");

+                    return AT_END;

+                }

+                *next_req = normal_getsyctimeset(tp.tv_sec, tp.tv_usec);*/

+				*next_req = normal_getmtnetset(mccNum);

+				if(*next_req){

+                *next_len = strlen(*next_req);

+                return AT_CONTINUE;

+				}

+            }

+            return AT_END;

+        }

+        case MSG_CMD_PIN_NUM_REQ:

+        {

+            *next_req=malloc(10);

+			if(*next_req){

+            *next_len=10;

+            strcpy(*next_req,"0");

+            return AT_END;

+			}

+        }

+    }

+    return AT_END;

+}

+

+int sysconfig_auto_act( char *at_paras ,int is_query_report)

+{

+    int mode = ZAT_SYSCONFIG_MODE_AUTO;

+    int acqorder = ZAT_SYSCONFIG_PREF_ACQ_AUTO;

+    int  modenow = -1;

+    int  acqordernow = -1;

+    int  roam = -1;

+    int  roamnow = -1;

+    int  srvdomain = -1;	

+	char auto_acqorder[50] = {0};

+	char strTemp[10] = {0};

+	

+	cfg_get_item("auto_acqorder",auto_acqorder,sizeof(auto_acqorder));

+

+	at_print(AT_DEBUG,"sysconfig_auto_act\n");	

+    sscanf(at_paras,"%d,%d,%d,%d",&modenow,&acqordernow,&roamnow,&srvdomain);

+

+	at_print(AT_DEBUG,"sysconfig_auto_act modenow=%d, acqordernow=%d, auto_acqorder=%s\n",modenow, acqordernow, auto_acqorder);	

+

+	//×Ô¶¯ËÑÍøµÄÍøÂç½ÓÈë´ÎÐòΪ¿Õ£¬¶øµ±Ç°²éѯµ½µÄËÑÍø·½Ê½ÊÇ×Ô¶¯£¬Ôò±£´æÍøÂç½ÓÈë´ÎÐò

+	if(0 == strlen(auto_acqorder) && modenow == 2)

+	{		

+	    snprintf(strTemp, sizeof(strTemp), "%d", acqordernow);

+	    cfg_set("auto_acqorder", strTemp);

+	}

+	

+	normal_getsysconfigsetParam(&mode, &acqorder, &roam);

+	if(mode != modenow || acqorder != acqordernow || roam != roamnow)

+	{

+		MSG_BUF *msg_buf = NULL;

+		msg_buf=normal_getmsg(MODULE_ID_AT_CTL, MODULE_ID_AT_CTL, MSG_CMD_NET_SELECT_REQ, 0, NULL);

+		rcv_msg_proc(msg_buf);

+		free(msg_buf);

+	}

+

+    return AT_END;

+}

+

+int zrap_auto_act( char *at_paras ,int is_query_report)

+{

+    char strTemp[10] = {0};

+    int  pinNum1 = -1;

+    int  pinNum2 = -1;

+    int  pukNum1 = -1;

+    int  pukNum2 = -1;

+    at_print(AT_DEBUG,"zrap_auto_act\n");	

+    sscanf(at_paras,"%d,%d,%d,%d",&pinNum1,&pinNum2,&pukNum1,&pukNum2);

+

+    snprintf(strTemp, sizeof(strTemp),"%d", pinNum1);

+    cfg_set(NV_PINNUMBER, strTemp);

+	

+    snprintf(strTemp, sizeof(strTemp),"%d", pukNum1);

+    cfg_set(NV_PUKNUMBER, strTemp);

+    return AT_END;

+}

+

+//cpin²éѯ·µ»Øok´¦Àíº¯Êý

+int cpin_read_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            char simPin[50] = {0};

+            char simPuk[50] = {0};

+            char autoSimpin[50] = {0};

+            char autoCode[50] = {0};

+            char pinNumber[50] = {0};

+            cfg_get_item(NV_SIM_PIN,simPin,sizeof(simPin));

+            cfg_get_item(NV_SIM_PUK,simPuk,sizeof(simPuk));

+            

+            /*²»ÐèÒªPINÂ룬·¢CGSN²éѯÃüÁî*/

+            if(strcmp("0",simPin) == 0 && strcmp("0",simPuk) == 0 )

+            {	

+				*next_req = normal_getcgregset("2");

+				if(*next_req){

+                *next_len = strlen(*next_req);

+                return AT_CONTINUE;

+				}

+            }

+            /*ÐèÒªÑéÖ¤*/

+            else if(strcmp("1",simPin)==0)

+            {

+            	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MMI, MSG_CMD_SIM_ABNORMAL_IND, 0, NULL,0);

+

+                cfg_get_item(NV_AUTO_SIMPIN,autoSimpin,sizeof(autoSimpin));

+                cfg_get_item(NV_AUTO_SIMPIN_CODE,autoCode,sizeof(autoCode));

+                cfg_get_item(NV_PINNUMBER,pinNumber,sizeof(pinNumber));

+                /*×Ô¶¯pinÂëÑéÖ¤*/

+                if((0 == strcmp(autoSimpin,"1")) && (strcmp(autoCode,"") != 0))

+                {

+                    *next_req = normal_getcpinset(autoCode);

+					if(*next_req){

+                    *next_len = strlen(*next_req);

+                    return AT_CONTINUE;

+					}

+                }

+                /*ÈôpinµÄÊ£Óà´ÎÊýΪ0£¬Ôò½«ÊÇ·ñÐèÒªPukÂë¸ÄΪ1*/

+                else if(strcmp("0",pinNumber)==0)

+                {

+                    cfg_set(NV_MODEM_MAIN_STATE,"modem_waitpuk");

+                    return AT_END;

+                }

+                return AT_END;

+            }

+

+			break; // cov M MISSING_BREAK

+        }

+        case MSG_CMD_PIN_STATUS_REQ:

+        {

+            char simPin[50] = {0};

+            char simPuk[50] = {0};

+            

+            cfg_get_item("sim_pin",simPin,sizeof(simPin));

+            cfg_get_item("sim_puk",simPuk,sizeof(simPuk));  

+            *next_req=malloc(10);

+			if(*next_req){

+            *next_len=10;

+            if(strcmp("0", simPin) == 0 && strcmp("0", simPuk) == 0 )

+            {

+                sprintf(*next_req,"%d", PIN_STATUS_NO_PIN);

+            }

+            else if(strcmp("1", simPin)==0)

+            {

+                sprintf(*next_req,"%d", PIN_STATUS_PIN1);

+            }  

+            else if(strcmp("1", simPuk)==0)

+            {

+                sprintf(*next_req,"%d", PIN_STATUS_PUK1);

+            }  

+            return AT_END;

+			}

+        }

+    }

+    return AT_END;

+}

+

+int cpin_read_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            if ((0 == strcmp(at_str, "10"))    /*no sim card*/

+                             ||(0 == strcmp(at_str, "13"))    /*card initialize failed*/

+                             ||(0 == strcmp(at_str, "15")))    /*card error*/

+            {

+                if(0 == strcmp(at_str, "13"))

+                {

+                    cfg_set(NV_MODEM_MAIN_STATE,"modem_sim_destroy");

+                    at_print(AT_DEBUG,"modem_sim_destroy:%s\n",at_str);

+                }

+                else

+                {

+                    cfg_set(NV_MODEM_MAIN_STATE,"modem_sim_undetected");

+                    at_print(AT_DEBUG,"modem_sim_undetected:%s\n",at_str);					

+                }

+

+				ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MMI, MSG_CMD_SIM_ABNORMAL_IND, 0, NULL,0);

+

+                /*³õʼ»¯pbmµÄAP ²àµç»°±¾×¼±¸³É¹¦£¬·ñÔòÎÞ¿¨Ê±webuiתȦ*/

+                cfg_set("pbm_init_flag","0");

+                

+                //½ø·ÉÐÐģʽ

+                //*next_req = normal_getpowersave();

+                //*next_len = strlen(*next_req);

+                /*struct timeval tp;

+                if (0 != gettimeofday(&tp,NULL))

+                {

+                    at_print(AT_DEBUG,"get time of system wrong");

+                    return AT_END;

+                }

+                *next_req = normal_getsyctimeset(tp.tv_sec, tp.tv_usec);*/

+				*next_req = normal_getmtnetset(mccNum);

+				if(*next_req){

+                *next_len = strlen(*next_req);

+                //psinfo.powersave_state=POWERSAVE_CARDERROR_CMD;

+                return AT_CONTINUE;

+				}

+            }

+            return AT_END;

+        }

+        case MSG_CMD_PIN_STATUS_REQ:

+        {

+            *next_req=malloc(10);

+			if(*next_req){

+            *next_len=10;

+            sprintf(*next_req,"%d", PIN_STATUS_NO_PIN);

+            return AT_END;

+			}

+        }

+    }

+    return AT_END;

+}

+

+

+int cpin_set_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        case MSG_CMD_VERIFY_PIN_REQ:

+        {

+            char pinProcess[50] = {0};

+            MSG_BUF *buf=NULL;

+            cfg_get_item(NV_PIN_PUK_PROCESS,pinProcess,sizeof(pinProcess));

+            if(strcmp(pinProcess,"begin") == 0)

+            {

+                cfg_set(NV_PIN_PUK_PROCESS, "end");        

+            }

+            cfg_set(NV_PINSET_RESULT,"succ");

+            cfg_set(NV_MODEM_MAIN_STATE,"modem_ready");

+            /*at_next=malloc(AT_CMD_MAX);

+            //PINÂëÉèÖóɹ¦£¬·¢AT+ZRAP?ÊÇΪÁ˸üÐÂPINÂëºÍpukÂëÊ£Óà´ÎÊý

+            sprintf(at_next,"AT+ZRAP?\r\n");

+            *next_req = at_next;

+            *next_len = strlen(at_next);

+            psinfo.zrap_state = ZRAP_READ_SEC_CMD;

+            return AT_CONTINUE;*/

+            buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_ZMSRI_MSG,0,NULL);

+            rcv_clt_req_msg_proc(buf);

+            free(buf);

+            return AT_END;

+        }

+        case MSG_CMD_VERIFY_PUK_REQ:

+        {

+            char modemState[50] = {0};

+			char pinProcess[50] = {0};

+

+			cfg_set(NV_PINSET_RESULT,"succ");

+			cfg_get_item(NV_PIN_PUK_PROCESS,pinProcess,sizeof(pinProcess));

+			if(strcmp(pinProcess,"begin") == 0)

+		    {

+		        cfg_set(NV_PIN_PUK_PROCESS, "end");

+		    }

+            

+            cfg_get_item(NV_MODEM_MAIN_STATE,modemState,sizeof(modemState));

+            if(strcmp("modem_init_complete",modemState))

+            {

+                cfg_set(NV_MODEM_MAIN_STATE,"modem_ready");

+            }

+            *next_req = normal_getclckset(2,"SC",2);

+			if(*next_req){

+                *next_len = strlen(*next_req);

+                return AT_CONTINUE;

+			}

+			break;

+        }

+        case MSG_CMD_PIN_VERIFY_REQ:

+        {

+            *next_req=malloc(10);

+			if(*next_req){

+                *next_len=10;

+                strcpy(*next_req,"0");

+                return AT_END;

+			}

+			break;

+        }

+    }

+    return AT_END;

+}

+

+int cpin_set_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        case MSG_CMD_VERIFY_PIN_REQ://PINÂëÑéÖ¤

+        {

+            char autoSimpin[50] = {0};

+            cfg_get_item(NV_AUTO_SIMPIN,autoSimpin,sizeof(autoSimpin));

+            if(0 == strcmp(autoSimpin,"1"))

+            {

+                cfg_set(NV_AUTO_SIMPIN,"0");

+            }

+            if(0 == strcmp(at_str, "16"))

+            {

+                cfg_set(NV_MODEM_MAIN_STATE,"modem_waitpin");

+            }

+            else if (0 == strcmp(at_str, "12"))	

+            {

+                /*Êä´í3´Îpin£¬½«±äΪwaitpuk*/

+                cfg_set(NV_MODEM_MAIN_STATE,"modem_waitpuk");

+            }

+            cfg_set(NV_PINSET_RESULT,"fail");

+            *next_req = normal_getzrapread();

+			if(*next_req){

+                *next_len = strlen(*next_req);

+                psinfo.zrap_state = ZRAP_READ_SEC_CMD;

+                return AT_CONTINUE;

+			}

+

+			break; // cov M MISSING_BREAK

+        }

+        case MSG_CMD_VERIFY_PUK_REQ://PUKÂëÑéÖ¤

+        {

+            char modemState[50] = {0};

+            if (0 == strcmp(at_str, "16"))       

+            {

+                cfg_get_item(NV_MODEM_MAIN_STATE,modemState,sizeof(modemState));

+                if(strcmp("modem_init_complete",modemState))

+        	    {

+                    cfg_set(NV_MODEM_MAIN_STATE,"modem_waitpuk");

+        	    }		

+            }

+			else if (0 == strcmp(at_str, "13"))

+            {

+                cfg_set(NV_MODEM_MAIN_STATE,"modem_sim_destroy");

+                at_print(AT_DEBUG,"modem_sim_destroy:%s\n",at_str);

+            }

+        	cfg_set(NV_PINSET_RESULT,"fail");

+            *next_req = normal_getzrapread();

+			if(*next_req){

+                *next_len = strlen(*next_req);

+                psinfo.zrap_state = ZRAP_READ_SEC_CMD;

+                return AT_CONTINUE;

+			}

+

+			break; // cov M MISSING_BREAK

+        }

+        case MSG_CMD_PIN_VERIFY_REQ://wifiÄ£¿é·¢¹ýÀ´µÄÏûÏ¢

+        {

+            *next_req=malloc(10);

+			if(*next_req){

+                *next_len=10;

+                strcpy(*next_req,"1");

+                return AT_END;

+			}

+

+			break;

+        }

+    }

+    return AT_END;

+}

+

+//ÀàËÆcopsÅжÏǰ׺£¬·À´íÎó´¦Àí

+int cpin_auto_act(char *at_paras ,int is_query_report)

+{

+    /*ÏìӦΪReady£¬²»ÐèÒªPInÂëÑéÖ¤*/

+    if (strcmp("READY", at_paras) == 0)

+    {

+        cfg_set(NV_SIM_PIN, "0");

+        cfg_set(NV_SIM_PUK, "0");

+		//cfg_set(NV_NEED_SIM_PIN,"");

+    }

+    /*Èç¹ûµ±Ç°ÃÜÂëÊäÈëÇëÇóΪPIN»òPIN2£¬ÔòÊäÈë+CPIN=<pin>½øÐÐУÑé*/

+    else if(strcmp("SIM PIN",at_paras) == 0 || strcmp("SIM PIN2",at_paras) == 0)

+    {

+        cfg_set(NV_SIM_PIN, "1");

+        cfg_set(NV_MODEM_MAIN_STATE,"modem_waitpin");

+		cfg_set(NV_NEED_SIM_PIN,"yes");

+    }

+    /*Èç¹ûµ±Ç°ÃÜÂëÊäÈëÇëÇóΪPUK»òPUK2£¬ÔòÊäÈë+CPIN=<pin>,<newpin>½øÐнâËø*/

+    else if(strcmp("SIM PUK",at_paras) == 0 || strcmp("SIM PUK2",at_paras) == 0)

+    {

+        cfg_set(NV_SIM_PUK, "1");

+        cfg_set(NV_MODEM_MAIN_STATE,"modem_waitpuk");

+		cfg_set(NV_NEED_SIM_PIN,"yes");

+    }

+

+    return AT_END;

+}

+

+

+int  cgsn_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_GET_MAC_REQ:

+        {

+#if 0        

+            *next_req=normal_getmacread();

+            *next_len=strlen(*next_req);

+            return AT_CONTINUE;

+#endif			

+        }

+    }

+    return AT_END;

+}

+

+int  cgsn_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_GET_MAC_REQ:

+        {

+#if 0        

+            *next_req=normal_getmacread();

+            *next_len=strlen(*next_req);

+            return AT_CONTINUE;

+#endif			

+        }

+    }

+    return AT_END;

+}

+

+int cgsn_auto_act(char *at_paras ,int is_query_report)

+{

+	at_print(AT_DEBUG,"cgsn_auto_act\n");	

+    cfg_set(NV_IMEI,at_paras);

+    return AT_END;

+}

+

+int ziccid_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {        

+		case MSG_CMD_MODEMREG_INFO_REQ:

+		{

+			*next_req = normal_getcimi();

+			if(*next_req){

+			*next_len = strlen(*next_req);

+			return AT_CONTINUE;

+			}

+		}

+    }

+    return AT_END;

+}

+

+int ziccid_auto_act( char *at_paras ,int is_query_report)

+{

+    cfg_set(NV_ZICCID, at_paras);

+    return AT_END;

+}

+

+int  crsm_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"crsm_ok_act msg_id=%d\n",context->msg_id);

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            char strPlmn[70] = {0};

+            char *pRes=NULL;

+            char strPlmnLast[10] = {0};

+            cfg_get_item("crsm_plmn", strPlmn, sizeof(strPlmn));

+            pRes = strstr(strPlmn, "144,0,");//±íʾÕýÈ·¶ÁÈ¡

+            if(0 == strlen(strPlmn) || NULL == pRes)

+            {

+                g_plmnLen = 5;

+            }

+            strncpy(strPlmnLast, &strPlmn[strlen(strPlmn)-2], 2);

+            if(0 == strcmp("03", strPlmnLast))

+            {

+                g_plmnLen = 6;

+            }

+            else

+            {

+                g_plmnLen = 5;

+            }

+            at_print(AT_DEBUG,"crsm_ok_act, g_plmnLen = %d \n", g_plmnLen);

+            *next_req = normal_getcimi();;

+			if(*next_req){

+                *next_len = strlen(*next_req);

+                return  AT_CONTINUE;

+			}

+			break; // cov M MISSING_BREAK

+        }

+        case MSG_CMD_CRSM_REQ:

+        {

+            if(crsmrsp == NULL){

+				softap_assert("");

+				return AT_END;

+			}

+            *next_req=crsmrsp;

+            *next_len=strlen(*next_req);

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int  crsm_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            at_print(AT_DEBUG,"Recv CrsmPlmnlen ERR.\n");

+            *next_req = normal_getcimi();

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return  AT_CONTINUE;

+			}

+        }

+        case MSG_CMD_CRSM_REQ:

+        {

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+

+int crsm_auto_act(char *at_paras ,int is_query_report)

+{  

+    struct at_context *context = (struct at_context *)is_query_report;

+

+    if(context == NULL)

+        return AT_END;   

+    

+    at_print(AT_DEBUG,"crsm_auto_act msg_id=%x,at_paras=%s!\n",context->msg_id,at_paras);

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            cfg_set("crsm_plmn",at_paras);

+            return AT_END;

+        }

+        case MSG_CMD_CRSM_REQ:

+        {

+            crsmrsp=malloc(256);

+            if(crsmrsp == NULL){

+				softap_assert("");

+				return AT_END;

+			}

+            memset(crsmrsp,0,256);

+            sprintf(crsmrsp,at_paras);

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int  cimi_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            if(normal_locknetmatch(mccNum, mncNum) == TRUE)

+            {

+	            /*struct timeval tp;

+	            if (0 != gettimeofday(&tp,NULL))

+	            {

+	                at_print(AT_DEBUG,"get time of system wrong");

+	                return AT_END;

+	            }

+	            *next_req = normal_getsyctimeset(tp.tv_sec, tp.tv_usec);*/

+				*next_req = normal_getmtnetset(mccNum);

+				if(*next_req){

+    	            *next_len = strlen(*next_req);

+    	            return AT_CONTINUE;

+				}

+	        }

+            else

+            {

+                cfg_set("modem_main_state","modem_imsi_waitnck"); 

+                return  AT_END;

+            }

+

+			break; // cov M

+        }

+        case MSG_CMD_CIMI_REQ:

+        {

+            *next_req=malloc(50);

+			if(*next_req){

+                *next_len=50;

+                cfg_get_item(NV_SIM_IMSI,*next_req,50);

+                return AT_END;

+			}

+

+			break; // cov M

+        }

+		case MSG_CMD_MODEMREG_INFO_REQ:

+		{

+			*next_req = normal_CnumRead();

+			if(*next_req){

+                *next_len = strlen(*next_req);

+    			return AT_CONTINUE;

+			}

+

+			break; // cov M

+		}

+    }

+    return AT_END;

+}

+

+int  cimi_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            if(normal_locknetmatch(mccNum, mncNum) == TRUE)

+            {

+	            /*struct timeval tp;

+	            if (0 != gettimeofday(&tp,NULL))

+	            {

+	                at_print(AT_DEBUG,"get time of system wrong");

+	                return AT_END;

+	            }

+	            *next_req = normal_getsyctimeset(tp.tv_sec, tp.tv_usec);*/

+				*next_req = normal_getmtnetset(mccNum);

+				if(*next_req){

+    	            *next_len = strlen(*next_req);

+    	            return AT_CONTINUE;

+				}

+	        }

+            else

+            {

+                cfg_set("modem_main_state","modem_imsi_waitnck"); 

+                return  AT_END;

+            }

+

+			break; // cov M MISSING_BREAK

+        }

+        case MSG_CMD_CIMI_REQ:

+        {

+            return AT_END;

+        }

+		case MSG_CMD_MODEMREG_INFO_REQ:

+		{

+			*next_req = normal_CnumRead();

+			if(*next_req){

+                *next_len = strlen(*next_req);

+    			return AT_CONTINUE;

+			}

+

+			break; // cov M MISSING_BREAK

+		}

+    }

+    return AT_END;

+}

+

+/*

+int  zapnsave_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_INNER_PDP_INIT:

+        {

+            return AT_END;

+        }

+		//case MSG_CMD_SET_DEFAULT_APN_REQ:

+        //{

+        //    return AT_END;

+        //}

+        default:

+            softap_assert("");

+        

+    }

+    return AT_END;

+}

+

+int  zapnsave_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    softap_assert("");

+    return AT_END;

+}

+*/

+int cimi_auto_act(char *at_paras, int is_query_report)

+{  

+    char ccmncNum[10]         = {0};

+    struct at_context *context = (struct at_context *)is_query_report;

+    

+    strncpy(imsi,at_paras,sizeof(imsi)-1);

+	imsi[49]=0;

+    strncpy(mccNum, imsi, 3);

+    at_print(AT_DEBUG,"mcc is %s", mccNum);

+#if (APP_OS_TYPE == APP_OS_LINUX)	

+    if(6 == g_plmnLen)

+	{

+		strncpy(mncNum, imsi+3, 3);

+	}

+	else

+	{

+		strncpy(mncNum, imsi+3, 2);

+	}

+    

+    snprintf(ccmncNum, 10-1, "%s%s", mccNum, mncNum);

+	cfg_set(NV_SIM_IMSI, imsi);

+	normal_get_cardtype(ccmncNum);

+    switch(context->msg_id)

+    {		

+		case ATCTL_INNER_ZMSRI_MSG:

+		case MSG_CMD_CIMI_REQ:

+		{

+			normal_getautoapn(ccmncNum);

+			break;

+		}

+	  	default:

+        {           

+            break;

+        }

+    }

+#endif

+    return AT_END;

+}

+

+int sysconfig_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_NET_SELECT_REQ:

+        {

+            *next_req = normal_getcfunset(ZAT_POWERON);

+			if(*next_req){

+                *next_len = strlen(*next_req);

+                cfg_set(NV_NET_SELECT_RESULT, "sucess");

+                return  AT_CONTINUE;

+			}

+

+			break; // cov M MISSING_BREAK

+        }

+

+		default:

+		{

+		    break;

+		}

+    }

+    return AT_END;

+}

+

+int sysconfig_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+     switch(context->msg_id)

+     {

+        case MSG_CMD_NET_SELECT_REQ:

+        {

+            *next_req = normal_getcfunset(ZAT_POWERON);

+			if(*next_req){

+                *next_len = strlen(*next_req);

+                cfg_set(NV_NET_SELECT_RESULT, "fail");

+                return  AT_CONTINUE;

+			}

+

+			break; // cov M MISSING_BREAK

+        }

+

+		default:

+		{

+		    break;

+		}

+     }

+     return AT_END;

+}

+

+int cfun_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+	cfg_set("cfun_work", "none");

+    switch(context->msg_id)

+    {

+        //¿ª»úÁ÷³ÌÖÐAT+CFUN=1

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            char modemState[50]  = {0};

+            normal_cfunOkSet();

+            cfg_get_item(NV_MODEM_MAIN_STATE,modemState,sizeof(modemState));

+            if(0 == strcmp("modem_syscfg_exption",modemState))

+            {

+                cfg_set(NV_MODEM_MAIN_STATE,"modem_destroy"); 

+            }

+            else

+            {

+                cfg_set(NV_MODEM_MAIN_STATE,"modem_init_complete");      

+            }

+            //*next_req = normal_getcgregset("2");

+            //psinfo.zrap_state = ZRAP_READ_FIR_CMD;

+            //*next_req = normal_getzrapread();

+        //#ifdef GUODIAN

+            if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN)

+            {

+			    return  AT_END;

+            }

+		//#else

+		    else

+            {      

+    			*next_req = normal_getsysconfigread();

+				if(*next_req){

+                    *next_len = strlen(*next_req);

+                    return  AT_CONTINUE;

+				}

+            }

+

+			break; // cov M MISSING_BREAK

+		//#endif

+        }

+        //×Ô¶¯ËÑÍø

+        case MSG_CMD_NET_SELECT_REQ:

+        {

+            if(cfun_state==4)

+            {

+                *next_req = normal_getsysconfigset();

+				if(*next_req){

+                    *next_len = strlen(*next_req);

+                    return  AT_CONTINUE;

+				}

+            }

+            else if(cfun_state==1)

+            {

+                char mMode[50] = {0};

+                cfg_get_item(NV_M_NETSELECT_MODE,mMode,sizeof(mMode));

+                if(0 == strcmp("1", mMode))

+                {

+                    *next_req = normal_getcopsset(1,"0");

+					if(*next_req){

+                    *next_len = strlen(*next_req);

+                    return  AT_CONTINUE;

+					}

+                }

+                else

+                {

+                    return AT_END;

+                }

+            }

+			

+            return AT_END;

+        }

+        case MSG_CMD_AIRMODE_SET_REQ:

+        {

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int cfun_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+	cfg_set("cfun_work", "none");

+    switch(context->msg_id)

+    {

+        //¿ª»úÁ÷³ÌÖÐAT+CFUN=1

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            cfg_set(NV_MODEM_MAIN_STATE,"modem_destroy");

+            return  AT_END;

+        }

+        //×Ô¶¯ËÑÍø

+        case MSG_CMD_NET_SELECT_REQ:

+        {

+            if(cfun_state==4)

+            {

+                *next_req = normal_getsysconfigset();

+				if(*next_req){

+                    *next_len = strlen(*next_req);

+                    return  AT_CONTINUE;

+				}

+            }

+            else if(cfun_state==1)

+            {

+                char mMode[50] = {0};

+                cfg_get_item(NV_M_NETSELECT_MODE,mMode,sizeof(mMode));

+                if(0 == strcmp("1", mMode))

+                {

+                    *next_req = normal_getcopsset(1,"0");

+					if(*next_req){

+                    *next_len = strlen(*next_req);

+                    return  AT_CONTINUE;

+					}

+                }

+                else

+                {

+                    return AT_END;

+                }

+            }

+            return AT_END;

+        }

+        case MSG_CMD_AIRMODE_SET_REQ:

+        {

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int cgreg_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    *next_req = normal_getceregset("2");

+	if(*next_req)

+    *next_len = strlen(*next_req);

+    return  AT_CONTINUE;

+}

+

+int cgreg_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    *next_req = normal_getceregset("2");

+	if(*next_req)

+    *next_len = strlen(*next_req);

+    return  AT_CONTINUE;

+}

+

+int cereg_set_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+

+    char *at_next = NULL;

+    

+    //at_next=normal_getcgmr();

+    at_next=normal_getcrsmset("176,28589,0,0,4");

+

+    *next_req = at_next;

+    //*next_req = normal_getzsqrset("0");

+	if(*next_req)

+    *next_len = strlen(*next_req);

+    return  AT_CONTINUE;

+}

+

+int cereg_set_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    char *at_next = NULL;

+    

+    //at_next=normal_getcgmr();

+    at_next=normal_getcrsmset("176,28589,0,0,4");

+    

+    *next_req = at_next;

+    //*next_req = normal_getzsqrset("0");

+	if(*next_req)

+    *next_len = strlen(*next_req);

+    return  AT_CONTINUE;

+}

+

+int zsqr_auto_act(char *at_paras ,int is_query_report)

+{

+    char strBuf[10] = {0};

+    T_zAt_CsqUnSolicite zsqrResPara = {0};

+    sscanf(at_paras, "%ld,%ld,%ld", &zsqrResPara.rssi, &zsqrResPara.ber, &zsqrResPara.act);

+

+#if 1    // kw 3 SV.TAINTED.CALL.BINOP

+    if(zsqrResPara.rssi < 0 || zsqrResPara.rssi > LONG_MAX-1)

+    {

+        zsqrResPara.rssi = 0;

+    }

+

+    if(zsqrResPara.ber < 0 || zsqrResPara.ber > LONG_MAX-1)

+    {

+        zsqrResPara.ber = 0;

+    }

+

+    if(zsqrResPara.act < 0 || zsqrResPara.act > LONG_MAX-1)

+    {

+        zsqrResPara.act = 0;

+    }    

+#endif 

+

+    snprintf(strBuf, sizeof(strBuf),"%ld", zsqrResPara.rssi);

+    cfg_set(NV_CSQ, strBuf);

+    if(zsqrResPara.act == 3) 

+	{

+		normal_calcsignalbar(ZAT_SIGNALBAR_TYPE_GSM);

+		normal_calcsignalstrength(ZAT_SIGNALBAR_TYPE_GSM, zsqrResPara.rssi);

+	}

+	else if(zsqrResPara.act == 5)

+	{

+		normal_calcsignalbar(ZAT_SIGNALBAR_TYPE_WCDMA);

+		normal_calcsignalstrength(ZAT_SIGNALBAR_TYPE_WCDMA, zsqrResPara.rssi);

+	}

+	else if(zsqrResPara.act == 15)

+	{

+		normal_calcsignalbar(ZAT_SIGNALBAR_TYPE_TDS);

+		normal_calcsignalstrength(ZAT_SIGNALBAR_TYPE_TDS, zsqrResPara.rssi);

+	}

+	else if(zsqrResPara.act == 17)

+	{		

+		normal_calcsignalbar(ZAT_SIGNALBAR_TYPE_LTE);

+		normal_calcsignalstrength(ZAT_SIGNALBAR_TYPE_LTE, zsqrResPara.rssi);

+	}

+    else if(zsqrResPara.act == 0)

+    {

+        normal_calcsignalbar(ZAT_SIGNALBAR_TYPE_NONE);

+    }

+    return AT_END;

+}

+

+int cops_set_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_QUERY_SYSINFO_REQ:

+        {

+            //*next_req = normal_getcgmr();

+			*next_req = normal_getcopsread();

+			if(*next_req){

+                *next_len = strlen(*next_req);

+                return AT_CONTINUE;

+			}

+			break; // cov M

+        }

+        case MSG_CMD_NET_SELECT_REQ:

+        {

+            cfg_set(NV_M_NETSELECT_MODE, "0");

+            return AT_END;

+        }

+        case MSG_CMD_NETWORK_SET_REQ:

+        {

+            char    rplmnTmp[50]  = {0};

+            char    ratTmp[50]  = {0};

+            cfg_get_item(NV_STR_NUM_RPLMN_TMP,rplmnTmp,sizeof(rplmnTmp));

+            cfg_get_item(NV_CURRENT_RAT_TMP,ratTmp,sizeof(ratTmp));

+            cfg_set(NV_M_NETSELECT_RESULT, "manual_success");

+            cfg_set(NV_STR_NUM_RPLMN,rplmnTmp);

+            cfg_set(NV_CURRENT_RAT,ratTmp);

+            cfg_set(NV_M_NETSELECT_MODE, "1");

+            *next_req = normal_getsysinfo();

+			if(*next_req){

+                *next_len = strlen(*next_req);

+                return AT_CONTINUE;

+			}

+

+			break; // cov M

+        }

+    }

+    return AT_END;

+}

+

+int cops_set_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_QUERY_SYSINFO_REQ:

+        {

+            //*next_req = normal_getcgmr();

+			*next_req = normal_getcopsread();

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+        case MSG_CMD_NET_SELECT_REQ:

+        {

+            return AT_END;

+        }

+        case MSG_CMD_NETWORK_SET_REQ:

+        {

+            cfg_set(NV_M_NETSELECT_RESULT, "manual_fail");

+            *next_req = normal_getsysinfo();

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+    }

+    return AT_END;

+}

+

+int cops_read_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"cops_read_ok_act %x\n",context->msg_id);

+    switch(context->msg_id)

+    {

+        case MSG_CMD_QUERY_SYSINFO_REQ:

+        case MSG_CMD_NETWORK_SET_REQ:

+        {

+            if(g_zUfi_firstCsq)

+            {

+                g_zUfi_firstCsq = FALSE;

+                *next_req = normal_getcsq();

+				if(*next_req){

+                *next_len = strlen(*next_req);

+                return  AT_CONTINUE;

+				}

+            }

+            return AT_END;

+        }

+	}

+    return AT_END;

+}

+

+int cops_read_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"cops_read_ok_act %x\n",context->msg_id);

+    switch(context->msg_id)

+    {

+        case MSG_CMD_QUERY_SYSINFO_REQ:

+        {

+            if(g_zUfi_firstCsq)

+            {

+                g_zUfi_firstCsq = FALSE;

+                *next_req = normal_getcsq();

+				if(*next_req){

+                *next_len = strlen(*next_req);

+                return  AT_CONTINUE;

+				}

+            }

+            return AT_END;

+        }

+		case MSG_CMD_MODEMREG_INFO_REQ:

+		{

+			*next_req = normal_getcsq();

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return  AT_CONTINUE;

+			}

+		}

+    }

+    return AT_END;

+}

+

+int cops_test_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    cfg_set("manual_search_network_status", "finished");

+    return AT_END;

+}

+

+int cops_test_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    cfg_set(NV_NET_NUM, "0");

+    cfg_set(NV_M_NETSELECT_STATUS, "manual_search_fail");

+    DeleteSoftTimer(CopstestTimerID);

+    return AT_END;

+}

+

+int cops_auto_act(char *at_paras ,int is_query_report)

+{

+    //at+cops=?·µ»ØÖµ

+    //zdm ²»µ÷Óã¬Ò²Á¬½Ó²»¹ý

+    #if (APP_OS_TYPE == APP_OS_TOS)

+		softap_assert("");

+	#else

+    

+    struct at_context *context = (struct at_context *)is_query_report;

+

+    if(context == NULL)

+        return AT_END;   

+

+    at_print(AT_DEBUG,"cops_auto_act prefix=%s!\n",context->at_cmd_prefix);

+    if(strstr(context->at_cmd_prefix,"=?"))

+    {

+#if (APP_OS_TYPE == APP_OS_LINUX)	

+		DeleteSoftTimer(CopstestTimerID);

+#elif (APP_OS_TYPE == APP_OS_TOS)	

+		zOss_StopTimer(CopstestTimerID);

+#endif

+        at_print(AT_DEBUG,"come in222!\n");

+        normal_recvcopstestrsp(at_paras);

+    }

+    else if(strstr(context->at_cmd_prefix,"?"))

+    {

+        normal_recvcopsreadrsp(at_paras);

+    }

+	#endif

+    return AT_END;

+}

+

+int  zversion_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"zversion_ok_act\n");

+/*

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            struct timeval tp;

+            if (0 != gettimeofday(&tp,NULL))

+            {

+                at_print(AT_DEBUG,"get time of system wrong");

+                return AT_END;

+            }

+            *next_req = normal_getsyctimeset(tp.tv_sec, tp.tv_usec);

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+	}

+*/	

+    return AT_END;

+}

+

+int  zversion_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"zversion_err_act\n");

+/*

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            struct timeval tp;

+            if (0 != gettimeofday(&tp,NULL))

+            {

+                at_print(AT_DEBUG,"get time of system wrong");

+                return AT_END;

+            }

+            *next_req = normal_getsyctimeset(tp.tv_sec, tp.tv_usec);

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+    }

+*/	

+    return AT_END;

+}

+

+int zversion_auto_act(char *at_paras ,int is_query_report)

+{

+    cfg_set(NV_CR_INNER_VERSION,at_paras);

+    return AT_END;

+}

+

+int  syctime_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            *next_req = normal_getclckset(2,"SC",2);

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+        case MSG_CMD_SYCTIME_SET_REQ:

+        {

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int  syctime_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            *next_req = normal_getclckset(2,"SC",2);

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+        case MSG_CMD_SYCTIME_SET_REQ:

+        {

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int  zsetmtnet_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            *next_req = normal_getclckset(2,"SC",2);

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+        default:

+        {

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int  zsetmtnet_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case ATCTL_INNER_ZMSRI_MSG:

+        {

+            *next_req = normal_getclckset(2,"SC",2);

+			if(*next_req){

+            *next_len = strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+        default:

+        {

+            return AT_END;

+        }

+    }

+    return AT_END;

+}

+

+int  mac_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"mac_ok_act\n");

+    *next_req=normal_getmac2read();

+	if(*next_req)

+    *next_len=strlen(*next_req);

+    return AT_CONTINUE;

+}

+

+int  mac_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_ERR,"mac_err_act\n");

+    if(mactozssid != NULL)

+        free(mactozssid);

+    mactozssid=NULL;

+    return AT_END;

+}

+

+int  mac2_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"mac2_ok_act\n");

+    cfg_set("at_wifi_mac",mactozssid);

+	cfg_save();

+    free(mactozssid);

+    mactozssid=NULL;

+    return AT_END;

+}

+

+int  mac2_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_ERR,"mac2_err_act\n");

+    if(mactozssid != NULL)

+        free(mactozssid);

+    mactozssid=NULL;

+    return AT_END;

+}

+

+int  zltelc_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    long action = 0;

+    char actionLte[30]= {0};

+    cfg_get_item(NV_ACTIONLTE,actionLte,sizeof(actionLte));

+    action  = atoi(actionLte);

+    cfg_set(NV_CELLLOCKSET,"CellSuccess");

+    if(1 == action)

+    {

+        cfg_set(NV_CELLLOCKSTATE,"Locked");

+    }

+    else if(0 == action)

+    {

+        cfg_set(NV_CELLLOCKSTATE,"UnLocked");

+    }

+    return AT_END;

+}

+

+int  zltelc_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    cfg_set(NV_CELLLOCKSET,"CellFail");

+    return AT_END;

+}

+

+int  sysinfo_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    char netType[50]={0};

+	char needCopsNumFormt[10] = {0};

+    cfg_get_item(NV_NETWORK_TYPE,netType,sizeof(netType));

+    cfg_get_item("need_cops_number_format",needCopsNumFormt,sizeof(needCopsNumFormt));

+	sysinfo_flag = 0;

+    if (0!=strcmp("No Service",netType)&&0!=strcmp("Limited Service",netType)

+        &&0!=strcmp(NETWORK_TYPE_INIT,netType))

+    {

+        if(0 == strcmp("yes", needCopsNumFormt) && context->msg_id != MSG_CMD_NETWORK_SET_REQ)//ÉèÖÃÔËÓªÉÌÐÅÏ¢¸ñʽ

+        {

+            *next_req =normal_getcopsset(1,"3,2");

+			if(*next_req)

+			*next_len = strlen(*next_req);

+        }

+        else

+        {

+            *next_req = normal_getcopsread();

+			if(*next_req)

+            *next_len = strlen(*next_req);

+        }

+        return AT_CONTINUE;

+    }

+    return AT_END;

+}

+

+int  sysinfo_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    char netType[50]={0};

+	char needCopsNumFormt[10] = {0};

+    cfg_get_item(NV_NETWORK_TYPE,netType,sizeof(netType));

+	cfg_get_item("need_cops_number_format",needCopsNumFormt,sizeof(needCopsNumFormt));

+	sysinfo_flag = 0;

+    if (0!=strcmp("No Service",netType)&&0!=strcmp("Limited Service",netType)

+        &&0!=strcmp(NETWORK_TYPE_INIT,netType))

+    {

+        if(0 == strcmp("yes", needCopsNumFormt))//ÉèÖÃÔËÓªÉÌÐÅÏ¢¸ñʽ

+        {

+            *next_req =normal_getcopsset(1,"3,2");

+			if(*next_req)

+			*next_len = strlen(*next_req);

+        }

+        else

+        {

+            *next_req = normal_getcopsread();

+			if(*next_req)

+            *next_len = strlen(*next_req);

+        }

+        return AT_CONTINUE;

+    }

+    return AT_END;

+}

+

+int  cusd_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    cfg_set("ussd_write_flag","4");

+    cfg_set("ussd_cancel_flag","no");

+    return AT_END;

+}

+

+int  clck_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_PIN_MANAGE_REQ:

+        {

+            if(psinfo.clck_state==CLCK_SET_CMD)

+            {

+                char clckMode[10] = {0};

+                cfg_get_item(NV_CLCK_SET_MODE,clckMode,sizeof(clckMode));

+                if (0==strcmp(clckMode,"0"))

+                {

+                    cfg_set(NV_NEED_SIM_PIN,"");

+                }

+                else if (0==strcmp(clckMode,"1"))

+                {

+                    cfg_set(NV_NEED_SIM_PIN,"yes");

+                }

+                cfg_set(NV_PIN_MANAGE_RESULT, "0");

+                *next_req=normal_getclckset(2,"SC",2);

+				if(*next_req){

+                *next_len=strlen(*next_req);

+                psinfo.clck_state=CLCK_REQ_CMD;

+                return AT_CONTINUE;

+				}

+            }

+            else if(psinfo.clck_state==CLCK_REQ_CMD)

+            {

+                *next_req=normal_getzrapread();

+				if(*next_req){

+                *next_len=strlen(*next_req);

+                psinfo.clck_state=CLCK_OTHER_CMD;

+                return AT_CONTINUE;

+				}

+            }

+            return AT_END;

+        }

+        case MSG_CMD_VERIFY_PUK_REQ:

+        {

+            MSG_BUF *buf=NULL;

+            buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_ZMSRI_MSG,0,NULL);

+            rcv_clt_req_msg_proc(buf);

+            free(buf);

+            return AT_END;

+        }

+#if (APP_OS_TYPE == APP_OS_LINUX)

+		case MSG_CMD_CLCK_REQ:

+		{

+//			return atCcapp_RecvOk(at_str,context,next_req,next_len);

+		}

+#endif		

+    }

+    return AT_END;

+}

+

+int  clck_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_PIN_MANAGE_REQ:

+        {

+            if(psinfo.clck_state==CLCK_SET_CMD)

+            {

+                cfg_set(NV_PIN_MANAGE_RESULT, "1");

+                *next_req=normal_getzrapread();

+				if(*next_req){

+                *next_len=strlen(*next_req);

+                psinfo.clck_state=CLCK_OTHER_CMD;

+                return AT_CONTINUE;

+				}

+            }

+            else if(psinfo.clck_state==CLCK_REQ_CMD)

+            {

+                cfg_set(NV_PIN_MANAGE_RESULT, "1");

+                *next_req=normal_getzrapread();

+				if(*next_req){

+                *next_len=strlen(*next_req);

+                psinfo.clck_state=CLCK_OTHER_CMD;

+                return AT_CONTINUE;

+				}

+            }

+            return AT_END;

+        }

+        

+        case MSG_CMD_VERIFY_PUK_REQ:

+        {

+            MSG_BUF *buf=NULL;

+            buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,ATCTL_INNER_ZMSRI_MSG,0,NULL);

+            rcv_clt_req_msg_proc(buf);

+            return AT_END;

+        }

+#if (APP_OS_TYPE == APP_OS_LINUX)

+		case MSG_CMD_CLCK_REQ:

+		{

+// for porting at_ctrl 

+// 			return atCcapp_RecvErr(at_str,context,next_req,next_len);

+		}

+#endif		

+    }

+    return AT_END;

+}

+

+int  cpwd_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_PIN_MANAGE_REQ:

+        {

+            cfg_set(NV_PIN_MANAGE_RESULT, "0");

+            *next_req=normal_getzrapread();

+			if(*next_req){

+            *next_len=strlen(*next_req);

+            return AT_CONTINUE;

+			}

+        }

+    }

+    return AT_END;

+}

+

+int  cpwd_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+        case MSG_CMD_PIN_MANAGE_REQ:

+        {

+            cfg_set(NV_PIN_MANAGE_RESULT, "1");

+            *next_req=normal_getzrapread();

+			if(*next_req){

+            *next_len=strlen(*next_req);

+            return AT_CONTINUE;

+			}	

+        }

+    }

+    return AT_END;

+}

+

+int mode_auto_act(char *at_paras ,int is_query_report)

+{

+    T_zUfi_ModeInfoInd   tAtRes      = {0};

+    char strTemp[10]    = {0};

+    char cfunState[50] = {0};

+	char versionmode[2] = {0};

+    MSG_BUF *buf=NULL;

+    

+    at_print(AT_DEBUG,"atBase_RecvModeRsp MODE \n");

+    cfg_get_item(NV_CFUN_STATE,cfunState,sizeof(cfunState));

+    if(!strcmp(cfunState,"0"))

+    {

+        return AT_END;

+    }

+	

+    void *p[2] = {&tAtRes.sys_mode, &tAtRes.sys_submode};

+    at_print(AT_DEBUG,"mode_auto_act at_paras=%s!\n",at_paras);

+    parse_param2("%d,%d", at_paras, p);

+    at_print(AT_DEBUG,"mode_auto_act sys_mode=%ld,sys_submode=%ld!\n",tAtRes.sys_mode,tAtRes.sys_submode);  

+    

+    snprintf(strTemp, sizeof(strTemp),"%ld", tAtRes.sys_mode);

+    cfg_set(NV_SYS_MODE, strTemp);

+    memset(strTemp, 0, 10);

+    snprintf(strTemp, sizeof(strTemp),"%ld", tAtRes.sys_submode);

+    cfg_set(NV_SYS_SUBMODE, strTemp);

+    

+    at_print(AT_DEBUG,"atBase_RecvModeRsp per=%d,cur=%ld!\n",g_zUfi_Mode,tAtRes.sys_mode);

+	//оƬÈÏÖ¤´úÂë

+	cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+	if(0 == strcmp(versionmode, "0"))

+	{

+		if(g_zUfi_Mode != tAtRes.sys_mode || g_zUfi_SubMode != tAtRes.sys_submode)

+	    {

+	        g_zUfi_Mode = tAtRes.sys_mode;

+			g_zUfi_SubMode = tAtRes.sys_submode;

+			if(sysinfo_flag == 0)

+			{

+		        buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_QUERY_SYSINFO_REQ,0,NULL);

+		        rcv_clt_req_msg_proc(buf);

+		        free(buf);

+				sysinfo_flag = 1;//sysinfoÖ»·¢Ò»´Î

+			}

+	    }

+	}

+    return AT_END;

+}

+

+int cereg_auto_act(char *at_paras ,int is_query_report)

+{

+    T_zAt_CeregRes tAtRes = {0};

+    MSG_BUF *buf=NULL;

+	int tac = 0, ci = 0;

+    char strBuf[20] = {0};

+	char versionmode[2] = {0};

+

+    void *p[5] = {&tAtRes.stat, tAtRes.tac, tAtRes.ci, &tAtRes.act,&tAtRes.subact};

+    at_print(AT_DEBUG,"atBase_RecvCeregRsp at_paras=%s!\n",at_paras);

+    parse_param2("%d,%s,%s,%d,%d", at_paras, p);

+    at_print(AT_DEBUG,"atBase_RecvCeregRsp stat=%d,tac=%s,ci=%s,res=%d,sub=%d!\n",

+    tAtRes.stat, tAtRes.tac, tAtRes.ci, tAtRes.act,tAtRes.subact);  

+    sprintf(strBuf, "%d", tAtRes.stat);

+    cfg_set("cereg_stat", strBuf);

+

+	if(tAtRes.act == 7)

+	{

+		trans_Str2Value(tAtRes.tac, FALSE, &tac);

+		memset(strBuf, 0x00, 20);

+		sprintf(strBuf, "%d", tac);

+		cfg_set(NV_TAC_CODE, strBuf);

+		

+		trans_Str2Value(tAtRes.ci, FALSE, &ci);

+		memset(strBuf, 0x00, 20);

+		sprintf(strBuf, "%d", ci);

+		cfg_set(NV_CELL_ID, strBuf);

+	}

+	

+    /*×¢²áÁËÂþÓÎÍøÂç»ò±¾µØÍøÂç*/

+    if( (5 == tAtRes.stat ) || ( 1 == tAtRes.stat ))

+    {

+		buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_QUERY_CGCONTRDP_REQ,0,NULL);

+		rcv_clt_req_msg_proc(buf);

+		free(buf);

+        cfg_set(NV_REG_STATUS,"ok");

+		//zhangfen 1106 EPSÍøÂç×¢²á³É¹¦½øÐÐPDP×Ô¶¯²¦ºÅ

+		if(g_modem_model)

+    	{

+			start_pdp_auto_dial();//Æô¶¯¶¨Ê±Æ÷½øÐÐpdp¼¤»î

+    	}

+    }

+    else

+    {

+        cfg_set(NV_REG_STATUS,"no");

+    }

+    at_print(AT_DEBUG,"atBase_RecvCeregRsp per=%d,cur=%d!\n",g_zUfi_Stat,tAtRes.stat);

+

+	//оƬÈÏÖ¤´úÂë

+	cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+	if(0 == strcmp(versionmode, "0"))

+	{

+		if(g_zUfi_Stat != tAtRes.stat)

+		{

+	        g_zUfi_Stat = tAtRes.stat;

+			if(sysinfo_flag == 0)

+			{

+		        buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_QUERY_SYSINFO_REQ,0,NULL);

+		        rcv_clt_req_msg_proc(buf);

+		        free(buf);

+				sysinfo_flag = 1;//sysinfoÖ»·¢Ò»´Î

+			}

+	    }

+		else

+		{

+			char networkType[50] = {0};

+        	cfg_get_item(NV_NETWORK_TYPE,networkType,sizeof(networkType));

+			if((5 == tAtRes.stat || 1 == tAtRes.stat) && (0 == strcmp("No Service",networkType) || 0 == strcmp("Limited Service",networkType)))

+			{

+				if(sysinfo_flag == 0)

+				{

+			        buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_QUERY_SYSINFO_REQ,0,NULL);

+			        rcv_clt_req_msg_proc(buf);

+			        free(buf);

+					sysinfo_flag = 1;//sysinfoÖ»·¢Ò»´Î

+				}

+			}

+		}

+	}

+    return AT_END;

+}

+

+int can_poweron_dail = 0;

+extern int apn_is_ims;

+int cgreg_auto_act(char *at_paras ,int is_query_report)

+{

+    T_zAt_CgregRes   tAtRes  = {0};

+    MSG_BUF *buf=NULL;

+    char strBuf[10] = {0};

+	char versionmode[2] = {0};

+

+    void *p[6] = {&tAtRes.stat, tAtRes.lac, tAtRes.rac, &tAtRes.act, tAtRes.ci, &tAtRes.subact};

+    at_print(AT_DEBUG,"cgreg_auto_act at_paras=%s!\n",at_paras);

+    parse_param2("%d,%s,%s,%d,%s,%d", at_paras, p);

+    at_print(AT_DEBUG,"cgreg_auto_act stat=%d,lac=%s,rac=%s,act=%d,ci=%s,subact=%d!\n",

+    tAtRes.stat, tAtRes.lac, tAtRes.rac, tAtRes.act, tAtRes.ci, tAtRes.subact);  

+

+    snprintf(strBuf,sizeof(strBuf),"%d", tAtRes.stat);

+    cfg_set("cgreg_stat", strBuf);

+	

+    if(cfun_state==0)

+    {

+        at_print(AT_ERR,"query cgreg err!\n");

+        return AT_END;

+    }

+    /*×¢²áÁËÂþÓÎÍøÂç»ò±¾µØÍøÂç*/

+    if( (5 == tAtRes.stat ) || ( 1 == tAtRes.stat ))

+    {

+		MSG_BUF *msg_buf = NULL;

+		char ppp_status[20] = {0};

+		cfg_get_item(NV_PPP_STATUS, ppp_status, sizeof(ppp_status));

+		//Ö»Óе±Ê״請úºó£¬Ö÷¿ØÔø¾­Ö÷¶¯·¢Æð¹ý²¦ºÅ²¢ÇÒûÓв¦ºÅ³É¹¦£¬´ËʱÔÚÓÐÍøÂçºó

+		//at_ctlÄ£Äâ³ÉÖ÷¿ØÖØÐ·¢Æðpdp¼¤»î

+		if((can_poweron_dail == 0) && (g_defcid_mng.modid == MODULE_ID_MAIN_CTRL) && (0 == strcmp(PPP_DISCONNECTED, ppp_status)))

+		{

+			can_poweron_dail = 1;

+			at_print(AT_ERR,"cgreg_auto_act begin dial!!!\n");

+			msg_buf=normal_getmsg(g_defcid_mng.modid ,MODULE_ID_AT_CTL,MSG_CMD_PDP_ACT_REQ, 0, NULL);

+			rcv_msg_proc(msg_buf);

+			free(msg_buf);

+			msg_buf = NULL;

+		}

+    	if(g_modem_model)

+    	{

+			start_pdp_auto_dial();

+    	}

+        cfg_set(NV_TDREG_STATUS,"ok");

+		//apn_is_ims=-1;//4GºÍ2-3G¿ÉÄÜͬʱ´æÔÚEC:616000620973

+    }

+    else

+    {

+        cfg_set(NV_TDREG_STATUS,"no");

+    }

+    at_print(AT_DEBUG,"atBase_RecvCgregRsp per=%d,cur=%d!\n",g_zUfi_Stat,tAtRes.stat);

+

+	//оƬÈÏÖ¤´úÂë

+	cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+	if(0 == strcmp(versionmode, "0"))

+	{

+	    if(g_zUfi_Stat != tAtRes.stat && g_modem_model)

+	    {

+	        g_zUfi_Stat = tAtRes.stat;

+			if(sysinfo_flag == 0)

+			{

+		        buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_QUERY_SYSINFO_REQ,0,NULL);

+		        rcv_clt_req_msg_proc(buf);

+		        free(buf);

+				sysinfo_flag = 1;//sysinfoÖ»·¢Ò»´Î

+			}

+	    }

+		else

+		{

+			char networkType[50] = {0};

+        	cfg_get_item(NV_NETWORK_TYPE,networkType,sizeof(networkType));

+			if((5 == tAtRes.stat || 1 == tAtRes.stat) && (0 == strcmp("No Service",networkType) || 0 == strcmp("Limited Service",networkType)))

+			{

+				if(sysinfo_flag == 0)

+				{

+			        buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_QUERY_SYSINFO_REQ,0,NULL);

+			        rcv_clt_req_msg_proc(buf);

+			        free(buf);

+					sysinfo_flag = 1;//sysinfoÖ»·¢Ò»´Î

+				}

+			}

+		}

+	}

+    return AT_END;

+}

+

+

+int creg_auto_act(char *at_paras ,int is_query_report)

+{

+    T_zAt_CregRes   tAtRes      = {0};

+    MSG_BUF *buf=NULL;

+	int lac = 0, ci = 0;

+    char strBuf[20] = {0};

+	char versionmode[2] = {0};

+	

+    void *p[5] = {&tAtRes.stat, tAtRes.tac, tAtRes.ci, &tAtRes.act,&tAtRes.subact};

+    at_print(AT_DEBUG,"creg_auto_act at_paras=%s!\n",at_paras);

+    parse_param2("%d,%s,%s,%d,%d", at_paras, p);

+    at_print(AT_DEBUG,"creg_auto_act stat=%d,tac=%s,ci=%s,act=%d,subact=%d!\n",

+    tAtRes.stat, tAtRes.tac, tAtRes.ci, tAtRes.act, tAtRes.subact);  

+

+    sprintf(strBuf, "%d", tAtRes.stat);

+    cfg_set("creg_stat", strBuf);

+

+	if(tAtRes.act != 7)

+	{

+		trans_Str2Value(tAtRes.tac, FALSE, &lac);

+		memset(strBuf, 0x00, 20);

+		sprintf(strBuf, "%d", lac);

+		cfg_set(NV_LAC_CODE, strBuf);

+		

+		trans_Str2Value(tAtRes.ci, FALSE, &ci);

+		memset(strBuf, 0x00, 20);

+		sprintf(strBuf, "%d", ci);

+		cfg_set(NV_CELL_ID, strBuf);

+	}

+	

+    /*×¢²áÁËÂþÓÎÍøÂç»ò±¾µØÍøÂç*/

+    if( (5 == tAtRes.stat ) || ( 1 == tAtRes.stat ))

+    {

+    	if(g_modem_model)

+    	{

+			start_pdp_auto_dial();

+    	}

+    	//zhangfen for PDP

+		//ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_NET_AUTO_DIAL, 0, NULL, 0);

+        cfg_set(NV_REG_STATUS,"ok");

+

+		ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_DMREG, MSG_CMD_CREG_IND, 0, NULL, 0);

+    }

+    else

+    {

+        cfg_set(NV_REG_STATUS,"no");

+    }

+    at_print(AT_DEBUG,"atBase_RecvCregRsp per=%d,cur=%d!\n",g_zUfi_Stat,tAtRes.stat);

+	

+    //оƬÈÏÖ¤´úÂë

+	cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+	if(0 == strcmp(versionmode, "0"))

+	{

+	    if(g_zUfi_Stat != tAtRes.stat)

+	    {

+			if(cfun_state==0 && g_modem_model)

+		    {

+		        at_print(AT_ERR,"query creg err!\n");

+		        return AT_END;

+		    }

+	        g_zUfi_Stat = tAtRes.stat;

+			if(sysinfo_flag == 0)

+			{

+		        buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_QUERY_SYSINFO_REQ,0,NULL);

+		        rcv_clt_req_msg_proc(buf);

+		        free(buf);

+				sysinfo_flag = 1;//sysinfoÖ»·¢Ò»´Î

+			}

+	    }

+		else

+		{

+			char networkType[50] = {0};

+        	cfg_get_item(NV_NETWORK_TYPE,networkType,sizeof(networkType));

+			if((5 == tAtRes.stat || 1 == tAtRes.stat) && (0 == strcmp("No Service",networkType) || 0 == strcmp("Limited Service",networkType)))

+			{

+				if(sysinfo_flag == 0)

+				{

+			        buf=normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_QUERY_SYSINFO_REQ,0,NULL);

+			        rcv_clt_req_msg_proc(buf);

+			        free(buf);

+					sysinfo_flag = 1;//sysinfoÖ»·¢Ò»´Î

+				}

+			}

+		}

+	}

+    return AT_END;

+}

+

+//»ñÈ¡ÍøÂçÐźÅ״̬£¬ÖÃNV

+int sysinfo_auto_act(char *at_paras ,int is_query_report)

+{

+    T_zAt_SysinfoRes tPara                       = {0};

+	UINT32 signalbar = 0;

+	char needDispSearching[10] = {0};

+	char modemMainState[50] = {0};

+	char networkCategoryBasedOn[10] = {0};

+	char strSignalbar[10] = {0};

+	char perRoamStatus[10] = {0};

+	char curRoamStatus[10] = {0};

+

+    void *p[7] = {&tPara.srvStatus, &tPara.srvDomain,&tPara.roamStatus,&tPara.sysMode, &tPara.simState,&tPara.reserve,&tPara.sysSubmode};

+    at_print(AT_DEBUG,"sysinfo_auto_act at_paras=%s!\n",at_paras);

+    parse_param2("%d,%d,%d,%d,%d,%d,%d", at_paras, p);

+    at_print(AT_DEBUG,"sysinfo_auto_act srvStatus=%ld,srvDomain=%ld,roamStatus=%ld,sysMode=%ld,simState=%ld,reserve=%ld,sysSubmode=%ld!\n",

+    tPara.srvStatus,tPara.srvDomain,tPara.roamStatus,tPara.sysMode,tPara.simState,tPara.reserve,tPara.sysSubmode);  

+

+	cfg_get_item("need_display_searching_status", needDispSearching, sizeof(needDispSearching));

+	cfg_get_item("modem_main_state", modemMainState, sizeof(modemMainState));

+	cfg_get_item("network_category_based_on", networkCategoryBasedOn, sizeof(networkCategoryBasedOn));

+	if(0 == tPara.srvStatus)//ÎÞ·þÎñ

+    {

+	    if(0 == strcmp("yes", needDispSearching))

+		{

+			if(g_isSearchingNetwork == TRUE)

+			{

+	            if(strcmp(modemMainState,"modem_init_complete") == 0)

+	            {

+					cfg_set(NV_NETWORK_TYPE, NETWORK_TYPE_INIT);

+					cfg_set(NV_SUB_NETWORK_TYPE, NETWORK_TYPE_INIT);

+	            }

+				else

+				{

+					cfg_set(NV_NETWORK_TYPE, "No Service");

+					cfg_set(NV_SUB_NETWORK_TYPE, "No Service");

+				}

+			}

+			else

+			{

+	        	cfg_set(NV_NETWORK_TYPE, "No Service");

+				cfg_set(NV_SUB_NETWORK_TYPE, "No Service");

+			}

+		}		

+		else

+		{

+			cfg_set(NV_NETWORK_TYPE, "No Service");

+			cfg_set(NV_SUB_NETWORK_TYPE, "No Service");

+		}  		

+		signalbar = 0;

+        ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MMI,MSG_CMD_OUT_REG_GET_SIGNAL_NUM, sizeof(signalbar), (UINT8 *)&signalbar,0);

+    }

+    else if( 1 == tPara.srvStatus )

+    {

+        if(0 == strcmp("yes", needDispSearching))

+		{

+			if(g_isSearchingNetwork == TRUE)

+			{

+				if(strcmp(modemMainState,"modem_init_complete") == 0)

+	            {

+					cfg_set(NV_NETWORK_TYPE, NETWORK_TYPE_INIT);

+					cfg_set(NV_SUB_NETWORK_TYPE, NETWORK_TYPE_INIT);

+	            }

+				else

+				{

+					cfg_set(NV_NETWORK_TYPE, "Limited Service");

+					cfg_set(NV_SUB_NETWORK_TYPE, "Limited Service");

+                }

+			}

+			else

+			{

+	 	       cfg_set(NV_NETWORK_TYPE, "Limited Service");

+			   cfg_set(NV_SUB_NETWORK_TYPE, "Limited Service");

+ 			}

+		}		

+		else

+		{

+			cfg_set(NV_NETWORK_TYPE, "Limited Service");

+			cfg_set(NV_SUB_NETWORK_TYPE, "Limited Service");

+		}		

+		signalbar = 0;

+        ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MMI,MSG_CMD_OUT_REG_GET_SIGNAL_NUM, sizeof(signalbar), (UINT8 *)&signalbar,0);

+    }

+    else

+    {

+    	if(0 == strcmp("yes", needDispSearching))

+	    {

+			g_isSearchingNetwork = FALSE;

+        }

+        char    netCategory[50]  = {0};

+        char    connectLogic[50]  = {0};

+        cfg_get_item(NV_NETWORK_CATEGORY_BASED_ON,netCategory,sizeof(netCategory));

+        cfg_get_item(NV_CONNECT_LOGIC,connectLogic,sizeof(connectLogic));

+        

+        //normal_sysinfosetdomainstat(tPara.srvDomain);

+        if(0 == strcmp("act", netCategory))

+		{

+			normal_sysinfosysmodecfgset(tPara.sysMode,tPara.sysSubmode);

+		}

+        else

+        {

+			normal_sysinfonetworktypeSet(tPara.sysMode,tPara.sysSubmode);

+		}

+        

+        //if(0!=strcmp("cpe",connectLogic) && 0!=strcmp("five_times",connectLogic))

+        //{

+        //    normal_sysinfodomainpdpdail(tPara.srvDomain);

+        //}

+		cfg_get_item("signalbar", strSignalbar, sizeof(strSignalbar));

+        signalbar = atoi(strSignalbar);

+        ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MMI,MSG_CMD_OUT_REG_GET_SIGNAL_NUM, sizeof(signalbar), (UINT8 *)&signalbar,0);

+

+		//zhangfen for PDP

+		//ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MAIN_CTRL, MSG_CMD_NET_AUTO_DIAL, 0, NULL, 0);

+				

+		if(g_modem_model)

+		{

+			//static int can_poweron_dail = 0;

+			MSG_BUF *msg_buf = NULL;

+			char ppp_status[20] = {0};

+			cfg_get_item(NV_PPP_STATUS, ppp_status, sizeof(ppp_status));

+			//Ö»Óе±Ê״請úºó£¬Ö÷¿ØÔø¾­Ö÷¶¯·¢Æð¹ý²¦ºÅ²¢ÇÒûÓв¦ºÅ³É¹¦£¬´ËʱÔÚÓÐÍøÂçºó

+			//at_ctlÄ£Äâ³ÉÖ÷¿ØÖØÐ·¢Æðpdp¼¤»î

+			if((can_poweron_dail == 0) && (g_defcid_mng.modid == MODULE_ID_MAIN_CTRL) && (0 == strcmp(PPP_DISCONNECTED, ppp_status)))

+		    {

+				char creg_stat[20] = {0};

+				char cereg_stat[20] = {0};

+				

+				cfg_get_item("cgreg_stat", creg_stat, sizeof(creg_stat));

+				cfg_get_item("cereg_stat", cereg_stat, sizeof(cereg_stat));

+				at_print(AT_DEBUG,"@@@@@@@@@@@@@sysinfo_auto_act  creg stat=%s, cereg stat=%s!\n",creg_stat,cereg_stat);

+				//zpr 1218 GPRSS&EPSûע²áºÃ£¬²»·¢Æð

+				if(1 != atoi(creg_stat) && 5 != atoi(creg_stat) && 1 != atoi(cereg_stat) && 5 != atoi(cereg_stat))

+				{

+					//return 0;

+				}

+				else

+				{

+		        can_poweron_dail = 1;

+				#if 0

+		        struct pdp_act_req *pdpsetinfo=NULL;

+		        pdpsetinfo=malloc(sizeof(struct pdp_act_req));

+		        if(pdpsetinfo == NULL){softap_assert("");}

+		        memset(pdpsetinfo,0,sizeof(struct pdp_act_req));

+		        normal_getcurparam(pdpsetinfo);

+		        cfg_set("auto_reconnect", "1");

+				#endif

+				

+				at_print(AT_ERR,"sysinfo_auto_act begin dial!!!\n");

+				msg_buf=normal_getmsg(g_defcid_mng.modid ,MODULE_ID_AT_CTL,MSG_CMD_PDP_ACT_REQ, 0, NULL);

+				rcv_msg_proc(msg_buf);

+				free(msg_buf);

+				msg_buf = NULL;

+				}

+		    }

+		}

+	}

+

+	cfg_get_item(NV_SIMCARD_ROAM, perRoamStatus, sizeof(perRoamStatus));

+    if(0 == tPara.roamStatus)

+    {

+		cfg_set(NV_SIMCARD_ROAM,"Home");

+	}

+	else

+	{

+		if(TRUE == normal_checkroam(mccNum, mncNum))

+		{

+		    cfg_set(NV_SIMCARD_ROAM,"Home");

+			tPara.roamStatus = 0;

+		}

+	    else

+		{

+		    cfg_set(NV_SIMCARD_ROAM,"Internal"); 

+		}

+    }

+

+	cfg_get_item(NV_SIMCARD_ROAM, curRoamStatus, sizeof(curRoamStatus));

+	if(strcmp(perRoamStatus, curRoamStatus) != 0)

+	{

+		ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_DMREG, MSG_CMD_ROAM_STATUS_IND, 0, NULL, 0);

+	}

+	

+    if(0 == strcmp("yes", needDispSearching))

+	{

+	   if(g_isSearchingNetwork == FALSE)

+	   {

+			at_print(AT_DEBUG,"atBase_RecvSysInfoRsp, MSG_MMICHANNEL_NETWORK_MODE, tPara.srvStatus = %ld \n", tPara.srvStatus);

+		    ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MMI,MSG_CMD_CHANNEL_NETWORK_MODE, sizeof(tPara), (UCHAR *)&tPara,0);

+	   }

+	}   

+	else

+    {

+        ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MMI,MSG_CMD_CHANNEL_NETWORK_MODE, sizeof(tPara), (UCHAR *)&tPara,0);

+    }

+    return AT_END;

+}

+

+int mac_auto_act(char *at_paras ,int is_query_report)

+{

+    mactozssid=malloc(128);

+    if(mactozssid == NULL){

+		softap_assert("");

+		return AT_END;

+	}

+    memset(mactozssid, 0, 128);    

+    snprintf(mactozssid,128,"+MAC:%s",at_paras);

+    return AT_END;

+}

+

+int mac2_auto_act(char *at_paras ,int is_query_report)

+{

+    if(mactozssid == NULL || strlen(mactozssid) >= 128){

+		softap_assert("");

+		return AT_END;

+	}

+    snprintf(mactozssid+strlen(mactozssid),128-strlen(mactozssid),";%s",at_paras);

+    return AT_END;

+}

+

+int clck_auto_act(char *at_paras ,int is_query_report)

+{

+    char strMode[10] = {0};

+    T_zAt_ClckSet_RES clckRspPara = {0};

+    int classVale = 0;

+    int status = 0;

+    sscanf(at_paras, "%d,%d",&status,&classVale);

+    clckRspPara.uclass  = (unsigned char)classVale;

+    clckRspPara.status  = (unsigned char)status;

+    sprintf(strMode,"%d", clckRspPara.status);

+    at_print(AT_DEBUG,"clck_auto_act uclass=%d,status=%d\n",status,classVale);

+    /*0£ºÎ´¼¤»î, 1£º¼¤»î*/

+    cfg_set(NV_PIN_STATUS, strMode);

+    return AT_END;

+}

+

+int zpbic_auto_act(char *at_paras ,int is_query_report)

+{

+    T_zAt_ZpbicRes AtRes = {0};

+    char ismsSwitch[2] = {0};

+    sscanf(at_paras, "%ld,%ld", &AtRes.result, &AtRes.opertype);

+    at_print(AT_DEBUG,"zpbic_auto_act str:%s,result:%ld,opertype:%ld\n",at_paras,AtRes.result, AtRes.opertype);

+

+    if((1 == AtRes.result) && (1 == AtRes.opertype))

+    {

+    	cfg_set("zpbic_pb", "ready");

+	    if(g_modem_model)

+	    {

+	    	g_smspb_init |= (1<<AtRes.opertype);

+			at_print(AT_NORMAL,"1.sms_pb init flag: %d\n", g_smspb_init);

+			if(((g_smspb_init & 0x03) == 0x03) && (g_need_smspb_init == 0))

+			{

+				char ppp_status[20] = {0};

+				cfg_get_item(NV_PPP_STATUS, ppp_status, sizeof(ppp_status));

+				if(0 == strcmp("ppp_connected", ppp_status))

+					pbsms_init_msg_proc();//Èç¹ûÒѾ­²¦ºÅ³É¹¦£¬Ö±½Ó¸øpbºÍsmsÓ¦Ó÷¢Æð³õʼ»¯ÏûÏ¢

+				else

+					pbsms_init_timerout(&AtRes);//pbºÍsms¶¼³õʼ»¯Íê³Éºó²ÅÄÜÆð¶¨Ê±Æ÷

+			}

+	    }

+		

+		char versionmode[2] = {0};

+		MSG_BUF *buf = NULL;

+        //оƬÈÏÖ¤´úÂë

+		cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+		if(0 == strcmp(versionmode, "0"))	

+		{

+	    	buf = normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_MODEMREG_INFO_REQ,0,NULL);

+	    	rcv_clt_req_msg_proc(buf);

+	    	free(buf);

+		}

+

+        at_print(AT_DEBUG,"zpbic_auto_act cnum\n");

+    }

+    else if((1 == AtRes.result) && (0 == AtRes.opertype))

+    {

+        at_print(AT_DEBUG,"zpbic_auto_act sms\n");

+#if (APP_OS_TYPE == APP_OS_LINUX)			

+#if 1 

+        cfg_get_item("isms_enable",ismsSwitch,sizeof(ismsSwitch));

+        if(1 == AtRes.result && 0==strcmp(ismsSwitch, "1"))

+        {

+/*        	cfg_set("isms_state", "0");

+            if(fork() == 0)

+            {

+        		cfg_set("isms_state", "1");

+                if(execv("/bin/zte_isms", NULL) < 0)

+                {

+        			cfg_set("isms_state", "2");

+                    at_print(AT_DEBUG,"execv error(%d)\n", errno);

+                    exit(0);

+                }

+            }

+            

+        	cfg_set("isms_state", "3");*/

+			if(system("/bin/zte_isms &") == 0)

+			{

+				cfg_set("isms_state", "3");

+			}

+			else

+			{

+				cfg_set("isms_state", "2");

+			}

+        }

+#endif

+#endif

+	    if(g_modem_model)

+	    {

+	    	g_smspb_init |= (1<<AtRes.opertype);

+	    	at_print(AT_NORMAL,"2.sms_pb init flag: %d\n", g_smspb_init);

+	    	if(((g_smspb_init & 0x03) == 0x03) && (g_need_smspb_init == 0))

+			{

+				char ppp_status[20] = {0};

+				cfg_get_item(NV_PPP_STATUS, ppp_status, sizeof(ppp_status));

+				if(0 == strcmp("ppp_connected", ppp_status))

+					pbsms_init_msg_proc();//Èç¹ûÒѾ­²¦ºÅ³É¹¦£¬Ö±½Ó¸øpbºÍsmsÓ¦Ó÷¢Æð³õʼ»¯ÏûÏ¢

+				else

+					pbsms_init_timerout(&AtRes);//pbºÍsms¶¼³õʼ»¯Íê³Éºó²ÅÄÜÆð¶¨Ê±Æ÷

+			}

+	    }

+    }

+    return AT_END;

+}

+//add corem0620 begin

+#define ZAT_CUSD_MAXLEN                     320

+#define ZAT_MAX_LEN                 7168 //1024

+#define AT_USSD_DATA_TO_WEB_LEN  900//ussd

+#define ZAT_TAB_REPLACE                     ((unsigned char )(0xFC))    /* ÖÆ±í·ûÌæ»»·û     */

+#define ZAT_NULL_FILL                       ((unsigned char )(0xFD))    /* ¿Õ´®Õ¼Î»·û       */

+#define ZAT_SPACE_REPLACE                   ((unsigned char )(0xFE))    /* ¿Õ¸ñÌæ»»·û       */

+#define ZAT_LF_REPLACE                      ((unsigned char )(0xFB))    /* LFÌæ»»·û         */

+#define ZAT_CR_REPLACE                      ((unsigned char )(0xFA))    /* CRÌæ»»·û */

+

+typedef struct

+{

+    SINT16  replyMsg;

+    CHAR    cusdDataStr[ZAT_CUSD_MAXLEN + 1];

+    SINT16  bDcs;

+} T_zAt_CusdRes;

+

+typedef enum

+{

+    ZAT_GSM7BIT = 0,

+    ZAT_8BIT,

+    ZAT_UCS2,

+    ZAT_INVALID,

+} T_zAt_CBSCodeType;

+VOID atBase_PreProcRes(CHAR *pParaLine, int paraSize)

+{

+    SINT32  flg                                     = 0;

+    UINT32  i                                       = 0;

+    UINT32  length                                  = 0;

+    CHAR    *pSource                                = pParaLine;

+    CHAR    *pDest                                  = NULL;

+    

+    CHAR    *pStrDestMalloc = (CHAR *)malloc(ZAT_MAX_LEN);

+    if(NULL == pStrDestMalloc)

+    {

+        return;

+    }

+    memset(pStrDestMalloc, 0, ZAT_MAX_LEN); 

+    

+    assert(pParaLine != NULL);

+    pDest = pStrDestMalloc;

+    length = strlen(pParaLine);

+    if ((length == 0) || (length >= ZAT_MAX_LEN))

+    {

+        free(pStrDestMalloc);

+        return;

+    }

+    for (i = 0; (i < length )&& (pDest - pStrDestMalloc < ZAT_MAX_LEN); i++)

+    {

+        if ('"' == *pSource)

+        {

+            flg = (0 == flg)?1:0;                           /* Ë«ÒýºÅ ɾ³ý  */

+            if ('"' == *(pSource + 1))                      /* ÐǺźóÃæ½ô¸úÐǺţ¬²åÈë¿Õ´®Õ¼Î»·û */

+            {

+                *pDest++ = (CHAR)ZAT_NULL_FILL;

+            }

+        }

+        else if ((',' == *pSource) && (0 == flg))

+        {

+            *pDest++ = ' ';                                 /* Ë«ÒýºÅÍâÃæµÄ¶ººÅ£¬Ìæ»»³É¿Õ¸ñ */

+            if(',' == *(pSource + 1))                       /* ¶ººÅºóÃæ½ô¸ú¶ººÅ£¬»òÕßÒÔ¶ººÅ½á⣬²åÈë¿Õ´®Õ¼Î»·û */

+            {

+                *pDest++ = '9';                             //±£Áô²ÎÊýÓÃ9ÔÝʱ´úÌæ

+            }

+            else if('\0' == *(pSource + 1))                 /* ¶ººÅºóÃæ½ô¸ú¶ººÅ£¬»òÕßÒÔ¶ººÅ½á⣬²åÈë¿Õ´®Õ¼Î»·û */

+            {

+                *pDest++ = (CHAR)ZAT_NULL_FILL;

+            }

+        }

+        else

+        {

+            //*pDest++ = ((' ' == *pSource) && (1 == flg))?(CHAR)ZAT_SPACE_REPLACE:((('\t' == *pSource) && (1 == flg))?(CHAR)ZAT_TAB_REPLACE:((('\n' == *pSource) && (1 == flg))?(CHAR)ZAT_LF_REPLACE:((('\r' == *pSource) && (1 == flg))?(CHAR)ZAT_CR_REPLACE:(*pSource))));

+            if((' ' == *pSource) && (1 == flg))

+			{

+				*pDest++ = (CHAR)ZAT_SPACE_REPLACE;

+			}

+			else if(('\t' == *pSource) && (1 == flg))

+			{

+				*pDest++ = (CHAR)ZAT_TAB_REPLACE;

+			}

+			else if(('\n' == *pSource) && (1 == flg))

+			{

+				*pDest++ = (CHAR)ZAT_LF_REPLACE;

+			}

+			else if(('\r' == *pSource) && (1 == flg))

+			{

+				*pDest++ = (CHAR)ZAT_CR_REPLACE;

+			}

+			else

+			{

+				*pDest++ = *pSource;

+			}

+        }

+        pSource++;

+    }

+    memset(pParaLine, 0, paraSize);                           /* ½«Ô¤´¦ÀíºóµÄÄÚÈÝ¿½±´»Ø²ÎÊýÐÐÖÐ */

+    strncpy(pParaLine, pStrDestMalloc,paraSize-1);

+    free(pStrDestMalloc);

+}

+

+

+VOID atBase_RestoreString(CHAR *pStringPara)

+{

+    SINT32  i           = 0;

+    SINT32  length      = 0;

+    CHAR*   pstrTemp    = 0;

+    /* ²ÎÊý¼ì²é ¡¢ ³¤¶È¼ì²é*/

+    assert(pStringPara != NULL);

+	

+    length = (SINT32)strlen(pStringPara);

+	if ( 0 == length)

+    {

+        return;

+    }

+	

+    /* ¿Õ´®Õ¼Î»·û»Ö¸´ */

+    if ((1 == length) && ((CHAR) ZAT_NULL_FILL == *pStringPara))

+    {

+        *pStringPara = '\0';

+        return;

+    }

+    /* Ñ­»·»Ö¸´¿Õ¸ñÌæ»»·ûºÍÖÆ±í·ûÌæ»»·û */

+    pstrTemp = pStringPara;

+    for (i = 0; i < length; i++)

+    {

+        if ((CHAR) ZAT_SPACE_REPLACE == *pstrTemp)

+        {

+            *pstrTemp = ' ';

+        }

+        else if ((CHAR) ZAT_TAB_REPLACE == *pstrTemp)

+        {

+            *pstrTemp = '\t';

+        }

+        else if((CHAR) ZAT_LF_REPLACE == *pstrTemp)

+        {

+            *pstrTemp = '\n';

+        }

+        else if((CHAR) ZAT_CR_REPLACE == *pstrTemp)

+        {

+            *pstrTemp = '\r';

+        }

+        else

+        {

+            ;

+        }

+        pstrTemp++;

+    }

+}

+//USSD

+T_zAt_CBSCodeType atBase_CheckDataCodeType(SINT16 bDcs)

+{

+    UINT16 value76 = (bDcs & 0xC0) >> 6;

+    UINT16 value74 = (bDcs & 0xF0) >> 4;

+    UINT16 value30 = (bDcs & 0x0F);

+    UINT16 value32 = (bDcs & 0x0C) >> 2;

+    UINT16 value2  = (bDcs & 0x04) >> 2;

+

+    if((value74 == 0) || (value74 == 2) || (value74 == 3) || (value74 == 8) ||

+        (value74 == 10) || (value74 == 11) || (value74 == 12))

+    {

+        return ZAT_GSM7BIT;

+    }

+    else if((value74 == 1) && (value30 == 1))

+    {

+        return ZAT_UCS2;

+    }

+    else if((value74 == 1) && (value30 != 1))

+    {

+        return ZAT_GSM7BIT;

+    }

+    else if((value76 == 1) && ((value32 == 0) || (value32 == 3)))

+    {

+        return ZAT_GSM7BIT;

+    }

+    else if((value76 == 1) && (value32 == 1))

+    {

+        return ZAT_8BIT;

+    }

+    else if((value76 == 1) && (value32 == 2))

+    {

+        return ZAT_UCS2;

+    }

+    else if((value74 == 9) && ((value32 == 0) || (value32 == 3)))

+    {

+        return ZAT_GSM7BIT;

+    }

+    else if((value74 == 9) && (value32 == 1))

+    {

+        return ZAT_8BIT;

+    }

+    else if((value74 == 9) && (value32 == 2))

+    {

+        return ZAT_UCS2;

+    }

+    else if((value74 == 15) && (value2 == 0))

+    {

+        return ZAT_GSM7BIT;

+    }

+    else if((value74 == 15) && (value2 == 1))

+    {

+        return ZAT_8BIT;

+    }

+    return ZAT_INVALID;

+}

+

+VOID atBase_ConvertAsciiToUCS2(const CHAR *dataStr,CHAR *convertDataStr,UINT16 dataLen)

+{

+    UINT16 iDataLen = 0;

+    

+    if((dataStr == NULL) || (convertDataStr == NULL) || (dataLen <= 0))

+    {

+        return;

+    }

+    for(iDataLen = 0;iDataLen < dataLen;iDataLen++)

+    {

+        snprintf(convertDataStr+strlen(convertDataStr),AT_USSD_DATA_TO_WEB_LEN,"%04x",dataStr[iDataLen]);

+    }

+    printf("%s\n",convertDataStr);

+}

+

+VOID atBase_Convert8BitToUCS2(const CHAR *dataStr,CHAR *convertDataStr,UINT16 dataLen)

+{

+    UINT16 iDataLen = 0;

+    

+    if((dataStr == NULL) || (convertDataStr == NULL) || (dataLen <= 0))

+    {

+        return;

+    }

+    for(iDataLen = 0;iDataLen < dataLen;iDataLen++)

+    {

+        if(iDataLen%2 == 0)

+	 {

+	      snprintf(convertDataStr+strlen(convertDataStr),AT_USSD_DATA_TO_WEB_LEN,"00%c",dataStr[iDataLen]);

+	 }

+	 else

+	 {

+	      snprintf(convertDataStr+strlen(convertDataStr),AT_USSD_DATA_TO_WEB_LEN,"%c",dataStr[iDataLen]);

+	 }

+     }

+     printf("%s\n",convertDataStr);

+}

+

+

+BOOL atBase_ConvertUCS2SetNV(T_zAt_CBSCodeType cbsCodeType,const CHAR *cusdDataStr,CHAR *convertDataStr,UINT16 dataLen)

+{

+    if((cbsCodeType == ZAT_INVALID) || (cusdDataStr == NULL) || (convertDataStr == NULL) || (dataLen <= 0))

+    {

+        return FALSE;

+    }

+    if(cbsCodeType == ZAT_GSM7BIT)

+    {

+        atBase_ConvertAsciiToUCS2(cusdDataStr,convertDataStr,dataLen);

+        cfg_set("ussd_content",convertDataStr);

+        return TRUE;

+    }

+    else if(cbsCodeType == ZAT_8BIT)

+    {

+        atBase_Convert8BitToUCS2(cusdDataStr,convertDataStr,dataLen);

+        cfg_set("ussd_content",convertDataStr);

+        return TRUE;

+    }

+    else if(cbsCodeType == ZAT_UCS2)

+    {

+        cfg_set("ussd_content",cusdDataStr);

+        return TRUE;

+    }

+    else

+    {

+        printf("DCS Reported can't be processed!!!!\n");

+        return FALSE;

+    }

+}

+

+static int get_param_count_for_ussd(const char *str){//corem0418

+    int fmt_param_count = 0;

+    

+    for(; *str != '\0'; str++){

+        if(*str == ','){

+            fmt_param_count++;

+        }

+    }

+    return fmt_param_count;

+}

+

+int cusd_auto_act(char *at_paras ,int is_query_report)

+{

+    T_zAt_CusdRes                    cusdParam = {0};

+    T_zAt_CBSCodeType            cbsCodeType = ZAT_INVALID;

+    CHAR convertDataStr[AT_USSD_DATA_TO_WEB_LEN] = {0};

+    //static int flag = 0;

+

+	at_print(AT_ERR,"!!!!cusd_auto_act start.\n");

+    if(at_paras == NULL)

+    {

+        return AT_END;

+    }

+	

+

+    at_print(AT_ERR,"!!!!cusd_auto_act Gets %s.\n", at_paras);

+

+//    void *p[3] = {&cusdParam.replyMsg,  cusdParam.cusdDataStr, &cusdParam.bDcs};

+

+//    parse_param("%d %s %d", at_paras, p);

+	

+//    at_print(AT_DEBUG,"cusd_auto_act  replyMsg=%d, cusdDataStr=%s, bDcs=%d!\n",  cusdParam.replyMsg, cusdParam.cusdDataStr, cusdParam.bDcs);  	

+    

+    if(get_param_count_for_ussd(at_paras) > 0){//corem0418           

+           atBase_PreProcRes(at_paras, strlen(at_paras));

+	    at_print(AT_ERR,"!!!!cusd_auto_act Gets 3 para:%s\n", at_paras);

+	    sscanf(at_paras, "%hd %320s %hd",&cusdParam.replyMsg,cusdParam.cusdDataStr,&cusdParam.bDcs);

+	    

+    }else{

+           at_print(AT_ERR,"!!!!cusd_auto_act Gets 1 para:%s\n", at_paras);         

+	   sscanf(at_paras, "%hd",&cusdParam.replyMsg);

+    }

+

+    at_print(AT_ERR,"cusd_auto_act before restore MSG  replyMsg=%d, cusdDataStr=%s, bDcs=%d!\n",  cusdParam.replyMsg, cusdParam.cusdDataStr, cusdParam.bDcs);  

+

+    atBase_RestoreString(cusdParam.cusdDataStr);

+	

+    at_print(AT_ERR,"cusd_auto_act after restore MSG replyMsg=%d, cusdDataStr=%s, bDcs=%d!\n",  cusdParam.replyMsg, cusdParam.cusdDataStr, cusdParam.bDcs);

+	

+    //printf("atBase_RecvCusdRsp :%d,%s,%d",cusdParam.replyMsg,cusdParam.cusdDataStr,cusdParam.bDcs);

+    if((cusdParam.replyMsg == 0) || (cusdParam.replyMsg == 1))

+    {

+        cbsCodeType = atBase_CheckDataCodeType((SINT16)cusdParam.bDcs);

+        at_print(AT_ERR,"Code Type:%d\n",cbsCodeType);

+        if(atBase_ConvertUCS2SetNV(cbsCodeType,cusdParam.cusdDataStr,convertDataStr,(UINT16)strlen(cusdParam.cusdDataStr)))

+        {

+            cfg_set("ussd_write_flag","16");

+            cfg_set("ussd_dcs","72");

+            if(cusdParam.replyMsg == 0)

+            {

+                cfg_set("ussd_mode","0");

+                cfg_set("ussd_cancel_flag","no");

+            }

+            else

+            {

+                cfg_set("ussd_mode","1");

+                cfg_set("ussd_cancel_flag","yes");

+            }

+			//½«Êý¾Ý´æ´¢µ½Êý¾Ý¿â

+			//store_ussd_data_to_db(convertDataStr);//corem0625

+        }

+        else

+        {

+            cfg_set("ussd_write_flag","99");

+            cfg_set("ussd_cancel_flag","no");

+			return AT_END;

+        }

+    }

+    else if(cusdParam.replyMsg == 2)

+    {

+        cfg_set("ussd_write_flag","13");

+        cfg_set("ussd_cancel_flag","no");

+    }

+    else if(cusdParam.replyMsg == 3)

+    {

+        cfg_set("ussd_write_flag","4");

+        cfg_set("ussd_cancel_flag","no");

+    }

+    else if(cusdParam.replyMsg == 4)

+    {

+        cfg_set("ussd_write_flag","99");

+        cfg_set("ussd_cancel_flag","no");

+    }

+    else if(cusdParam.replyMsg == 5)

+    {

+        cfg_set("ussd_write_flag","4");

+        cfg_set("ussd_cancel_flag","no");

+    }

+    else

+    {

+        cfg_set("ussd_write_flag","99");

+        cfg_set("ussd_cancel_flag","no");

+    }

+	return AT_END;

+}

+

+//add corem0620 end

+

+int cnum_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+    return AT_END;

+}

+//const char *at_paras

+int cnum_auto_act( char *at_paras ,int is_query_report)

+{

+    T_zAt_CnumRes   tAtRes  = {0};

+    CHAR tcnum[256] = {0};

+    CHAR *mslsdm = NULL;

+    UINT32 len=0;

+	

+    void *p[3] = {tAtRes.alpha, tAtRes.number, &tAtRes.type};

+    at_print(AT_DEBUG,"cnum_auto_act at_paras=%s!\n",at_paras);

+    parse_param2("%s,%s,%d", at_paras, p);

+    at_print(AT_DEBUG,"cnum_auto_act alpha=%s,number=%s,type=%d!\n",

+    tAtRes.alpha, tAtRes.number, tAtRes.type); 

+	

+	if(strlen(tAtRes.number) == 0){//corem20201209

+		return AT_END;

+	}

+

+    cfg_get_item(NV_SIM_ICCID,tcnum,sizeof(tcnum));

+    if(0 == strcmp("", tcnum))

+    {

+        cfg_set(NV_SIM_ICCID, tAtRes.number);

+		cfg_set(NV_MSISDN, tAtRes.number);

+    }

+    else

+    {

+	    char *pos = strstr(tcnum, tAtRes.number);//corem20201209

+		if(pos != NULL && (*(pos + strlen(tAtRes.number)) == '\0' || *(pos + strlen(tAtRes.number)) == ',')){

+		    return AT_END;

+		}

+		

+        len = strlen(tcnum)+strlen(tAtRes.number)+strlen(", ")+1;

+        mslsdm = malloc(len);

+	    if(mslsdm == NULL)

+	    {

+	        return AT_END;

+	    }

+        memset(mslsdm, 0, len); 

+        snprintf(mslsdm, len,"%s, %s", tcnum, tAtRes.number);

+        cfg_set(NV_SIM_ICCID, mslsdm);

+		cfg_set(NV_MSISDN, mslsdm);

+        free(mslsdm);

+	    mslsdm = NULL;

+    }

+    return AT_END;

+}

+

+char* start_query_cnum(void *msg,struct at_context *context)

+{

+    at_print(AT_DEBUG,"start_query_cnum\n");

+    return normal_CnumRead();

+}

+

+/* ЭÒéÕ»¹Ì¶¨ÐÅÏ¢»ñȡʼþÁ´ZICCID CIMI CNUM  */

+char *start_getmodeminfo(void *msg,struct at_context *context)

+{

+	return normal_getziccid();

+}

+

+

+char* start_pdpact_cmd(void *msg,struct at_context *context)

+{

+	char creg_stat[20] = {0};

+	MSG_BUF *p_msg = (MSG_BUF *)msg;

+    struct pdp_act_req *pdpsetinfo = NULL;

+	char *pstr = NULL;

+

+	cfg_get_item("creg_stat", creg_stat, sizeof(creg_stat));

+	at_print(AT_DEBUG,"@@@@@@@@@@@@@start_pdpact_cmd creg stat=%s!\n",creg_stat);

+

+	/*¶ÔÓÚÍø¹ØÀàÓ¦Óã¬ÀýÈçwebui¡¢Ö÷¿Ø¡¢TR069£¬Æä½ö¿ØÖÆÆÕͨÉÏÍøÒµÎñµÄmodemÁªÍøÓë¶Ï¿ª£¬

+	ÔÚpdp¼¤»îÐÅÏ¢Öв»Ð¯´øÈκβÎÊý£¬pdp¼¤»î¾ßÌåʹÓõÄapn¡¢ip type¡¢Óû§Ãû¡¢ÃÜÂëµÈÐÅÏ¢

+	ÐèÒªÓÉat_ctl×Ô¼ºÈ·¶¨*/

+	if(p_msg->usDataLen == 0)

+	{	

+		//zhangfen for PDP		

+		cfg_set("auto_reconnect", "1");		

+		

+	 	pdpsetinfo=malloc(sizeof(struct pdp_act_req));

+        if(pdpsetinfo == NULL){

+			softap_assert("");

+			return NULL;

+		}

+        memset(pdpsetinfo,0,sizeof(struct pdp_act_req));

+		//at_ctl¸ù¾Ý±£´æµÄĬÈÏpdp¼¤»îÐÅÏ¢£¬×é×°pdp¼¤»îÏûÏ¢ÄÚÈÝ£¬²¢Ìî³äµ½ÏûÏ¢ÖÐ

+        normal_getcurparam(pdpsetinfo);

+		

+		set_default_apn(pdpsetinfo->comm_info.apn);

+		pdpsetinfo->default_flag = 1;//¿ÉÒÔʹÓÃĬÈϳÐÔØ

+		memcpy(p_msg->aucDataBuf, pdpsetinfo, sizeof(struct pdp_act_req));

+		p_msg->usDataLen = sizeof(struct pdp_act_req);

+		pstr = pdp_act_func(p_msg,context); 

+		free(pdpsetinfo);

+	#if 0

+		if(1 == atoi(creg_stat) || 5 == atoi(creg_stat))

+	    {      

+	    	//set_pppstatus(PPP_CONNECTING);

+	       

+	        memcpy(p_msg->aucDataBuf, pdpsetinfo, sizeof(struct pdp_act_req));

+			p_msg->usDataLen = sizeof(struct pdp_act_req);

+			pstr = pdp_act_func(p_msg,context); 	       

+	    }

+		else

+		{		  	

+			/*Ϊ¼õÉÙ²»±ØÒªµÄ²¦ºÅatÃüÁîÁ÷³Ì£¬Èç¹ûµ±Ç°²»Âú×㲦ºÅÌõ¼þ£¬ÔòÖ±½Ó±¨´í¸øÍø¹ØÓ¦Óã¬

+			֪ͨÆäµ±Ç°ÎÞ·¨²¦ºÅ*/

+			send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_ACT_RSP,0,0);

+		}

+#endif

+		

+	}

+	else

+	{

+		/*·ÇÍø¹ÜÀàÓ¦ÓõÄpdp¼¤»î£¬Óë±¾ÉíÒµÎñÓйأ¬²»ÊÜÍø¹Ø¿ØÖÆ£¬Í¬Ê±»áÖ¸¶¨apn¡¢ip typeµÈÐÅÏ¢£¬Òò´Ë

+		ÔÚpdp¼¤»îʱÐèÒª½«pdp¼¤»îÐÅϢЯ´ø¹ýÀ´£¬ÓÉat_ctlÖ±½Ó·¢Æðpdp¼¤»î*/

+		pstr = pdp_act_func(msg,context);	

+	}		

+	return pstr;   

+}

+

+extern struct defcid_mng_t g_defcid_mng;

+

+char* start_pdpdeact_cmd(void *msg,struct at_context *context)

+{

+    char pppStatus[50] = {0};

+	MSG_BUF *p_msg = (MSG_BUF *)msg;

+	AT_PDP_DEACT_REQ_INFO req = {0};

+	char *pstr = NULL;

+	

+	/*¶ÔÓÚÍø¹ØÀàÓ¦Óã¬ÀýÈçwebui¡¢Ö÷¿Ø¡¢TR069£¬Æä¿ØÖÆÆÕͨÉÏÍøÒµÎñµÄmodemÁªÍøÓë¶Ï¿ª£¬

+	ÔÚpdpÈ¥¼¤»îʱ£¬½öָʾat_ctl¶Ï¿ªmodemÁªÍø£¬¾ßÌå¶Ï¿ªµÄcid£¬ÓÉat_ctl±£´æµÄĬÈÏcid¾ö¶¨*/

+	if(p_msg->usDataLen == 0)

+	{

+		cfg_get_item("ppp_status", pppStatus, sizeof(pppStatus));

+	    if((strcmp("ppp_disconnecting", pppStatus)== 0) || (strcmp("ppp_disconnected", pppStatus) == 0))

+	    {

+	    	AT_PDP_DEACT_RSP_INFO rsp = {0};

+			rsp.result = AT_RSP_OK;

+			send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_DEACT_RSP,sizeof(AT_PDP_DEACT_RSP_INFO),&rsp);

+	        return NULL;		

+	    }

+	    if(strcmp("ppp_connecting", pppStatus)== 0)

+	    {

+			at_print(AT_ERR,"start_pdpdeact_cmd is acting ,start timer to wait\n");

+			add_one_delayed_msg(msg);

+	        return NULL;		

+	    }

+		

+		set_pppstatus(PPP_DISCONNECTING);

+	

+		req.c_id = g_defcid_mng.cid;

+		memcpy(p_msg->aucDataBuf, &req, sizeof(AT_PDP_DEACT_REQ_INFO));

+		p_msg->usDataLen = sizeof(AT_PDP_DEACT_REQ_INFO);

+		pstr = pdp_deact_func(p_msg, context);

+	}

+	else

+	{

+		pstr = pdp_deact_func(msg, context);

+	}

+	return pstr;	

+}

+

+//ÒÔÏÂÊÇоƬÈÏÖ¤´úÂë

+char* start_zeact_cmd(void *msg,struct at_context *context)

+{

+	char *at_next=NULL;

+	

+	at_next=malloc(20);

+	if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	snprintf(at_next,20,"AT+ZEACT=%s\r\n",((MSG_BUF*)msg)->aucDataBuf); 

+	return at_next;

+	

+}

+

+char* start_zmmi_cmd(void *msg,struct at_context *context)

+{

+	char *at_next=NULL;

+	

+	at_next=malloc(20);

+	if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	snprintf(at_next,20,"AT+ZMMI=%s\r\n",((MSG_BUF*)msg)->aucDataBuf); 

+	return at_next;

+	

+}

+

+char* start_zimsamrw_cmd(void *msg,struct at_context *context)

+{

+	char *at_next=NULL;

+	

+	at_next=malloc(20);

+	if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	snprintf(at_next,20,"AT+ZIMSAMRW=%s\r\n",((MSG_BUF*)msg)->aucDataBuf); 

+	return at_next;

+	

+}

+

+int  cmd_ok_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+	*next_req=malloc(10);

+	if(*next_req){

+    *next_len=10;

+    strcpy(*next_req,"1");

+	}

+    return AT_END;

+}

+

+int  cmd_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+	*next_req=malloc(10);

+	if(*next_req){

+    *next_len=10;

+    strcpy(*next_req,"0");

+	}

+    return AT_END;

+}

+

+/**

+ * @brief Æô¶¯×ÔÄܶÌÐŽø³Ì

+ * @param 

+ * @return 

+ * @note   

+ * @warning 

+ */

+void at_ctl_startisms(void)

+{

+	at_print(AT_NORMAL,"[TEST]at_ctl_startisms\n");

+#if (APP_OS_TYPE == APP_OS_LINUX)

+/*

+	if(fork() == 0)

+	{

+		if(execv("/bin/zte_isms", NULL) < 0)

+		{

+			at_print(AT_ERR,"[TEST]execv error(%d)\n", errno);

+			exit(0);

+		}

+	}

+*/

+	if(system("/bin/zte_isms &") != 0)

+	{

+		at_print(AT_ERR,"[TEST]execv error(%d)\n", errno);

+	}

+#endif	

+}

+

+int atd_req_rcv_act( char *at_paras,int at_fd,struct at_context *context)

+{

+	if(is_ppp_dial_atd(at_paras, at_fd) == 0)

+		return AT_END;

+	else

+		return AT_CONTINUE;//ÆÕͨµÄATDÃüÁֱ½Óת·¢

+}

+

+char* start_cvmod_cmd(void *msg,struct at_context *context)

+{

+	char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+CVMOD=0\r\n");

+    

+	return at_next;

+}

+

+char* start_zchnelset_cmd(void *msg,struct at_context *context)

+{

+	char *at_next=NULL;

+    at_next=malloc(40);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,40);

+	sprintf(at_next,"AT+ZCHNELSET=0,37,38,39,40,41\r\n");

+    

+	return at_next;

+}

+

+char *start_querycgdcont_cmd(void *msg,struct at_context *context)

+{

+	char *at_next=NULL;

+    at_next=malloc(20);

+    if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+    memset(at_next,0,20);

+	sprintf(at_next,"AT+CGDCONT?\r\n");

+	return at_next;

+}

+

+//bsim

+static int bs_aes_init_key(unsigned char *aes_key, int k_len)

+{

+	int efuse_fd = -1;

+	T_ZDrvEfuse_Secure efuse = {0};

+	

+	memset(&efuse, 0, sizeof(efuse));

+	efuse_fd = open("/dev/efuse", O_RDWR);

+	if (efuse_fd < 0) {

+		printf("wifi_aes_init_key efuse open errno=%d\n", errno);

+		return 0;

+	}

+	if(ioctl(efuse_fd , EFUSE_GET_DATA, &efuse) != 0) {

+		printf("wifi_aes_init_key efuse ioctl errno=%d\n", errno);

+		close(efuse_fd);

+		return 0;

+	}

+	close(efuse_fd);

+	memcpy(aes_key, efuse.pubKeyHash, k_len);

+	

+	return 1;

+}

+

+static int bs_aes_encrypt(char* in, int len, char* out, unsigned char* key, int key_len)

+{

+    if (!in || !out || !key || len <=0 || (len%AES_BLOCK_SIZE)!=0 || (key_len!=16 && key_len!=24 && key_len!=32)) {

+		printf("bs_aes_encrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);

+        return 0;

+    }

+ 

+    AES_KEY aes = {0}; //cov h

+    if (AES_set_encrypt_key(key, key_len*8, &aes) < 0) {

+		printf("bs_aes_encrypt AES_set_encrypt_key err\n");

+        return 0;

+    }

+ 

+    int en_len = 0;

+    while (en_len < len) {

+        AES_encrypt((unsigned char*)in, (unsigned char*)out, &aes);

+        in	+= AES_BLOCK_SIZE;

+        out += AES_BLOCK_SIZE;

+        en_len += AES_BLOCK_SIZE;

+    }

+ 

+    return 1;

+}

+

+static int bs_aes_decrypt(char* in, int len, char* out, char* key, int key_len)

+{

+    if (!in || !out || !key || len <=0 || (len%AES_BLOCK_SIZE)!=0 || (key_len!=16 && key_len!=24 && key_len!=32)) {

+		printf("bs_aes_decrypt err in=%p out=%p key=%p len=%d key_len=%d\n",in,key,out,len,key_len);

+        return 0;

+    }

+ 

+    AES_KEY aes = {0}; //cov h

+    if (AES_set_decrypt_key((unsigned char*)key, key_len*8, &aes) < 0) {

+		printf("bs_aes_decrypt AES_set_decrypt_key err\n");

+        return 0;

+    }

+ 

+    int en_len = 0;

+    while (en_len < len) {

+        AES_decrypt((unsigned char*)in, (unsigned char*)out, &aes);

+        in	+= AES_BLOCK_SIZE;

+        out += AES_BLOCK_SIZE;

+        en_len += AES_BLOCK_SIZE;

+    }

+ 

+    return 1;

+}

+

+static int apn_encrypt_code(void)

+{

+	char w_code[PROFILE_APN_LEN] = {0};

+	char b_aes[PROFILE_APN_LEN] = {0};

+	char s_aes[PROFILE_APN_AES_LEN] = {0};

+

+	cfg_get_item("ppp_passtmp", w_code, sizeof(w_code));

+	bs_aes_encrypt(w_code, PROFILE_APN_LEN - 1, b_aes, atctl_aes_key, sizeof(atctl_aes_key));

+	bytes2string(b_aes, s_aes, PROFILE_APN_LEN - 1); //libatutils

+	cfg_set("ppp_passwd", s_aes);

+	printf("apn_encrypt_code w_code=%s, s_aes=%s\n", w_code, s_aes);

+

+	return 1;

+}

+

+static int ipv6apn_encrypt_code(void)

+{

+	char w_code[PROFILE_APN_LEN] = {0};

+	char b_aes[PROFILE_APN_LEN] = {0};

+	char s_aes[PROFILE_APN_AES_LEN] = {0};

+

+	cfg_get_item("ipv6_ppp_passtmp", w_code, sizeof(w_code));

+	bs_aes_encrypt(w_code, PROFILE_APN_LEN - 1, b_aes, atctl_aes_key, sizeof(atctl_aes_key));

+	bytes2string(b_aes, s_aes, PROFILE_APN_LEN - 1);

+	cfg_set("ipv6_ppp_passwd", s_aes);

+	printf("ipv6apn_encrypt_code w_code=%s, s_aes=%s\n", w_code, s_aes);

+

+	return 1;

+}

+

+//2±íʾfota´ÓÀϰ汾ÍùÉÏÉý¼¶£¬ppp_password´æµÄÊÇÃ÷ÎÄÃÜÂ룬а汾ÊÇÃÜÎÄ

+static int apn_decrypt_code(void)

+{

+	char w_code[PROFILE_APN_LEN]= {0};

+	char b_aes[PROFILE_APN_LEN] = {0};

+	char s_aes[PROFILE_APN_AES_LEN] = {0};

+	int flag = 0;

+

+	cfg_get_item("ppp_passwd", s_aes, sizeof(s_aes));

+	if (strlen(s_aes) == (PROFILE_APN_AES_LEN - 1)) {

+		string2bytes(s_aes, b_aes, PROFILE_APN_AES_LEN - 1);

+		bs_aes_decrypt(b_aes, PROFILE_APN_LEN - 1, w_code, atctl_aes_key, sizeof(atctl_aes_key));

+		cfg_set("ppp_passtmp", w_code);

+//		printf("apn_decrypt_code w_code=%s, s_aes=%s\n", w_code, s_aes);

+	} else if (strlen(s_aes) > 0){

+		cfg_set("ppp_passtmp", s_aes);

+		return 2;

+	}

+

+	return 1;

+}

+

+static int ipv6apn_decrypt_code(void)

+{

+	char w_code[PROFILE_APN_LEN]= {0};

+	char b_aes[PROFILE_APN_LEN] = {0};

+	char s_aes[PROFILE_APN_AES_LEN] = {0};

+	int flag = 0;

+

+	cfg_get_item("ipv6_ppp_passwd", s_aes, sizeof(s_aes));

+	if (strlen(s_aes) == (PROFILE_APN_AES_LEN - 1)) {

+		string2bytes(s_aes, b_aes, PROFILE_APN_AES_LEN - 1);

+		bs_aes_decrypt(b_aes, PROFILE_APN_LEN - 1, w_code, atctl_aes_key, sizeof(atctl_aes_key));

+		cfg_set("ipv6_ppp_passtmp", w_code);

+//		printf("apn_decrypt_code w_code=%s, s_aes=%s\n", w_code, s_aes);

+	} else if (strlen(s_aes) > 0){

+		cfg_set("ipv6_ppp_passtmp", s_aes);

+		return 2;

+	}

+

+	return 1;

+}

+

+int atctl_aes_init(void)

+{

+	bs_aes_init_key(atctl_aes_key, sizeof(atctl_aes_key));

+	

+	if (2 == apn_decrypt_code())

+		apn_encrypt_code();

+	if (2 == ipv6apn_decrypt_code())

+		ipv6apn_encrypt_code();

+

+	return 1;

+}

+

+

diff --git a/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/ps_pdp.c b/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/ps_pdp.c
new file mode 100755
index 0000000..28d7339
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/at_ctl/src/atconfig/ps_pdp.c
@@ -0,0 +1,3397 @@
+/*****************************************************************************

+*  °æ±¾ËùÓÐ 

+*  Ä£¿éÃû  £º

+*  ÎļþÃû £º

+*  Îļþ±êʶ£º

+*  Ïà¹ØÎļþ£º

+*  ʵÏÖ¹¦ÄÜ£º¸ÃÎļþÖ÷ÒªÊÇat_ctlÖÐÓëPDP¼¤»îÏà¹ØµÄʼþʵÏÖºÍÃüÁî´¦Àí½Ó¿Ú£¬°üÀ¨apnÉèÖÃÏà¹ØÃüÁî´¦Àí¡¢¼øÈ¨Ïà¹ØÃüÁî´¦Àí

+ÒÔ¼°¼¤»îÃüÁîµÄ´¦Àí

+

+cidÕ¼ÓÃÔ­Ôò:

+1¡¢Ô¤ÁôCIDÖ±½Óͨ¹ýATÃüÁºÅ(cgact\zgact)

+2¡¢·ÇÔ¤ÁôCID£¬Èç´æÔÚ¼ÓÃÜÈÏÖ¤Ôò¶Àռһ·CID

+3¡¢·ÇÔ¤ÁôCID£¬ÈçapnºÍpdpÀàÐÍÏàͬÔò¹²Ïíһ·CID

+4¡¢ÈôPDP¼¤»îʱ²»Ö¸¶¨APNÔòʹÓÃĬÈÏAPN

+¶ÔÓÚAPºÍCP²»Í¬ÒµÎñ¹²ÏícidµÄʵÏÖ·½Ê½:

+1/ÓÉCP²àͳһ·¢Æðpdp¼¤»î£¬³É¹¦ºó£¬·¢Ëͺ˼äÏûÏ¢MSG_CMD_DATASWITCH_ON_REQ֪ͨAP²à½øÐÐ×éÍø£¬AP²àÒµÎñ½ö¼ì²éÍøÂçÊÇ·ñ¿ÉÓü´¿É£¬ÎÞÐè·¢Æðpdp¼¤»î

+2/AP²àºÍCP²à¸÷×Ô·¢ÆðPDP¼¤»î£¬ÓÉCP²àͳһÖٲã¬Èô·¢ÏÖPDP¼¤»îÇëÇóÖÐЯ´øÁËÏàͬµÄapnºÍip type£¬ÔòÈÏΪÕâЩÇëÇó¿ÉÒÔ

+¹²Ïíͬһcid£¬½«¸ÃapnºÍip typeÒѼ¤»îµÄcid·µ»Ø¸øpdpÇëÇóÔ´£¬²¢Ôö¼Ó¸ÃcidµÄÒýÓüÆÊý£¬Òò´Ë¸Ã·½Ê½ÐèÒª²»Í¬ÒµÎñ¸÷×Ô¹ÜÀí

+×Ô¼ºµÄpdp¼¤»îÁ÷³Ì£¬ÔÚ²»ÔÙʹÓÃcidʱ£¬±ØÐë·¢ÆðpdpÈ¥²¦ºÅ£¬ÊͷŸÃcid¡£

+3/Ö»ÓÐÄ£¿éÄÚ²¿Ê¹ÓõÄPDP¼¤»î£¬²ÅÔÊÐí¹²Ïí£¬Ò»µ©pdp¼¤»î£¬ÊÇΪÁ˸øÄ£¿éÍⲿʹÓã¬Ôò²»ÔÊÐí¹²Ïí

+*  ×÷Õß   £º

+*  °æ±¾   £º

+*  Íê³ÉÈÕÆÚ£º

+*  ÆäËü˵Ã÷£º

+*****************************************************************************/

+

+#include "at_context.h"

+#include "ps_normal.h"

+#include "ps_pdp.h"

+#include "ppp_dial.h"

+#include "softap_api.h"

+#include "string.h"

+#include "at_zephyr.h"

+#include <asm/unistd.h>

+#include <limits.h>

+

+

+

+#define PDP_CMD_LEN  256  //PDP¼¤»îÏà¹ØµÄATÃüÁ¶È

+

+#define MAX_AT_IPV6_SIZE    64  // ´ÓATÏìÓ¦ÃüÁî»ñÈ¡µÄIPV6µØÖ·³¤¶È

+#define MAX_AT_IPV4V6_SIZE  80  // ´ÓATÏìÓ¦ÃüÁî»ñÈ¡µÄIPV4V6µØÖ·³¤¶È£¬16(IPV4) + 64(IPV6)

+

+enum

+{

+    CID_IDLE = 0,

+	CID_ACTIVING,

+	CID_DEACTIVING,

+    CID_ACTIVE,

+};

+

+struct cid_resource_t{

+    int c_id;				//PDPΨһ±êʶ

+    int reserved; 			//c_id±£Áô±êÖ¾£¬ÖÃλÔò±íʾרÓ㬲»²ÎÓ붯̬»ñÈ¡£¬¿ª»úÅäÖÃ

+    int state; 				//c_idʹÓÃ״̬, ȡֵΪCID_IDLE£¬CID_ACTIVITINGºÍCID_ACTIVE

+    int ref;				//ÓÃÀ´¼Ç¼ÊÇ·ñ¼¤»î½Å±¾Ö´ÐÐÖУ¬Ö´ÐÐÖÐΪ1

+    int auth_type;			//¼Ç¼cid µ±Ç°µÄÈÏÖ¤ÀàÐÍ£¬ÓÃÓÚpdp¼¤»îǰÇå³ýÈÏÖ¤

+	char apn[APN_MAX_LEN];

+    char ip_type[IPTYPE_MAX_LEN];//IPÀàÐÍ£¬È¡ÖµÎª×Ö·û´®£¬"IP","IPV6","IPV4V6"£¬×¢ÒâÈ«²¿ÊÇ´óд

+};

+

+typedef struct

+{

+    struct pdp_act_req pdpActInfo;  	//´æ·Åpdp¼¤»îÏûÏ¢ÄÚÈÝ

+    int pdp_type;					//±¾´Îpdp¼¤»îÀàÐÍ

+	int c_id;						//±¾´Îpdp¼¤»î»ñÈ¡µÄcid

+	int index;						//±¾´Îpdp¼¤»îÔÚCID×ÊÔ´Êý×éµÄϱí

+	int pdp_state;					//µ±Ç°pdp¼¤»î״̬£¬0±íʾȥ¼¤»î£¬1±íʾ¼¤»î

+	int auth_state;					//µ±Ç°ÈÏ֤״̬£¬PDP_DEL_AUTH±íʾȥ³ýÈÏÖ¤£¬PDP_ADD_AUTH±íʾÌí¼ÓÈÏÖ¤

+}PDP_PRIVATE_INFO;

+

+

+struct defcid_mng_t 	g_defcid_mng = {0};

+struct pdpinfo_mng_t	g_pdpinfo_mng[CID_MAX_NUM] = {0};

+

+

+//ppp²¦ºÅ»ñÈ¡µ½µÄcid

+int ppp_cid = 0;

+

+//extern psnormal_state psinfo;

+//ÓÃÓÚpdp¼¤»îÖ®ºó£¬·¢ËÍÏûϢ֪ͨsmsºÍpbÄ£¿éÆô¶¯³õʼ»¯

+extern int g_smspb_init;

+

+/*ÓÉÓÚppp²¦ºÅ/Ö¸¶¨cid pdp²¦ºÅ»ñÈ¡µ½µÄIPµØÖ·£¬×îÖÕ¶¼»á·ÖÅ䏸PCÖÕ¶Ë£¬Òò´Ë¸Ãcid²»Äܹ²Ïí;

+cid¹²ÏíÔ­Ôò:

+	Ö»ÓÐÄ£¿éÄÚ²¿Ê¹ÓõÄPDP¼¤»î£¬²ÅÔÊÐí¹²Ïí£¬Ò»µ©pdp¼¤»î£¬ÊÇΪÁ˸øÄ£¿éÍⲿʹÓã¬Ôò²»ÔÊÐí¹²Ïí

+*/

+struct cid_resource_t CID_ARRAY[CID_MAX_NUM] = {0};

+

+//cid±£Áôλͼ

+int cid_reserved = 0;

+int default_cur_cid=0;//¼Ç¼µ±Ç°cid

+//cid×ÊÔ´³õʼ»¯±ê¼Ç£¬ÔÚcid×ÊԴδ³õʼ»¯Íê³É֮ǰ£¬¶Ô½ÓÊÕµ½µÄpdp¼¤»îÇëÇ󣬯ô¶¯¶¨Ê±Æ÷£¬´ý³õʼ»¯Íê³Éºó£¬ÔÙ´¦Àí

+//Ò»°ãcpºËÔÚ½ÓÊÕµ½apµÄnvͬ²½ÇëÇó֮ǰ£¬ÓпÉÄÜÒѾ­·¢ÆðÁËpdp¼¤»î£¬´ËʱÐèÒªÑӳٵȴý

+int is_cid_init = 0;

+static char *s_pstrIpv6Addr = NULL;/*µ÷ÊÔʱʹÓ㬺óÐø¿É¸ÄΪ¾Ö²¿±äÁ¿*/

+int apn_is_ims = -1;

+static unsigned char def_attach_cid_index = 0;

+

+void set_def_attach_cid(unsigned char cid)

+{

+	if(cid > 0 && cid < CID_MAX_NUM)

+	{

+		def_attach_cid_index = cid - 1;

+	}

+	at_print(AT_ERR,"def_attach_cid=%d now=%d\n",cid,def_attach_cid_index);

+}

+

+int get_is_cid_init()

+{

+    return is_cid_init;

+}

+

+void cid_resource_init()

+{

+	int i = 0;

+    char reservecid[30] = {0};

+	char versionmode[2] = {0};

+

+//¶ÔÓÚtos£¬±ØÐëµÈ´ýAP²àµÄnvͬ²½Ö®ºó£¬²Å»á½«is_cid_initÖÃΪ1£¬²¢½øÐÐcid×ÊÔ´³õʼ»¯

+#if (APP_OS_TYPE != APP_OS_TOS)

+	is_cid_init = 1;

+#endif

+

+#if 1

+    // kw 3 	UNREACH.RETURN

+    if(0 ==  get_is_cid_init())

+    {

+        return;

+    }

+#else

+	if(0 == is_cid_init)

+		return;

+#endif

+    cfg_get_item("cid_reserved",reservecid,sizeof(reservecid));

+

+    at_print(AT_ERR,"start to init cid resource: origin cid_reserved:%d,new resumed:%s\n",cid_reserved,reservecid);

+	if(strlen(reservecid))

+    {

+        cid_reserved = atoi(reservecid);//cid_reservedµÄֵת»¯³É¶þ½øÖÆ£¬Ä³Î»Îª1´ú±ícidΪn(nΪµÚ¼¸Î»)ʱ±£Áô,ÀýÈçcid=1ºÍ3±£Áô£¬Ôòcid_reserved=00000101

+    }

+

+#if (APP_OS_TYPE == APP_OS_TOS)

+	cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+	if(0 == strcmp(versionmode, "1"))

+		cid_reserved = 255;//15;//¶ÔÓÚоƬÈÏÖ¤·ÖÖ§£¬Ä¬ÈÏËùÓÐcid¶¼Ô¤Áô

+#endif

+

+    //¶ÔÓÚmodemËùÔںˣ¬cid×ÊÔ´¹ÜÀíÊý×éϱêÓëcid¹ØÁªÆðÀ´£¬±ãÓÚÎÊÌâ·ÖÎö

+    for(i=0;i<CID_MAX_NUM;i++)

+    {

+		if(CID_IDLE != CID_ARRAY[i].state)

+		{

+			softap_assert("");

+		}

+    	memset(&CID_ARRAY[i], 0x00, sizeof(struct cid_resource_t));

+        CID_ARRAY[i].state = CID_IDLE;	

+#ifdef HAVE_MODEM_IN_CORE

+        CID_ARRAY[i].c_id = i+1;

+        CID_ARRAY[i].reserved = (cid_reserved & (1<<i));  //reserved²»Îª0ʱ£¬±íʾΪרÓ㬲»²ÎÓ붯̬»ñÈ¡

+#endif

+		//CID_ARRAY[i].ref = 0;

+    } 

+	syscall(__NR_set_cidstate,(unsigned char)cid_reserved);

+}

+//ÔÚpdpÈ¥¼¤»îʱÐèÒªÇå¿ÕÏà¹ØcidµÄ¹ÜÀíÐÅÏ¢

+void pdpinfo_reset(int cid)

+{

+	if(g_pdpinfo_mng[cid-1].pdpInfo != NULL)

+	{

+		pdp_deact_proc_for_module(g_pdpinfo_mng[cid-1].pdpInfo);

+		//g_pdpinfo_mng[cid-1].ipflag_down = g_pdpinfo_mng[cid-1].pdpInfo->act_info.ip46flag;

+		free(g_pdpinfo_mng[cid-1].pdpInfo);			

+		g_pdpinfo_mng[cid-1].pdpInfo = NULL;

+		if((cid_reserved&(1<<(cid-1))) != 0 && g_pdpinfo_mng[cid-1].fwd_info.cgact_ok && g_pdpinfo_mng[cid-1].fwd_info.zgact_ok)

+			send_zconstat_auto_report(0, cid);

+	}

+

+	memset(&g_pdpinfo_mng[cid-1].fwd_info, 0x00, sizeof(FWD_PDP_INFO));

+

+	if(g_pdpinfo_mng[cid-1].ip6addr != NULL)

+	{

+		free(g_pdpinfo_mng[cid-1].ip6addr);

+		g_pdpinfo_mng[cid-1].ip6addr = NULL;

+		//g_pdpinfo_mng[cid-1].slaac_v6_inform = 0;

+	}

+

+}

+static void pdpinfo_init(int cid)

+{

+	if(g_pdpinfo_mng[cid-1].pdpInfo == NULL)

+	{

+		g_pdpinfo_mng[cid-1].pdpInfo = (struct pdp_active_info *)malloc(sizeof(struct pdp_active_info));

+		if(g_pdpinfo_mng[cid-1].pdpInfo == NULL){softap_assert("");}

+		memset(g_pdpinfo_mng[cid-1].pdpInfo, 0x00, sizeof(struct pdp_active_info));

+		g_pdpinfo_mng[cid-1].pdpInfo->pdp_type = 0;

+	}

+	g_pdpinfo_mng[cid-1].pdpInfo->c_id = cid;

+}

+

+struct pdp_active_info *get_pdpinfo_bycid(int cid)

+{

+	return g_pdpinfo_mng[cid-1].pdpInfo;

+}

+

+

+/*Ìø¹ýIPV6µÄǰ׺*/

+char * skip_first_half_ipv6(char * pstrIpv6)

+{

+    int i = 0;

+

+    s_pstrIpv6Addr = pstrIpv6;

+    for(i=0; i<4; i++)

+    {

+        s_pstrIpv6Addr = strchr(s_pstrIpv6Addr, ':');

+        if(NULL != s_pstrIpv6Addr)

+        {

+            s_pstrIpv6Addr++;

+        }

+		else

+			return NULL;

+    }

+    return s_pstrIpv6Addr;

+}

+

+/*½«»ñÈ¡µ½µÄIPv6µØÖ·´æ·ÅÔÚÈ«¾Ö±äÁ¿g_pdpinfo_mng[cid-1].ip6addrµ±ÖÐ;

+¶ÔÓÚmodemËùÔںˣ¬slaac»ñÈ¡µ½µØÖ·Ê±£¬ÒѾ­Íê³ÉÁËIPv6µØÖ·µÄ½âÎö£¬½«Ç°×ºÐÅÏ¢´æ·ÅÔÚNVµ±ÖУ»

+¶ÔÓÚ·ÇmodemËùÔںˣ¬Æäµ¥²¥IPv6µØÖ·ÊÇͨ¹ýzpdpactÖ÷¶¯Éϱ¨»òÕߺ˼äÏûÏ¢MSG_CMD_DATASWITCH_ON_REQ´«µÝ¹ýÀ´µÄ£¬Òò´Ë

+ÐèÒª¶ÔIPv6µØÖ·½øÐнâÎö£¬»ñȡǰ׺ÐÅÏ¢£¬²¢´æ·ÅÔÚNVµ±ÖС£

+

+ÔÚµ÷ÓÃpdp_act_proc½Ó¿Ú¼¤»îÍøÂç½Ó¿Úʱ£¬wan_ipv6.sh½Å±¾Öиù¾ÝNVÖÐÊÇ·ñÒѾ­±£´æÇ°×ºÐÅÏ¢£¬

+À´È·¶¨ÊÇ·ñÐèÒªÆô¶¯slaacÈ¥»ñÈ¡IPv6ǰ׺ÐÅÏ¢£»

+*/

+static void save_unicast_ip6addr(int cid, char * unicast_ip6addr)

+{

+#ifndef HAVE_MODEM_IN_CORE

+	char nv_pswan[10] = {0};

+	char tmp_ipv6_prefix[IPV6ADDLEN_MAX] = {0};

+	char prefix_nv_cmd[100] = {0};

+

+	strncpy(tmp_ipv6_prefix, unicast_ip6addr,(int)(skip_first_half_ipv6(unicast_ip6addr)-unicast_ip6addr));

+	cfg_get_item("pswan", nv_pswan, sizeof(nv_pswan));

+

+	sprintf(prefix_nv_cmd, "%s%d_ipv6_prefix_info", nv_pswan,cid);

+	cfg_set(prefix_nv_cmd, tmp_ipv6_prefix);

+

+	sprintf(prefix_nv_cmd, "%s%d_ipv6_prefix_len", nv_pswan, cid);

+	cfg_set(prefix_nv_cmd, "64");

+

+	sprintf(prefix_nv_cmd, "%s%d_ipv6_gw", nv_pswan, cid);

+	cfg_set(prefix_nv_cmd,"");

+#endif

+	if(g_pdpinfo_mng[cid-1].ip6addr != NULL)

+	{

+		free(g_pdpinfo_mng[cid-1].ip6addr);

+		g_pdpinfo_mng[cid-1].ip6addr = NULL;

+	}

+

+	g_pdpinfo_mng[cid-1].ip6addr = malloc(IPV6ADDLEN_MAX);

+	memset(g_pdpinfo_mng[cid-1].ip6addr, 0, IPV6ADDLEN_MAX);

+	memcpy(g_pdpinfo_mng[cid-1].ip6addr, unicast_ip6addr, IPV6ADDLEN_MAX);

+}

+

+static void get_unicast_ip6addr(int cid)

+{

+	char nv_pswan[10] = {0};

+	char tmp_ipv6_prefix[IPV6ADDLEN_MAX] = {0};

+	char tmp_postfix[IPV6ADDLEN_MAX] = {0};

+	char nv_cmd[100] = {0};

+

+	cfg_get_item("pswan", nv_pswan, sizeof(nv_pswan));

+

+	sprintf(nv_cmd, "%s%d_ipv6_prefix_info", nv_pswan,cid);

+	cfg_get_item(nv_cmd, tmp_ipv6_prefix, sizeof(tmp_ipv6_prefix));

+

+	sprintf(nv_cmd, "%s%d_ipv6_interface_id",nv_pswan,cid);

+	cfg_get_item(nv_cmd, tmp_postfix, sizeof(tmp_postfix));

+

+	if(g_pdpinfo_mng[cid-1].ip6addr != NULL)

+	{

+		free(g_pdpinfo_mng[cid-1].ip6addr);

+		g_pdpinfo_mng[cid-1].ip6addr = NULL;

+	}

+

+	g_pdpinfo_mng[cid-1].ip6addr = malloc(IPV6ADDLEN_MAX);

+	memset(g_pdpinfo_mng[cid-1].ip6addr, 0, IPV6ADDLEN_MAX);

+	sprintf(g_pdpinfo_mng[cid-1].ip6addr, "%s%s", tmp_ipv6_prefix, tmp_postfix);	

+}

+

+#if 0

+int check_slaac_inform(int cid)

+{

+	//Èôµ±Ç°slaacÕýÔÚ»ñÈ¡IPv6µØÖ·£¬Ôò¼ÌÐøµÈ´ý

+	if(V6ADDR_GETTING == g_pdpinfo_mng[cid-1].slaac_v6_inform)

+	{

+		return AT_WAIT_AUTO;

+	}

+	//Èç¹ûslaac»ñÈ¡µØÖ·Ê§°Ü£¬ÔòÖ±½ÓÏòPDP¼¤»î·¢ÆðÔ´Éϱ¨¼¤»îʧ°ÜÏûÏ¢

+	else if(V6ADDR_GET_FAILED == g_pdpinfo_mng[cid-1].slaac_v6_inform)

+	{

+		pdpinfo_reset(cid);

+		return AT_END;

+	}

+	return AT_CONTINUE;

+}

+#endif

+

+/*»ñÈ¡µ±Ç°µÚÒ»¸ö´¦ÓÚidle״̬µÄcidÊý×éϱí

+1¡¢ÓÃÓÚ²»²ÎÓëapn¹²Ïí»ñÈ¡¿ÕÏÐÊý×éϱ꣬µ±Ç°Çé¿öʱÐèÒªÈÏÖ¤µÄpdp¼¤»î£¬²»²ÎÓëapn¹²Ïí£¬µ¥¶ÀÕ¼ÓÃһ·cid;

+2¡¢ÓÃÓÚµ±Ç°pdp¼¤»î apnûÓб»¼¤»îʱ

+*/

+int get_idx_byidle(char flag,char *apn)

+{

+	int i = 0;

+	at_print(AT_ERR,"@@!!@@get_idx_byidle ims=%d,flag=%d,apn=%s\n",apn_is_ims,flag,apn);

+	for(i = 0; i < CID_MAX_NUM; i++)

+	{

+		if(cid_reserved != 255 && CID_ARRAY[i].reserved)//15

+		{	

+			//¶ÔÓÚÔ¤ÁôµÄcid£¬²»²ÎÓ붯̬·ÖÅä NVΪ15±íÊ¾ÌØÊâ²úÆ·ÐÎ̬£¬cid¼ÈÔ¤Áô¸øÍⲿ£¬Ò²²ÎÓ붯̬·ÖÅä

+			continue;

+		}

+		if(i != def_attach_cid_index && syscall(__NR_get_cidstate,(unsigned char)(i+1)))

+			continue;

+		if(i == def_attach_cid_index)

+		{

+			if(at_strcmp(apn,"ims")==0 && apn_is_ims == 1 && CID_ARRAY[def_attach_cid_index].state == CID_IDLE)

+			{

+				return def_attach_cid_index;

+			}

+			if(at_strcmp(apn,"ims")!=0 && apn_is_ims == 1)

+			{

+				continue;

+			}

+			if(flag == 0)

+			{

+				continue;

+			}

+		}

+		if(CID_ARRAY[i].state == CID_IDLE)

+		{

+			return i;

+		}

+	}

+	if(apn_is_ims == 1 && CID_ARRAY[def_attach_cid_index].state == CID_IDLE)

+	{

+		apn_is_ims = 0;//Èç¹û³ýims°ó¶¨µÄcidÒѾ­Ã»ÓпÕÏÐCID£¬Ôò½â°ó²¢ÌṩʹÓÃ

+		at_print(AT_ERR,"@@!!@@get_idx_byidle ims_unbind index=%d\n",def_attach_cid_index);

+		return def_attach_cid_index;

+	}

+	//softap_assert("");

+	return -1;

+}

+

+//оƬÈÏÖ¤°æ±¾cp²àÑ¡Ôñ¿ÕÏÐcidÔ­Ôò£ºÏÈÕÒ¿ÕÏеÄÇÒip_typeΪ¿Õ£¨¼´Ã»Óж¨Òå¹ýÉÏÏÂÎÄ£©£¬Èç¹û

+//ûÓÐÂú×ãÌõ¼þµÄÔòÖ±½Ó´ÓÍ·¿ªÊ¼ÕÒµÚÒ»¸ö¿ÕÏеÄcid

+int get_idx_byidle_for_renzhen()

+{

+	int i = 0;	

+	for(i = 0; i < CID_MAX_NUM; i++)

+	{

+		if(CID_ARRAY[i].state == CID_IDLE && strlen(CID_ARRAY[i].ip_type) == 0)

+		{

+			return i;

+		}

+	}

+    return get_idx_byidle(1,"");

+}

+

+//ÓÃÓÚapn¹²Ïíʱ£¬Í¨¹ýapnºÍip type»ñÈ¡cid×ÊÔ´Êý×éϱê

+int get_idx_byapn(char *apn, char *ip_type, int *is_setapn, char flag)

+{

+	int i;

+	char versionmode[2] = {0};

+	cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+

+	for(i = 0; i<CID_MAX_NUM; i++)

+    {

+		if(cid_reserved != 255 && CID_ARRAY[i].reserved)//15

+    	{	

+    		//¶ÔÓÚÔ¤ÁôµÄcid£¬²»²ÎÓ붯̬·ÖÅä NVΪ15±íÊ¾ÌØÊâ²úÆ·ÐÎ̬£¬cid¼ÈÔ¤Áô¸øÍⲿ£¬Ò²²ÎÓ붯̬·ÖÅä

+    		continue;

+    	}

+		//Ö»Óв»ÈÏÖ¤µÄcid£¬apn²ÅÄܱ»¹²Ïí

+        if((0 == strcmp(apn, CID_ARRAY[i].apn)) && (0 == strcmp(ip_type, CID_ARRAY[i].ip_type)) && (NONE_AUTH == CID_ARRAY[i].auth_type))

+        {

+#if 0//ЭÒéÕ»ÒÑÖ§³Ö2-3GÏÂcidÓÃ5-8£¬Ö»Òª×ÜÊý²»³¬¹ý4

+			if(CID_ARRAY[i].state != CID_ACTIVE && i >= 4)

+			{

+				//´óÓÚ5µÄcidÔÚ䲦ºÅµÄ״̬²»Äܸ´Ó㬷ÀÖ¹2-3Gʱѡµ½Ò»Ö±²¦ºÅʧ°Ü

+				continue;

+			}

+#endif			

+			if(is_setapn)

+        	{

+        		*is_setapn = 1;//cid_reserved=255ʱÉÏÏÂÎÄ¿ÉÄܱ»Ð޸쬻¹ÊÇÐèÒªÖØÐ¶¨Òå

+        	}

+            return i;

+        }

+    }

+	if(is_setapn)

+	{

+		*is_setapn = 1;

+    }

+#ifdef HAVE_MODEM_IN_CORE

+	//оƬÈÏÖ¤°æ±¾ÌØÊâ´¦Àí

+	if(0 == strcmp(versionmode, "1"))

+		return get_idx_byidle_for_renzhen();

+	else

+		return get_idx_byidle(flag,apn);

+#else

+	return get_idx_byidle(flag,apn);

+#endif

+

+}

+//CP²àµÄcidÊÇidx+1 AP²àcidºÍidx²»¶ÔÓ¦£¬ÐèҪͨ¹ý´Ë½Ó¿Ú²éѯidx

+int get_idx_bycid(int c_id)

+{

+	int i = 0;

+	for(i = 0; i < CID_MAX_NUM; i++)

+	{

+		if(CID_ARRAY[i].c_id == c_id)

+			return i;

+	}

+    return -1;

+}

+

+/*

+	ÓÉÓÚzgipdnsÉϱ¨ÖÐipv6µØÖ·Ò»°ãʱ±¾µØÁ´Â·µØÖ·£¬¼´FE80::¿ªÍ·µÄµØÖ·£¬²»ÄÜÓÃÓÚÍâÍøÍ¨ÐÅ£¬Òò´Ë

+	ÐèҪͨ¹ýslaacÏòºËÐÄÍø»ñȡȫÇòΨһµ¥²¥ipv6µØÖ·£¬²¢´æÔÚg_pdpinfo_mng[c_id-1].ip6addrÖУ¬Òò´Ë

+	ÔÚ¹¹½¨zpdpactÉϱ¨/znetifupÉèÖõIJÎÊýʱ£¬ÐèҪʹÓÃg_pdpinfo_mng[c_id-1].ip6addr×÷ÎªÕæÊµipv6µØÖ·

+*/

+int build_ipdns_param(char *at_str, struct pdp_active_info *info)

+{

+	int offset = 0;

+	offset += sprintf(at_str+offset,"%d,",info->c_id);

+	switch(info->act_info.ip46flag)

+	{

+		case V4_VALID:

+			offset += sprintf(at_str+offset, "\"IP\",");

+			offset += sprintf(at_str+offset,"\"%s\",", info->act_info.ip);

+			offset += sprintf(at_str+offset,"\"%s\",", info->act_info.gateway);

+			offset += sprintf(at_str+offset,"\"%s\",", info->act_info.pri_dns);

+			offset += sprintf(at_str+offset,"\"%s\"", info->act_info.sec_dns);

+			break;

+		case V6_VALID:

+			offset += sprintf(at_str+offset, "\"IPV6\",");

+			offset += sprintf(at_str+offset,"\"%s\",", g_pdpinfo_mng[info->c_id-1].ip6addr);

+			offset += sprintf(at_str+offset,"\"%s\",", info->act_info.gateway6);

+			offset += sprintf(at_str+offset,"\"%s\",", info->act_info.pri_dns6);

+			offset += sprintf(at_str+offset,"\"%s\"", info->act_info.sec_dns6);

+			break;

+		case V46_VALID:

+		{

+			char ps_wan[NV_NAME_LEN] = {0};

+			char psv6_wan[NV_NAME_LEN] = {0};

+			char pswan_state[NV_NAME_LEN] = {0};

+

+			cfg_get_item("pswan", ps_wan, sizeof(ps_wan));

+

+			snprintf(psv6_wan,NV_NAME_LEN, "%s%d_ipv6_state", ps_wan, info->c_id);

+			cfg_get_item(psv6_wan, pswan_state, sizeof(pswan_state));

+			//Èç¹ûV6µØÖ·»ñȡʧ°Ü£¬ÔòÖ»Éϱ¨V4µØÖ·

+			if(strcmp(pswan_state,"dead") == 0)

+			{

+				offset += sprintf(at_str+offset, "\"IP\",");

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.ip);

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.gateway);

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.pri_dns);

+				offset += sprintf(at_str+offset,"\"%s\"", info->act_info.sec_dns);

+			}

+			else

+			{

+				offset += sprintf(at_str+offset, "\"IPV4V6\",");

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.ip);	

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.gateway);

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.pri_dns);

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.sec_dns);

+				offset += sprintf(at_str+offset,"\"%s\",", g_pdpinfo_mng[info->c_id-1].ip6addr);	

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.gateway6);

+				offset += sprintf(at_str+offset,"\"%s\",", info->act_info.pri_dns6);

+				offset += sprintf(at_str+offset,"\"%s\"", info->act_info.sec_dns6);

+			}

+			break;

+		}

+		default:

+				softap_assert("");

+	}

+	return offset;

+}

+#if !defined(HAVE_MODEM_IN_CORE) || defined(MULTI_CPU)

+static int parse_ipdns_param(char * at_paras)

+{

+    int cid = 0;

+	char ip_type[10] = {0};

+	char *p[2] = {&cid, ip_type};

+	struct pdp_active_info *pdpinfo = NULL;

+	struct netdev_act_info *act_info = NULL;

+

+	parse_param2("%d,%s",at_paras,p);

+

+	if(cid <= 0 || cid > CID_MAX_NUM)

+	{

+		softap_assert("");

+		return -1;

+	}

+	pdpinfo_init(cid);

+	pdpinfo = g_pdpinfo_mng[cid-1].pdpInfo;

+	act_info= &pdpinfo->act_info;

+

+	if(0 == strcmp("IP", ip_type))

+	{

+		char *p[6] = {	&pdpinfo->c_id, 

+					 	ip_type, 

+						act_info->ip,

+						act_info->gateway,

+					 	act_info->pri_dns,

+					 	act_info->sec_dns,

+					 };

+		act_info->ip46flag = V4_VALID;

+

+		parse_param2("%d,%s,%s,%s,%s,%s",at_paras,p);

+

+	}

+	else if(0 == strcmp("IPV6", ip_type))

+	{

+		char *p[6] = {	&pdpinfo->c_id, 

+					 	ip_type, 

+						act_info->ip6,

+						act_info->gateway6,

+						act_info->pri_dns6,

+						act_info->sec_dns6,

+					 };

+

+		act_info->ip46flag = V6_VALID;

+

+		parse_param2("%d,%s,%s,%s,%s,%s",at_paras,p);

+

+		save_unicast_ip6addr(cid, act_info->ip6);

+	}

+	else if(0 == strcmp("IPV4V6",ip_type))

+	{

+		char *p[10] = {	&pdpinfo->c_id, 

+					 	ip_type, 

+						act_info->ip,

+						act_info->gateway,

+					 	act_info->pri_dns,

+					 	act_info->sec_dns,

+						act_info->ip6,

+						act_info->gateway6,

+						act_info->pri_dns6,

+						act_info->sec_dns6,

+					  };

+		act_info->ip46flag = V46_VALID;

+		parse_param2("%d,%s,%s,%s,%s,%s,%s,%s,%s,%s",at_paras,p);

+		save_unicast_ip6addr(cid, act_info->ip6);

+	}

+	else

+	{

+

+		act_info->ip46flag = V4V6_INVALID;

+		softap_assert("");

+	}

+	return cid;

+}

+#endif

+char* get_param_by_symbol(char *at_param, char symbol, int num)

+{

+    int i = 0;

+    char * pstrStart = at_param;

+    char * pstrTemp = NULL;

+

+    for(i=0; i<num; i++)

+    {

+        pstrTemp = strchr(pstrStart, symbol);

+        if(NULL == pstrTemp)

+        {

+            return NULL;

+        }

+        pstrStart = pstrTemp + 1;;

+    }

+    return pstrStart;

+}

+

+

+/*zgpidnsÉϱ¨µÄx.x.x.x.x.x.x.x.x.x.x.x.x.x.x.xת³ÉÓÃðºÅµÄ±ê×¼IPV6µØÖ·xxxx:xxxx:xxxx:xxxx*/

+static void get_format_ipv6(char * pstrIpv6, char *s_strIpv6Addr, int v6AddrLen)

+{

+    int i = 0;

+    int iIpv6Item[16] = {0};

+	int flag = 0;

+

+    //at_print(AT_DEBUG,"IPV6 before change == %s\n", pstrIpv6);

+    sscanf(pstrIpv6, "%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d.%d",

+        iIpv6Item, iIpv6Item+1, iIpv6Item+2, iIpv6Item+3,

+        iIpv6Item+4, iIpv6Item+5, iIpv6Item+6, iIpv6Item+7,

+        iIpv6Item+8, iIpv6Item+9, iIpv6Item+10, iIpv6Item+11,

+        iIpv6Item+12, iIpv6Item+13, iIpv6Item+14, iIpv6Item+15);

+

+    memset(s_strIpv6Addr, 0, v6AddrLen);

+    for(i=0; i<=15; i++)

+    {

+		if(iIpv6Item[i] != 0)

+			flag++;

+        snprintf(s_strIpv6Addr+strlen(s_strIpv6Addr), v6AddrLen-strlen(s_strIpv6Addr), "%02x", iIpv6Item[i]);

+        if((i%2==1) && (i<15))

+        {

+            snprintf(s_strIpv6Addr+strlen(s_strIpv6Addr), v6AddrLen-strlen(s_strIpv6Addr), ":");

+        }

+    }

+	if(flag == 0){

+		memset(s_strIpv6Addr, 0, v6AddrLen);

+		at_print(AT_ERR,"IPV6 %s is ::\n", s_strIpv6Addr);

+	}

+    //at_print(AT_DEBUG,"IPV6 after change == %s\n", s_strIpv6Addr);

+}

+

+

+//×é³ÉzpdpactÏìÓ¦ATÉϱ¨£¬Èç¹ûÊǹ²ÏíµÄÔòÖ±½ÓÉϱ¨£¬·ñÔò´ý¼¤»îÍê³ÉºóÉϱ¨

+char * zpdpact_ind_build(struct pdp_active_info *info)

+{

+	char *p_ipdns = malloc(512);

+	char *at_str = NULL;

+	if(NULL == p_ipdns) {

+		softap_assert("");

+		return NULL;

+	}

+

+	memset(p_ipdns, 0x00, 512);

+	build_ipdns_param(p_ipdns, info);

+	at_str = at_query_result_build("ZPDPACT", p_ipdns);

+	free(p_ipdns);

+

+	if(NULL == at_str) softap_assert("");

+	at_print(AT_ERR,"zpdpact inform ipdns, at_str is  %s\n",at_str);

+	return at_str;

+} 

+

+int get_ppp_cid(int modid, int *p_pppcid)

+{

+	if(modid == MODULE_ID_PPPD)

+	{

+		int idx = get_idx_byidle(0,"");

+		if(idx < 0)

+			softap_assert("");

+

+		*p_pppcid = ppp_cid;

+	}

+	return 1;

+}

+

+void get_ppp_apn(struct pdp_act_req *p_setInfo)

+{

+	int idx = get_idx_bycid(p_setInfo->ppp_cid);

+	if(idx < 0)

+		return;

+	char ppp_pdp_type [8] = {0};

+	cfg_get_item("ppp_pdp_type", ppp_pdp_type, sizeof(ppp_pdp_type));

+	strncpy(p_setInfo->comm_info.apn, CID_ARRAY[idx].apn, sizeof(p_setInfo->comm_info.apn)-1);

+	if(strcmp(ppp_pdp_type,"IP") == 0 || strcmp(ppp_pdp_type,"IPV6") == 0 || strcmp(ppp_pdp_type,"IPV4V6") == 0)

+		strcpy(p_setInfo->comm_info.ip_type, ppp_pdp_type);

+	else

+		strcpy(p_setInfo->comm_info.ip_type, "IP");//Õë¶ÔÊ״請úÉϵçûÓÐÉèÖÃapnµÄÇé¿ö£¬¸øip_type¸³³õʼֵ

+}

+

+/*Éú³Épdp¼¤»îµÄatÃüÁmodemËùÔÚºËÖ±½ÓʹÓÃcgact¡¢·ÇmodemËùÔÚºËʹÓÃzpdpact;

+ÓÉÓÚµ±Ç°pdp¼¤»îÇëÇó´¦ÀíÁ÷³ÌÖУ¬Ê×ÏÈ·¢ËÍÁËcgact=0£¬cidÈ¥¼¤»î£¬Òò´Ë¶ÔÓÚCID_ARRAY[idx]µÄ״̬£¬

+±ØÐëÔÚpdp¼¤»îatÃüÁîÏ·¢Ê±£¬ÉèÖÃΪACTIVING£¬²ÅÄܱ£Ö¤pdp¼¤»î״̬ºÍCID_ARRAY״̬һÖÂ

+*/

+char * build_pdpact_cmd(PDP_PRIVATE_INFO *private_info,  struct pdp_act_req *p_setInfo)

+{

+	int idx = private_info->index;

+	char *at_str = NULL;

+

+#ifdef HAVE_MODEM_IN_CORE

+	int cid = private_info->c_id;

+	at_print(AT_ERR,"goto build cgact active cmd!!!!!!!!!!!!!!!!\n");

+	at_str = malloc(32);

+	if(at_str == NULL){

+		softap_assert("");

+		return NULL;

+	}

+	memset(at_str, 0, 32);

+	sprintf(at_str, "at+cgact=1,%d\r\n", cid);	

+#else	

+	int offset = 0;

+	at_print(AT_ERR,"goto build zpdpact cmd!!!!!!!!!!!!!!!!\n");

+	at_str = malloc(PDP_CMD_LEN);

+	if(at_str == NULL){softap_assert("");}

+	memset(at_str, 0, PDP_CMD_LEN);

+

+	offset += sprintf(at_str+offset,"AT+ZPDPACT=%d,\"%s\",\"%s\"",p_setInfo->ext_cid,p_setInfo->comm_info.ip_type, p_setInfo->comm_info.apn);

+	offset += sprintf(at_str+offset,",%d,%d,%d",p_setInfo->volte_param1,p_setInfo->volte_param2,p_setInfo->volte_param3);

+	offset += sprintf(at_str+offset,",%d,\"%s\",\"%s\"",p_setInfo->comm_info.auth_type, p_setInfo->comm_info.username, p_setInfo->comm_info.password);

+	offset += sprintf(at_str+offset,",\"%s\"",p_setInfo->comm_info.challenge);

+	offset += sprintf(at_str+offset,",%d",p_setInfo->ppp_cid);

+	offset += sprintf(at_str+offset,",%d\r\n",p_setInfo->default_flag);

+#endif

+

+	//¼Ç¼±¾´Îpdp¼¤»î״̬Ϊ¼¤»î

+	private_info->pdp_state = 1;

+	CID_ARRAY[idx].state = CID_ACTIVING;

+	return at_str;

+}

+

+//ÅäÖÃĬÈÏAPN£¬iptypeÒ²ÐèÒª¿¼ÂÇ

+void set_default_apn(const char *apn)

+{

+	memset(g_defcid_mng.default_apn, 0x00, sizeof(g_defcid_mng.default_apn));

+	strncpy(g_defcid_mng.default_apn, apn, sizeof(g_defcid_mng.default_apn)-1);

+	cfg_set("default_apn", g_defcid_mng.default_apn);

+	at_print(AT_ERR, "default apn is changed to %s\n", apn);

+}

+//¸ù¾Ýppp_statusÉèÖÃÏà¹Ø×´Ì¬£¬ÌáÈ¡³ÉÒ»¸ö½Ó¿ÚÉèÖ㬱ãÓÚͳһ¹ÜÀíMMI/WEBUIÏÔʾ״̬µÄ

+int set_pppstatus(char * ppp_status)

+{

+	int iConnectStatus = 0;

+	if(0 == strcmp(ppp_status, PPP_DISCONNECTED))

+	{

+		iConnectStatus = 0;

+	}

+	else if(0 == strcmp(ppp_status, PPP_CONNECTED))

+	{

+		iConnectStatus = 1;

+	}

+	else if(0 == strcmp(ppp_status, PPP_CONNECTING))

+	{

+		iConnectStatus = 2;

+	}

+	else if(0 == strcmp(ppp_status, PPP_DISCONNECTING))

+	{

+		iConnectStatus = 3;

+	}

+

+	cfg_set(NV_PPP_STATUS,ppp_status);

+	ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MMI,MSG_CMD_CHANNEL_CONNECT_STATUS, sizeof(iConnectStatus), (UCHAR *)&iConnectStatus,0);

+

+	return 0;

+}

+

+void pdp_reconnect_check()

+{

+	char auto_reconnect [20] = {0};

+	cfg_get_item("auto_reconnect", auto_reconnect, sizeof(auto_reconnect));

+	/*Ö»ÓÐÄ£¿éID²»ÊÇatͨµÀºÅ£¬²Å±íÃ÷ĬÈÏapn pdp¼¤»îiÇëÇóµÄ·¢Æð·½ÔÚ±¾ºË£¬¶ÔÓÚÍâºË·¢ÆðµÄ

+	ĬÈÏapnµÄ¼¤»îÇëÇó£¬ÓÉÍâºËµÄat_ctl¿ØÖÆÖØÁ¬²Ù×÷

+	*/

+	if((0 == check_is_fd(g_defcid_mng.modid)) && (0 == strcmp("1", auto_reconnect)))

+	{

+		//Æô¶¯¶¨Ê±Æ÷£¬·¢ÆðÖØÐ²¦ºÅ

+		at_timeout_start_pdpreconn_timer();

+	}

+	else

+	{

+		if(g_defcid_mng.set_info)

+		{

+			free(g_defcid_mng.set_info);

+			g_defcid_mng.set_info = NULL;

+		}

+		g_defcid_mng.modid = 0;

+	}

+}

+

+void send_zconstat_auto_report(int state,int cid)

+{

+#ifdef HAVE_MODEM_IN_CORE

+    char *at_str = malloc(PDP_CMD_LEN);

+    if(at_str == NULL){

+		return;

+	}

+    memset(at_str, 0, PDP_CMD_LEN);

+    //if(at_str == NULL){softap_assert("");}//klocwork

+    sprintf(at_str, "\r\n+ZCONSTAT: %d,%d\r\n", state, cid);

+    at_context_write_by_pos(FAR_PS, at_str);

+	free(at_str);

+#endif

+}

+

+#ifdef HAVE_MODEM_IN_CORE  //ÔÚ±¾ºËÖк¬ÓÐmodem

+//ÊÇ·ñÐèÒª¿¼ÂÇÇå³ýĬÈÏapn»úÖÆ

+/*int save_default_apn(int at_fd, char *at_paras, void **res_msg, int *res_msglen)

+{

+    char *at_str = NULL; 

+	char apn[APN_MAX_LEN] = {0};

+	char *p[1] = {apn};

+

+	if(strlen(at_paras) >= APN_MAX_LEN)

+	{

+		softap_assert("");

+	}

+	parse_param2("%s",at_paras, p);

+	set_default_apn(apn);

+

+    at_str = at_ok_build();

+	if(NULL == at_str) softap_assert("malloc failed for ok cmd");

+    *res_msg = at_str;

+    *res_msglen = strlen(at_str);   

+

+	return AT_END;

+}*/

+

+//zgact²éѯ£¬µ±Ç°Ö»Ö§³Ö²é·ÇÔ¤ÁôµÄcid״̬

+int zgact_query_func(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+    int i = 0;

+    char *at_str = malloc(PDP_CMD_LEN);

+    if(at_str == NULL){

+		softap_assert("");

+		return AT_END;

+	}

+    memset(at_str, 0, PDP_CMD_LEN);

+

+    for(;i<CID_MAX_NUM;i++)

+    {

+		if((cid_reserved&(1<<(i))) != 0)

+		{

+			if(g_pdpinfo_mng[i].fwd_info.cgact_ok && g_pdpinfo_mng[i].fwd_info.zgact_ok && g_pdpinfo_mng[i].pdpInfo)

+			{

+	            sprintf(at_str+strlen(at_str), "\r\n+ZGACT:%d,1\r\n", i+1);

+			}

+			else

+			{

+	            sprintf(at_str+strlen(at_str), "\r\n+ZGACT:%d,0\r\n", i+1);

+			}

+		}

+    }

+    strcpy(at_str+strlen(at_str), "\r\nOK\r\n");

+    *res_msg = at_str;

+    *res_msglen = strlen(at_str);

+    return AT_END;

+}

+

+#if 0

+//modemËùÔں˵Äslaac IPv6µØÖ·»ñÈ¡½á¹ûµÄÉϱ¨ÏûÏ¢

+char* v6addrind_act_func(void *msg,struct at_context *context)

+{

+	MSG_BUF *p_msg = (MSG_BUF*)msg;

+	V6ADDR_INFORM *info = (V6ADDR_INFORM *)p_msg->aucDataBuf;

+	int cid = info->cid;

+

+	//˵Ã÷¹ýÔÚipv6µ¥²¥µØÖ·Éϱ¨¹ý³ÌÖУ¬ÒѾ­·¢ÉúÁËÈ¥¼¤»î

+	if(0 == g_pdpinfo_mng[cid-1].is_acted)

+		return NULL;

+

+	if(info->result== 0)

+	{

+		at_print(AT_ERR,"slaac failed to get ipv6 addr!\n");

+		g_pdpinfo_mng[cid-1].slaac_v6_inform=V6ADDR_GET_FAILED;

+	}

+	else

+	{

+		at_print(AT_ERR,"v6addrind_act_func: slaac success to get ipv6 addr : %s!\n", info->v6_addr);

+		save_unicast_ip6addr(cid, info->v6_addr);

+		g_pdpinfo_mng[cid-1].slaac_v6_inform=V6ADDR_GET_SUCCESS;

+	}

+

+	return NULL;

+

+}

+#endif

+

+extern int check_linkup_state(int cid);

+//zte_mainctrl½Å±¾Ö´ÐÐÍê³É

+char* linkup_act_func(void *msg,struct at_context *context)

+{

+	MSG_BUF *p_msg = (MSG_BUF*)msg;

+	TScriptMSG *scriptmsg = (TScriptMSG*)p_msg->aucDataBuf;

+	int cid = scriptmsg->cid;

+	if(cid >0 && cid <= CID_MAX_NUM)

+	{

+

+		if(g_pdpinfo_mng[cid-1].ipflag_down == g_pdpinfo_mng[cid-1].linkdown_state)

+			g_pdpinfo_mng[cid-1].linkup_state |= scriptmsg->iptype;

+		at_print(AT_ERR,"$$$$$linkup_act_func: iptype=%d, linkup_state=%d!\n",scriptmsg->iptype, g_pdpinfo_mng[cid-1].linkup_state);

+		CID_ARRAY[cid-1].ref = 0;

+		if(check_linkup_state(cid) == AT_END){

+			ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_AT_CTL, ATCTL_DELAY_TIMEOUT_MSG, 0, NULL, IPC_NOWAIT);

+		}

+	}

+	return NULL;

+}

+

+char* linkdown_act_func(void *msg,struct at_context *context)

+{

+	MSG_BUF *p_msg = (MSG_BUF*)msg;

+	TScriptMSG *scriptmsg = (TScriptMSG*)p_msg->aucDataBuf;

+	int cid = scriptmsg->cid;

+	if(cid >0 && cid <= CID_MAX_NUM)

+	{

+		g_pdpinfo_mng[cid-1].linkdown_state |= scriptmsg->iptype;

+		g_pdpinfo_mng[cid-1].linkup_state = V4V6_INVALID;

+		at_print(AT_ERR,"$$$$$linkdown_act_func: iptype=%d, linkdown_state=%d!\n",scriptmsg->iptype, g_pdpinfo_mng[cid-1].linkdown_state);

+	}

+	return NULL;	

+}

+

+

+#endif

+

+int check_linkup_state(int cid)

+{

+	//ÉÏ´ÎÈ¥¼¤»îÁ÷³Ì»¹Î´×ßÍê

+	if(g_pdpinfo_mng[cid-1].ipflag_down != g_pdpinfo_mng[cid-1].linkdown_state)

+	{

+		return AT_WAIT_AUTO;

+	}

+	//Èôµ±Ç°ÕýÔÚÖ´Ðнű¾£¬Ôò¼ÌÐøµÈ´ý

+	//if(g_pdpinfo_mng[cid-1].ipflag != g_pdpinfo_mng[cid-1].linkup_state)

+	if((g_pdpinfo_mng[cid-1].ipflag & g_pdpinfo_mng[cid-1].linkup_state) != g_pdpinfo_mng[cid-1].ipflag)

+	{

+		return AT_WAIT_AUTO;

+	}

+	//Èç¹ûnet½Å±¾Ö´ÐÐÍê³É£¬ÔòÖ±½ÓÏòPDP¼¤»î·¢ÆðÔ´Éϱ¨¼¤»îʧ°ÜÏûÏ¢

+	else

+	{

+		return AT_END;

+	}	

+}

+

+int check_linkdown_state(int cid)

+{

+	//Èôµ±Ç°ÕýÔÚÖ´Ðнű¾£¬Ôò¼ÌÐøµÈ´ý

+	if(g_pdpinfo_mng[cid-1].ipflag_down != g_pdpinfo_mng[cid-1].linkdown_state)

+	{

+		return AT_WAIT_AUTO;

+	}

+	//Èç¹ûnet½Å±¾Ö´ÐÐÍê³É£¬ÔòÖ±½ÓÏòPDP¼¤»î·¢ÆðÔ´Éϱ¨¼¤»îʧ°ÜÏûÏ¢

+	else

+	{

+		return AT_END;

+	}	

+}

+

+

+char *get_appointed_chr(char *at_str, char ch, int times)

+{

+    int i_times = 0;

+    char *pstrCur = at_str;

+    for(;*pstrCur != '\0';pstrCur++)

+    {

+        if(i_times < times)

+        {

+            pstrCur = strchr(pstrCur, ch);

+            if(pstrCur == NULL)

+                break;

+            i_times++;

+        }

+        else

+            break;

+    }

+    if(i_times < times)

+        return NULL;

+    else

+        return pstrCur;

+}

+

+//cgev´¦Àí£¬¼à¿Øµ±Ç°¸÷CIDµÄ¼¤»î״̬£¬È¥¼¤»îʱ¶Ï¿ªÍø¿Ú£¬Çå³ý¼¤»î״̬£¬Í¨ÖªBL£¬ºóÐøÐèÔö¼ÓרÓóÐÔØÖ§³Ö

+int cgev_auto_act(char *at_paras ,int is_query_report)

+{

+    int c_id = 0;

+    char *strtemp = NULL;

+    if(strstr(at_paras, "PDN ACT") != NULL)

+    {

+		strtemp = get_appointed_chr(at_paras, ' ', 3);

+		if(strtemp == NULL)

+			return AT_END;

+		c_id = atoi(strtemp);

+		if(c_id <= 0 || c_id > CID_MAX_NUM)

+			return AT_END;

+		g_pdpinfo_mng[c_id-1].cgev_inform = 1;

+

+    }

+    else if(strstr(at_paras, "PDN DEACT") != NULL)

+    {

+    	int idx = 0;

+		int is_normal_cid = 0;

+		strtemp = get_appointed_chr(at_paras, ' ', 3);

+		if(strtemp == NULL)

+			return AT_END;

+		c_id = atoi(strtemp);

+		syscall(__NR_set_pdp_state,(unsigned char)c_id, 0);

+		if(c_id <= 0 || c_id > CID_MAX_NUM)

+			return AT_END;

+		g_pdpinfo_mng[c_id-1].cgev_inform = 0;

+

+        pdpinfo_reset(c_id);

+

+		/*1¡¢·Ç±¾ºË·¢ÆðµÄpdp¼¤»î£¬²»Óô¦Àí

+		*/

+		idx = get_idx_bycid(c_id);

+

+		if(idx < 0)

+			return AT_END;

+

+		/*

+			CID_IDLE:		1¡¢Ä¬ÈϳÐÔØÃ»ÓÐÓ¦Ó÷¢Æðpdp¼¤»î£¬Òò´Ë²»Óô¦Àí£»2¡¢±¾ºË·¢ÆðµÄpdpÈ¥¼¤»î£¬ok±ÈcgevÏÈÉϱ¨£¬pdpÈ¥¼¤»îÁ÷³ÌÒѾ­Íê³É

+			CID_ACTIVING:	µ±Ç°ÕýÔÚ¼¤»î£¬ÉèÖóÉIDLE״̬£¬ÓÃÓÚcgact ok´¦Àíº¯ÊýÖÐÅжϣ¬ÔڵȴýipdnsµÄ¹ý³ÌÖУ¬ÒѾ­ÒѾ­·¢Éú¹ýÈ¥¼¤»î

+			CID_DEACTIVING:	µ±Ç°ÕýÔÚÈ¥¼¤»î£¬´ËÊ±Íø²àÖ÷¶¯È¥¼¤»îµÄ¿ÉÄÜÐÔ¼¸ºõΪ0£¬ºöÂÔ²»¿¼ÂÇ£¬¿ÉÒÔÈÏΪÊÇÓÉÓÚÖ÷¶¯·¢ÆðPDP¼¤»îÒýÆðµÄÉϱ¨

+			CID_ACTIVE:		±íÃ÷µ±Ç°CGEVÊÇÍø²àÖ÷¶¯È¥¼¤»î£¬»òÕßat+cfun²Ù×÷µ¼ÖµÄ

+		*/

+		if(CID_ARRAY[idx].state == CID_ACTIVE)

+		{

+			CID_ARRAY[idx].state = CID_IDLE;

+			//CID_ARRAY[idx].ref = 0;

+

+			if(c_id == ppp_cid)

+			{

+				//Çå³ýppp¼¤»îÐÅÏ¢

+				ppp_cid = 0;

+				cfg_set("ppp_cid","");

+				/*¶ÔÓÚÍø²àÖ÷¶¯È¥¼¤»î£¬ÉèÖÃpppµÄpdp¼¤»î״̬£¬Í¨Öªppp·¢Æðlcp terminateÇëÇó£¬Ð­ÉÌÍê³Éºó£¬

+				֪ͨat_ctl·¢Æðppp¿ìËÙ¶Ï¿ªÁ¬½Ó*/

+				cfg_set("ppp_pdpstate", "dead");

+			}

+			else if(g_defcid_mng.cid == c_id)

+			{

+				at_timeout_reset_pdpreconn_time();

+				pdp_reconnect_check();

+				g_defcid_mng.cid = 0;

+				g_defcid_mng.activing_cid = 0;

+				set_pppstatus(PPP_DISCONNECTED);

+			}		

+#ifdef _USE_BL

+			//ÓÉÓÚBLÐèÒª´¥·¢À©Õ¹at¸øAP,½øÐÐpdpÈ¥¼¤»î£¬Èç¹ûbl·¢ÆðµÄpdpÈ¥¼¤»î£¬Ò²Éϱ¨¸ÃÏûÏ¢µÄ»°

+			//BLÊÕµ½¸ÃÏûÏ¢µÄ´¦ÀíÁ÷³ÌÖУ¬»á½«¼Ç¼µÄcidÇå¿Õ£¬µ¼Ö´¥·¢À©Õ¹atʱ£¬À©Õ¹atËùЯ´øµÄcidΪ0

+			ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_BL, MSG_CMD_PDP_DEACT_IND, sizeof(int), &c_id, 0);

+#endif

+//#ifdef GUODIAN

+            if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN)

+            {

+    			//¹úµç±ê×¼ÒªÇóPDPÈ¥¼¤»îʱÖ÷¶¯Éϱ¨

+    			send_cgev_deact_info(c_id);

+            }

+//#endif

+		}

+		else if(CID_ARRAY[idx].state == CID_ACTIVING)

+		{

+			//µ±Ç°ÕýÔÚ¼¤»î£¬ÉèÖóÉIDLE״̬£¬ÓÃÓÚcgact ok´¦Àíº¯ÊýÖÐÅжϣ¬ÔڵȴýipdnsµÄ¹ý³ÌÖУ¬ÒѾ­ÒѾ­·¢Éú¹ýÈ¥¼¤»î

+			CID_ARRAY[idx].state = CID_IDLE;

+		}

+		CID_ARRAY[idx].ref = 0;//¼¤»î¹ý³ÌÖÐÊÕµ½È¥¼¤»îÖ÷¶¯Éϱ¨±£»¤

+    }

+	else if(strstr(at_paras, "DEACT") != NULL)

+	{

+		//¶þ´ÎרÓóÐÔØÈ¥¼¤»îºó£¬½«¶þ´ÎcidµÄÐÅÏ¢Çå³ý

+		int p_cid = 0, cid = 0, event_type = -1;

+		strtemp = get_appointed_chr(at_paras, ' ', 2);

+		if(strtemp == NULL)

+			return AT_END;

+		void *p[3] = {&p_cid, &cid,&event_type};

+    	at_print(AT_DEBUG,"creg_auto_act strtemp = %s, p_cid = %d, cid = %d!\n",strtemp, p_cid, cid);

+    	parse_param2("%d,%d,%d", strtemp, p);

+		syscall(__NR_set_pdp_state,(unsigned char)c_id, 0);

+		if(cid > 0 && cid <= CID_MAX_NUM && g_pdpinfo_mng[cid-1].pdpInfo != NULL)

+        {

+			int idx = 0;

+			pdpinfo_reset(cid);

+			idx = get_idx_bycid(cid);

+			if(idx >= 0 && idx < CID_MAX_NUM)

+			{

+				CID_ARRAY[idx].state = CID_IDLE;

+				CID_ARRAY[idx].ref = 0;//¼¤»î¹ý³ÌÖÐÊÕµ½È¥¼¤»îÖ÷¶¯Éϱ¨±£»¤

+			}

+        }

+	}

+    return AT_END;

+}

+//²¦ºÅʧ°Ü´¦Àí£¬ÔÚ²¦ºÅµÄ¸÷»·½ÚÖÐÊÕµ½±¨´í£¬Çå³ýËùÓеÄ״̬ÐÅÏ¢£¬ÏûÏ¢·µ»Ø´íÎóÏûÏ¢£¬Í¨µÀ·µ»Øerror

+void pdpact_failed_proc(char * at_paras, struct at_context *context, int idx, void **next_req, int * next_len)

+{

+    PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+

+	at_print(AT_ERR, "pdpact_failed_proc: source is %x, idx is %d, pdp_type is %d\n", context->source, idx, private_info->pdp_type);

+

+    if(idx < 0 || idx >= CID_MAX_NUM)

+    {

+		at_print(AT_ERR, "idx (%d) out of[0, CID_MAX_NUM)\n", idx);

+		return ;

+    }

+	//pdp¼¤»îʧ°Üºó£¬½«cid×ÊÔ´ÉèÖÃΪ¿ÕÏÐ״̬

+	CID_ARRAY[idx].state = CID_IDLE;

+

+	/*//Êͷű£´æµÄpdp¼¤»îÐÅÏ¢

+	if(private_info->pdpActInfo)

+	{

+		free(private_info->pdpActInfo);

+		private_info->pdpActInfo = NULL;

+	}*/

+	if(g_defcid_mng.activing_cid == idx + 1)

+	{

+		g_defcid_mng.activing_cid = 0;

+	}

+	if(private_info->pdp_type == PDP_NORMAL)

+	{		

+		if(0 == check_is_fd(context->source))

+		{

+			set_pppstatus(PPP_DISCONNECTED);

+		}

+		/*PDP²¦ºÅʧ°Üºó£¬¸ù¾Ýpdp¼¤»îµÄÇëÇóÄ£¿éÒÔ¼°auto_reconnectµÄnvÖµ£¬È·¶¨ÊÇ·ñÖØÐ·¢Æð²¦ºÅ

+		*/

+		pdp_reconnect_check();

+	}

+	{

+

+		AT_PDP_ACT_RSP_INFO *rsp = malloc(sizeof(AT_PDP_ACT_RSP_INFO));

+		if(rsp == NULL)

+			return;

+		memset(rsp, 0x00, sizeof(AT_PDP_ACT_RSP_INFO));

+		rsp->result = AT_RSP_ERR;

+		if(at_paras)

+		{

+			rsp->errcode = atoi(at_paras);

+		}

+		*next_req = rsp;

+		*next_len = sizeof(AT_PDP_ACT_RSP_INFO);

+	}	

+

+}

+void pdpact_success_proc(int cid, int pdp_type, struct at_context* context, void **next_req, int *next_len)

+//void pdpact_success_proc(int cid, int pdp_type, struct at_context* context)

+{

+	int idx = get_idx_bycid(cid);

+

+	at_print(AT_ERR, "pdpact_succes_proc: source is %x, idx is %d, cid is %d, pdp_type is %d\n", context->source, idx, cid, pdp_type);

+	if(idx < 0)

+		return;

+	CID_ARRAY[idx].state = CID_ACTIVE;

+

+	/*Ϊ¼Ó¿ìmodem¿ª»úÁªÍøÊ±¼ä£¬ÔÚpdp¼¤»î֮ǰ£¬²»³õʼ»¯smsºÍpbÓ¦Óã¬pdp¼¤»î³É¹¦ºóÖ±½Ó·¢ÏûÏ¢

+	¸øsmsºÍpbÓ¦ÓÃ֪ͨ½øÐгõʼ»¯£¬²¢ÇÒɾ³ý¶¨Ê±Æ÷*/

+	at_print(AT_NORMAL,"3.sms_pb init flag: %d\n", g_smspb_init);

+	pbsms_init_msg_proc(); 

+	//ÉèÖÃpdp_normal¼¤»îÀàÐ͵Äcid£¬ÔÚap²àÓÃÓÚwebui¶Ï¿ªÁ¬½ÓʱʹÓã¬ÔÚcp²àÓÃÓÚ·ÓÉÑ¡Ôñ£¬¼´¸Ãcid¼¤»îµÄÍø¿Úµ±×öĬÈÏ·ÓÉ

+	if(pdp_type == PDP_NORMAL)

+	{

+		if(0 == g_defcid_mng.cid)

+		{

+			g_defcid_mng.cid = CID_ARRAY[idx].c_id;

+		}

+		else

+		{

+			//¶ÔÓÚpdp_normalÀàÐÍpdp¼¤»î£¬Ò»¸öcpuºËÄÚ½öÔÊÐíÒ»¸öapn·¢Æð£¬pdp_normalµÄµ±Ç°×÷ÓÃ

+			//ΪÉèÖÃĬÈÏ·ÓɺÍnatת»»£¬²»ÔÊÐí³öÏÖ¶à¸öpdp_normal,·ñÔò»áÒýÆðĬÈÏ·ÓÉ»ìÂÒ

+            if(g_defcid_mng.cid != CID_ARRAY[idx].c_id){softap_assert("");}

+		}

+		//½«×Ô¶¯Öز¥auto_reconnectÉèÖÃΪ1£¬µ±Íø²àÖ÷¶¯È¥¼¤»îʱ£¬×Ô¶¯pdpÖØ²¥

+		//if(context->source > 0)

+		if(0 == check_is_fd(context->source))

+		{

+			set_pppstatus(PPP_CONNECTED);

+			cfg_set("auto_reconnect", "1");

+		}

+	}

+	else if(pdp_type == PDP_PPP)

+	{

+		//±£´æpppÓ¦ÓÃʹÓõÄcid£¬ÓÃÓÚcgevÉϱ¨µÄ´¦Àí

+		if(is_ppp_running()){

+		char temp[2] = {0};

+		ppp_cid = CID_ARRAY[idx].c_id;

+		snprintf(temp,2, "%d", ppp_cid);

+		cfg_set("ppp_cid",temp);

+		if(g_customer_type) //ÁªÇ¿°æ±¾ÌØÊâ¶¨ÖÆ£¬ppp²¦ºÅ³É¹¦ºóÐèҪ֪ͨmmi

+			set_pppstatus(PPP_CONNECTED);

+		}else

+			pdpinfo_reset(CID_ARRAY[idx].c_id);

+	}

+

+	{

+		AT_PDP_ACT_RSP_INFO *rsp = malloc(sizeof(AT_PDP_ACT_RSP_INFO));

+		if(rsp == NULL){

+			softap_assert("malloc failed");

+			return;

+		}

+		rsp->result = AT_RSP_OK;

+		rsp->cid = cid;

+		*next_req = rsp;

+		*next_len = sizeof(AT_PDP_ACT_RSP_INFO);

+

+	}	

+

+}

+

+void pdpdeact_success_proc(int cid, struct at_context* context, void ** next_req, int *next_len)

+{

+	int idx = get_idx_bycid(cid);

+	if(idx < 0)

+		return;

+	CID_ARRAY[idx].state = CID_IDLE;

+

+    at_print(AT_ERR,"pdpdeact_success_proc:context->source = %x, cid is %d\n",context->source, cid);

+

+	//pdpÈ¥¼¤»îÖ®ºó£¬Çå¿Õpdp_normalÀàÐ͵Äcid

+	if(cid == g_defcid_mng.cid)

+	{

+		if(0 == check_is_fd(context->source))

+		{

+			set_pppstatus(PPP_DISCONNECTED);

+		}

+		g_defcid_mng.cid = 0;

+		g_defcid_mng.activing_cid = 0;

+	}

+

+	{

+		AT_PDP_DEACT_RSP_INFO *rsp = malloc(sizeof(AT_PDP_DEACT_RSP_INFO));

+		if(rsp == NULL)

+			return;

+		rsp->result = AT_RSP_OK;

+		*next_req = rsp;

+		*next_len = sizeof(AT_PDP_DEACT_RSP_INFO);

+	}

+

+}

+

+//¼¤»îµÄ×îÖÕ´¦Àíº¯Êý£¬»áµ÷ÓÃÍøÂçµÄ¼¤»î½Ó¿Úpdp_act_proc

+void pdp_act_proc_for_module(struct pdp_active_info *p_pdpInfo, int pdp_type)

+{

+    int iResult = 0;

+    int c_id = p_pdpInfo->c_id;

+    p_pdpInfo->pdp_type = pdp_type;

+

+	if(g_pdpinfo_mng[c_id-1].is_acted)

+	{

+		return;

+	}

+    at_print(AT_ERR,"pdp_type == %d\n", p_pdpInfo->pdp_type);

+    at_print(AT_ERR, "c_id == %d\n", p_pdpInfo->c_id);

+    at_print(AT_ERR, "pdp_type == %d\n", p_pdpInfo->pdp_type);

+    at_print(AT_ERR, "ip46flag == %d\n", p_pdpInfo->act_info.ip46flag);

+    at_print(AT_ERR, "ip == %s\n", p_pdpInfo->act_info.ip);

+    at_print(AT_ERR, "gateway == %s\n", p_pdpInfo->act_info.gateway);

+    at_print(AT_ERR, "pri_dns == %s\n", p_pdpInfo->act_info.pri_dns);

+    at_print(AT_ERR, "sec_dns == %s\n", p_pdpInfo->act_info.sec_dns);

+    at_print(AT_ERR, "ip6 == %s\n", p_pdpInfo->act_info.ip6);

+    at_print(AT_ERR, "gateway6 == %s\n", p_pdpInfo->act_info.gateway6);

+    at_print(AT_ERR, "pri_dns6 == %s\n", p_pdpInfo->act_info.pri_dns6);

+    at_print(AT_ERR, "sec_dns6 == %s\n", p_pdpInfo->act_info.sec_dns6);

+    iResult = pdp_act_proc(p_pdpInfo,MODULE_ID_AT_CTL);

+	g_pdpinfo_mng[c_id-1].is_acted = 1;

+    if(iResult == 0)

+    {

+		CID_ARRAY[c_id-1].ref = 1;

+		at_print(AT_ERR,"Call pdp_act_proc success!!\n");

+		if(p_pdpInfo->act_info.ip46flag == V4_VALID){

+			syscall(__NR_set_pdp_state,(unsigned char)c_id, 4);

+		}

+    }

+    else

+        at_print(AT_ERR,"Call pdp_act_proc failed!!\n");

+}

+

+//È¥¼¤»îµÄ×îÖÕ´¦Àíº¯Êý£¬»áµ÷ÓÃÍøÂçµÄÈ¥¼¤»î½Ó¿Úpdp_deact_proc

+void pdp_deact_proc_for_module(struct pdp_active_info *p_pdpInfo)

+{

+    int iResult = 0;

+	int c_id = p_pdpInfo->c_id;

+	if(g_pdpinfo_mng[c_id-1].is_acted !=0 )

+	{

+		at_print(AT_ERR,"begin call pdp_deact_proc_for_module, cid is %d\n",c_id);

+		g_pdpinfo_mng[c_id-1].linkdown_state = V4V6_INVALID;

+		g_pdpinfo_mng[c_id-1].ipflag_down = g_pdpinfo_mng[c_id-1].pdpInfo->act_info.ip46flag;

+		iResult = pdp_deact_proc(p_pdpInfo->c_id, p_pdpInfo->act_info.ip46flag, MODULE_ID_AT_CTL);

+	}

+	g_pdpinfo_mng[c_id-1].is_acted = 0;

+    if(iResult == 0)

+        at_print(AT_ERR,"Call pdp_deact_proc success!!\n");

+    else

+        at_print(AT_ERR,"Call pdp_deact_proc failed!!\n");

+}

+

+int fwd_pdpact_proc(int cid)

+{

+	FWD_PDP_INFO *p_fwd_info = &g_pdpinfo_mng[cid -1].fwd_info;

+	struct pdp_active_info *pdpInfo = g_pdpinfo_mng[cid -1].pdpInfo;

+

+	if(0 == (cid_reserved&(1<<(cid-1))))

+	{

+		softap_assert("");

+		return -1;

+	}

+

+	if(p_fwd_info->cgact_ok && p_fwd_info->zgact_ok && pdpInfo)

+	{

+		char LanEnable[CID_LEN_MAX] = {0};

+		cfg_get_item("LanEnable", LanEnable, sizeof(LanEnable));

+        if(atoi(LanEnable) == 1)

+            pdp_act_proc_for_module(pdpInfo, PDP_NORMAL);

+        else

+            pdp_act_proc_for_module(pdpInfo, PDP_EXT);

+		if(g_pdpinfo_mng[cid-1].fwd_info.zconstat_flag == 0)

+		{

+			send_zconstat_auto_report(1, cid);

+			g_pdpinfo_mng[cid-1].fwd_info.zconstat_flag = 1;

+		}

+		return 0;

+	}

+	return -1;

+

+}

+

+

+//cgactת·¢´¦Àí£¬ÈçÈë²Î´íÎóÖ±½Ó±¨´í£¬±¨´íÐÅÏ¢´ý¸üÐÂ

+int cgact_req_rcv_act(char *at_paras,int at_fd,struct at_context *context)

+{

+    char* err_str = NULL;

+    at_print(AT_DEBUG, "at_str = %s\n", at_paras);

+

+    int iState = 0, c_id = 0;

+    E_AT_PARSE eParseResult = AT_PARSE_SUCCESS;

+

+    eParseResult = get_at_cmd_param_int(at_paras, &iState, &at_paras);

+    at_print(AT_DEBUG, "state == %d\n", iState);

+    if(AT_PARSE_SUCCESS != eParseResult)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    eParseResult = move_to_next_param(at_paras, &at_paras);

+    if(AT_PARSE_SUCCESS != eParseResult)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    eParseResult = get_at_cmd_param_int(at_paras, &c_id, &at_paras);

+    at_print(AT_DEBUG, "cid == %d\n", c_id);

+    if(AT_PARSE_SUCCESS != eParseResult)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    if(!is_at_cmd_end(skip_at_cmd_head_blanks(at_paras)))

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    if (c_id <= 0 || c_id > CID_MAX_NUM)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    if ((cid_reserved & (1<<(c_id-1)))==0)

+    {

+        err_str = at_err_build(ATERR_NOT_ALLOWED);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    context->app_param = (void*)malloc(CID_LEN_MAX+1);

+    if(context->app_param == NULL){

+		softap_assert("");

+        return AT_END;

+	}

+	memset(context->app_param, 0, CID_LEN_MAX+1);//±£´æcidÖµ

+	snprintf(context->app_param,CID_LEN_MAX+1, "%d,%d", iState,c_id);

+

+    return AT_CONTINUE;

+}

+

+//zgactת·¢´¦Àí£¬ÈçÈë²Î´íÎó»òCPδÏÈ·¢cgcat¼¤»îÖ±½Ó±¨´í

+//Èç¹ûÊÇ·¢Æð²¦ºÅ£¬AP²àת·¢(ÆðÍø¿Ú¶¯×÷ÔÚcgactOKÏìÓ¦Àï´¦Àí£¬Ô¤ÁôÔÚzgactokת·¢Àï´¦Àí)£¬CPÖ±½Ó´¦Àí²¢·µ»Ø

+int zgact_req_rcv_act(char *at_paras,int at_fd,struct at_context *context)

+{

+    char* err_str = NULL;

+    at_print(AT_DEBUG, "at_str = %s \n", at_paras);

+

+    int iState = 0, c_id = 0;

+    E_AT_PARSE eParseResult = AT_PARSE_SUCCESS;

+

+    eParseResult = get_at_cmd_param_int(at_paras, &iState, &at_paras);

+    at_print(AT_DEBUG, "state == %d\n", iState);

+    if(AT_PARSE_SUCCESS != eParseResult)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    eParseResult = move_to_next_param(at_paras, &at_paras);

+    if(AT_PARSE_SUCCESS != eParseResult)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    eParseResult = get_at_cmd_param_int(at_paras, &c_id, &at_paras);

+    at_print(AT_DEBUG, "cid == %d\n", c_id);

+    if(AT_PARSE_SUCCESS != eParseResult)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    if(!is_at_cmd_end(skip_at_cmd_head_blanks(at_paras)))

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    if (c_id <= 0 || c_id > CID_MAX_NUM)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    if ((cid_reserved & (1<<(c_id-1)))==0)

+    {

+        err_str = at_err_build(ATERR_NOT_ALLOWED);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+#ifdef HAVE_MODEM_IN_CORE

+    if(iState == 1)

+    {

+        //¶ÔÓÚPDP¼¤»î£¬Ö±½Ó»Ø¸´OK£¬¶ÔÓÚPDPÈ¥¼¤»î£¬ÔòÐèÒªµ÷ÓÃpdpÈ¥¼¤»î½Ó¿Ú

+        int idx = get_idx_bycid(c_id);

+		if(idx < 0)

+			return AT_END;

+        if(g_pdpinfo_mng[c_id-1].fwd_info.cgact_ok != 1 || g_pdpinfo_mng[c_id-1].fwd_info.zgact_ok == 1 || CID_ARRAY[idx].state != CID_IDLE)

+        {           

+            err_str = at_err_build(ATERR_PROC_FAILED);

+            at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+            free(err_str);

+            return AT_END;

+        }

+        g_pdpinfo_mng[c_id-1].fwd_info.zgact_ok = 1;

+		fwd_pdpact_proc(c_id);

+        at_write(context->at_channel->at_fd, "\r\nOK\r\n", strlen("\r\nOK\r\n"));

+        return AT_END;

+    }

+#endif 

+    context->app_param = (void*)malloc(CID_LEN_MAX+1);

+    if(context->app_param == NULL){

+		softap_assert("");

+        return AT_END;

+	}

+	memset(context->app_param, 0, CID_LEN_MAX+1);//±£´æcidÖµ

+	snprintf(context->app_param, CID_LEN_MAX+1,"%d,%d", iState,c_id);

+    return AT_CONTINUE;

+}

+

+int get_pdptype(struct pdp_act_req *p_setInfo)

+{

+	int pdp_type = PDP_LOCAL;

+	memset(g_defcid_mng.default_apn, 0x00, sizeof(g_defcid_mng.default_apn));

+	cfg_get_item("default_apn", g_defcid_mng.default_apn, sizeof(g_defcid_mng.default_apn));

+	//¶ÔÓÚppp²¦ºÅ£¬²ÉÓÃpppµÄ×éÍø·½Ê½

+	//if(modid == MODULE_ID_PPPD)

+	if(p_setInfo->ppp_cid)

+	{

+		pdp_type = PDP_PPP;

+

+	}	

+	else if(p_setInfo->ext_cid)

+	{

+		pdp_type = PDP_EXT;

+	}

+//zhangfen for PDP

+#if 0	

+	//µ±Ç°½öÔÊÐíwebui¡¢blºÍat_ctl·¢Æðnormal×éÍø·½Ê½£¬ÇÒÿ´Î²¦ºÅǰ¶¼½«Ä¬ÈÏapnͬ²½µ½ÆäËûcpuºË

+    else if(modid == MODULE_ID_WEB_CGI || modid == MODULE_ID_BL || modid == MODULE_ID_AT_CTL)

+	{

+		pdp_type = PDP_NORMAL;

+        set_default_apn(p_setInfo->comm_info.apn);

+	}

+	else 

+	{

+		if(0 == strcmp(p_setInfo->comm_info.apn, g_defcid_mng.default_apn))

+		{

+			pdp_type = PDP_NORMAL;

+		}

+	}

+#endif	

+	else if(0 == strcmp(p_setInfo->comm_info.apn, g_defcid_mng.default_apn))

+	{

+		pdp_type = PDP_NORMAL;

+	}

+	else

+	{

+		pdp_type = PDP_LOCAL;

+	}

+/*#if (APP_OS_TYPE == APP_OS_TOS)

+	if(p_setInfo->comm_info.auth_type != NONE_AUTH)

+	{

+		//Ϊtos¶¨ÖÆ£¬ÓÉÓÚµ±Ç°pdp_type¸ù¾Ýapn»ñÈ¡£¬Ò»µ©ppp²¦ºÅʹÓõÄapn£¬ºÍĬÈÏapnÒ»Ö£¬Ôòtos»á´æÔÚ¶à¸ö

+		//ĬÈÏ·ÓÉ£¬µ¼Ö·ÓÉ»ìÂÒ£¬Òò´Ëµ±´æÔÚÈÏ֤ʱ£¬Ö±½Ó½«pdp¼¤»îÀàÐÍ£¬ÉèÖÃΪPDP_LOCAL

+			pdp_type = PDP_EXT;

+	}

+#endif*/

+	return pdp_type;

+

+}

+

+int get_idx(struct pdp_act_req *p_setInfo, int *is_setapn)

+{

+	int idx = 0;

+	char versionmode[2] = {0};

+	cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+

+	//¶ÔÓÚppp²¦ºÅ»òÕßÍⲿMCUÖ¸¶¨cid pdp²¦ºÅ£¬Æäcid±ØÐëʱԤÁôcid£¬²»²ÎÓëapn¹²Ïí¹¦ÄÜ

+	if(p_setInfo->ppp_cid != 0 || p_setInfo->ext_cid != 0)

+	{

+#ifdef HAVE_MODEM_IN_CORE

+		if(p_setInfo->ppp_cid)

+		{

+			idx = get_idx_bycid(p_setInfo->ppp_cid);//ÔÚcp²à£¬»ñÈ¡ppp²¦ºÅÖ¸¶¨cidµÄidxÖµ

+			get_ppp_apn(p_setInfo);

+		}

+		else

+		{

+			idx = get_idx_bycid(p_setInfo->ext_cid);//ÔÚcp²à£¬»ñÈ¡ext²¦ºÅÖ¸¶¨cidµÄidxÖµ

+		}

+		if(idx < 0)

+			return -1;

+		if(CID_ARRAY[idx].reserved == 0)//|| CID_ARRAY[idx].state != CID_IDLE)

+			softap_assert("");//ÓÉÓÚppp²¦ºÅʹÓõÄcid±ØÐëÊÇÔ¤Áôcid£¬Òò´ËÈç¹û¸Ãidx²»ÊÇÔ¤Áôcid£¬Ö÷¶¯¶ÏÑÔ

+#else

+		idx = get_idx_byidle(p_setInfo->default_flag,p_setInfo->comm_info.apn);//ÔÚap²àÖ»Òª»ñÈ¡¸ö¿ÕÏеÄidx¼´¿É

+#endif

+		if(is_setapn)

+			*is_setapn = 1;

+		return idx;

+	}

+

+

+	//¶ÔÓÚ·ÇÈÏÖ¤µÄpdp¼¤»î£¬´Ëʱapn¿ÉÒÔ¹²Ïí£¬Òò´ËÊ×Ïȸù¾Ýapn¡¢ip_type²éÕÒÊÇ·ñÒѾ­´æÔÚÏàͬapnºÍip_typeµÄcid×ÊÔ´

+	if(p_setInfo->comm_info.auth_type == NONE_AUTH)

+	{

+		idx = get_idx_byapn(p_setInfo->comm_info.apn, p_setInfo->comm_info.ip_type, is_setapn, p_setInfo->default_flag);

+	}

+	else

+	{

+		idx = get_idx_byidle(p_setInfo->default_flag,p_setInfo->comm_info.apn);

+		if(is_setapn)

+			*is_setapn = 1;

+	}

+	return idx;

+}

+

+/*void set_pdp_act_info(AT_PDP_ACT_REQ_INFO  *srcInfo, struct pdp_act_req* dstInfo)

+{

+	strncpy(dstInfo->ip_type, srcInfo->ip_type, sizeof(dstInfo->ip_type)-1);

+	strncpy(dstInfo->apn, srcInfo->apn, sizeof(dstInfo->ip_type)-1);

+	strncpy(dstInfo->username, srcInfo->username, sizeof(dstInfo->username)-1);

+	strncpy(dstInfo->password, srcInfo->password, sizeof(dstInfo->password)-1);

+	strncpy(dstInfo->challenge, srcInfo->challenge, sizeof(dstInfo->challenge)-1);

+	dstInfo->auth_type = srcInfo->auth_type;

+}*/

+

+/*¼¤»îµÄÖ÷´¦Àíº¯Êý

+¸ù¾Ýapn¡¢ip_type¡¢ÈÏÖ¤¼ÓÃÜÐÅÏ¢µÃµ½cid×ÊÔ´Êý×éÖÐijһÏ

+

+Èç¹û¸Ãcid×ÊÔ´ÒѾ­¼¤»î£¬ÔòÁ¢¼´·µ»Øpdp¼¤»î³É¹¦ÏûÏ¢;

+

+Èç¹û¸Ãcid×ÊÔ´ÕýÔÚ¼¤»î»òÕßÈ¥¼¤»î£¬ÔòÆô¶¯¶¨Ê±Æ÷µÈ´ýÍê³É£¬ÔÙ½øÐÐpdp¼¤»î

+

+Èç¹û¸Ãcid×ÊԴδ¼¤»î:

+	APÖ±½Óת·¢zpdpact£¬×´Ì¬ÉèÖÃΪACTIVING£¬

+	Èç¹ûAPN/ip_typeÏàͬ¡¢CPÖ±½Ó·¢Æðcgact¼¤»îÁ÷³Ì£¬×´Ì¬ÉèÖÃΪACTIVING

+	Èç¹û²»ÏàͬÐèÏȶ¨ÒåÉÏÏÂÎÄ£¬CPÏÈÈ¥¼¤»î£¬ÔÙÈÏÖ¤£¬ÔÙ¶¨ÒåÉÏÏÂÎÄ£¬ÔÙ¼¤»î£¬×´Ì¬ÉèÖÃΪACTIVING¡£

+*/

+char* pdp_act_func(void *msg,struct at_context *context)

+{

+    char *at_str = NULL;

+    MSG_BUF *p_msg = (MSG_BUF *)msg;

+	struct pdp_act_req pdpActReq = {0};

+    PDP_PRIVATE_INFO *private_info = NULL;

+

+	int is_setapn = 0;

+	int cid = 0;

+	int idx = 0;

+	int pdp_type = PDP_LOCAL;

+	char creg_stat[20] = {0};

+	char cereg_stat[20] = {0};

+	char ppp_status[20] = {0};

+

+	cfg_get_item("cgreg_stat", creg_stat, sizeof(creg_stat));

+	cfg_get_item("cereg_stat", cereg_stat, sizeof(cereg_stat));

+	at_print(AT_ERR,"@@!!@@pdp_act_func creg stat=%s,cereg stat=%s ims=%d!\n",creg_stat,cereg_stat,apn_is_ims);

+

+	if(is_cid_init == 0 || ((1 == atoi(cereg_stat) || 5 == atoi(cereg_stat))&&apn_is_ims==-1))

+	{

+	    add_one_delayed_msg(msg);

+		return NULL;

+	}

+

+	cfg_get_item(NV_PPP_STATUS, ppp_status, sizeof(ppp_status));

+	//¶ÔÓÚÀ´×ÔÓÚweb ui·¢ÆðµÄpdp¼¤»î£¬Èç¹ûµ±Ç°²¦ºÅ״̬²»ÊÇdisconnected£¬Ò»Âɲ»Ðí²¦ºÅ£¬Ö±½Ó·µ»Ø

+	if((p_msg->src_id == MODULE_ID_WEB_CGI || p_msg->src_id == MODULE_ID_MAIN_CTRL) && (0 != strcmp(PPP_DISCONNECTED, ppp_status)))

+	{

+		AT_PDP_ACT_RSP_INFO rsp = {0};

+		memset(&rsp, 0x00, sizeof(AT_PDP_ACT_RSP_INFO));

+		rsp.result = AT_RSP_ERR;

+		send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_ACT_RSP,sizeof(AT_PDP_ACT_RSP_INFO),&rsp);

+

+		at_print(AT_ERR,"reject web ui dial, ppp_status: %s\n",ppp_status);

+		return NULL;

+	}

+

+	//Èç¹ûwebui/bl/ǰһ´Î¼¤»îĬÈÏcidµÄÄ£¿é·¢ÆðÐÂpdp¼¤»î£¬²»ÔÙÐèÒªpdp×Ô¶¯ÖØÐ²¦ºÅ¶¨Ê±Æ÷½øÐÐÖØ²¦

+	if((p_msg->src_id == MODULE_ID_WEB_CGI 

+		|| p_msg->src_id == MODULE_ID_BL 

+		|| p_msg->src_id == g_defcid_mng.modid) && (0 ==check_is_fd(g_defcid_mng.modid)))

+	{

+		if(g_defcid_mng.pdpreconnect_timerid)

+		{

+#if (APP_OS_TYPE == APP_OS_LINUX)

+			DeleteSoftTimer(g_defcid_mng.pdpreconnect_timerid);

+#elif (APP_OS_TYPE == APP_OS_TOS)

+			zOss_StopTimer(g_defcid_mng.pdpreconnect_timerid);

+#endif

+		}

+	}

+

+

+	memcpy((void*)&pdpActReq, (void*)(p_msg->aucDataBuf), p_msg->usDataLen);

+

+	/*get_ppp_cid½öÔÚap²àppp²¦ºÅʱºòÓÃÓÚ»ñÈ¡ppp²¦ºÅÖ¸¶¨µÄcid*/

+	get_ppp_cid(p_msg->src_id, &pdpActReq.ppp_cid);

+

+	idx = get_idx(&pdpActReq, &is_setapn);

+	if(idx < 0)

+	{

+		AT_PDP_ACT_RSP_INFO rsp = {0};

+		memset(&rsp, 0x00, sizeof(AT_PDP_ACT_RSP_INFO));

+		rsp.result = AT_RSP_ERR;

+		send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_ACT_RSP,sizeof(AT_PDP_ACT_RSP_INFO),&rsp);

+

+		return	NULL;      

+	}

+	pdp_type = get_pdptype(&pdpActReq);

+

+	/*get_ppp_cid½öÔÚap²àppp²¦ºÅʱºòÓÃÓÚ»ñÈ¡ppp²¦ºÅÖ¸¶¨µÄcid*/

+	//get_ppp_cid(pdp_type, &pdpActReq.ppp_cid);

+	//if(get_ppp_cid(pdp_type, &pdpActReq.ppp_cid) == 0)

+	//	return NULL;

+	if(pdp_type == PDP_NORMAL)

+	{

+		if(g_defcid_mng.cid == 0 && g_defcid_mng.activing_cid != 0)

+		{//ÓÐһ·defcidÕýÔÚ¼¤»î¹ý³ÌÖУ¬µÈµÈÔÙÅÜ

+			at_print(AT_ERR,"def cid %d is acting, start timer to wait\n", g_defcid_mng.activing_cid);

+			add_one_delayed_msg(msg);

+		}		

+		char flag[4] = {0};

+		cfg_get_item("local_pdp", flag, sizeof(flag)-1);

+		if(atoi(flag) != 0)

+		{//²»½øÐÐNORMAL²¦ºÅ±êÖ¾

+			cfg_set("local_pdp", "");

+			//ÒѾ­¼¤»îµÄNORMAL¿ÉÒÔ¸´Ó㬲ÎÊý²»Ò»Ö»òû¼¤»îµÄ¸ÄLOCAL

+			if(g_defcid_mng.cid != idx + 1)

+			{

+				pdp_type = PDP_LOCAL;

+			}

+		}

+		else

+		{

+			if(g_defcid_mng.cid != 0 && g_defcid_mng.cid != idx + 1)

+			{//APNÊÇdefaultµ«PDPÀàÐÍ»òÈÏÖ¤²»ÊÇ£¬µ¼Ö·ÖÅäÁËÁíÍâµÄcid

+				at_print(AT_ERR,"pdp_act_func, PDP_NORMAL redefine %d %d\n",idx+1,g_defcid_mng.cid);

+				if(p_msg->src_id == MODULE_ID_WEB_CGI 

+				|| p_msg->src_id == MODULE_ID_BL 

+				|| p_msg->src_id == g_defcid_mng.modid)

+				{//×Ô¶¯²¦ºÅÓ¦Ó㬻¹ÓÃÔ­À´µÄCID£¬È¥¼¤»îÐÞ¸ÄcgdcontÔÙÖØÐ²¦ºÅ

+					idx = g_defcid_mng.cid - 1;

+					is_setapn = 1;

+					CID_ARRAY[idx].state = CID_IDLE;

+				}

+				else

+				{//·Ç×Ô¶¯²¦ºÅÓ¦Óã¬ÓÃLOCAL²¦ºÅ

+					pdp_type = PDP_LOCAL;

+				}

+			}

+			else if(g_defcid_mng.cid == 0)

+			{//APNÊÇdefaultµ«·ÖÅäµÄcidÒѼ¤»î£¬ÇÒ²»ÊÇNORMAL£¬È¥¼¤»îÐÞ¸ÄcgdcontÔÙÖØÐ²¦ºÅ

+				if(CID_ARRAY[idx].state == CID_ACTIVE)

+				{

+					is_setapn = 1;

+					CID_ARRAY[idx].state = CID_IDLE;

+				}

+				if(CID_ARRAY[idx].state == CID_IDLE)

+				{//»º´ædefcid£¬½â¾ö×Ô¶¯²¦ºÅÁ÷³ÌÖÐºÍÆäËû²¦ºÅ²¢·¢ÎÊÌ⣬ÔÚ¼¤»îʧ°Ü¡¢È¥²¦ºÅ¡¢cgevʱÇåÁã

+					g_defcid_mng.activing_cid = idx + 1;

+				}

+			}

+		}

+	}

+

+	at_print(AT_ERR,"pdp_act_func: source is %x, default_apn is %s, apn is %s, ip_type is %s, pdp_type is %d, idx =%d\n",\

+				context->source, g_defcid_mng.default_apn, pdpActReq.comm_info.apn, pdpActReq.comm_info.ip_type, pdp_type, idx);

+	if(CID_ARRAY[idx].state == CID_ACTIVE)

+	{

+		void *next_req = NULL;

+		int next_len = 0;		

+		at_print(AT_ERR,"apn %s has been acted ,cid is %d, reply to app directly\n",pdpActReq.comm_info.apn, CID_ARRAY[idx].c_id);

+		pdpact_success_proc(CID_ARRAY[idx].c_id,pdp_type, context, &next_req, &next_len);

+		send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_ACT_RSP, sizeof(AT_PDP_ACT_RSP_INFO),(UCHAR *)next_req);

+		free(next_req);

+		return NULL;

+	}

+	else if(CID_ARRAY[idx].state == CID_ACTIVING || CID_ARRAY[idx].state == CID_DEACTIVING)

+	{

+

+		at_print(AT_ERR,"apn %s is acting or deacting ,start timer to wait\n", pdpActReq.comm_info.apn);

+		add_one_delayed_msg(msg);

+		return NULL;

+	}

+	/*µ±Ç°½öÖ§³ÖĬÈÏapnµÄ×Ô¶¯ÖØÁ¬£¬±£´æÄ¬ÈÏapn pdp¼¤»îÇëÇóµÄ·¢Æð·½ºÍpdp¼¤»îÇëÇó

+	ÐÅÏ¢£¬ÓÃÓÚÖØÁ¬Ê±×Ô¶¯²¦ºÅʹÓÃ

+	*/

+	if((pdp_type == PDP_NORMAL)&&(0 == check_is_fd(p_msg->src_id)))

+	{

+		g_defcid_mng.modid = p_msg->src_id;

+		if(g_defcid_mng.set_info)

+		{

+			free(g_defcid_mng.set_info);

+			g_defcid_mng.set_info = NULL;

+		}

+		g_defcid_mng.set_info = malloc(sizeof(struct pdp_act_req));

+		if(g_defcid_mng.set_info == NULL)

+			return NULL;

+		memcpy(g_defcid_mng.set_info, &pdpActReq, sizeof(struct pdp_act_req));

+#ifdef MULTI_CPU

+		sync_default_apn(context);

+#endif

+	}

+#if !defined(HAVE_MODEM_IN_CORE)

+    if(g_customer_type == CUSTOMER_SDK)

+    {

+    	//CS&EPS¶¼×¢²áʧ°Ü£¬²»½øÐв¦ºÅ£¬Ö±½Ó±¨´í¸ø·¢Æð·½,¼õÉÙ²»±ØÒªµÄ²¦ºÅ²Ù×÷

+    	if(1 != atoi(creg_stat) && 5 != atoi(creg_stat) && 1 != atoi(cereg_stat) && 5 != atoi(cereg_stat))

+        {      

+        	/*Ϊ¼õÉÙ²»±ØÒªµÄ²¦ºÅatÃüÁîÁ÷³Ì£¬Èç¹ûµ±Ç°²»Âú×㲦ºÅÌõ¼þ£¬ÔòÖ±½Ó±¨´í¸øÍø¹ØÓ¦Óã¬

+    		֪ͨÆäµ±Ç°ÎÞ·¨²¦ºÅ*/

+    		//send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_ACT_RSP,0,0);

+    		AT_PDP_ACT_RSP_INFO rsp = {0};

+    		memset(&rsp, 0x00, sizeof(AT_PDP_ACT_RSP_INFO));

+    		rsp.result = AT_RSP_ERR;

+    		if(pdp_type == PDP_NORMAL && 0 == check_is_fd(context->source))

+    		{		

+    			set_pppstatus(PPP_DISCONNECTED);

+    		}

+    		else if(pdp_type == PDP_PPP)

+    		{

+    			//¶ÔÓÚPPP²¦ºÅ£¬pdp¼¤»îʧ°Ü»òÕßûÓз¢Æðpdp¼¤»î£¬ÐèÒª·¢Æðppp¿ìËÙ¶Ï¿ª£¬

+    			//½«Êý¾Ý̬Çл»³ÉÃüÁî̬£¬²¢·¢ËÍNO CARRIER¸æÖª¶Ô¶Ë

+    			at_print(AT_ERR,"no network and ppp_dial failed!!\n");

+    			cfg_set("ppp_pdpstate", "dead");

+    			MSG_BUF *buf=NULL;

+    			buf = normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_PPP_QUICK_DISCONNECT,0,NULL);//modem³õʼ»¯Íê³Éºó£¬²éѯimeiºÅ

+    			rcv_clt_req_msg_proc(buf);

+    			free(buf);

+    		}

+    		send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_ACT_RSP,sizeof(AT_PDP_ACT_RSP_INFO),&rsp);

+

+    		return	NULL;      

+        }

+    }

+#endif

+/*	

+	if(CID_ARRAY[idx].state == CID_ACTIVE)

+	{

+		void *next_req = NULL;

+		int next_len = 0;		

+		at_print(AT_ERR,"apn %s has been acted ,cid is %d, reply to app directly\n",pdpActReq.comm_info.apn, CID_ARRAY[idx].c_id);

+		pdpact_success_proc(CID_ARRAY[idx].c_id,pdp_type, context, &next_req, &next_len);

+		send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_ACT_RSP, sizeof(AT_PDP_ACT_RSP_INFO),(UCHAR *)next_req);

+		free(next_req);

+		return NULL;

+	}

+	else if(CID_ARRAY[idx].state == CID_ACTIVING || CID_ARRAY[idx].state == CID_DEACTIVING)

+	{

+

+		at_print(AT_ERR,"apn %s is acting or deacting ,start timer to wait\n", pdpActReq.comm_info.apn);

+		add_one_delayed_msg(msg);

+		return NULL;

+	}

+	else

+*/	{

+		//Ê×ÏȼǼµ±Ç°µÄatͨµÀÔ´Í·£¬ÓÃÓÚpdp¼¤»î³É¹¦ºóÖ±½Ó´ÓatͨµÀ»Ø¸´ÏìÓ¦

+		//context->at_fd = at_fd;

+

+		//¼Ç¼µ±Ç°apnÉèÖÃ

+		strcpy(CID_ARRAY[idx].apn, pdpActReq.comm_info.apn);

+		strcpy(CID_ARRAY[idx].ip_type, pdpActReq.comm_info.ip_type);

+

+		if(pdp_type == PDP_NORMAL && 0 == check_is_fd(context->source))

+		{

+			set_pppstatus(PPP_CONNECTING);

+		}

+

+		private_info = (PDP_PRIVATE_INFO*)malloc(sizeof(PDP_PRIVATE_INFO));

+		context->app_param = private_info;

+        if(private_info == NULL){

+			softap_assert("");

+			return NULL;

+		}

+        memset(private_info, 0, sizeof(PDP_PRIVATE_INFO));	//±£´æcidÖµ

+

+        private_info->pdp_type = pdp_type;		//¼Ç¼±¾´Îpdp¼¤»îÀàÐÍ

+		private_info->index = idx;				//¼Ç¼±¾´Îpdp¼¤»î¶ÔÓ¦µÄCID×ÊÔ´Êý×éϱê

+

+		//·¢Æðpdp¼¤»î£¬¸ù¾Ý·µ»ØÖµÈ·¶¨ÊÇ·ñÐèÒªÖØÐÂÉèÖÃapn£¬¶ÔÓÚĬÈϳÐÔØ£¬ÔÚPDP¼¤»îʱ£¬ÎÞÐèÔÙÖØÐÂÉèÖÃapnÁË

+#ifdef HAVE_MODEM_IN_CORE	

+		cid = CID_ARRAY[idx].c_id;

+		private_info->c_id = cid;		//¼Ç¼±¾´ÎµÄpdp¼¤»îcid

+		if(is_setapn)

+		{

+			/*private_info->pdpActInfo = (struct pdp_act_req *)malloc(sizeof(struct pdp_act_req));

+			memset(private_info->pdpActInfo, 0x00, sizeof(struct pdp_act_req));*/

+			memcpy(&private_info->pdpActInfo, &pdpActReq, sizeof(struct pdp_act_req));

+

+			at_str = (char *)malloc(32);

+        	if(at_str == NULL){

+				softap_assert("");

+				return NULL;

+			}

+        	memset(at_str, 0, 32);

+			at_print(AT_ERR,"need to set apn , goto build cgact deactive cmd\n");

+			sprintf(at_str,"at+cgact=0,%d\r\n",cid);

+			private_info->pdp_state = 0;			//¼Ç¼±¾´Îpdp¼¤»î״̬Ϊȥ¼¤»î

+			CID_ARRAY[idx].state = CID_ACTIVING;

+		}

+		else

+#endif

+		{

+			at_str = build_pdpact_cmd(private_info, &pdpActReq);	

+		}

+		at_print(AT_DEBUG, "pdp_act_fuc: at_str = %s\n", at_str);

+

+		return at_str;

+	}

+}

+

+

+//È¥¼¤»îµÄÖ÷´¦Àíº¯Êý

+char *pdp_deact_func(void *msg,struct at_context *context)

+{

+    char *at_str = NULL;

+    MSG_BUF *p_msg = (MSG_BUF *)msg;

+    int cur_cid = 0;

+    PDP_PRIVATE_INFO *private_info = NULL;

+

+	AT_PDP_DEACT_RSP_INFO rsp_msg = {0};

+	rsp_msg.result = AT_RSP_ERR;

+

+	int idx = -1;

+	//int at_fd = 0;

+

+	AT_PDP_DEACT_REQ_INFO pdpDeactReq = {0};	

+

+	memcpy(&pdpDeactReq, (AT_PDP_DEACT_REQ_INFO*)p_msg->aucDataBuf, sizeof(AT_PDP_DEACT_REQ_INFO));

+	cur_cid = pdpDeactReq.c_id;

+

+

+	at_print(AT_ERR,"pdp_deact_func: source is %x, g_defcid_msg.modid is %x, cid is %d\n",p_msg->src_id, g_defcid_mng.modid, cur_cid);

+	if(context->source == MODULE_ID_PPPD)

+	{

+		//¶ÔÓÚPCÖÕ¶Ë·¢ÆðµÄppp terminate£¬ÔÚЭÉÌÍê³Éºó£¬ppp֪ͨat_ctl·¢ÆðpdpÈ¥¼¤»î

+		if((cur_cid > 0) && (ppp_cid >0) && (cur_cid != ppp_cid))

+		{

+			softap_assert("wrong cid for ppp");

+		}

+		ppp_cid = 0;

+		cfg_set("ppp_cid","");

+		ppp_quick_disconnect();

+	}

+	//at_fd = pdpDeactReq.at_fd;

+	//Èç¹ûÍⲿÖ÷¶¯·¢ÆðpdpÈ¥¼¤»î£¬ÔòÖÕÖ¹×Ô¶¯Á¬½Ó£¬²¢ÊÍ·ÅËùÓÐ×ÊÔ´ÐÅÏ¢

+	if((p_msg->src_id == MODULE_ID_WEB_CGI 

+		|| p_msg->src_id == MODULE_ID_BL 

+		|| p_msg->src_id == g_defcid_mng.modid) && (0 == check_is_fd(g_defcid_mng.modid))

+		&& (cur_cid == g_defcid_mng.cid || cur_cid == 0))

+	{

+

+		if(g_defcid_mng.pdpreconnect_timerid)

+		{

+#if (APP_OS_TYPE == APP_OS_LINUX)

+			DeleteSoftTimer(g_defcid_mng.pdpreconnect_timerid);

+#else

+			zOss_StopTimer(g_defcid_mng.pdpreconnect_timerid);

+#endif	

+		}

+		if(g_defcid_mng.set_info != NULL)

+		{

+			if(g_defcid_mng.cid != 0)

+			{

+				idx = g_defcid_mng.cid - 1;

+			}

+			else

+			{

+				int i;

+				for(i = 0; i<CID_MAX_NUM; i++)

+				{

+					if((0 == strcmp(g_defcid_mng.set_info->comm_info.apn, CID_ARRAY[i].apn)) 

+						&& (0 == strcmp(g_defcid_mng.set_info->comm_info.ip_type, CID_ARRAY[i].ip_type)))

+					{

+						idx = i;

+					}

+				}

+			}

+			if(idx >= 0 || idx < CID_MAX_NUM)

+			{

+			if(CID_ARRAY[idx].state == CID_ACTIVING)

+			{

+				at_print(AT_ERR,"pdp_deac_func:apn %s is acting ,start timer to wait\n", g_defcid_mng.set_info->comm_info.apn);

+				add_one_delayed_msg(msg);

+				return NULL;

+			}

+			else if(CID_ARRAY[idx].state == CID_ACTIVE)

+			{

+				//ÔÚÈ¥¼¤»î֮ǰ£¬Èç¹û·¢Éú¹ýÍø²àÖ÷¶¯¶Ï¿ª£¬´Ëʱpdp×Ô¶¯²¦ºÅ»ñÈ¡µ½µÄcid£¬ÓëÓ¦ÓÃÖ÷¶¯·¢ÆðµÄpdp¼¤»îcidδ±ØÒ»ÖÂ

+				//Èç¹ûÓ¦ÓÃʹÓÃ×Ô¼ºÖ÷¶¯pdp¼¤»î»ñÈ¡µ½µÄcid¶Ï¿ª²¦ºÅʱ£¬½«cidÐÞ¸ÄΪpdp×Ô¶¯²¦ºÅ»ñÈ¡µ½µÄcid

+				at_print(AT_ERR,"pdp_deac_func:now default cid is changed to %d , begin to deact it\n", cur_cid);

+				cur_cid = CID_ARRAY[idx].c_id;

+			}

+			}

+			if(g_defcid_mng.set_info)

+			{

+				free(g_defcid_mng.set_info);

+				g_defcid_mng.set_info = NULL;

+			}

+		}

+		g_defcid_mng.modid = 0;

+		//ÖØÉèpdpÖØÁ¬¶¨Ê±Æ÷ʱ³¤

+		at_timeout_reset_pdpreconn_time();

+		//½«×Ô¶¯ÖØÁ¬nvÉèÖÃΪ0

+		cfg_set("auto_reconnect","0");

+		if(cur_cid == 0)

+		{

+			rsp_msg.result = AT_RSP_OK;

+		}

+		else

+		{

+			g_defcid_mng.cid = cur_cid;

+			set_pppstatus(PPP_DISCONNECTING);

+		}

+

+	}

+

+	if(cur_cid == 0)

+	{

+		send_rsp_msg(context->source,context->msg_id,MSG_CMD_PDP_DEACT_RSP, sizeof(AT_PDP_DEACT_RSP_INFO),(UCHAR *)&rsp_msg);

+		return NULL;

+	}	

+	idx = get_idx_bycid(cur_cid);

+	if(idx < 0)

+	{

+		softap_assert("");

+		return NULL;

+	}

+/*	

+	if(CID_ARRAY[idx].ref > 1)

+	{

+		CID_ARRAY[idx].ref--;

+		//ÓÉÓÚzpdpact_req_funcÒѾ­´¦ÀíÍê³ÉatͨµÀµÄÇëÇó´¦Àí£¬Òò´ËÕâÀï½ö´¦ÀíÕæÕýµÄÏûÏ¢ÇëÇó¼´¿É

+		if(context->source > 0)

+		{

+			AT_PDP_DEACT_RSP_INFO rsp_msg = {0};

+			rsp_msg.result = AT_RSP_OK;

+

+			if(context->source == MODULE_ID_WEB_CGI)

+			{

+				//pdp_normal_cid = 0;

+				cfg_set(NV_PPP_STATUS,PPP_DISCONNECTED);

+                iConnectStatus = 0; //0 disconnected,1 connected,2 connecting,3 disconnecting

+                ipc_send_message(MODULE_ID_AT_CTL,MODULE_ID_MMI,MSG_CMD_CHANNEL_CONNECT_STATUS, sizeof(iConnectStatus), (UCHAR *)&iConnectStatus,0);

+			}

+

+			ipc_send_message(MODULE_ID_AT_CTL, context->source, MSG_CMD_PDP_DEACT_RSP, sizeof(AT_PDP_DEACT_RSP_INFO), &rsp_msg, 0);

+		}

+		else

+		{

+			softap_assert("");

+		}

+        at_print(AT_ERR, "Enter pdp_deact_func 22222222!!!!\n");

+		return NULL;

+	}

+	//ÏûÏ¢ºÍatͨµÀpdpÈ¥¼¤»îÇëÇó¸´ÓÃ

+	else*/

+	{

+		//¼Ç¼atͨµÀ£¬ÓÃÓÚpdpÈ¥¼¤»î½á¹ûÓ¦´ð»Ø¸´

+		//context->at_fd = at_fd;

+

+		at_str = (char *)malloc(PDP_CMD_LEN);

+	    if(at_str == NULL){

+			softap_assert("");

+			return NULL;

+		}

+	    memset(at_str, 0, PDP_CMD_LEN);

+

+	    private_info = (PDP_PRIVATE_INFO*)malloc(sizeof(PDP_PRIVATE_INFO));

+        if(private_info == NULL){

+			softap_assert("");

+			free(at_str);

+			return NULL;

+		}

+	    memset(private_info, 0, sizeof(PDP_PRIVATE_INFO));//±£´æcidÖµ

+		context->app_param = private_info;

+

+	    private_info->c_id = cur_cid;

+		private_info->index = idx;

+		private_info->pdp_state = 0;

+/*

+		if(context->source == MODULE_ID_PPPD)

+		{

+			//¶ÔÓÚPCÖÕ¶Ë·¢ÆðµÄppp terminate£¬ÔÚЭÉÌÍê³Éºó£¬ppp֪ͨat_ctl·¢ÆðpdpÈ¥¼¤»î

+			if((cur_cid > 0) && (ppp_cid >0) && (cur_cid != ppp_cid))

+			{

+				softap_assert("wrong cid for ppp");

+			}

+			ppp_cid = 0;

+			cfg_set("ppp_cid","");

+			ppp_quick_disconnect();

+		}

+*/		

+		CID_ARRAY[idx].state = CID_DEACTIVING;

+#ifdef HAVE_MODEM_IN_CORE

+		sprintf(at_str,"at+zgact=0,%d\r\n", cur_cid);

+#else

+		sprintf(at_str,"AT+ZPDPDEACT=%d\r\n", cur_cid);	

+#endif

+		return at_str;

+	}

+}

+

+

+/*

+À©Õ¹at zpdpactµÄÃüÁî¸ñʽ:

+	at+zpdpact=cid,iptype,apn

+

+	ÆäÖÐcid=0£¬±íʾ²»Ö¸¶¨cid£¬ÓÉat_ctl¶¯Ì¬Ñ¡Ôñ¿ÉÓÃcid½øÐÐpdp²¦ºÅ£»

+	cid=1~4£¬±íʾÍⲿָ¶¨cid½øÐÐpdp²¦ºÅ£»

+	iptype±ØÐëÊÇË«ÒýºÅ°üº¬µÄ×Ö·û´®¸ñʽ

+*/

+int get_pdp_set_info(char * at_paras, struct pdp_act_req *info)

+{

+	int state = 0;

+	void * p[12] =	{	&info->ext_cid,

+						info->comm_info.ip_type,

+						info->comm_info.apn,

+						&(info->volte_param1),

+						&(info->volte_param2),

+						&(info->volte_param3),

+						&(info->comm_info.auth_type),

+						info->comm_info.username,

+						info->comm_info.password,

+						info->comm_info.challenge,

+						&(info->ppp_cid),

+						&(info->default_flag)

+				 	};

+	parse_param2("%d,%s,%100s,%d,%d,%d,%d,%s,%s,%s,%d,%d",at_paras, p);

+	at_print(AT_DEBUG,"ext_cid is %d, ppp_cid is %d\n",info->ext_cid, info->ppp_cid);

+

+	return 1;	

+}

+/*

+int zpdpact_req_func(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+{

+	int idx;

+	//int is_setapn;

+

+	if('1' == at_paras[0])

+	{

+		struct pdp_act_req info = {0};

+

+		get_pdp_set_info(at_paras, &info);

+

+		idx = get_idx(&info, NULL);

+		if(info.ppp_cid)

+		{

+			get_ppp_apn(&info);//»ñÈ¡ppp²¦ºÅʱ£¬ÓÃcgdcontÃüÁîÉèÖõÄip_typeºÍapn

+		}

+		//Èç¹ûµ±Ç°ÒѾ­PDP¼¤»î³É¹¦£¬ÔòÖ±½Ó·µ»Øcid¼´¿É

+		if(CID_ARRAY[idx].state == CID_ACTIVE)

+		{

+			int cid = CID_ARRAY[idx].c_id;

+			//Ö±½Ó·µ»ØÒѾ­¼¤»î

+			//CID_ARRAY[idx].ref++;

+			*res_msg = zpdpact_ind_build(g_pdpinfo_mng[cid-1].pdpInfo);

+

+			at_print(AT_ERR,"zpdpact:apn %s is acted ,cid is %d\n",info.comm_info.apn, cid);

+

+			*res_msglen = strlen(*res_msg);

+

+			return AT_END;

+		}

+		else

+		{

+	    	MSG_BUF *buf=NULL;

+			//ÕâÀォat_fd×÷ΪԴģ¿éid,ÓÉÓÚÄ¿±êÄ£¿éIDÒѾ­ÊÇat_ctl×ÔÉí£¬Òò´ËÎÞÐèÍⲿ·¢ËÍÏûÏ¢£¬Ö±½Ó×é×°ÏûÏ¢£¬µ÷ÓÃÏûÏ¢´¦Àí½Ó¿Ú

+			buf=normal_getmsg(at_fd,MODULE_ID_AT_CTL, MSG_CMD_PDP_ACT_REQ, sizeof(struct pdp_act_req), (unsigned char *)&info);

+			rcv_clt_req_msg_proc(buf);

+	        free(buf);

+

+			return AT_CONTINUE;

+		}

+	}

+	else if('0' == at_paras[0])

+	{

+		int state = 0, cur_cid = 0;

+		int idx = 0;

+	    void *p[2] = {&state, &cur_cid};

+

+	    parse_param2("%d,%d", at_paras, p);

+

+		idx = get_idx_bycid(cur_cid);

+		if(idx < 0)

+		{

+			softap_assert("");

+		}

+

+		//ת»»³ÉÏûÏ¢·½Ê½½øÐд¦Àí£¬ÔÚÏûÏ¢ÄÚÈÝÖÐЯ´øatͨµÀÐÅÏ¢

+    	MSG_BUF *buf=NULL;

+		AT_PDP_DEACT_REQ_INFO deact_req = {0};

+		deact_req.c_id = cur_cid;

+		//ÕâÀォat_fd×÷ΪԴģ¿éid

+		buf=normal_getmsg(at_fd,MODULE_ID_AT_CTL,MSG_CMD_PDP_DEACT_REQ, sizeof(AT_PDP_DEACT_REQ_INFO), (unsigned char *)&deact_req);

+        rcv_clt_req_msg_proc(buf);

+        free(buf);

+		return AT_CONTINUE;

+

+	}

+    return AT_END;

+}

+*/

+#ifndef HAVE_MODEM_IN_CORE

+//APÆðÍø¿ÚºÍ¶ÏÍø¿ÚµÄ´¦Àíµã

+int zpdpact_ok_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+	int state = 0, cur_cid = 0;

+	int idx = 0;

+    PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+

+	state = private_info->pdp_state;

+	cur_cid = private_info->c_id;

+

+	idx = get_idx_bycid(cur_cid);

+

+	if(idx < 0)

+	{

+		softap_assert("");

+	}

+

+    if(state == 1)

+    {

+        if(cur_cid > 0 &&g_pdpinfo_mng[cur_cid-1].pdpInfo!= NULL)

+        {

+

+			pdp_act_proc_for_module(g_pdpinfo_mng[cur_cid-1].pdpInfo, private_info->pdp_type);

+

+			pdpact_success_proc(cur_cid, private_info->pdp_type,context, next_req, next_len);

+

+			return AT_END;

+

+		}

+		else

+        {

+        	softap_assert("");

+        }

+

+	}

+

+

+	return AT_END;

+}

+

+int zpdpact_err_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+

+	int state = 0;

+    PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+

+	state = private_info->pdp_state;

+	if(state == 1)

+	{

+		int idx = private_info->index;

+    	//Èç¹ûpdp¼¤»îʧ°Ü£¬Ôò¶ÔÓÚatͨµÀÀ´µÄÇëÇó£¬Ö±½Ó·µ»Øerror;

+		pdpact_failed_proc(at_paras,context, idx, next_req, next_len);

+

+		if(context->source == MODULE_ID_PPPD)

+		{

+        	//ÉèÖÃpppµÄpdp¼¤»î״̬£¬Í¨Öªppp·¢Æðlcp terminateÇëÇó

+        	//È»ºó·¢Æðppp¿ìËÙ¶Ï¿ª£¬½«Êý¾Ý̬Çл»³ÉÃüÁî̬£¬²¢·¢ËÍNO CARRIER¸æÖª¶Ô¶Ë

+		 	at_print(AT_ERR,"ppp_dial pdpact failed!!\n");

+			cfg_set("ppp_pdpstate", "dead");

+			MSG_BUF *buf=NULL;

+			buf = normal_getmsg(MODULE_ID_AT_CTL,MODULE_ID_AT_CTL,MSG_CMD_PPP_QUICK_DISCONNECT,0,NULL);//modem³õʼ»¯Íê³Éºó£¬²éѯimeiºÅ

+			rcv_clt_req_msg_proc(buf);

+			free(buf);

+		}

+	}

+	else

+	{

+		//µ±Ç°½ö¿¼ÂÇpdp¼¤»îʧ°ÜµÄÇé¿ö£»

+		softap_assert("");

+	}

+

+	return AT_END;

+}

+

+int zpdpact_auto_act(char *at_paras ,int is_query_report)

+{

+	//¸ù¾Ý±£´æµÄcid×ÊÔ´Êý×éϱ꣬»ñÈ¡µ±Ç°PDP¼¤»îµÄapnºÍiptypeÉèÖÃ

+    struct at_context *context = (struct at_context *)is_query_report;

+    PDP_PRIVATE_INFO *private_info =(PDP_PRIVATE_INFO *)context->app_param;

+	int cid = 0;

+	if(NULL == at_paras)

+	{

+		softap_assert("");

+		return AT_END;

+	}

+	//¸ù¾ÝÖмä½á¹û£¬»ñÈ¡µ±Ç°pdp״̬

+

+	//Èç¹ûµ±Ç°Éϱ¨Îªpdp¼¤»î³É¹¦Éϱ¨

+	{

+		int idx = private_info->index;

+		cid = parse_ipdns_param(at_paras);

+		//save_v6addr(at_paras, &cur_cid);

+		//¼Ç¼µ±Ç°CP²àΪAP²à·ÖÅäµÄcidÐÅÏ¢

+		CID_ARRAY[idx].c_id = cid;

+		private_info->c_id = cid;

+		private_info->pdp_state = 1;

+	}

+	return AT_END;

+}

+

+int zpdpdeact_ok_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+	int state = 0, cur_cid = 0;

+    PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+

+	state = private_info->pdp_state;

+	cur_cid = private_info->c_id;

+

+	if(state == 0)

+	{

+		if(cur_cid > 0)

+        {

+			pdpinfo_reset(cur_cid);

+			pdpdeact_success_proc(cur_cid, context, next_req, next_len);

+       }

+	}

+	return AT_END;

+

+}

+int zpdpdeact_err_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+	//pdpÈ¥¼¤»î²»ÔÊÐí³öÏÖʧ°Ü

+	softap_assert("");

+	return AT_END;

+}

+#endif

+

+//ǿתcontext->paramΪ¶ÔÓ¦µÄ½á¹¹Ì壬¸³ÖµÏÂÒ»¸öATÇëÇóµ½at_strÖÐ

+//CPÆðÍø¿ÚºÍ¶ÏÍø¿ÚµÄ´¦Àíµã

+int cgact_ok_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    int state = 0, cur_cid = 0;

+	int idx = 0;

+    PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+	int ret = -1;

+

+	cur_cid = private_info->c_id;

+	state = private_info->pdp_state;

+

+	idx = get_idx_bycid(cur_cid);

+	if(idx < 0)

+	{

+		softap_assert("");

+		return AT_END;

+	}

+    if(state == 1)

+    {

+        if(cur_cid > 0)

+        {

+			//ÕâÀïÍø²àÖ÷¶¯È¥¼¤»îÁË£¬Ö±½Ó·µ»Ø´íÎó£¬Í¨ÖªÊ§°Ü

+			if(CID_IDLE == CID_ARRAY[idx].state)

+			{

+				//ÕâÀïµ±×öpdpʧ°Ü´¦Àí

+				at_print(AT_ERR,"cgev is infromed ref=%d when waiting for ip6 addr\n",CID_ARRAY[idx].ref);

+				if(CID_ARRAY[idx].ref == 1)

+				{

+					return AT_WAIT_AUTO;

+				}

+				else

+				{

+					pdpact_failed_proc(NULL, context, idx, next_req, next_len);

+					return AT_END;

+				}

+			}

+

+			//Èç¹ûûÓ줻î¹ý£¬Èç¹ûûÓлñÈ¡µ½ipµØÖ·Éϱ¨£¬ÔòµÈ´ýÉϱ¨£¬·ñÔòÖ±½Ó¼¤»î

+			if(0 == g_pdpinfo_mng[cur_cid-1].is_acted)

+			{

+				 if(g_pdpinfo_mng[cur_cid-1].pdpInfo != NULL)

+				 {

+        		 	pdp_act_proc_for_module(g_pdpinfo_mng[cur_cid-1].pdpInfo, private_info->pdp_type);

+					g_pdpinfo_mng[cur_cid-1].ipflag = g_pdpinfo_mng[cur_cid-1].pdpInfo->act_info.ip46flag;

+					g_pdpinfo_mng[cur_cid-1].linkup_state = V4V6_INVALID;

+					//Çå¿Õv6µØÖ·»ñÈ¡Éϱ¨ÐÅÏ¢£¬µÈ´ý½á¹ûÉϱ¨

+					//g_pdpinfo_mng[cur_cid-1].slaac_v6_inform = V6ADDR_GETTING;

+				 }

+				 else

+				 {

+				    if(CID_ARRAY[idx].state == CID_ACTIVING)

+			    	{

+						at_print(AT_ERR,"can not recv zgipdns and send ok again!!!\n");

+		        		return AT_WAIT_AUTO;

+			    	}

+				 }

+			}

+

+#if 0

+			if((g_pdpinfo_mng[cur_cid-1].pdpInfo->act_info.ip46flag & V6_VALID))

+			{

+				int ret = check_slaac_inform(cur_cid);

+				if(ret == AT_END)

+				{	

+					at_print(AT_ERR,"slaac failed to get ipv6 addr, reply pdp act failed to app\n");

+					pdpact_failed_proc(NULL, context, idx, next_req, next_len);

+					return AT_END;

+				}

+				else if(ret == AT_WAIT_AUTO)

+				{

+					return AT_WAIT_AUTO;

+				}

+

+			}

+#endif

+			ret = check_linkup_state(cur_cid);

+			if(ret == AT_WAIT_AUTO)

+			{			

+				at_print(AT_ERR,"check_linkup_state == LINK_UPDOWN_START\n");

+				return AT_WAIT_AUTO;

+			}

+			if((g_pdpinfo_mng[cur_cid-1].pdpInfo->act_info.ip46flag & V6_VALID))

+			{

+				get_unicast_ip6addr(cur_cid);

+			}

+

+			//V6µ¥Õ»µØÖ·»ñȡʧ°Ü£¬·µ»Ø´íÎóÂ룬V4V6˫ջÇé¿öÏÂV6µØÖ·»ñȡʧ°Ü£¬ÈÔÈ»·µ»Ø³É¹¦

+			if(g_pdpinfo_mng[cur_cid-1].pdpInfo->act_info.ip46flag == V6_VALID)

+			{

+				char ps_wan[NV_NAME_LEN] = {0};

+				char psv6_wan[NV_NAME_LEN] = {0};

+				char pswan_state[NV_NAME_LEN] = {0};

+

+				cfg_get_item("pswan", ps_wan, sizeof(ps_wan));

+

+				snprintf(psv6_wan,NV_NAME_LEN, "%s%d_ipv6_state", ps_wan, cur_cid);

+				cfg_get_item(psv6_wan, pswan_state, sizeof(pswan_state));

+				if(strcmp(pswan_state,"dead") == 0)

+				{					

+					AT_PDP_ACT_RSP_INFO *rsp = malloc(sizeof(AT_PDP_ACT_RSP_INFO));

+					if(rsp == NULL){

+						softap_assert("malloc failed");

+						return AT_END;

+					}

+					at_print(AT_ERR,"get V6addr failed\n");

+					rsp->result = AT_RSP_ERR;

+					rsp->errcode = ATERR_PDP_IPADDR_FAILED;

+					rsp->cid = cur_cid;

+					*next_req = rsp;

+					*next_len = sizeof(AT_PDP_ACT_RSP_INFO);

+

+					cfg_set(NV_PDP_STATUS, "0");

+					CID_ARRAY[idx].state = CID_IDLE;

+					pdpinfo_reset(cur_cid);

+					return AT_END;

+

+				}

+

+			}

+			cfg_set(NV_PDP_STATUS, "1");

+			ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_ISMS, MSG_CMD_PDP_STATUS_IND, 2, "1", 0);

+			ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_DMREG, MSG_CMD_PDP_STATUS_IND, 2, "1", 0);

+			ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_SAFECARE, MSG_CMD_PDP_STATUS_IND, 2, "1", 0);

+

+			at_print(AT_ERR,"check_linkup_state == LINK_UPDOWN_END\n");

+			pdpact_success_proc(cur_cid, private_info->pdp_type,context, next_req, next_len);

+			return AT_END;

+        }

+    }

+    if(state == 0)

+    {

+        if(cur_cid > 0 )

+        {

+			if(context->msg_id == MSG_CMD_PDP_ACT_REQ)

+			{

+				char *at_str = (char *)malloc(AT_CMD_MAX);

+				if(at_str == NULL)

+					return AT_END;

+				memset(at_str, 0x00, AT_CMD_MAX);

+				struct pdp_act_req *p_setInfo = &private_info->pdpActInfo;

+				private_info->auth_state = PDP_DEL_AUTH;

+				sprintf(at_str, "at+cgdcont=%d,\"%s\",\"%s\",,,,,%d,%d,%d\r\n", private_info->c_id, p_setInfo->comm_info.ip_type, 

+				p_setInfo->comm_info.apn, p_setInfo->volte_param1, p_setInfo->volte_param2, p_setInfo->volte_param3);

+

+				*next_req = at_str;

+				*next_len = strlen(at_str);

+

+				return AT_CONTINUE;

+			}

+			else if (context->msg_id == MSG_CMD_PDP_DEACT_REQ)

+			{

+				if(1 == g_pdpinfo_mng[cur_cid-1].is_acted)

+				{

+					pdpinfo_reset(cur_cid);					

+					return AT_WAIT_AUTO;

+				}

+				else

+				{

+					ret = check_linkdown_state(cur_cid);

+					if(ret == AT_END)

+					{	

+						at_print(AT_ERR,"check_linkdown_state == LINK_UPDOWN_END\n");

+						return deact_pdp_act(at_paras,context,next_req,next_len);;

+

+					}

+					else if(ret == AT_WAIT_AUTO)

+					{

+

+						at_print(AT_ERR,"check_linkdown_state == LINK_UPDOWN_START\n");

+						return AT_WAIT_AUTO;

+					}

+

+				}				

+			}

+        }      

+    }

+    return AT_END;

+}

+

+int zgact_ok_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    int state = 0, cur_cid = 0;

+	int idx = 0;

+    PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+	state = private_info->pdp_state;

+	cur_cid = private_info->c_id;

+

+	idx = get_idx_bycid(cur_cid);

+	if(idx < 0)

+	{

+		softap_assert("");

+	}

+    if(state == 0)

+    {

+        if(cur_cid > 0 )

+        {

+			if(context->msg_id == MSG_CMD_PDP_DEACT_REQ)

+			{

+				char *at_str = (char *)malloc(AT_CMD_MAX);

+				if(at_str == NULL)

+					return AT_END;

+				memset(at_str, 0x00, AT_CMD_MAX);

+				private_info->auth_state = PDP_DEL_AUTH;

+				sprintf(at_str, "at+cgact=0,%d\r\n", private_info->c_id);

+

+				*next_req = at_str;

+				*next_len = strlen(at_str);

+

+				return AT_CONTINUE;

+			}

+        }      

+    }

+    return AT_END;

+}

+

+//¶ÏÍø¿Ú¹¦ÄÜ£¬ÆðÍø¿ÚÔÚCGACTÀï´¦ÀíÁË

+int deact_pdp_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    int state = 0, cur_cid = 0;

+	int idx = 0;

+    PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+

+	state = private_info->pdp_state;

+	cur_cid = private_info->c_id;

+

+	idx = get_idx_bycid(cur_cid);

+	if(idx < 0)

+	{

+		softap_assert("");

+	}

+    if(state == 0)

+    {

+        if(cur_cid > 0 )

+        {

+        	//int position = 0;

+			pdpinfo_reset(cur_cid);

+

+			cfg_set(NV_PDP_STATUS, "0");

+			ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_ISMS, MSG_CMD_PDP_STATUS_IND, 2, "0", 0);

+			ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_DMREG, MSG_CMD_PDP_STATUS_IND, 2, "0", 0);

+			ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_SAFECARE, MSG_CMD_PDP_STATUS_IND, 2, "0", 0);

+

+            pdpdeact_success_proc(cur_cid, context, next_req, next_len);			

+        }

+        else

+        {

+        	softap_assert("");

+        }

+    }

+    return AT_END;

+}

+

+int cgact_err_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    int state = 0, cur_cid = 0;

+	int idx = 0;

+    PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+	state = private_info->pdp_state;

+	cur_cid = private_info->c_id;

+

+

+	idx = get_idx_bycid(cur_cid);

+	if(idx < 0)

+	{

+		softap_assert("");

+	}

+   	if(state == 0)

+    {

+        if(cur_cid > 0 )

+        {

+			if(context->msg_id == MSG_CMD_PDP_ACT_REQ)

+			{

+				char *at_str = (char *)malloc(AT_CMD_MAX);

+				if(at_str == NULL)

+					return AT_END;

+				memset(at_str, 0x00, AT_CMD_MAX);

+				struct pdp_act_req *p_setInfo = &private_info->pdpActInfo;	

+				private_info->auth_state = PDP_DEL_AUTH;

+				sprintf(at_str, "at+cgdcont=%d,\"%s\",\"%s\",,,,,%d,%d,%d\r\n", private_info->c_id, p_setInfo->comm_info.ip_type, 

+				p_setInfo->comm_info.apn, p_setInfo->volte_param1, p_setInfo->volte_param2, p_setInfo->volte_param3);

+

+				*next_req = at_str;

+				*next_len = strlen(at_str);

+

+				return AT_CONTINUE;

+			}

+			else if (context->msg_id == MSG_CMD_PDP_DEACT_REQ)

+			{

+

+				char at_cmd[32] = {0};

+				snprintf(at_cmd, sizeof(at_cmd),"\r\n+ZDEFBEARCID: %d\r\n", cur_cid);

+				at_context_write_by_pos(POSITION_VOLTE, at_cmd);

+

+				return deact_pdp_act(at_paras,context,next_req,next_len);

+			}

+		}

+		else

+		{

+			softap_assert("");

+		}

+   	}

+	else if(1 == state)

+	{

+		//µ±Ç°½ö¿¼ÂÇpdp¼¤»îʱ³öÏÖʧ°Ü£¬Çå³ýpdp¼¤»îʱ¼Ç¼µÄ״̬ÐÅÏ¢

+    	if(context->msg_id == MSG_CMD_PDP_ACT_REQ)

+    	{

+			pdpact_failed_proc(at_paras,context,idx, next_req, next_len);

+		}

+	}

+

+	return AT_END;

+

+}

+

+int zgact_err_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    softap_assert("");

+    return AT_END;

+}

+

+//½«¼¤»îÐÅÏ¢´æµ½pdpInfoÈ«¾ÖÀ´ËÈ«¾ÖÒ²ÊÇÅжÏÊÇ·ñÒÑÊÕµ½zgipdnsµÄÌõ¼þ

+//ÓÉÓÚ¶ÁÇý¶¯select»úÖÆ£¬Í¬Ê±Éϱ¨ÊÇÓÐʱznetifupÇëÇó±ÈzgipdnsÉϱ¨Ôçreadµ½£¬´ËʱpdpInfoΪnullÔòÔÚznetifup_req´æÒ»·ÝpdpInfo

+//ÔÚOK±ÈzgipdnsÏÈÉϱ¨Ê±£¬ÓÉ´ËÆðÍø¿Ú£¬°üÀ¨Ô¤Áôcid

+int zgipdns_auto_act(char *at_paras ,int is_query_report)

+{

+   //»ñÈ¡ip¡¢dnsºóÐèÒªmalloc дÈëCID_ARRAY[i].act_info

+

+    int  iCidNum = 0, idx = 0, i = 0, cid = 0, comma_num = 0;

+	int len = IPTYPE_MAX_LEN + MAX_AT_IPV4V6_SIZE*4;

+   	char *mem = malloc(len);

+    char *type 		= mem;

+    char *addr 		= type 		+ IPTYPE_MAX_LEN;

+	char *gw 		= addr 		+ MAX_AT_IPV4V6_SIZE;

+	char *pri_dns 	= gw 		+ MAX_AT_IPV4V6_SIZE;

+	char *sec_dns 	= pri_dns 	+ MAX_AT_IPV4V6_SIZE;

+	char *p[6] = {&cid, type, addr, gw, pri_dns, sec_dns};

+	struct netdev_act_info *act_info = NULL;

+	char *temp = at_paras;

+	at_print(AT_DEBUG, "recv zgipdns_inform ,begin to save ip and dns\n");

+

+	if(NULL == mem)

+	{

+		softap_assert("");

+		return AT_END;

+	}

+

+	iCidNum = temp[0] - '0';

+

+	if(0 == iCidNum)

+	{

+		free(mem);

+		mem = NULL;

+		return AT_END;

+	}

+	else

+	{

+		//µÃµ½µÚÒ»¸öcid pdp¼¤»îÐÅÏ¢µÄÖ¸Õë

+		comma_num = 1;

+	}

+

+

+    for(i=0; i < iCidNum; i++)

+    {

+

+		temp = get_param_by_symbol(temp,',',comma_num);

+		comma_num = 6;

+

+		memset(mem, 0x00, len);

+		if(temp == NULL)

+			return AT_END;

+		parse_param2("%d,%s,%s,%s,%s,%s", temp, p);

+		idx = cid-1;

+		if(idx < 0 || idx >  CID_MAX_NUM-1)

+		{

+			softap_assert("");	

+			return AT_END;

+		}

+		pdpinfo_init(cid);

+		act_info = &g_pdpinfo_mng[idx].pdpInfo->act_info;

+

+        // ModemÉϱ¨µØÖ·¸ñʽ: 4λ10½øÖÆIPV4£¬ÀýÈç: 4.4.4.4

+        if(strcmp("IP", type) == 0)

+        {

+        	int index = 0;

+			char *str_ip[4] = {act_info->ip, act_info->gateway, act_info->pri_dns, act_info->sec_dns};

+            act_info->ip46flag = V4_VALID;

+

+			for(index = 0; index < 4; index++)

+			{

+				memcpy(str_ip[index], p[index+2], IPV4ADDLEN_MAX);

+			}

+        }

+        // ModemÉϱ¨µØÖ·¸ñʽ: 16λ10½øÖÆIPV6£¬ÀýÈç: 16.16.16.16.16.16.16.16.16.16.16.16.16.16.16.16

+        else if(strcmp("IPV6", type) == 0 || strcmp("IPv6", type) == 0)

+        {

+            int index = 0;

+			char *str_ip6[4] = {act_info->ip6, act_info->gateway6, act_info->pri_dns6, act_info->sec_dns6};

+            act_info->ip46flag = V6_VALID;

+

+			for(index = 0; index < 4; index++)

+			{

+				get_format_ipv6(p[index+2], str_ip6[index], IPV6ADDLEN_MAX);

+			}

+        }

+        // ModemÉϱ¨µØÖ·¸ñʽ: 4λ10½øÖÆIPV4.16λ10½øÖÆIPV6¡¾IPV4ÓëIPV6ÓÃ.¸ô¿ª¡¿£¬ÀýÈç: 4.4.4.4.16.16.16.16.16.16.16.16.16.16.16.16.16.16.16.16

+        else if(strcmp("IPV4V6", type) == 0 || strcmp("IPv4v6", type) == 0)

+        {

+            int index = 0;

+			char * v6_start = NULL;

+			char *str_ip[4] = {act_info->ip, act_info->gateway, act_info->pri_dns, act_info->sec_dns};

+			char *str_ip6[4] = {act_info->ip6, act_info->gateway6, act_info->pri_dns6, act_info->sec_dns6};

+            act_info->ip46flag = V46_VALID;

+

+			for(index = 0; index < 4; index++)

+			{

+				v6_start = get_param_by_symbol(p[index+2], '.', 4);

+				memcpy(str_ip[index], p[index+2], (int)(v6_start - p[index+2] -1));

+				get_format_ipv6(v6_start, str_ip6[index], IPV6ADDLEN_MAX);

+			}

+        }

+        else

+        {

+            act_info->ip46flag = V4V6_INVALID;

+        }

+		{

+			if(cid_reserved&(1<<(cid-1)))

+				fwd_pdpact_proc(cid); 

+		}

+

+    }

+	free(mem);

+	mem = NULL;

+    return AT_END;

+}

+//ֻʣ¶ÏÍø¿Ú¹¦ÄÜ£¬ÆðÍø¿Ú¹¦ÄÜ×ß²»µ½

+int cgact_fwd_ok_act(char *at_paras, struct at_context *context)

+{

+    int state = 0, cur_cid = 0;

+    char LanEnable[CID_LEN_MAX] = {0};

+    void *p[2] = {&state, &cur_cid};

+

+    parse_param2("%d,%d", (char *)context->app_param, p);

+    at_print(AT_DEBUG,"state: %d, cur_cid = %d\n", state, cur_cid);

+    if(state == 1)

+    {

+		//±íÃ÷µ±Ç°ÒѾ­½ÓÊÕµ½OK

+		if(0 == (cid_reserved & (1<<(cur_cid-1))))

+		{

+			softap_assert("");

+		}

+		g_pdpinfo_mng[cur_cid-1].fwd_info.cgact_ok = 1;

+    }

+    else

+    {

+        if(cur_cid > 0 && g_pdpinfo_mng[cur_cid-1].pdpInfo != NULL)

+        {

+            pdpinfo_reset(cur_cid);

+			int idx = get_idx_bycid(cur_cid);

+			if(idx < 0)

+				return AT_END;

+			CID_ARRAY[idx].state = CID_IDLE;

+        }

+    }

+    return AT_END;

+}

+

+int cgact_fwd_err_act(char *at_paras, struct at_context *context)

+{

+    //softap_assert("");

+    return AT_END;

+}

+//Ô¤ÁôCID²¦ºÅ½öÔÚAP²àʹÓã¬CP²àÖ±½Ó½Ø×¡²¢·µ»ØÏê¼ûzgact_req_rcv_act

+int zgact_fwd_ok_act(char *at_paras, struct at_context *context)

+{

+    int state = 0, cur_cid = 0;

+    char LanEnable[CID_LEN_MAX] = {0};

+    void *p[2] = {&state, &cur_cid};

+

+    parse_param2("%d,%d", (char *)context->app_param, p);

+

+    if(state == 1)

+    {

+		//±íÃ÷µ±Ç°ÒѾ­½ÓÊÕµ½OK

+		g_pdpinfo_mng[cur_cid-1].fwd_info.zgact_ok = 1;

+		fwd_pdpact_proc(cur_cid);

+    }

+    else

+    {

+        if(cur_cid > 0 && g_pdpinfo_mng[cur_cid-1].pdpInfo != NULL)

+        {

+            pdpinfo_reset(cur_cid);

+			int idx = get_idx_bycid(cur_cid);

+			if(idx < 0)

+				return AT_END;

+			CID_ARRAY[idx].state = CID_IDLE;

+        }

+        else

+        {

+            at_print(AT_DEBUG,"can not deact pdp!!!\n");

+        }

+    }

+    return AT_END;

+}

+

+int zgact_fwd_err_act(char *at_paras, struct at_context *context)

+{

+    return AT_END;

+}

+

+

+int cgdcont_ok_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    //at_print(AT_DEBUG,"cgdcont_ok_act state=%d\n",psinfo.cgdcont_state);

+    char *at_next = NULL;

+    if(context->msg_id == MSG_CMD_PDP_ACT_REQ)

+    {

+    	PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)(context->app_param);

+		int auth_type = private_info->pdpActInfo.comm_info.auth_type;

+		//¼Ç¼µ±Ç°ÈÏÖ¤ÐÅÏ¢

+		int idx = get_idx_bycid(private_info->c_id);

+		if(idx < 0)

+		{

+			softap_assert("");

+			return AT_END;

+		}

+		CID_ARRAY[idx].auth_type = auth_type;

+

+		if(private_info->auth_state == PDP_DEL_AUTH)

+		{

+			at_next=(char *)malloc(PDP_CMD_LEN);

+	        if(at_next == NULL){

+				softap_assert("");

+				return AT_END;

+			}

+	        memset(at_next, 0, PDP_CMD_LEN);

+			sprintf(at_next,"AT+ZGPCOAUTH=%d\r\n",private_info->c_id);

+		}

+		else

+		{

+			at_next = build_pdpact_cmd(private_info,&private_info->pdpActInfo);

+			//free(private_info->pdpActInfo);

+			//private_info->pdpActInfo = NULL;

+		}

+		*next_req = at_next;

+		if(*next_req){

+		*next_len = strlen(*next_req);

+		return  AT_CONTINUE;

+		}

+    }

+    else if(context->msg_id == MSG_CMD_APN_SET_REQ)

+    {//ûËѵ½ÍøÔòÒªÁ¢¼´ÅäÖÃAPN£¬autoapnºÍwebuiÅäÖÃʱÓÐЧ

+        *next_req = normal_getzgpcoauthset(1);

+		if(*next_req){

+        *next_len = strlen(*next_req);

+        return  AT_CONTINUE;

+		}

+	}

+    else

+    {

+        *next_req = normal_getzgpcoauthset(default_cur_cid);

+		if(*next_req){

+        *next_len = strlen(*next_req);

+        return  AT_CONTINUE;

+		}

+    }

+    return AT_END;

+}

+

+int cgdcont_err_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    if(context->msg_id == MSG_CMD_PDP_ACT_REQ)

+    {

+		//pdp¼¤»îÇëÇóÖУ¬Ð¯´øµÄapn²»ºÏ·¨Ê±£¬Ö±½Ó»Ø¸´error

+		int cur_cid = 0;

+		int idx = 0;

+		PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+		cur_cid = private_info->c_id;

+

+		idx = get_idx_bycid(cur_cid);

+

+		if(idx < 0)

+		{

+			softap_assert("");

+			return AT_END;

+		}

+		//apnÉèÖóö´í£¬Ôò˵Ã÷µ±Ç°apnÓÐÎÊÌ⣬ÐèÒªÇå³ýµô

+

+		memset(CID_ARRAY[idx].apn ,0x00, APN_MAX_LEN);

+		memset(CID_ARRAY[idx].ip_type, 0x00, IPTYPE_MAX_LEN);

+

+		pdpact_failed_proc(at_paras,context,idx, next_req, next_len);

+    }

+    else if(context->msg_id != MSG_CMD_APN_SET_REQ)

+    {

+        cfg_set(NV_MODEM_MAIN_STATE,"modem_syscfg_exption");

+        *next_req = normal_getzgpcoauthset(default_cur_cid);

+		if(*next_req){

+        *next_len = strlen(*next_req);

+        return  AT_CONTINUE;

+		}

+    }

+    return  AT_END;

+}

+

+int cgdcont_req_rcv_act(char *at_paras,int at_fd,struct at_context *context)

+{

+    char* err_str = NULL;

+    at_print(AT_DEBUG, "at_paras = %s\n", at_paras);

+

+    int c_id = 0;

+    E_AT_PARSE eParseResult = AT_PARSE_SUCCESS;

+

+	context->app_param= malloc(strlen(at_paras)+1);

+	if(context->app_param == NULL)

+		return AT_END;

+	memset(context->app_param, 0x00, strlen(at_paras)+1);

+	strcpy(context->app_param, at_paras);

+

+    eParseResult = get_at_cmd_param_int(at_paras, &c_id, &at_paras);

+	if(c_id > INT_MAX -1) // KW 3

+	{

+	    c_id = INT_MAX;

+	}

+

+    if(AT_PARSE_SUCCESS != eParseResult)

+    {

+        err_str = at_err_build(ATERR_PARAM_INVALID);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+    at_print(AT_DEBUG, "c_id == %d\n", c_id);

+#if 1 // cov M BAD_SHIFT

+    if (c_id > 0 && c_id <= CID_MAX_NUM && (cid_reserved & (1<<(c_id-1))) == 0 )

+#else

+    if ((cid_reserved & (1<<(c_id-1))) == 0 && c_id > 0 && c_id <= CID_MAX_NUM)

+#endif		

+    {

+        err_str = at_err_build(ATERR_NOT_ALLOWED);

+        at_write(context->at_channel->at_fd, err_str, strlen(err_str));

+        free(err_str);

+        return AT_END;

+    }

+	return AT_CONTINUE;

+}

+

+//¸ù¾Ý×Ö·û´®£¬»ñÈ¡apnºÍiptypeÉèÖÃ,Ô­ÔòÊÇÖ±½ÓÌáȡǰÁ½¸ö""ÖеÄ×Ö·û´®,µ«ÊÇÈç¹û½öÓÐip_type£¬Ò²ÊÇÕý³£ÃüÁî

+int get_apn_param(char *param, char *apn, int apn_len, char *iptype, int iptype_len)

+{

+    char *apn_start 	= NULL;

+	char *apn_end   	= NULL;

+	char *iptype_start  = NULL;

+	char *iptype_end	= NULL;

+

+    iptype_start = strchr(param, '"');

+	if(NULL == iptype_start)//ûÓÐÕÒµ½Ë«ÒýºÅµÄ»°£¬ËµÃ÷ÊÇcgdcontµÄÈ¡ÏûÉÏÏÂÎÄÃüÁÕâÀï²»×ö¼à¿Ø

+	{

+		return -1;

+	}

+	iptype_end = strchr(iptype_start+1, '"');

+	if(NULL == iptype_end)

+	{

+		return -1;

+	}

+	if((iptype_end - iptype_start) > iptype_len)

+	{

+		return -1;

+	}

+	strncpy(iptype, iptype_start+1, (int)(iptype_end - iptype_start -1));//Ê×ÏȶÔip_type½øÐи³Öµ

+

+	apn_start = strchr(iptype_end+1, '"');

+	if(NULL == apn_start)//ûÓÐÕÒµ½Ë«ÒýºÅµÄ»°£¬ËµÃ÷ÊÇcgdcontÃüÁîÖнö¶Ôip_type½øÐÐÉèÖã¬ÔòapnÊÓΪ¿Õ£¬ÊôÓÚÕý³£Çé¿ö

+	{

+		return 0;

+	}

+	apn_end = strchr(apn_start+1, '"');

+	if(NULL == apn_end)

+	{

+		return -1;

+	}

+    if((apn_end - apn_start) > apn_len)

+    {

+		return -1;

+	}

+	strncpy(apn, apn_start+1, (int)(apn_end - apn_start -1));//¶Ôapn½øÐи³Öµ

+

+	return 0;

+}

+

+//¸üÐÂÁÐ±íµ±ÖеÄapn¼Ç¼£¬±£Ö¤¾ßÓÐmodemºËµÄapn¼Ç¼ʵʱÐÔ£¬Ö§³Ö½öÓÐcidºÍip_typeµÄcgdcontÃüÁ´ËʱapnΪ¿Õ

+int cgdcont_fwd_ok_act(char *at_paras, struct at_context *context)

+{

+	char apn[APN_MAX_LEN] = {0};

+	char ip_type[IPTYPE_MAX_LEN] = {0};

+	char c_id[4] = {0};

+	int idx = 0;

+	char *strch = NULL;

+

+	at_paras = context->app_param;

+

+	at_print(AT_DEBUG, "wzf:Enter cgdcont_fwd_ok_act\n");

+	if(get_apn_param(at_paras,apn,APN_MAX_LEN,ip_type,IPTYPE_MAX_LEN) < 0)

+	{

+#ifdef HAVE_MODEM_IN_CORE	 

+		int cid = atoi(at_paras);

+		if(cid > 0 && cid <= CID_MAX_NUM)

+		{//È¥¶¨ÒåcgdcontʱÇå³ý

+			if(CID_ARRAY[cid-1].state != CID_IDLE){softap_assert("");}

+			memset(CID_ARRAY[cid-1].apn ,0x00, APN_MAX_LEN);

+			memset(CID_ARRAY[cid-1].ip_type, 0x00, IPTYPE_MAX_LEN);

+		}

+#endif		

+		free(at_paras);

+		context->app_param = NULL;

+		return AT_END;	

+	}

+

+    strch = strchr(at_paras, ',');

+	if((strch-at_paras)>0&&(strch-at_paras)<4){

+		snprintf(c_id,(int)(strch-at_paras+1),"%s",at_paras);

+    //strncpy(c_id, at_paras, (int)(strch-at_paras));

+	}

+#ifdef HAVE_MODEM_IN_CORE	 

+	idx= get_idx_bycid(atoi(c_id));

+	at_print(AT_DEBUG, "cid:%d, idx:%d\n", atoi(c_id),idx);

+	if(idx < 0)

+	{

+		free(at_paras);

+		context->app_param = NULL;

+		return AT_END;

+	}

+	at_print(AT_DEBUG, "apn:%s, ip_type:%s, cid:%d\n", apn, ip_type, atoi(c_id));

+

+    if(CID_ARRAY[idx].state != CID_IDLE){softap_assert("");}

+

+	memcpy(CID_ARRAY[idx].apn, apn, APN_MAX_LEN);

+	memcpy(CID_ARRAY[idx].ip_type, ip_type, IPTYPE_MAX_LEN);

+#endif

+	free(at_paras);

+	context->app_param = NULL;

+	return AT_END;

+}

+

+int cgdcont_fwd_err_act(char *at_paras, struct at_context *context)

+{

+	free(context->app_param);

+	context->app_param = NULL;

+	return AT_END;

+}

+

+

+int zgpcoauth_ok_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"zgpcoauth_ok_act msg_id=%x\n",context->msg_id);

+    char *at_next = NULL;

+    if(context->msg_id == MSG_CMD_PDP_ACT_REQ)    

+	{

+    	PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)(context->app_param);

+		struct pdp_act_req *p_setInfo = (struct pdp_act_req *)(&private_info->pdpActInfo);

+		int auth_type = p_setInfo->comm_info.auth_type;

+		//¼Ç¼µ±Ç°ÈÏÖ¤ÐÅÏ¢

+		int idx = get_idx_bycid(private_info->c_id);

+		if(idx < 0)

+			return AT_END;

+		CID_ARRAY[idx].auth_type = auth_type;

+

+		at_next=(char *)malloc(PDP_CMD_LEN);

+        if(at_next == NULL){

+			softap_assert("");

+			return AT_END;

+		}

+        memset(at_next, 0, PDP_CMD_LEN);

+		if(auth_type == NONE_AUTH || PPP_NONE_AUTH == auth_type || private_info->auth_state == PDP_ADD_AUTH)

+		{

+			snprintf(at_next,PDP_CMD_LEN, "at+cgdcont=%d,\"%s\",\"%s\",,,,,%d,%d,%d\r\n", private_info->c_id, p_setInfo->comm_info.ip_type, 

+			p_setInfo->comm_info.apn, p_setInfo->volte_param1, p_setInfo->volte_param2, p_setInfo->volte_param3);

+			private_info->auth_state = PDP_ADD_AUTH;			

+		}

+		else if((PAP_AUTH == auth_type || CHAP_AUTH == auth_type || PAP_CHAP_AUTH == auth_type) && private_info->auth_state == PDP_DEL_AUTH)

+		{

+			//Ìí¼ÓÈÏÖ¤ÏûÏ¢£¬ÈÏÖ¤³É¹¦ºó£¬½øÐÐcgact²¦ºÅ

+			private_info->auth_state = PDP_ADD_AUTH;

+			snprintf(at_next,PDP_CMD_LEN,"AT+ZGPCOAUTH=%d,\"%s\",\"%s\",%d\r\n", private_info->c_id, p_setInfo->comm_info.username, p_setInfo->comm_info.password, p_setInfo->comm_info.auth_type);

+		}

+        else if(PPP_CHAP_AUTH == auth_type)

+        {

+        	char strPwd[66*2]  = {0};

+    		char strChallenge[60*2] = {0};

+			//Ìí¼ÓÈÏÖ¤ÏûÏ¢£¬ÈÏÖ¤³É¹¦ºó£¬½øÐÐcgact²¦ºÅ

+			private_info->auth_state = PDP_ADD_AUTH;

+            bytes2string((unsigned char*)p_setInfo->comm_info.password,strPwd,strlen(p_setInfo->comm_info.password));

+            bytes2string((unsigned char*)p_setInfo->comm_info.challenge,strChallenge,strlen(p_setInfo->comm_info.challenge));

+            at_print(AT_ERR, "CHAP pw=%s,challenge=%s",strPwd,strChallenge);

+            snprintf(at_next,PDP_CMD_LEN,"AT+ZGPCOCHAP=%d,\"%s\",%s,%s\r\n", private_info->c_id, p_setInfo->comm_info.username, strChallenge, strPwd);

+		}

+		else

+		{

+			softap_assert("");

+		}

+

+		*next_req = at_next;

+		*next_len = strlen(*next_req);

+		return  AT_CONTINUE;

+    }

+

+

+    return AT_END;

+}

+

+int zgpcoauth_err_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+

+        case MSG_CMD_PDP_ACT_REQ:

+        {

+	   	   PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+	   	   int idx = get_idx_bycid(private_info->c_id);

+           pdpact_failed_proc(at_paras,context,idx, next_req, next_len);

+        }

+    }

+    return AT_END;

+}

+

+int zgpcochap_ok_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    at_print(AT_DEBUG,"zgpcochap_ok_act msg_id=%x\n",context->msg_id);

+    char *at_next = NULL;

+

+	if(context->msg_id == MSG_CMD_PDP_ACT_REQ)

+	{

+		PDP_PRIVATE_INFO *private = (PDP_PRIVATE_INFO *)(context->app_param);

+		struct pdp_act_req *p_setInfo = (struct pdp_act_req *)(&private->pdpActInfo);

+		int cur_cid = private->c_id;

+		at_next=(char *)malloc(AT_CMD_MAX);

+		if(at_next == NULL){

+			softap_assert("");

+			return AT_END;

+		}

+		memset(at_next, 0, AT_CMD_MAX);

+		if(PDP_ADD_AUTH == private->auth_state)

+		{

+			sprintf(at_next, "at+cgdcont=%d,\"%s\",\"%s\",,,,,%d,%d,%d\r\n", cur_cid, p_setInfo->comm_info.ip_type, 

+			p_setInfo->comm_info.apn, p_setInfo->volte_param1, p_setInfo->volte_param2, p_setInfo->volte_param3);

+		}

+		else

+		{

+			softap_assert("");

+		}

+        *next_req = at_next;

+	    *next_len = strlen(*next_req);

+		return	AT_CONTINUE;

+	}

+

+    return AT_END;

+}

+int zgpcochap_err_act(char *at_paras,struct at_context *context,void **next_req,int *next_len)

+{

+    switch(context->msg_id)

+    {

+       case MSG_CMD_PDP_ACT_REQ:

+       {

+           PDP_PRIVATE_INFO *private_info = (PDP_PRIVATE_INFO *)context->app_param;

+	   	   int idx = get_idx_bycid(private_info->c_id);

+           pdpact_failed_proc(at_paras,context,idx, next_req, next_len);

+       }

+    }

+    return AT_END;

+}

+

+//#if (APP_OS_TYPE == APP_OS_TOS)

+/*char *zphone_dataswitchon_act(void *msg,struct at_context *context)

+{

+	char *at_str = NULL;

+	char *p_ipdns = NULL;

+	char *str =  (((MSG_BUF *)msg)->aucDataBuf);

+	int cur_cid = atoi(str);

+	struct pdp_active_info *info = g_pdpinfo_mng[cur_cid-1].pdpInfo;

+    if(info == NULL)

+    {

+    	at_print(AT_ERR,"zphone_dataswitchon_act: pdpinfo is null, cid %d is deacted by core network\n");

+		return NULL;

+	}

+

+	p_ipdns = malloc(512);

+	if(NULL == p_ipdns) softap_assert("");

+	memset(p_ipdns, 0x00, 512);

+

+	build_ipdns_param(p_ipdns, info);

+	at_str = at_act_build("ZNETIFUP", p_ipdns);

+

+	free(p_ipdns);

+	if(NULL == at_str) softap_assert("");

+

+	at_print(AT_ERR,"zphone_dataswitchon_act: begin to up AP network, at_str = %s\n", at_str);

+

+    return  at_str;

+

+}*/

+/*

+char *zphone_dataswitchoff_act(void *msg,struct at_context *context)

+{

+	char *at_str = NULL;

+    char *str =  (((MSG_BUF *)msg)->aucDataBuf);

+	at_str = at_act_build("ZNETIFDOWN", str);

+

+	at_print(AT_ERR,"zphone_dataswitchoff_act: begin to down AP network, at_str = %s\n", at_str);

+    return  at_str;

+

+}*/

+/*char *set_defualt_apn_to_other_core(void *msg,struct at_context *context)

+{

+    char *at_str = NULL;

+

+    at_str = (char *)malloc(80);

+    if(at_str == NULL){softap_assert("");}

+	memset(at_str, 0, 80);

+ 	memset(g_defcid_mng.default_apn, 0, sizeof(g_defcid_mng.default_apn));

+	cfg_get_item("default_apn", g_defcid_mng.default_apn, sizeof(g_defcid_mng.default_apn));  

+    //sprintf(at_str, "at+znvset=default_apn,%s\r\n",g_defcid_mng.default_apn);

+	sprintf(at_str, "default_apn,%s",g_defcid_mng.default_apn);

+	send_otherside_atctl_req(FAR_PS, MSG_CMD_SETNV_TO_AP, strlen(at_str), at_str);

+

+	return at_str;

+}*/

+//#endif

+//#if (APP_OS_TYPE == APP_OS_LINUX)

+/*char *set_defualt_apn_to_other_core(void *msg,struct at_context *context)

+{

+    char *at_str = NULL;

+

+    at_str = (char *)malloc(80);

+    if(at_str == NULL){softap_assert("");}

+	memset(at_str, 0, 80);

+ 	memset(g_defcid_mng.default_apn, 0, sizeof(g_defcid_mng.default_apn));

+	cfg_get_item("default_apn", g_defcid_mng.default_apn, sizeof(g_defcid_mng.default_apn));  

+    sprintf(at_str,"AT+ZDEFAULTAPN=\"%s\"\r\n", g_defcid_mng.default_apn);

+    return at_str;

+}*/

+

+//int znetifup_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+#ifdef MULTI_CPU

+void znetifup_proc(char *at_paras)

+{

+	int cid = 0;

+

+	at_print(AT_DEBUG,"znetifup_req: begin to up network, at_paras = %s\n", at_paras);

+

+    cid = parse_ipdns_param(at_paras);

+	if(cid > 0 && cid<= CID_MAX_NUM)

+	pdp_act_proc_for_module(g_pdpinfo_mng[cid-1].pdpInfo, PDP_NORMAL);

+

+	cfg_set(NV_PDP_STATUS, "1");

+   	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_ISMS, MSG_CMD_PDP_STATUS_IND, 2, "1", 0);

+   	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_DMREG, MSG_CMD_PDP_STATUS_IND, 2, "1", 0);

+	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_SAFECARE, MSG_CMD_PDP_STATUS_IND, 2, "1", 0);

+}

+

+

+//int znetifdown_req(int at_fd, char *at_paras,void ** res_msg, int *res_msglen)

+void znetifdown_proc(char *at_paras)

+{

+	char temp[2] = {0};

+	temp[0]=at_paras[0];

+

+	int c_id = atoi(temp);

+

+	at_print(AT_DEBUG,"znetifdown_req: begin to down network, at_paras = %d\n", c_id);

+

+	pdpinfo_reset(c_id);

+

+	cfg_set(NV_PDP_STATUS, "0");

+	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_ISMS, MSG_CMD_PDP_STATUS_IND, 2, "0", 0);

+	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_DMREG, MSG_CMD_PDP_STATUS_IND, 2, "0", 0);

+	ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_SAFECARE, MSG_CMD_PDP_STATUS_IND, 2, "0", 0);

+}

+#endif

+//#endif

+//ÖØÐ·¢Æðpdp¼¤»î

+int proc_pdpreconnect_req()

+{

+	//MSG_BUF *msg_buf = NULL;

+	//char creg_stat[20] = {0};

+	char ppp_status[20] = {0};

+	//int ret = 0;

+	/*cfg_get_item("creg_stat", creg_stat, sizeof(creg_stat));

+	at_print(AT_DEBUG,"@@@@@@@@@@@@@proc_pdpreconnect_req creg stat=%s!\n",creg_stat);

+	if(1 != atoi(creg_stat) && 5 != atoi(creg_stat))

+	{

+		return 0 ;

+	}*/

+	char creg_stat[20] = {0};

+	char cereg_stat[20] = {0};

+

+	cfg_get_item("cgreg_stat", creg_stat, sizeof(creg_stat));

+	cfg_get_item("cereg_stat", cereg_stat, sizeof(cereg_stat));

+	at_print(AT_DEBUG,"@@@@@@@@@@@@@proc_pdpreconnect_req  creg stat=%s, cereg stat=%s!\n",creg_stat,cereg_stat);

+	//zpr 1218 CS&EPS¶¼×¢²áʧ°Ü£¬²»·¢Æð

+	if(1 != atoi(creg_stat) && 5 != atoi(creg_stat) && 1 != atoi(cereg_stat) && 5 != atoi(cereg_stat))

+	{

+		return 0;

+	}

+

+	if((0 == check_is_fd(g_defcid_mng.modid)) && (g_defcid_mng.modid != 0))

+	{

+		cfg_get_item(NV_PPP_STATUS, ppp_status, sizeof(ppp_status));

+		if(0 == strcmp(PPP_DISCONNECTED, ppp_status))

+		{

+			//À´×ÔÓÚweb ui»òÕßÖ÷¿ØµÄpdp¼¤»î£¬ÏûÏ¢ÄÚÈݳ¤¶ÈΪ0£¬ÄÚÈÝΪ¿Õ£¬ÕâÀï×öÌØÊâ¶¨ÖÆ

+			if(g_defcid_mng.modid == MODULE_ID_WEB_CGI || g_defcid_mng.modid == MODULE_ID_MAIN_CTRL)

+				ipc_send_message(g_defcid_mng.modid, MODULE_ID_AT_CTL, MSG_CMD_PDP_ACT_REQ, 0, NULL, IPC_NOWAIT);

+			else

+				ipc_send_message(g_defcid_mng.modid, MODULE_ID_AT_CTL, MSG_CMD_PDP_ACT_REQ, sizeof(struct pdp_act_req), (unsigned char *)g_defcid_mng.set_info, IPC_NOWAIT);

+

+			//free(msg_buf);

+			//msg_buf = NULL;

+		}

+	}

+	return 0;

+

+}

+

+void start_pdp_auto_dial(void)

+{

+	char auto_reconnect [20] = {0};

+	char reconnect_type[20] = {0};

+

+	cfg_get_item("reconnect_type", reconnect_type, sizeof(reconnect_type));

+	cfg_get_item("auto_reconnect", auto_reconnect, sizeof(auto_reconnect));

+	//µ±Ç°Ä¬ÈÏapnµÄpdp¼¤»îÇëÇóÒÑ´æÔÚ£¬Ôò˵Ã÷ĬÈÏapn¿Ï¶¨ÒѾ­·¢Æð¹ýpdp¼¤»î

+	at_print(AT_DEBUG,"@@@@@@@@@@@@@start_pdp_auto_dial g_pdp_set_info=0x%p, auto_connect is %s!\n",g_defcid_mng.set_info, auto_reconnect);

+	if((0 == check_is_fd(g_defcid_mng.modid)) && 0 == strcmp(auto_reconnect,"1"))

+	{

+		at_print(AT_DEBUG,"@@@@@@@@@@@@@start_pdp_auto_dial: apn is %s, modid is %x!\n", g_defcid_mng.set_info->comm_info.apn, g_defcid_mng.modid);

+		//ÊÕµ½×¤Íø³É¹¦ºó£¬ÉèÖÃÒ»¸ö5s¶¨Ê±Æ÷£¬³¬Ê±ºó½øÐÐpdp²¦ºÅÇëÇó

+		if(0 == strcmp(reconnect_type,"simple"))

+		{

+			MSG_BUF *msg_buf = NULL;

+			char ppp_status[20] = {0};

+			cfg_get_item(NV_PPP_STATUS, ppp_status, sizeof(ppp_status));

+			if(0 == strcmp(PPP_DISCONNECTED, ppp_status))

+			{

+				set_pppstatus(PPP_CONNECTING);

+				msg_buf=normal_getmsg(g_defcid_mng.modid ,MODULE_ID_AT_CTL,MSG_CMD_PDP_ACT_REQ,sizeof(struct pdp_act_req), (unsigned char *)g_defcid_mng.set_info);

+				rcv_msg_proc(msg_buf);

+				free(msg_buf);

+				msg_buf = NULL;

+			}

+		}

+		else

+		{

+			at_timeout_reset_pdpreconn_time();

+			at_timeout_start_pdpreconn_timer();	

+		}

+	}

+}

+//int g_flag =0;

+

+int cgdcont_auto_act(char *at_paras ,int is_query_report)

+{

+	char versionmode[2] = {0};

+	cfg_get_item("version_mode", versionmode, sizeof(versionmode));

+

+	//·ÇоƬÈÏÖ¤°æ±¾£¬¶ÔÓÚat+cgdcont?ÃüÁî²»×ö½âÎö

+	//g_flag++;

+	if(0 == strcmp(versionmode, "0"))

+		return AT_END;

+

+	char apn[APN_MAX_LEN] = {0};

+	char ip_type[IPTYPE_MAX_LEN] = {0};

+	int c_id = 0;

+	int idx = 0;

+	void *p[] = {&c_id,ip_type,apn};

+	//g_flag++;

+

+	int ret = parse_param("%d,%s,%s",at_paras,p);

+	if (ret != AT_PARSE_OK)

+		return AT_END;

+

+	idx= get_idx_bycid(c_id);

+	if(idx < 0)

+		return AT_END;

+	memcpy(CID_ARRAY[idx].apn, apn, APN_MAX_LEN);

+	memcpy(CID_ARRAY[idx].ip_type, ip_type, IPTYPE_MAX_LEN);

+	return AT_END;

+}

+

+char *start_query_cgcontrdp(void *msg,struct at_context *context)

+{

+	char *at_next=NULL;

+	at_next=malloc(64);

+	if(at_next == NULL){

+		softap_assert("");

+		return NULL;

+	}

+	memset(at_next,0,64);

+	sprintf(at_next,"AT+CGCONTRDP=%d\r\n",def_attach_cid_index+1);

+	return at_next;

+}

+

+int cgcontrdp_auto_act(char *at_paras ,int is_query_report)

+{

+	int ret = 0;

+	int cid,bearid;

+	char apn[256]= {0};

+	void *p[3] = {&cid, &bearid, apn};

+	at_print(AT_ERR,"@@!!@@cgcontrdp_auto_act at_paras=%s!\n",at_paras);

+	ret = parse_param("%d,%d,%255s", at_paras, p);

+	if (ret != AT_PARSE_OK)

+		return AT_END;

+	if(at_strstr(apn,"ims") != NULL)

+	{

+		apn_is_ims = 1;

+	}

+	else

+	{

+		apn_is_ims = 0;

+	}

+	at_print(AT_ERR,"@@!!@@cgcontrdp_auto_act ims=%d cid=%d apn=%s!\n",apn_is_ims,cid,apn);

+	return AT_END;

+}

+

+int cgcontrdp_err_act(char *at_str,struct at_context *context,void **next_req,int *next_len)

+{

+	apn_is_ims = 0;

+	return AT_END;

+}

+

+

+

diff --git a/lynq/MD310EU/ap/app/zte_comm/schedule_restart/Makefile b/lynq/MD310EU/ap/app/zte_comm/schedule_restart/Makefile
new file mode 100755
index 0000000..096ce19
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/schedule_restart/Makefile
@@ -0,0 +1,41 @@
+#*******************************************************************************
+# include ZTE application makefile
+#*******************************************************************************
+include $(COMMON_MK)
+
+##############USER COMIZE BEGIN################
+EXEC = schedule_restart
+OBJS = schedule_restart.o 
+
+CFLAGS += -I$(zte_app_path)/include
+CFLAGS += -I$(zte_lib_path)/libnvram
+CFLAGS += -I$(zte_lib_path)/libsqlite
+CFLAGS += -I$(zte_lib_path)/libsoftap
+CFLAGS += -g
+CFLAGS += -g -Werror=implicit-function-declaration
+
+ifeq ($(CUSTOM_MODEL), MF29S2)
+CFLAGS	+= -DCUSTOM_VERSION_MF29S2_ZTE
+endif 
+
+LDLIBS = -lpthread -lm
+LDLIBS += -lnvram -L$(zte_lib_path)/libnvram
+LDLIBS += -lsoftap -L$(zte_lib_path)/libsoftap
+LDLIBS  += -lsoft_timer -L$(zte_lib_path)/libsoft_timer
+
+##############USER COMIZE END##################
+
+#*******************************************************************************
+# targets
+#*******************************************************************************
+all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LDLIBS) -Wl,--end-group
+	@cp $@ $@.elf
+
+romfs:
+	$(ROMFSINST) $(EXEC) /bin/$(EXEC)
+
+clean:
+	-rm -f $(EXEC) *.elf *.gdb *.o
diff --git a/lynq/MD310EU/ap/app/zte_comm/schedule_restart/schedule_restart.c b/lynq/MD310EU/ap/app/zte_comm/schedule_restart/schedule_restart.c
new file mode 100755
index 0000000..b1e5843
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/schedule_restart/schedule_restart.c
@@ -0,0 +1,142 @@
+#include "schedule_restart.h"

+

+void cfg_get_sntp_time(sntp_time * s_time)

+{

+    char sntp_nv_value[20] = {0};

+    if(!s_time)

+    {

+        return;

+    }

+

+    cfg_get_item("sntp_process_result", s_time->result, sizeof(s_time->result));

+

+    if(0 == strcmp("success", s_time->result))

+    {

+        cfg_get_item("sntp_day", sntp_nv_value, sizeof(sntp_nv_value));

+        s_time->day = atoi(sntp_nv_value);

+

+        cfg_get_item("sntp_hour", sntp_nv_value, sizeof(sntp_nv_value));

+        s_time->hour = atoi(sntp_nv_value);

+

+        cfg_get_item("sntp_minute", sntp_nv_value, sizeof(sntp_nv_value));

+        s_time->minute = atoi(sntp_nv_value);

+

+        cfg_get_item("sntp_weekday", s_time->weekday, sizeof(s_time->weekday));

+    }

+    

+    return;

+}

+

+void cfg_get_schedule_restart_config(schedule_restart_config * config)

+{

+    char schedule_restart_nv_value[20] = {0};

+    if(!config)

+    {

+        return;

+    }

+

+    cfg_get_item("schedule_restart_enable", schedule_restart_nv_value, sizeof(schedule_restart_nv_value));

+    config->enable = atoi(schedule_restart_nv_value);

+

+    if(config->enable)

+    {

+        cfg_get_item("schedule_restart_option", schedule_restart_nv_value, sizeof(schedule_restart_nv_value));

+        if(0 == strcmp("everyweek", schedule_restart_nv_value))

+        {

+            config->option = EVERY_WEEK;

+        }

+        else if(0 == strcmp("everymonth", schedule_restart_nv_value))

+        {

+            config->option = EVERY_MONTH;

+        }

+        else if(0 == strcmp("everyday", schedule_restart_nv_value))

+        {

+            config->option = EVERY_DAY;

+        }

+

+        cfg_get_item("schedule_restart_day", schedule_restart_nv_value, sizeof(schedule_restart_nv_value));

+        config->day = atoi(schedule_restart_nv_value);

+

+        cfg_get_item("schedule_restart_hour", schedule_restart_nv_value, sizeof(schedule_restart_nv_value));

+        config->hour = atoi(schedule_restart_nv_value);

+

+        cfg_get_item("schedule_restart_minute", schedule_restart_nv_value, sizeof(schedule_restart_nv_value));

+        config->minute = atoi(schedule_restart_nv_value);

+

+        cfg_get_item("schedule_restart_weekday", config->weekday, sizeof(config->weekday));

+    }

+    

+    return;

+}

+

+void get_sntp_and_schedule_info(sntp_time * s_time, schedule_restart_config * config)

+{

+    if(!s_time || !config)

+    {

+        return;

+    }

+

+    cfg_get_sntp_time(s_time);

+    cfg_get_schedule_restart_config(config);

+

+    return;

+}

+

+void send_restart_request()

+{

+    ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_MAIN_CTRL, MSG_CMD_RESTART_REQUEST, 0, NULL,0);

+

+    return;

+}

+

+void check_and_restart(const sntp_time *sntp_time, const schedule_restart_config *config)

+{

+    if(!config->enable || (0 != strcmp("success", sntp_time->result)))

+    {

+        return;

+    }

+

+    if(sntp_time->hour == config->hour && sntp_time->minute == config->minute)

+    {

+        switch(config->option) 

+        {

+            case EVERY_DAY:

+                send_restart_request();

+                break;

+            case EVERY_WEEK:

+                if(0 == strcmp(sntp_time->weekday, config->weekday)) 

+                {

+                    send_restart_request();

+                }

+                break;

+            case EVERY_MONTH:

+                if(sntp_time->day == config->day)

+                {

+                    send_restart_request();

+                }

+                break;

+        }

+    }

+

+    return;

+}

+

+void schedule_restart_proc()

+{

+    sntp_time s_time;

+    schedule_restart_config config;

+

+    while(1)

+    {

+        get_sntp_and_schedule_info(&s_time, &config);

+        check_and_restart(&s_time, &config);

+        sleep(60);

+    }

+}

+

+int schedule_restart_main(int argc, char * argv[])

+{

+    schedule_restart_proc();

+

+    return 0;

+}
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/zte_comm/schedule_restart/schedule_restart.h b/lynq/MD310EU/ap/app/zte_comm/schedule_restart/schedule_restart.h
new file mode 100755
index 0000000..c4d662f
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/schedule_restart/schedule_restart.h
@@ -0,0 +1,31 @@
+#ifndef __SCHEDULE_RESTART__

+#define __SCHEDULE_RESTART__

+

+#include "softap_api.h"

+#include "cfg_api.h"

+#include "message.h"

+

+typedef struct {

+    int day;

+    int hour;

+    int minute;

+    char weekday[4];

+    char result[20];

+} sntp_time;

+

+typedef enum {

+    EVERY_DAY,

+    EVERY_WEEK,

+    EVERY_MONTH

+} restart_option;

+

+typedef struct {

+    int enable;

+    restart_option option;

+    int day;

+    int hour;

+    int minute;

+    char weekday[4];

+} schedule_restart_config;

+

+#endif
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/zte_comm/wlan/src/wlan_config_ssid.c b/lynq/MD310EU/ap/app/zte_comm/wlan/src/wlan_config_ssid.c
new file mode 100755
index 0000000..4d61610
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/wlan/src/wlan_config_ssid.c
@@ -0,0 +1,647 @@
+#include "wlan_config_ssid.h"
+#include "wifi_hal.h"
+#include "wifi_util.h"
+#include "rtk_arch.h"
+#include "softap_api.h"
+
+
+const CHAR base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+static VOID setWifiKeyForImei (CHAR* outkey, CHAR* imeistr, UINT32 num);
+
+
+static void wlan_set_change_ssid_key_status()
+{
+	//Zssid_SendMsgFromQueue(MODULE_ID_MMI, MSG_CMD_MODIFY_SSID_KEY, 0, NULL);
+	ipc_send_message (MODULE_ID_ZSSID, MODULE_ID_MMI, MSG_CMD_MODIFY_SSID_KEY, 0, NULL, 0);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:Æ´½ÓSSID , c ΪÁ¬½Ó·û£¬numΪ¶¨ÖƵÄmacºó¼¸Î»
+***********************************************************************************/
+static INT make_user_mac (CHAR * s_mac)
+{
+	CHAR last_mac[20] = {0};
+	CHAR ssid[40] = {0};
+	CHAR m_ssid[40] = {0};
+    CHAR ssid_cmd[128] = {0};
+	CHAR sLastbyte[3] = {0};
+	CHAR imei[20] = {0};
+	CHAR buf[6] = {0};
+	INT num = 0;
+	INT i = 0;
+	int ret = 0;
+	cfg_get_item ("wifi_ssid_gen_with_mac_lastbyte", sLastbyte, 3);
+	for (i = 0; i < strlen (sLastbyte); i++) {
+		num = (sLastbyte[i] - '0') + num * 10;
+	}
+	wf_log ("make_user_mac  num = %d", num);
+	if ( (NULL == s_mac) || (num <= 0) || (num > 12)) {
+		wf_log ("make_user_mac  error..");
+		return -1;
+	}
+	/*¶ÁÈ¡SSID1 Á¬½ÓmacµØÖ·ºóËÄλ*/
+	cfg_get_item ("SSIDbak", ssid, sizeof (ssid));
+
+	wf_log ("old ssid = %s", ssid);
+
+	strcpy (&last_mac[0], &s_mac[WLAN_MAC_ADDR_LEN - num]);
+	cfg_get_item("imei", imei, sizeof(imei));
+	while(strlen(imei) < 15)
+	{
+		wf_log ("atctl did not get imei now.");
+		wf_ms_sleep (1000);
+		cfg_get_item ("imei", imei, sizeof(imei));
+	}
+	strncpy(buf, imei + strlen(imei) - 5, 5);
+	strcat (ssid, buf);
+
+	if (strlen (ssid) > 32) {
+		wf_log ("mac_len error");
+		return -1;
+	}
+
+	sprintf (m_ssid, "%s_2", ssid);
+
+	cfg_set ("SSID1", ssid);
+	cfg_set ("m_SSID", m_ssid);
+
+	cfg_set ("ssid_write_flag", "1"); //½«nvÖеıê־λÖÃ1£¬±íʾSSIDÒÑдÈë¡£
+	//cfg_save();
+	//softap_log(LOG_INFO,WIFI_PRINT,">-------------- ssid = %s", ssid);
+	wf_log (">-------------- ssid = %s", ssid);
+	wlan_set_change_ssid_key_status();
+
+	//ipc_send_message (MODULE_ID_ZSSID, MODULE_ID_AT_CTL, MSG_CMD_SSID_SET_REQ, 0, NULL, 0); //·¢ËÍÏûÏ¢¸øat server  Éϱ¨SSID
+    sprintf(ssid_cmd, "AT+SSID=%s\r", ssid);
+    ret = get_modem_info(ssid_cmd, NULL, NULL);
+	if (ret != 0) {
+		wf_log ("AT+SSID error");
+		return -1;
+	}
+
+	return 0;
+}
+
+
+static unsigned char proc_readable_ch (unsigned char in)
+{
+	if (0x30 > in) {
+		return (in % 10) + 0x30;
+	} else if (0x39 < in && 0x41 > in) {
+		return in - 7;
+	} else if (0x5A < in && 0x61 > in) {
+		return in - 6;
+	} else if (0x7A < in) {
+		return proc_readable_ch (in - 0x7A);
+	}
+	return in;
+}
+
+VOID zte_filter_charactor (char *ch)
+{
+	if ('i' == *ch) {
+		*ch = 'A';
+	} else if ('I' == *ch) {
+		*ch = 'B';
+	} else if ('l' == *ch) {
+		*ch = 'C';
+	} else if ('o' == *ch) {
+		*ch = 'D';
+	} else if ('O' == *ch) {
+		*ch = 'E';
+	} else if ('q' == *ch) {
+		*ch = 'F';
+	} else if ('0' == *ch) {
+		*ch = 'G';
+	} else if ('1' == *ch) {
+		*ch = 'H';
+	} else if ('9' == *ch) {
+		*ch = 'J';
+	}
+}
+
+static void alpha_to_digital (CHAR* key, UINT32 key_len)
+{
+	int i = 0;
+	if (NULL == key) {
+		return;
+	}
+	wf_log ("before key=%s key_len = %d", key, key_len);
+	for (i = 0; i < key_len; i++) {
+		if (key[i] < '0' || key[i] > '9') {
+			key[i] = key[i] % 10 + 0x30;
+		}
+	}
+	wf_log ("after key=%s ", key);
+}
+#ifdef WEBS_SECURITY
+static void make_password_strong(CHAR* key, UINT32 key_len)
+{
+    UINT32 rnum = 0;
+	int i = 0;
+	char punct[] = {'~', '!', '@', '#', '%', '-', '+', '_', '=', '?', '.'};
+	char tmpchar = 0;
+   
+    for (i = 0; i < key_len; i++) {
+		rnum = (key[i] - '0') + rnum * 10;
+	}
+
+    rnum = rnum % 26;
+	*(key + key_len) = 'A' + rnum;
+
+	rnum = 0;
+	for (i = 0; i < key_len; i++) {
+		rnum = (key[key_len - 1 - i] - '0') + rnum * 10;
+	}
+
+	rnum = rnum % 26;
+	*(key + key_len + 1) = 'a' + rnum;
+
+	rnum = 0;
+	for (i = 0; i < key_len / 2; i++) {
+		rnum = (key[i] - '0') + rnum * 10;
+	}
+
+	rnum = rnum % (sizeof(punct)/sizeof(punct[0]));
+	*(key + key_len + 2) = punct[rnum];
+
+	printf("make_password_strong:%s\n", key);
+
+	tmpchar = *(key);
+	*(key) = *(key + key_len);
+	*(key + key_len) = tmpchar;
+
+	tmpchar = *(key + 1);
+	*(key + 1) = *(key + key_len + 1);
+	*(key + key_len + 1) = tmpchar;
+   	
+}
+#endif
+static VOID generate_ascii_password (CHAR *macdr, CHAR *outkey, INT outkeylen)
+{
+	SHORT i = 0;
+	SHORT j = 0;
+	UCHAR t = 0;
+	SHORT ret = -1;
+	CHAR imei[16] = {0};
+	CHAR only_digit_key[2] = {0};
+	CHAR key_gen_type[10] = {0};
+	CHAR sLastbyte[3] = {0};
+	CHAR sKeylen[3] = {0};
+	SHORT iKeylen = 0;
+	SHORT iLastbyte = 0;
+	SHORT iLimit = 0;
+
+	if (NULL == macdr || NULL == outkey || strlen (macdr) == 0) {
+		return;
+	}
+	ret = cfg_get_item ("wifi_key_len", sKeylen, 3);
+	for (i = 0; i < strlen (sKeylen); i++) {
+		iKeylen = (sKeylen[i] - '0') + iKeylen * 10;
+	}
+	ret = cfg_get_item ("wifi_key_gen_type", key_gen_type, 10);
+	if (ret != -1) {
+		wf_log ("wifi_key_gen_type=%s", key_gen_type);
+		if (!strncmp (key_gen_type, "DEFAULT", 7)) {
+			cfg_get_item (WLAN_NV_WPAPSK1_NAME, outkey, outkeylen);
+			wf_log ("outkey=%s", outkey);
+		} else if (!strncmp (key_gen_type, "MAC", 3)) {
+			// gen by mac
+			ret = cfg_get_item ("wifi_key_gen_with_mac_lastbyte", sLastbyte, 3);
+
+			if (ret != -1) {
+				wf_log ("wifi_key_gen_with_mac_lastbyte=%s", sLastbyte);
+				for (i = 0; i < strlen (sLastbyte); i++) {
+					iLastbyte = (sLastbyte[i] - '0') + iLastbyte * 10;
+				}
+				iLimit = (WLAN_MAC_ADDR_LEN - iLastbyte) < 0 ? 0 : (WLAN_MAC_ADDR_LEN - iLastbyte);
+				for (i = iLimit; i < WLAN_MAC_ADDR_LEN; i++) {
+					outkey[j] = macdr[i];
+					j++;
+				}
+				for (i = 0; i < iLastbyte; i++) {
+					if (outkey[i] > 96 && outkey[i] < 123) {
+						outkey[i] = outkey[i] - 32;
+					}
+				}
+				outkey[iLastbyte] = '\0';
+			} else {
+
+				for (j = 0; j < iKeylen; j++) {
+					for (i = 0; i < WLAN_MAC_ADDR_LEN; i++) {
+						t ^= macdr[j] & (macdr[i] << (i % 2) ? 1 : 3);
+					}
+					outkey[j] = proc_readable_ch (t ^ (~macdr[11 - j]));
+					zte_filter_charactor (outkey + j);
+				}
+			}
+		} else if (!strncmp (key_gen_type, "IMEI", 4)) {
+			// gen by imei
+			cfg_get_item ("imei", imei, sizeof(imei));
+			while(strlen(imei) < 15) {
+				wf_log ("atctl did not get imei now.");
+				wf_ms_sleep (1000);
+				cfg_get_item ("imei", imei, sizeof(imei));
+			}
+			setWifiKeyForImei (outkey, imei, 8);
+		}
+	}
+
+	ret = cfg_get_item ("wifi_key_only_digit", only_digit_key, 2);
+	if (0 == strncmp (only_digit_key, "y", 2)) {
+		alpha_to_digital (outkey, iKeylen);
+	}
+#ifdef WEBS_SECURITY
+	make_password_strong(outkey, iKeylen);//for security
+#else			
+	outkey[0] = 'Z';
+	outkey[1] = 'z';
+#endif
+	return;
+}
+
+static int make_wifikey (CHAR * key, CHAR * m_key)
+{
+	char *encode = NULL;
+
+	char * m_encode = NULL;
+    char psk_cmd[128]={0};
+	int ret = 0;
+
+	if (NULL == key || NULL == m_key) {
+		return -1;
+	}
+
+	wf_log ("make_wifikey   key=%s,  m_key=%s", key, m_key);
+
+	if (strlen (key) > 0) {
+		encode = wlan_base64_encode(key, strlen (key));
+		cfg_set ("WPAPSK1", key);
+		cfg_set ("WPAPSK1_encode", encode);
+	}
+
+	if (strlen (m_key) > 0) { // protect  multissid  , m_key maybe 0
+		m_encode =  wlan_base64_encode(m_key, strlen (m_key));
+		cfg_set ("m_WPAPSK1", m_key);
+		cfg_set ("m_WPAPSK1_encode", m_encode);
+	}
+#ifdef __AP_FUNC__
+#ifdef __USE_AES__
+	wifi_encrypt_code();
+#endif
+#endif
+
+	//cfg_save();
+	wlan_set_change_ssid_key_status();
+
+
+	if (encode != NULL) {
+		free (encode);
+	}
+	if (m_encode != NULL) {
+		free (m_encode);
+	}
+
+    snprintf(psk_cmd, sizeof(psk_cmd), "AT+WIFIKEY=%s\r", key);
+
+	//ipc_send_message (MODULE_ID_WIFI, MODULE_ID_AT_CTL, MSG_CMD_WIFIKEY_SET_REQ, 0, NULL, 0); //·¢ËÍÏûÏ¢¸øat server
+	ret = get_modem_info(psk_cmd, NULL, NULL);
+	if (ret != 0) {
+		wf_log ("AT+WIFIKEY error");
+		return -1;
+	}
+	return 0;
+}
+
+static int set_mac_conf(char *mac, char *mac2)
+{
+#if defined(__XR_819_CHIP__)
+	//xr819 set mac before insmod??
+	wf_log ("set_mac_conf:%s", mac);
+	wlan_write_file("/etc_rw/wifi/xr_wifi.conf", mac);
+#elif defined(__SSV_6X5X_CHIP__)
+	//sv6158 set mac before insmod
+	char mac_cmd[128]={0};
+	snprintf(mac_cmd, sizeof(mac_cmd), "%s\n%s", mac, mac2);
+	wf_log ("set_mac_conf:[%s]", mac_cmd);
+	wlan_write_file("/etc_rw/wifimac", mac_cmd);
+#elif defined(__AIC_8800DW_CHIP__)
+	//aic_8800dw set mac before insmod
+	char mac_cmd[128]={0};
+	snprintf(mac_cmd, sizeof(mac_cmd), "MAC_A1=%s  MAC_A2=%s  MAC_A3=%s\n", mac, mac2, mac2);
+	//snprintf(mac_cmd, sizeof(mac_cmd), "MAC_A1=%s\n", mac);
+	wf_log ("set_mac_conf:[%s]", mac_cmd);
+	wlan_write_file("/etc_rw/aic_macconfig.txt", mac_cmd);
+#elif defined(__ESP_8089_CHIP__)
+	char mac_cmd[128]={0};
+	int ret = 0;
+
+	snprintf(mac_cmd, sizeof(mac_cmd), "AT+MAC=%s\r", s_mac);//no :
+	wf_log ("write mac:[%s]", s_mac);
+
+	ret = get_modem_info(mac_cmd, NULL, NULL);
+	if (ret != 0) {
+		wf_log ("AT+MAC error");
+		return -1;
+	}
+#endif	
+	return 0;
+}
+
+static VOID setWifiKeyForImei (CHAR* outkey, CHAR* imeistr, UINT32 num)
+{
+	CHAR old_key[WLAN_NV_WPAPSK1_LENGTH] = {0};
+	if (outkey == NULL) {
+		wf_log ("outkey is null");
+		return ;
+	}
+	if (imeistr == NULL) {
+		wf_log ("imeistr is null");
+		return ;
+	}
+	if (15 != strlen (imeistr)) {
+		wf_log ("imeistr is error");
+		return ;
+	}
+
+	strcpy (&outkey[0], &imeistr[15 - num]);
+
+	cfg_get_item (WLAN_NV_WPAPSK1_NAME, old_key, WLAN_NV_WPAPSK1_LENGTH);
+	if (strcmp (outkey, old_key)) {
+		cfg_set (WLAN_NV_WPAPSK1_NAME, outkey);
+	}
+}
+
+/*
+
+*/
+unsigned  char * a2xx (const unsigned char* addr, unsigned char *mac)
+{
+	int i = 0;
+	unsigned char *p = addr;
+	unsigned char str[3] = {0};
+
+	for (i = 0; i < 6; i++) {
+		strncpy (str, p, 2);
+		mac[i] = s2x (str);
+		p += 2;
+	}
+
+	return mac;
+}
+
+/**
+ * is_zero_ether_addr - Determine if give Ethernet address is all zeros.
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Return true if the address is all zeroes.
+ *
+ * Please note: addr must be aligned to u16.
+ */
+static  int  is_zero_ether_addr (const unsigned char * a)
+{
+	return ! (a[0] | a[1] | a[2] | a[3] | a[4] | a[5]);
+}
+
+/**
+ * is_multicast_ether_addr - Determine if the Ethernet address is a multicast.
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Return true if the address is a multicast address.
+ * By definition the broadcast address is also a multicast address.
+ */
+static  int  is_multicast_ether_addr (const unsigned char *addr)
+{
+	return 0x01 & addr[0];
+}
+
+/**
+ * is_valid_ether_addr - Determine if the given Ethernet address is valid
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
+ * a multicast address, and is not FF:FF:FF:FF:FF:FF.
+ *
+ * Return true if the address is valid.
+ *
+ * Please note: addr must be aligned to u16.
+ */
+static  int  is_valid_ether_addr (const unsigned char *addr)
+{
+	/* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
+	 * explicitly check for it here. */
+	return !is_multicast_ether_addr (addr) && !is_zero_ether_addr (addr);
+}
+
+/*
+
+*/
+static int  is_valid_mac (const char *mac)
+{
+	unsigned char a[6] = {0};
+
+	a2xx (mac, a);
+
+	wf_log ("addr=%02x%02x%02x%02x%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5]);
+	return is_valid_ether_addr ( (const unsigned char *) a);
+
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦ÀíMAC µØÖ·
+
+µÃ³ömacµØÖ·
+
+Éú³Éssid ºÍwifikey
+
+дssid ºÍwifikey nvÖµ
+
+²©Í¨Ð¾Æ¬ÐèҪдÈëµ½ /mnt/jffs2/firmware/nvram_bcmdhd.txt ÎļþÖÐ
+***********************************************************************************/
+static VOID wlan_setWifiNV (CHAR *macaddress)
+{
+	CHAR mac[32]   = {0};
+	CHAR m_mac[32] = {0};
+
+	CHAR *p = NULL;
+	CHAR read_mac[32] = {0};
+	CHAR outpassword[32] = {0};
+	CHAR wifi_mac_num_str[3] = {0}; // indicate the number of mac needed
+	CHAR m_read_mac[32] = {0};
+	CHAR m_outpassword[32] = {0};
+
+	int  wifi_mac_num = 0;
+	int  ret = -1;
+
+	INT  i = 0;
+	INT  valid_mac = 0;
+	INT  len = 0, len1 = 0;
+
+	ret = cfg_get_item ("wifi_mac_num", wifi_mac_num_str, sizeof (wifi_mac_num_str));
+	if (ret == 0) {
+		wifi_mac_num = atoi (wifi_mac_num_str);
+	} else {
+		wifi_mac_num = 1;
+	}
+
+	len = strlen ("+MAC:");
+	len1 = strlen ("+MAC:XXXXXXXXXXXX;"); // 18
+
+	wf_log ("wlan_setWifiNV macaddress=%s", macaddress);
+
+	strncpy (read_mac, macaddress + len, 12);
+	if (2 == wifi_mac_num)
+		strncpy (m_read_mac, macaddress + len1, 12);
+
+	wf_log ("read mac = %s, m_read_mac=%s", read_mac, m_read_mac);
+
+	char ssid[32] = {0};
+	char ssidbak[32] = {0};
+	cfg_get_item ("SSID1", ssid, sizeof (ssid));
+	cfg_get_item ("SSIDbak", ssidbak, sizeof (ssidbak));
+	if (strcmp (ssidbak, "") == 0)
+		cfg_set ("SSIDbak", ssid);
+	if (0 == is_valid_mac (read_mac) || (2 == wifi_mac_num && 0 == is_valid_mac (m_read_mac))) {
+		wf_log ("invalid Mac Address read_mac=%s,m_read_mac=%s", read_mac, m_read_mac);
+		cfg_set ("ssid_write_flag", "0"); //Èç¹ûmac²»ºÏ·¨ÔòÈÏΪûÓÐдÈë³É¹¦
+		cfg_set ("SSID1", "Please set Valid MAC firstly");
+		cfg_set ("m_SSID", "Please set Valid MAC firstly");
+		cfg_set ("wifi_mac", "");
+		cfg_set ("m_wifi_mac", "");
+		wlan_set_change_ssid_key_status();
+		return ;
+	}
+
+	//+MAC:XXXXXXXXXXXX;XXXXXXXXXXXX
+	sprintf (mac, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
+	         read_mac[0], read_mac[1], read_mac[2], read_mac[3], read_mac[4], read_mac[5],
+	         read_mac[6], read_mac[7], read_mac[8], read_mac[9], read_mac[10], read_mac[11]);
+
+	if (2 == wifi_mac_num) {
+		sprintf (m_mac, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
+		         m_read_mac[0], m_read_mac[1], m_read_mac[2], m_read_mac[3], m_read_mac[4], m_read_mac[5],
+		         m_read_mac[6], m_read_mac[7], m_read_mac[8], m_read_mac[9], m_read_mac[10], m_read_mac[11]);
+
+	}
+	wf_log ("mac = %s  m_mac= %s", mac, m_mac);
+
+	cfg_set ("wifi_mac", mac);
+	if (2 == wifi_mac_num)
+		cfg_set ("m_wifi_mac", m_mac);
+
+//    setWifiWpsDefPin();
+
+	generate_ascii_password (read_mac, outpassword, sizeof (outpassword));
+	generate_ascii_password (m_read_mac, m_outpassword, sizeof (m_outpassword));
+	make_wifikey (outpassword, m_outpassword);
+	make_user_mac (read_mac);
+
+	set_mac_conf(mac, m_mac);
+}
+
+
+char *wlan_base64_encode(const char* data, int data_len)
+{
+	//int data_len = strlen(data);
+	int prepare = 0;
+	int ret_len;
+	int temp = 0;
+	char *ret = NULL;
+	char *f = NULL;
+	int tmp = 0;
+	char changed[4];
+	int i = 0;
+	ret_len = data_len / 3;
+	temp = data_len % 3;
+	if (temp > 0) {
+		ret_len += 1;
+	}
+	ret_len = ret_len * 4 + 1;
+	ret = (char *) malloc (ret_len);
+
+	if (ret == NULL) {
+		wf_log ("No enough memory.");
+		exit (0);
+	}
+	memset (ret, 0, ret_len);
+	f = ret;
+	while (tmp < data_len) {
+		temp = 0;
+		prepare = 0;
+		memset (changed, '\0', 4);
+		while (temp < 3) {
+			//printf("tmp = %d", tmp);
+			if (tmp >= data_len) {
+				break;
+			}
+			prepare = ( (prepare << 8) | (data[tmp] & 0xFF));
+			tmp++;
+			temp++;
+		}
+		prepare = (prepare << ( (3 - temp) * 8));
+		//printf("before for : temp = %d, prepare = %d", temp, prepare);
+		for (i = 0; i < 4 ; i++) {
+			if (temp < i) {
+				changed[i] = 0x40;
+			} else {
+				changed[i] = (prepare >> ( (3 - i) * 6)) & 0x3F;
+			}
+			*f = base[ (UCHAR) changed[i]];
+			//printf("%.2X", changed[i]);
+			f++;
+		}
+	}
+	*f = '\0';
+
+	return ret;
+
+}
+
+
+void  send_get_mac_req()
+{
+	int send_ret = -1;
+
+	char ssid_write_flag[8] = {0};
+	cfg_get_item ("ssid_write_flag", ssid_write_flag, sizeof (ssid_write_flag));
+	wf_log ("wifi_ssid_init: ssid_write_flag = %s", ssid_write_flag);
+	
+	if (!strcmp (ssid_write_flag, "0")) {
+
+		send_ret = ipc_send_message(MODULE_ID_WIFI, MODULE_ID_AT_CTL, MSG_CMD_GET_MAC_REQ, 0, NULL, 0);
+		while (send_ret != 0) {
+			wf_log ("send message MSG_CMD_GET_MAC to at_ctl to get mac failed");
+			wf_ms_sleep (200);
+			send_ret = ipc_send_message(MODULE_ID_WIFI, MODULE_ID_AT_CTL, MSG_CMD_GET_MAC_REQ, 0, NULL, 0);
+		}
+		wf_log ("send message MSG_CMD_GET_MAC to at_ctl to get mac successfully");
+
+	}
+}
+
+void  get_mac_config_ssid_key_nv()
+{
+	char ssid_write_flag[8] = {0};
+	char at_wifi_mac[64]    = {0};
+
+
+	cfg_get_item ("ssid_write_flag", ssid_write_flag, sizeof (ssid_write_flag));
+	wf_log ("wifi_ssid_init: ssid_write_flag = %s", ssid_write_flag);
+
+	/*ÓëNVÖÐÊÇ·ñÒÑдÈëSSID µÄ±ê־λ±È½Ï£¬Èç¹ûΪ1±íʾÒÑдÈ룬²»ÓÃÔÙд£»0±íʾ»¹Î´Ð´Èë*/
+	if (!strcmp (ssid_write_flag, "0")) {
+	
+		cfg_get_item ("at_wifi_mac", at_wifi_mac, sizeof (at_wifi_mac));
+		if (strncmp (at_wifi_mac, "0", 2) == 0) {
+			wf_log ("at_wifi_mac is null ");
+			do {
+				wf_log ("ATMain did not get MAC from CP.");
+				wf_ms_sleep (1000);
+				cfg_get_item ("at_wifi_mac", at_wifi_mac, sizeof (at_wifi_mac));
+			} while (strncmp (at_wifi_mac, "0", 2) == 0);
+		}
+
+		wf_log ("wifi_ssid_init:at_wifi_mac = %s", at_wifi_mac);
+		wlan_setWifiNV (&at_wifi_mac);
+	}
+}
diff --git a/lynq/MD310EU/ap/app/zte_comm/wlan/src/wlan_main.c b/lynq/MD310EU/ap/app/zte_comm/wlan/src/wlan_main.c
new file mode 100755
index 0000000..e1cd6a7
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/wlan/src/wlan_main.c
@@ -0,0 +1,1425 @@
+/*

+ *  wlan-server.c -- Wlan Deal module

+ *

+ *  Copyright (c) ZTE Corporation All Rights Reserved.

+ *

+ *  $Id: wlan-server.c,v 0.1 2010-12-15 $

+ *  Authors :   ZHAOYONG - zhao.yong3@zte.com.cn>

+ */

+/****************ͷ�ļ�*/

+#include <signal.h>

+#include <time.h>

+#include "wlan_main.h"

+#include "wifi_util.h"

+#include <soft_timer.h>

+

+#include "wlan_config_ssid.h"

+#include "rtk_arch.h"

+#include <semaphore.h>

+

+#include "wifi_sta_ctrl.h"

+#include "wlan_sta_manager.h"

+

+

+#include "wlan_rtc_sleep.h"

+#ifdef __AP_FUNC__

+#include "wifi_ap_ctrl.h"

+#endif

+#include "hotplug.h"

+

+/**************************�궨��*************************/

+

+//#define UEVENT_BUFFER_SIZE   1024*2

+#define  CHARGER     "/sys/class/power_supply/charger/status"

+#define  WIFI_DIR				"/etc_rw/wifi"

+

+

+

+/*************************��������**************************************/

+static int g_pre_is_charging = 0;

+

+struct   wlan_ap_server  * ap_server = NULL;

+struct   wlan_sta_manager  *sta_manager= NULL;

+

+#ifdef __STA_FUNC__

+sem_t  g_wpa_supplicant_id;

+extern struct  wlan_sta_manager   esp8089_sta;

+extern struct  wlan_sta_manager   rda5995_sta;

+#ifdef __REALTEK_8192_CHIP__

+extern struct  wlan_sta_manager   realtek_sta;

+#endif

+extern struct  wlan_sta_manager   ssv6x5x_sta;

+extern struct  wlan_sta_manager   aic8800dw_sta;

+

+#endif

+

+extern void *netlink_loop (void *param);

+extern int wifi_app_msg_parse(const char *msg, int msglen, struct hotplug_event *event);

+void check_wifi_mac();

+

+#ifdef __AP_FUNC__

+extern struct wlan_ap_server  esp8089_ap;

+extern struct wlan_ap_server  rda5995_ap;

+extern struct wlan_ap_server  xr819_ap;

+extern struct wlan_ap_server  ssv6x5x_ap;

+extern struct wlan_ap_server  aic8800dw_ap;

+

+

+#ifdef __REALTEK_8192_CHIP__

+extern struct wlan_ap_server  realtek_8192_ap;

+extern int wps_rtc_timer_open ;

+extern void wlan_get_wps_access_sta();

+extern void handle_wps_result (MSG_BUF *pstMsg);

+extern void handle_wps_mac (MSG_BUF *pstMsg);

+#endif

+

+extern int g_rtc_wake_timer_open;

+extern int g_sleep_rtc_timer;

+

+extern int g_tsw_sleep_flag ;//���޴�����ʱ˯�ߵ�rtc timer

+extern int g_tsw_wake_flag ;//���޴�����ʱ���ѵ�rtc timer

+extern sem_t g_hostap_id;

+

+

+static char tem_cfg[512] = {0};

+#define CFG2WEB_UNCONDITIONAL(SrcCfg,DesCfg)\

+                    do{     \

+                        memset(tem_cfg,0,sizeof(tem_cfg));                   \

+                        cfg_get_item(SrcCfg,tem_cfg,sizeof(tem_cfg));       \

+                        cfg_set(DesCfg,tem_cfg);                             \

+                    }while(0)

+extern void wifi_station_close (void);

+

+/*************************��̬��������***********************************/

+static int chargingcheckstates();

+static void sleep_wifi();

+void basic_deal_all (int cmd);

+extern  void zte_get_wifi_sta_list(RT_802_11_MAC_TABLE *staList);

+

+

+//��ʱ����: ��Ϊ��TswWakeLoop �յ�elapse��Ϣ�����������timer�ˣ��˴�

+//�����������ã�ֻ��ִ�л��Ѳ���

+static void handle_wifi_tsw_open()

+{

+	char wifi_cur_state[8] = {0};

+	char m_ssid_enable[8] = {0};

+	cfg_get_item ("wifi_cur_state", wifi_cur_state, sizeof (wifi_cur_state));

+	cfg_get_item ("m_ssid_enable", m_ssid_enable, sizeof (m_ssid_enable));

+

+	wf_log ("handle_wifi_tsw_open");

+

+	if (strcmp (wifi_cur_state, WIFI_OPENED) == 0) {

+		wf_log ("wifi is already open\n ");

+		return;

+	}

+

+	if (1 == atoi (m_ssid_enable)) {

+		basic_deal_all (WIFI_CFG_OPEN_VA0_VA1);

+	} else {

+		basic_deal_all (WIFI_CFG_OPEN);

+	}

+}

+

+int is_charging()

+{

+	int status = 0;

+	char wan_mode[16] = {0};

+

+	cfg_get_item ("WAN_MODE", wan_mode, sizeof (wan_mode));

+

+	if (chargingcheckstates() == 1 // is charging , no need to sleep

+	    || !strcmp (wan_mode, "USB")) { //  if usb is linked , no need to sleep , no concern charging ro not

+

+		wf_log ("******IS CHARING*******");

+

+		status = 1;

+

+	} else {

+

+		status = 0;

+	}

+

+	return status;

+}

+

+

+

+static void qrcode_make()

+{

+	if(0 == ap_server->ap0_state)

+		return;

+

+#ifdef __QRCODE_WIFI__

+	write_status (QRSTATUS, "0");

+	system (QRCODE_SCRIPT_DIR"/zte_qrcode_create.sh wifi_create");

+#ifndef __SINGLE_AP__

+	system (QRCODE_SCRIPT_DIR"/zte_qrcode_create.sh multi_wifi_create");

+#endif

+	write_status (QRSTATUS, "1");

+	wf_log ("zte_qrcode_create.sh wifi_create");

+#endif

+}

+

+

+

+

+

+

+

+void basic_deal_all (int cmd)

+{

+	//remove_all_acl_timer();

+	cancel_all_timer();

+

+	ap_server->basic_deal (ap_server, cmd);

+	qrcode_make();

+

+	wlan_prepare_sleep();

+}

+

+//���úڰ�����: 0����������1����������2����������

+void acl_mode_set()

+{

+	char ACL_mode[8] = {0};

+

+	cfg_get_item ("ACL_mode", ACL_mode, sizeof (ACL_mode));

+	CFG2WEB_UNCONDITIONAL ("ACL_mode", "AccessPolicy0");

+

+	if (!strcmp (ACL_mode, "1")) {       // white-list

+		CFG2WEB_UNCONDITIONAL ("wifi_mac_white_list", "AccessControlList0");

+	} else if (!strcmp (ACL_mode, "2")) { // black-list

+		CFG2WEB_UNCONDITIONAL ("wifi_mac_black_list", "AccessControlList0");

+	} else {

+		cfg_set ("AccessPolicy0", "0");

+	}

+

+	

+}

+

+static void set_mac_access()

+{

+	wf_log ("nxl  set_mac_access  ");

+	acl_mode_set();

+

+	if (ap_server->ap0_state == 1) {

+		wf_log ("wifi is on");

+		acl_set_process();   

+	} else {

+		wf_log ("wifi is off");

+	}

+}

+

+

+

+static int chargingcheckstates()

+{

+	char buf_status[16] = {0};

+	int ret = 0;

+	int  errno_1 = 0;//errno value for the status file of prefer supply

+

+	FILE *p_status = NULL;

+	int len = 0;

+

+	p_status = fopen (CHARGER, "r");

+	if (p_status == NULL) {

+		wf_log ("errno_1 = %d, charger is not exist", errno_1);

+		return 1;

+	}

+	

+	len = fread(buf_status, 1, sizeof(buf_status), p_status);//cov m

+	if (len > 0) {

+		if ( (strncmp (buf_status, "Charging", 8) == 0) || (strncmp (buf_status, "Full", 4) == 0)) { //buf�����һλ��ӡ�����ǻ�����strcmp�Ƚ���Զ���ɹ������Ը���strncmp

+			ret = 1;

+		} else {

+			ret = 0;

+		}

+	}

+	

+	if (fclose(p_status)) { //kw

+		wf_log("fclose error");

+	}

+	return ret;

+}

+

+//ÿ�ο���������ô˺�����ͨ��˯��ʱ�䳤���жϣ��������Ƿ�����˯�ߣ�����rtc������ʱ

+

+static void sleep_wifi()

+{

+	cfg_set ("wifiSleep", "1");

+	cancel_all_timer();

+	ap_server->basic_deal (ap_server, WIFI_CFG_SLEEP); //sleep no real action meaning,just readable

+	

+	wf_msg_to_zcore(MSG_CMD_WIFI_SET_OFF_RSP, 2, WIFI_CLOSED);	//wifi�رպ�֪ͨ�̶�̨��ʾwifi״̬

+}

+

+// if  wifi is off ,  charging  in wps, no need to sleep

+// only sta_count ==0 ,can sleep

+static void handle_sleep_wifi()

+{

+	char wifi_sleep_mode[20] = {0};

+	if (ap_server->ap0_state == 0  || g_pre_is_charging == 1  || ap_server->ap0_wps_state  == 1)

+		return;

+

+	if (captureWlanStaInfo() == 0) {

+		cfg_get_item("wifi_sleep_mode", wifi_sleep_mode, sizeof(wifi_sleep_mode));

+		if(0 == atoi(wifi_sleep_mode))

+		{

+			sleep_wifi();

+		}

+		else if(1 == atoi(wifi_sleep_mode))

+		{

+			ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_MAIN_CTRL, MSG_CMD_POWEROFF_REQUEST, 0, NULL, 0);

+		}

+	}

+}

+

+//��ʱ˯�ߴ�������:������û�� sta �����豸������û�п���wps��Ҫ�ر� wifi

+static void handle_wifi_tsw_close()

+{

+	if (ap_server->ap0_state == 0)

+		return;

+	sleep_wifi();

+}

+

+

+

+void process_rtc_elapsed (MSG_BUF *pstMsg)

+{

+	UINT32  module_id = 0;

+	RTC_DATA_BUF *data_buf = pstMsg->aucDataBuf;

+	module_id = data_buf->module;

+

+	switch (module_id) {

+	case WIFI_INTERVAL_SLEEP: {

+		g_sleep_rtc_timer = 0; // no need to delete RTCTimer

+		handle_sleep_wifi();

+		break;

+	}

+	case WIFI_TSW_SLEEP: {

+		g_tsw_sleep_flag = 0;

+		//�˴����Ӻ�����������˯��ʱ��Ϊ24Сʱ

+		create_rtc_tsw_close_timer (24 * 60 * 60);

+		handle_wifi_tsw_close();

+		break;

+	}

+	case WIFI_TSW_WAKEUP: {

+		g_tsw_wake_flag = 0;

+		//�˴����Ӻ�����������˯��ʱ��Ϊ24Сʱ

+		create_rtc_tsw_open_timer (24 * 60 * 60);

+		handle_wifi_tsw_open();

+		break;

+	}

+	case WIFI_WAKE_UP_SYSTEM: {

+		g_rtc_wake_timer_open = 0;

+#ifdef __REALTEK_8192_CHIP__

+		captureWlanStaInfo();

+#endif

+		wlan_prepare_sleep();

+		break;

+	}

+

+#ifdef __REALTEK_8192_CHIP__	

+	case WIFI_WPS_RESULT_CHECK: {

+		wps_rtc_timer_open = 0;// timer close automaticly when alarm elapsed

+		wlan_get_wps_access_sta();

+		break;

+	}

+	case WIFI_ACL_SERVICE: {

+		break;

+	}

+#endif

+	default:

+		break;

+	}

+}

+

+void usb_charging_changed()

+{

+	int charging_status = 0;

+	charging_status = chargingcheckstates();

+	char fake_poweroff[8]={0};

+	char wifiSleep[8]={0};

+

+	cfg_get_item ("mmi_fake_poweroff_state", fake_poweroff, sizeof (fake_poweroff));

+	cfg_get_item ("wifiSleep", wifiSleep, sizeof (wifiSleep));

+	if (charging_status != g_pre_is_charging) { // ��֮ǰ��һ�δ���usb״̬��ͬ

+		g_pre_is_charging = charging_status;

+		wf_log ("charging_status =%d,ap_server->ap0_state=%d,going into handle_usb_msg", g_pre_is_charging, ap_server->ap0_state);

+		if (ap_server->ap0_state == 1) {

+			//wifi is open

+			wlan_prepare_sleep();

+		}

+		// wifi ˯�ߺ󣬲���usb���ɻ���, ���Ǽٹػ�������

+		else if (ap_server->ap0_state == 0 && g_pre_is_charging == 1 

+				&& strcmp (fake_poweroff, "1") != 0 // �Ҳ��Ǽٹػ�

+				&& strcmp (wifiSleep, "1") == 0) {// ����˯�����������wifi�رղſ��Ի���

+			char m_ssid_enable[8] = {0};

+			cfg_get_item ("m_ssid_enable", m_ssid_enable, sizeof (m_ssid_enable));

+			if (1 == atoi (m_ssid_enable)) {

+				basic_deal_all (WIFI_CFG_OPEN_VA0_VA1);

+			} else {

+				basic_deal_all (WIFI_CFG_OPEN);

+			}

+		}

+	}

+}

+

+

+void fwp_charging_changed(int charging_status)

+{

+	char wifiSleep[8]={0};

+	cfg_get_item ("wifiSleep", wifiSleep, sizeof (wifiSleep));

+

+	g_pre_is_charging = charging_status;

+	wf_log ("charging_status =%d,ap_server->ap0_state=%d", charging_status, ap_server->ap0_state);

+	if (ap_server->ap0_state == 1) {

+		wlan_prepare_sleep();

+	}

+	else if (ap_server->ap0_state == 0 && charging_status == 1 

+		&& strcmp (wifiSleep, "1") == 0) {// ����˯�����������wifi�رղſ��Ի���

+		basic_deal_all (WIFI_CFG_OPEN);

+		// for R1680 notify cp mmi wifi is on

+		wf_msg_to_zcore(MSG_CMD_WIFI_SET_ON_RSP, 2, WIFI_OPENED);	//wifi�رպ�֪ͨ�̶�̨��ʾwifi״̬

+	}

+	else{

+		//do nothing

+	}

+}

+

+

+void wifi_wps_set (MSG_BUF *pstMsg)

+{

+	char encrypType[12]    = {0};

+	char wifi_wps_index[8] = {0};

+	char hidessid[20] = {0};

+	char authmode[20] = {0};

+	char wifi_cur_state[8] = {0};

+

+	cfg_get_item ("wifi_cur_state", wifi_cur_state, sizeof (wifi_cur_state));

+	if (pstMsg->src_id == MODULE_ID_MMI) {

+		strcpy (wifi_wps_index, "1");

+		cfg_set ("wifi_wps_index", "1");

+	} else {

+		cfg_get_item ("wifi_wps_index", wifi_wps_index, sizeof (wifi_wps_index));

+	}

+

+	if (strcmp (wifi_wps_index, "1") == 0) {

+		cfg_get_item ("AuthMode", authmode, sizeof (authmode));

+		cfg_get_item ("HideSSID", hidessid, sizeof (hidessid));

+		cfg_get_item ("EncrypType", encrypType, sizeof (encrypType));

+	} else if (strcmp (wifi_wps_index, "2") == 0) {

+		cfg_get_item ("m_AuthMode", authmode, sizeof (authmode));

+		cfg_get_item ("m_HideSSID", hidessid, sizeof (hidessid));

+		cfg_get_item ("m_EncrypType", encrypType, sizeof (encrypType));

+	}

+

+	//if((!strncmp(RadioOff, "1", 2)) && (!strncmp(hidessid, "0", 2)))

+

+	if (!strncmp (wifi_cur_state, WIFI_OPENED, 2) && !strncmp (hidessid, "0", 1)

+	    && strcmp (encrypType, "TKIP") && strcmp (authmode, "WPAPSK") && strcmp (authmode, "WAPIPSK")

+	    && (strcmp (authmode, "SHARED") && strcmp (authmode, "WEPAUTO"))

+	    && ! (!strcmp (authmode, "OPEN") && !strcmp (encrypType, "WEP"))) {

+		wps_deal (pstMsg);

+	} else {

+		cfg_set ("WscModeOption", "0");

+		wf_log ("Invalid WPS para!");

+	}

+}

+

+void wifi_advanced_set (MSG_BUF *pstMsg)

+{

+	UCHAR flags[8] = {0};

+	if (pstMsg->usDataLen > 0) {

+		wf_log ("aucDataBuf=%s, usDataLen=%d", pstMsg->aucDataBuf, pstMsg->usDataLen);

+		memcpy (flags, pstMsg->aucDataBuf, pstMsg->usDataLen);

+		wf_log ("flags=%s", flags);

+		switch (atoi (flags)) {

+		case WIFI_ADVANCED_CLOSE:

+			//RadioOff should be set to 0 in webserver, to be fix

+		{

+			if(ap_server->ap0_state)basic_deal_all (WIFI_CFG_CLOSE);

+			//handle_tsw_close();//����Ҫɾ����ʱ˯�߻��Ѷ�ʱ��

+			break;

+		}

+		case WIFI_ADVANCED_OPEN: {

+			wf_log ("ap_server->ap0_state=%d,ap_server->ap1_state=%d", ap_server->ap0_state, ap_server->ap1_state);

+			if (ap_server->ap0_state && ap_server->ap1_state) {

+				wf_log ("va1 is on,so close va1");

+				basic_deal_all (WIFI_CFG_CLOSE_MSSID);

+			} else {

+				if (!ap_server->ap0_state)basic_deal_all (WIFI_CFG_OPEN);

+			}

+			break;

+		}

+		//  RadioOff=0  wifiEnabled =0  to close wifi

+		//  wifiEnabled=1  to open wifi

+		// no para data to reset wifipara , need restart wifi

+		case WIFI_ADVANCED_CLOSE_MSSID: {

+			basic_deal_all (WIFI_CFG_CLOSE_MSSID);

+			break;

+		}

+		case WIFI_ADVANCED_OPEN_VA01: {

+			cfg_set ("wifi_sta_connection", "0"); //���Ᵽ��

+			basic_deal_all (WIFI_CFG_OPEN_VA0_VA1);

+			break;

+		}

+		case WIFI_ADVANCED_OPEN_VA1: {

+			cfg_set ("wifi_sta_connection", "0"); //���Ᵽ��

+			basic_deal_all (WIFI_CFG_OPEN_MSSID);

+			break;

+		}

+		case WIFI_ADVANCED_RF: {

+			basic_deal_all (WIFI_CFG_RF); // RF nv value already set OK,just restart

+			break;

+		}

+		case WIFI_ADVANCED_RESTART: { //from tr069,  set ssid password, channel,  wifi_coverage etc..

+			basic_deal_all (WIFI_CFG_FORCE_RESTART); // just  forcerestart

+			break;

+		}

+

+		}

+		//free(pData);

+	}

+}

+

+void deal_msg_data(MSG_BUF *pMsg)

+{

+	switch (pMsg->usMsgCmd) {

+		case MSG_CMD_WIFI_CFG_AP:

+		case MSG_CMD_WIFI_CFG_SSID_REQ:

+		case MSG_CMD_WIFI_CFG_PWD_REQ:

+		case MSG_CMD_WIFI_SET_SECURITY_REQ:

+			if(pMsg->usDataLen != 0){

+				wlan_basic_info *info = (wlan_basic_info*)(pMsg->aucDataBuf);

+

+				wf_log("ssid=%s ,pwd=%s, auth=%s, encrypt=%s \n",info->ssid, info->pwd, info->authmode,info->encrypt);

+

+				if(strlen(info->ssid)>0)

+					cfg_set("SSID1",info->ssid);

+				if(strlen(info->pwd)>0) {

+					char *encode = NULL;

+					cfg_set("WPAPSK1",info->pwd);

+					encode = wlan_base64_encode(info->pwd, strlen (info->pwd));

+					//kw 3

+					cfg_set ("WPAPSK1_encode", encode);

+					free(encode);

+				}

+				if(strlen(info->authmode)>0)

+					cfg_set("AuthMode",info->authmode);

+				if(strlen(info->encrypt)>0)

+					cfg_set("EncrypType",info->encrypt);

+				if(strlen(info->max_access_num)>0)

+					cfg_set("MAX_Access_num",info->max_access_num);

+				if(strlen(info->hidessid)>0)

+					cfg_set("HideSSID",info->hidessid);				

+			}

+			break;

+		case MSG_CMD_WIFI_CFG_AP2:

+			if(pMsg->usDataLen != 0){

+				wlan_basic_info *info = (wlan_basic_info*)(pMsg->aucDataBuf);

+				if(strlen(info->ssid)>0)

+					cfg_set("m_SSID",info->ssid);

+				if(strlen(info->pwd)>0)

+					cfg_set("m_WPAPSK1",info->pwd);

+				if(strlen(info->authmode)>0)

+					cfg_set("m_AuthMode",info->authmode);

+				if(strlen(info->encrypt)>0)

+					cfg_set("m_EncrypType",info->encrypt);

+				if(strlen(info->max_access_num)>0)

+					cfg_set("m_MAX_Access_num",info->max_access_num);

+				if(strlen(info->hidessid)>0)

+					cfg_set("m_HideSSID",info->hidessid);				

+			}

+			break;

+		default:

+			break;

+	}

+}

+

+void  wlan_switch_reply(MSG_BUF *pMsg)

+{

+	int expect_status =  atoi(pMsg->aucDataBuf);

+

+	if((WLAN_OFF == expect_status  && WLAN_OFF  == ap_server->ap0_state) ||

+	   (WLAN_ON == expect_status  && WLAN_ON  == ap_server->ap0_state)){

+		ipc_send_message(MODULE_ID_WIFI, pMsg->src_id, MSG_CMD_WIFI_SWITCH_RSP, 2, "0", 0);

+	}else{

+		ipc_send_message(MODULE_ID_WIFI, pMsg->src_id, MSG_CMD_WIFI_SWITCH_RSP, 2, "1", 0);

+	}

+

+}

+wlan_mac_info_list mac_list ;

+void dump_mac_list()

+{

+	int i=0;

+	char station_mac_tmp[MAX_NUMBER_OF_MAC*20] = {0};

+

+

+	for(i=0;i<mac_list.access_count;i++){

+		if(i!=0)strcat(station_mac_tmp,";");

+		strcat(station_mac_tmp, mac_list.mac_info[i].mac);

+		wf_log("mac[%d]= %s",i, mac_list.mac_info[i].mac);

+	}

+

+	cfg_set("station_mac", station_mac_tmp);

+	wf_log("station_mac= %s",station_mac_tmp);

+}

+

+void update_sta_count(int num)

+{

+

+	char sta_count[12] = {0}; //klocwork

+	sprintf(sta_count, "%d", num);

+	cfg_set ("sta_count", sta_count);

+	ap_server->g_sta_num = num;

+

+}

+void add_sta_mac(unsigned char *mac)

+{

+	if (mac_list.access_count >= MAX_NUMBER_OF_MAC-1) {

+		wf_log("mac_list over limit = %d!!!",mac_list.access_count);

+		return;

+	}

+	strncpy(mac_list.mac_info[mac_list.access_count++].mac, mac, sizeof(mac_list.mac_info[0].mac)-1);//klocwork ע����++

+	

+	dump_mac_list();

+	update_sta_count(mac_list.access_count);

+}

+

+

+void remove_sta_mac(unsigned char *mac)

+{

+	

+	int i=0,j=0;

+	wf_log("mac_list.access_count = %d",mac_list.access_count);

+

+	for(i=0;i<mac_list.access_count;i++){

+		if(strcmp(mac_list.mac_info[i].mac, mac)==0){

+			for(j=i+1;j<mac_list.access_count;j++ ){

+				strcpy(mac_list.mac_info[j-1].mac, mac_list.mac_info[j].mac);

+			}

+			break;

+		}

+	}

+

+	mac_list.access_count--;

+	dump_mac_list();

+	update_sta_count(mac_list.access_count);

+}

+

+

+#if  (PRODUCT_TYPE == PRODUCT_PHONE)	

+/*R1682�̶�̨����wifi�������*/

+void process_get_wifi_info()

+{

+	char wifi_ssid[WIFI_SSID_LEN] = {0};

+	char wifi_pwd[WLAN_PSK_LEN] = {0};

+	char wifi_authmode[WLAN_SECURITY_LEN] = {0};

+	wlan_basic_info basic_info = {0}; //cov

+	

+	wf_log ("++++++++++++process_get_wifi_info++++++++++++");

+

+	cfg_get_item ("SSID1", wifi_ssid, sizeof (wifi_ssid));

+	cfg_get_item ("WPAPSK1", wifi_pwd, sizeof (wifi_pwd));

+	cfg_get_item("AuthMode", wifi_authmode, sizeof(wifi_authmode));

+	wf_log("+++++++++++++R1682 get wifi_ssid:%s\n",wifi_ssid);

+	wf_log("+++++++++++++R1682 get wifi_pwd:%s\n",wifi_pwd);

+	

+

+

+	strcpy(basic_info.ssid, wifi_ssid);

+	strcpy(basic_info.pwd, wifi_pwd);

+	strcpy(basic_info.authmode, wifi_authmode); 

+	wf_msg_to_zcore(MSG_CMD_WIFI_GET_INFO_RSP, sizeof(wlan_basic_info), &basic_info);	

+	

+}

+#endif

+

+#ifndef __REALTEK_8192_CHIP__

+static DHCPOFFERADDR_LIST_t *find_match_sta(struct list_head *dhcp_info_list,  char* p_mac)

+{

+	DHCPOFFERADDR_LIST_t * p_dhcp_info = NULL;

+	wf_log("p_mac = %p", p_mac);

+

+	list_for_each_entry(p_dhcp_info, dhcp_info_list, list) {

+		//if (memcmp((void *)(p_dhcp_info->dhcp_info.mac), (void *)p_mac, 6)==0)

+

+		if((p_dhcp_info->dhcp_info.mac[0] == p_mac[0]) && (p_dhcp_info->dhcp_info.mac[1] == p_mac[1]) &&

+		    (p_dhcp_info->dhcp_info.mac[2] == p_mac[2]) && (p_dhcp_info->dhcp_info.mac[3] == p_mac[3]) &&

+		    (p_dhcp_info->dhcp_info.mac[4] == p_mac[4]) && (p_dhcp_info->dhcp_info.mac[5] == p_mac[5]))

+		{

+			return p_dhcp_info;

+		}

+	}

+	return  NULL;

+}

+

+/**

+**�����̶�̨���������ڻ�ȡ���ӵ�AP�ȵ������

+*/

+void process_get_user_list_req()

+{

+	

+    int i,result=0;

+	

+	struct list_head dhcp_info_list;

+	DHCPOFFERADDR_LIST_t * p_dhcp_info   = NULL;

+	INIT_LIST_HEAD(&dhcp_info_list);

+	char *mac_tmp=safe_malloc (6, 0);

+	if (mac_tmp == NULL) { //kw 1

+		wf_log("process_get_user_list_req malloc fail");

+		goto out;

+	}

+

+	result = zte_get_mac_list_from_lease(&dhcp_info_list);

+	

+	if(result < 0 || mac_list.access_count == 0)

+	{

+		wf_msg_to_zcore(MSG_CMD_WIFI_GET_USER_LIST_RSP, 0, NULL);	

+		goto out;

+	}	

+

+	for (i = 0; i < mac_list.access_count; i++) {

+		

+		wf_log("mac %d,is[%s]",i,mac_list.mac_info[i].mac);

+		sscanf(mac_list.mac_info[i].mac, "%2x:%2x:%2x:%2x:%2x:%2x",(unsigned int *)&mac_tmp[0],(unsigned int *)&mac_tmp[1],(unsigned int *)&mac_tmp[2],(unsigned int *)&mac_tmp[3],(unsigned int *)&mac_tmp[4],(unsigned int *)&mac_tmp[5]);//kw

+

+		wf_log("mac_tmp[%2x:%2x:%2x:%2x:%2x:%2x]",mac_tmp[0],mac_tmp[1],mac_tmp[2],mac_tmp[3],mac_tmp[4],mac_tmp[5]);

+		wf_log("mac_tmp = %p", mac_tmp);

+		if((p_dhcp_info = find_match_sta(&dhcp_info_list,  mac_tmp)) != NULL)

+		{

+			strncpy(mac_list.mac_info[i].hostname,p_dhcp_info->dhcp_info.host_name,sizeof(p_dhcp_info->dhcp_info.host_name));

+			wf_log("hostname %s",mac_list.mac_info[i].hostname);

+		}

+

+	}

+	wf_msg_to_zcore(MSG_CMD_WIFI_GET_USER_LIST_RSP, sizeof(wlan_mac_info_list), &mac_list);

+

+

+out:

+	free_dhcp_list(&dhcp_info_list);

+	safe_free(mac_tmp);

+

+}

+

+#else

+

+static DHCPOFFERADDR_LIST_t *find_match_sta(struct list_head *dhcp_info_list,  RT_802_11_MAC_ENTRY * pEntry)

+{

+	DHCPOFFERADDR_LIST_t * p_dhcp_info = NULL;

+

+	list_for_each_entry(p_dhcp_info, dhcp_info_list, list) {

+		//  printf("[%s] p_dhcp_info:%d\n", __FUNCTION__, p_dhcp_info);

+

+

+		if ((p_dhcp_info->dhcp_info.mac[0] == pEntry->Addr[0]) && (p_dhcp_info->dhcp_info.mac[1] == pEntry->Addr[1]) &&

+		    (p_dhcp_info->dhcp_info.mac[2] == pEntry->Addr[2]) && (p_dhcp_info->dhcp_info.mac[3] == pEntry->Addr[3]) &&

+		    (p_dhcp_info->dhcp_info.mac[4] == pEntry->Addr[4]) && (p_dhcp_info->dhcp_info.mac[5] == pEntry->Addr[5])) {

+

+			return p_dhcp_info;

+

+		}

+	}

+

+

+	return  NULL;

+

+}

+

+/**

+**�����̶�̨���������ڻ�ȡ���ӵ�AP�ȵ������

+*/

+void process_get_user_list_req()

+{

+	wlan_mac_info_list mac_list ;

+	

+    int i,result=0;

+	RT_802_11_MAC_TABLE staList             = {0};

+	struct list_head dhcp_info_list;

+	DHCPOFFERADDR_LIST_t * p_dhcp_info   = NULL;

+	INIT_LIST_HEAD(&dhcp_info_list);

+

+	result = zte_get_mac_list_from_lease(&dhcp_info_list);

+	zte_get_wifi_sta_list(&staList);

+	

+	wf_log("staList.Num:%d", staList.Num);

+	if(staList.Num == 0)

+	{

+			wf_msg_to_zcore(MSG_CMD_WIFI_GET_USER_LIST_RSP, 0, NULL);	

+			goto out;

+	}	

+	memset(&mac_list,0,sizeof(wlan_mac_info_list));

+	mac_list.access_count = staList.Num;

+	for (i = 0; i < staList.Num; i++) {

+			sprintf(mac_list.mac_info[i].mac, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X;",\

+				staList.Entry[i].Addr[0], staList.Entry[i].Addr[1],

+				staList.Entry[i].Addr[2], staList.Entry[i].Addr[3],

+				staList.Entry[i].Addr[4], staList.Entry[i].Addr[5]);

+		

+		wf_log("mac %d,is:%s",i,mac_list.mac_info[i].mac);

+		if((p_dhcp_info = find_match_sta(&dhcp_info_list,  &staList.Entry[i])) != NULL)

+		{

+			strncpy(mac_list.mac_info[i].hostname,p_dhcp_info->dhcp_info.host_name,sizeof(p_dhcp_info->dhcp_info.host_name));

+			wf_log("hostname %s",mac_list.mac_info[i].hostname);

+		}					

+

+	}

+	wf_msg_to_zcore(MSG_CMD_WIFI_GET_USER_LIST_RSP, sizeof(wlan_mac_info_list), &mac_list);

+

+

+out:

+	free_dhcp_list(&dhcp_info_list);

+

+}

+#endif

+

+

+

+void wlan_prepare_sleep()

+{

+	int wifi_status = ap_server->ap0_state;

+	int charging_status = g_pre_is_charging;

+	int sta_num = ap_server->g_sta_num;

+	int wps_status = ap_server->ap0_wps_state;

+

+	wf_log ("wifi_status=%d, charging_status=%d, sta_num=%d, wps_status=%d", wifi_status, charging_status, sta_num, wps_status);

+	check_to_presleep (wifi_status, charging_status, sta_num, wps_status);

+}

+

+static void set_globle_charging_status()

+{

+

+	g_pre_is_charging = chargingcheckstates();

+

+	wf_log ("usb charging is %s", g_pre_is_charging ? "YES" : "NO");

+}

+

+void wlan_ap_msg_handle (MSG_BUF *pMsg)

+{

+	char wifi_cur_state[8] = {0};

+

+	cfg_get_item ("wifi_cur_state", wifi_cur_state, sizeof (wifi_cur_state));

+

+	deal_msg_data(pMsg);

+

+	switch (pMsg->usMsgCmd) {

+	case MSG_CMD_WIFI_CFG_AP:

+		basic_deal_all (WIFI_CFG_AP);           //��SSID �����������wlan0

+		break;

+		

+	case MSG_CMD_WIFI_CFG_AP2:

+		basic_deal_all (WIFI_CFG_MSSID);        // m_SSID ��������

+		break;

+		

+	case MSG_CMD_WIFI_CLOSE:

+	case  MSG_CMD_WIFI_SET_OFF_REQ:// fwp use

+		if ( ap_server->ap0_state) {

+			basic_deal_all (WIFI_CFG_CLOSE);

+		}

+		wf_msg_to_zcore(MSG_CMD_WIFI_SET_OFF_RSP, 0, NULL);

+		break;

+

+	case MSG_CMD_WIFI_OPEN:

+    	case MSG_CMD_WIFI_SET_ON_REQ:  //fwp use

+		wf_log("open wifi");

+		if (! ap_server->ap0_state) {

+			char m_ssid_enable[8] = {0};

+			cfg_get_item ("m_ssid_enable", m_ssid_enable, sizeof (m_ssid_enable));

+			if (1 == atoi (m_ssid_enable)) {

+				basic_deal_all (WIFI_CFG_OPEN_VA0_VA1);

+			} else {

+				basic_deal_all (WIFI_CFG_OPEN);

+			}

+		}

+		wf_msg_to_zcore(MSG_CMD_WIFI_SET_ON_RSP, 0, NULL);

+		break;

+

+// for open cpu start

+	case MSG_CMD_WIFI_CFG_SSID_REQ:

+		basic_deal_all (WIFI_CFG_AP);           //��SSID �����������wlan0

+		ipc_send_message(MODULE_ID_WIFI, pMsg->src_id, MSG_CMD_WIFI_CFG_SSID_RSP, 2, ap_server->ap0_state?"0":"1", 0);

+		

+		break;	

+	case MSG_CMD_WIFI_CFG_PWD_REQ:

+		basic_deal_all (WIFI_CFG_AP);           //��SSID �����������wlan0

+		ipc_send_message(MODULE_ID_WIFI, pMsg->src_id, MSG_CMD_WIFI_CFG_PWD_RSP, 2, ap_server->ap0_state?"0":"1", 0);

+		

+		break;		

+

+	case MSG_CMD_WIFI_SWITCH_REQ:// open cpu  , at ctrl  use

+		wifi_advanced_set (pMsg);

+		wlan_switch_reply(pMsg);

+		break;

+// for open cpu end

+

+		

+	case MSG_CMD_WIFI_ADVANCED:

+		wifi_advanced_set (pMsg);

+		break;

+	case MSG_CMD_WIFI_FORCE_RESTART:// broadcom ,realtek need, form netlink msg

+		//�� wifi firmware crash����������̣�������webui������Ϣ���������Խ�RadioOff��0

+		//cfg_set("wifi_cur_state", WIFI_CLOSED);

+		//cfg_set("RadioOffException", "0");// ����Ϣ��Դͷ������ �쳣�ر�wifi���

+		basic_deal_all (WIFI_CFG_FORCE_RESTART);

+		break;

+	case MSG_CMD_WIFI_SLEEP:

+		cancel_all_timer();

+		wlan_prepare_sleep();

+		break;

+	case MSG_CMD_WIFI_COVERAGE:

+		basic_deal_all (WIFI_CFG_RF);

+		break;

+	case MSG_CMD_WIFI_MAC:

+		//remove_all_acl_timer();

+		set_mac_access();

+		break;

+	case MSG_CMD_WIFI_CHANNEL_FOLLOW:

+		basic_deal_all (WIFI_CFG_CHANNEL_FOLLOW);

+		break;

+#if  (PRODUCT_TYPE == PRODUCT_PHONE)			

+    /*�̶�̨��Ϣ������ʼ*/

+	case MSG_CMD_WIFI_GET_STATE_REQ:

+		wf_msg_to_zcore(MSG_CMD_WIFI_GET_STATE_RSP, sizeof(wifi_cur_state), wifi_cur_state);

+		break;

+	case MSG_CMD_WIFI_GET_INFO_REQ:

+		process_get_wifi_info();

+		break;

+	case MSG_CMD_WIFI_GET_USER_LIST_REQ:

+        	process_get_user_list_req();

+	    	break;

+	case MSG_CMD_WIFI_SET_SECURITY_REQ:

+		basic_deal_all (WIFI_CFG_AP);           //��SSID �����������wlan0

+		break;

+#endif		

+	case MSG_CMD_AP_STA_CONNECTED:

+		add_sta_mac(pMsg->aucDataBuf);

+		break;

+	case MSG_CMD_AP_STA_DISCONNECTED:

+		remove_sta_mac(pMsg->aucDataBuf);

+		//wlan_prepare_sleep();

+		break;

+

+	/*�̶�̨��Ϣ��������*/

+	case MSG_CMD_WIFI_WPS:

+		wifi_wps_set (pMsg);

+		break;

+	case MSG_CMD_WIFI_WPS_DOWN:

+#ifdef __REALTEK_8192_CHIP__

+		handle_wps_mac (pMsg);

+		handle_wps_result (pMsg);

+#endif

+		wps_down (pMsg);

+		wlan_prepare_sleep();

+		break;

+	case MSG_CMD_WIFI_WPS_UP:

+		wps_up();

+		wlan_prepare_sleep();

+		break;

+	case MSG_CMD_WIFI_TSW_SET:

+		handle_tsw_setting();       //�ֱ����˯�߻���ʱ�䣬���ö�ʱ˯�߻�����ض�ʱ��

+		break;

+	case MSG_CMD_WIFI_TSW_CLOSE:

+		handle_tsw_close();         //ɾ����ʱ˯�߻��Ѷ�ʱ��

+		break;

+	case MSG_CMD_RTC_TIME_UPDATE:

+		handle_tsw_setting();       //rtc ʱ����º���Ҫ�����趨ʱ��

+		break;

+	case MSG_CMD_WIFI_RESET_TIMER:

+		wlan_reset_sleep_timer();

+		break;

+	case MSG_CMD_USB_CHARGING_CHANGED:

+		usb_charging_changed();

+		break;

+	case MSG_CMD_WIFI_NOTIFY_CHARGER_STATUS:

+		fwp_charging_changed(*(UINT32*)pMsg->aucDataBuf);

+		break;	

+	case MSG_CMD_STA_COUNT_CHANGE:

+#ifdef __REALTEK_8192_CHIP__

+		captureWlanStaInfo();

+#endif

+		wf_msg_to_mmi(MSG_CMD_STA_COUNT_CHANGE, 0, NULL);

+		wlan_prepare_sleep();

+		break;

+	case RTC_MSG_ALARM_ELAPSED:

+		process_rtc_elapsed (pMsg);

+		break;

+	case MSG_CMD_WIFI_STATION_CONNECTED_ENABLE_AP_CMD:

+		basic_deal_all (WIFI_CFG_APSTA_OPEN_AP);

+		break;

+	default:

+		break;

+	}

+}

+

+

+#endif

+/*R1682 wifi������� end*/

+

+//���wifi�����Ƿ���ڣ�����ʱ״̬�Ƿ�ΪLink

+int check_wlan (void)

+{

+	int find_wlan = -1;

+	int i = 0, sum = 0;

+

+	while (-1 == find_wlan) {

+		wf_log ("finding wlan  i=%d, %d s...", i , sum);

+		find_wlan = wfsystem ("ifconfig wlan0");

+		if (-1==find_wlan) {

+			if (sum >= 60)

+				return  -1;

+			sum += 2 * i;

+			sleep (2 * i++);

+		}

+	}

+	return 0;

+}

+static const char* cmdid_to_string (int status)

+{

+	switch (status) {

+		CASE_RETURN_STR (MSG_CMD_WIFI_CFG_AP); //������ssid�Ļ�����������Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_CFG_AP2);                  //���ø�ssid�Ļ�����������Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_CLOSE);                   //�ر�wifi����Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_OPEN);                    //����wifi����Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_FORCE_RESTART);                 //����wifi����Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_ADVANCED);                //wifi�ĸ߼�����������Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_WPS);                     //����WPS���ܣ�2�����Զ��أ��ʲ���Ҫ�ر���Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_WPS_UP);                  //WPSģ�鷢����WPS��������Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_WPS_DOWN);                //WPSģ�鷢����WPS �رյ���Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_SLEEP);                   //WEBUI����˯��ʱ������Ϣ

+		CASE_RETURN_STR (MSG_CMD_CAPTURE_STATION);              //��ѯsta���������

+		CASE_RETURN_STR (MSG_CMD_WIFI_COVERAGE);                //����wifi�ĸ��Ƿ�Χ

+		CASE_RETURN_STR (MSG_CMD_WIFI_MAC);                     //����mac���˹���

+		CASE_RETURN_STR (MSG_CMD_WIFI_CHANNEL_FOLLOW);          //����wifi AP�ŵ�����STA

+		CASE_RETURN_STR (MSG_CMD_USB_CHARGING_CHANGED);         //������⵽usb���״̬�仯�ϱ���Ϣ

+		//for apstation

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_OPEN);            //��apsta����

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_CLOSE);           //�ر�apsta����

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_CLOSE_OPEN_MSSID); //��apsta���رն�ssid

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_SCAN);            //ɨ���ȵ�

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_CONNECT);         //�����ȵ�

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_CONNECT_TIMEOUT); //���ӳ�ʱ�Ĵ�����Ϣ

+

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_SIM_INIT_TIMER_PROCESS);        //eap-sim/aka���ܣ���ѯsim���������õĶ�ʱ����Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_GET_SCAN_RESULTS); // wpa_supplicant����ɨ��8sһ��

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_DISCONNECT);                    //�����Ͽ��������ӵ��ȵ�

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_SPOT_UPDATE);                   //�����ȵ��б�

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_EVENT_CONNECTING);            //wpa_supplicant���ڳ��������¼���Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_EVENT_CONNECTED);               //apsta���ȵ����ӳɹ�֪ͨ��Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_EVENT_DISCONNECTED);            //apsta���ȵ�Ͽ�����֪ͨ��Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_BLC_CONNECTED);               //blc���͵����ӳɹ���station��ip�ѷ��䵽

+		CASE_RETURN_STR (MSG_CMD_BLC_OPEN_WIFISTATION_ACCESS);                //blc������Ϣ��apsta����

+		CASE_RETURN_STR (MSG_CMD_BLC_CLOSE_WIFISTATION_ACCESS);               //blc������Ϣ�Ͽ�apsta����

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_NO_AVAILABLE_AP);

+//	CASE_RETURN_STR(MSG_CMD_WIFI_STATION_PROCESS_TRYING_ASSOC);

+		CASE_RETURN_STR(MSG_CMD_WIFI_STATION_TEMP_DISABLED);

+		CASE_RETURN_STR(MSG_CMD_WIFI_STATION_FAILED_SET);

+

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_END);                           //apstation����Ϣ��Χend

+		//timing of sleep wake up

+		CASE_RETURN_STR (MSG_CMD_WIFI_TSW_SET);        //���ö�ʱ˯�߻��ѵ���Ϣ

+		CASE_RETURN_STR (MSG_CMD_WIFI_TSW_CLOSE);      //�رն�ʱ˯�߻��ѹ��ܵ���Ϣ

+		CASE_RETURN_STR (MSG_CMD_RTC_TIME_UPDATE);     //rtcʱ�� �������������ö�ʱ˯�߻���

+		CASE_RETURN_STR (MSG_CMD_WIFI_RESET_TIMER);    //mmi������������˯��timer

+		CASE_RETURN_STR (RTC_MSG_ALARM_ELAPSED);    //mmi������������˯��timer

+		CASE_RETURN_STR (MSG_CMD_STA_COUNT_CHANGE);

+		CASE_RETURN_STR (MSG_CMD_CSIM_AUTH_RSP);

+		CASE_RETURN_STR (MSG_CMD_CARD_MODE_RSP);

+		CASE_RETURN_STR (MSG_CMD_PIN_STATUS_RSP);

+		CASE_RETURN_STR (MSG_CMD_PIN_VERIFY_RSP);

+		CASE_RETURN_STR (MSG_CMD_PIN_NUM_RSP);

+		CASE_RETURN_STR (MSG_CMD_CRSM_RSP);

+		CASE_RETURN_STR (MSG_CMD_CIMI_RSP);

+		CASE_RETURN_STR (MSG_CMD_WIFIKEY_SET_RSP);

+		CASE_RETURN_STR (MSG_CMD_NET_WAN_DIAL_FAIL);

+		CASE_RETURN_STR (MSG_CMD_WIFI_SWITCH_REQ);

+		CASE_RETURN_STR (MSG_CMD_WIFI_SWITCH_RSP);

+		CASE_RETURN_STR (MSG_CMD_WIFI_CFG_SSID_REQ);

+		CASE_RETURN_STR (MSG_CMD_WIFI_CFG_SSID_RSP);

+		CASE_RETURN_STR (MSG_CMD_WIFI_CFG_PWD_REQ);

+		CASE_RETURN_STR (MSG_CMD_WIFI_CFG_PWD_RSP);

+		CASE_RETURN_STR (MSG_CMD_WIFI_SET_ON_REQ);				//��WiFi����

+		CASE_RETURN_STR (MSG_CMD_WIFI_SET_ON_RSP);				//��WiFi��Ӧ

+		CASE_RETURN_STR (MSG_CMD_WIFI_SET_OFF_REQ);				//�ر�WiFi����

+		CASE_RETURN_STR (MSG_CMD_WIFI_SET_OFF_RSP);				//�ر�WiFi��Ӧ

+		CASE_RETURN_STR (MSG_CMD_WIFI_SET_SECURITY_REQ);			//����WiFi��ȫģʽ��SSID����������

+		CASE_RETURN_STR (MSG_CMD_WIFI_SET_SECURITY_RSP);			//����WiFi��ȫģʽ��SSID�������Ӧ

+

+		CASE_RETURN_STR (MSG_CMD_WIFI_GET_STATE_REQ); 			//��ȡWiFi״̬(����)����

+		CASE_RETURN_STR (MSG_CMD_WIFI_GET_STATE_RSP); 			//��ȡWiFi״̬(����)��Ӧ

+		CASE_RETURN_STR (MSG_CMD_WIFI_GET_INFO_REQ);				//��ȡWiFi��Ϣ(SSID�����롢��ȫģʽ)����

+		CASE_RETURN_STR (MSG_CMD_WIFI_GET_INFO_RSP);				//��ȡWiFi��Ϣ(SSID�����롢��ȫģʽ)��Ӧ

+		CASE_RETURN_STR (MSG_CMD_WIFI_GET_USER_LIST_REQ); 		//��ȡWiFi�û��б�����

+		CASE_RETURN_STR (MSG_CMD_WIFI_GET_USER_LIST_RSP); 		//��ȡWiFi�û��б���Ӧ

+		CASE_RETURN_STR (MSG_CMD_WIFI_NOTIFY_CHARGER_STATUS);

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_SUPPLICANT_EVT);		

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_INDICATE_SCAN_RESULTS);

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_FORGET);

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_DEBUG_DUMP);

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_WPA_CMD);

+		CASE_RETURN_STR (MSG_CMD_AP_STA_CONNECTED);

+		CASE_RETURN_STR (MSG_CMD_AP_STA_DISCONNECTED);

+		CASE_RETURN_STR (MSG_CMD_WIFI_STATION_CONNECTED_ENABLE_AP_CMD);

+

+

+	};

+	return "UNKNOWN  CMD ID";

+}

+

+static const char* modid_to_string (int status)

+{

+	switch (status) {

+		CASE_RETURN_STR (MODULE_ID_WEB_CGI);           /* 0x1001  WEB CGIģ�����Ϣ����ID*/

+		CASE_RETURN_STR (MODULE_ID_WIFI);              /*0x 1003 wifi control*/

+		CASE_RETURN_STR (MODULE_ID_WLAN_SERVER);       /* 0x1004 wifi�Լ����Լ�����Ϣ�����msg id*/

+		CASE_RETURN_STR (MODULE_ID_MMI);               //0x 1005 add by wuhong for ufi MMI

+		CASE_RETURN_STR (MODULE_ID_RTC_SERVICE);  //0x1007

+		CASE_RETURN_STR (MODULE_ID_AT_CTL);    			/*0x1021 at ctl�ID*/

+		CASE_RETURN_STR (MODULE_ID_MAIN_CTRL);         /*0x1028 �����ID*/

+		CASE_RETURN_STR (MODULE_ID_ZSSID);             /*0x1029 zte_ssid added by zhangnan00123908 20131121*/

+		CASE_RETURN_STR (MODULE_ID_WPA_SUPPLICANT);  //0x102D

+		CASE_RETURN_STR (MODULE_ID_ZCORE);  //0x2003

+		CASE_RETURN_STR (MODULE_ID_MMI_SVR);  //0x2003

+	}

+	return "UNKNOWN  Module ID";

+}

+

+/**************************************************************************

+* description of function:  wlan deal queue

+* input parameter: pstMsg:message content

+* return value: 0:success -1:error

+* zhaoyong set up this function

+**************************************************************************/

+int wifi_parse_msg (MSG_BUF *pMsg)

+{

+	int ret = -1;

+	wf_log ("src_mod=[0x%x]%s, cmd=[0x%x]%s", pMsg->src_id, modid_to_string (pMsg->src_id),

+	        pMsg->usMsgCmd, cmdid_to_string (pMsg->usMsgCmd));

+

+	if (pMsg->ulMagic != MSG_MAGIC_WORD) {

+		wf_log ("pstMsg magic error");

+		return -1;

+	} else if (pMsg->dst_id != MODULE_ID_WIFI) {

+		wf_log ("target is not wlan pstMsg->dst_id is %x", pMsg->dst_id);

+		return -1;

+	}

+

+#if (PRODUCT_TYPE == PRODUCT_PHONE)//kw3 

+	if(pMsg->usMsgCmd != MSG_CMD_WIFI_RESET_TIMER &&

+	   pMsg->usMsgCmd != MSG_CMD_USB_CHARGING_CHANGED &&

+	   pMsg->usMsgCmd != MSG_CMD_WIFI_NOTIFY_CHARGER_STATUS )

+		check_wifi_mac();

+#else

+	if(pMsg->usMsgCmd != MSG_CMD_WIFI_RESET_TIMER &&

+	   pMsg->usMsgCmd != MSG_CMD_USB_CHARGING_CHANGED)

+		check_wifi_mac();

+

+#endif

+

+#ifdef __STA_FUNC__

+	ret = wlan_sta_parse_msg(pMsg);

+#endif

+

+#ifdef __AP_FUNC__

+#ifdef __STA_FUNC__ //kw 3

+	if(-1 == ret)// sta not deal the msg

+#endif

+		wlan_ap_msg_handle (pMsg);

+#endif

+

+	if(pMsg->usMsgCmd != MSG_CMD_WIFI_RESET_TIMER && 

+		pMsg->usMsgCmd != MSG_CMD_USB_CHARGING_CHANGED &&

+		pMsg->usMsgCmd != MSG_CMD_AP_STA_CONNECTED &&

+		pMsg->usMsgCmd != MSG_CMD_STA_COUNT_CHANGE &&

+		pMsg->usMsgCmd != MSG_CMD_AP_STA_DISCONNECTED &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_WPS_DOWN &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_GET_SCAN_RESULTS &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_NO_AVAILABLE_AP &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_CONNECTED_ENABLE_AP_CMD &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_EVENT_CONNECTED &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_EVENT_DISCONNECTED &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_EVENT_CONNECTING &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_TEMP_DISABLED &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_FAILED_SET &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_CONNECT_TIMEOUT &&

+		pMsg->usMsgCmd != MSG_CMD_WIFI_STATION_BLC_CONNECTED &&

+		pMsg->usMsgCmd != MSG_CMD_BLC_CLOSE_WIFISTATION_ACCESS &&

+		pMsg->usMsgCmd != MSG_CMD_BLC_OPEN_WIFISTATION_ACCESS)

+		cfg_save();

+	return 0;

+}

+

+

+

+/*sig handler*/

+static void sig_handler(int sig)

+{

+	wf_log("receive signal %d\n", sig);

+

+    if((sig == SIGINT) || (sig == SIGTERM)) {

+        wf_log("receive signal %d\n", sig);

+        exit(0);

+    }

+	else if(sig == SIGUSR1)

+	{

+/**

+@@@@	deal the wifi sleep problem

+1. not sleep

+2. delay the sleep

+3. sleep adhead of time

+**/

+		wf_log("receive signal SIGUSR1 %d\n", sig);

+

+	}

+}

+

+

+static void sig_init(void)

+{

+    pthread_t tid = pthread_self();

+    wf_log("tid:%lu", tid);

+    struct sigaction sigact;

+    int ret;

+    sigset_t signal_mask;

+    sigemptyset(&signal_mask);

+    sigaddset(&signal_mask, SIGPIPE);

+    ret = pthread_sigmask(SIG_BLOCK, &signal_mask, NULL);

+    if(ret != 0) {

+        wf_log("block SIGPIPE error\n");

+    }

+

+    sigact.sa_handler = sig_handler;

+    sigact.sa_flags = 0;

+    sigemptyset(&sigact.sa_mask);

+    sigaction(SIGINT, &sigact, NULL);

+    sigaction(SIGTERM, &sigact, NULL);

+    sigaction(SIGUSR1, &sigact, NULL);

+

+    /*ignore SIGPIPE*/

+    sigact.sa_handler = SIG_IGN;

+    sigaction(SIGPIPE, &sigact, NULL);

+

+}

+

+

+void check_wifi_mac()

+{

+	char  wifi_mac[20] = {0};

+	int   i = 0;

+	

+	cfg_get_item("wifi_mac", wifi_mac, sizeof(wifi_mac));

+

+	if(strlen(wifi_mac)==0){

+		for(i=0; i < 50; i++){

+			wf_log ("############################################################");

+			wf_log ("####  Please set a globally unique Valid MAC by UeTester                 ");

+			wf_log ("####   watch:   at+mac=xxxxxxxxxxxx,                                                ");

+			wf_log ("####   mifi:   at+mac=xxxxxxxxxxxx,    at+mac2=xxxxxxxxxxxx            ");

+			wf_log ("####   MAC address length  is 12 bytes, can not be all of 0 or  F         ");

+			wf_log ("####   MAC address can not be a broadcast address                           ");

+			wf_log ("############################################################\n");

+			sleep (6);

+		}

+		softap_assert("Please set a globally unique Valid MAC by UeTester,  at+mac=xxxxxxxxxxxx!!!");

+	}

+}

+

+

+void init_config()

+{

+	cfg_set ("WscModeOption", "0");

+	cfg_set ("wifiSleep", "0");

+	cfg_set ("wifi_root_dir", "/etc_rw");

+	cfg_set ("sta_count", "0");

+	cfg_set ("m_sta_count", "0");

+	cfg_set ("sleep_debug", "0");

+	//cfg_set("sta_ip_status", "disconnect");

+	//cfg_set("scan_finish", "0");

+	//cfg_set("EX_APLIST", "");

+	//cfg_set("EX_APLIST1", "");

+	//cfg_set("manual_d_wifi", "0");

+	//cfg_set("EX_SSID1", "");

+	//cfg_set("EX_AuthMode", "");

+	//cfg_set("EX_EncrypType", "");

+	//cfg_set("EX_DefaultKeyID", "");

+	//cfg_set("EX_WEPKEY", "");

+	//cfg_set("EX_WPAPSK1", "");

+	//cfg_set("EX_wifi_profile", "");

+	//cfg_set("EX_mac", "");

+

+	cfg_set ("wpa_supplicant", "stop");

+	cfg_set ("wifi_cur_state", WIFI_CLOSED);

+#if (PRODUCT_TYPE == PRODUCT_MIFI_CPE)

+	cfg_set ("wifiEnabled", "1");

+#elif (PRODUCT_TYPE == PRODUCT_PHONE)

+	cfg_set ("wifiEnabled", "0");//yaoyuan special need:everytime system wakes up, wifi is off

+#else

+	cfg_set ("wifiEnabled", "0");

+#endif

+

+	ensure_config_dir_exist(WIFI_DIR);

+}

+

+

+int wlan_main (int argc, char *argv[])

+{

+	int wlan_msg_queue_id = 0;

+	int iRet = -1;

+	MSG_BUF wlanMsg={0};

+	int threadid = 0;

+	char wifiEnabled[8] = {0};

+	prctl(PR_SET_NAME, "wlan", 0, 0, 0);

+//the first step,  log  and envirenment init

+	loglevel_init();

+	wf_log ("wlan-server start, build time:[%s %s]", __DATE__,__TIME__);

+	sig_init();

+#ifdef __AP_FUNC__

+#ifdef __USE_AES__

+	wifi_aes_init_key();

+	if (2 == wifi_decrypt_code())

+		wifi_encrypt_code();

+#else

+	wifi_decode_b2s();

+#endif	

+#endif

+

+#if !(defined(__ESP_8089_CHIP__))

+	send_get_mac_req();

+#endif

+	

+//second step, nv init, ssid and wifi_mac init

+	//create main thread msg queue id

+	wlan_msg_queue_id = wf_create_msg_qid (MODULE_ID_WIFI);

+#ifdef __STA_FUNC__	

+	sem_init (&g_wpa_supplicant_id, 0 , 0);

+#endif

+#ifdef __AP_FUNC__

+	#ifndef __REALTEK_8192_CHIP__

+	sem_init (&g_hostap_id, 0 , 0);

+	#endif

+#endif

+

+

+	init_config();

+#if !(defined(__ESP_8089_CHIP__))

+	get_mac_config_ssid_key_nv();

+#endif

+

+#ifdef __AP_FUNC__	

+#if  defined( __RDA_5995_CHIP__)

+	ap_server = 	&rda5995_ap;

+#elif defined(__ESP_8089_CHIP__)

+	ap_server = 	&esp8089_ap;

+#elif defined(__REALTEK_8192_CHIP__)

+	ap_server = 	&realtek_8192_ap;

+#elif defined(__XR_819_CHIP__)

+	ap_server = 	&xr819_ap;

+#elif defined(__SSV_6X5X_CHIP__)

+	ap_server = 	&ssv6x5x_ap;

+#elif defined(__AIC_8800DW_CHIP__)

+	ap_server = 	&aic8800dw_ap;

+#endif

+	/*insmod, and , start hostapd*/

+	ap_server->init(ap_server);

+#endif

+

+#ifdef __STA_FUNC__

+#if  defined( __RDA_5995_CHIP__)

+	sta_manager = 	&rda5995_sta;

+#elif defined(__ESP_8089_CHIP__)

+	sta_manager = 	&esp8089_sta;

+#elif defined(__REALTEK_8192_CHIP__)

+	sta_manager = 	&realtek_sta;

+#elif defined(__SSV_6X5X_CHIP__)

+	sta_manager = 	&ssv6x5x_sta;

+#elif defined(__AIC_8800DW_CHIP__)

+	sta_manager = 	&aic8800dw_sta;

+#endif

+	sta_manager->init(sta_manager);

+#endif

+

+	if (check_wlan() == -1) {

+		wf_log (" wlan0 interface is not exist ,please contact wlan driver engineer");

+		cfg_set("wifi_chip", "0");

+		cfg_save();

+		return -1;

+	}

+

+#if defined(__ESP_8089_CHIP__)

+	wifi_fw_mac_config_ssid(ap_server);

+#endif

+

+	wf_log ("wifichip exist, set  nv to tell mmi");

+	cfg_set("wifi_chip", "1");

+	

+

+

+	#ifdef  __STA_FUNC__

+	wlan_statemachine_init();

+	#endif

+

+

+//thrid step,  according wifiEnabled, to open wifi

+

+	cfg_get_item ("wifiEnabled", wifiEnabled, sizeof (wifiEnabled));

+	if (!strcmp (wifiEnabled, "1")) {

+#ifdef __AP_FUNC__

+		wlan_ap_open();

+#endif

+

+#ifdef __STA_FUNC__

+		wlan_station_open();

+#endif

+	}

+	else{

+		wf_log ("rda5995 to rmmod");

+#if  defined( __RDA_5995_CHIP__)

+		sta_manager->drv_proxy.drv_deinit(&sta_manager->drv_proxy);

+#endif		

+	}

+

+#ifdef __AP_FUNC__		

+	qrcode_make();	

+	set_globle_charging_status();

+	wlan_prepare_sleep();

+	handle_tsw_setting();				//���ö�ʱ˯�߻���

+#endif

+

+

+#if  defined  ( __RDA5995_WIFI_CHIP__) && (PRODUCT_TYPE == PRODUCT_PHONE)	

+	wf_msg_to_zcore(MSG_CMD_WIFI_IS_READY, 0, NULL);  //wifi������֪ͨ�̶�̨��ʾwifi״̬

+#endif

+

+	//wf_create_thread ("netlink", netlink_loop);

+	hotplug_parse_register(DEVICE_TYPE_APP_WIFI, wifi_app_msg_parse);

+

+#ifdef  __STA_FUNC__

+	wf_create_thread ("wlan-station", station_loop);

+#endif

+

+#ifdef __AP_FUNC__	

+#ifndef __REALTEK_8192_CHIP__

+	wf_create_thread ("hostap", hostap_loop);

+#if defined(__MULTI_AP__)

+	wf_log ("hostap_multi thread create");

+	wf_create_thread ("hostap_multi", hostap_loop_multi);

+#endif

+

+#endif

+#endif

+

+	wf_log (" main thread getpid=%d", getpid());

+

+	//prctl(PR_SET_NAME, "wlan-main", 0, 0, 0);

+	while (1) {

+		memset (&wlanMsg, 0, sizeof (MSG_BUF));

+		iRet = msgrcv (wlan_msg_queue_id, &wlanMsg, sizeof (MSG_BUF) - sizeof (LONG), 0, 0);

+		if (iRet == -1) {

+			continue;

+		}

+

+		wifi_parse_msg (&wlanMsg);

+	}

+	return 0;

+}

+

+

diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mainctrl/net_other.c b/lynq/MD310EU/ap/app/zte_comm/zte_mainctrl/net_other.c
new file mode 100755
index 0000000..2110999
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mainctrl/net_other.c
@@ -0,0 +1,1377 @@
+#include    <stdio.h>
+#include    <stdlib.h>
+#include    <sys/ioctl.h>
+#include    <arpa/inet.h>
+#include    <net/if.h>
+#include    <net/route.h>
+#include    <string.h>
+#include    <dirent.h>
+
+#include "zte_mainctrl.h"
+
+extern void str_vary_dit(char * str, char *result);
+#if 0
+/*
+ * substitution of getNthValue which dosen't destroy the original value
+ */
+static int static_getNthValueSafe(int index, char *value, char delimit, char *result, int len)
+{
+	int i = 0, result_len = 0;
+	char *begin, *end;
+
+	if (!value || !result || !len)
+		return -1;
+
+	begin = value;
+	end = strchr(begin, delimit);
+
+	while (i < index && end) {
+		begin = end + 1;
+		end = strchr(begin, delimit);
+		i++;
+	}
+
+	//no delimit
+	if (!end) {
+		if (i == index) {
+			end = begin + strlen(begin);
+			result_len = (len - 1) < (end - begin) ? (len - 1) : (end - begin);
+		} else
+			return -1;
+	} else
+		result_len = (len - 1) < (end - begin) ? (len - 1) : (end - begin);
+
+	memcpy(result, begin, result_len);
+	*(result + result_len) = '\0';
+
+	return 0;
+}
+
+/*change the value of the Nth macip list */
+/*the macip list format is:
+  [mac1]+[ip1];[mac2]+[ip2];....*/
+/*add by lyf 2012/5/21*/
+static int changeNthValue(int index, char *value, char delimit, char *result, char *web_list)
+{
+	int i = 0;
+	int front_len = 0;
+	int end_len = 0;
+	int edit_len = 0;
+	int total_len = 0;
+
+	char *begin, *end;
+	char tempchar[NV_MACIP_LIST_MAX_LEN] = {0};
+
+	if (!value || !result || !web_list)
+		return -1;
+
+	begin = value;
+	end = strchr(begin, delimit);
+
+	while (i < index && end) {
+		begin = end + 1;
+		end = strchr(begin, delimit);
+		i++;
+	}
+
+	//no delimit
+	if (!end) {
+		if (i == index) {
+			end = begin + strlen(begin) - 1;
+			front_len = begin - value;
+			strncpy(tempchar, value, front_len);
+			strncpy(tempchar + front_len, web_list, (strlen(web_list)));
+			total_len = front_len + strlen(web_list);
+		} else {
+			return -1;
+		}
+	} else {
+		front_len = begin - value;
+		edit_len = end - begin;
+		end_len = strlen(value) - front_len - edit_len;
+		strncpy(tempchar, value, front_len);
+		strncpy(tempchar + front_len, web_list, strlen(web_list));
+		strncpy(tempchar + front_len + strlen(web_list), value + front_len + edit_len, end_len);
+		total_len = front_len + strlen(web_list) + end_len;
+
+
+	}
+
+	memcpy(result, tempchar, total_len);
+	*(result + total_len) = '\0';
+
+	return 0;
+}
+
+/*delete the value of the Nth macip list*/
+/*the macip list format is:
+  [mac1]+[ip1];[mac2]+[ip2];....*/
+/*add by lyf 2012/5/21*/
+static int deleteNthValue(int index,  char *value, char delimit)
+{
+	char *begin, *end;
+	int i = 0, j = 0;
+	int need_check_flag = 0;
+	char *buf = NULL;
+	int default_len = 0;
+
+	if (!value)
+		return -1;
+	buf = strdup(value);
+	begin = buf;
+	end = strchr(begin, delimit);
+	while (end) {
+		if (i == index) {
+			memset(begin, 0, end - begin);
+			if (index == 0)
+				need_check_flag = 1;
+			break;
+		}
+		begin = end;
+		end = strchr(begin + 1, delimit);
+		i++;
+	}
+
+	if (!end && index == i)
+		memset(begin, 0, strlen(begin));
+
+	if (need_check_flag) {
+		for (i = 0; i < strlen(value); i++) {
+			if (buf[i] == '\0')
+				continue;
+			if (buf[i] == ';')
+				buf[i] = '\0';
+			break;
+		}
+	}
+	default_len = strlen(value);
+	for (i = 0, j = 0; i < strlen(value); i++) {
+		if (buf[i] != '\0') {
+			value[j++] = buf[i];
+		}
+	}
+	for (i = j; i < default_len; i++)
+		value[i] = '\0';
+
+	free(buf);
+	return 0;
+}
+//·ÅÈëzte_router½ø³ÌʵÏÖ,opms_wan_modeÓ¦¸Ã¸ù¾Ýµ±Ç°µÄȱʡÍâÍø¿Ú£¬Ê¶±ð³öethwan_mode¡¢pswan_mode¡¢wifiwan_modeÆäÖеÄÒ»ÖÖ
+void zte_qos_list_run(void)
+{
+	char Qos_enable[CONFIG_DEFAULT_LENGTH] = {0};
+	char Qos_auto_control[CONFIG_DEFAULT_LENGTH] = {0};
+	char list[NV_QOS_LIST_MAX_LEN] = {0};
+	char rec[NV_QOS_LIST_MAX_LEN] = {0};
+	char opms_wan_mode[CONFIG_DEFAULT_LENGTH] = {0};
+	char wan_if[CONFIG_DEFAULT_LENGTH] = {0};
+	char lan_if_cable[CONFIG_DEFAULT_LENGTH] = {0};
+	char lan_if_wifi[CONFIG_DEFAULT_LENGTH] = {0};
+	char uplimit_total[CONFIG_DEFAULT_LENGTH] = {0};
+	char downlimit_total[CONFIG_DEFAULT_LENGTH] = {0};
+	int i = 0;
+	char ip_list[32] = {0};
+	char maxdownload[32] = {0};
+	char maxupload[32] = {0};
+	char tempchar[32] = {0};
+	cfg_get_item("Qos_enable", Qos_enable, sizeof(Qos_enable));
+	cfg_get_item("Qos_auto_control", Qos_auto_control, sizeof(Qos_auto_control));
+	cfg_get_item("opms_wan_mode", opms_wan_mode, sizeof(opms_wan_mode));
+	cfg_get_item("Qos_control_list", list, sizeof(list));
+	cfg_get_item("UpLimit_Total", uplimit_total, sizeof(uplimit_total));
+	cfg_get_item("DownLimit_Total", downlimit_total, sizeof(downlimit_total));
+
+	if (0 == strlen(opms_wan_mode)) {
+		return;
+	}
+
+	if (!strcmp(opms_wan_mode, "PPPOE")) {
+		strcpy(wan_if, "ppp0");
+		strcpy(lan_if_cable, "eth1");
+		strcpy(lan_if_wifi, "ath0");
+
+	}
+	if (!strcmp(opms_wan_mode, "PPP")) {
+		strcpy(wan_if, "usb0");
+		strcpy(lan_if_cable, "eth0");
+		strcpy(lan_if_wifi, "ath0");
+
+	}
+	if (!strcmp(opms_wan_mode, "DHCP") || !strcmp(opms_wan_mode, "STATIC")) {
+		strcpy(wan_if, "eth0");
+		strcpy(lan_if_cable, "eth1");
+		strcpy(lan_if_wifi, "ath0");
+
+	}
+	if (!strcmp(opms_wan_mode, "BRIDGE")) {
+		return;
+	}
+	/*clear the qdisc first before func return,important!(the qos state from enabled to disabled)*/
+	/*clear upload*/
+	ZTE_LOG(LOG_INFO, "delete the qdisc ################"); /*lint !e26*/
+	doSystem("tc qdisc del dev %s root", wan_if);
+	/*clear download*/
+	doSystem("tc qdisc del dev %s root", lan_if_cable);
+	doSystem("tc qdisc del dev %s root", lan_if_wifi);
+	/*flush the mangle table*/
+	doSystem("iptables -t mangle -F");
+	ZTE_LOG(LOG_INFO, "delete over qdisc::"); /*lint !e26*/
+
+	if (!strlen(Qos_enable)) {
+		return;
+	}
+	if (!atoi(Qos_enable)) {
+		return;
+	}
+	if (atoi(Qos_auto_control)) {
+		return;
+	}
+
+	if (0 == strlen(list)) {
+		return;
+	}
+	ZTE_LOG(LOG_INFO, "list= %s", list); /*lint !e26*/
+
+	/*mark data first for the upload limit(because of SNAT )*/
+	doSystem("iptables -t mangle -A PREROUTING  -p tcp -m length --length :64 -j MARK --set-mark 256 ");
+	doSystem("iptables -t mangle -A PREROUTING  -p tcp -m length --length :64 -j RETURN  ");
+
+	while ((static_getNthValueSafe(i++, list, ';', rec, sizeof(rec)) != -1)) {
+		// get ip
+		if ((static_getNthValueSafe(0, rec, '+', ip_list, sizeof(ip_list)) == -1)) {
+			continue;
+		}
+		if (strlen(ip_list)) {
+			ZTE_LOG(LOG_INFO, "ip_list= %s", ip_list); /*lint !e26*/
+			sprintf(tempchar, "%d", i);
+			doSystem("iptables -t mangle -A PREROUTING -s %s -j MARK --set-mark %s ", ip_list, tempchar);
+			doSystem("iptables -t mangle -A PREROUTING -s %s -j RETURN ", ip_list);
+			memset(tempchar, 0, sizeof(tempchar));
+		}
+		memset(ip_list, 0, sizeof(ip_list));
+		memset(rec, 0, sizeof(rec));
+	}
+	/*upload&&download*/
+	doSystem("tc qdisc add dev %s root handle 1: htb", wan_if);
+	doSystem("tc qdisc add dev %s root handle 1: htb default 256", lan_if_cable);
+	doSystem("tc qdisc add dev %s root handle 1: htb default 256", lan_if_wifi);
+
+	doSystem("tc class add dev %s parent 1: classid 1:256 htb rate %skbit ceil %skbit prio 0 ", wan_if, uplimit_total, uplimit_total);
+	doSystem("tc class add dev %s parent 1: classid 1:256 htb rate %skbit ceil %skbit prio 0 ", lan_if_cable, downlimit_total, downlimit_total);
+	doSystem("tc class add dev %s parent 1: classid 1:256 htb rate %skbit ceil %skbit prio 0 ", lan_if_wifi, downlimit_total, downlimit_total);
+
+
+	doSystem("tc qdisc add dev %s parent 1:256 handle 256: sfq perturb 5 ", wan_if);
+	doSystem("tc qdisc add dev %s parent 1:256 handle 256: sfq perturb 5 ", lan_if_cable);
+	doSystem("tc qdisc add dev %s parent 1:256 handle 256: sfq perturb 5 ", lan_if_wifi);
+
+	doSystem("tc filter add dev %s parent 1:0 protocol ip prio 0 handle 256 fw classid 1:256", wan_if);
+
+	i = 0;
+	while ((static_getNthValueSafe(i++, list, ';', rec, sizeof(rec)) != -1)) {
+		// get ip
+		if ((static_getNthValueSafe(0, rec, '+', ip_list, sizeof(ip_list)) == -1)) {
+			continue;
+		}
+		// get maxdownload
+		if ((static_getNthValueSafe(1, rec, '+', maxdownload, sizeof(maxdownload)) == -1)) {
+			continue;
+		}
+		// get maxupload
+		if ((static_getNthValueSafe(2, rec, '+', maxupload, sizeof(maxupload)) == -1)) {
+			continue;
+		}
+		/*the max download and upload can be 0*/
+		if (strlen(ip_list)) {
+
+			sprintf(tempchar, "%d", i);
+			doSystem("tc class add dev %s parent 1: classid 1:%s htb rate %skbit ceil %skbit prio 1", wan_if, tempchar, maxupload, maxupload);
+			doSystem("tc class add dev %s parent 1: classid 1:%s htb rate %skbit ceil %skbit prio 1", lan_if_cable, tempchar, maxdownload, maxdownload);
+			doSystem("tc class add dev %s parent 1: classid 1:%s htb rate %skbit ceil %skbit prio 1", lan_if_wifi, tempchar, maxdownload, maxdownload);
+			doSystem("tc qdisc add dev %s parent 1:%s handle 1%s: sfq perturb 15", wan_if, tempchar, tempchar);
+			doSystem("tc qdisc add dev %s parent 1:%s handle 1%s: sfq perturb 15", lan_if_cable, tempchar, tempchar);
+			doSystem("tc qdisc add dev %s parent 1:%s handle 1%s: sfq perturb 15", lan_if_wifi, tempchar, tempchar);
+			doSystem("tc filter add dev %s protocol ip parent 1:0 handle %s fw classid 1:%s", wan_if, tempchar, tempchar);
+			doSystem("tc filter add dev %s parent 1:0 protocol ip u32 match ip dst %s flowid 1:%s", lan_if_cable, ip_list, tempchar);
+			doSystem("tc filter add dev %s parent 1:0 protocol ip u32 match ip dst %s flowid 1:%s", lan_if_wifi, ip_list, tempchar);
+			memset(tempchar, 0, sizeof(tempchar));
+		}
+		memset(rec, 0, sizeof(rec));
+		memset(ip_list, 0, sizeof(ip_list));
+		memset(maxdownload, 0, sizeof(maxdownload));
+		memset(maxupload, 0, sizeof(maxupload));
+
+	}
+	cfg_save();
+}
+
+
+/*add a Qos list to the Qos control list */
+/*the Qos list format is:
+  [ip]+[maxdownload]+[maxupload]+[comment];[ip]+[maxdownload]+[maxupload]+[comment];....*/
+/*add by lyf 2012/6/11*/
+void zte_goform_qoslist_add_process(char_t *web_ip, char_t *max_download, char_t *max_upload, char_t *web_comment)
+{
+
+
+	/* value of make qos list */
+	char qos_list[NV_QOS_LIST_MAX_LEN] = {0};
+	char list[NV_QOS_LIST_MAX_LEN] = {0};
+
+	if (!max_download || !web_ip || !max_upload)
+		return;
+	cfg_get_item("Qos_control_list", qos_list, sizeof(qos_list));
+	if (0 != strlen(qos_list)) {
+		snprintf(list, sizeof(list), "%s;%s+%s+%s+%s", qos_list, web_ip, max_download, max_upload, web_comment);
+	} else {
+		snprintf(list, sizeof(list), "%s+%s+%s+%s", web_ip, max_download, max_upload, web_comment);
+	}
+
+	cfg_set("Qos_control_list", list);
+
+	zte_qos_list_run();
+	cfg_save();
+
+}
+
+
+/*delete a Qos list from the  list */
+/*the Qos list format is:
+  [ip]+[maxdownload]+[maxupload]+[comment];[ip]+[maxdownload]+[maxupload]+[comment];....*/
+/*add by lyf 2012/6/11*/
+void zte_goform_qoslist_del_process(char_t *index)/*lint !e129*/
+{
+	char qos_list[NV_QOS_LIST_MAX_LEN] = {0};
+	//int list_count=0;
+	int deleIndex = 0;
+
+	if (!index)
+		return;
+	/*the web index begin from 1,but the fun index begin from 0*/
+	deleIndex = atoi(index) - 1;
+	cfg_get_item("Qos_control_list", qos_list, sizeof(qos_list));
+	if (0 == strlen(qos_list)) {
+		return;
+	}
+
+	deleteNthValue(deleIndex, qos_list, ';');
+	cfg_set("Qos_control_list", qos_list);
+	zte_qos_list_run();
+	cfg_save();
+
+
+
+}
+
+
+
+/*edit a qos list of the list */
+/*the Qos list format is:
+  [ip]+[maxdownload]+[maxupload]+[comment];[ip]+[maxdownload]+[maxupload]+[comment];....*/
+/*add by lyf 2012/6/11*/
+void zte_goform_qoslist_edit_process(char_t *web_ip, char_t *maxdownload, char_t *maxupload, char_t *web_comment, char_t *index) /*lint !e129*/
+{
+	char qos_address[64] = {0};
+	char qos_list[NV_QOS_LIST_MAX_LEN] = {0};
+	char rec[NV_QOS_LIST_MAX_LEN] = {0};
+	int editIndex = 0;
+
+	if (!web_ip || !maxdownload || !maxupload || !index)
+		return;
+	/*the web index begin from 1,but the fun index begin from 0*/
+	editIndex = atoi(index) - 1;
+	cfg_get_item("Qos_control_list", qos_list, sizeof(qos_list));
+	if (0 == strlen(qos_list)) {
+		return;
+	}
+
+	sprintf(qos_address, "%s+%s+%s+%s", web_ip, maxdownload, maxupload, web_comment);
+	changeNthValue(editIndex, qos_list, ';', rec, qos_address);
+	cfg_set("Qos_control_list", rec);
+	zte_qos_list_run();
+	cfg_save();
+
+}
+
+
+/*QoS£¬ÔÝδʵÏÖÐèÇó£¬opms_wan_modeÓ¦¸Ã¸ù¾Ýµ±Ç°µÄȱʡÍâÍø¿Ú£¬Ê¶±ð³öethwan_mode¡¢pswan_mode¡¢wifiwan_modeÆäÖеÄÒ»ÖÖ*/
+void zte_goform_Qos(void)/*lint !e18*/
+{
+	char Qos_enable[CONFIG_DEFAULT_LENGTH] = {0};
+	char Qos_auto_control[CONFIG_DEFAULT_LENGTH] = {0};
+	char opms_wan_mode[CONFIG_DEFAULT_LENGTH] = {0};
+	char ack_enable[CONFIG_DEFAULT_LENGTH] = {0};
+
+	cfg_get_item("Qos_enable", Qos_enable, sizeof(Qos_enable));
+	cfg_get_item("Qos_auto_control", Qos_auto_control, sizeof(Qos_auto_control));
+	cfg_get_item("opms_wan_mode", opms_wan_mode, sizeof(opms_wan_mode));
+	cfg_get_item("Qos_control_list", ack_enable, sizeof(ack_enable));
+
+	if (!atoi(Qos_enable)) {
+		/*if the wanmode is ppp0,then to call the ack first shall scrip*/
+		if (atoi(ack_enable)) {
+			if (!strcmp(opms_wan_mode, "PPP")) {
+				ZTE_LOG(LOG_INFO, "ack first is running////////////"); /*lint !e26*/
+				doSystem("ack_first.sh");
+			}
+			cfg_save();
+			return ;/*lint !e533 !e110 */
+		}
+
+
+
+		doSystem("speed_limit_ini.sh");
+		cfg_save();
+		return ;/*lint !e533 !e110 */
+	}
+
+	if (!atoi(Qos_auto_control)) {
+		zte_qos_list_run();
+	} else {
+		ZTE_LOG(LOG_INFO, "QoS auto traffic control is starting!");/*lint !e26*/
+
+		doSystem("qos.sh");
+
+	}
+	cfg_save();
+}
+
+/******************************************************
+* Function: zte_static_route_list_ini_run()
+* Description:  run the static route list after the device reboot
+  the static route list format is:
+   [name]+[private]+[active]+[des ip]+[ip subnet mask]+[GateWay]+[metric];.....
+* Input:
+* Output:
+* Return:
+* Others:
+* 2012/5/21  created by Liu Yifei
+*******************************************************/
+void zte_static_route_list_ini_run(void)
+{
+	//char name[CONFIG_DEFAULT_LENGTH] = {0};
+	char des_ip[32] = {0};
+	char subnet_mask[32] = {0};
+	char gateway[32] = {0};
+	char static_routelist[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	char rec[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	char pirvate[3] = {0}; /*private button*/
+	char active[3] = {0}; /*active button*/
+	char metric[3] = {0};
+	int list_index = 0;
+	int active_flag = 0;
+
+	cfg_get_item("static_route_list", static_routelist, sizeof(static_routelist));
+	if (0 == strlen(static_routelist)) {
+		return;
+	}
+	while ((getNthValueSafe(list_index++, static_routelist, ';', rec, sizeof(rec)) != -1)) {
+		/*get private info*/
+		if ((getNthValueSafe(1, rec, '+', pirvate, sizeof(pirvate)) == -1)) {
+			continue;
+		}
+		/*get active info*/
+		if ((getNthValueSafe(2, rec, '+', active, sizeof(active)) == -1)) {
+			continue;
+		}
+		/*get des ip address*/
+		if ((getNthValueSafe(3, rec, '+', des_ip, sizeof(des_ip)) == -1)) {
+			continue;
+		}
+		/*get subnet mask*/
+		if ((getNthValueSafe(4, rec, '+', subnet_mask, sizeof(subnet_mask)) == -1)) {
+			continue;
+		}
+		/*get gateway*/
+		if ((getNthValueSafe(5, rec, '+', gateway, sizeof(gateway)) == -1)) {
+			continue;
+		}
+		/*get metric*/
+		if ((getNthValueSafe(6, rec, '+', metric, sizeof(metric)) == -1)) {
+			continue;
+		}
+		if ((0 != strlen(active)) && (0 != strlen(des_ip))
+		    && (0 != strlen(subnet_mask)) && (0 != strlen(gateway))) {
+			if (active_flag = atoi(active)) {
+				if (!strcmp(subnet_mask, "255.255.255.255")) {
+					doSystem("route add -host %s gw %s metric %s", des_ip, gateway, metric);
+				} else {
+					doSystem("route add -net %s netmask %s gw %s metric %s", des_ip, subnet_mask, gateway, metric);
+				}
+			}
+		}
+
+
+	}
+
+	cfg_save();
+
+
+}
+
+/******************************************************
+* Function: zte_static_route_list_add()
+* Description:  add a list to the static route list
+  the static route list format is:
+   [name]+[private]+[active]+[des ip]+[ip subnet mask]+[GateWay]+[metric];.....
+* Input:  static route info from the web
+* Output:
+* Return:
+* Others:
+* 2012/5/21  created by Liu Yifei
+*******************************************************/
+void zte_static_route_list_add(char *name, char *private, char *active, char *des_ip, char *subnet_mask, char *gateway, char *metric)
+{
+	char static_routelist[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	char list[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	int active_flag = 0;
+
+	if (!name || !des_ip || !subnet_mask || !gateway) { /*private,active,metric may equal to 0*/
+		return;
+	}
+	cfg_get_item("static_route_list", static_routelist, sizeof(static_routelist));
+
+	if (0 != strlen(static_routelist)) {
+		snprintf(list, sizeof(list), "%s;%s+%s+%s+%s+%s+%s+%s", static_routelist, name, private, active, des_ip, subnet_mask, gateway, metric);
+	} else {
+		snprintf(list, sizeof(list), "%s+%s+%s+%s+%s+%s+%s", name, private, active, des_ip, subnet_mask, gateway, metric);
+	}
+
+	cfg_set("static_route_list", list);
+	if (active_flag = atoi(active)) {
+		if (!strcmp(subnet_mask, "255.255.255.255")) {
+			doSystem("route add -host %s gw %s metric %s", des_ip, gateway, metric);
+		} else {
+			doSystem("route add -net %s netmask %s gw %s metric %s", des_ip, subnet_mask, gateway, metric);
+		}
+	}
+
+	cfg_save();
+}
+/******************************************************
+* Function: zte_static_route_list_run_one()
+* Description:  run one list from the static route list
+  the static route list format is:
+   [name]+[private]+[active]+[des ip]+[ip subnet mask]+[GateWay]+[metric]
+* Input:
+  list--the list to run
+  delimit -- delimitor
+* Output:
+* Return:
+* Others:
+* 2012/5/21  created by Liu Yifei
+*******************************************************/
+void zte_static_route_list_run_one(char *list, char delimit)
+{
+	char des_ip[32] = {0};
+	char subnet_mask[32] = {0};
+	char gateway[32] = {0};
+	char pirvate[3] = {0};
+	char active[3] = {0};
+	char metric[3] = {0};
+	int active_flag = 0;
+
+	if (!list) {
+		return;
+	}
+
+	/*get private info*/
+	if ((getNthValueSafe(1, list, delimit, pirvate, sizeof(pirvate)) == -1)) { /*the index begin from 1,ingore the name(index 0)*/
+		return;
+	}
+	/*get active info*/
+	if ((getNthValueSafe(2, list, delimit, active, sizeof(active)) == -1)) {
+		return;
+	}
+	/*get des ip address*/
+	if ((getNthValueSafe(3, list, delimit, des_ip, sizeof(des_ip)) == -1)) {
+		return;
+	}
+	/*get subnet mask*/
+	if ((getNthValueSafe(4, list, delimit, subnet_mask, sizeof(subnet_mask)) == -1)) {
+		return;
+	}
+	/*get gateway*/
+	if ((getNthValueSafe(5, list, delimit, gateway, sizeof(gateway)) == -1)) {
+		return;
+	}
+	/*get metric*/
+	if ((getNthValueSafe(6, list, delimit, metric, sizeof(metric)) == -1)) {
+		return;
+	}
+	if ((0 != strlen(active)) && (0 != strlen(des_ip))
+	    && (0 != strlen(subnet_mask)) && (0 != strlen(gateway))) {
+		if (active_flag = atoi(active)) {
+			if (!strcmp(subnet_mask, "255.255.255.255")) {
+				doSystem("route add -host %s gw %s metric %s", des_ip, gateway, metric);
+			} else {
+				doSystem("route add -net %s netmask %s gw %s metric %s", des_ip, subnet_mask, gateway, metric);
+			}
+		}
+	}
+
+}
+/******************************************************
+* Function: zte_static_route_list_del_one()
+* Description:  delete one list from the static route list
+  the static route list format is:
+   [name]+[private]+[active]+[des ip]+[ip subnet mask]+[GateWay]+[metric]
+* Input:
+  list--the list to delete
+  delimit -- delimitor
+* Output:
+* Return:
+* Others:
+* 2012/5/21  created by Liu Yifei
+*******************************************************/
+void zte_static_route_list_del_one(char *list, char delimit)
+{
+	char des_ip[32] = {0};
+	char subnet_mask[32] = {0};
+	char gateway[32] = {0};
+	char pirvate[3] = {0};
+	char active[3] = {0};
+	char metric[3] = {0};
+	int active_flag = 0;
+
+	if (!list) {
+		return;
+	}
+
+	/*get private info*/
+	if ((getNthValueSafe(1, list, delimit, pirvate, sizeof(pirvate)) == -1)) { /*the index begin from 1,ingore the name(index 0)*/
+		return;
+	}
+	/*get active info*/
+	if ((getNthValueSafe(2, list, delimit, active, sizeof(active)) == -1)) {
+		return;
+	}
+	/*get des ip address*/
+	if ((getNthValueSafe(3, list, delimit, des_ip, sizeof(des_ip)) == -1)) {
+		return;
+	}
+	/*get subnet mask*/
+	if ((getNthValueSafe(4, list, delimit, subnet_mask, sizeof(subnet_mask)) == -1)) {
+		return;
+	}
+	/*get gateway*/
+	if ((getNthValueSafe(5, list, delimit, gateway, sizeof(gateway)) == -1)) {
+		return;
+	}
+	/*get metric*/
+	if ((getNthValueSafe(6, list, delimit, metric, sizeof(metric)) == -1)) {
+		return;
+	}
+	if ((0 != strlen(active)) && (0 != strlen(des_ip))
+	    && (0 != strlen(subnet_mask)) && (0 != strlen(gateway))) {
+		if (active_flag = atoi(active)) {
+			if (!strcmp(subnet_mask, "255.255.255.255")) {
+				doSystem("route del -host %s gw %s metric %s", des_ip, gateway, metric);
+			} else {
+				doSystem("route del -net %s netmask %s gw %s metric %s", des_ip, subnet_mask, gateway, metric);
+			}
+		}
+	}
+
+}
+/******************************************************
+* Function: zte_static_route_list_del()
+* Description:  delete a list from the static route list according to the delete index
+  the static route list format is:
+   [name]+[private]+[active]+[des ip]+[ip subnet mask]+[GateWay]+[metric];.....
+* Input:
+  index--the index  of deleted items
+  delimit -- delimitor
+* Output:
+* Return:
+* Others:
+* 2012/5/21  created by Liu Yifei
+*******************************************************/
+void zte_static_route_list_del(int index, char delimit)
+{
+	char static_routelist[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	char list[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};/*temp list*/
+	//int active_flag=0;
+	char *begin = NULL;
+	char *end = NULL;
+	char *buf = NULL;
+	int i = 0;
+	int j = 0;
+	int need_check_flag = 0;
+	int default_len = 0;
+
+	cfg_get_item("static_route_list", static_routelist, sizeof(static_routelist));
+	if (!strlen(static_routelist)) {
+		return;
+	}
+
+	buf = strdup(static_routelist);
+	begin = buf;
+	end = strchr(begin, delimit);
+	while (end) {
+		if (i == index) {
+			strncpy(list, begin, end - begin);
+			zte_static_route_list_del_one(list, '+');
+			memset(begin, 0, end - begin);
+			memset(list, 0, strlen(list));
+			if (index == 0)
+				need_check_flag = 1;
+			break;
+		}
+		begin = end;
+
+		end = strchr(begin + 1, delimit);
+		i++;
+	}
+	if (!end && index == i) {
+		strncpy(list, begin, strlen(begin));
+		zte_static_route_list_del_one(list, '+');
+		memset(list, 0, strlen(list)); /*set the temp list to 0*/
+		memset(begin, 0, strlen(begin));
+
+	}
+
+
+	if (need_check_flag) {
+		for (i = 0; i < strlen(static_routelist); i++) {
+			if (buf[i] == '\0') {
+				continue;
+			}
+			if (buf[i] == ';') {
+				buf[i] = '\0';
+			}
+			break;
+		}
+	}
+	default_len = strlen(static_routelist);
+	for (i = 0, j = 0; i < strlen(static_routelist); i++) {
+		if (buf[i] != '\0') {
+			static_routelist[j++] = buf[i];
+		}
+	}
+	for (i = j; i < default_len; i++)
+		static_routelist[i] = '\0';
+
+	cfg_set("static_route_list", static_routelist);
+	cfg_save();
+	free(buf);
+
+
+}
+/******************************************************
+* Function: zte_static_route_list_edit_one()
+* Description:  edit a list from the static route list
+  the static route list format is:
+   [name]+[private]+[active]+[des ip]+[ip subnet mask]+[GateWay]+[metric];.....
+* Input:
+  index--the index of deleted item
+  value--the static route list
+  delimit--delimitor
+  web_list--static route info from the web
+* Output:
+  result-- the edited static route list
+* Return:
+* Others:
+* 2012/5/21  created by Liu Yifei
+*******************************************************/
+int zte_static_route_list_edit_one(int index, char *value, char delimit, char *result, char *web_list)
+{
+	int i = 0;
+	int front_len = 0;
+	int end_len = 0;
+	int edit_len = 0;
+	int total_len = 0;
+	char *begin = NULL;
+	char *end = NULL;
+	char tempchar[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	char dosys_list[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+
+	if (!value || !result || !web_list)
+		return -1;
+
+	begin = value;
+	end = strchr(begin, delimit);
+	while (i < index && end) {
+		begin = end + 1;
+		end = strchr(begin, delimit);
+		i++;
+	}
+
+	//no delimit
+	if (!end) {
+		if (i == index) {
+			end = begin + strlen(begin) - 1;
+			strncpy(dosys_list, begin, end - begin + 1);
+			printf(dosys_list);
+			zte_static_route_list_del_one(dosys_list, '+');
+			memset(dosys_list, 0, strlen(dosys_list));
+			front_len = begin - value;
+			strncpy(tempchar, value, front_len);
+			strncpy(tempchar + front_len, web_list, (strlen(web_list)));
+			zte_static_route_list_run_one(web_list, '+');
+			total_len = front_len + strlen(web_list);
+		} else {
+			return -1;
+		}
+	} else {
+		front_len = begin - value;
+		edit_len = end - begin;
+		end_len = strlen(value) - front_len - edit_len;
+		strncpy(dosys_list, begin, end - begin);
+		printf(dosys_list);
+		zte_static_route_list_del_one(dosys_list, '+');
+		memset(dosys_list, 0, strlen(dosys_list));
+		strncpy(tempchar, value, front_len);
+		strncpy(tempchar + front_len, web_list, strlen(web_list));
+		strncpy(tempchar + front_len + strlen(web_list), value + front_len + edit_len, end_len);
+		zte_static_route_list_run_one(web_list, '+');
+		total_len = front_len + strlen(web_list) + end_len;
+	}
+	memcpy(result, tempchar, total_len);
+	*(result + total_len) = '\0';
+
+	return 0;
+
+}
+/******************************************************
+* Function: zte_static_route_list_edit()
+* Description:  edit a list from the static route list
+  call zte_static_route_list_edit_one() to process
+  the static route list format is:
+   [name]+[private]+[active]+[des ip]+[ip subnet mask]+[GateWay]+[metric];.....
+* Input:
+  index--the index of deleted item
+  list info from the web
+* Output:
+* Return:
+* Others:
+* 2012/5/21  created by Liu Yifei
+*******************************************************/
+void zte_static_route_list_edit(char *index, char *web_name, char *web_private, char *web_active, char *web_des_ip, char *web_subnet_mask, char *web_gateway, char *web_metric)
+{
+	char staticroute_one_list[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	char static_route_list[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	char rec[NV_STATIC_ROUTE_LIST_MAX_LEN] = {0};
+	int editIndex = 0;
+	if (!web_name || !web_des_ip || !web_subnet_mask || !web_gateway) { /*private,active,metric may equal to 0*/
+		return;
+	}
+	editIndex = atoi(index) - 1;
+	cfg_get_item("static_route_list", static_route_list, sizeof(static_route_list));
+	if (!strlen(static_route_list)) {
+		return;
+	}
+	sprintf(staticroute_one_list, "%s+%s+%s+%s+%s+%s+%s", web_name, web_private, web_active, web_des_ip, web_subnet_mask, web_gateway, web_metric);
+	zte_static_route_list_edit_one(editIndex, static_route_list, ';', rec, staticroute_one_list);
+	cfg_set("static_route_list", rec);
+	cfg_save();
+}
+#endif
+
+//add by gongxuanhui 03/13/2014
+static void zte_router_make_MTU_Rule(char *buf, int len, char *wan_name, char *mtu_value)
+{
+	snprintf(buf, len, "ifconfig %s mtu %s ", wan_name,  mtu_value);
+}
+
+//add by gongxuanhui 03/13/2014
+void zte_router_MTU_set(void)
+{
+
+	char cmd[1024] = {0};
+	char mtu[128] = {0};
+	int mtu_int;
+
+	memset(cmd, 0, sizeof(cmd));
+
+	//zte_router_nvconfig_read("mtu");
+	//strcpy(mtu , g_router_nvconfig_buf);
+
+	cfg_get_item("mtu", mtu, sizeof(mtu));
+
+	if (0 == strcmp(mtu, "")) {
+		slog(NET_PRINT, SLOG_ERR, "Warning: mtu  valu is null \n");
+		return;
+	}
+
+	if ((mtu_int = atoi(mtu)) < 1280 || mtu_int > 1500) {
+		slog(NET_PRINT, SLOG_ERR, "Warning: mtu value is illgality\n");
+		return;
+	}
+
+	zte_router_make_MTU_Rule(cmd, sizeof(cmd), defwan_rel, mtu);
+
+	system_cmd_ex(cmd);
+	//system_cmd_ex("firewall_init.sh");
+	return;
+}
+
+//1217
+void zte_unpn_set(void)
+{
+	char upnpEnabled[8] = {0};
+	
+	cfg_get_item("upnpEnabled", upnpEnabled, sizeof(upnpEnabled));
+	slog(NET_PRINT, SLOG_NORMAL, "router : start to set upnp %s\n", upnpEnabled);
+	//if(atoi(upnpEnabled))
+		system_cmd_ex("upnp.sh");
+}
+void zte_router_dhcp_set_process(void)
+{
+	slog(NET_PRINT, SLOG_NORMAL, "router : start to set dhcp \n");
+	system_cmd_ex("lan.sh");
+	//doSystem("killall fullshare");
+	//doSystem("killall smbd");
+	//doSystem("killall nmbd");
+	//doSystem("fullshare &");
+	//doSystem("smbd -D");
+	//doSystem("nmbd -D");
+	//doSystem("sh /mnt/jffs2/scripts/upnp.sh");
+}
+
+//add by gongxuanhui 03/13/2014
+void zte_router_mtu_set_process(void)
+{
+	//zte_router_MTU_set();
+	zte_router_init();
+}
+
+
+//set  mac_ip_list when get msg from web_firewall 08/09/2015
+void zte_macip_list_run(void)
+{
+	char dhcp_enable[ROUTER_DEFAULT_LEN] = {0};
+	char list[NV_MACIP_LIST_MAX_LEN] = {0};
+	char mac_address[32] = {0};   /*mac address */
+	char ip_address[32]  = {0};  /*ip address */
+
+	int dhcp_server_enable = 0;
+	int i = 0;
+	char rec[NV_MACIP_LIST_MAX_LEN] = {0};
+	char cmd[1024] = {0};
+
+	cfg_get_item("dhcpEnabled", dhcp_enable, sizeof(dhcp_enable));
+	if (0 == strlen(dhcp_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "Error: can't find \"dhcpEnabled\" in flash.\n"); /*lint !e26*/
+		return;
+	}
+	dhcp_server_enable = atoi(dhcp_enable);
+	/* if dhcp is disable, then return directly: 0 mean disable, 1 means enable */
+	if (0 == dhcp_server_enable) {
+		return;
+	}
+
+	cfg_get_item("mac_ip_list", list, sizeof(list));
+
+	/*kill udhcpd*/
+	system_cmd_ex("config-udhcpd.sh \"lan\" -k");
+	/*clear the static_lease list in udhcpd.conf file*/
+	system_cmd_ex("config-udhcpd.sh \"lan\" -S");
+	while ((getNthValueSafe(i++, list, ';', rec, sizeof(rec)) != -1)) {
+		// get mac
+		if ((getNthValueSafe(1, rec, '+', mac_address, sizeof(mac_address)) == -1)) {
+			continue;
+		}
+		// get ip
+		if ((getNthValueSafe(2, rec, '+', ip_address, sizeof(ip_address)) == -1)) {
+			continue;
+		}
+		if ((0 != strlen(mac_address))
+		    && (0 != strlen(ip_address))) {
+			memset(cmd, 0, sizeof(cmd));
+			sprintf(cmd, "config-udhcpd.sh \"lan\" -S %s %s", mac_address, ip_address);
+			system_cmd_ex(cmd);
+			//system_cmd_ex("config-udhcpd.sh -S %s %s",mac_address,ip_address);
+		}
+
+
+	}
+
+	/*restart udhcpd*/
+	system_cmd_ex("config-udhcpd.sh \"lan\" -r");
+
+}
+
+void zte_bind_macip_list(void)
+{
+	char dhcp_enable[ROUTER_DEFAULT_LEN] = {0};
+	char static_dhcp_enable[ROUTER_DEFAULT_LEN] = {0};
+
+	cfg_get_item("dhcpEnabled", dhcp_enable, sizeof(dhcp_enable));
+	if (0 == strlen(dhcp_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "Error: can't find \"dhcpEnabled\" in flash.\n"); /*lint !e26*/
+		return;
+	}
+	/* if dhcp is disable, then return directly: 0 mean disable, 1 means enable */
+	if (0 == atoi(dhcp_enable)) {
+		return;
+	}
+
+	/*kill udhcpd*/
+	system_cmd_ex("config-udhcpd.sh \"lan\" -k");
+
+	cfg_get_item("static_dhcp_enable", static_dhcp_enable, sizeof(static_dhcp_enable));
+
+	//static_dhcp_enable=0,¹Ø±ÕMAC-IP°ó¶¨¹¦ÄÜ£¬Çå¿Õudhcpd.confÎļþÖа󶨵ÄMAC-IP
+	//static_dhcp_enable=1,¿ªÆôMAC-IP°ó¶¨¹¦ÄÜ£¬½«Ö®Ç°µÄMAC-IP°ó¶¨¹ØÏµÖØÐÂдÈëudhcpd.conf
+	if (0 == atoi(static_dhcp_enable)) {
+		/*clear the static_lease list in udhcpd.conf file*/
+		system_cmd_ex("config-udhcpd.sh \"lan\" -S");
+	} else
+		system_cmd_ex("config-udhcpd.sh \"lan\" -E");
+
+	system_cmd_ex("config-udhcpd.sh \"lan\" -r");
+
+}
+
+void zte_bind_macip_list_add(struct static_macip_info *static_macip)
+{
+	char dhcp_enable[ROUTER_DEFAULT_LEN] = {0};
+	char static_dhcp_enable[ROUTER_DEFAULT_LEN] = {0};
+	char* mac_address = NULL;   /*mac address  to add*/
+	char* ip_address = NULL;  /*ip address to add */
+	char cmd[200] = {0};
+
+	cfg_get_item("dhcpEnabled", dhcp_enable, sizeof(dhcp_enable));
+	if (0 == strlen(dhcp_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "Error: can't find \"dhcpEnabled\" in flash.\n"); /*lint !e26*/
+		return;
+	}
+	/* if dhcp is disable, then return directly: 0 mean disable, 1 means enable */
+	if (0 == atoi(dhcp_enable)) {
+		return;
+	}
+
+	mac_address = static_macip->mac;
+	ip_address = static_macip->ip;
+
+	/*kill udhcpd*/
+	system_cmd_ex("config-udhcpd.sh \"lan\" -k");
+
+	cfg_get_item("static_dhcp_enable", static_dhcp_enable, sizeof(static_dhcp_enable));
+
+	//static_dhcp_enable=0,¹Ø±ÕMAC-IP°ó¶¨¹¦ÄÜ£¬Çå¿Õ°ó¶¨µÄMAC-IP
+	if (1 == atoi(static_dhcp_enable)) {
+		//Ôö¼ÓMAC-IP°ó¶¨¹æÔò
+		if ((0 != strlen(mac_address)) && (0 != strlen(ip_address))) {
+			sprintf(cmd, "config-udhcpd.sh \"lan\" -S %s %s", mac_address, ip_address);
+			system_cmd_ex(cmd);
+		}
+	}
+
+	system_cmd_ex("config-udhcpd.sh \"lan\" -r");
+
+}
+
+void zte_bind_macip_list_del(char* mac)
+{
+	char dhcp_enable[ROUTER_DEFAULT_LEN] = {0};
+	char static_dhcp_enable[ROUTER_DEFAULT_LEN] = {0};
+	char cmd[200] = {0};
+
+	cfg_get_item("dhcpEnabled", dhcp_enable, sizeof(dhcp_enable));
+	if (0 == strlen(dhcp_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "Error: can't find \"dhcpEnabled\" in flash.\n"); /*lint !e26*/
+		return;
+	}
+	/* if dhcp is disable, then return directly: 0 mean disable, 1 means enable */
+	if (0 == atoi(dhcp_enable)) {
+		return;
+	}
+
+	/*kill udhcpd*/
+	system_cmd_ex("config-udhcpd.sh \"lan\" -k");
+
+	cfg_get_item("static_dhcp_enable", static_dhcp_enable, sizeof(static_dhcp_enable));
+
+	//static_dhcp_enable=0,¹Ø±ÕMAC-IP°ó¶¨¹¦ÄÜ£¬Çå¿Õ°ó¶¨µÄMAC-IP
+	if (1 == atoi(static_dhcp_enable)) {
+		//ɾ³ýMAC-IP°ó¶¨¹æÔò
+		if (0 != strlen(mac)) {
+			sprintf(cmd, "config-udhcpd.sh \"lan\" -D %s", mac);
+			system_cmd_ex(cmd);
+		}
+	}
+
+	system_cmd_ex("config-udhcpd.sh \"lan\" -r");
+
+}
+
+
+void get_mac_hostname_pro(struct mac_hostname_info *mac_hostname_)
+{
+	char *mac = NULL;
+	char *hostname = NULL;
+	char cmd[200] = {0};
+	mac = mac_hostname_->mac;
+	hostname = mac_hostname_->hostname;
+	sprintf(cmd, "config-hostname.sh \"%s\" \"%s\"", mac, hostname);
+	system_cmd_ex(cmd);
+
+}
+
+void children_device_add(struct mac_hostname_info *mac_hostname)
+{
+	char *mac = NULL;
+	char *hostname = NULL;
+	char cmd[200] = {0};
+	mac = mac_hostname->mac;
+	hostname = mac_hostname->hostname;
+	slog(NET_PRINT, SLOG_NORMAL, "children_device_add:mac= %s, hostname = %s\n", mac, hostname);
+	if ((0 != strlen(mac)) && (0 != strlen(hostname))) {
+		sprintf(cmd, "config-parents.sh device \"%s\" \"%s\"", mac, hostname);
+		system_cmd_ex(cmd);
+	}
+}
+
+void children_device_del(char * mac)
+{
+	char cmd[100] = {0};
+	if (0 != strlen(mac)) {
+		sprintf(cmd, "config-parents.sh device \"%s\"", mac);
+		system_cmd_ex(cmd);
+	}
+}
+
+
+void white_site_add(struct white_site_info * white_site)
+{
+	char *name = NULL;
+	char *site = NULL;
+	char cmd[600] = {0};
+	name = white_site->name;
+	site = white_site->site;
+	slog(NET_PRINT, SLOG_NORMAL, "white_site_add:site= %s, name = %s\n", site, name);
+	if (0 != strlen(site)) {
+		sprintf(cmd, "config-parents.sh white_site -A \"%s\" \"%s\"", site, name);
+		system_cmd_ex(cmd);
+	}
+
+}
+
+
+void white_site_remove(char * ids)
+{
+	char cmd[100] = {0};
+	if (0 != strlen(ids)) {
+		sprintf(cmd, "config-parents.sh white_site -D \"%s\"", ids);
+		system_cmd_ex(cmd);
+	}
+}
+
+
+void zte_children_start_nonet(void)
+{
+	char sys_cmd_bufer[500] = {0};
+
+	FILE *chilren_device_file = NULL;
+	char line[200] = {0};
+	char mac[18] = {0};
+	char path_conf[50] = {0};
+	char path_file[100] = {0};
+	cfg_get_item("path_conf", path_conf, sizeof(path_conf));
+	sprintf(path_file, "%s/children_device_file", path_conf);
+
+	/*flush filter chain*/
+	sprintf(sys_cmd_bufer, "iptables -F %s %s", CLILDREN_MAC_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -F %s %s", CLILDREN_WEB_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -F %s %s", CLILDREN_WEB_PHONE_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(sys_cmd_bufer);
+
+
+	chilren_device_file = fopen(path_file, "r");
+	if (chilren_device_file == NULL) {
+		fprintf(stderr, "can not open file children_device_file.");
+		return;
+	}
+
+	while (fgets(line, 200, chilren_device_file) != NULL) {
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+
+		strncpy(mac, line, 17);
+
+		if (strcmp(mac, "") != 0) {
+			sprintf(sys_cmd_bufer, "iptables -A %s -m mac --mac-source %s -j DROP", CLILDREN_MAC_CHAIN, mac);
+			slog(NET_PRINT, SLOG_NORMAL, "%s \n", sys_cmd_bufer);
+			system_cmd_ex(sys_cmd_bufer);
+		}
+
+		memset(line, 0, sizeof(line));
+		memset(mac, 0, sizeof(mac));
+	}
+	fclose(chilren_device_file);
+}
+
+static void make_children_white_site_rule(char mac[])
+{
+	slog(NET_PRINT, SLOG_NORMAL, "make_children_white_site_rule start! \n");
+	char sys_cmd_bufer[600] = {0};
+	FILE *white_site_file = NULL;
+	char url_hexstring[ZTE_ROUTER_URL_FILTER_LEN] = {0};
+	char line[600] = {0};
+	char site[600] = {0};//klocwork
+	char temp_site[600] = {0};
+
+	unsigned int len = 0;
+
+	char path_conf[50] = {0};
+	char path_file[100] = {0};
+	cfg_get_item("path_conf", path_conf, sizeof(path_conf));
+	sprintf(path_file, "%s/white_site_file", path_conf);
+
+	white_site_file = fopen(path_file, "r");
+	if (white_site_file == NULL) {
+		fprintf(stderr, "can not open file white_site_file.");
+
+		//PCÖÕ¶Ë:ĬÈϽ«macµØÖ·µÄ53¶Ë¿ÚµÄ°ü¶ªµô
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "iptables -A %s -m mac --mac-source %s -p udp --dport 53 -j DROP", CLILDREN_WEB_CHAIN, mac);
+		system_cmd_ex(sys_cmd_bufer);
+
+		//ÊÖ»úÖÕ¶Ë:ĬÈϽ«macµØÖ·µÄ53¶Ë¿ÚµÄ°ü¶ªµô
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "iptables -A %s -m mac --mac-source %s -p udp --dport 53 -j DROP", CLILDREN_WEB_PHONE_CHAIN, mac);
+		system_cmd_ex(sys_cmd_bufer);
+
+		return;
+	}
+
+	while (fgets(line, 600, white_site_file) != NULL) {
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		memset(url_hexstring, 0, sizeof(url_hexstring));
+
+		int i = 0;
+		for (i = 0; i < 600; i++) {
+			if (line[i] == ',') {
+				len = i;
+				break;
+			}
+		}
+		strncpy(site, line, len);
+
+		if (strcmp(site, "") != 0) {
+			//È¥³ý꿅Ⴁ̾µÄhttpÍ·²¿
+			if (!strncasecmp(site, "http://", strlen("http://"))) {
+				strncpy(site, site + strlen("http://"), sizeof(site)-1);
+			}
+			if (!strncasecmp(site, "https://", strlen("https://"))) {
+				strncpy(site, site + strlen("https://"), sizeof(site)-1);
+			}
+			//È¥³ýÍøÖ·ºóÃæ.com/ºóµÄβ²¿
+			int seq = 0;
+			int len_site = 0;
+			memset(temp_site, 0, sizeof(temp_site));
+			strcpy(temp_site, site);
+			for (seq = 0; seq < strlen(temp_site); seq++) {
+				if (temp_site[seq] == '/') {
+					len_site = seq;
+					memset(site, 0, sizeof(site));
+					strncpy(site, temp_site, len_site);
+					break;
+				}
+			}
+
+
+
+			str_vary_dit(site, url_hexstring);
+			slog(NET_PRINT, SLOG_NORMAL, "site=%s url_hexstring=%s\n", site, url_hexstring);
+			snprintf(sys_cmd_bufer, sizeof(sys_cmd_bufer), "iptables -A %s -m mac --mac-source %s -m string --hex-string  \"|%s|\" --algo kmp -j ACCEPT", \
+			        CLILDREN_WEB_CHAIN, mac, url_hexstring);//klocwork
+			system_cmd_ex(sys_cmd_bufer);
+
+			memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+			snprintf(sys_cmd_bufer, sizeof(sys_cmd_bufer), "iptables -A %s -m mac --mac-source %s -m string --hex-string  \"|%s|\" --algo kmp -j ACCEPT", \
+			        CLILDREN_WEB_PHONE_CHAIN, mac, url_hexstring);
+			system_cmd_ex(sys_cmd_bufer);
+
+		}
+
+		memset(line, 0, sizeof(line));
+		memset(site, 0, sizeof(site));
+		len = 0;
+	}
+
+	fclose(white_site_file);
+
+	//ĬÈϽ«macµØÖ·µÄ53¶Ë¿ÚµÄ°ü¶ªµô
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -A %s -m mac --mac-source %s -p udp --dport 53 -j DROP", CLILDREN_WEB_CHAIN, mac);
+	system_cmd_ex(sys_cmd_bufer);
+
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -A %s -m mac --mac-source %s -p udp --dport 53 -j DROP", CLILDREN_WEB_PHONE_CHAIN, mac);
+	system_cmd_ex(sys_cmd_bufer);
+
+
+}
+
+void zte_children_stop_nonet(void)
+{
+	char sys_cmd_bufer[500] = {0};
+	FILE *chilren_device_file = NULL;
+	char line[200] = {0};
+	char mac[18] = {0};
+
+	char path_conf[50] = {0};
+	char path_file[100] = {0};
+	cfg_get_item("path_conf", path_conf, sizeof(path_conf));
+	sprintf(path_file, "%s/children_device_file", path_conf);
+
+	system_cmd_ex("iptables -t filter -D INPUT -p udp --dport 53  -j ACCEPT");
+	system_cmd_ex("iptables -t filter -D FORWARD -p udp --dport 53  -j ACCEPT");
+
+
+
+	/*flush filter chain*/
+	sprintf(sys_cmd_bufer, "iptables -F %s %s", CLILDREN_MAC_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -F %s %s", CLILDREN_WEB_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -F %s %s", CLILDREN_WEB_PHONE_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(sys_cmd_bufer);
+
+	chilren_device_file = fopen(path_file, "r");
+	if (chilren_device_file == NULL) {
+		fprintf(stderr, "can not open file children_device_file.");
+		return;
+	}
+
+	while (fgets(line, 200, chilren_device_file) != NULL) {
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+
+		strncpy(mac, line, 17);
+
+		if (strcmp(mac, "") != 0) {
+			make_children_white_site_rule(mac);
+		}
+
+		memset(line, 0, sizeof(line));
+		memset(mac, 0, sizeof(mac));
+	}
+	fclose(chilren_device_file);
+}
+
+/* DHCP_SETTING_REQ */
+void zte_router_dhcp_setting_req_process(dhcp_setting_req *pdhcp_setting_req)
+{
+	(void)cfg_set("lan_ipaddr", pdhcp_setting_req->lan_ip);
+	(void)cfg_set("lan_netmask", pdhcp_setting_req->lan_netmask);
+	if (!pdhcp_setting_req->dhcp_enabled) {
+		(void)cfg_set("dhcpEnabled", "0");
+	} else {
+		(void)cfg_set("dhcpEnabled", "1");
+		(void)cfg_set("dhcpStart", pdhcp_setting_req->dhcp_start);
+		(void)cfg_set("dhcpEnd", pdhcp_setting_req->dhcp_end);
+		(void)cfg_set("dhcpDns", pdhcp_setting_req->dhcp_dns);
+		(void)cfg_set("dhcpLease_hour", pdhcp_setting_req->dhcp_lease);
+	}
+
+	system_cmd_ex("user-config-udhcpd.sh");
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mainctrl/net_xfrm.c b/lynq/MD310EU/ap/app/zte_comm/zte_mainctrl/net_xfrm.c
new file mode 100755
index 0000000..5feb22c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mainctrl/net_xfrm.c
@@ -0,0 +1,1738 @@
+#include "zte_mainctrl.h"
+
+char g_router_nvconfig_buf[ROUTER_NV_ITEM_VALUE_MAX_LEN];
+char defwan_rel[ZTE_ROUTER_WAN_IF_NAME_LEN] = {0};
+
+static char defwan6_rel[ZTE_ROUTER_WAN_IF_NAME_LEN] = {0};
+//static struct url_list old_url_list;
+extern int g_limit_time_flag;
+
+
+/******************************************************
+* Func:    system_cmd_ex
+* Desc:    do system cmd, but printf it first
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+*
+*******************************************************/
+
+void str_vary_dit(char * str, char *result)
+{
+	char ch_num = 0;
+	int i, firstnumber;
+	char *pos = result;
+	char *tmpstr;
+	if (0 == strlen(str)) {
+		result = NULL;
+		return;
+	}
+	tmpstr = (char *)malloc(strlen(str) + 1);
+	if (!tmpstr) {
+		result = NULL;
+		return;
+	}
+	memset(tmpstr, 0x00, strlen(str) + 1);
+	strcpy(tmpstr, str);
+	for (i = 0; i < strlen(str); i ++) {
+		if (str[i] != '.') {
+			continue;
+		}
+		break;
+	}
+	firstnumber = i;
+	for (i = strlen(str) - 1; i >= 0; i --) {
+		if (tmpstr[i] != '.') {
+			ch_num ++;
+		} else {
+			tmpstr[i] = ch_num;
+			ch_num = 0;
+		}
+	}
+	pos = result;
+	sprintf(pos, "%.2x", firstnumber);
+	pos += 2;
+	for (i = 0; i < strlen(str); i ++) {
+		sprintf(pos, "%.2x", tmpstr[i]);
+		pos += 2;
+	}
+	//sprintf(pos, "%.2x", 0);
+	free(tmpstr);
+	tmpstr = NULL;
+}
+
+void system_cmd_ex(char * cmd)
+{
+	int rtn = -1;
+	if (NULL == cmd) {
+		slog(NET_PRINT, SLOG_ERR, "system_cmd_ex: NULL-------------------------------\n");
+		return;
+	}
+
+	rtn = soft_system(cmd);
+
+	if (0 != rtn) {
+		slog(NET_PRINT, SLOG_ERR, "cmd [%s] failed \n", cmd);
+	}
+	return;
+}
+
+int zte_router_nvconfig_read(char *i_item_name)
+{
+	if (NULL == i_item_name) {
+		slog(NET_PRINT, SLOG_ERR, "[zte_router_nvconfig_read] , point null\n");
+		return 0;
+	}
+	memset(g_router_nvconfig_buf, 0, sizeof(g_router_nvconfig_buf));
+	cfg_get_item(i_item_name, g_router_nvconfig_buf, sizeof(g_router_nvconfig_buf));
+
+	return 1;
+
+}
+
+static int isAllNumAndSlash(char *str)
+{
+	int i = 0;
+	int len = 0;
+	if (NULL == str) {
+		slog(NET_PRINT, SLOG_ERR, "isAllNumAndSlash: str in is NULL\n");
+		return 0;
+	}
+	len = (int)strlen(str);
+	for (i = 0; i < len; i++) {
+		if ((str[i] >= '0' && str[i] <= '9') || str[i] == '.' || str[i] == '/')
+			continue;
+		return 0;
+	}
+	return 1;
+}
+static int isNumOnly(char *str)
+{
+	int i = 0;
+	int len = 0;
+	if (NULL == str) {
+		slog(NET_PRINT, SLOG_ERR, "isNumOnly: str in is NULL\n");
+		return 0;
+	}
+	len = (int)strlen(str);
+	for (i = 0; i < len; i++) {
+		if ((str[i] >= '0' && str[i] <= '9'))
+			continue;
+		return 0;
+	}
+	return 1;
+}
+static int isOnlyOneSlash(char *str)
+{
+	int i = 0, count = 0;
+	int len = 0;
+	if (NULL == str) {
+		slog(NET_PRINT, SLOG_ERR, "isOnlyOneSlash: str in is NULL\n");
+		return 0;
+	}
+	len = (int)strlen(str);
+	for (i = 0; i < len; i++)
+		if (str[i] == '/')
+			count++;
+	return count <= 1 ? 1 : 0;
+}
+
+static int isIpValid(char *str)
+{
+	struct in_addr addr;    // for examination
+	//if( (! strcmp(T("any"), str)) || (! strcmp(T("any/0"), str)))
+	if ((! strcmp("any", str)) || (! strcmp("any/0", str)))
+		return 1;
+
+	if (!(inet_aton(str, &addr))) {
+		slog(NET_PRINT, SLOG_ERR, "isIpValid(): %s is not a valid IP address.\n", str);
+		return 0;
+	}
+	return 1;
+}
+static int isMacValid(char *str)
+{
+	int i = 0;
+	int len = 0;
+	if (NULL == str) {
+		slog(NET_PRINT, SLOG_ERR, "isMacValid: NULL str ");
+		return 0;
+	}
+	len = (int)strlen(str);
+	if (len != 17)
+		return 0;
+
+	for (i = 0; i < 5; i++) {
+		if ((!isxdigit(str[i * 3])) || (!isxdigit(str[i * 3 + 1])) || (str[i * 3 + 2] != ':'))
+			return 0;
+	}
+	return (isxdigit(str[15]) && isxdigit(str[16])) ? 1 : 0;
+}
+
+static int isIpNetmaskValid(char *s)
+{
+	char str[32] = {0};
+	char *slash;
+	struct in_addr addr;    // for examination
+
+	if (!s || !strlen(s)) {
+		return 0;
+	}
+
+	strncpy(str, s, sizeof(str) - 1);
+
+	if ((!strcmp("any", str)) || (!strcmp("any/0", str)))
+		return 1;
+
+	if (!isAllNumAndSlash(str)) {
+		return 0;
+	}
+
+	if (!isOnlyOneSlash(str)) {
+		return 0;
+	}
+
+	slash = strchr(str, '/');
+	if (slash) {
+		int mask;
+
+		*slash = '\0';
+		slash++;
+		if (!strlen(slash)) {
+			return 0;
+		}
+
+		if (!isNumOnly(slash)) {
+			return 0;
+		}
+
+		mask = atoi(slash);
+		if (mask < 0 || mask > 32) {
+			return 0;
+		}
+	}
+
+	if (!(inet_aton(str, &addr))) {
+		slog(NET_PRINT, SLOG_ERR, "isIpNetmaskValid(): %s is not a valid IP address.\n", str);
+		return 0;
+	}
+	return 1;
+}
+
+static void iptablesPortForwardFlush(void)
+{
+	system_cmd_ex("iptables -t nat -F "PORT_FORWARD_CHAIN);
+	return;
+}
+
+/*
+ * substitution of getNthValue which dosen't destroy the original value
+ */
+int getNthValueSafe(int index, char *value, char delimit, char *result, int len)
+{
+	int i = 0, result_len = 0;
+	char *begin = NULL;
+	char *end = NULL;
+	if (!value || !result || !len) {
+		slog(NET_PRINT, SLOG_ERR, "getNthValueSafe: null in\n");
+		return -1;
+	}
+
+	begin = value;
+	end = strchr(begin, delimit);
+
+	while (i < index && end) {
+		begin = end + 1;
+		end = strchr(begin, delimit);
+		i++;
+	}
+
+	//no delimit
+	if (!end) {
+		if (i == index) {
+			end = begin + strlen(begin);
+			result_len = (len - 1) < (end - begin) ? (len - 1) : (end - begin);
+		} else
+			return -1;
+	} else
+		result_len = (len - 1) < (end - begin) ? (len - 1) : (end - begin);
+
+	memcpy(result, begin, result_len);
+	*(result + result_len) = '\0';
+
+	return 0;
+}
+
+static void get_cmd_data(char* cmd,char* des)
+{
+	FILE *fp;
+	fp = popen(cmd, "r");
+	int nread = fread(des, 1, 1024, fp);
+    
+    if(nread > 0)
+    {
+        des[nread-1]=0;
+    }
+
+	pclose(fp);
+}
+
+void replace_newlines_and_carriage_returns_with_backslash_n_and_backslash_r(const char *input, char *output)
+{
+    const char *read_ptr = input;
+    char *write_ptr = output;
+
+    while (*read_ptr != '\0') 
+	{
+        if (*read_ptr == '\n') 
+		{
+            *write_ptr++ = '\\';
+            *write_ptr++ = 'n';
+            read_ptr++;
+        } 
+		else if (*read_ptr == '\r') 
+		{
+            *write_ptr++ = '\\';
+            *write_ptr++ = 'r';
+            read_ptr++;
+        } 
+		else 
+		{
+            *write_ptr++ = *read_ptr++;
+        }
+    }
+    *write_ptr = '\0';
+}
+
+void zte_router_ping_diagnostics(void)
+{
+	char cmd[256]		 	= {0};
+	char ping_cmd[1024] = {0};
+	char ip_address[32] 	 	= {0};
+	char diag_interface[32] 	= {0};
+	char repetition_count[20] = {0};
+	char time_out[20] 			= {0};
+	char data_size[20] 	= {0};
+	char path_tmp[50]         = {0};
+	char ping_result[1024] = {0};
+	int len = 0;
+
+	slog(NET_PRINT, SLOG_NORMAL, "zte_router_ping_diagnostics start! \n");
+
+	cfg_get_item("ping_diag_addr", ip_address, sizeof(ip_address));
+	cfg_get_item("ping_repetition_count", repetition_count, sizeof(repetition_count));
+	cfg_get_item("ping_time_out", time_out, sizeof(time_out));
+	cfg_get_item("ping_data_size", data_size, sizeof(data_size));
+	cfg_get_item("ping_diag_interface", diag_interface, sizeof(diag_interface));
+
+	if (0 == strlen(ip_address)) {
+		slog(NET_PRINT, SLOG_ERR, "Error: zte_router_ping_diagnostics, %s is not a valid IP address", ip_address);
+		return;
+	}
+
+	system("killall ping");
+
+	//ɾ³ý֮ǰ´æ´¢Îļþ
+	cfg_get_item("path_tmp", path_tmp, sizeof(path_tmp));
+	sprintf(cmd, "rm %s/ping_diagnostics.txt", path_tmp);
+	slog(NET_PRINT, SLOG_NORMAL, "zte_router_ping_diagnostics rm_cmd:%s \n", cmd);
+	system_cmd_ex(cmd);
+
+	//ÖØÐÂping
+	memset(cmd, 0, 256);
+	sprintf(cmd, "ping ");
+	if (strcmp(repetition_count, "") && strcmp(repetition_count, "\0")) {
+		len = strlen(cmd);
+		sprintf(cmd + len, "-c %d ", atoi(repetition_count));
+	}
+
+	if (strcmp(data_size, "") && strcmp(data_size, "\0")) {
+		len = strlen(cmd);
+		sprintf(cmd + len, "-s %d ", atoi(data_size));
+	}
+
+	if (strcmp(time_out, "") && strcmp(time_out, "\0")) {
+		len = strlen(cmd);
+		sprintf(cmd + len, "-w %d ", atoi(time_out));
+	}
+
+	if (strcmp(diag_interface, "") && strcmp(diag_interface, "\0")) {
+		len = strlen(cmd);
+		sprintf(cmd + len, "-I %s ", diag_interface);
+	}
+
+	len = strlen(cmd);
+	slog(NET_PRINT, SLOG_DEBUG, "zte_router_ping_diagnostics cmd:%s, len:%d \n", cmd, len);
+	// sprintf(cmd + len, "%s > %s/ping_diagnostics.txt & ", ip_address, path_tmp);
+	sprintf(cmd + len, "%s 2>&1", ip_address);
+
+	slog(NET_PRINT, SLOG_NORMAL, "zte_router_ping_diagnostics ping_cmd:%s \n", cmd);
+	//system_cmd_ex(cmd);
+	get_cmd_data(cmd, ping_result);
+	replace_newlines_and_carriage_returns_with_backslash_n_and_backslash_r(ping_result, ping_cmd);
+
+	cfg_set("ping_result", ping_cmd);
+}
+
+/******************************************************
+* Function: zte_iptables_make_filter_rule()
+* Description:  make filter rules, e.g.
+*               iptables -A macipport_filter -m mac --mac-source [mac_address]
+*                                                    -s 10.128.48.88
+*                                                    -d 192.168.0.2
+*                                                     -p tcp --sport 1:80 --dport 40:500
+*                                                     -j ACCEPT
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/12/13      V1.0      MaXiaoliang        create
+*******************************************************/
+static void zte_iptables_make_filter_rule(char *buf, int len, char *mac_address,
+        char *sip_1, char *sip_2, int sprf_int, int sprt_int,
+        char *dip_1, char *dip_2, int dprf_int, int dprt_int, int proto, int action)
+{
+	int rc = 0;
+	char *pos = buf;
+
+	rc = snprintf(pos, len - rc,
+	              "iptables -A %s ", IPPORT_FILTER_CHAIN);
+	pos = pos + rc;
+
+	// write mac address
+	if (mac_address && strlen(mac_address)) {
+		rc = snprintf(pos, len - rc, "-m mac --mac-source %s ", mac_address);
+		pos = pos + rc;
+	}
+
+	// write source ip
+	if (sip_1 && strlen(sip_1)) {
+		rc = snprintf(pos, len - rc, "-s %s ", sip_1);
+		pos = pos + rc;
+	}
+
+	// write dest ip
+	if (dip_1 && strlen(dip_1)) {
+		rc = snprintf(pos, len - rc, "-d %s ", dip_1);
+		pos = pos + rc;
+	}
+
+	// write protocol type
+	if (proto == PROTO_NONE) {
+		rc = snprintf(pos, len - rc, " ");
+		pos = pos + rc;
+	} else if (proto == PROTO_ICMP) {
+		rc = snprintf(pos, len - rc, "-p icmp ");
+		pos = pos + rc;
+	} else {
+		if (proto == PROTO_TCP)
+			rc = snprintf(pos, len - rc, "-p tcp ");
+		else if (proto == PROTO_UDP)
+			rc = snprintf(pos, len - rc, "-p udp ");
+		pos = pos + rc;
+
+		// write source port
+		if (sprf_int) {
+			if (sprt_int)
+				rc = snprintf(pos, len - rc, "--sport %d:%d ", sprf_int, sprt_int);
+			else
+				rc = snprintf(pos, len - rc, "--sport %d ", sprf_int);
+			pos = pos + rc;
+		}
+
+		// write dest port
+		if (dprf_int) {
+			if (dprt_int)
+				rc = snprintf(pos, len - rc, "--dport %d:%d ", dprf_int, dprt_int);
+			else
+				rc = snprintf(pos, len - rc, "--dport %d ", dprf_int);
+			pos = pos + rc;
+		}
+	}
+
+	switch (action) {
+	case ACTION_DROP:            // 1 == ENABLE--DROP mode
+		rc = snprintf(pos, len - rc, "-j DROP");
+		break;
+	case ACTION_ACCEPT:            // 2 == ENABLE--ACCEPT mode
+		rc = snprintf(pos, len - rc, "-j ACCEPT");
+		break;
+	default:
+		slog(NET_PRINT, SLOG_ERR, "Unknown action %d.", action);
+		break;
+	}
+}
+/*===========================================================================
+    Function:
+        zte_make_filter_rules_ipv6
+
+    Description:
+        make ipportfilter rules.
+        example:
+            iptables -A macipport_filter
+                        -m mac --mac-source 00:11:22:33:44:55
+                        -m iprange --src-range 192.168.1.10-192.168.1.50
+                        -m iprange --dst-range 10.128.10.10-10.128.10.100
+                        -p tcp --sport 10:2000 --dport 4000:5000
+                        -j DROP
+
+    Param:
+        buf - cmd buffer to store rule cmd
+        len - length of cmd buffer
+        mac_address - mac address
+        sip_1 - source ip 1
+        sip_2 - source ip 2 (not support now)
+        sprf_int - source ip from port
+        sprt_int - source ip to port
+        dip_1 - dest ip 1
+        dip_2 - dest ip 2 (not support now)
+        dprf_int - dest ip from port
+        dprt_int - dest ip to port
+        proto - protocol
+        action - accept or drop
+
+    Modify Date     Version     Author                  Modification
+    2010/07/12      V1.0        zhangyuelong10100551    Create
+    2012/03/15      V1.1        liuweipeng            port
+===========================================================================*/
+void zte_make_filter_rules_v6(char *buf, int len, char *mac_address,
+                              char *sip_1, char *sip_2, int sprf_int, int sprt_int,
+                              char *dip_1, char *dip_2, int dprf_int, int dprt_int, int proto, int action)
+{
+	int rc = 0;
+	char *pos = buf;
+
+	/*begin by zhangyuelong10100551 2010.12.21*/
+	if (NULL == buf) {
+		slog(NET_PRINT, SLOG_ERR, "[ERROR]zte_make_filter_rules_ipv6: buf NULL");
+		return;
+	}
+	/*end by zhangyuelong10100551 2010.12.21*/
+
+	rc = snprintf(pos, len - rc, "ip6tables -t filter -A %s ", IPPORT_FILTER_CHAIN);
+	pos = pos + rc;
+
+	// write mac address
+	if (mac_address && strlen(mac_address)) {
+		rc = snprintf(pos, len - rc, "-m mac --mac-source %s ", mac_address);
+		pos = pos + rc;
+	}
+
+	// write source ip
+	if (sip_1 && strlen(sip_1) > 0) {
+		if (sip_2 && strlen(sip_2) > 0) {
+			rc = snprintf(pos, len - rc, "-m iprange --src-range %s-%s ", sip_1, sip_2);
+			pos = pos + rc;
+		} else {
+			rc = snprintf(pos, len - rc, "-s %s ", sip_1);
+			pos = pos + rc;
+		}
+	} else {
+		rc = snprintf(pos, len - rc, "-s any/0 ");
+		pos = pos + rc;
+	}
+
+	// write dest ip
+	if (dip_1 && strlen(dip_1) > 0) {
+		if (dip_2 && strlen(dip_2) > 0) {
+			rc = snprintf(pos, len - rc, "-m iprange --dst-range %s-%s ", dip_1, dip_2);
+			pos = pos + rc;
+		} else {
+			rc = snprintf(pos, len - rc, "-d %s ", dip_1);
+			pos = pos + rc;
+		}
+	} else {
+		rc = snprintf(pos, len - rc, "-d any/0 ");
+		pos = pos + rc;
+	}
+
+	// write protocol type
+	if (proto == PROTO_NONE) {
+		//rc = snprintf(pos, len-rc, " ");
+		//pos = pos + rc;
+	} else if (proto == PROTO_ICMP) {
+		rc = snprintf(pos, len - rc, "-p icmpv6 ");
+		pos = pos + rc;
+	} else if (proto == PROTO_TCP || proto == PROTO_UDP) {
+		if (proto == PROTO_TCP)
+			rc = snprintf(pos, len - rc, "-p tcp ");
+		else/* if (proto == PROTO_UDP)*/ //kw 3
+			rc = snprintf(pos, len - rc, "-p udp ");
+		pos = pos + rc;
+
+		// write source port
+		if (sprf_int) {
+			if (sprt_int)
+				rc = snprintf(pos, len - rc, "--sport %d:%d ", sprf_int, sprt_int);
+			else
+				rc = snprintf(pos, len - rc, "--sport %d ", sprf_int);
+			pos = pos + rc;
+		}
+
+		// write dest port
+		if (dprf_int) {
+			if (dprt_int)
+				rc = snprintf(pos, len - rc, "--dport %d:%d ", dprf_int, dprt_int);
+			else
+				rc = snprintf(pos, len - rc, "--dport %d ", dprf_int);
+			pos = pos + rc;
+		}
+	}
+
+	switch (action) {
+	case ACTION_DROP:       // 1 == ENABLE--DROP mode
+		rc = snprintf(pos, len - rc, "-j DROP");
+		break;
+	case ACTION_ACCEPT:     // 2 == ENABLE--ACCEPT mode
+		rc = snprintf(pos, len - rc, "-j ACCEPT");
+		break;
+	default:
+		slog(NET_PRINT, SLOG_ERR, "[ERROR]zte_make_filter_rules_v6: unknown action");
+		break;
+	}
+}  /* zte_make_filter_rules_v6() */
+
+//modified by myc for web5.0 2012-12-12 //split the function zte_iptables_filter_run
+void zte_iptables_filter_rule_run(void)
+{
+	char mac_address[32] = {0};
+	char sprf[8] = {0};   /* source port from */
+	char sprt[8] = {0};   /* source port to */
+	char dprf[8] = {0};  /* dest port from */
+	char dprt[8] = {0};  /* dest port to */
+	char sip_1[32]  = {0};  /* src ip address */
+	char sip_2[32]  = {0};
+	char dip_1[32]  = {0};  /* dest ip address */
+	char dip_2[32]  = {0};
+	char protocol[8] = {0};
+	char action_str[4] = {0};
+
+	int i = 0;
+	char rec[ROUTER_NV_FW_RULE_MAX_LEN] = {0};
+	char cmd[ROUTER_NV_FW_RULE_MAX_LEN] = {0};
+	//char rule[NV_FW_RULE_MAX_LEN] = {0};
+	char tmp[ROUTER_DEFAULT_LEN] = {0};
+	char sys_cmd_bufer[500] = {0};
+	int sprf_int = 0;
+	int sprt_int = 0;
+	int dprf_int = 0;
+	int dprt_int = 0;
+	int proto = 0;
+	int action = 0;
+
+	for (i = 0; i < RULE_MAX; i++) {
+		sprintf(tmp, "IPPortFilterRules_%d", i);
+		memset(rec, 0, sizeof(rec));
+		//zte_router_nvconfig_read(tmp);
+		//strcpy(rec,g_router_nvconfig_buf);
+		cfg_get_item(tmp, rec, sizeof(rec));
+		// get sip 1
+		if ((getNthValueSafe(0, rec, ',', sip_1, sizeof(sip_1)) == -1)) {
+			continue;
+		}
+		if (!isIpNetmaskValid(sip_1)) {
+			continue;
+		}
+
+		// get source ip port range "from"
+		if ((getNthValueSafe(2, rec, ',', sprf, sizeof(sprf)) == -1)) {
+			continue;
+		}
+		if ((sprf_int = atoi(sprf)) > 65535) {
+			continue;
+		}
+
+		// get dest ip port range "to"
+		if ((getNthValueSafe(3, rec, ',', sprt, sizeof(sprt)) == -1)) {
+			continue;
+		}
+		if ((sprt_int = atoi(sprt)) > 65535) {
+			continue;
+		}
+
+		/* Destination Part */
+		// get dip 1
+		if ((getNthValueSafe(4, rec, ',', dip_1, sizeof(dip_1)) == -1)) {
+			continue;
+		}
+		if (!isIpNetmaskValid(dip_1)) {
+			continue;
+		}
+
+		// get dest ip port range "from"
+		if ((getNthValueSafe(6, rec, ',', dprf, sizeof(dprf)) == -1)) {
+			continue;
+		}
+		if ((dprf_int = atoi(dprf)) > 65535) {
+			continue;
+		}
+
+		// get dest ip port range "to"
+		if ((getNthValueSafe(7, rec, ',', dprt, sizeof(dprt)) == -1)) {
+			continue;
+		}
+		if ((dprt_int = atoi(dprt)) > 65535) {
+			continue;
+		}
+
+		// get protocol
+		if ((getNthValueSafe(8, rec, ',', protocol, sizeof(protocol)) == -1)) {
+			continue;
+		}
+		proto = atoi(protocol);
+
+		// get action
+		if ((getNthValueSafe(9, rec, ',', action_str, sizeof(action_str)) == -1)) {
+			continue;
+		}
+		action = atoi(action_str);
+
+		// getNthValueSafe(10) is "comment".
+
+		// get mac address
+		if ((getNthValueSafe(11, rec, ',', mac_address, sizeof(mac_address)) == -1)) {
+			continue;
+		}
+		if (strlen(mac_address) && !isMacValid(mac_address)) {
+			continue;
+		}
+		if (PROTO_TCP_UDP == proto) {
+			zte_iptables_make_filter_rule(cmd, sizeof(cmd), mac_address, sip_1, sip_2, sprf_int, sprt_int, dip_1, dip_2, dprf_int, dprt_int, PROTO_TCP, action);
+			memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+			sprintf(sys_cmd_bufer, "%s %s", cmd, FMT_ECHO_IPTABLES_CMD);
+			system_cmd_ex(sys_cmd_bufer);
+			zte_iptables_make_filter_rule(cmd, sizeof(cmd), mac_address, sip_1, sip_2, sprf_int, sprt_int, dip_1, dip_2, dprf_int, dprt_int, PROTO_UDP, action);
+			memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+			sprintf(sys_cmd_bufer, "%s %s", cmd, FMT_ECHO_IPTABLES_CMD);
+			system_cmd_ex(sys_cmd_bufer);
+		} else {
+			zte_iptables_make_filter_rule(cmd, sizeof(cmd), mac_address, sip_1, sip_2, sprf_int, sprt_int, dip_1, dip_2, dprf_int, dprt_int, proto, action);
+			memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+			sprintf(sys_cmd_bufer, "%s %s", cmd, FMT_ECHO_IPTABLES_CMD);
+			system_cmd_ex(sys_cmd_bufer);
+		}
+	}
+}
+
+/******************************************************
+* Function: zte_iptables_filter_run()
+* Description:  load rules from "IPPortFilterRules", make rules, and run
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/12/13      V1.0      MaXiaoliang        create
+*******************************************************/
+void zte_iptables_filter_run(void)
+{
+
+	char firewall_enable[ROUTER_DEFAULT_LEN] = {0};
+	char default_policy[ROUTER_DEFAULT_LEN] = {0};
+	char sys_cmd_bufer[500] = {0};
+	int filter_enable = 0;
+
+	/*flush filter chain*/
+	sprintf(sys_cmd_bufer, "iptables -F %s %s", IPPORT_FILTER_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(sys_cmd_bufer);
+
+	//zte_router_nvconfig_read("IPPortFilterEnable");
+	//strcpy(firewall_enable , g_router_nvconfig_buf);
+	cfg_get_item("IPPortFilterEnable", firewall_enable, sizeof(firewall_enable));
+
+	if (0 == strlen(firewall_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "IPPortFilter have been disable one .\n");
+		system_cmd_ex("iptables -t filter -P FORWARD ACCEPT");
+		return;
+	}
+	filter_enable = atoi(firewall_enable);
+	/* if firewall is disable, then return directly: 0 mean disable, 1 means enable */
+	if (0 == filter_enable) {
+		system_cmd_ex("iptables -t filter -P FORWARD ACCEPT");
+		slog(NET_PRINT, SLOG_ERR, "IPPortFilter have been disable two .\n");
+		return;
+	}
+
+	/* 0: accept   1: drop */
+	//zte_router_nvconfig_read("DefaultFirewallPolicy");
+	//strcpy(default_policy , g_router_nvconfig_buf);
+	cfg_get_item("DefaultFirewallPolicy", default_policy, sizeof(default_policy));
+
+	if (0 == strlen(default_policy)) {
+		strcpy(default_policy, "0");
+	}
+
+	zte_iptables_filter_rule_run();
+
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -t filter -A %s -m state --state RELATED,ESTABLISHED -j ACCEPT", IPPORT_FILTER_CHAIN);
+	system_cmd_ex(sys_cmd_bufer);
+
+
+	switch (atoi(default_policy)) {
+	case 0:
+		system_cmd_ex("iptables -t filter -P FORWARD ACCEPT");
+		break;
+	case 1:
+		system_cmd_ex("iptables -t filter -P FORWARD DROP");
+		break;
+	default:
+		slog(NET_PRINT, SLOG_ERR, "Unknown default_policy %d.", atoi(default_policy));
+		break;
+	}
+
+}
+
+/******************************************************
+* Function: zte_iptables_sys_fw_run()
+* Description:  make system security rules, then run, e.g.
+*                   iptables -A INPUT -i ppp0 -p icmp --icmp-type echo-reply -j ACCEPT
+*                   iptables -t filter -A INPUT -i ppp0  -j DROP             // disable remote control
+*                   iptables -t filter -A INPUT -i ppp0 -p icmp -j DROP  // disable ping
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/12/13      V1.0      MaXiaoliang        create
+*******************************************************/
+void zte_iptables_sys_fw_run(void)
+{
+	char rmE[ROUTER_NV_FW_RULE_MAX_LEN]  = {0};
+	char wpfE[ROUTER_NV_FW_RULE_MAX_LEN] = {0};
+	char sys_cmd_bufer[500] = {0};
+	//zte_router_nvconfig_read("RemoteManagement");
+	///strcpy(rmE , g_router_nvconfig_buf);
+	cfg_get_item("RemoteManagement", rmE, sizeof(rmE));
+
+	//zte_router_nvconfig_read("WANPingFilter");
+	//strcpy(wpfE ,g_router_nvconfig_buf);
+	cfg_get_item("WANPingFilter", wpfE, sizeof(wpfE));
+
+
+	/* flush INPUT chain is OK;  the macipport_filter chain is in FORWARD chain. */
+	system_cmd_ex("iptables -t filter -F INPUT");
+	/*added by myc for shutdown 1900 and 53 port to wan 2013-05-22 begin*/
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -t filter -A INPUT -i %s -p tcp --dport 1900 -j DROP ", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	/*added by myc for shutdown 1900 and 53 port to wam 2013-05-22 end*/
+	/* allow request to dnsmasq from the lan */
+	//system_cmd_ex("iptables -t filter -I INPUT -p udp --sport 53  -j ACCEPT");
+	//system_cmd_ex("iptables -t filter -I INPUT -p udp --dport 53  -j ACCEPT");
+	//system_cmd_ex("iptables -t filter -I INPUT -p tcp --sport 53  -j ACCEPT");
+	//system_cmd_ex("iptables -t filter -I INPUT -p tcp --dport 53  -j ACCEPT");
+
+	/* modify by dlf begin, --2016-09-7 */
+	//ÍøÂ簲ȫÉèÖÃfor lan ssh
+#if 0 //for aq
+	system_cmd_ex("iptables -A INPUT -p tcp --dport 22 -j DROP");
+	system_cmd_ex("iptables -A INPUT -p udp --dport 22 -j DROP");
+	system_cmd_ex("iptables -A INPUT -p tcp --dport 5555 -j DROP");
+	system_cmd_ex("iptables -A INPUT -p udp --dport 5555 -j DROP");
+#endif
+	//ÍøÂ簲ȫÉèÖÃfor wan
+	//disable 22£ºsh
+	/*
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"iptables -t filter -A INPUT -i %s -p udp --dport 22 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"iptables -t filter -A INPUT -i %s -p tcp --dport 22 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	*/
+	//disable 23£ºtelnet
+	/*
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -t filter -A INPUT -i %s -p udp --dport 23 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -t filter -A INPUT -i %s -p tcp --dport 23 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	*/
+	//disable 53£ºdomin
+	
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"iptables -t filter -A INPUT -i %s -p udp --dport 53 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"iptables -t filter -A INPUT -i %s -p tcp --dport 53 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"ip6tables -t filter -A INPUT -i %s -p udp --dport 53 -j DROP", defwan6_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"ip6tables -t filter -A INPUT -i %s -p tcp --dport 53 -j DROP", defwan6_rel);
+	system_cmd_ex(sys_cmd_bufer);
+
+	sprintf(sys_cmd_bufer,"iptables -t filter -A INPUT -i %s -p udp --dport 67 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"ip6tables -t filter -A INPUT -i %s -p udp --dport 67 -j DROP", defwan6_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	
+	//disable 1900£ºupnp
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -t filter -A INPUT -i %s -p udp --dport 1900 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -t filter -A INPUT -i %s -p tcp --dport 1900 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "ip6tables -t filter -A INPUT -i %s -p udp --dport 1900 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "ip6tables -t filter -A INPUT -i %s -p tcp --dport 1900 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	//disable 5555£ºfreeciv
+	/*
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"iptables -t filter -A INPUT -i %s -p udp --dport 5555 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer,"iptables -t filter -A INPUT -i %s -p tcp --dport 5555 -j DROP", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+	*/
+	/* modify by dlf end, --2016-09-7 */
+
+	/* modify by maxl begin, --2011-01-28 */
+	/*added by myc for shutdown 1900 and 53 port to wan 2013-05-22 begin*/
+	//memset(sys_cmd_bufer,0,sizeof(sys_cmd_bufer));
+	//sprintf(sys_cmd_bufer,"iptables -t filter -I INPUT -i %s -p tcp --dport 53 -j DROP ", defwan_rel);
+	// system_cmd_ex(sys_cmd_bufer);
+	/*added by myc for shutdown 1900 and 53 port to wam 2013-05-22 end*/
+	/*open telnet 4719 port*/
+#if 0 //for aq
+	system_cmd_ex("iptables -t filter -I INPUT -p tcp --dport 4719 -j ACCEPT");
+	system_cmd_ex("iptables -t filter -I INPUT -p udp --dport 4719 -j ACCEPT");
+#endif	
+	/* modify by maxl end, --2011-01-28 */
+
+	/* allow ping from WAN interface */
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "iptables -A INPUT -i %s -p icmp --icmp-type echo-reply -j ACCEPT", defwan_rel);
+	system_cmd_ex(sys_cmd_bufer);
+
+	system_cmd_ex("ip6tables -t filter -F INPUT");
+	system_cmd_ex("ip6tables -t filter -I INPUT -p udp --sport 53 -j ACCEPT");
+	system_cmd_ex("ip6tables -t filter -I INPUT -p udp --dport 53 -j ACCEPT");
+	system_cmd_ex("ip6tables -t filter -I INPUT -p tcp --sport 53 -j ACCEPT");
+	system_cmd_ex("ip6tables -t filter -I INPUT -p tcp --dport 53 -j ACCEPT");
+	system_cmd_ex("ip6tables -t filter -I INPUT -p tcp --dport 23 -j DROP");
+	system_cmd_ex("ip6tables -t filter -I INPUT -p udp --dport 23 -j DROP");
+	// allow ping from WAN interface
+	memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+	sprintf(sys_cmd_bufer, "ip6tables -A INPUT -i %s -p icmpv6 --icmpv6-type echo-reply -j ACCEPT", defwan6_rel);
+	system_cmd_ex(sys_cmd_bufer);
+
+	/* remote management is enable */
+	if (atoi(rmE) == 1) {
+		/*
+		 * The INPUT chain will be flushed every time, and the default policy of INPUT is ACCEPT,
+		 * so it needn't to add the rules for RemoteManagement.
+		 */
+	} else { /* disable */
+		//system_cmd_ex("iptables -t filter -A INPUT -i %s  -j DROP", defwan_rel);
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "iptables -t filter -A INPUT -i %s -p tcp --dport 80  -j DROP", defwan_rel);
+		system_cmd_ex(sys_cmd_bufer);
+
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "ip6tables -t filter -A INPUT -i %s -p tcp --dport 80 -j DROP", defwan6_rel);
+		system_cmd_ex(sys_cmd_bufer);
+
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "iptables -t filter -A INPUT -i %s -p tcp --dport 443  -j DROP", defwan_rel);
+		system_cmd_ex(sys_cmd_bufer);
+
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "ip6tables -t filter -A INPUT -i %s -p tcp --dport 443 -j DROP", defwan6_rel);
+		system_cmd_ex(sys_cmd_bufer);
+	}
+
+	/* allow ping */
+	if (atoi(wpfE) == 1) { /* enable */
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "iptables -t filter -I INPUT -i %s -p icmp -j ACCEPT", defwan_rel);
+		system_cmd_ex(sys_cmd_bufer);
+
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "ip6tables -t filter -I INPUT -i %s -p icmpv6 -j ACCEPT", defwan6_rel);
+		system_cmd_ex(sys_cmd_bufer);
+	} else {                     /* disable */
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		sprintf(sys_cmd_bufer, "iptables -t filter -A INPUT -i %s -p icmp -j DROP", defwan_rel);
+		system_cmd_ex(sys_cmd_bufer);
+
+		memset(sys_cmd_bufer, 0, sizeof(sys_cmd_bufer));
+		//sprintf(sys_cmd_bufer, "ip6tables -t filter -A INPUT -i %s -p icmpv6 -j DROP", defwan_rel);
+		sprintf(sys_cmd_bufer, "ip6tables -t filter -A INPUT -i %s -p icmpv6 --icmpv6-type echo-request -j DROP", defwan6_rel);
+		system_cmd_ex(sys_cmd_bufer);
+	}
+
+	// vpn pass through
+	//system_cmd_ex("vpn_pass.sh");
+
+}
+
+
+static void zte_iptables_make_DMZ_Rule(char *buf, int len, char *wan_name, char *ip_address)
+{
+	/* iptables -t nat -A PREROUTING -i br0 -j DNAT --to 5.6.7.8 */
+	//rc = snprintf(buf, len-rc , "iptables -t nat -A %s -j DNAT -i %s -p udp --dport ! %d --to %s", DMZ_CHAIN, wan_name, getGoAHeadServerPort(), ip_address);
+	snprintf(buf, len, "iptables -t nat -A %s -j DNAT -i %s  --to %s", DMZ_CHAIN, wan_name,  ip_address);
+}
+void zte_iptables_DMZ_Run(void)
+{
+	char cmd[1024] = {0}, ip_address[128] = {0};
+	char dmz_enable[128] = {0};
+
+	/*flush DMZ chain*/
+	memset(cmd, 0, sizeof(cmd));
+	sprintf(cmd, "iptables -t nat -F %s %s", DMZ_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(cmd);
+
+	memset(cmd, 0, sizeof(cmd));
+
+	//zte_router_nvconfig_read("DMZEnable");
+	//strcpy(dmz_enable , g_router_nvconfig_buf);
+	cfg_get_item("DMZEnable", dmz_enable, sizeof(dmz_enable));
+
+	if (0 == strcmp(dmz_enable, "")) {
+		slog(NET_PRINT, SLOG_ERR, "Warning: DMZ have been disable one\n");
+		return;
+	}
+	if (!atoi(dmz_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "Warning: DMZ have been disable two\n");
+		return;
+	}
+
+	//zte_router_nvconfig_read("DMZIPAddress");
+	// strcpy(ip_address , g_router_nvconfig_buf);
+	cfg_get_item("DMZIPAddress", ip_address, sizeof(ip_address));
+
+
+	if (0 == strcmp(ip_address, "")) {
+		slog(NET_PRINT, SLOG_ERR, "Warning: can't find \"DMZIPAddress\" in flash\n");
+		return;
+	}
+	//system_cmd_ex("iptables -t nat -I PREROUTING -i %s  -m state --state RELATED,ESTABLISHED,NEW -j ACCEPT",getWanIfNamePPP);
+
+	sprintf(cmd, "iptables -t nat -A %s -j ACCEPT -i %s -p udp --dport 67:68", DMZ_CHAIN, defwan_rel);
+	//ZTE_SYSLOG(6,"zte_mainctrl DMZ:%s",cmd);
+	system_cmd_ex(cmd);
+
+	memset(cmd, 0, sizeof(cmd));
+
+	zte_iptables_make_DMZ_Rule(cmd, sizeof(cmd), defwan_rel, ip_address);
+
+	system_cmd_ex(cmd);
+	return;
+}
+
+
+
+
+//12133
+/******************************************************
+* Function: zte_iptables_make_port_forward_rule()
+* Description:  make port forward rules, then run, e.g.
+*                   iptables -t nat -A port_forward -j DNAT -i ppp0 -p tcp --dport 10:400 --to 192.168.0.100
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/12/13      V1.0      MaXiaoliang        create
+*******************************************************/
+static void zte_iptables_make_port_forward_rule(char *buf, int len, char *wan_name,
+        char *ip_address, int proto, int prf_int, int prt_int)
+{
+	int rc = 0;
+	char *pos = buf;
+
+	rc = snprintf(pos, len - rc, "iptables -t nat -A %s -j DNAT -i %s ", PORT_FORWARD_CHAIN, wan_name);
+	pos = pos + rc;
+
+	/* protocol type */
+	if (proto == PROTO_TCP)
+		rc = snprintf(pos, len - rc, "-p tcp ");
+	else if (proto == PROTO_UDP)
+		rc = snprintf(pos, len - rc, "-p udp ");
+	else if (proto == PROTO_TCP_UDP)
+		rc = snprintf(pos, len - rc, " ");
+	pos = pos + rc;
+
+	/* port */
+	if (prt_int != 0)
+		rc = snprintf(pos, len - rc, "--dport %d:%d ", prf_int, prt_int);
+	else
+		rc = snprintf(pos, len - rc, "--dport %d ", prf_int);
+	pos = pos + rc;
+
+	/* dest ip, forward to who */
+	rc = snprintf(pos, len - rc, "--to %s ", ip_address);
+}
+
+//12134
+
+/******************************************************
+* Function: zte_iptables_port_forward_run()
+* Description:  make port forward rules, then run
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2010/12/13      V1.0      MaXiaoliang        create
+*******************************************************/
+void zte_iptables_port_forward_run(void)
+{
+	char forward_enable[10] = {0};
+	//char rule[NV_FW_RULE_MAX_LEN] = {0};
+
+	int i = 0;
+	char rec[ROUTER_NV_FW_RULE_MAX_LEN] = {0};
+	char cmd[ROUTER_NV_FW_RULE_MAX_LEN] = {0};
+
+	int prf_int;
+	int prt_int;
+	int proto;
+	char ip_address[32] = {0};
+	char prf[8] = {0};
+	char prt[8] = {0};
+	char protocol[8] = {0};
+	char tmp[ROUTER_DEFAULT_LEN] = {0};
+	/* if port forward is disabled or PortForwardRules is NULL, then return */
+	//zte_router_nvconfig_read("PortForwardEnable");
+	//strcpy(forward_enable , g_router_nvconfig_buf);
+	cfg_get_item("PortForwardEnable", forward_enable, sizeof(forward_enable));
+
+	if (0 == strlen(forward_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "Warning: PortForward have been disable one \n");
+		return;
+	}
+	//iptablesPortForwardFlush();
+	system_cmd_ex("iptables -t nat -F "PORT_FORWARD_CHAIN);
+
+	/* 0: disable  1: enable */
+	if (0 == atoi(forward_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "Warning: PortForward have been disable two \n");
+		return;
+	}
+
+	sprintf(cmd, "iptables -t nat -A %s -j ACCEPT -i %s -p udp --dport 67:68", PORT_FORWARD_CHAIN, defwan_rel);
+	//ZTE_SYSLOG(6,"zte_mainctrl port_forward:%s",cmd);
+	system_cmd_ex(cmd);
+	memset(cmd, 0, sizeof(cmd));
+
+	for (i = 0; i < RULE_MAX; i++) {
+		sprintf(tmp, "PortForwardRules_%d", i);
+		memset(rec, 0, sizeof(rec));
+		//zte_router_nvconfig_read(tmp);
+		//strcpy(rec , g_router_nvconfig_buf);
+		cfg_get_item(tmp, rec, sizeof(rec));
+
+		// get ip address
+		if ((getNthValueSafe(0, rec, ',', ip_address, sizeof(ip_address)) == -1)) {
+			continue;
+		}
+		if (!isIpValid(ip_address)) {
+			continue;
+		}
+
+		// get port range "from"
+		if ((getNthValueSafe(1, rec, ',', prf, sizeof(prf)) == -1)) {
+			continue;
+		}
+		if ((prf_int = atoi(prf)) == 0 || prf_int > 65535) {
+			continue;
+		}
+
+		// get port range "to"
+		if ((getNthValueSafe(2, rec, ',', prt, sizeof(prt)) == -1)) {
+			continue;
+		}
+		if ((prt_int = atoi(prt)) > 65535) {
+			continue;
+		}
+
+		// get protocol
+		if ((getNthValueSafe(3, rec, ',', protocol, sizeof(protocol)) == -1)) {
+			continue;
+		}
+		proto = atoi(protocol);
+
+		switch (proto) {
+		case PROTO_TCP:
+		case PROTO_UDP:
+			zte_iptables_make_port_forward_rule(cmd, sizeof(cmd), defwan_rel, ip_address, proto, prf_int, prt_int);
+			system_cmd_ex(cmd);
+			break;
+		case PROTO_TCP_UDP:
+			zte_iptables_make_port_forward_rule(cmd, sizeof(cmd), defwan_rel, ip_address, PROTO_TCP, prf_int, prt_int);
+			system_cmd_ex(cmd);
+			zte_iptables_make_port_forward_rule(cmd, sizeof(cmd), defwan_rel, ip_address, PROTO_UDP, prf_int, prt_int);
+			system_cmd_ex(cmd);
+			break;
+
+		default:
+			continue;
+		}
+	}
+
+}
+
+/******************************************************
+* Function: zte_iptables_make_portmap_rule()
+* Description:  make filter rules, e.g.
+*                   iptables -t nat -A PREROUTING -p udp --port 77 -j DNAT --to 192.168.8.100:88
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2015/08/03     V1.0      gebin          create
+*******************************************************/
+static void zte_iptables_make_portmap_rule(char *buf, int len, char *wan_name, char *ip, int spr_int, int dpr_int, int proto)
+{
+	int rc = 0;
+	char *pos = buf;
+
+	rc = snprintf(pos, len - rc, "iptables -t nat -A %s -j DNAT -i %s ", PORT_MAPPING_CHAIN, wan_name);
+	//rc = snprintf(pos, len - rc, "iptables -t nat -A PREROUTING ");
+	pos = pos + rc;
+
+	// write protocol type
+	if (proto == PROTO_TCP)
+		rc = snprintf(pos, len - rc, "-p tcp ");
+	else if (proto == PROTO_UDP)
+		rc = snprintf(pos, len - rc, "-p udp ");
+	else if (proto == PROTO_TCP_UDP)
+		rc = snprintf(pos, len - rc, " ");
+	pos = pos + rc;
+
+	// write source port
+	if (spr_int) {
+		rc = snprintf(pos, len - rc, "--dport %d ", spr_int);
+		pos = pos + rc;
+	}
+
+	// write ip
+	if (ip && strlen(ip)) {
+		rc = snprintf(pos, len - rc, "--to %s", ip);
+		pos = pos + rc;
+	}
+
+	// write dest port
+	if (dpr_int) {
+		rc = snprintf(pos, len - rc, ":%d", dpr_int);
+		pos = pos + rc;
+	}
+}
+
+/******************************************************
+* Function: zte_iptables_port_map_run()
+* Description:  load rules from "PortMapRules", make rules, and run
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2015/08/03     V1.0      gebin          create
+*******************************************************/
+static void zte_iptables_port_map_run(char *portMapRule)
+{
+	//char portmap_enable[CONFIG_DEFAULT_LENGTH] = {0};
+	char ip[32]  = {0};    /* ip address */
+	char spr[8]  = {0};    /* source port from */
+	char dpr[8]  = {0};    /* dest port from */
+	char protocol[8] = {0};
+
+	int spr_int = 0;
+	int dpr_int = 0;
+	int proto = 0;
+	char cmd[300] = {0};
+
+	// get ip address
+	if ((getNthValueSafe(0, portMapRule, ',', ip, sizeof(ip)) == -1)) {
+		return;
+	}
+	if (!isIpNetmaskValid(ip)) {
+		return;
+	}
+
+	// get source ip port
+	if ((getNthValueSafe(1, portMapRule, ',', spr, sizeof(spr)) == -1)) {
+		return;
+	}
+	if ((spr_int = atoi(spr)) > 65535) {
+		return;
+	}
+
+	// get dest ip port
+	if ((getNthValueSafe(2, portMapRule, ',', dpr, sizeof(dpr)) == -1)) {
+		return;
+	}
+	if ((dpr_int = atoi(dpr)) > 65535) {
+		return;
+	}
+
+	// get protocol
+	if ((getNthValueSafe(3, portMapRule, ',', protocol, sizeof(protocol)) == -1)) {
+		return;
+	}
+	proto = atoi(protocol);
+
+	/*
+	# iptables example
+	# iptables -t nat -A PREROUTING -p udp --port 77 -j DNAT --to 192.168.8.100/88
+	*/
+	if (PROTO_TCP_UDP == proto) {
+		zte_iptables_make_portmap_rule(cmd, sizeof(cmd), defwan_rel, ip, spr_int, dpr_int, PROTO_TCP);
+		system_cmd_ex(cmd);
+		zte_iptables_make_portmap_rule(cmd, sizeof(cmd), defwan_rel, ip, spr_int, dpr_int, PROTO_UDP);
+		system_cmd_ex(cmd);
+	} else {
+		zte_iptables_make_portmap_rule(cmd, sizeof(cmd), defwan_rel, ip, spr_int, dpr_int, proto);
+		system_cmd_ex(cmd);
+	}
+}
+
+/******************************************************
+* Function: zte_iptables_port_map_all_run()
+* Description:  load rules from "PortMapRules", make rules, and run
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date    Version   Author         Modification
+* 2015/08/03     V1.0      gebin          create
+*******************************************************/
+void zte_iptables_port_map_all_run(void)
+{
+	int i = 0;
+	char PortMapRules[300] = {0};
+	char PortMapRules_x[50] = {0};
+	char portmap_enable[64] = {0}; /* 0: Disabled  1: Enabled */
+	int portmap_int = 0;
+	char cmd[ROUTER_NV_FW_RULE_MAX_LEN] = {0};
+
+	//read port_map setting
+	cfg_get_item("PortMapEnable", portmap_enable, sizeof(portmap_enable));
+	slog(NET_PRINT, SLOG_NORMAL, "portmap_enable: %s \n", portmap_enable);
+	if (0 == strlen(portmap_enable)) {
+		slog(NET_PRINT, SLOG_ERR, "Error: can't find \"PortMapRules\" in flash.\n"); /*lint !e26*/
+		return;
+	}
+
+	system_cmd_ex("iptables -t nat -F "PORT_MAPPING_CHAIN);
+
+	portmap_int = atoi(portmap_enable);
+	/* if firewall is disable, then return directly: 0 mean disable, 1 means enable */
+	if (0 == portmap_int) {
+		return;
+	}
+
+	sprintf(cmd, "iptables -t nat -A %s -j ACCEPT -i %s -p udp --dport 67:68", PORT_MAPPING_CHAIN, defwan_rel);
+	system_cmd_ex(cmd);
+	memset(cmd, 0, sizeof(cmd));
+
+	for (i = 0; i <= 9; i++) {
+		(void)snprintf(PortMapRules_x, 50, "PortMapRules_%d", i);
+		memset(PortMapRules, 0, sizeof(PortMapRules));
+		cfg_get_item(PortMapRules_x, PortMapRules, sizeof(PortMapRules));
+		if (0 == strcmp(PortMapRules, "")) {
+			continue;
+		}
+		zte_iptables_port_map_run(PortMapRules);
+		slog(NET_PRINT, SLOG_NORMAL, "zte_iptables_port_map_all_run %s: %s", PortMapRules_x, PortMapRules);
+	}
+}
+
+/*===========================================================================
+    Function:
+        zte_iptables_make_filter_rule_v6
+
+    Description:
+        make ipportfilter rules.
+        example:
+            iptables -A macipport_filter
+                        -m mac --mac-source 00:11:22:33:44:55
+                        -m iprange --src-range 192.168.1.10-192.168.1.50
+                        -m iprange --dst-range 10.128.10.10-10.128.10.100
+                        -p tcp --sport 10:2000 --dport 4000:5000
+                        -j DROP
+
+    Param:
+        buf - cmd buffer to store rule cmd
+        len - length of cmd buffer
+        mac_address - mac address
+        sip_1 - source ip 1
+        sip_2 - source ip 2 (not support now)
+        sprf_int - source ip from port
+        sprt_int - source ip to port
+        dip_1 - dest ip 1
+        dip_2 - dest ip 2 (not support now)
+        dprf_int - dest ip from port
+        dprt_int - dest ip to port
+        proto - protocol
+        action - accept or drop
+
+    Modify Date     Version     Author                  Modification
+    2010/07/12      V1.0        zhangyuelong10100551    Create
+===========================================================================*/
+static void zte_iptables_make_filter_rule_v6(char *buf, int len, char *mac_address,
+        char *sip_1, char *sip_2, int sprf_int, int sprt_int,
+        char *dip_1, char *dip_2, int dprf_int, int dprt_int, int proto, int action)
+{
+	int rc = 0;
+	char *pos = buf;
+
+	if (NULL == buf) {
+		slog(NET_PRINT, SLOG_ERR, "[zte_iptables_make_filter_rule_v6]: buf NULL");
+		return;
+	}
+
+	rc = snprintf(pos, len - rc, "ip6tables -A %s ", IPPORT_FILTER_CHAIN);
+	pos = pos + rc;
+
+	// write mac address
+	if (mac_address && strlen(mac_address)) {
+		rc = snprintf(pos, len - rc, "-m mac --mac-source %s ", mac_address);
+		pos = pos + rc;
+	}
+
+	// write source ip
+	if (sip_1 && strlen(sip_1)) {
+		if (0 != strcmp("any/0", sip_1)) {
+			rc = snprintf(pos, len - rc, "-s %s ", sip_1);
+			pos = pos + rc;
+		}
+	}
+
+	// write dest ip
+	if (dip_1 && strlen(dip_1)) {
+		if (0 != strcmp("any/0", dip_1)) {
+			rc = snprintf(pos, len - rc, "-d %s ", dip_1);
+			pos = pos + rc;
+		}
+	}
+
+	// write protocol type
+	if (proto == PROTO_NONE) {
+		//rc = snprintf(pos, len-rc, " ");
+		//pos = pos + rc;
+	} else if (proto == PROTO_ICMP) {
+		rc = snprintf(pos, len - rc, "-p icmpv6 ");
+		pos = pos + rc;
+	} else if (proto == PROTO_TCP || proto == PROTO_UDP) {
+		if (proto == PROTO_TCP)
+			rc = snprintf(pos, len - rc, "-p tcp ");
+		else/* if (proto == PROTO_UDP)*/ //kw 3
+			rc = snprintf(pos, len - rc, "-p udp ");
+		pos = pos + rc;
+
+		// write source port
+		if (sprf_int) {
+			if (sprt_int)
+				rc = snprintf(pos, len - rc, "--sport %d:%d ", sprf_int, sprt_int);
+			else
+				rc = snprintf(pos, len - rc, "--sport %d ", sprf_int);
+			pos = pos + rc;
+		}
+
+		// write dest port
+		if (dprf_int) {
+			if (dprt_int)
+				rc = snprintf(pos, len - rc, "--dport %d:%d ", dprf_int, dprt_int);
+			else
+				rc = snprintf(pos, len - rc, "--dport %d ", dprf_int);
+			pos = pos + rc;
+		}
+	}
+
+	switch (action) {
+	case ACTION_DROP:       // 1 == ENABLE--DROP mode
+		rc = snprintf(pos, len - rc, "-j DROP");
+		break;
+	case ACTION_ACCEPT:     // 2 == ENABLE--ACCEPT mode
+		rc = snprintf(pos, len - rc, "-j ACCEPT");
+		break;
+	default:
+		slog(NET_PRINT, SLOG_ERR, "[zte_iptables_make_filter_rule_v6]: unknown action", "");
+		break;
+	}
+}  /* zte_iptables_make_filter_rule_v6() */
+void zte_iptables_filter_run_v6(void)
+{
+	char filter_flag[ROUTER_DEFAULT_LEN] = {0}, filter_default_policy[ROUTER_DEFAULT_LEN] = {0}, cmd[500] = {0}, each_rule[ROUTER_NV_FW_RULE_MAX_LEN] = {0}, tmp[ROUTER_DEFAULT_LEN] = {0}, dip_2[ZTE_FW_IP_ADDR_LEN_V6] = {0}, protocol[ZTE_ROUTER_FW_FLAG_LEN] = {0}, mac_address[ROUTER_DEFAULT_LEN] = {0},
+	                                       sip_1[ZTE_FW_IP_ADDR_LEN_V6] = {0}, sip_2[ZTE_FW_IP_ADDR_LEN_V6] = {0}, sprf[ZTE_ROUTER_FW_PORT_LEN] = {0}, sprt[ZTE_ROUTER_FW_PORT_LEN] = {0}, dip_1[ZTE_FW_IP_ADDR_LEN_V6] = {0}, dprf[ZTE_ROUTER_FW_PORT_LEN] = {0}, dprt[ZTE_ROUTER_FW_PORT_LEN] = {0}, action[ZTE_ROUTER_FW_FLAG_LEN] = {0};
+	int i = 0;
+
+	/* flush all filter rules */
+	system_cmd_ex("ip6tables -F "IPPORT_FILTER_CHAIN);
+	/* default policy */
+	system_cmd_ex("ip6tables -t filter -P FORWARD ACCEPT");
+	system_cmd_ex("ip6tables -t filter -A "IPPORT_FILTER_CHAIN" -m state --state RELATED,ESTABLISHED -j ACCEPT");
+
+	/* check whether run filter */
+	//zte_router_nvconfig_read("IPPortFilterEnable");
+	//strcpy(filter_flag, g_router_nvconfig_buf);
+	cfg_get_item("IPPortFilterEnable", filter_flag, sizeof(filter_flag));
+
+	if (strlen(filter_flag) == 0 || atoi(filter_flag) == 0) {
+		return;
+	}
+
+	/* set default policy of filter */
+	//zte_router_nvconfig_read("DefaultFirewallPolicy");
+	//strcpy(filter_default_policy, g_router_nvconfig_buf);
+	cfg_get_item("DefaultFirewallPolicy", filter_default_policy, sizeof(filter_default_policy));
+
+	if (strcmp("1", filter_default_policy) == 0) {
+		system_cmd_ex("ip6tables -t filter -P FORWARD DROP");
+	} else {
+		system_cmd_ex("ip6tables -t filter -P FORWARD ACCEPT");
+	}
+
+	for (i = 0; i < RULE_MAX; i++) {
+		sprintf(tmp, "IPPortFilterRulesv6_%d", i);
+		memset(each_rule, 0, sizeof(each_rule));
+		//zte_router_nvconfig_read(tmp);
+		//strcpy(each_rule, g_router_nvconfig_buf);
+		cfg_get_item(tmp, each_rule, sizeof(each_rule));
+
+		/* source ip range "from" */
+		if (getNthValueSafe(0, each_rule, ',', sip_1, sizeof(sip_1)) == -1) {
+			continue;
+		}
+		/* source ip range "to" */
+		if (getNthValueSafe(1, each_rule, ',', sip_2, sizeof(sip_2)) == -1) {
+			continue;
+		}
+		/* source port range "from" */
+		if ((getNthValueSafe(2, each_rule, ',', sprf, sizeof(sprf)) == -1) || atoi(sprf) > 65535) {
+			continue;
+		}
+		/* source port range "to" */
+		if ((getNthValueSafe(3, each_rule, ',', sprt, sizeof(sprt)) == -1) || atoi(sprt) > 65535) {
+			continue;
+		}
+		/* dst ip range "from" */
+		if (getNthValueSafe(4, each_rule, ',', dip_1, sizeof(dip_1)) == -1) {
+			continue;
+		}
+		/* dst ip range "to" */
+		if (getNthValueSafe(5, each_rule, ',', dip_2, sizeof(dip_2)) == -1) {
+			continue;
+		}
+		/* dst port range "from" */
+		if ((getNthValueSafe(6, each_rule, ',', dprf, sizeof(dprf)) == -1) || atoi(dprf) > 65535) {
+			continue;
+		}
+		/* dst port range "to" */
+		if ((getNthValueSafe(7, each_rule, ',', dprt, sizeof(dprt)) == -1) || atoi(dprt) > 65535) {
+			continue;
+		}
+		/* protocol */
+		if (getNthValueSafe(8, each_rule, ',', protocol, sizeof(protocol)) == -1) {
+			continue;
+		}
+		/* action */
+		if (getNthValueSafe(9, each_rule, ',', action, sizeof(action)) == -1) {
+			continue;
+		}
+		/* comment */
+		/* mac_address */
+		//kw 3
+		if (getNthValueSafe(11, each_rule, ',', mac_address, sizeof(mac_address)) == -1) {
+			continue;
+		}
+		if (strlen(mac_address) && !isMacValid(mac_address)) {
+			continue;
+		}
+		
+
+		/* run rules */
+		if (PROTO_TCP_UDP == atoi(protocol)) {
+			zte_iptables_make_filter_rule_v6(cmd, sizeof(cmd), mac_address,
+			                                 sip_1, sip_2, atoi(sprf), atoi(sprt), dip_1, dip_2, atoi(dprf), atoi(dprt), PROTO_TCP, atoi(action));
+			system_cmd_ex(cmd);
+
+			zte_iptables_make_filter_rule_v6(cmd, sizeof(cmd), NULL,
+			                                 sip_1, sip_2, atoi(sprf), atoi(sprt), dip_1, dip_2, atoi(dprf), atoi(dprt), PROTO_UDP, atoi(action));
+			system_cmd_ex(cmd);
+		} else {
+			zte_iptables_make_filter_rule_v6(cmd, sizeof(cmd), mac_address,
+			                                 sip_1, sip_2, atoi(sprf), atoi(sprt), dip_1, dip_2, atoi(dprf), atoi(dprt), atoi(protocol), atoi(action));
+			system_cmd_ex(cmd);
+		}
+	}
+}
+void zte_iptables_Webs_Filter_Run(void)
+{
+	int i = 0;
+	char url_filter[ZTE_ROUTER_URL_FILTER_LEN] = {0};
+	char entry[ROUTER_NV_ITEM_VALUE_MAX_LEN] = {0};
+	char cmd[ROUTER_NV_ITEM_VALUE_MAX_LEN] = {0};
+	char url_hexstring[ZTE_ROUTER_URL_FILTER_LEN] = {0};
+
+	/*
+	 *×¢Ê͵ôÔ­À´µÄ×Ö·û´®Æ¥Å䣬¸ÄΪģºýÆ¥Åä.
+	 *[comlee]:2016Äê 04ÔÂ 08ÈÕ ÐÇÆÚÎå 09:14:07 CST
+	 *
+	*/
+	char sys_cmd_bufer[500] = {0};
+
+	/*flush filter chain*/
+	sprintf(sys_cmd_bufer, "iptables -F %s %s", WEB_FILTER_CHAIN, FMT_ECHO_IPTABLES_CMD);
+	system_cmd_ex(sys_cmd_bufer);
+#if 0
+	for (i = 0; i < old_url_list.count; i ++) {
+		sprintf(cmd, "iptables -D INPUT -m string --hex-string  \"|%s|\" --algo kmp -j DROP", old_url_list.url_list[i]);
+		system_cmd_ex(cmd);
+	}
+	old_url_list.count = 0;
+#endif
+
+	cfg_get_item("websURLFilters", url_filter, sizeof(url_filter));
+
+	i = 0;
+	while ((getNthValueSafe(i++, url_filter, ';', entry, sizeof(entry)) != -1)) {
+		if (strlen(entry)) {
+			if (!strncasecmp(entry, "http://", strlen("http://")))
+				strncpy(entry, entry + strlen("http://"), sizeof(entry)-1);
+
+
+			memset(cmd, 0, sizeof(cmd));
+
+			snprintf(cmd, sizeof(cmd), "iptables -A web_filter -p tcp -m tcp -m webstr --url %s -j REJECT --reject-with tcp-reset", entry);
+			system_cmd_ex(cmd);
+
+			/*
+			 *×¢Ê͵ôÔ­À´µÄ×Ö·û´®Æ¥Å䣬¸ÄΪģºýÆ¥Åä.
+			 *[comlee]:2016Äê 04ÔÂ 08ÈÕ ÐÇÆÚÎå 09:14:07 CST
+			 *
+			*/
+#if 0
+			memset(cmd, 0, sizeof(cmd));
+			memset(url_hexstring, 0, sizeof(url_hexstring));
+			str_vary_dit(entry, url_hexstring);
+			sprintf(cmd, "iptables -I INPUT -m string --hex-string  \"|%s|\" --algo kmp -j DROP ", url_hexstring);
+			if (old_url_list.count < MAX_OLD_URLS_COUNT) {
+				memcpy(old_url_list.url_list[old_url_list.count], url_hexstring, (size_t)ZTE_ROUTER_URL_FILTER_LEN);
+				old_url_list.count ++;
+			}
+			system_cmd_ex(cmd);
+#endif
+		}
+	}
+
+	return;
+}
+static void zte_iptables_all_filter_run(void)
+{
+	zte_iptables_filter_run();
+	zte_iptables_filter_run_v6();
+	/* system filter */
+	zte_iptables_sys_fw_run();
+	/*url filter*/
+	zte_iptables_Webs_Filter_Run();
+
+	//¼Ò³¤Ä£Ê½¹æÔò
+
+	zte_iptables_child_filter_run();
+
+}
+
+void zte_iptables_child_filter_run()
+{
+
+	system_cmd_ex("iptables -t filter -A INPUT -j children_web_filter");
+
+	/* 0:·ÇÏÞÖÆÉÏÍøÊ±¼ä¶Î 1:ÏÞÖÆÉÏÍøÊ±¼ä¶Î*/
+	if (g_limit_time_flag == 1) {
+		zte_children_start_nonet();
+	} else if (g_limit_time_flag == 0) {
+		zte_children_stop_nonet();
+	} else {
+		return;
+	}
+}
+
+static void zte_iptables_all_nat_run(void)
+{
+	/*port forward*/
+	zte_iptables_port_forward_run();
+
+	/* EC: 616000297057, Ô­Òò: ÍøÂç²»Ö§³Ö¶Ë¿ÚÓ³Éä */
+	/*port mapping*/
+	zte_iptables_port_map_all_run();
+
+	/*DMZ*/
+	zte_iptables_DMZ_Run();
+
+}
+
+
+void alg_control_fun()
+{
+	int sip_enable = 0;
+	int ftp_enable = 0;
+	char buf[32];
+	memset(buf, 0x00, sizeof(buf));
+
+	cfg_get_item("alg_sip_enable", buf, sizeof(buf));
+	sip_enable = atoi(buf);
+	memset(buf, 0x00, sizeof(buf));
+	cfg_get_item("alg_ftp_enable", buf, sizeof(buf));
+	ftp_enable = atoi(buf);
+	slog(NET_PRINT, SLOG_NORMAL, "into ***** alg_control_fun");
+	//ALG: sip function control
+	if (1 == sip_enable) {
+		slog(NET_PRINT, SLOG_NORMAL, "insmod sip module");
+		system_cmd_ex("insmod /lib/modules/2.6.21/kernel/net/netfilter/nf_conntrack_sip.ko");
+	} else {
+		slog(NET_PRINT, SLOG_NORMAL, "rmmod sip module");
+		system_cmd_ex("rmmod nf_conntrack_sip");
+	}
+	//ALG: ftp service control
+	system_cmd_ex("iptables -t filter -F ftp_filter");
+	if (0 == ftp_enable) {
+		slog(NET_PRINT, SLOG_NORMAL, "shutdown  ftp service");
+		system_cmd_ex("iptables -t filter -N ftp_filter");
+		system_cmd_ex("iptables -t filter -I FORWARD 2 -j ftp_filter");
+		//system_cmd_ex("iptables -t filter -A ftp_filter -p tcp --dport 20 -j DROP");
+		system_cmd_ex("iptables -t filter -A ftp_filter -p tcp --dport 21 -j DROP");
+	}
+	//ALG: vpn passthr contrl
+	system_cmd_ex("vpn_pthr_contrl.sh");
+	slog(NET_PRINT, SLOG_NORMAL, "end alg_control_fun");
+}
+void zte_router_init(void)
+{
+	slog(NET_PRINT, SLOG_NORMAL, "===============init firewall=================== \n");
+	/* init firewall and nat*/
+	//system_cmd_ex("nat.sh");
+	//zte_router_MTU_set();
+	system_cmd_ex("firewall_init.sh");
+
+	/* read wan if name */
+	memset(defwan_rel, 0, sizeof(defwan_rel));
+	cfg_get_item("default_wan_rel", defwan_rel, sizeof(defwan_rel));
+
+	//ZTE_LOG(LOG_DEBUG, "zte_router_init -> defwan_rel:[%s]", defwan_rel);
+
+	memset(defwan6_rel, 0, sizeof(defwan6_rel));
+	cfg_get_item("default_wan6_rel", defwan6_rel, sizeof(defwan6_rel));
+	zte_iptables_all_filter_run();
+	zte_iptables_all_nat_run();
+
+	slog(NET_PRINT, SLOG_NORMAL, "zte_router_init end \n");
+}
+
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/makefile b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/makefile
new file mode 100644
index 0000000..70551c0
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/makefile
@@ -0,0 +1,104 @@
+# /*****************************************************************************

+#* 版权所有 (C)2015, 中兴通讯股份有限公司。

+#* 

+#* 文件名称:     Makefile

+#* 文件标识:     Makefile

+#* 内容摘要:     Makefile of ZTE applications

+#* 使用方法:     void

+#* 

+#* 修改日期        版本号      修改标记        修改人          修改内容

+#* -----------------------------------------------------------------------------

+#* 2015/02/10      V1.0        Create          张楠          创建

+#* 

+# ******************************************************************************/

+

+#*******************************************************************************

+# include ZTE application makefile

+#*******************************************************************************

+#include $(zte_app_mak)

+#include $(zte_app_path)/net_team.mk

+include $(COMMON_MK)

+WORKPATH = $(zte_lib_path)

+SOFT_TIMER_PATH = $(WORKPATH)/libsoft_timer

+

+#*******************************************************************************

+# execute

+#*******************************************************************************

+EXEC    = zte_mmi

+

+#*******************************************************************************

+# objects

+#*******************************************************************************

+OBJS    = mmi_adapter.o mmi.o mmi_battery.o mmi_net.o mmi_wifi.o mmi_tip.o mmi_sms.o mmi_lcd_page.o mmi_lcd.o mmi_lcd_init.o mmi_ctrl.o \

+		  mmi_keystrokes.o mmi_lcd_timer.o mmi_led.o mmi_led_init.o mmi_led_adapter.o mmi_poweroff_charger.o mmi_traffic.o mmi_fota.o mmi_msg.o \

+		  mmi_cfg.o mmi_poweroff.o mmi_battery_adapter.o mmi_mo.o mmi_mo_en.o mmi_mo_zh.o mmi_voip.o mmi_plat_adapter.o mmi_rj45.o

+

+#*******************************************************************************

+# include path

+#*******************************************************************************                

+INCLUE_PATH = -I. -I./../../include

+CFLAGS += -Wextra -Wall $(INCLUE_PATH) $(CUSTOM_MACRO)

+CFLAGS  += -I$(SOFT_TIMER_PATH)

+

+ifneq ($(CONFIG_MMI_LCD),no)

+CFLAGS  += -I$(WORKPATH)/libzcore/min/zcore_zcore/src/zCore/src/gui/adapter/Linux/inc \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/src/zCore/inc/os \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/gui \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/os \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/kernel \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/gui/ctrl \

+           -I$(WORKPATH)/libzcore/min/zcore_zcore/inc/zCore/mmi \

+           -I$(WORKPATH)/libzcore/min/ 

+endif

+

+CFLAGS  += -I$(SOFT_TIMER_PATH) \

+		   -L$(SOFT_TIMER_PATH)

+CFLAGS += -g

+CFLAGS += -I$(WORKPATH)/libnvram

+CFLAGS += -I$(zte_app_path)/zte_comm/zte_hotplug

+

+ifeq ($(LINUX_TYPE),uClinux)

+CFLAGS += -g -O0

+endif

+

+#*******************************************************************************

+# macro definition

+#*******************************************************************************

+

+

+#*******************************************************************************

+# library

+#*******************************************************************************

+LDLIBS += -lpthread -lm -lrt 

+CFLAGS += -I$(SOFT_TIMER_PATH)

+

+LDLIBS += -lnvram -lpthread -lsoft_timer -lsoftap

+#LDFLAGS += -L../soft_timer -lsofttimer 

+

+ifneq ($(CONFIG_MMI_LCD),no)

+LDLIBS += -lzcore

+endif

+

+#*******************************************************************************

+# library path

+#*******************************************************************************

+LDLIBS  += -L$(WORKPATH)/libnvram

+LDLIBS  += -L$(WORKPATH)/libsoft_timer

+

+ifneq ($(CONFIG_MMI_LCD),no)

+LDLIBS  += -L$(WORKPATH)/libzcore/min

+endif

+

+LDLIBS  += -L$(zte_lib_path)/libsoftap

+

+#*******************************************************************************

+# targets

+#*******************************************************************************

+lib: $(OBJS)

+	@echo Compiling zte_mmi libraries.

+	

+clean:

+	-rm -f $(OBJS)

+	

+

+	

diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi.c
new file mode 100755
index 0000000..9ff5454
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi.c
@@ -0,0 +1,891 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+ Í·Îļþ
+******************************************************************************/
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+//ÏÂÃæ¶¼ÊÇdebug¶¨Î»ÎÊÌâʱÓõ½µÄÈ«¾Ö±äÁ¿
+#define MMI_DEBUG_MAINCONTROL
+#ifdef MMI_DEBUG_MAINCONTROL
+SINT32 g_mmi_MainContrlIndex = -1;
+SINT32 g_mmi_MainContrlProcess = -1;//0, get content;1 gelceinfo; 2 show
+SINT32 g_mmi_MainContrl = -1;
+
+
+int g_debug[20] = {0};
+int g_debug_index = 0;
+#endif
+/********************************************************************************
+  È«¾Ö±äÁ¿ÒýÓÃ
+**********************************************************************************/
+extern E_zMmiShowMode g_showMode;
+
+/********************************************************************************
+  È«¾Ö±äÁ¿¶¨Òå
+**********************************************************************************/
+int g_mmi_msgQue_Id = 0;
+int g_mmi_at_led_flag = 0;
+int g_mmi_at_lcd_flag = 0;
+pthread_mutex_t g_mmi_lcdmode_mutex ;
+pthread_mutex_t g_mmi_ledmode_mutex ;
+pthread_mutex_t g_mmi_update_flag_mutex;
+pthread_mutex_t g_mmi_refresh_lcd_mutex;
+pthread_mutex_t g_mmi_poweron_mutex;
+
+sem_t g_mmi_update_sem_id;
+sem_t g_mmi_init_sem_id;
+sem_t g_mmi_traffic_warn_sem_id;
+sem_t g_mmi_poweroff_sem_id ;
+sem_t g_mmi_gui_init_sem_id;
+
+
+UINT32 	g_mmi_poweroff_turnon_flag = FALSE ;
+UINT32  g_mmi_led_status_flag = 0;
+T_zMMITaskInfoItem g_zMMITaskInfoTab[MMI_TASK_MAX] = {0};
+
+UINT32 g_smstask_enable = 0;
+UINT32 g_voicetask_enable = 0;
+UINT32 g_temp_protect = 0;
+UINT32 g_discharge_protect = 0;
+UINT32 g_charge_protect = 0;
+
+UINT32 g_fast_poweron = 0;
+UINT32 g_led_standby_mode = 0;
+UINT32 g_led_sleep_mode = 0;
+UINT32 g_use_wifi_usernum = 0;
+
+UINT32 g_show_pagefirst = 0;
+UINT32 g_show_pagesecond = 0;
+UINT32 g_show_pagethird = 0;
+/*
+SINT32 g_mmi_hightempvol = 0;
+SINT32 g_mmi_superhightempvol = 0;
+SINT32 g_mmi_lowtempvol = 0;
+SINT32 g_mmi_superlowtempvol = 0;
+*/
+SINT32 g_mmi_batvoltageline[21] = {0};
+
+SINT32 g_mmi_power_mode = 0;//0:charge;1:poweron
+
+//int g_customer_type = CUSTOMER_SDK;  // Õë¶Ô²»Í¬¿Í»§µÄ¶¨ÖÆÐèÇó
+extern int g_customer_type;
+
+extern VOID  mmi_BatLedOffOpt();
+extern VOID mmi_BatLedGreenOn();
+
+//ÉèÖô¥·¢¸üбêÖ¾
+VOID mmi_set_update_flag(E_zMmi_Task task)
+{
+	mmi_getMutex(&g_mmi_update_flag_mutex);
+	g_zMMITaskInfoTab[task].is_update = 1;
+	mmi_putMutex(&g_mmi_update_flag_mutex);
+
+	mmi_PutSemaphore(&g_mmi_update_sem_id);
+}
+
+VOID mmi_clean_update_flag(E_zMmi_Task task)
+{
+	mmi_getMutex(&g_mmi_update_flag_mutex);
+	g_zMMITaskInfoTab[task].is_update = 0;
+	mmi_putMutex(&g_mmi_update_flag_mutex);
+}
+SINT32 mmi_get_update_flag(E_zMmi_Task task)
+{
+	SINT32 ret = 0;
+	if (task >= MMI_TASK_MAX)//cov kw 3
+		return ret;
+	mmi_getMutex(&g_mmi_update_flag_mutex);
+	ret = g_zMMITaskInfoTab[task].is_update;
+	g_zMMITaskInfoTab[task].is_update = 0;
+	mmi_putMutex(&g_mmi_update_flag_mutex);
+	return ret;
+}
+
+//ÏÔʾledµÆ
+static VOID mmi_show_led_item(T_zMMITaskInfoItem* taskInfoItem)
+{
+	if(1 == g_mmi_at_led_flag)
+	{
+		return;
+	}
+	
+	if (taskInfoItem->get_taskinfo_fun == NULL || taskInfoItem->taskinfo == NULL ||
+	    taskInfoItem->get_ledinfo_fun == NULL || taskInfoItem->ledinfo == NULL) {
+		//slog(MMI_PRINT,SLOG_DEBUG,"ZTE_MMI mmi_show_led parameter null!!!\n");
+		return;
+	}
+	if (taskInfoItem->get_taskinfo_fun((UINT32)taskInfoItem->taskinfo) == MMI_SUCCESS) { //e64
+		if (taskInfoItem->get_ledinfo_fun((UINT32)taskInfoItem->taskinfo, (UINT32)taskInfoItem->ledinfo) == MMI_SUCCESS) {
+			mmi_showLed((UINT32)taskInfoItem->ledinfo);
+		}
+	}
+}
+//ÏÔʾlcdµÆ
+static VOID mmi_show_lcd_item(T_zMMITaskInfoItem* taskInfoItem)
+{
+	if (taskInfoItem->get_taskinfo_fun == NULL || taskInfoItem->taskinfo == NULL ||
+	    taskInfoItem->get_lcdinfo_fun == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_show_lcd parameter null!!!");
+		return;
+	}
+#ifdef MMI_DEBUG_MAINCONTROL
+	g_mmi_MainContrlProcess = 0;//0, get content;1 gelceinfo; 2 show
+#endif
+	if (taskInfoItem->get_taskinfo_fun((UINT32)taskInfoItem->taskinfo) == MMI_SUCCESS) {
+#ifdef MMI_DEBUG_MAINCONTROL
+		g_mmi_MainContrlProcess = 1;//0, get content;1 gelceinfo; 2 show
+#endif
+		if (taskInfoItem->get_lcdinfo_fun((UINT32)taskInfoItem->taskinfo) == MMI_SUCCESS) {
+#ifdef MMI_DEBUG_MAINCONTROL
+			g_mmi_MainContrlProcess = 2;//0, get content;1 gelceinfo; 2 show
+#endif
+			//mmi_showLcd(appInfoItem->lcdinfo);
+			if(1 == g_mmi_at_lcd_flag)
+			{
+				return;
+			}
+			mmi_invalidateLcd(taskInfoItem->taskinfo);
+		}
+	}
+}
+//MMIÖ÷¿Ø
+static VOID *mmi_mainControllerEntry(VOID *arg)
+{
+	UINT32 i = 0;
+	int ret = 0;
+
+#ifdef MMI_DEBUG_MAINCONTROL
+	g_mmi_MainContrl = 1;
+#endif
+
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		while ((ret = mmi_GetSemaphore(&g_mmi_init_sem_id, MMI_WAIT_FOREVER)) != MMI_SUCCESS) {
+			slog(MMI_PRINT, SLOG_DEBUG, "zte_mmi g_mmi_update_sem_id get failed ret = %d,errno=%d\n", ret, errno);
+			continue;
+		}
+		mmi_DeleteSemaphore(&g_mmi_init_sem_id);
+	}
+#endif
+
+	while (1) {
+		if ((ret = mmi_GetSemaphore(&g_mmi_update_sem_id, MMI_WAIT_FOREVER)) != MMI_SUCCESS) {//kw 3
+			slog(MMI_PRINT, SLOG_DEBUG, "zte_mmi mmi_mainControllerEntry failed ret = %d,errno=%d\n", ret, errno);
+			continue;
+		}
+		for (i = 0; i < sizeof(g_zMMITaskInfoTab) / sizeof(T_zMMITaskInfoItem); ++ i) { //warning539
+#ifdef MMI_DEBUG_MAINCONTROL
+			g_mmi_MainContrlIndex = i;
+#endif
+			if (mmi_get_update_flag(g_zMMITaskInfoTab[i].task)  == 1) { //ÓиüÐÂ
+				if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) { //led
+					mmi_show_led_item(&(g_zMMITaskInfoTab[i]));
+				}
+#ifndef DISABLE_LCD
+				if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) { //lcd
+					mmi_show_lcd_item(&(g_zMMITaskInfoTab[i]));
+				}
+#endif
+			}
+		}
+#ifdef MMI_DEBUG_MAINCONTROL
+		g_mmi_MainContrlIndex = -1;
+		g_mmi_MainContrlProcess = -1;//0, get content;1 gelceinfo; 2 show
+#endif
+	}
+}
+
+
+//×¢²áMMIÒµÎñÐÅÏ¢
+VOID mmi_register_taskinfo_item(T_zMMITaskInfoItem* taskInfoItem)
+{
+	if (taskInfoItem != NULL) {
+		E_zMmi_Task task = taskInfoItem->task;//ÒµÎñ
+		g_zMMITaskInfoTab[task].task = taskInfoItem->task;
+		mmi_getMutex(&g_mmi_update_flag_mutex); //cov m
+		g_zMMITaskInfoTab[task].is_update = taskInfoItem->is_update;
+		mmi_putMutex(&g_mmi_update_flag_mutex);
+		//g_zMMIFrameInfoTab[appInfoItem->flag].show_mode= appInfoItem->show_mode;
+		g_zMMITaskInfoTab[task].taskinfo = taskInfoItem->taskinfo;
+		g_zMMITaskInfoTab[task].ledinfo = taskInfoItem->ledinfo;
+		g_zMMITaskInfoTab[task].get_taskinfo_fun = taskInfoItem->get_taskinfo_fun;
+		g_zMMITaskInfoTab[task].get_ledinfo_fun = taskInfoItem->get_ledinfo_fun;
+		g_zMMITaskInfoTab[task].get_lcdinfo_fun = taskInfoItem->get_lcdinfo_fun;
+	}
+}
+
+/********************************************************************************
+  MMI LOG´æÈëÎļþ
+**********************************************************************************/
+static char * mmi_get_time(void)
+{
+	time_t timep;
+	struct tm *p;
+	static char buf[22];
+	memset(buf, 0, 22);
+	time(&timep);
+	p = (struct tm *)localtime(&timep);
+	if (NULL == p) {
+		return NULL;
+	}
+	snprintf(buf, 21, "%4d/%02d/%02d %02d:%02d:%02d ", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
+	return buf;
+}
+
+void mmi_log_save(const char *fmt, ...)
+{
+	time_t timep;
+	struct tm p = {0};
+	va_list ap;
+	FILE *fp = NULL;
+	struct stat statbuff;
+
+	time(&timep);
+	localtime_r(&timep, &p);
+#if MMI_SERIAL_DEBUG
+	//printf("%4d/%02d/%02d %02d:%02d:%02d ",1900 + p.tm_year,1 + p.tm_mon,p.tm_mday,p.tm_hour,p.tm_min,p.tm_sec);
+	va_start(ap, fmt);
+	vprintf(fmt, ap);
+	va_end(ap);
+#endif
+
+#if MMI_FILE_DEBUG
+	fp = fopen(MMI_LOG_FILE_PATH, "a+");
+
+	if (fp) {
+		fprintf(fp, "%4d/%02d/%02d %02d:%02d:%02d ", 1900 + p.tm_year, 1 + p.tm_mon, p.tm_mday, p.tm_hour, p.tm_min, p.tm_sec);
+		va_start(ap, fmt);
+		vfprintf(fp, fmt, ap);
+		va_end(ap);
+		fclose(fp);
+		if (stat(MMI_LOG_FILE_PATH, &statbuff) == 0) {
+			if (statbuff.st_size >= MMI_MAX_LOG_LENGTH) {
+				remove(MMI_LOG_OLD_FILE_PATH);
+				rename(MMI_LOG_FILE_PATH, MMI_LOG_OLD_FILE_PATH);
+			}
+		}
+	}
+#endif
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí·¢¸øMMI½ø³ÌµÄÏûÏ¢
+***********************************************************************************/
+//zdm ½«mmiÄܹ»´¦ÀíµÄËùÓÐÏûÏ¢¾ù½øÐд¦Àí£¬º¯ÊýÄÚ²¿Í¨¹ýnvÀ´¾ö¶¨ÊÇ·ñÕæÕý½øÐд¦Àí
+//Èç¹ûµ±Ç°»·¾³ÎÞ·¨´¦Àí¸ÃÏûÏ¢£¬Ö±½Ó·µ»Ø¼´¿É
+static int mmi_ProcMsg(MSG_BUF *pstMsg)
+{
+	int i = 0;
+	if (NULL == pstMsg) {
+		return -1;
+	}
+	//kw 3, kw bug???
+	//if ((pstMsg->usMsgCmd != MSG_CMD_MMICHECK_TIP_INFO) && (pstMsg->usMsgCmd != MSG_CMD_MMIGET_WIFI_DATA)) {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI Mmi_ProcMsg msg:src_id = 0x%04x,lMsgType = %d,usMsgCmd = 0x%08x,usDataLen = %d,data = %s\n", pstMsg->src_id, pstMsg->lMsgType, pstMsg->usMsgCmd, pstMsg->usDataLen, pstMsg->aucDataBuf);
+	//}
+	switch (pstMsg->usMsgCmd) {
+	case MSG_CMD_CHANNEL_NETWORK_MODE:
+		zMMI_Handle_Msg_Network_Mode((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MULTI_CONNECT_STATUS:
+		zMMI_Handle_Msg_MultiConnect_Status((VOID *)pstMsg->aucDataBuf, pstMsg->src_id);
+		break;
+	case MSG_CMD_CHANNEL_CONNECT_STATUS:
+		zMMI_Handle_Msg_Connect_Status((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_OUT_REG_GET_SIGNAL_NUM:
+		zMMI_Handle_Msg_Signal_Num((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_SMS_STATUS_INFO_IND:
+		zMMI_Handle_Msg_SmsBox_Sattus((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_VOIP_STATUS_INFO:
+		zMMI_Handle_Msg_Voip_Status((VOID *)pstMsg->aucDataBuf);
+		break; //cov m
+	case MSG_CMD_RJ11_STATUS_INFO:
+		zMMI_Handle_Msg_Rj11_Status((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_RJ45_STATUS_INFO:
+		zMMI_Handle_Msg_Rj45_Status((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MODIFY_SSID_KEY:
+		zMMI_Handle_Msg_Get_SSID_Key((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMIGET_WIFI_STANUM:
+	case MSG_CMD_STA_COUNT_CHANGE:
+		zMMI_Handle_Msg_Get_Wifi_StaNum((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMISTART_BACKLIGHTOFF_TIMER:
+		zMMI_Handle_Msg_BacklightOff((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_RESET_NOTIFY:
+		g_mmi_at_lcd_flag = 0;
+		zMMI_Handle_Msg_Factory_Reset((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_POWEROFF_NOTIFY:
+		g_mmi_at_lcd_flag = 0;
+		zMMI_Handle_Msg_Poweroff((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_RESTART_NOTIFY:
+		g_mmi_at_lcd_flag = 0;
+		zMMI_Handle_Msg_Restart((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_GET_NET_PROVIDER:
+		zMMI_Handle_Msg_Get_Provider((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_GET_TRAFFIC_INFO_START:
+		zMMI_Handle_Msg_Get_TafficInfo_Start((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_GET_TRAFFIC_INFO_END:
+		zMMI_Handle_Msg_Get_TafficInfo_End((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_TRAFFIC_INFO_RESET:
+		zMMI_Handle_Msg_TafficInfo_Reset((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMICHECK_TIP_INFO:
+		zMMI_Handle_Msg_Check_Tip_Info((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMISHOW_SSID_INFO:
+		zMMI_Handle_Msg_SSID_Show_Info((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_MMIGET_WIFI_DATA:
+		zMMI_Handle_Msg_Get_Wifi_Data((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_POWEROFF_RSP:
+		zMMI_Handle_Msg_Plugout((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_SIM_ABNORMAL_IND:
+		zMMI_Handle_Msg_Simcard_Info((VOID *)pstMsg->aucDataBuf);
+		break;
+	case MSG_CMD_SOCKET_STATE_CHANGE:
+		zMMI_Handle_Msg_Socket_Status((VOID *)pstMsg->aucDataBuf, pstMsg->src_id);
+		break;
+	case MSG_CMD_MCUSOCKET_STATE_CHANGE:
+		zMMI_Handle_Msg_MCUSocket_Status((VOID *)pstMsg->aucDataBuf);
+		break;
+#if 0
+	case MSG_CMD_AUTOTEST_KEY_REQ:
+		if (g_mmi_power_mode == 1)
+			zMMI_Handle_Msg_Atest_Key((VOID *)pstMsg->aucDataBuf);
+		else
+			zMMI_Handle_Msg_Atest_Chg((VOID *)pstMsg->aucDataBuf);
+		break;
+#endif
+	}
+	return 0;
+#if 0
+	for (i = 0; i < (SINT32)(sizeof(scmp_info) / sizeof(scmp_info[0])); i++) {
+		if (pstMsg->usMsgCmd == scmp_info[i].id) {
+			if (scmp_info[i].func_ptr != NULL) {
+				scmp_info[i].func_ptr((VOID *)pstMsg->aucDataBuf);
+			}
+			return 0;
+		}
+	}
+#endif
+
+	return 0;
+}
+
+
+static void *mmi_handleMsgEntry(void *arg)
+{
+	long MsgType = 0;
+	MSG_BUF MmiMsg;
+	prctl(PR_SET_NAME, "mmihandlemsg", 0, 0, 0);
+	while (1) {
+		memset((VOID *)(&MmiMsg), 0, sizeof(MSG_BUF));//warning516
+		if (-1 != mmi_RecvMsgFromQueue(g_mmi_msgQue_Id, &MmiMsg, MsgType)) {
+			mmi_ProcMsg(&MmiMsg);
+		}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¿ª»úʱÆÁ»òµÆµÄ¶¯×÷
+		 LCD ÏÔʾ¿ª»ú¶¯»­
+		 LED Á÷Á¿µÆÏÈÈ«²¿Ï¨Ãð ÆäÓàËĸöµÆÍ¬Ê±ÉÁһϠÔÙ¸ù¾Ýʵ¼Ê״̬ÁÁÆð
+***********************************************************************************/
+static VOID mmi_set_poweron_show(VOID)
+{
+	mmi_set_led_mode(MMI_POWERON_MODE);
+	mmi_set_update_flag(MMI_TASK_CTRL);//¿ª»úģʽ ÏÔʾ¿ª»ú¶¯»­
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:mmi ÒµÎñ×¢²á
+***********************************************************************************/
+
+//zdm ʹÓÃnv¿ØÖÆÒµÎñµÄ×¢²áºÍ³õʼ»¯£¬ÔÝʱµÄʵÏÖÊǶÔÓÚ¿ª»úÉϵçµÄÿ¸öÒµÎñ£¬¾ùÌṩһ¸önv¿ØÖÆ
+//ºóÆÚÒª¸ù¾ÝÐèÇó£¬ÌáÈ¡³ö±ØÐëʹÓõÄnv¿ØÖÆÏ¶ÔÓÚÈκÎÇé¿öÏ£¬¾ùÐèÒªµÄÒµÎñ£¬Ö±½Ó×¢²á¾Í¿ÉÒÔ
+//²»ÔÙʹÓÃnv¿ØÖÆ£¬±ÈÈçMMI_TASK_CTRL£¬°´ÕÕÀí½âÓ¦¸ÃËùÓеij¡¾°Ï¾ùÐèҪע²áºÍ³õʼ»¯
+
+
+static int mmi_task_register()
+{
+	UINT32 i = 0;
+	char *nv_task_tab[NV_CONTENT_LEN] = {0};
+
+	//zdm ÔÚ×¢²áºÍ³õʼ»¯ÒµÎñ֮ǰ£¬ÏȽ«ÒµÎñĿ¼ÖеÄÿ¸öÒµÎñÏîÖÃΪÎÞЧ
+	for (i = 0; i < sizeof(g_zMMITaskInfoTab) / sizeof(T_zMMITaskInfoItem); ++ i) {
+		g_zMMITaskInfoTab[i].task = MMI_TASK_INVALID;
+	}
+
+	//Èç¹ûÓÐÓëled/lcd¾ùÐèҪʹÓõÄÒµÎñ£¬ÔÚÕâÀïÍê³É×¢²á£¬×¢²áºÍ³õʼ»¯º¯ÊýÄÚ²¿½øÐÐÇø·ÖlcdºÍled
+
+	cfg_get_item("mmi_task_tab", nv_task_tab, sizeof(nv_task_tab));
+
+	if (strstr(nv_task_tab, "net_task")) {
+		mmi_RegisterNetTaskInfoItem();
+	}
+
+	//Ó²¼þÏÞÖÆ£¬Á½¸öÒµÎñ¸´ÓÃͬһ¸öÓ²¼þµÆ,Òò´ËnvʹÓÃsmsºÍvoice½øÐÐÇø·Ö
+
+	if (strstr(nv_task_tab, "sms_task") && strstr(nv_task_tab, "voice_task")) {
+		assert(0);
+	}
+
+	if (strstr(nv_task_tab, "sms_task")) {
+		mmi_RegisterSmsTaskInfoItem();
+		g_smstask_enable = 1;
+	} else if (strstr(nv_task_tab, "voice_task")) {
+		mmi_RegisterVoipTaskInfoItem();
+		g_voicetask_enable = 1;
+	}
+
+	//ÊÇ·ñÓÐµç³ØÌõ¼þ¿ØÖÆ
+	if (strstr(nv_task_tab, "battery_task")) {
+		mmi_RegisterBatteryTaskInfoItem();
+
+	}
+
+	if (strstr(nv_task_tab, "ctrl_task")) {
+		mmi_RegisterCtrlTaskInfoItem();
+	}
+
+
+	if (strstr(nv_task_tab, "wifi_task")) {
+		mmi_RegisterWifiTaskInfoItem();
+	}
+
+
+	if (strstr(nv_task_tab, "traffic_task")) {
+		mmi_RegisterTrafficTaskInfoItem();
+	}
+
+	if (strstr(nv_task_tab, "rj45_task")) {
+		mmi_RegisterRj45TaskInfoItem();
+	}
+
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		//×¢²áÓëledÏà¹ØµÄÒµÎñ £¬ÇëÎâºìʵÏÖ
+		if (strstr(nv_task_tab, "netsignal_task")) {
+			mmi_RegisterNetSigTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "ledwps_task")) {
+			mmi_RegisterWpsTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "rj11_task")) {
+			mmi_RegisterRj11TaskInfoItem();
+		}
+	}
+
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		//×¢²áÓëlcdÏà¹ØµÄÒµÎñ£¬ÇëÎâºìʵÏÖ
+		if (strstr(nv_task_tab, "tip_task")) {
+			mmi_RegisterTipTaskInfoItem();
+		}
+		//Ó²¼þÓеçÁ¿¼ÆµÄÌõ¼þÏ£¬²ÅÄÜ´ò¿ª
+
+		if (strstr(nv_task_tab, "power_task")) {
+			mmi_RegisterPowerTaskInfoItem();
+		}
+		//Ö§³ÖwifiµÄÇé¿öϲÅÄÜÖ§³Ö
+		if (strstr(nv_task_tab, "ssid_task")) {
+			mmi_RegisterSSIDInfoTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "wificode_task")) {
+			mmi_RegisterWifiCodeTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "tipnetconnect_task")) {
+			mmi_RegisterTipNetConnectTaskInfoItem();
+		}
+
+		if (strstr(nv_task_tab, "tipwps_task")) {
+			mmi_RegisterTipWpsTaskInfoItem();
+		}
+		if (strstr(nv_task_tab, "tipfota_task")) {
+			mmi_RegisterTipFotaTaskInfoItem();
+
+		}
+		if (strstr(nv_task_tab, "tipwifistation_task")) {
+			mmi_RegisterTipWifiStationConnectTaskInfoItem();
+		}
+
+		if (strstr(nv_task_tab, "version_logo_task")) {
+			mmi_RegisterTipFirmwareVersionTaskInfoItem();
+			mmi_RegisterTipTextConnectTaskInfoItem();
+			//mmi_RegisterLogoTaskInfoItem();
+		}
+	}
+#endif
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:mmi ÒµÎñ³õʼ»¯
+***********************************************************************************/
+
+//¶ÔÓÚÓÐÐèÇó¿ØÖƵÄijЩҵÎñ£¬ÌáÈ¡³Énv¿ØÖÆ£¬¸ù¾ÝÐèÇó½øÐдò¿ªºÍ¹Ø±ÕÅäÖÃ
+static int mmi_task_init()
+{
+	char *nv_task_tab[NV_CONTENT_LEN] = {0};
+
+
+	//Èç¹ûÓÐÓëled/lcd¾ùÐèҪʹÓõÄÒµÎñ£¬ÔÚÕâÀïÍê³É³õʼ»¯
+
+	cfg_get_item("mmi_task_tab", nv_task_tab, sizeof(nv_task_tab));
+
+
+	if (strstr(nv_task_tab, "net_task")) {
+		mmi_net_init();
+	}
+
+	//Ó²¼þÏÞÖÆ£¬Á½¸öÒµÎñ¸´ÓÃͬһ¸öÓ²¼þµÆ,Òò´ËnvʹÓÃsmsºÍvoice½øÐÐÇø·Ö
+	if (strstr(nv_task_tab, "sms_task")) {
+		mmi_sms_init();
+
+	} else if (strstr(nv_task_tab, "voice_task")) {
+		mmi_voip_init();
+
+	}
+
+	//ÊÇ·ñÓÐµç³ØÌõ¼þ¿ØÖÆ
+	if (strstr(nv_task_tab, "battery_task")) {
+		mmi_battery_init();
+
+	}
+
+	if (strstr(nv_task_tab, "ctrl_task")) {
+		mmi_init_idle_control();
+	}
+
+	if (strstr(nv_task_tab, "wifi_task")) {
+		mmi_wifi_init();
+	}
+
+	if (strstr(nv_task_tab, "traffic_task")) {
+		mmi_traffic_init();
+	}
+
+	if (strstr(nv_task_tab, "key_task")) {
+		mmi_keyStrokes_init();
+	}
+
+	if (strstr(nv_task_tab, "rj45_task")) {
+		mmi_rj45_init();
+	}
+	//³õʼ»¯½öÓëledÏà¹ØµÄÒµÎñ £¬ÇëÎâºìʵÏÖ
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+	}
+
+#ifndef DISABLE_LCD
+	//³õʼ»¯½öÓëlcdÏà¹ØµÄÒµÎñ£¬ÇëÎâºìʵÏÖ
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		if (strstr(nv_task_tab, "tip_task")) {
+			mmi_init_lcd_tip();
+		}
+	}
+#endif
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:mmi ÏÔʾģʽ³õʼ»¯
+***********************************************************************************/
+static int mmi_showmode_init()
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_showmode_init \n");
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		mmi_initLed();
+	}
+
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_FIRST);
+		mmi_initLcd(FALSE);
+	}
+#endif
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMIÈë¿Úº¯Êý  ´´½¨ÏûÏ¢¶ÓÁÐ ¸÷¸öµÆ³õʼ»¯ ½ÓÊÕÏûÏ¢
+***********************************************************************************/
+VOID mmi_powerOnLcdEntry()
+{
+	pthread_t mmi_handlemsg_thread;
+	//´´½¨MMIÏûÏ¢¶ÓÁÐ
+	if ((g_mmi_msgQue_Id = mmi_create_msg_queue()) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI create g_mmi_msgQue_Id failed!!!\n");
+		MMI_ASSERT(0);
+	}
+	pthread_mutex_init(&g_mmi_lcdmode_mutex, NULL);
+	pthread_mutex_init(&g_mmi_ledmode_mutex, NULL);
+	pthread_mutex_init(&g_mmi_update_flag_mutex, NULL);
+	pthread_mutex_init(&g_mmi_refresh_lcd_mutex, NULL);
+	sem_init(&g_mmi_update_sem_id, 0, 0);
+	sem_init(&g_mmi_init_sem_id, 0, 0);
+	sem_init(&g_mmi_traffic_warn_sem_id, 0, 0);
+	sem_init(&g_mmi_poweroff_sem_id, 0, 0); //ÓÃÓڹػúʱ±£Ö¤LCDÆÁ²¥Íê¹Ø»ú¶¯»­ºóÃðÆ½»òLEDµÆ¶¼ÁÁÖ®ºóÔÙÃðµÆ
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI start set_mmi_active\n");
+	set_wake_lock(MMI_MAIN_LOCK_ID);
+
+	//´´½¨MMI ´¦ÀíÏûÏ¢Ïß³Ì
+	if (pthread_create(&mmi_handlemsg_thread, NULL, &mmi_handleMsgEntry, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI pthread_create handle msg error\n");
+		return ;
+	}
+	mmi_showmode_init();
+
+	mmi_task_register();
+	mmi_task_init();
+
+	mmi_set_poweron_show();
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI main Register finish!!\n");
+
+	//´´½¨MMIÖ÷¿ØÏß³Ì
+	mmi_mainControllerEntry(NULL);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¹Ø»ú³äµç
+***********************************************************************************/
+VOID mmi_poweroffcharger_init()
+{
+
+	UINT32 i = 0;
+	pthread_t mmi_handlemsg_thread;
+	//´´½¨MMIÏûÏ¢¶ÓÁÐ
+	if ((g_mmi_msgQue_Id = mmi_create_msg_queue()) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI create g_mmi_msgQue_Id failed!!!\n");
+		MMI_ASSERT(0);
+	}
+
+	pthread_t mmi_offchg_mainctrl_thread;
+	pthread_mutex_init(&g_mmi_update_flag_mutex, NULL);
+	pthread_mutex_init(&g_mmi_poweron_mutex, NULL);
+	sem_init(&g_mmi_update_sem_id, 0, 0);
+	sem_init(&g_mmi_init_sem_id, 0, 0);
+
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		sem_init(&g_mmi_gui_init_sem_id, 0, 0);
+	}
+#endif
+
+	//´´½¨MMI ´¦ÀíÏûÏ¢Ïß³Ì
+	if (pthread_create(&mmi_handlemsg_thread, NULL, &mmi_handleMsgEntry, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI pthread_create handle msg error\n");
+		return ;
+	}
+
+	for (i = 0; i < sizeof(g_zMMITaskInfoTab) / sizeof(T_zMMITaskInfoItem); ++ i) {
+		g_zMMITaskInfoTab[i].task = MMI_TASK_INVALID;
+	}
+
+	offchg_RegisterPocTaskInfoItem();
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		mmi_initLed();
+	}
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_initLcd(TRUE);
+	}
+#endif
+
+	int res = pthread_create(&mmi_offchg_mainctrl_thread, NULL, &mmi_mainControllerEntry, NULL);
+	if (res != 0) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI pthread_create main control error\n");
+		assert(0);
+	}
+}
+
+static int get_nv()
+{
+	char mmi_nv_value[NV_CONTENT_LEN] = {0};
+	SINT32 ret_fd = -1;
+	int state = 0;
+
+	//ÉèÖÃmmiÏÔʾģʽȫ¾Ö±äÁ¿
+	cfg_get_item("mmi_showmode", mmi_nv_value, sizeof(mmi_nv_value));
+	if (0 == strcmp(mmi_nv_value, "led")) {
+		g_showMode = MMI_MODE_LED;
+		ret_fd = open(LCD_PATH, O_RDWR);
+		if (ret_fd == -1) 
+		{
+			slog(MMI_PRINT, SLOG_ERR,"ZTE_MMI mmi_file_operate open file fail: %s!\n", LCD_PATH);
+		}
+		else
+		{
+			if(ioctl(ret_fd, LEADT15DS26_SET_BACKLIGHT, &state) < 0)
+			{
+				slog(MMI_PRINT, SLOG_ERR,"get_nv ioctl fail!\n");
+			}
+		}
+	} else if (0 == strcmp(mmi_nv_value, "lcd")) {
+		g_showMode = MMI_MODE_LCD;
+	} else if (0 == strcmp(mmi_nv_value, "all")) {
+		g_showMode = MMI_MODE_ALL;
+	} else {
+		assert(0);
+	}
+
+	cfg_get_item("customer_type",mmi_nv_value,sizeof(mmi_nv_value));
+	if(0 == strcmp(mmi_nv_value, "sdk_min"))
+	{
+		g_customer_type = CUSTOMER_SDK_MIN;
+	}
+	else if(0 == strcmp(mmi_nv_value, "guodian"))
+	{
+		g_customer_type = CUSTOMER_GUODIAN;
+	}
+	else if(0 == strcmp(mmi_nv_value, "nandian"))
+	{
+		g_customer_type = CUSTOMER_NANDIAN;
+	}
+
+	cfg_get_item("mmi_use_protect", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (strstr(mmi_nv_value, "discharge_protect")) {
+		g_discharge_protect = 1;
+	}
+
+	if (strstr(mmi_nv_value, "temp_protect")) {
+		g_temp_protect = 1;
+
+		if (strstr(mmi_nv_value, "charge_protect")) {
+			g_charge_protect = 1;
+		}
+	}
+
+	cfg_get_item("mmi_fast_poweron", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (0 == strcmp(mmi_nv_value, "1")) {
+		g_fast_poweron = 1;
+
+	}
+
+	cfg_get_item("mmi_led_mode", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (strstr(mmi_nv_value, "standby_mode")) {
+		g_led_standby_mode = 1;
+
+	}
+
+	if (strstr(mmi_nv_value, "sleep_mode")) {
+		g_led_sleep_mode = 1;
+	}
+
+
+	cfg_get_item("mmi_use_wifi_usernum", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (0 == strcmp(mmi_nv_value, "1")) {
+		g_use_wifi_usernum = 1;
+	}
+
+	cfg_get_item("mmi_show_pagetab", mmi_nv_value, sizeof(mmi_nv_value));
+
+	if (strstr(mmi_nv_value, "page1")) {
+		g_show_pagefirst = 1;
+	}
+	if (strstr(mmi_nv_value, "page2")) {
+		g_show_pagesecond = 1;
+	}
+	if (strstr(mmi_nv_value, "page3")) {
+		g_show_pagethird = 1;
+	}
+	/*
+	cfg_get_item("mmi_temp_voltage_line", mmi_nv_value, sizeof(mmi_nv_value));
+	{
+		char *tmp = NULL;
+		char *substr = strtok_r(mmi_nv_value, "+",&tmp);
+		int temp[4] = {0};
+		int i = 0;
+		while (substr != NULL) {
+			temp[i] = atoi(substr);
+			i++;
+			substr = strtok_r(NULL, "+",&tmp);
+		}
+		g_mmi_superhightempvol = temp[0];
+		g_mmi_hightempvol = temp[1];
+		g_mmi_lowtempvol = temp[2];
+		g_mmi_superlowtempvol = temp[3];
+	}
+	*/
+	cfg_get_item("mmi_battery_voltage_line", mmi_nv_value, sizeof(mmi_nv_value));
+	{
+		char *tmp = NULL;
+		char *substr = strtok_r(mmi_nv_value, "+",&tmp);
+		int i = 0;
+		while (substr != NULL) {
+			g_mmi_batvoltageline[i] = atoi(substr);
+			slog(MMI_PRINT, SLOG_DEBUG, "g_mmi_batvoltageline[%d] = %d\n", i, g_mmi_batvoltageline[i]);
+			i++;
+			substr = strtok_r(NULL, "+",&tmp);
+		}
+	}
+	if(ret_fd >= 0)
+	close(ret_fd);
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMIÈë¿Úº¯Êý  ´´½¨ÏûÏ¢¶ÓÁÐ ¸÷¸öµÆ³õʼ»¯ ½ÓÊÕÏûÏ¢
+***********************************************************************************/
+int zte_mmi_main(int argc, char * argv[])
+{
+	prctl(PR_SET_NAME, "mmi", 0, 0, 0);
+	//¸ù¾ÝNV³õʼ»¯´òÓ¡¼¶±ð£¬²¢×¢²á¶¯Ì¬µ÷Õû´òÓ¡¼¶±ðÐźÅÁ¿
+	loglevel_init();
+
+	//zdm½«nvÉèÖÃת»»³ÉÈ«¾Ö±äÁ¿½øÐй¦ÄÜ¿ØÖÆ
+	get_nv();
+	mmi_BatLedOffOpt();//¹ØbootµãµÄµÆ
+	mmi_BatLedGreenOn();// R306 ÐèÇó :µçÔ´µÆÎªÂÌµÆ 
+#ifdef DISABLE_LCD
+	if (g_showMode != MMI_MODE_LED) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI MIN only support LED \n");
+		return -1;
+	}
+#endif
+
+	if (argc >= 2) {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI ###POWER OFF CHARGER START####\n");
+		g_mmi_power_mode = 0;
+		zMmi_PowerOffChargerEntry();
+	} else {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI ######START######\n");
+		g_mmi_power_mode = 1;
+		mmi_powerOnLcdEntry();
+	}
+	return 0;
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_battery.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_battery.c
new file mode 100755
index 0000000..a9d1842
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_battery.c
@@ -0,0 +1,687 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_batterry.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡³äµçºÍµç³ØÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+
+/************************************************************************************
+                           Í·Îļþ
+***********************************************************************************/
+#include "mmi_lcd.h"
+#include <linux/netlink.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <mmi_common.h>
+#include "hotplug.h"
+
+
+/************************************************************************************
+                            È«¾Ö±äÁ¿¶¨Òå
+***********************************************************************************/
+
+static volatile UINT32 s_mmi_poweroff_voltage_num = 0;//¶Áµ½µÍµç¹Ø»úµçѹµÄ´ÎÊý£¬Á¬ÐøÈý´Î×Ô¶¯¹Ø»ú
+static volatile SINT32 g_mmi_voltageEx = 0;//ÿ20s²éѯµçѹʱ£¬±£´æÉÏÒ»´ÎµÄµçѹ
+static volatile E_zMmi_Charge_State s_mmi_charge_state = STATE_CHARGE_MAX; //ÿ´ÎÊÕµ½Çý¶¯Éϱ¨Ê±£¬±£´æµ±Ç°µÄ³äµç״̬
+static volatile E_zMmi_Charge_State s_mmi_charge_stateEx = STATE_CHARGE_MAX;//ÿ´ÎÊÕµ½Çý¶¯Éϱ¨Ê±£¬±£´æÉÏÒ»´ÎµÄ³äµç״̬
+static volatile E_zMmi_Voltage_level s_mmi_voltage_level = VOLT_MAX;//²éѯµçѹʱ£¬¸ù¾Ýµçѹֵ±£´æµ±Ç°µçÁ¿·¶Î§
+
+static volatile BOOL g_mmi_chg_switch_off = FALSE;//¼Ç¼³äµç¹Ø±Õ¿ª¹Ø£¬Ä¬ÈÏÔÊÐí³äµç
+static volatile BOOL s_mmi_usb_insert_status = FALSE;//0:USB²åÈë״̬ 1:USB δ²åÈë״̬
+static volatile SINT32 s_mmi_battery_pers = 0;//µçÁ¿°Ù·Ö±ÈÇø¼ä
+
+static MMI_TEMP_DETECT last_temp = MMI_TEMP_DETECT_MAX;//µç³ØÉÏÒ»´ÎζÈ״̬
+static SINT32 s_mmi_temp_count = 0;//ζÈÒ쳣ʱ¼ÆÊýÆ÷£¬Á¬Ðø3´Îºó½øÐÐÏàÓ¦´¦Àí
+
+
+extern E_zMmiShowMode g_showMode;
+extern UINT32 g_temp_protect;
+extern UINT32 g_discharge_protect;
+extern UINT32 g_charge_protect;
+extern UINT32 g_fast_poweron;
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µç³ØÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_batteryinfo(UINT32 batteryinfo)
+{
+	if (batteryinfo != 0) {
+		T_zMMIBatteryInfo * pBatInfo = (T_zMMIBatteryInfo *)batteryinfo;
+		pBatInfo->chg_state = s_mmi_charge_state;
+		pBatInfo->bat_level = s_mmi_voltage_level;
+		pBatInfo->bat_pers = s_mmi_battery_pers;
+		pBatInfo->bat_grid = pBatInfo->bat_pers <= 5 ? 0 : (pBatInfo->bat_pers <= 20 ? 1 : (pBatInfo->bat_pers <= 50 ? 2 : (pBatInfo->bat_pers <= 85 ? 3 : 4))); /*ÐèÇóÒªÇó<=5ÏÔʾºì¿ò0¸ñ,<=25ÏÔʾ1¸ñ*/
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterBatteryTaskInfoItem()
+{
+	T_zMMITaskInfoItem batteryTaskInfoItem = {0};
+
+	batteryTaskInfoItem.task = MMI_TASK_BATTERY;
+	batteryTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIBatteryInfo));
+	batteryTaskInfoItem.get_taskinfo_fun = mmi_get_batteryinfo;
+	batteryTaskInfoItem.get_ledinfo_fun = mmi_getLedBatteryInfo;
+#ifndef DISABLE_LCD
+	batteryTaskInfoItem.get_lcdinfo_fun = mmi_getLcdBatteryInfo;
+#endif
+	batteryTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//batteryAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&batteryTaskInfoItem);
+	return MMI_SUCCESS;
+}
+SINT32 mmi_RegisterPowerTaskInfoItem()
+{
+	T_zMMITaskInfoItem batteryTaskInfoItem = {0};
+	batteryTaskInfoItem.task = MMI_TASK_POWER;
+	batteryTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIBatteryInfo));
+	batteryTaskInfoItem.get_taskinfo_fun = mmi_get_batteryinfo;
+	batteryTaskInfoItem.get_ledinfo_fun = mmi_getLedBatteryInfo;
+#ifndef DISABLE_LCD
+	batteryTaskInfoItem.get_lcdinfo_fun = mmi_getLcdPowerInfo;
+#endif
+	batteryTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	//batteryAppInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&batteryTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_battery_update(VOID)
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+	}
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		if (mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+			mmi_set_update_flag(MMI_TASK_BATTERY);
+		}
+	}
+}
+VOID mmi_set_discharge_low_current(BOOL discharge_low_current_flag)
+{
+	if (discharge_low_current_flag) {
+		system(MMI_DISCHG_LOW_CURRENT);
+	} else {
+		system(MMI_DISCHG_HIGH_CURRENT);
+	}
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:¸æÖªcharger½øÈë¼Ù¹Ø»úģʽ
+***********************************************************************************/
+VOID mmi_set_fake_poweroff_charger(int fake_poweroff_flag)
+{
+	if (fake_poweroff_flag == 1) {
+		system(MMI_SET_FAKEPOWEROFF_CHARGER);
+	} else {
+		system(MMI_CAN_FAKEPOWEROFF_CHARGER);
+	}
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:µÍµç¹Ø»ú´¦Àí
+***********************************************************************************/
+static void mmi_lowbattery_shutdown(UINT32 voltagepower)
+{
+	FILE *fp;
+	char buff[16];
+	int ret;
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_lowbattery_shutdown %d %d\n", s_mmi_poweroff_voltage_num, voltagepower);
+	if (voltagepower < POWEROFFLEVEL && s_mmi_charge_state != STATE_CHARGING) {
+		s_mmi_poweroff_voltage_num ++ ;
+		if (s_mmi_poweroff_voltage_num >= 3) {
+			s_mmi_poweroff_voltage_num = 0;
+			fp = fopen("/sys/class/power_supply/boost/boost_enabled", "r");
+			buff[0] = '\0';
+			if (fp != NULL && (ret=fread(buff, 1, 16, fp)) > 0 && buff[0] == '1')
+			{
+				fclose(fp);
+				buff[ret]='\0';
+				slog(MMI_PRINT, SLOG_NORMAL, "enable flag %s\n", buff);
+				system(MMI_TURN_OFF_DISCHG);
+				if (0 == ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_WIFI, MSG_CMD_WIFI_ADVANCED, 2, "0", 0))
+				{
+					slog(MMI_PRINT, SLOG_NORMAL, "suspend,lowerbattery!!!\n");
+					get_modem_info("AT+CFUN=0\r", NULL,  NULL);
+					system("echo mmi_main_lock > /sys/power/wake_unlock");
+					system("echo ufiwakelock > /sys/power/wake_unlock");
+					system("echo mem > /sys/power/autosleep");
+					return;
+				}
+				return;
+			}
+			if (fp != NULL)
+				fclose(fp);
+			mmi_set_abnormal_poweroff_flag();
+
+			slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI poweroff,lowerbattery!!!\n");
+			mmi_set_poweroff();
+		}
+	} else {
+		s_mmi_poweroff_voltage_num = 0;
+	}
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:¸ù¾Ýµç³ØµçѹÉèÖÃµç³Ø°Ù·Ö±È¡¢webUI¶ÔÓ¦µç³Ø¸ñ
+Êý¡¢µç³Ø×´Ì¬(5%,10%,20%,25%,normal)
+***********************************************************************************/
+static VOID mmi_battery_capacity_compare(SINT32 voltagepower)
+{
+	int cur_power = 0;
+	int bat_level = 0;
+	if (g_mmi_voltageEx != 0 && s_mmi_charge_state == STATE_CHARGING) {
+		cur_power = voltagepower > g_mmi_voltageEx ? voltagepower : g_mmi_voltageEx;
+	} else if (g_mmi_voltageEx != 0) {
+		cur_power = voltagepower < g_mmi_voltageEx ? voltagepower : g_mmi_voltageEx;
+	} else {
+		cur_power = voltagepower;
+	}
+
+	if (g_discharge_protect) {
+		mmi_lowbattery_discharge_protect(voltagepower);
+	}
+	mmi_lowbattery_shutdown(voltagepower);
+	g_mmi_voltageEx = cur_power;
+	bat_level = get_voltage_level_from_table(cur_power);
+	mmi_set_webUI_batterypers(bat_level);
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_battery_capacity_compare voltagepower = %d !! cur_power = %d  !! bat_level = %d\n ", voltagepower, cur_power, bat_level);
+	s_mmi_battery_pers = bat_level;
+	s_mmi_voltage_level = mmi_set_battery_state(bat_level);
+	//if (s_mmi_voltage_level <= VOLT_20PERCENTLEVEL)
+		//system(MMI_TURN_OFF_DISCHG);
+
+}
+VOID mmi_set_mode_fast_poweron(BOOL chgflag)
+{
+
+	if (!g_fast_poweron)
+		return;
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		if (chgflag) {
+			if (mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_battery_info  startcharging MMI_FAKE_POWEROFF_CHARGE_MODE \n\n");
+				mmi_set_led_mode(MMI_FAKE_POWEROFF_CHARGE_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+		} else {
+			if (mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_battery_info  discharging MMI_FAKE_POWEROFF_MODE \n\n");
+				mmi_set_led_mode(MMI_FAKE_POWEROFF_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+		}
+	}
+#ifndef DISABLE_LCD
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		if (chgflag) {
+			if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_battery_info  startcharging MMI_FAKE_POWEROFF_CHARGE_MODE \n\n");
+				mmi_set_lcd_mode(MMI_FAKE_POWEROFF_CHARGE_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+		} else {
+			if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_battery_info  discharging MMI_FAKE_POWEROFF_MODE \n\n");
+				mmi_set_lcd_mode(MMI_FAKE_POWEROFF_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+			}
+		}
+	}
+#endif
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡³äµç״̬
+ ***********************************************************************************/
+static VOID mmi_set_battery_info(VOID)
+{
+	E_zMmi_Charge_State chg_sta = STATE_CHARGE_MAX;
+	int power = 0;
+	chg_sta = mmi_get_charge_status();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_battery_info chg_sta = %d!!\n", chg_sta);
+	s_mmi_charge_stateEx = s_mmi_charge_state;
+	/*if (chg_sta == STATE_CHARGING || chg_sta == STATE_FULL) {
+		// when the battery missed, the chg_sta may be CHARGING or FULL, 
+		// so we need read voltage to determine if the battery is in place.
+		power = mmi_voltage_state_read();
+		if (power < 0) {
+			// power<0 indicates that the battery is not in place, we modify the state to DISCHARGE.
+			s_mmi_charge_state = STATE_DISCHARGE;
+			mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+			mmi_set_mode_fast_poweron(FALSE);
+			return;
+		}
+	}*/
+	if (chg_sta == STATE_CHARGING) {
+		s_mmi_charge_state = STATE_CHARGING;
+		mmi_set_webUI_batterycharge(WEBUICHARGING, FALSE);
+		//g_mmi_voltageEx = 0;
+		mmi_set_mode_fast_poweron(TRUE);
+
+		power = mmi_voltage_state_read();
+		if (power > 0 && power < INT_MAX) {//kw 3
+			mmi_battery_capacity_compare(power);
+		}
+	} else if (chg_sta == STATE_FULL) {
+		s_mmi_charge_state = STATE_FULL;
+		g_mmi_voltageEx = 0;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, TRUE);
+		mmi_set_mode_fast_poweron(TRUE);
+		if (g_charge_protect == 1) {
+			system(MMI_TURN_OFF_CHG_FULL);
+			slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_set_battery_info off charge full!!\n");
+		}
+	} else if (chg_sta == STATE_DISCHARGE) {
+		s_mmi_charge_state = STATE_DISCHARGE;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+		
+		power = mmi_voltage_state_read();
+		if (power > 0 && power < INT_MAX) {//kw 3
+			mmi_battery_capacity_compare(power);
+		}
+		
+		mmi_set_mode_fast_poweron(FALSE);
+	} else if (chg_sta == STATE_CHARGERROR) {
+		s_mmi_charge_state = STATE_DISCHARGE;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+
+		power = mmi_voltage_state_read();
+		if (power > 0 && power < INT_MAX) {//kw 3
+			mmi_battery_capacity_compare(power);
+		}
+		
+		mmi_set_mode_fast_poweron(FALSE);
+	} else {
+		power = mmi_voltage_state_read();
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_set_battery_info invalid charge state!! power=%d\n");
+	}
+
+}
+
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡USB״̬
+ ***********************************************************************************/
+BOOL mmi_get_usb_insert_state()
+{
+	return s_mmi_usb_insert_status;
+}
+
+E_zMmi_Voltage_level mmi_get_voltage_level()
+{
+	return s_mmi_voltage_level;
+}
+
+E_zMmi_Charge_State mmi_get_charge_state()
+{
+	return s_mmi_charge_state;
+}
+
+
+
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´ò¿ªcharging_netlinkÌ×½Ó×Ö
+ ·µ»ØÖµ£º ´ò¿ªµÄnetlinkÌ×½Ó×ÖÃèÊö·û£¬´ò¿ª³É¹¦·µ»Ø·Ç0Öµ
+***********************************************************************************/
+int open_charging_netlink()
+{
+	struct sockaddr_nl addr;
+	int s = -1;
+	memset(&addr, 0, sizeof(addr));
+	addr.nl_family = AF_NETLINK;
+	addr.nl_pid = getpid();
+	addr.nl_groups = 0xffffffff;
+	s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
+	if (s < 0) {		
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI charging socketfail %d\n",errno);
+		return -1;
+	}
+//  setsockopt(s, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz));
+	if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI charging bindfail %d\n",errno);
+		close(s);
+		return -1;
+	}
+	return s;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£ºnetlinkÊý¾Ý¼ìË÷º¯Êý
+Êä   È룺const char *key£ºÖ¸Ïò¹Ø¼ü×ÖµÄÖ¸Õë
+         const char *buf£ºÖ¸Ïò×Ö·û´®µÄÖ¸Õë
+         size_t len£º×Ö·û´®³¤¶È
+
+Êä   ³ö£º
+·µ»ØÖµ£º ·µ»Ø×Ö·û´®ÖжÔÓ¦¹Ø¼ü×ֵįðʼµØÖ·£¬Èô¼ìË÷²»µ½¹Ø¼ü×Ö£¬·µ»ØNULL
+Æä   Ëû£º
+***********************************************************************************/
+static const char *search_netlink(const char *key, const char *buf, size_t len)
+{
+	size_t curlen = 0;
+	size_t keylen = strlen((char *)key);
+	char *cur = (char *)buf;
+
+	while (cur < buf + len - keylen) {
+		curlen = strlen(cur);
+		if (curlen == 0)
+			break;
+		if (!strncmp(key, cur, keylen) && cur[keylen] == '=') {
+			return cur + keylen + 1;
+		}
+		cur += (curlen + 1);
+	}
+	return NULL;
+}
+static void update_charge_state_only(void)
+{
+	E_zMmi_Charge_State chg_sta = STATE_CHARGE_MAX;
+	chg_sta = mmi_get_charge_status();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI update_charge_state_only chg_sta = %d!!\n", chg_sta);
+	s_mmi_charge_stateEx = STATE_CHARGE_MAX;
+	s_mmi_poweroff_voltage_num = 0;
+	if (chg_sta == STATE_CHARGING) {
+		s_mmi_charge_state = STATE_CHARGING;
+		mmi_set_webUI_batterycharge(WEBUICHARGING, FALSE);
+	} else if (chg_sta == STATE_FULL) {
+		s_mmi_charge_state = STATE_FULL;
+		g_mmi_voltageEx = 0;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, TRUE);
+	} else if (chg_sta == STATE_DISCHARGE) {
+		s_mmi_charge_state = STATE_DISCHARGE;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+	} else if (chg_sta == STATE_CHARGERROR) {
+		s_mmi_charge_state = STATE_DISCHARGE;
+		mmi_set_webUI_batterycharge(WEBUIUNCHARGING, FALSE);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_set_battery_info invalid charge state!! power=%d\n");
+	}
+	
+	mmi_set_battery_update();
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´Ónetlink¼àÌýµ½µÄÏûÏ¢×Ö·û´®´¦Àí³äµçÏûÏ¢
+ ***********************************************************************************/
+void process_netlink_event(int netlink_fd)
+{
+	char buf[1024] = {0};
+	int byte_counts = -1;
+	const char *keys = NULL, *subsys = NULL, *action = NULL;
+	const char *power_supply_name = NULL;
+
+
+	byte_counts = recv(netlink_fd, buf, sizeof(buf)-1, 0);
+	buf[sizeof(buf)-1] = '\0';//cov
+
+	if (byte_counts <= 0) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI receive from netlonk ret %d err %d \n", byte_counts, errno);
+		return;
+	}
+
+	keys = (char *)(buf + strlen((char *)buf) + 1);
+	byte_counts -= (strlen((char*)buf) + 1);
+
+	subsys = search_netlink("SUBSYSTEM", keys, byte_counts);
+	action = search_netlink("ACTION", keys, byte_counts);
+	power_supply_name = search_netlink("POWER_SUPPLY_NAME", keys, byte_counts);
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI process_netlink_event subsys=%s, action=%s, power_supply_name=%s\n", subsys, action, power_supply_name);
+
+	if ((subsys != NULL) && (action != NULL) && (power_supply_name != NULL)) {//klocwork
+		if ((!strcmp(subsys, "power_supply")) && (!(strcmp(action, "change")))) {
+			if (!strcmp(power_supply_name, "charger")) {
+				set_wake_lock(MMI_MAIN_LOCK_ID);
+				mmi_reset_idle_timer();
+				mmi_set_battery_info();
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI BATTERY process_netlink_event s_mmi_charge_state = %d s_mmi_charge_stateEx=%d\n", s_mmi_charge_state, s_mmi_charge_stateEx);
+				mmi_set_mode_active();
+				if (s_mmi_charge_state != s_mmi_charge_stateEx) {
+					mmi_set_battery_update();
+				}
+			} else if (!strcmp(power_supply_name, "boost")) {
+				if (g_discharge_protect) {
+					set_wake_lock(MMI_MAIN_LOCK_ID);
+					mmi_set_discharge_info();
+					set_wake_unlock(MMI_MAIN_LOCK_ID);
+				}
+			} else {
+				return;
+			}
+		}
+	}
+	else if ((subsys != NULL) && (action != NULL)) {
+		if ((!strcmp(subsys, "dwc_usb")) && (!(strcmp(action, "remove")))) {
+			//mmi_reset_idle_timer();
+			//mmi_set_battery_info();
+			system(MMI_TURN_OFF_CHG);
+			system(MMI_TURN_OFF_DISCHG);
+			update_charge_state_only();
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI process_netlink_event remove %d\n",s_mmi_voltage_level);
+			//if (s_mmi_voltage_level > VOLT_20PERCENTLEVEL)
+				//system(USB_SET_ROLE_DEF_SRC);
+			//else
+				//system(USB_SET_ROLE_DEF_SNK);
+		}
+		else if ((!strcmp(subsys, "dwc_usb")) && (!(strcmp(action, "add")))) {
+			//mmi_reset_idle_timer();
+			//mmi_set_battery_info();
+			update_charge_state_only();
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI process_netlink_event add %d\n",s_mmi_voltage_level);
+			/*
+			if (system(USB_TYPE_AC_PC_CHECK) == 1) {
+				if (s_mmi_voltage_level <= VOLT_50PERCENTLEVEL)
+					system(MMI_TURN_OFF_DISCHG);
+				if (s_mmi_voltage_level <= VOLT_20PERCENTLEVEL)
+					system(USB_SET_ROLE_DEF_SNK);
+				else if (s_mmi_voltage_level > VOLT_50PERCENTLEVEL)
+					system(USB_SET_ROLE_DEF_SRC);
+			}*/
+
+		}
+	}
+}
+
+int battery_app_msg_parse(const char *msg, int msglen, struct hotplug_event *event)
+{
+	int byte_counts = msglen;
+	const char *keys = NULL, *subsys = NULL, *action = NULL;
+	const char *power_supply_name = NULL;
+	
+	keys = (char *)(msg + strlen((char *)msg) + 1);
+	byte_counts -= (strlen((char*)msg) + 1);
+
+	subsys = search_netlink("SUBSYSTEM", keys, byte_counts);
+	action = search_netlink("ACTION", keys, byte_counts);
+	power_supply_name = search_netlink("POWER_SUPPLY_NAME", keys, byte_counts);
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI process_netlink_event subsys=%s, action=%s, power_supply_name=%s\n", subsys, action, power_supply_name);
+
+	if ((subsys != NULL) && (action != NULL) && (power_supply_name != NULL)) {
+		if ((!strcmp(subsys, "power_supply")) && (!(strcmp(action, "change")))) {
+			if (!strcmp(power_supply_name, "charger")) {
+				mmi_set_battery_info();
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI BATTERY process_netlink_event s_mmi_charge_state = %d s_mmi_charge_stateEx=%d\n", s_mmi_charge_state, s_mmi_charge_stateEx);
+				if (s_mmi_charge_state != s_mmi_charge_stateEx 
+					&& (s_mmi_charge_state == STATE_DISCHARGE || s_mmi_charge_stateEx == STATE_DISCHARGE)) {
+					set_wake_lock(MMI_MAIN_LOCK_ID);
+					mmi_reset_idle_timer();
+					mmi_set_mode_active();
+				}
+				if (s_mmi_charge_state != s_mmi_charge_stateEx) {
+					mmi_set_battery_update();
+				}
+			} else if (!strcmp(power_supply_name, "boost")) {
+				if (g_discharge_protect) {
+					set_wake_lock(MMI_MAIN_LOCK_ID);
+					mmi_set_discharge_info();
+					set_wake_unlock(MMI_MAIN_LOCK_ID);
+				}
+			} else {
+				return -1;
+			}
+		}
+	}
+	else if ((subsys != NULL) && (action != NULL)) {
+		if ((!strcmp(subsys, "dwc_usb")) && (!(strcmp(action, "remove")))) {
+			//mmi_reset_idle_timer();
+			//mmi_set_battery_info();
+			system(MMI_TURN_OFF_CHG);
+			system(MMI_TURN_OFF_DISCHG);
+			update_charge_state_only();
+		    slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI process_netlink_event2 remove %d\n",s_mmi_voltage_level);
+			
+			//if (s_mmi_voltage_level > VOLT_20PERCENTLEVEL)
+				system(USB_SET_ROLE_DEF_SRC);
+			//else
+				//system(USB_SET_ROLE_DEF_SNK);
+		}
+		else if ((!strcmp(subsys, "dwc_usb")) && (!(strcmp(action, "add")))) {
+			//mmi_reset_idle_timer();
+			//mmi_set_battery_info();
+			update_charge_state_only();
+		    slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI process_netlink_event2 add %d\n",s_mmi_voltage_level);
+			/*
+			if (s_mmi_voltage_level <= VOLT_50PERCENTLEVEL)
+				system(MMI_TURN_OFF_DISCHG);
+			if (s_mmi_voltage_level < VOLT_20PERCENTLEVEL)
+				system(USB_SET_ROLE_DEF_SNK);
+			else if (s_mmi_voltage_level > VOLT_50PERCENTLEVEL)
+				system(USB_SET_ROLE_DEF_SRC);*/
+
+		}
+	}
+	return -1;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£ºµçѹÂÖѯ¶¨Ê±Æ÷»Øµ÷º¯Êýÿ20Ãë¶ÁÒ»´Îµçѹ
+ ***********************************************************************************/
+static VOID *mmi_batterypower_process_thread(VOID *arg)
+{
+	UINT32 voltagepower = 0;
+
+	prctl(PR_SET_NAME, "mmigetbatvol", 0, 0, 0);
+
+	while (1) {
+		set_wake_lock(MMI_GET_POWER_LOCK_ID);
+		
+		if (g_discharge_protect) {
+			voltagepower = mmi_voltage_state_read_ex();
+			if (voltagepower > 0 && voltagepower < INT_MAX) {//kw 3
+				mmi_battery_capacity_compare(voltagepower);
+				mmi_set_battery_update();
+			}
+		} else {
+			if (mmi_get_charge_state() == STATE_DISCHARGE || mmi_get_charge_state() == STATE_CHARGING) {
+				voltagepower = mmi_voltage_state_read();
+				if (voltagepower > 0 && voltagepower < INT_MAX) {//kw 3
+					mmi_battery_capacity_compare(voltagepower);
+					mmi_set_battery_update();
+				}
+			} else {
+				/*³äµçµÈÆäËûÇé¿öϵĵ͵籣»¤*/
+				if (g_temp_protect) {
+					voltagepower = mmi_voltage_state_read_ex();
+					if (voltagepower > 0 && voltagepower < INT_MAX) {//kw 3
+						mmi_lowbattery_shutdown(voltagepower);
+					}
+				}
+			}
+		}
+		set_wake_unlock(MMI_GET_POWER_LOCK_ID);
+		mmi_sleep(CHECK_POWER_TIME_INTERVAL);
+	}
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´´½¨µçѹ²éѯÏß³Ì
+ ***********************************************************************************/
+static VOID mmi_create_get_voltage_thread(VOID)
+{
+	pthread_t mmi_battryvol_thread;
+	if (pthread_create(&mmi_battryvol_thread, NULL, &mmi_batterypower_process_thread, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI pthread_create BatteryPower_thread error\n");
+		return;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_create_get_voltage_timer success!!\n");
+}
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´´½¨³äµç¼àÌýÏß³Ì
+ ***********************************************************************************/
+void *mmi_chargingcheck_process_thread(void *arg)
+{
+	int charging_netlink = -1;
+	int fd_counts = -1;
+	fd_set readfds;
+	prctl(PR_SET_NAME, "mmichgcheck", 0, 0, 0);
+	if ((charging_netlink = open_charging_netlink()) < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI charging_netlink wrong \n");
+		return NULL;
+	}
+	while (1) {
+/*		FD_ZERO(&readfds);
+		FD_SET(charging_netlink, &readfds);
+
+		fd_counts = select(charging_netlink + 1, &readfds, NULL, NULL, NULL);
+
+		if (fd_counts < 0) {
+			slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI select usb_netlink error! \n");
+			continue;
+		} else if (fd_counts == 0) {
+			slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI select usb_netlink timeout\n");
+			continue;
+		} else {
+			if (charging_netlink > 0 && FD_ISSET(charging_netlink, &readfds)) {*/
+				process_netlink_event(charging_netlink);
+			//}
+		//}
+	}
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º´´½¨³äµç״̬¼à¿ØÏß³Ì
+ ***********************************************************************************/
+static VOID mmi_create_chargestate_check_thread(VOID)
+{
+	pthread_t mmi_chgstate_thread;
+	if (pthread_create(&mmi_chgstate_thread, NULL, &mmi_chargingcheck_process_thread, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_create_chargestate_check_thread error\n");
+		return;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_create_chargestate_check_thread success!!!\n");
+
+}
+
+/**************************************************************************************
+*º¯Êý˵Ã÷:³õʼ»¯³äµç״̬ ÉèÖÃµç³ØµÆ
+***************************************************************************************/
+static VOID mmi_charge_state_init(VOID)
+{
+	mmi_set_battery_info();
+	mmi_set_battery_update();
+}
+
+/**************************************************************************************
+*º¯Êý˵Ã÷:³õʼ»¯µç³ØµÆ×´Ì¬
+***************************************************************************************/
+VOID mmi_battery_init(VOID)
+{
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI BATTERY mmi_battery_Led_Init begin!!\n");
+	mmi_charge_state_init();
+	if (g_discharge_protect) {
+		mmi_load_state_init();
+	}
+	//mmi_create_chargestate_check_thread();
+	hotplug_parse_register(DEVICE_TYPE_APP_MMI_BATTERY, battery_app_msg_parse);
+	mmi_create_get_voltage_thread();
+}
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_battery_adapter.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_battery_adapter.c
new file mode 100755
index 0000000..d13c65b
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_battery_adapter.c
@@ -0,0 +1,254 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_batterry_adapter.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡³äµçºÍµç³ØÐÅÏ¢ÊÊÅä
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+
+/************************************************************************************
+                           Í·Îļþ
+***********************************************************************************/
+#include <linux/netlink.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+/*
+extern SINT32 g_mmi_hightempvol;
+extern SINT32 g_mmi_superhightempvol;
+extern SINT32 g_mmi_lowtempvol;
+extern SINT32 g_mmi_superlowtempvol;
+*/
+extern SINT32 g_mmi_batvoltageline[MMI_BAT_VOLTAGE_LEN];
+
+//µçѹ-µçÁ¿ÅäÖÃ±í£¬mmi´ÓÇý¶¯¶Áµ½µÄµçѹ»á¸úÕâ¸ö±íµÄµçѹ½øÐбȶԣ¬´Ó¶øÕÒµ½µçÁ¿·¶Î§
+static int bat_volage[] = {
+	3090, 3300, 3450, 3490, 3510, 3540, 3550, 3570, 3580, 3600, 3620,
+	3650, 3670, 3710, 3740, 3780, 3850, 3900, 3950, 4000, 4060,
+
+};
+
+
+static T_zMmiChgStateStringItem g_chgStateStringTab[] = {
+	{CHARGE_STATUS_FULL,     	STATE_FULL},
+	{CHARGE_STATUS_CHARGING, 	STATE_CHARGING},
+	{CHARGE_STATUS_DISCHARGING,	STATE_DISCHARGE},
+	{CHARGE_STATUS_NOTCHARGING,	STATE_CHARGERROR}
+};
+
+E_zMmi_Charge_State mmi_get_charge_status(VOID);
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º ¶ÁÈ¡µçѹֵ
+***********************************************************************************/
+SINT32 mmi_voltage_state_read(VOID)
+{
+	char buf_volt[CHARGE_VOLTAGE_LENGTH] = {0};
+	char buf_online[8] = {0};
+	FILE* fd_voltage = NULL;
+	FILE* fd_bat = NULL;
+	int len = 0;
+	int voltagepower = 0;
+
+	fd_bat = fopen(CHARGE_BAT_STATUS_PATH, "r");
+	if (fd_bat == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI open bat status file fail!\n");
+		cfg_set(WEBUIBATTERYLEVEL, WEBUINOBATTERY);
+		return -1;
+	}
+	len = fread(buf_online, 1, 1, fd_bat);
+	if (len < 0 || atoi(buf_online) != 1 ) {
+		cfg_set(WEBUIBATTERYLEVEL, WEBUINOBATTERY);
+		fclose(fd_bat);
+		return -1;
+	}
+	fclose(fd_bat);
+	fd_voltage = fopen(CHARGE_VOLTAGE_PATH, "r");
+	if (fd_voltage == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI open voltage file fail!\n");
+		//MMI_ASSERT(0);
+		cfg_set(WEBUIBATTERYLEVEL, WEBUINOBATTERY);
+		return -1;
+	}
+	len = fread(buf_volt, 1, CHARGE_VOLTAGE_LENGTH, fd_voltage);
+	if (len > 0) { //kw 3
+		voltagepower = atoi(buf_volt);
+		fclose(fd_voltage);
+		slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI voltagepower=%d\n",voltagepower);
+		if(voltagepower < 0)
+			cfg_set(WEBUIBATTERYLEVEL, WEBUINOBATTERY);
+		return voltagepower;
+	} else {
+		perror("read voltage file failed");
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI read voltage file fail len = %d !\n", len);
+		fclose(fd_voltage);
+		cfg_set(WEBUIBATTERYLEVEL, WEBUINOBATTERY);
+		return -1;
+	}
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º ¶ÁÈ¡µçѹֵ֮ǰÏÈÅжϳäµç״̬£¬Èç¹ûÊÇCHARGING£¬ÔòÏȹرճäµç£¬¶ÁÈ¡µçѹֵ֮ºóÔÙ¿ªÆô³äµç¡£
+***********************************************************************************/
+SINT32 mmi_voltage_state_read_ex(VOID)
+{
+	E_zMmi_Charge_State chg_sta = mmi_get_charge_status();
+	if (STATE_CHARGING == chg_sta)
+	{
+		system(MMI_TURN_OFF_CHG);
+	}
+	SINT32 ret = mmi_voltage_state_read();
+	if (STATE_CHARGING == chg_sta)
+	{
+		system(MMI_TURN_ON_CHG);
+	}
+	return ret;
+}
+
+/*****************************************************************************************
+*º¯Êý˵Ã÷£º ¸ù¾Ýµç³Ø°Ù·Ö±ÈÉèÖÃµç³Ø×´Ì¬ 10%/25%/normal
+*******************************************************************************************/
+E_zMmi_Voltage_level mmi_set_battery_state(UINT32 bat_level)
+{
+	E_zMmi_Voltage_level volt_lev = VOLT_MAX;
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_battery_state bat_level = %d\n", bat_level);
+	if (bat_level <= 5) {
+		volt_lev = VOLT_5PERCENTLEVEL;
+	} else if (bat_level <= 10) { //kw 3
+		volt_lev = VOLT_10PERCENTLEVEL;
+	} else if (bat_level < 20) {
+		volt_lev = VOLT_20PERCENTLEVEL;
+	} else if (bat_level <= 25) {
+		volt_lev = VOLT_25PERCENTLEVEL;
+	} else if (bat_level <= 50) {
+		volt_lev = VOLT_50PERCENTLEVEL;
+	} else {
+		volt_lev = VOLT_NORMALLEVEL;
+	}
+	return volt_lev;
+}
+/*****************************************************************************************
+*º¯Êý˵Ã÷£º ÉèÖÃWEBUIµç³Ø¸ñÊý
+*******************************************************************************************/
+VOID mmi_set_webUI_batterypers(UINT32 bat_level)
+{
+	if (bat_level <= 5) {
+		cfg_set(WEBUIBATTERYLEVEL, WEBUINOLEVEL);
+	} else if (bat_level <= 25) { //kw 3
+		cfg_set(WEBUIBATTERYLEVEL, WEBUIONELEVEL);
+	} else if (bat_level <= 50) {
+		cfg_set(WEBUIBATTERYLEVEL, WEBUITWOLEVEL);
+	} else if (bat_level < 85) {
+		cfg_set(WEBUIBATTERYLEVEL, WEBUITHRLEVEL);
+	} else {
+		cfg_set(WEBUIBATTERYLEVEL, WEBUIFOURLEVEL);
+	}
+}
+
+/*****************************************************************************************
+*º¯Êý˵Ã÷£º ÉèÖÃWEBUIµç³Ø×´Ì¬
+*******************************************************************************************/
+VOID mmi_set_webUI_batterycharge(char* chg_sta, BOOL isFull)
+{
+	cfg_set(WEBUICHARGESTATTUS, chg_sta);
+	if (isFull) {
+		cfg_set(BATTERYPERS_NV, WEBUIFULLLEVEL);
+		cfg_set(WEBUIBATTERYLEVEL, WEBUIFOURLEVEL);
+	}
+}
+/*****************************************************************************************
+*º¯Êý˵Ã÷£º ¸ù¾Ýµçѹ»ñÈ¡µç³ØµçÁ¿°Ù·Ö±È
+*******************************************************************************************/
+SINT32 get_voltage_level_from_table(SINT32 voltagepower)
+{
+	UINT32 bat_lev = 0;
+	SINT32 i;
+
+	if (voltagepower < g_mmi_batvoltageline[0]) {
+		bat_lev = 0;
+	} else if (voltagepower >= g_mmi_batvoltageline[MMI_BAT_VOLTAGE_LEN - 1]) {
+		bat_lev = 100;
+	} else {
+		for (i = 0; i < MMI_BAT_VOLTAGE_LEN - 1; i++) {
+			if (voltagepower >= g_mmi_batvoltageline[i] && voltagepower < g_mmi_batvoltageline[i + 1]) {
+				bat_lev = i * 5;
+				break;
+			}
+		}
+	}
+	return bat_lev;
+}
+
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡³äµç״̬
+ ***********************************************************************************/
+E_zMmi_Charge_State mmi_get_charge_status(VOID)
+{
+	char chg_state_buf[CHARGE_STATUS_LENGTH] = {0};
+	int len = 0;
+	UINT32 i = 0;
+	FILE* fd_charger = NULL;
+
+	fd_charger = fopen(CHARGE_STATUS_PATH, "r");
+	if (fd_charger == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_get_charge_status open charging file fail!\n");
+		//MMI_ASSERT(0);
+		return STATE_CHARGE_MAX;
+	}
+	len = fread(chg_state_buf, 1, CHARGE_STATUS_LENGTH, fd_charger);
+	if (len > 0) { //kw 3
+		fclose(fd_charger);
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_get_charge_status chg_state_buf=%s !\n", chg_state_buf);
+		for (i = 0; i < sizeof(g_chgStateStringTab) / sizeof(T_zMmiChgStateStringItem); ++ i) {
+			if (strncmp(chg_state_buf, g_chgStateStringTab[i].devString, strlen(g_chgStateStringTab[i].devString)) == 0) {
+				return g_chgStateStringTab[i].chg_sta;
+			}
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_get_charge_status read voltage file fail len = %d !\n", len);
+		fclose(fd_charger);
+		return STATE_CHARGE_MAX;
+	}
+	return STATE_CHARGE_MAX;
+}
+/**********************************************************************************
+*º¯Êý˵Ã÷£º»ñÈ¡USB²å°Î״̬
+ ***********************************************************************************/
+BOOL mmi_read_usb_insert_status(VOID)
+{
+	char usb_state_buf[2] = {0};
+	int len = 0;
+	FILE* fd_charger = NULL;
+
+	fd_charger = fopen(USB_INSERT_STATUS_PATH, "r");
+	if (fd_charger == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_read_usb_insert_status open usb file fail!\n");
+		//MMI_ASSERT(0);
+		return FALSE;
+	}
+	len = fread(usb_state_buf, 1, 2, fd_charger);
+	if (len > 0) { //kw 3
+		fclose(fd_charger);
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_read_usb_insert_status usb_state_buf=%s !\n", usb_state_buf);
+		if (!strncmp(usb_state_buf, USB_STATUS_IN, strlen(USB_STATUS_IN))) {
+			return TRUE;
+		}
+		if (!strncmp(usb_state_buf, USB_STATUS_OUT, strlen(USB_STATUS_OUT))) {
+			return FALSE;
+		}
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_read_usb_insert_status read usb file fail len = %d !\n", len);
+		fclose(fd_charger);
+		return FALSE;
+	}
+	return FALSE;
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_cfg.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_cfg.c
new file mode 100755
index 0000000..e220464
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_cfg.c
@@ -0,0 +1,209 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include "mmi_common.h"
+
+/***********************************LCDͳһÅäÖÃ********************************/
+
+/*ÆÁĻģʽÅäÖÃ*/
+E_zMmiShowMode g_showMode = 0;//led,1;lcd,2;lcd+lcd,3
+
+
+/***********************************LEDͳһÅäÖÃ********************************/
+
+T_zMmiSmsLedConfig g_mmi_smsled_config_tab[] = {
+	{{0, SMS_RECVBOX_STATUS_FULL}, {LED_SMS, LED_STATE_BLINK, LED_STATE_SMS_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{0, SMS_RECVBOX_STATUS_NEW}, {LED_SMS, LED_STATE_BLINK, LED_STATE_SMS_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{0, SMS_RECVBOX_STATUS_UNREAD}, {LED_SMS, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{0, SMS_RECVBOX_STATUS_NOR}, {LED_SMS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+
+};
+
+T_zMmiVoipLedConfig g_mmi_voipled_config_tab[] = {
+	{{VOIP_STATUS_IN_CALL}, {LED_VOIP, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{VOIP_STATUS_IN_CONNECTION}, {LED_VOIP, LED_STATE_BLINK, LED_STATE_VOIP_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{VOIP_STATUS_HANG_UP}, {LED_VOIP, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{VOIP_STATUS_NOR}, {LED_VOIP, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+
+};
+
+T_zMmiBatteryLedConfig g_mmi_batled_config_tab[] = {
+	{{STATE_CHARGING, 0, 0, 0}, {LED_BATTERY, LED_STATE_BLINK, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{{STATE_FULL, 0, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_5PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_10PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_20PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_25PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_50PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_75PERCENTLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{STATE_DISCHARGE, VOLT_NORMALLEVEL, 0, 0}, {LED_BATTERY, LED_STATE_ON, LED_STATE_BAT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+};
+
+T_zMmiNetLedConfig g_mmi_netled_config_tab[] = {
+	{CUSTOMER_SDK, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	//16M flash
+	{CUSTOMER_SDK_MIN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_3G, 0, 0, 1, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_3G, 0, 0, 2, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_4G, 0, 0, 1, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_4G, 0, 0, 2, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {NET_MODE_NOTREADY, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	//16M flash, yaoyuan cpe
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_NOTREADY, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_RED, TRAFFIC_LED_MAX}},
+	//{CUSTOMER_YAOYUAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_CPE_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	//{CUSTOMER_YAOYUAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_CPE_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	//{CUSTOMER_YAOYUAN, {NET_MODE_NOTREADY, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_CPE_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	//GUODIAN led config
+	{CUSTOMER_GUODIAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_GUODIAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	//NANDIAN led config
+	{CUSTOMER_NANDIAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_FAST_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_2G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_3G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_4G, 1, 0, 0, 0, NET_SOCKET_ACTIVE}, {LED_WAN, LED_STATE_BLINK, LED_STATE_WAN_SLOW_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_2G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_3G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_4G, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_NANDIAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_WAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+};
+
+
+#if 0
+T_zMmiWifiLedConfig g_mmi_wifiled_config_tab[] = {
+	{{TRUE, 0, 0, WPS_ACTIVING}, {LED_LAN, LED_STATE_BLINK, LED_STATE_LAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{TRUE, 0, 0, WPS_ACTIVED}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{TRUE, 0, 0, WPS_DEACTIVED}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{TRUE, 0, 0, WPS_DEACTIVING}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{TRUE, 0, 0, WPS_ACTIVE_MAX}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{FALSE, 0, 0, WPS_ACTIVE_MAX}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+};
+#endif
+
+T_zMmiWifiLedConfig g_mmi_wifiled_config_tab[] = {
+	{CUSTOMER_SDK, {TRUE, TRUE, 0, 0, WPS_ACTIVING}, {LED_LAN, LED_STATE_BLINK, LED_STATE_LAN_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {TRUE, FALSE, 0, 0, WPS_ACTIVED}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, TRUE, 0, 0, WPS_DEACTIVED}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, FALSE, 0, 0, WPS_DEACTIVING}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+
+	//16M flash
+	{CUSTOMER_SDK_MIN, {TRUE, TRUE, 0, 0, WPS_ACTIVING}, {LED_LAN, LED_STATE_ON, LED_STATE_LAN_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {TRUE, FALSE, 0, 0, WPS_ACTIVED}, {LED_LAN, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {FALSE, TRUE, 0, 0, WPS_DEACTIVED}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK_MIN, {FALSE, FALSE, 0, 0, WPS_DEACTIVING}, {LED_LAN, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+};
+
+//wpsµÆ Ò¢Ô¶cpe
+T_zMmiWifiLedConfig g_mmi_wpsled_config_tab[] = {
+	{CUSTOMER_SDK, {TRUE, TRUE, 0, 0, WPS_ACTIVING}, {LED_WPS, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {TRUE, FALSE, 0, 0, WPS_ACTIVED}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, TRUE, 0, 0, WPS_DEACTIVED}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, FALSE, 0, 0, WPS_DEACTIVING}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, FALSE, 0, 0, WPS_FAIL}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_SDK, {FALSE, FALSE, 0, 0, WPS_ACTIVE_MAX}, {LED_WPS, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+};
+
+//5¿ÅµÆ ¸´ÓÃTRAFFIC_LED  Ò¢Ô¶cpe
+T_zMmiNetLedConfig g_mmi_signalled_config_tab[] = {
+	//16M flash, yaoyuan cpe
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 1, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_1}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 2, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_2}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 3, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_3}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 4, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_4}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_2G, 0, 5, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_5}},
+
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 1, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_1}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 2, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_2}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 3, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_3}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 4, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_4}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_3G, 0, 5, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_5}},
+
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 1, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_1}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 2, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_2}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 3, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_3}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 4, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_4}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_4G, 0, 5, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_5}},
+
+	{CUSTOMER_YAOYUAN, {NET_MODE_NOSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_BLINK, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_LIMITSERVICE, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_BLINK, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{CUSTOMER_YAOYUAN, {NET_MODE_NOTREADY, 0, 0, 0, 0, NET_SOCKET_INACTIVE}, {LED_SIGNAL, LED_STATE_BLINK, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+};
+
+//rj11µÆ Ò¢Ô¶cpe
+T_zMmiRj11LedConfig g_mmi_rj11led_config_tab[] = {
+	{{RJ11_STATUS_IN}, {LED_RJ11, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{RJ11_STATUS_OUT}, {LED_RJ11, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+	{{RJ11_STATUS_NOR}, {LED_RJ11, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_BLUE, TRAFFIC_LED_MAX}},
+};
+
+//rj45µÆ
+T_zMmiRj45LedConfig g_mmi_rj45led_config_tab[] = {
+	{{RJ45_STATUS_IN}, {LED_RJ45, LED_STATE_ON, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{RJ45_STATUS_OUT}, {LED_RJ45, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+	{{RJ45_STATUS_NOR}, {LED_RJ45, LED_STATE_OFF, LED_STATE_DEFAULT_BLINK, {0}, LED_COLOR_GREEN, TRAFFIC_LED_MAX}},
+};
+
+unsigned int mmi_get_config_tab_size(MMI_LED_NAME led)
+{
+	if (led == LED_BATTERY) {
+		return sizeof(g_mmi_batled_config_tab);
+	} else if (led == LED_LAN) {
+		return sizeof(g_mmi_wifiled_config_tab);
+	} else if (led == LED_WAN) {
+		return sizeof(g_mmi_netled_config_tab);
+	} else if (led == LED_SMS) {
+		return sizeof(g_mmi_smsled_config_tab);
+	} else if (led == LED_VOIP) {
+		return sizeof(g_mmi_voipled_config_tab);
+	} else if (led == LED_SIGNAL) {
+		return sizeof(g_mmi_signalled_config_tab);
+	} else if (led == LED_WPS) {
+		return sizeof(g_mmi_wpsled_config_tab);
+	} else if (led == LED_RJ11) {
+		return sizeof(g_mmi_rj11led_config_tab);
+	} else if (led == LED_RJ45) {
+		return sizeof(g_mmi_rj45led_config_tab);
+	}
+	return 0;
+}
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_cfg.h b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_cfg.h
new file mode 100755
index 0000000..3774319
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_cfg.h
@@ -0,0 +1,258 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+
+/***********************************LCDͳһÅäÖÃ********************************/
+
+
+
+/*****************************************************************************
+ÆÁÄ»×ÖÌå´óС¶¨Òå
+******************************************************************************/
+#define MMI_LCD_SHOW_STRING_LEN 			74
+#define MMI_LCD_CHAR8_MAX_LEN    			18	//ÿÆÁÏÔʾµÄ×î´ó³¤¶È£¬´óÓÚ´ËÖµ½«¹ö¶¯ÏÔʾ£¬Èç×ÖÌå±ä»¯ÐèÐÞ¸Ä
+#define MMI_LCD_CHAR9_MAX_LEN    			18	//ÿÆÁÏÔʾµÄ×î´ó³¤¶È£¬´óÓÚ´ËÖµ½«¹ö¶¯ÏÔʾ£¬Èç×ÖÌå±ä»¯ÐèÐÞ¸Ä
+
+/*****************************************************************************
+Îļþ×ÊԴ·¾¶¶¨Òå
+******************************************************************************/
+#define MMI_RESOURCE_PATH  					"/etc_ro/mmi/"
+
+/*****************************************************************************
+ LEDµÆÉÁ˸ƵÂÊÅäÖÃ
+******************************************************************************/
+
+#define LED_BLINK_TIME_INTERVAL			1000
+
+//LEDµÆ¿ìÉÁ/ÂýÉÁʱ¼ä    µ¥Î»:ms
+#define LED_FAST_BLINK_ON_TIME          100//1000
+#define LED_FAST_BLINK_OFF_TIME         100//1000
+#define LED_SLOW_BLINK_ON_TIME          250//2000
+#define LED_SLOW_BLINK_OFF_TIME         250//5000
+
+#define LED_BAT_BLINK_ON_TIME			800
+#define LED_BAT_BLINK_OFF_TIME			1200
+#define LED_LAN_BLINK_ON_TIME			400
+#define LED_LAN_BLINK_OFF_TIME			1600
+#define LED_SMS_BLINK_ON_TIME			800
+#define LED_SMS_BLINK_OFF_TIME			1200
+#define LED_WAN_BLINK_ON_TIME			200
+#define LED_WAN_BLINK_OFF_TIME			1400
+#define LED_VOIP_BLINK_ON_TIME			400
+#define LED_VOIP_BLINK_OFF_TIME			1600
+
+#define LED_BREATH_BLINK_ON_TIME		300
+#define LED_BREATH_BLINK_OFF_TIME		5000
+//¹úµçÁªÇ¿:PDP¼¤»îSOCKETδÁ¬½Ó1.8sÃð0.2sÁÁ£¬SOCKETÒÑÁ¬½Ó·´Ö®
+#define LED_WAN_FAST_BLINK_ON_TIME		200
+#define LED_WAN_FAST_BLINK_OFF_TIME		1800
+#define LED_WAN_SLOW_BLINK_ON_TIME		1800
+#define LED_WAN_SLOW_BLINK_OFF_TIME		200
+//yaoyuan cpe
+#define LED_WAN_CPE_FAST_BLINK_ON_TIME		500
+#define LED_WAN_CPE_FAST_BLINK_OFF_TIME		500
+#define LED_WAN_CPE_SLOW_BLINK_ON_TIME		500
+#define LED_WAN_CPE_SLOW_BLINK_OFF_TIME		1000
+
+
+
+/*******************************************************************************
+  LEDµÆ¹«¹²¶¨Òå//ÏÂÃæ¼¸¸öÊǶ¨ÒåÁ˺ôÎüµÆÊ±Óõ½µÄ·¾¶
+*******************************************************************************/
+#define ALL_LED_PATH					"/sys/class/leds/battery_led/brightness"
+#define BATTERY_LED_PATH				"/sys/class/leds/battery_led/ledSwitch"
+#define WAN_LED_PATH					"/sys/class/leds/net_led/ledSwitch"
+#define LAN_LED_PATH					"/sys/class/leds/wifi_led/ledSwitch"
+#define SMS_LED_PATH					"/sys/class/leds/sms_led/ledSwitch"
+#define TRAFFIC_LED_PATH				"/sys/class/leds/traffic_led/ledSwitch"
+
+/*
+/×Ö·û´®º¬Òå:µÚһλ: ÑÕÉ« 1-RED 2-GREEN 3-YELLOW 4-BLUE;
+			µÚ¶þλ: ״̬ 0-OFF 1-ON 2-BLINK;
+			µÚÈýËÄλ: Á÷Á¿µÆÁÁµÄ¸öÊý£¬00-09·Ö±ðΪÁÁ1¸öµ½10¸öÁ÷Á¿µÆ£¬10ΪÎÞЧֵ*/
+#define LED_STATE_GREEN_OFF				"2010"
+#define LED_STATE_YELLOW_OFF			"3010"
+#define LED_STATE_BLUE_OFF				"4010"
+#define LED_TRAFFIC_ALL_OFF				"2009"
+
+#define LED_ALL_POWER_ON				"1"
+#define LED_ALL_POWER_OFF				"2"
+
+#define LED_STATE_RED_ON				"1110"
+#define LED_STATE_RED_BLINK				"1210"
+#define LED_STATE_GREEN_ON				"2110"
+#define LED_STATE_GREEN_BLINK			"2210"
+#define LED_STATE_YELLOW_ON				"3110"
+#define LED_STATE_YELLOW_BLINK			"3210"
+#define LED_STATE_BLUE_ON				"4110"
+#define LED_STATE_BLUE_BLINK			"4210"
+
+#define TRAFIIC_LED_1_ON				"2100"
+#define TRAFIIC_LED_1_BLINK				"2200"
+#define TRAFIIC_LED_2_ON				"2101"
+#define TRAFIIC_LED_2_BLINK				"2201"
+#define TRAFIIC_LED_3_ON				"2102"
+#define TRAFIIC_LED_3_BLINK				"2202"
+#define TRAFIIC_LED_4_ON				"2103"
+#define TRAFIIC_LED_4_BLINK				"2203"
+#define TRAFIIC_LED_5_ON				"2104"
+#define TRAFIIC_LED_5_BLINK				"2204"
+#define TRAFIIC_LED_6_ON				"2105"
+#define TRAFIIC_LED_6_BLINK				"2205"
+#define TRAFIIC_LED_7_ON				"2106"
+#define TRAFIIC_LED_7_BLINK				"2206"
+#define TRAFIIC_LED_8_ON				"2107"
+#define TRAFIIC_LED_8_BLINK				"2207"
+#define TRAFIIC_LED_9_ON				"2108"
+#define TRAFIIC_LED_9_BLINK				"2208"
+#define TRAFIIC_LED_10_ON				"2109"
+#define TRAFIIC_LED_10_BLINK			"2209"
+
+
+#define LED_WAN_RED_BRIGHTNESS			"/sys/class/leds/modem_r_led/brightness"
+#define LED_WAN_RED_BLINKSWITCH			"/sys/class/leds/modem_r_led/trigger"
+#define LED_WAN_RED_BLINKTIMEON			"/sys/class/leds/modem_r_led/delay_on"
+#define LED_WAN_RED_BLINKTIMEOFF		"/sys/class/leds/modem_r_led/delay_off"
+
+#define LED_WAN_GREEN_BRIGHTNESS        "/sys/class/leds/modem_g_led/brightness"
+#define LED_WAN_GREEN_BLINKSWITCH		"/sys/class/leds/modem_g_led/trigger"
+#define LED_WAN_GREEN_BLINKTIMEON		"/sys/class/leds/modem_g_led/delay_on"
+#define LED_WAN_GREEN_BLINKTIMEOFF		"/sys/class/leds/modem_g_led/delay_off"
+
+
+#define LED_WAN_BLUE_BRIGHTNESS			"/sys/class/leds/modem_b_led/brightness"
+#define LED_WAN_BLUE_BLINKSWITCH		"/sys/class/leds/modem_b_led/trigger"
+#define LED_WAN_BLUE_BLINKTIMEON		"/sys/class/leds/modem_b_led/delay_on"
+#define LED_WAN_BLUE_BLINKTIMEOFF		"/sys/class/leds/modem_b_led/delay_off"
+
+#define LED_BATTERY_GREEN_BRIGHTNESS	"/sys/class/leds/battery_g_led/brightness"
+#define LED_BATTERY_GREEN_BLINKSWITCH	"/sys/class/leds/battery_g_led/trigger"
+#define LED_BATTERY_GREEN_BLINKTIMEON	"/sys/class/leds/battery_g_led/delay_on"
+#define LED_BATTERY_GREEN_BLINKTIMEOFF	"/sys/class/leds/battery_g_led/delay_off"
+
+#define LED_BATTERY_BLUE_BRIGHTNESS	"/sys/class/leds/battery_b_led/brightness"
+#define LED_BATTERY_BLUE_BLINKSWITCH	"/sys/class/leds/battery_b_led/trigger"
+#define LED_BATTERY_BLUE_BLINKTIMEON	"/sys/class/leds/battery_b_led/delay_on"
+#define LED_BATTERY_BLUE_BLINKTIMEOFF	"/sys/class/leds/battery_b_led/delay_off"
+
+#define LED_BATTERY_RED_BRIGHTNESS		"/sys/class/leds/battery_r_led/brightness"
+#define LED_BATTERY_RED_BLINKSWITCH		"/sys/class/leds/battery_r_led/trigger"
+#define LED_BATTERY_RED_BLINKTIMEON		"/sys/class/leds/battery_r_led/delay_on"
+#define LED_BATTERY_RED_BLINKTIMEOFF 	"/sys/class/leds/battery_r_led/delay_off"
+
+#define LED_SMS_GREEN_BRIGHTNESS		"/sys/class/leds/sms_led/brightness"
+#define LED_SMS_GREEN_BLINKSWITCH		"/sys/class/leds/sms_led/trigger"
+#define LED_SMS_GREEN_BLINKTIMEON		"/sys/class/leds/sms_led/delay_on"
+#define LED_SMS_GREEN_BLINKTIMEOFF		"/sys/class/leds/sms_led/delay_off"
+
+#define LED_SMS_BLUE_BRIGHTNESS		    "/sys/class/leds/sms_led/brightness"
+#define LED_SMS_BLUE_BLINKSWITCH		"/sys/class/leds/sms_led/trigger"
+#define LED_SMS_BLUE_BLINKTIMEON		"/sys/class/leds/sms_led/delay_on"
+#define LED_SMS_BLUE_BLINKTIMEOFF		"/sys/class/leds/sms_led/delay_off"
+
+#define LED_LAN_GREEN_BRIGHTNESS		"/sys/class/leds/wifi_led/brightness"
+#define LED_LAN_GREEN_BLINKSWITCH		"/sys/class/leds/wifi_led/trigger"
+#define LED_LAN_GREEN_BLINKTIMEON		"/sys/class/leds/wifi_led/delay_on"
+#define LED_LAN_GREEN_BLINKTIMEOFF		"/sys/class/leds/wifi_led/delay_off"
+
+#define LED_LAN_BLUE_BRIGHTNESS		    "/sys/class/leds/wifi_led/brightness"
+#define LED_LAN_BLUE_BLINKSWITCH		"/sys/class/leds/wifi_led/trigger"
+#define LED_LAN_BLUE_BLINKTIMEON		"/sys/class/leds/wifi_led/delay_on"
+#define LED_LAN_BLUE_BLINKTIMEOFF		"/sys/class/leds/wifi_led/delay_off"
+
+#define LED_VOIP_BLUE_BRIGHTNESS		"/sys/class/leds/sms_led/brightness"
+#define LED_VOIP_BLUE_BLINKSWITCH		"/sys/class/leds/sms_led/trigger"
+#define LED_VOIP_BLUE_BLINKTIMEON		"/sys/class/leds/sms_led/delay_on"
+#define LED_VOIP_BLUE_BLINKTIMEOFF		"/sys/class/leds/sms_led/delay_off"
+
+#define LED_SIGNAL1_BLUE_BRIGHTNESS		"/sys/class/leds/4g_1_led/brightness"
+#define LED_SIGNAL1_BLUE_BLINKSWITCH	"/sys/class/leds/4g_1_led/trigger"
+#define LED_SIGNAL1_BLUE_BLINKTIMEON	"/sys/class/leds/4g_1_led/delay_on"
+#define LED_SIGNAL1_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_1_led/delay_off"
+
+#define LED_SIGNAL2_BLUE_BRIGHTNESS		"/sys/class/leds/4g_2_led/brightness"
+#define LED_SIGNAL2_BLUE_BLINKSWITCH	"/sys/class/leds/4g_2_led/trigger"
+#define LED_SIGNAL2_BLUE_BLINKTIMEON	"/sys/class/leds/4g_2_led/delay_on"
+#define LED_SIGNAL2_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_2_led/delay_off"
+
+#define LED_SIGNAL3_BLUE_BRIGHTNESS		"/sys/class/leds/4g_3_led/brightness"
+#define LED_SIGNAL3_BLUE_BLINKSWITCH	"/sys/class/leds/4g_3_led/trigger"
+#define LED_SIGNAL3_BLUE_BLINKTIMEON	"/sys/class/leds/4g_3_led/delay_on"
+#define LED_SIGNAL3_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_3_led/delay_off"
+
+#define LED_SIGNAL4_BLUE_BRIGHTNESS		"/sys/class/leds/4g_4_led/brightness"
+#define LED_SIGNAL4_BLUE_BLINKSWITCH	"/sys/class/leds/4g_4_led/trigger"
+#define LED_SIGNAL4_BLUE_BLINKTIMEON	"/sys/class/leds/4g_4_led/delay_on"
+#define LED_SIGNAL4_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_4_led/delay_off"
+
+#define LED_SIGNAL5_BLUE_BRIGHTNESS		"/sys/class/leds/4g_5_led/brightness"
+#define LED_SIGNAL5_BLUE_BLINKSWITCH	"/sys/class/leds/4g_5_led/trigger"
+#define LED_SIGNAL5_BLUE_BLINKTIMEON	"/sys/class/leds/4g_5_led/delay_on"
+#define LED_SIGNAL5_BLUE_BLINKTIMEOFF	"/sys/class/leds/4g_5_led/delay_off"
+
+#define LED_WPS_BLUE_BRIGHTNESS		"/sys/class/leds/wps_led/brightness"
+#define LED_WPS_BLUE_BLINKSWITCH	"/sys/class/leds/wps_led/trigger"
+#define LED_WPS_BLUE_BLINKTIMEON	"/sys/class/leds/wps_led/delay_on"
+#define LED_WPS_BLUE_BLINKTIMEOFF	"/sys/class/leds/wps_led/delay_off"
+
+#define LED_RJ11_BLUE_BRIGHTNESS	"/sys/class/leds/rj11_led/brightness"
+#define LED_RJ11_BLUE_BLINKSWITCH	"/sys/class/leds/rj11_led/trigger"
+#define LED_RJ11_BLUE_BLINKTIMEON	"/sys/class/leds/rj11_led/delay_on"
+#define LED_RJ11_BLUE_BLINKTIMEOFF	"/sys/class/leds/rj11_led/delay_off"
+
+#define LED_RJ45_GREEN_BRIGHTNESS	"/sys/class/leds/eth_led/brightness"
+#define LED_RJ45_GREEN_BLINKSWITCH	"/sys/class/leds/eth_led/trigger"
+#define LED_RJ45_GREEN_BLINKTIMEON	"/sys/class/leds/eth_led/delay_on"
+#define LED_RJ45_GREEN_BLINKTIMEOFF	"/sys/class/leds/eth_led/delay_off"
+
+
+#define LED_BLINKON_STATE               "timer"
+#define LED_BLINKOFF_STATE              "none"
+
+
+//¸ºÔØÂ·¾¶ÅäÖÃ
+#define BOOST_LOAD_STATUS_PATH			"/sys/class/power_supply/boost/online"
+
+//µçѹÁÙ½çÖµ
+
+//zdm ¶ÔÓÚÏÂÃæ¼¸¸öºêÖµ£¬Ôݲ»½øÐÐÆ½Ì¨»¯£¬ºóÆÚÒ»µ©ÓÐÐèÇó½øÐÐÐ޸ģ¬ÔòÖ±½ÓÌá³Énv½øÐпØÖÆ
+#define POWEROFFLEVEL           		3300        //µÍÓڴ˵çѹֵ×Ô¶¯¹Ø»ú
+#define POWERONLEVEL           			3400       //µÍÓڴ˵çѹֵ²»ÄÜ¿ª»ú
+#define DISCHARGELEVEL					3600		//µÍÓڴ˵çѹֵ·ÅµçµçÁ÷ÉèΪ0.5A
+#define CHARGINGLEVEL					3800		//¸ßÓڴ˵çѹֵ·ÅµçµçÁ÷ÉèΪ1.5A
+
+#define CHECK_POWER_TIME_INTERVAL      	60000
+#define GET_TEMP_INTERVAL_TIME		    20000//ms
+
+//WIFIÐÅÏ¢¶¨Òå
+#define WIFI_STATE_PATH				"/etc_rw/wifiStatus"
+#define WPS_STATE_PATH				"/etc_rw/wpsStatus"
+#define WPS_STATEEX_PATH			"/etc_rw/wpsdisplayStatus"
+#define QRCODE_STATE_PATH			"/etc_rw/qrStatus"
+#define WIFI_STATION_PATH			"/etc_rw/staStatus"
+#define WIFI_DATA_VA0		        "wlan0-va0"
+#define WIFI_DATA_VA1		        "wlan0-va1"
+#define WIFI_TXBYTE		            0//·¢ËÍÊý¾Ý
+#define WIFI_RXBYTE		            2//½ÓÊÕÊý¾Ý
+#define WIFICODE_MAIN_PATH          "/etc_rw/wifi/ssid_wifikey.bmp"
+#define WIFICODE_GUST1_PATH         "/etc_rw/wifi/multi_ssid_wifikey.bmp"
+
+
+
+/*******************************************************************************
+ÓïÒôÌáʾָʾµÆ×´Ì¬¶¨Òå
+*******************************************************************************/
+#define VOIP_IN_CALL                "ledon"
+#define VOIP_IN_CONNECTION          "ledblink"
+#define VOIP_HANG_UP                "ledoff"
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_common.h b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_common.h
new file mode 100755
index 0000000..7150999
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_common.h
@@ -0,0 +1,1326 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_led.h
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMIÍ·Îļþ
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <time.h>
+#include <sys/prctl.h>
+#include "softap_api.h"
+#include "soft_timer.h"
+#include "mmi_cfg.h"
+
+#ifndef DISABLE_LCD
+#include "os_type.h"
+#include "gui_common.h"
+#endif
+
+#include "cfg_api.h"
+#include "cfg_nv_def.h"
+
+#ifndef __MMI_COMMON_H
+#define __MMI_COMMON_H
+#define MMI_SOFTTIMER_DEBUG     1
+/*******************************************************************************
+  ¸÷Ä£¿é¶¨ÒåµÄNV ͳһ»ã×Ü
+*******************************************************************************/
+#define MMI_BAT_VOLTAGE_LEN				21
+
+/*******************************************************************************
+  MMI ¹«¹²×Ö·û´®Í³Ò»¶¨Òå
+*******************************************************************************/
+#define INVALID_STR ""
+
+/*******************************************************************************
+  MMI ·µ»ØÖµ¶¨Òå
+*******************************************************************************/
+#define MMI_SUCCESS						0x0
+#define MMI_ERROR						-1
+
+#define MMI_WAIT_FOREVER 				0XFFFFFFFF
+#define MMI_THREAD_INVALID_ID  			0XFFFFFFFF
+#define MMI_SEMA_INVALID_ID  			0xFFFFFFFF
+#define MMI_MUTEX_INVALID_ID            0xFFFFFFFF
+
+
+/*******************************************************************************
+  MMI LOG¿ª¹Ø¡¢´æ´¢Â·¾¶¡¢³¤¶È
+*******************************************************************************/
+#define MMI_FILE_DEBUG 				0
+#define MMI_SERIAL_DEBUG 			1
+#define MMI_DEBUG 					1
+
+#define MMI_LOG_FILE_PATH         "/etc_rw/config/mmi.log"
+#define MMI_LOG_OLD_FILE_PATH     "/etc_rw/config/oldmmi.log"
+
+#define MMI_MAX_PRINT_LEN	      256
+#define MMI_MAX_LOG_LENGTH 	      524288
+
+/*******************************************************************************
+  MMI ʹÓÃÉ豸Ãû³Æ
+*******************************************************************************/
+
+#define  KPD_DEV    					"kpd"
+#define  RTC_DEV    					"rtc"
+#define  LED_DEV    			  		"led"
+#define  CHG_DEV                        "charger"
+
+#define LCD_PATH 						"/dev/fb0"
+#define LCD_MAGIC 						 'L'
+#define LEADT15DS26_SET_BACKLIGHT		_IOW(LCD_MAGIC, 2, unsigned int)
+
+
+/*******************************************************************************
+ MMI ¶¨Ê±Æ÷¶¨Òå
+*******************************************************************************/
+#define SET_BACKLIGHT_HALFBRIGHT_TIMER	80
+#define SET_TIME_CHECK_TIMER			81
+#define SET_WIFI_STANUM_CHECK_TIMER		82
+#define SET_WPS_TIP_CHECK_TIMER         83
+#define SET_TIP_CHECK_TIMER				84
+#define SET_MMI_IDLE_TIMER				85
+#define SET_SSID_SHOW_TIMER				86
+#define SET_SMS_TIP_TIMER				87
+#define SET_TRAFFIC_INFO_WAIT_TIMER     88
+#define SET_MMI_FAST_POWERON_IDLE_TIMER	89
+#define SET_WIFI_DATA_CHECK_TIMER	    90
+#define SET_RJ45_INFO_WAIT_TIMER        91
+
+
+#define SET_TIME_CHECK_TIME         	1000
+#define SET_WIFI_STANUM_CHECK_TIME      3000
+#define SET_WPS_TIP_CHECK_TIME         	2000
+#define SET_TIP_CHECK_TIME         		1000
+#define SET_MMI_IDLE_TIME				20000
+#define SET_BACKLIGHT_HALFBRIGHT_TIME	5000
+#define SET_SSID_SHOW_TIME				20000
+#define SET_SMS_TIP_TIME				10000
+#define SET_TRAFFIC_INFO_WAIT_TIME      10000
+#define SET_MMI_FAST_POWERON_IDLE_TIME	4000
+#define SET_WIFI_DATA_CHECK_TIME	    3000
+#define SET_RJ45_INFO_WAIT_TIME         2000
+
+/*******************************************************************************
+MMI ³äµçÒµÎñÅäÖÃ
+*******************************************************************************/
+#define CHARGE_STATUS_PATH			  	"/sys/class/power_supply/charger/status"
+#define CHARGING_TYPE_PATH				"/sys/class/power_supply/charger/pc1_ac2"
+#define USB_INSERT_STATUS_PATH			"/sys/class/power_supply/charger/online"
+#define CHARGE_VOLTAGE_PATH				"/sys/class/power_supply/battery/voltage_now"
+#define CHARGE_BAT_TEMP_PATH 			"/sys/class/power_supply/battery/temp"
+#define CHARGE_BAT_HEALTH_PATH 			"/sys/class/power_supply/battery/health"
+#define CHARGE_BAT_STATUS_PATH 			"/sys/class/power_supply/battery/online"
+
+#define MMI_SET_FAKEPOWEROFF_CHARGER    "echo 1 > /sys/class/power_supply/charger/quick_power_on"
+#define MMI_CAN_FAKEPOWEROFF_CHARGER    "echo 0 > /sys/class/power_supply/charger/quick_power_on"
+
+#define MMI_TURN_OFF_CHG_FULL  		    "echo 2 > /sys/class/power_supply/charger/charge_enabled"
+#define MMI_TURN_OFF_CHG  		        "echo 0 > /sys/class/power_supply/charger/charge_enabled"
+#define MMI_TURN_ON_CHG	  		        "echo 1 > /sys/class/power_supply/charger/charge_enabled"
+
+#define MMI_TURN_OFF_DISCHG  	        "echo 0 > /sys/class/power_supply/boost/boost_enabled"
+#define MMI_TURN_ON_DISCHG	  	        "echo 1 > /sys/class/power_supply/boost/boost_enabled"
+
+#define MMI_DISCHG_LOW_CURRENT  	    "echo 5 > /sys/class/power_supply/boost/current_now"
+#define MMI_DISCHG_HIGH_CURRENT	        "echo 15 > /sys/class/power_supply/boost/current_now"
+
+#define USB_SET_ROLE_DEF_SRC		"echo 4 > /sys/class/tcpc/type_c_port0/role_def"
+#define USB_SET_ROLE_DEF_SNK		"echo 5 > /sys/class/tcpc/type_c_port0/role_def"
+
+#define USB_TYPE_AC_PC_CHECK		"cat /sys/class/power_supply/charger/pc1_ac2 | grep PC"
+#define USB_PE_READY_CHECK			"cat /sys/class/tcpc/type_c_port0/pe_ready | grep yes"
+
+#define CHARGE_STATUS_CHARGING		 	"Charging"
+#define CHARGE_STATUS_FULL		 	 	"Full"
+#define CHARGE_STATUS_NOTCHARGING		"Not charging"
+#define CHARGE_STATUS_DISCHARGING		"Discharging"
+
+#define CHARGING_TYPE_PC				"USB"
+#define CHARGING_TYPE_ADAPTER			"Mains"
+#define CHARGING_TYPE_UNKNOWN			"Unknown"
+
+#define TEMP_STATUS_GOOD				"Good"
+#define TEMP_STATUS_OVERHEAT			"Overheat"
+#define TEMP_STATUS_DEAD				"Dead"
+#define TEMP_STATUS_OVER_VOLTAGE		"Over voltage"
+#define TEMP_STATUS_FAIL				"Unspecified failure"
+#define TEMP_STATUS_COLD				"Cold"
+#define TEMP_STATUS_WARM				"Warm"
+#define TEMP_STATUS_COOL				"Cool"
+#define TEMP_STATUS_UNKNOWN			    "Unknown"
+
+#define USB_STATUS_IN					"1"
+#define USB_STATUS_OUT					"0"
+
+#define CHARGE_STATUS_LENGTH				16
+#define CHARGING_TYPE_LENGTH				8
+#define CHARGE_VOLTAGE_LENGTH				8
+
+#define CHARGE_STATUS_CHARGING_LENGTH		8
+#define CHARGE_STATUS_FULL_LENGTH		 	4
+#define CHARGE_STATUS_NOTCHARGING_LENGTH	12
+#define CHARGE_STATUS_DISCHARGING_LENGTH	11
+
+/*******************************************************************************
+ MMI ÈÎÎñ¶¨Òå
+*******************************************************************************/
+
+
+typedef enum {
+	MMI_TASK_CTRL = 0,//¿ª»ú±ØÐëʱµÚһλ£¬È·±£¿ª»ú¶¯»­ÏÈ»æÖÆ
+	MMI_TASK_BATTERY,
+	MMI_TASK_NET,
+	MMI_TASK_WIFI,
+	MMI_TASK_SMS,
+	MMI_TASK_VOIP,
+	MMI_TASK_TRAFFIC,
+	MMI_TASK_POWEROFF_CHARGER,
+	MMI_TASK_TIP_NET_CONNECT,
+	MMI_TASK_TIP_WIFISTATION,
+	MMI_TASK_TIP_WPS,
+	MMI_TASK_TIP,
+	MMI_TASK_SSID,
+	MMI_TASK_TIP_FOTA,
+	MMI_TASK_POWER,
+	MMI_TASK_WIFICODE,
+	MMI_TASK_NETSIGNAL, //yaoyuan cpe
+	MMI_TASK_LED_WPS, //yaoyuan cpe MMI_TASK_TIP_WPS
+	MMI_TASK_RJ11, //yaoyuan cpe
+	MMI_TASK_TIME,
+	MMI_TASK_KEY,
+	MMI_TASK_USB_MODE,
+	MMI_TASK_RJ45,
+	MMI_TASK_VERSION,
+	MMI_TASK_TEXT_CONNECT,
+	MMI_TASK_LOGO,
+	MMI_TASK_MAX
+} E_zMmi_Task;
+
+#define MMI_TASK_INVALID  -1
+//¶¨Ò庯ÊýÖ¸ÕëÀàÐÍ
+typedef SINT32(*MMI_TASK_REGISTER_FUNC)(void);
+typedef void (*MMI_TASK_INIT_FUNC)(void);
+
+/*******************************************************************************
+ MMI ÏÔʾģʽ¶¨Òå
+*******************************************************************************/
+typedef enum {
+	MMI_MODE_LED = 1,
+	MMI_MODE_LCD,
+	MMI_MODE_ALL
+} E_zMmiShowMode;
+
+
+/*******************************************************************************
+ MMI ÏûÏ¢¶¨Òå
+*******************************************************************************/
+
+#define NV_CONTENT_LEN 						1024
+
+
+/*******************************************************************************
+  LEDµÆÊ¡µçÏà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	//public
+	MMI_ACTIVE_MODE = 0,
+	MMI_IDLE_LEDOFF_MODE,
+	MMI_IDLE_CHG_LEDOFF_MODE,
+	MMI_IDLE_STANDBY_LEDOFF_MODE,
+	MMI_FAKE_POWEROFF_MODE,
+	MMI_FAKE_POWEROFF_CHARGE_MODE,
+
+	//LED
+	MMI_ALL_LED_ON_MODE,
+	MMI_ALL_LED_OFF_MODE,
+	MMI_POWEROFF_ON_MODE,
+	MMI_POWEROFF_OFF_MODE,
+
+
+	//LCD
+	MMI_BACKLIGHT_OFF_MODE,
+	MMI_BACKLIGHT_HALFBRIGHT_MODE,
+	MMI_POWERON_MODE,
+	MMI_POWEROFF_MODE,
+	MMI_RESET_MODE,
+	MMI_RESTART_MODE,
+	MMI_FAST_POWERON_MODE,
+} E_zMmi_Work_Mode;
+
+/*
+¿ØÖÆÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	E_zMmi_Work_Mode lcdmode;
+	E_zMmi_Work_Mode ledmode;
+} T_zMMICtrlInfo;
+
+#define MMI_MAIN_LOCK_ID				"mmi_main_lock"
+#define MMI_POWEROFF_LOCK_ID			"mmi_powerdown_lock"//¹Ø»ú¡¢»Ö¸´³ö³§ÉèÖá¢ÖØÆô¡¢¹Ø»ú³äµç¿ª»ú
+#define MMI_GET_POWER_LOCK_ID			"mmi_get_power_lock"//20Sζȼì²â/µÍµç¼ì²â
+#define MMI_POWEROFF_LOCK_LCD_ID		"mmi_poweroff_charger_lock"//³õʼ»¯¡¢°´¼ü--  --ÃðÆÁ
+
+
+/*******************************************************************************
+  LCDÌáʾ¶¨Òå ÍøÂçÁ¬½Ó¡¢SIM¿¨×´Ì¬µÈ
+*******************************************************************************/
+typedef enum {
+	INSERT_SIM = 0,
+	PIN_LOCK,
+	PUK_LOCK,
+	SIM_BUSY,
+	INVALID_SIM,
+	SIM_LOCK,
+	SIM_READY,
+
+	SIM_MAX
+}
+E_zMmi_Sim_Tip;
+
+typedef enum {
+	NET_DISCONNECTED = 0,
+	NET_CONNECTED,
+	NET_CONNECTING,
+	NET_DISCONNECTING,
+	NET_NOSERVICE,
+	NET_LIMITSERVICE,
+	NET_SEARCHING,
+	NET_MAX
+} E_zMmi_NetCon_Tip;
+
+typedef enum {
+	WPS_ACTIVING = 0,
+	WPS_ACTIVED,
+	WPS_DEACTIVING,
+	WPS_DEACTIVED,
+	WPS_FAIL,
+	WPS_ACTIVE_MAX
+} E_zMmi_WpsAct_Tip;
+
+
+typedef struct {
+	E_zMmi_Sim_Tip sim_tip;
+	E_zMmi_NetCon_Tip net_tip;
+	CHAR* net_pro;
+	//CHAR* update_result;//zk add for fota update result
+	//SINT32 update_tip;
+} T_zMMITipInfo;
+
+typedef enum {
+	FOTA_DOWNLOADING = 0,
+	FOTA_DOWNLOAD_FAILED,
+	FOTA_DOWNLOAD_OK,
+	FOTA_DOWNLOAD_LOWBATTERY,
+	FOTA_UPDATE_SUCCESS,
+	FOTA_UPDATE_FAILED,
+	FOTA_SHOW_FINISH,
+	FOTA_MAX
+} E_zMMI_Fota_Tip;
+
+typedef enum {
+	FOTA_UPDATE = 0,
+	FOTA_CANCEL
+} E_zMmi_Fota_Oper;
+
+typedef struct {
+	SINT32 fota_update;
+	E_zMMI_Fota_Tip fota_tip;
+	E_zMmi_Fota_Oper fota_oper;
+} T_zMMIFotaInfo;
+
+typedef struct {
+	CHAR *ssid;
+	CHAR *wifi_key;
+	CHAR *ssid2;
+	CHAR *wifi_key2;
+} T_zMMISSIDInfo;
+
+typedef struct {
+	CHAR *msisdn;
+	CHAR *pci;
+	CHAR *rapr_dBm;
+	CHAR *sinr_dB;
+} T_zMMINetSignalInfo;
+
+typedef struct {
+	CHAR *firmware_version;
+	CHAR *hardware_version;
+} T_zMMIVERSIONInfo;
+
+typedef struct {
+	int exist;
+} T_zMMITEXTCONNECTInfo;
+
+typedef struct {
+	int exist;
+} T_zMMILOGOInfo;
+
+/*
+ʱ¼äÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL mode;//ʱ¼äÖÆÊ½ true--24Ð¡Ê±ÖÆ false--12Ð¡Ê±ÖÆ
+	CHAR* hour;
+	CHAR* minute;
+	//CHAR* quota;
+} T_zMMITimeInfo;
+
+/*******************************************************************************
+µç³ØÐÅÏ¢¶¨Òå
+*******************************************************************************/
+//webui³äµç״̬NV
+#define WEBUICHARGESTATTUS      		"battery_charging"        					///1:³äµç״̬ 0:·Ç³äµç״̬
+#define WEBUICHARGING           		"1"
+#define WEBUIUNCHARGING        			"0"
+
+//webuiµÄµç³Ø¸ñÊýNV
+#define WEBUIBATTERYLEVEL       		"battery_pers"
+#define WEBUINOLEVEL            		"0"
+#define WEBUIONELEVEL           		"1"
+#define WEBUITWOLEVEL           		"2"
+#define WEBUITHRLEVEL           		"3"
+#define WEBUIFOURLEVEL         	 		"4"
+#define WEBUIFULLLEVEL         	 		"100"
+#define WEBUINOBATTERY         	 		"-1"
+
+//wifi Monitorµç³Ø°Ù·Ö±È
+#define BATTERYPERS_NV					"battery_vol_percent"
+
+typedef enum {
+	STATE_FULL = 0,
+	STATE_CHARGING,
+	STATE_DISCHARGE,
+	STATE_CHARGERROR,
+	STATE_CHARGE_MAX
+} E_zMmi_Charge_State;
+
+typedef enum {
+	CHARGING_PC = 0,
+	CHARGING_ADAPTER,
+	CHARGING_TYPE_MAX,
+} E_zMmi_Charge_Type;
+
+typedef enum {
+	VOLT_5PERCENTLEVEL = 0,
+	VOLT_10PERCENTLEVEL,
+	VOLT_20PERCENTLEVEL,
+	VOLT_25PERCENTLEVEL,
+	VOLT_50PERCENTLEVEL,
+	VOLT_75PERCENTLEVEL,
+	VOLT_NORMALLEVEL,
+	VOLT_MAX,
+} E_zMmi_Voltage_level;
+
+typedef struct {
+	CHAR* devString;
+	E_zMmi_Charge_State chg_sta;
+} T_zMmiChgStateStringItem;
+
+
+typedef enum {
+	MODE_STANDBY = 0,
+	MODE_CHARGING,
+	MODE_LOWBATTERY_20,
+	MODE_LOWBATTERY_10,
+	MODE_OFF
+} E_zMMI_BatLed_Mode;
+
+/*µç³ØÐÅÏ¢½á¹¹*/
+typedef struct {
+	E_zMmi_Charge_State chg_state;
+	E_zMmi_Voltage_level bat_level;
+	SINT32 bat_pers;
+	SINT32 bat_grid;
+} T_zMMIBatteryInfo;
+
+
+//ζȼì²â
+typedef enum {
+	MMI_TEMP_DETECT_ERROR = 0,
+	MMI_TEMP_DETECT_ABNORMAL,
+	MMI_TEMP_DETECT_NORMAL,
+	MMI_TEMP_DETECT_MAX
+} MMI_TEMP_DETECT;
+
+//¹Ø»ú³äµç
+typedef enum {
+	POC_STATE_CHARGING = 0,
+	POC_STATE_FULL,
+	POC_STATE_LOWBATTERY,
+	POC_STATE_NOBATTERY,
+	POC_STATE_TEMP_ERROR,
+	POC_STATE_MAX
+} E_zMmi_Poc_State;
+
+typedef enum {
+	POC_CHARGING_PC = 0,
+	POC_CHARGING_ADAPTER,
+	POC_CHARGING_TYPE_MAX
+} E_zMmi_Poc_Type;
+
+typedef struct {
+	SINT32 backlight_sta;
+	E_zMmi_Poc_State poc_sta;
+	BOOL overvoltage_mode;
+} T_zMmi_Poc_Info;
+
+/*******************************************************************************
+  ÍøÂçÐÅÏ¢¶¨Òå
+*******************************************************************************/
+typedef enum {
+	NET_MODE_DEFAULT = 0,
+	NET_MODE_2G,
+	NET_MODE_3G,
+	NET_MODE_4G,
+	NET_MODE_NOSERVICE,
+	NET_MODE_LIMITSERVICE,
+	NET_MODE_NOTREADY //yaoyuan
+} E_zMmi_Net_Mode;
+
+typedef enum {
+	NET_STATE_DISCONNECTED = 0,
+	NET_STATE_CONNECTED,
+	NET_STATE_CONNECTING,
+	NET_STATE_DISCONNECTING,
+	NET_STATE_NOSERVICE,
+	NET_STATE_LIMITSERVICE,
+	NET_STATE_SEARCHING,
+	NET_STATE_MAX
+} E_zMmi_Net_State;
+
+typedef enum {
+	NET_SIGNAL_DEFAULT = 0,
+	NET_SIGNAL_NORMAL,
+	NET_SIGNAL_WEAK
+} E_zMmi_Net_Signal;
+
+typedef enum {
+	NET_SOCKET_INACTIVE = 0,
+	NET_SOCKET_ACTIVE
+} E_zMmi_Net_Socket;
+
+
+/*ÍøÂçÐÅÏ¢½á¹¹*/
+
+typedef struct {
+	E_zMmi_Net_Mode net_mode;
+	E_zMmi_Net_State connect_status;
+	SINT32 signal_num;
+	SINT32 signal_weak;
+	SINT32 roam_mode;
+	E_zMmi_Net_Socket socket_state;
+} T_zMMINetInfo;
+
+
+#define WD_NUM 						    5    //wifi ¼à¿ØÎļþ¸öÊý
+#define WIFI_TURN_ON 					"1"  //wifi operate type
+#define WIFI_TURN_OFF 					"0"  //wifi operate type
+#define WIFI_TURN_OFF_FAKE_POWEROFF		"2"  //wifi operate type
+
+
+struct st_files {
+	char *filename;
+	int wd;
+};
+
+typedef struct {
+	BOOL wifiState;
+	BOOL wpsState;
+	BOOL mIsConnectUser;
+} T_zMmi_LanLed_Info;
+
+typedef enum {
+	WIFI_OFF = 0,
+	WIFI_ON
+} E_zMmi_Wifi_State;
+
+typedef enum {
+	WPS_OFF = 0,
+	WPS_ON
+} E_zMmi_Wps_State;
+
+typedef enum {
+	NO_USER_CONNECTED = 0,
+	USER_CONNECTED
+} E_zMmi_Wifi_ConState;
+typedef enum {
+	WIFISTATION_OFF = 0,
+	WIFISTATION_ON
+} E_zMmi_WifiStation_State;
+typedef enum {
+	WIFICODE_MAIN = 0,
+	WIFICODE_GUST1
+} E_zMmi_WifiCode_State;
+
+
+/*
+wifiÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL wifi_state;
+	BOOL wifidata_state;
+	SINT32 Isconnected_user;
+	SINT32 connected_userNum;
+	E_zMmi_WpsAct_Tip wps_state;
+} T_zMMIWifiInfo;
+/*
+wifistationÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL wifistation_connect_state;
+	SINT32 signal_num;
+	CHAR *wifista_ssid;
+} T_zMMIWifiStationInfo;
+/*
+wificodeÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL multi_ssid_switch;
+	BOOL is_wificode_exist;
+} T_zMMIWifiCodeInfo;
+
+/*******************************************************************************
+ Á÷Á¿ÐÅÏ¢¶¨Òå
+*******************************************************************************/
+typedef enum {
+	TRAFFIC_UNIT_DATA = 0,
+	TRAFFIC_UNIT_TIME,
+
+	TRAFFIC_UNIT_MAX
+} MMI_TRAFFIC_UNIT;
+
+typedef enum {
+	TRAFFIC_LIMIT_SWITCH_OFF = 0,
+	TRAFFIC_LIMIT_SWITCH_ON,
+} MMI_TRAFFIC_SWITCH;
+
+typedef enum {
+	TRAFFIC_DATA_UNIT_MAX = 0,
+	TRAFFIC_DATA_UNIT_MB,
+	TRAFFIC_DATA_UNIT_GB,
+	TRAFFIC_DATA_UNIT_TB
+} E_ZMmi_Traffic_Data_Unit;
+
+typedef enum {
+	TRAFFIC_LED_1 = 0,
+	TRAFFIC_LED_2,
+	TRAFFIC_LED_3,
+	TRAFFIC_LED_4,
+	TRAFFIC_LED_5,
+	TRAFFIC_LED_6,
+	TRAFFIC_LED_7,
+	TRAFFIC_LED_8,
+	TRAFFIC_LED_9,
+	TRAFFIC_LED_10,
+	TRAFFIC_LED_MAX
+} MMI_TRAFFIC_LED;
+
+/*
+trafficÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	MMI_TRAFFIC_SWITCH traffic_switch;
+	MMI_TRAFFIC_UNIT traffic_unit;
+	E_ZMmi_Traffic_Data_Unit data_unit;
+	E_ZMmi_Traffic_Data_Unit useddata_unit;
+	MMI_TRAFFIC_LED led_status;
+	SINT32 warning_tip_flag ;
+	UINT32 warning_tip_level;
+	float total_traffic;
+	float uesd_traffic;
+} T_zMMITrafficInfo;
+/*
+ÒÆ¶¯ÔËÓªÉÌtrafficÐÅÏ¢½á¹¹
+*/
+typedef struct {
+	BOOL main_used_valid;//˵Ã÷main usedÊý¾ÝÊÇ·ñÓÐЧ
+	SINT32 main_left_traffic;
+	SINT32 main_total_traffic;
+	//BOOL bonus_used_valid;//˵Ã÷bonus usedÊý¾ÝÊÇ·ñÓÐЧ
+	//FLOAT bonus_uesd_traffic;
+	//FLOAT bonus_total_traffic;
+} T_zMMIQuotaTrafficInfo;
+
+
+/*******************************************************************************
+ ¶ÌÐÅÐÅÏ¢Ïà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	SMS_RECVBOX_STATUS_UNREAD = 0,
+	SMS_RECVBOX_STATUS_NEW,
+	SMS_RECVBOX_STATUS_FULL,
+	SMS_RECVBOX_STATUS_NOR
+} E_zMmi_Sms_Recvbox_Status;
+
+typedef struct {
+	SINT32 mSmsNum;
+	E_zMmi_Sms_Recvbox_Status recvBox_sta;
+} T_zMmi_Sms_Info;
+
+/*******************************************************************************
+ ÓïÒôÌáʾÐÅÏ¢Ïà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	VOIP_STATUS_IN_CALL = 0,
+	VOIP_STATUS_IN_CONNECTION,
+	VOIP_STATUS_HANG_UP,
+	VOIP_STATUS_NOR
+} E_zMmi_Voip_Status;
+
+typedef struct {
+	E_zMmi_Voip_Status voip_sta;
+} T_zMmi_Voip_Info;
+
+/*******************************************************************************
+ rj11²å°ÎÐÅÏ¢Ïà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	RJ11_STATUS_OUT = 0,
+	RJ11_STATUS_IN,
+	RJ11_STATUS_NOR
+} E_zMmi_Rj11_Status;
+
+typedef struct {
+	E_zMmi_Rj11_Status rj11_sta;
+} T_zMmi_Rj11_Info;
+
+/*******************************************************************************
+ rj45²å°ÎÐÅÏ¢Ïà¹Ø¶¨Òå
+*******************************************************************************/
+typedef enum {
+	RJ45_STATUS_OUT = 0,
+	RJ45_STATUS_IN,
+	RJ45_STATUS_NOR
+} E_zMmi_Rj45_Status;
+
+typedef struct {
+	E_zMmi_Rj45_Status rj45_sta;
+} T_zMmi_Rj45_Info;
+
+/*******************************************************************************
+  LEDµÆ¹«¹²¶¨Òå
+*******************************************************************************/
+
+typedef enum {
+	LED_STATE_ON = 0,
+	LED_STATE_OFF,
+	LED_STATE_BLINK,
+	LED_STATE_MAX
+} MMI_LED_STATE;
+
+typedef enum {
+	LED_STATE_DEFAULT_BLINK,
+	LED_STATE_FAST_BLINK,
+	LED_STATE_SLOW_BLINK,
+	LED_STATE_BAT_BLINK,
+	LED_STATE_SMS_BLINK,
+	LED_STATE_VOIP_BLINK,
+	LED_STATE_LAN_BLINK,
+	LED_STATE_WAN_BLINK,
+	LED_STATE_WAN_FAST_BLINK,
+	LED_STATE_WAN_SLOW_BLINK,
+	LED_STATE_WAN_CPE_FAST_BLINK,
+	LED_STATE_WAN_CPE_SLOW_BLINK
+} MMI_LED_BLINK_SPEED;
+
+
+typedef enum {
+	LED_WAN = 0,
+	LED_LAN,
+	LED_BATTERY,
+	LED_SMS,
+	LED_VOIP,
+	LED_TRAFFIC,
+	LED_SIGNAL,
+	LED_WPS,
+	LED_RJ11,
+	LED_RJ45,
+	LED_ALL
+} MMI_LED_NAME;
+
+typedef enum {
+	LED_COLOR_RED = 0,
+	LED_COLOR_GREEN,
+	LED_COLOR_YELLOW,
+	LED_COLOR_BLUE,
+
+	MAX_LED_COLOR //kw 3
+} MMI_LED_COLOR;
+
+typedef struct {
+	UINT32 uBlinkOnTime;
+	UINT32 uBlinkOffTime;
+} T_zMmi_Led_Blink_Time;
+
+typedef struct {
+	MMI_LED_NAME led_name;
+	MMI_LED_STATE led_state;
+	MMI_LED_BLINK_SPEED ledBlink_speed;
+	T_zMmi_Led_Blink_Time ledBlink_time;
+	MMI_LED_COLOR led_color;
+	MMI_TRAFFIC_LED traffic;
+} T_zMmi_Led_Info;
+
+typedef struct {
+	char *fileblinkSwitch;
+	char *fileblinktimeon;
+	char *fileblinktimeoff;
+	char *timeon;
+	char *timoff;
+} T_zMmi_LedBlink_Info;
+
+typedef enum {
+	LED_RED_ON,
+	LED_RED_BLINK,
+
+	LED_GREEN_ON,
+	LED_GREEN_BLINK,
+
+	LED_YELLOW_ON,
+	LED_YELLOW_BLINK,
+
+	LED_BLUE_ON,
+	LED_BLUE_BLINK,
+
+	LED_BLUE1_ON,
+	LED_BLUE2_ON,
+	LED_BLUE3_ON,
+	LED_BLUE4_ON,
+	LED_BLUE5_ON,
+
+	LED_ALL_OFF,
+} MMI_LED_LASTSTATE;
+
+/**************************LED ÅäÖñí½á¹¹Ìå*****************************************************/
+
+typedef struct {
+	T_zMmi_Sms_Info sms_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiSmsLedConfig;
+
+typedef struct {
+	T_zMmi_Voip_Info voip_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiVoipLedConfig;
+
+typedef struct {
+	T_zMmi_Rj11_Info rj11_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiRj11LedConfig;
+
+typedef struct {
+	T_zMmi_Rj45_Info rj45_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiRj45LedConfig;
+
+typedef struct {
+	int custom_type;
+	T_zMMINetInfo net_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiNetLedConfig;
+
+typedef struct {
+	T_zMMIBatteryInfo bat_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiBatteryLedConfig;
+
+typedef struct {
+	int custom_type;
+	T_zMMIWifiInfo wifi_info;
+	T_zMmi_Led_Info led_info;
+} T_zMmiWifiLedConfig;
+
+
+/*******************************************************************************
+ °´¼üÏà¹Ø¶¨Òå
+*******************************************************************************/
+#define KPD_PATH 						"/dev/event0"
+#define KEY_POWER_CODE              116
+#define KEY_WPS_CODE                117
+#define KEY_RESET_CODE              118
+#define KEY_WIFI_CODE               119 //ҢԶcpe
+
+
+
+typedef enum {
+	KEY_STATUS_MAX = 0,				/*ÎÞЧ״̬*/
+	KEY_STATUS_UP,                  /*°´¼üËÉ¿ª*/
+	KEY_STATUS_DOWN,                /*°´¼ü°´ÏÂ*/
+	KEY_STATUS_LONGPRESS,            /*°´¼ü³¤°´*/
+} KEY_STATUS;
+
+typedef enum {
+	KEY_TYPE_POWER = 0,					/*power ¼ü*/
+	KEY_TYPE_RESET, 					/*reset ¼ü*/
+	KEY_TYPE_WPS,				        /*wps ¼ü*/
+	KEY_TYPE_WIFI,				        /*wifi ¼ü, ¿ª¹Ø Ò¢Ô¶cpe*/
+} KEY_TYPE;
+
+typedef struct {
+	KEY_TYPE    type;               /*°´¼üÀàÐÍ*/
+	KEY_STATUS  status;             /*°´¼ü״̬*/
+} MMI_KP_INFO;
+
+
+/*******************************************************************************
+ ¿ò¼ÜÏà¹Ø¶¨Òå
+*******************************************************************************/
+
+
+/*»ñȡҵÎñÐÅÏ¢º¯ÊýÖ¸Õë
+appInfo:³ö²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_GET_TASKINFO_FUNC)(UINT32 taskInfo);
+
+/*»ñÈ¡ledÏÔʾÐÅÏ¢º¯ÊýÖ¸Õë
+appInfo:Èë²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+outLedInfo:³ö²Î£¬ledÏÔʾÐÅÏ¢
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_GET_LEDINFO_FUNC)(UINT32 taskInfo, UINT32 outLedInfo);
+
+/*»ñÈ¡lcdÏÔʾÐÅÏ¢º¯ÊýÖ¸Õë
+appInfo:Èë²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+outLcdInfo:³ö²Î£¬lcdÏÔʾÐÅÏ¢
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_GET_LCDINFO_FUNC)(UINT32 taskInfo);
+/*ÏÔʾLED
+ledInfo:Èë²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_SHOW_LED_FUNC)(UINT32 ledInfo);
+/*ÏÔʾLCD
+lcdInfo:Èë²Î£¬ÒµÎñÐÅÏ¢£¬Èç¹ûÊÇÊý¾Ý½á¹¹Ôò¸ÃÖµÖ¸ÏòÊý¾Ý½á¹¹µØÖ·
+·µ»ØÕýÈ·»ò´íÎó
+*/
+typedef SINT32(*MMI_SHOW_LCD_FUNC)(UINT32 lcdInfo);
+
+/*¸Ã½á¹¹ÌåÓÃÓÚ±£´æÃ¿¸öÒµÎñµÄÊÊÅä²ãÌṩº¯ÊýÐÅÏ¢*/
+typedef struct {
+	E_zMmi_Task task;//ÒµÎñ
+	SINT32 is_update;//ÊÇ·ñÓиüÐÂ
+	//SINT32 show_mode;//led,1;lcd,2;lcd+lcd,3
+	VOID* taskinfo;
+	VOID* ledinfo;
+	MMI_GET_TASKINFO_FUNC   get_taskinfo_fun;
+	MMI_GET_LEDINFO_FUNC get_ledinfo_fun;
+	MMI_GET_LCDINFO_FUNC get_lcdinfo_fun;
+} T_zMMITaskInfoItem;
+
+//lcd ÏÔʾҳ
+typedef enum {
+	MMI_SHOW_PAGE_FIRST = 0,//traffic
+	MMI_SHOW_PAGE_SECOND, //SSID WIFI KEY; IMEI MSISDN
+	MMI_SHOW_PAGE_THIRD,//CODE
+	MMI_SHOW_PAGE_FOUR,//SSID2 WIFI KEY
+	MMI_SHOW_PAGE_FIVE,//CODE2
+	MMI_SHOW_PAGE_MAX
+} E_zMMI_Lcd_Page_Index;
+
+
+/**********************************************************************************
+º¯ÊýÉùÃ÷
+***********************************************************************************/
+/*¿ª¹Ø»ú»Øµ÷£¬ÓÃÓÚlcdÏÔʾÓÃ*/
+typedef VOID (*POWER_ON_OFF_CALLBACK_FUN)();
+VOID mmi_registerLcdPowerOnOff(POWER_ON_OFF_CALLBACK_FUN fun);
+//ÉèÖô¥·¢¸üбêÖ¾
+VOID mmi_set_update_flag(E_zMmi_Task task);
+//Çå³ý¸üбêÖ¾
+VOID mmi_clean_update_flag(E_zMmi_Task task);
+//»ñÈ¡¸üбêÖ¾
+SINT32 mmi_get_update_flag(E_zMmi_Task task);
+
+/**
+ * <mmi_register_appinfo_item>
+ * ×¢²á¸÷¸öÒµÎñÐÅÏ¢
+ **/
+VOID mmi_register_taskInfo_item(T_zMMITaskInfoItem* taskInfoItem);
+SINT32 mmi_showLed(UINT32 ledInfo);
+
+#define MMI_ASSERT(a)		assert(a);
+#define itoa(i,a,b) (((b) == 16) ? sprintf((a), "%x", (i)) : sprintf((a), "%d", (i)));
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:¿ª¹Ø»úÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdCtrlInfo(UINT32 taskInfo);
+SINT32 mmi_getLedCtrlInfo(UINT32 taskInfo, UINT32 outLedInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐŵÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedSmsInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdSmsInfo(UINT32 taskInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÓïÒôÌáʾµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedVoipInfo(UINT32 taskInfo, UINT32 outLedInfo);
+
+SINT32 mmi_getLedRj11Info(UINT32 taskInfo, UINT32 outLedInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÒÔÌ«ÍøÌáʾµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedRj45Info(UINT32 taskInfo, UINT32 outLedInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐŵÆÐÅÏ¢±íË÷Òý
+***********************************************************************************/
+SINT32 mmi_get_batteryinfo(UINT32 batteryinfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedNetInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdNetInfo(UINT32 taskInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçÐźŸñÐÅÏ¢£¨Ò¢Ô¶cpe£©
+***********************************************************************************/
+SINT32 mmi_getLedNetSigInfo(UINT32 taskInfo, UINT32 outLedInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFIµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedWifiInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdWifiInfo(UINT32 taskInfo);
+SINT32 mmi_getLedWpsInfo(UINT32 taskInfo, UINT32 outLedInfo);
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿µÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedTrafficInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdTrafficInfo(UINT32 taskInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÒÆ¶¯ÔËÓªÉÌÁ÷Á¿ÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdQuotaTrafficInfo(UINT32 taskInfo);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µ±Ç°¹¤×÷ģʽ
+***********************************************************************************/
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µç³ØµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedBatteryInfo(UINT32 taskInfo, UINT32 outLedInfo);
+SINT32 mmi_getLcdBatteryInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdPowerInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdTipInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdPowerOffChagerInfo(UINT32 taskInfo);
+SINT32 mmi_getLedPowerOffChagerInfo(UINT32 taskInfo, UINT32 outLedInfo);
+
+
+SINT32 mmi_getFotaUpdateStateInfo(VOID);//»ñÈ¡FOTAÉý¼¶×´Ì¬ÐÅÏ¢
+SINT32 mmi_getLcdTipFotaInfo(UINT32 taskInfo);//FOTA
+SINT32 mmi_getLcdWifiStationInfo(UINT32 taskInfo);//wifistation
+SINT32 mmi_getLcdTipWpsInfo(UINT32 taskInfo);//wps
+SINT32 mmi_getLcdTipNetConnInfo(UINT32 taskInfo);//net connect
+
+SINT32 mmi_getLcdWifiCodeInfo(UINT32 taskInfo);//wifi¶þάÂë
+
+SINT32 mmi_getLcdSSIDKeyInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdBasicDevInfo(UINT32 taskInfo);//SSID/WIFIKEY/IMSI/MSISDN
+SINT32 mmi_getLcdCurConInfo(UINT32 taskInfo);//±¾´ÎÁ¬½Óʱ¼ä£¬±¾´ÎÁ÷Á¿
+SINT32 mmi_getLcdTimeInfo(UINT32 taskInfo);//time
+SINT32 mmi_getLcdVersionInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdTextConnectInfo(UINT32 taskInfo);
+SINT32 mmi_getLcdLogoInfo(UINT32 taskInfo);
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¿ª»ú20s¶¨Ê±Æ÷ÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getSSIDFirstShowInfo(VOID);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¿ª»ú¶¯»­ÊÇ·ñ½áÊøÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getShowingPowerOnInfo(VOID);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡fotaÉý¼¶½á¹ûÏÔʾÊÇ·ñ½áÊøÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getShowingFotaResultInfo(VOID);
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡fotaа汾ÐÅÏ¢
+***********************************************************************************/
+BOOL mmi_getFotaNewVersionInfo(VOID);
+
+E_zMmi_Work_Mode mmi_get_lcd_mode(VOID);
+E_zMmi_Work_Mode mmi_get_led_mode(VOID);
+
+/**
+ * <mmi_sms_Led_Init>
+ * ¶ÌÐŵƳõʼ»¯
+ **/
+VOID mmi_sms_led_init(VOID);
+
+
+/**
+ * <mmi_wifi_Led_Init>
+ * Wifi µÆ³õʼ»¯
+ **/
+VOID mmi_wifi_led_init(VOID);
+
+
+/**
+ * <mmi_net_Led_Init>
+ * ÍøÂçµÆ³õʼ»¯
+ **/
+VOID mmi_net_led_init(VOID);
+
+
+/**
+ * <mmi_battery_Led_Init>
+ * µç³ØµÆ³õʼ»¯
+ **/
+VOID mmi_battery_led_init(VOID);
+
+
+
+/**
+ * <mmi_traffic_Led_Init>
+ * Á÷Á¿µÆ³õʼ»¯
+ **/
+VOID mmi_traffic_led_init(VOID);
+
+
+
+/**
+ * <mmi_keyStrokes_Init>
+ * °´¼ü³õʼ»¯
+ **/
+VOID mmi_keyStrokes_init(VOID);
+
+/**
+ * <mmi_recover_allleds>
+ *»½ÐÑ˯Ãß״̬ʱµãÁÁËùÓеÆ
+ **/
+VOID mmi_set_allleds_on(VOID);
+
+/**
+ * <mmi_init_idle_control>
+ *MMIÊ¡µç¿ØÖƳõʼ»¯
+ **/
+
+VOID mmi_init_idle_control(VOID);
+
+
+/**
+ * <mmi_reset_idle_timer>
+ *Ê¡µçÏà¹Ø¶¨Ê±Æ÷ÖØÖÃ
+ **/
+
+VOID mmi_reset_idle_timer(VOID);
+
+/**
+ * <mmi_reset_idle_timer>
+ *¿ìËÙ¿ª¹Ø»úʱʡµçÏà¹Ø¶¨Ê±Æ÷ÖØÖÃ
+ **/
+
+VOID mmi_reset_fast_poweron_idle_timer(VOID);
+
+/**
+ * <mmi_close_chg_handle>
+ * ¹Ø±Õ³äµçÉ豸¾ä±ú
+ **/
+VOID mmi_close_chg_handle(VOID);
+
+/**
+ * <mmi_close_chg_handle>
+ * ¹Ø±Õ°´¼üÉ豸¾ä±ú
+ **/
+VOID mmi_close_kpd_handle(VOID);
+
+/**
+ * <mmi_close_chg_handle>
+ * ¹Ø±ÕLED É豸¾ä±ú
+ **/
+VOID mmi_close_led_handle(VOID);
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯LEDÉ豸
+***********************************************************************************/
+VOID mmi_led_dev_init(VOID);
+
+/**
+ * <zMMI_Handle_Msg_Idle_ledon>
+ * ´¦ÀíÊ¡µç¿ªµÆÏûÏ¢
+ **/
+
+VOID zMMI_Handle_Msg_Idle_ledon(VOID);
+
+
+/**
+ * <mmi_set_allleds_blink>
+ * ¿ª»ú»ò¹Ø»úʱËùÓеÆÏÈ¿ªºó¹Ø
+ **/
+
+VOID mmi_set_allleds_blink(VOID);
+
+VOID mmi_traffictip_timer_stop(VOID);
+
+/**
+ * <mmi_kill_idle_timer>
+ *killÊ¡µçÏà¹Ø¶¨Ê±Æ÷
+ **/
+VOID mmi_kill_idle_timer(VOID);
+
+/**
+ * <mmi_kill_tip_timer>
+ *kill sim¿¨Ñ­»·¼ì²â¶¨Ê±Æ÷
+ **/
+VOID mmi_kill_tip_timer(VOID);
+
+/**
+ * <mmi_kill_traffic_timer>
+ *kill Á÷Á¿Ñ­»·¼ì²â¶¨Ê±Æ÷
+ **/
+VOID mmi_kill_traffic_timer(VOID);
+
+/**
+ * <mmi_kill_wifi_data_timer>
+ *kill wifiÊý¾Ý´«ÊäÑ­»·¼ì²â¶¨Ê±Æ÷
+ **/
+VOID mmi_kill_wifi_data_timer(VOID);
+
+/**
+ * <mmi_kill_get_voltage_timer>
+ *kill¶ÁÈ¡µçѹ¶¨Ê±Æ÷
+ **/
+
+VOID mmi_kill_get_voltage_timer(VOID);
+
+
+
+/**
+ * <mmi_create_get_batlev_thread>
+ * ´´½¨»ñÈ¡µç³ØµçÁ¿°Ù·Ö±ÈµÄÏß³Ì
+ **/
+VOID mmi_create_get_batlev_thread(VOID);
+/**
+ * <get_voltage_level_from_table>
+ * ´Óµç³Ø°Ù·Ö±È±íÖлñÈ¡µç³ØµçÁ¿°Ù·Ö±È
+ **/
+SINT32 get_voltage_level_from_table(SINT32 voltagepower);
+/**
+ * <mmi_voltage_state_read>
+ * ¶ÁÈ¡µçѹ
+ **/
+SINT32 mmi_voltage_state_read(VOID);
+SINT32 mmi_voltage_state_read_ex(VOID);
+SINT32 zMMI_Handle_Msg_Network_Mode(VOID *data);
+SINT32 zMMI_Handle_Msg_Connect_Status(VOID *data);
+SINT32 zMMI_Handle_Msg_MultiConnect_Status(VOID *data, int src_id);
+SINT32 zMMI_Handle_Msg_Signal_Num(VOID *data);
+SINT32 zMMI_Handle_Msg_Simcard_Info(VOID *data);
+SINT32 zMMI_Handle_Msg_Get_Wifi_StaNum(VOID *data);
+SINT32 zMMI_Handle_Msg_SmsBox_Sattus(VOID *data);
+SINT32 zMMI_Handle_Msg_Voip_Status(VOID *data);
+SINT32 zMMI_Handle_Msg_Rj11_Status(VOID * data);
+SINT32 zMMI_Handle_Msg_Rj45_Status(VOID * data);
+SINT32 zMMI_Handle_Msg_Get_SSID_Key(VOID *data);
+SINT32 zMMI_Handle_Msg_BacklightOff(VOID *data);
+SINT32 zMMI_Handle_Msg_Factory_Reset(VOID *data);
+SINT32 zMMI_Handle_Msg_Restart(VOID *data);
+SINT32 zMMI_Handle_Msg_Poweroff(VOID *data);
+SINT32 zMMI_Handle_Msg_Get_Provider(VOID *data);
+SINT32 zMMI_Handle_Msg_Get_TafficInfo_Start(VOID* data);
+SINT32 zMMI_Handle_Msg_Get_TafficInfo_End(VOID* data);
+SINT32 zMMI_Handle_Msg_TafficInfo_Reset(VOID* data);
+SINT32 zMMI_Handle_Msg_Check_Tip_Info(VOID *data);
+SINT32 zMMI_Handle_Msg_SSID_Show_Info(VOID *data);
+SINT32 zMMI_Handle_Msg_Get_Wifi_Data(VOID *data);
+SINT32 zMMI_Handle_Msg_Socket_Status(VOID *data, int src_id);
+SINT32 zMMI_Handle_Msg_MCUSocket_Status(VOID *data);
+
+SINT32	mmi_RegisterNetTaskInfoItem();
+SINT32	mmi_RegisterSmsTaskInfoItem();
+SINT32  mmi_RegisterVoipTaskInfoItem();
+SINT32 mmi_RegisterRj11TaskInfoItem();
+SINT32 mmi_RegisterRj45TaskInfoItem();
+
+SINT32 	mmi_RegisterBatteryTaskInfoItem();
+SINT32 	mmi_RegisterPowerTaskInfoItem();
+SINT32	mmi_RegisterCtrlTaskInfoItem();
+SINT32 	mmi_RegisterTimeTaskInfoItem();
+SINT32 	mmi_RegisterSSIDInfoTaskInfoItem();
+SINT32 	mmi_RegisterWifiTaskInfoItem();
+SINT32 mmi_RegisterWpsTaskInfoItem();
+
+SINT32 	mmi_RegisterWifiCodeTaskInfoItem();
+SINT32 	mmi_RegisterTrafficTaskInfoItem();
+SINT32 	mmi_RegisterQuotaTrafficInfoItem();
+SINT32 	mmi_RegisterTipTaskInfoItem();
+SINT32 	mmi_RegisterTipWifiStationConnectTaskInfoItem();
+SINT32 	mmi_RegisterTipWpsTaskInfoItem();
+SINT32 mmi_RegisterNetSigTaskInfoItem();
+SINT32 	mmi_RegisterTipFotaTaskInfoItem();
+SINT32  mmi_RegisterTipNetConnectTaskInfoItem();
+SINT32 	mmi_RegisterTipWifiStationConnectTaskInfoItem();
+SINT32 mmi_RegisterTipFirmwareVersionTaskInfoItem();
+SINT32 mmi_RegisterTipTextConnectTaskInfoItem();
+SINT32 mmi_RegisterLogoTaskInfoItem();
+
+void	mmi_net_init();
+void	mmi_sms_init();
+void    mmi_voip_init();
+void	mmi_init_idle_control();
+void	mmi_battery_init();
+void	mmi_init_lcd_tip();
+void	mmi_init_time();
+void	mmi_wifi_init();
+void	mmi_traffic_init();
+void	mmi_rj45_init();
+void	mmi_init_quota_traffic();
+VOID    mmi_play_poweroff_cartoon(E_zMmi_Work_Mode mode);
+VOID    mmi_set_fake_poweroff_charger(int fake_poweroff_flag);
+VOID    mmi_lowbattery_discharge_protect(UINT32 voltagepower);
+VOID    mmi_set_discharge_low_current(BOOL discharge_low_current_flag);
+VOID    mmi_handle_fast_poweroff(VOID);
+VOID    mmi_wifi_operate(char* mode);
+BOOL    mmi_get_usb_insert_state();
+E_zMmi_Charge_State     mmi_get_charge_state();
+VOID   mmi_handle_fast_poweron(VOID);
+VOID   mmi_set_discharge_switch(BOOL discharge_protect_flag);
+void mmi_log_save(const char *fmt, ...);
+VOID mmi_sleep(UINT32 time_in_ms);
+void mmi_add_list(struct list_head *head, int src_id);
+void mmi_del_list(struct list_head *head, int src_id);
+
+VOID mmi_clean_net_state();
+VOID mmi_set_wificode_show_flag(BOOL flag);
+E_zMMI_Lcd_Page_Index mmi_get_lcd_page_index(VOID);
+E_zMmi_Sim_Tip mmi_getSIMStateInfo(VOID);
+E_zMmi_NetCon_Tip mmi_getNetConInfo(VOID);
+E_zMmi_WpsAct_Tip mmi_get_wps_state();
+VOID mmi_set_poweroff_charge_show(BOOL show);
+#ifndef DISABLE_LCD
+SINT32 mmi_showLcd(HDC hdc);
+#endif
+VOID mmi_initLcdShowInfoTab();
+VOID mmi_handle_lcd_key_switch_page();
+VOID mmi_idle_timer_stop(VOID);
+VOID mmi_wps_operate(VOID);
+VOID mmi_changePowerOnOffFrame(VOID);
+VOID mmi_startLedTrafficWarnTimer(SINT32 time, SINT32 flag);
+VOID mmi_stopLedTrafficWarnTimer();
+VOID mmi_poweroffcharger_init();
+UINT32 mmi_get_net_state(VOID);
+/**º¯Êý×÷ÓÃ:×Ô¶¯»¯²âÊÔÄ£Äâ°´¼ü**/
+SINT32 zMMI_Handle_Msg_Atest_Key(VOID *data);
+SINT32 zMMI_Handle_Msg_Atest_Chg(VOID *data);
+
+
+
+
+
+#endif //__MMI_COMMON_H
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_keystrokes.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_keystrokes.c
new file mode 100755
index 0000000..03821ff
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_keystrokes.c
@@ -0,0 +1,464 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_keystokes.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI°´¼ü²Ù×÷
+*  ×÷            Õß  £º
+*  °æ            ±¾  £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+/*****************************************************************************
+                         Í·Îļþ
+******************************************************************************/
+#include <fcntl.h>
+#include <sys/syscall.h>
+#include <linux/reboot.h>
+#include <linux/input.h>
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+extern int g_customer_type;
+
+/************************************************************************************
+                            È«¾Ö±äÁ¿¶¨Òå
+***********************************************************************************/
+static int g_mmi_kpd_handle = -1;//»ñÈ¡¼üÅÌÉ豸¾ä±ú
+static BOOL g_longPressFlag = FALSE;//±ê¼ÇÊÇ·ñ³¤°´
+static BOOL g_key_wakeup_flag = FALSE;//±êʾMMIÐÝÃßʱ°´¼ü Ö»»½ÐÑµÆ £¬ÆäËû¹¦Äܲ»ÏìÓ¦
+static long s_mmi_keypress_begin = 0;//°´¼ü°´Ïºó¿ªÊ¼¼ÆÊ±
+BOOL g_mmi_key_longpress_flag = FALSE;//±ê¼ÇÊÇ·ñΪmmi³¤°´power¼ü·¢ÆðµÄ¹Ø»ú
+extern E_zMmiShowMode g_showMode;
+extern UINT32 g_fast_poweron;
+static int g_mmi_kpd_longpress_time = 3;//³¤°´¼üÅжÏʱ¼äS
+static int g_mmi_wifi_longpress_time = 5;//³¤°´wifi¼üÅжÏʱ¼äS, Ò¢Ô¶cpe
+
+BOOL mmi_get_wakeup_flag(VOID);
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡°´¼üʱ¼ä
+***********************************************************************************/
+static long mmi_get_keypress_time()
+{
+	struct timeval tv;
+	long second;
+	gettimeofday(&tv, NULL);
+	second = tv.tv_sec;
+	return second;
+}
+
+
+/************************************************************************************
+ º¯Êý×÷ÓÃ:¶ÁÈ¡°´¼üÐÅÏ¢
+***********************************************************************************/
+static VOID mmi_get_keystrokes_data(MMI_KP_INFO *kp_info)
+{
+
+	int retR = -1;
+	struct input_event kp_event = {0};
+
+	retR = read(g_mmi_kpd_handle, (CHAR *)(&kp_event), sizeof(kp_event));
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI  Key's type:%d, value:%d, code:%d\n", kp_event.type, kp_event.value, kp_event.code);
+	if (retR < 0) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI get_keystrokes_data read falied k-err:%d!",errno);
+		return;
+	}
+
+	if (kp_event.type == 1) {
+		if (kp_event.value == 1) {
+			set_wake_lock(MMI_MAIN_LOCK_ID);
+			kp_info->status = KEY_STATUS_DOWN;
+			s_mmi_keypress_begin = mmi_get_keypress_time();
+			if (kp_event.code == KEY_WIFI_CODE) {
+				if (mmi_get_wifi_state()) {
+					g_mmi_wifi_longpress_time = 5;
+				} else {
+					g_mmi_wifi_longpress_time = 1;
+				}
+			}
+		} else if (kp_event.value == 0) {
+			kp_info->status = KEY_STATUS_UP;
+			s_mmi_keypress_begin = 0;
+		} else if (kp_event.value == 2) {
+			long sec_end = mmi_get_keypress_time();
+			int sec_lingpress = (int)(sec_end - s_mmi_keypress_begin);
+			if (kp_event.code == KEY_WIFI_CODE) {
+				if (sec_lingpress >= g_mmi_wifi_longpress_time) {
+					kp_info->status = KEY_STATUS_LONGPRESS;
+				}
+			}
+			else {
+				if (sec_lingpress >= g_mmi_kpd_longpress_time) {
+					kp_info->status = KEY_STATUS_LONGPRESS;
+				}
+			}
+		}
+		if (kp_event.code == KEY_POWER_CODE) {
+			kp_info->type = KEY_TYPE_POWER;
+		} else if (kp_event.code == KEY_RESET_CODE) {
+			kp_info->type = KEY_TYPE_RESET;
+		} else if (kp_event.code == KEY_WPS_CODE) {
+			kp_info->type = KEY_TYPE_WPS;
+		} else if (kp_event.code == KEY_WIFI_CODE) {
+			kp_info->type = KEY_TYPE_WIFI;
+		}
+	} else {
+		kp_info->status = (KEY_STATUS)0;
+		return;
+	}
+
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:°´¼ü»½ÐÑwifi
+***********************************************************************************/
+static VOID mmi_wakeup_wifi(int key_type)
+{
+	if (key_type == KEY_TYPE_WPS || key_type == KEY_TYPE_RESET) {
+		if (!mmi_get_wifi_state()) {
+			if (g_fast_poweron) {
+				if (mmi_get_lcd_mode() != MMI_FAKE_POWEROFF_MODE && mmi_get_lcd_mode() != MMI_FAKE_POWEROFF_CHARGE_MODE
+				    && mmi_get_led_mode() != MMI_FAKE_POWEROFF_MODE && mmi_get_led_mode() != MMI_FAKE_POWEROFF_CHARGE_MODE) {
+					mmi_wifi_operate(WIFI_TURN_ON);
+				}
+			} else
+				mmi_wifi_operate(WIFI_TURN_ON);
+		}
+	}
+	if (key_type == KEY_TYPE_POWER) { //LCDģʽÏÂ×¢ÒâÃðÆÁºÍ»½ÐÑ£¬LEDģʽÏÂûÓÐÃðµÆ²Ù×÷
+		if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+			if ((mmi_get_lcd_mode() == MMI_ACTIVE_MODE || mmi_get_led_mode() == MMI_ACTIVE_MODE) && mmi_get_wakeup_flag()) {
+				mmi_wifi_operate(WIFI_TURN_ON);
+			}
+		} else {
+			if ((mmi_get_lcd_mode() == MMI_ACTIVE_MODE || mmi_get_led_mode() == MMI_ACTIVE_MODE) && !mmi_get_wifi_state()) {
+				mmi_wifi_operate(WIFI_TURN_ON);
+			}
+		}
+	}
+}
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:ÉèÖð´¼ü»½Ðѱêʶ
+***********************************************************************************/
+VOID mmi_set_wakeup_flag(BOOL flag)
+{
+	if(g_customer_type == CUSTOMER_NANDIAN){//¹úµçûÓÐlcd led£¬°´¼ü²»ÐèÒª»½Ðѹ¦ÄÜ
+		g_key_wakeup_flag = FALSE;
+	}else{
+		g_key_wakeup_flag = flag;
+	}
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:·µ»Ø°´¼ü»½Ðѱêʶ
+***********************************************************************************/
+BOOL mmi_get_wakeup_flag(VOID)
+{
+	return g_key_wakeup_flag;
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:ÉèÖð´¼ü³¤°´±êʶ
+***********************************************************************************/
+VOID mmi_set_longpress_flag(BOOL flag)
+{
+	g_longPressFlag = flag;
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:·µ»Ø°´¼ü³¤°´±êʶ
+***********************************************************************************/
+BOOL mmi_get_longpress_flag(VOID)
+{
+	return g_longPressFlag;
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:°´¼ü»½ÐÑLED/LCD ²¢ÉèÖû½Ðѱê־λ
+***********************************************************************************/
+static VOID mmi_set_active_mode_key()
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode lcd_mode = mmi_get_lcd_mode();
+		if (lcd_mode == MMI_BACKLIGHT_OFF_MODE || lcd_mode == MMI_BACKLIGHT_HALFBRIGHT_MODE) {
+			mmi_set_wakeup_flag(TRUE);
+		} else {
+			if (g_fast_poweron) {
+				if (lcd_mode == MMI_FAKE_POWEROFF_MODE && (mmi_get_charge_state() == STATE_CHARGING || mmi_get_charge_state() == STATE_FULL)) {
+					mmi_set_lcd_mode(MMI_FAKE_POWEROFF_CHARGE_MODE);
+					mmi_set_update_flag(MMI_TASK_CTRL);
+					mmi_set_wakeup_flag(TRUE);
+				}
+			}
+		}
+	}
+
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode led_mode = mmi_get_led_mode();
+		if (led_mode == MMI_IDLE_LEDOFF_MODE || led_mode == MMI_IDLE_STANDBY_LEDOFF_MODE || led_mode == MMI_IDLE_CHG_LEDOFF_MODE) {
+			mmi_set_wakeup_flag(TRUE);
+		}
+	}
+	mmi_set_mode_active();
+}
+
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:down°´¼üÏûÏ¢´¦Àí
+***********************************************************************************/
+static VOID mmi_handle_keystroke_down()
+{
+	BOOL long_press = mmi_get_longpress_flag();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI  KEYDOWN  long_press=%d!!!\n ", long_press);
+	if (FALSE == long_press) {
+		// ÖØÖö¨Ê±Æ÷
+		if (g_fast_poweron && (mmi_get_charge_state() == STATE_DISCHARGE) && ((mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE) || (mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE))) {
+			mmi_reset_fast_poweron_idle_timer();
+		} else {
+			mmi_reset_idle_timer();
+		}
+
+		mmi_set_active_mode_key();
+
+		if (mmi_get_wifi_state()) {
+			//mmi_send_message(MODULE_ID_WIFI, (USHORT)MSG_CMD_WIFI_RESET_TIMER, 0, NULL);
+
+			ipc_send_message(MODULE_ID_MMI, MODULE_ID_WIFI, MSG_CMD_WIFI_RESET_TIMER, 0, NULL, 0);
+		}
+	}
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:up°´¼üÏûÏ¢´¦Àí
+***********************************************************************************/
+static VOID mmi_handle_keystroke_up(int key_type)
+{
+	BOOL longPress = mmi_get_longpress_flag();
+	BOOL key_wakeup = mmi_get_wakeup_flag();
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI  KEYUP KEYUP !!! longPress=%d key_wakeup=%d\n", longPress, key_wakeup);
+	mmi_wakeup_wifi(key_type);
+#ifndef DISABLE_LCD
+	if (FALSE == longPress && (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL)) {
+		if (key_type == KEY_TYPE_POWER) {
+			if (mmi_get_lcd_mode() == MMI_ACTIVE_MODE && key_wakeup == FALSE && mmi_getSSIDFirstShowInfo() == FALSE) {
+				mmi_handle_lcd_key_switch_page();
+			}
+		} else if (key_type == KEY_TYPE_POWER && mmi_getShowingPowerOnInfo() == FALSE) {
+			if (mmi_get_lcd_mode() == MMI_ACTIVE_MODE && key_wakeup == FALSE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI  mmi_handle_keystroke_up ssssss");
+				mmi_idle_timer_stop();
+				mmi_set_lcd_mode(MMI_BACKLIGHT_OFF_MODE);
+				mmi_set_update_flag(MMI_TASK_CTRL);
+
+			}
+		}
+	}
+#endif
+	if (TRUE == longPress) {
+		mmi_set_longpress_flag(FALSE); //±ê¼Ç³¤°´½áÊø
+	}
+	if (TRUE == key_wakeup) {
+		mmi_set_wakeup_flag(FALSE);
+	}
+}
+
+/***********************************************************************************
+   º¯Êý×÷Óó¤°´¼üÏûÏ¢´¦Àí
+***********************************************************************************/
+static VOID mmi_handle_keystroke_longpress(int key_type)
+{
+	BOOL longPress = mmi_get_longpress_flag();
+	BOOL key_wakeup = mmi_get_wakeup_flag();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI  mmi_handle_keystroke_longpress  longPress=%d key_wakeup=%d\n", longPress, key_wakeup);
+	if ((FALSE == longPress) && (FALSE == key_wakeup)) {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI KEYLONGPRESS!KEYLONGPRESS!\n");
+		mmi_set_longpress_flag(TRUE);
+		if (key_type == KEY_TYPE_POWER) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI handleKey ######KEY_POWER LONGPRESS######\n\n");
+
+			if (g_fast_poweron) {
+				if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE
+				    || mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+					g_mmi_key_longpress_flag = FALSE;
+					mmi_handle_fast_poweron();
+				} else {
+					g_mmi_key_longpress_flag = TRUE;
+
+					slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI poweroff,longpress!!!\n");
+					mmi_set_poweroff();
+				}
+			} else {
+				slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI poweroff,longpress!!!\n");
+				mmi_set_poweroff();
+			}
+		} else if (key_type == KEY_TYPE_RESET) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI handleKey ######KEY_RESET LONGPRESS######\n\n");
+			if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_MODE
+			    || mmi_get_led_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE || mmi_get_led_mode() == MMI_FAKE_POWEROFF_MODE) {
+				return;//break;
+			}
+			mmi_set_factory_reset();
+		} else if ((key_type == KEY_TYPE_WPS)) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI handleKey ######KEY_WPS LONGPRESS######\n");
+			if (mmi_get_wifi_state()) {
+				mmi_wps_operate();
+			}
+		} else if ((key_type == KEY_TYPE_WIFI)) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI handleKey ######KEY_WIFI LONGPRESS######\n");
+			if (mmi_get_wifi_state()) {
+				mmi_wifi_operate(WIFI_TURN_OFF);
+			} else {
+				mmi_wifi_operate(WIFI_TURN_ON);
+			}
+		} else {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI invalid operation!!\n");
+		}
+	}
+}
+
+void mmi_handle_keystroke(MMI_KP_INFO* keyData,BOOL* key_pressed)
+{
+	const char *buttonStr = NULL;  
+
+    if (keyData->type == KEY_TYPE_WPS)
+	{
+		buttonStr = "+BUTTON: WPS\r\n";
+	} 
+	else if (keyData->type == KEY_TYPE_RESET)
+	{
+		buttonStr = "+BUTTON: RESET\r\n";
+	}
+	else if (keyData->type == KEY_TYPE_POWER)
+	{
+		buttonStr = "+BUTTON: POWER\r\n";
+	}
+	else
+		return;
+
+
+	if (keyData->status == KEY_STATUS_DOWN)
+	{
+		key_pressed = TRUE;
+	}
+	else if (keyData->status == KEY_STATUS_UP && key_pressed)
+	{
+		send_rsp_str_to_farps(MODULE_ID_MMI, buttonStr, strlen(buttonStr));
+		key_pressed = FALSE;
+	}
+	else
+		return;
+}
+
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:´¦Àí°´¼ü
+***********************************************************************************/
+VOID *mmi_handle_keystrokes_thread(VOID *arg)
+{
+	MMI_KP_INFO keyData = {0};
+	BOOL key_pressed = FALSE;
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI handleKey handle_keystrokes_thread begin !!\n ");
+	prctl(PR_SET_NAME, "mmihandlekey", 0, 0, 0);
+	while (1) {
+		mmi_get_keystrokes_data(&keyData);
+		mmi_handle_keystroke(&keyData, &key_pressed);
+		switch (keyData.status) {
+		case KEY_STATUS_DOWN: {
+			mmi_handle_keystroke_down();
+			break;
+		}
+
+		case KEY_STATUS_UP: {
+			mmi_handle_keystroke_up(keyData.type);
+			break;
+		}
+		case KEY_STATUS_LONGPRESS: {
+			mmi_handle_keystroke_longpress(keyData.type);
+			break;
+		}
+		default: {
+			break;
+		}
+		}
+	}
+
+}
+#if 0
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:×Ô¶¯»¯²âÊÔÄ£Äâ°´¼ü£¬Õý³£¿ª»ú
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Atest_Key(VOID *data)
+{
+	//value:°´¼üʼþ code:°´¼ü¼üÖµ
+	autotest_key_rspmsg *kp_event = (autotest_key_rspmsg *)data;
+	MMI_KP_INFO keyData = {0};
+
+	if (kp_event->value == 1) {
+		set_wake_lock(MMI_MAIN_LOCK_ID);
+		keyData.status = KEY_STATUS_DOWN;
+		s_mmi_keypress_begin = mmi_get_keypress_time();
+	} else if (kp_event->value == 0) {
+		keyData.status = KEY_STATUS_UP;
+		s_mmi_keypress_begin = 0;
+	} else if (kp_event->value == 2) {
+		long sec_end = mmi_get_keypress_time();
+		int sec_lingpress = (int)(sec_end - s_mmi_keypress_begin);
+		if (sec_lingpress >= g_mmi_kpd_longpress_time) {
+			keyData.status = KEY_STATUS_LONGPRESS;
+		}
+	}
+
+	if (kp_event->code == KEY_POWER_CODE) {
+		keyData.type = KEY_TYPE_POWER;
+	} else if (kp_event->code == KEY_RESET_CODE) {
+		keyData.type = KEY_TYPE_RESET;
+	} else if (kp_event->code == KEY_WPS_CODE) {
+		keyData.type = KEY_TYPE_WPS;
+	}
+
+	switch (keyData.status) {
+		case KEY_STATUS_DOWN: {
+			mmi_handle_keystroke_down();
+			break;
+		}
+		case KEY_STATUS_UP: {
+			mmi_handle_keystroke_up(keyData.type);
+			break;
+		}
+		case KEY_STATUS_LONGPRESS: {
+			mmi_handle_keystroke_longpress(keyData.type);
+			break;
+		}
+		default: {
+			break;
+		}
+	}
+	return 0;
+}
+#endif
+
+/************************************************************************************
+ º¯Êý×÷ÓÃ:°´¼ü³õʼ»¯
+***********************************************************************************/
+VOID mmi_keyStrokes_init(VOID)
+{
+	pthread_t  mmi_handlekey_thread;
+	/*´´½¨µÆ¿ØÖÆflagÐźÅÁ¿*/
+	g_mmi_kpd_handle = open(KPD_PATH, O_RDONLY);
+	if (g_mmi_kpd_handle == -1) {
+		slog(MMI_PRINT, SLOG_ERR, "handleKey Couldn't open kp /dev/event0\n");
+		return;//MMI_ASSERT(0);
+	}
+	if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN){
+		g_mmi_kpd_longpress_time = 1;//1s
+	}
+	if (pthread_create(&mmi_handlekey_thread, NULL, &mmi_handle_keystrokes_thread, NULL) == -1) {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI create handle_keystrokes_thread error\n");
+		return ;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_keyStrokes_Init finish!!\n");
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd.c
new file mode 100755
index 0000000..1cb953d
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd.c
@@ -0,0 +1,2029 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#ifndef DISABLE_LCD
+#include "mmi_lcd.h"
+
+extern pthread_mutex_t g_mmi_refresh_lcd_mutex;
+extern pthread_mutex_t g_mmi_poweron_mutex;
+extern UINT32 g_mmi_poweroff_turnon_flag;
+
+extern UINT32 g_show_pagefirst;
+extern UINT32 g_show_pagethird;
+extern BOOL mmi_is_offchg_poweroff;
+
+/*****************************************************************************
+ È«¾Ö±äÁ¿¶¨Òå
+******************************************************************************/
+static T_LcdConfigInfo g_LcdConfigInfoTab[] = {
+	//===========top bar==================================
+	{LCD_SHOW_NET_SIGNAL, {40, 0, 80, 80}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_NET_CONNECT, {28, 2, 45, 25}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_WIFISTATION_CONNECT, {28, 2, 45, 25}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_SMS, {48, 0, 65, 25}, LCD_SHOW_PICTURE}, //{48,2,65,25}
+	{LCD_SHOW_SMS_NUM, {53, 11, 67, 25}, LCD_SHOW_TEXT},
+	{LCD_SHOW_WIFI, {0, 0, 40, 80}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_TIP_NEW_VERSION, {89, 0, 106, 23}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_POWER, {89, 4, 106, 20}, LCD_SHOW_TEXT},
+	{LCD_SHOW_BATTERY, {80, 0, 120, 80}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_CHARRING, {80, 0, 120, 80}, LCD_SHOW_PICTURE},
+	//===================== ==PAGE1=======================
+	//================MIDDLE==============================
+	{LCD_SHOW_CMCC, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_WIFISTA_SSID, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_SIM_STATE, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_WPS_ACTIVE, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_NET_CONNECTING, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TIP_NET_PROVIDER, {0, 38, 128, 72}, LCD_SHOW_TEXT},
+
+	{LCD_SHOW_TIP_UPDATE_INFO, {0, 38, 128, 72}, LCD_SHOW_TEXT}, //zk add for fotaupdate result
+
+	//================TEMP================================
+	{LCD_SHOW_WIFI_SSID, {0, 0, 160, 30}, LCD_SHOW_TEXT},
+	{LCD_SHOW_WIFI_PASSWORD, {0, 31, 160, 80}, LCD_SHOW_TEXT},
+	//===================PAGE SSID2 WIFI KEY==============================
+	{LCD_SHOW_WIFI_SSID2, {0, 72, 128, 90}, LCD_SHOW_TEXT},
+	{LCD_SHOW_WIFI_PASSWORD2, {0, 100, 128, 118}, LCD_SHOW_TEXT},
+	//===================PAGE CODE2==============================
+	{LCD_SHOW_WIFI_CODE2, {0, 0, 128, 128}, LCD_SHOW_PICTURE},
+
+
+	//==================PAGE4================================
+	{LCD_SHOW_TRAFFIC, {1, 74, 128, 90}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TRAFFIC_BAR, {3, 94, 125, 103}, LCD_SHOW_RECT},
+	{LCD_SHOW_TRAFFIC_SLIDER, {3, 94, 3, 103}, LCD_SHOW_BOX},
+
+	{LCD_SHOW_TRAFFIC_WARING, {0, 94, 0, 103}, LCD_SHOW_BOX},
+	//===================PAGE3==============================
+	{LCD_SHOW_WIFI_CODE, {10, 0, 90, 80}, LCD_SHOW_PICTURE},
+
+	{LCD_SHOW_POWER_OFF_CHARGER, {0, 0, 128, 128}, LCD_SHOW_PICTURE},
+
+	{LCD_SHOW_FIRMWARE_VERSION, {0, 2, 160, 20}, LCD_SHOW_TEXT},
+	{LCD_SHOW_FIRMWARE_VERSION_VALUE, {0, 21, 160, 39}, LCD_SHOW_TEXT},
+	{LCD_SHOW_HARDWARE_VERSION, {0, 40, 160, 58}, LCD_SHOW_TEXT},
+	{LCD_SHOW_HARDWARE_VERSION_VALUE, {0, 59, 160, 77}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TEXT_SCAN_TO, {100, 17, 155, 35}, LCD_SHOW_TEXT},
+	{LCD_SHOW_TEXT_CONNECT, {100, 45, 155, 63}, LCD_SHOW_TEXT},
+	{LCD_SHOW_LOGO, {120, 0, 160, 80}, LCD_SHOW_PICTURE},
+	{LCD_SHOW_OPERATOR, {120, 0, 160, 80}, LCD_SHOW_PICTURE},
+};
+
+/*ÏÔʾ×Ü¿ØÐÅÏ¢½á¹¹Ìå*/
+T_LcdShowInfoItem g_LcdShowInfoTab[] = {
+	//===============================top bar=================================================
+	{LCD_SHOW_NET_SIGNAL, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_NET_CONNECT, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_WIFISTATION_CONNECT, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_SMS, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_SMS_NUM, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_WIFI, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_NEW_VERSION, NULL, NULL, NULL, DT_CENTER, 0, TRUE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_POWER, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_BATTERY, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_CHARRING, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	//===============================middle=================================================
+	{LCD_SHOW_CMCC, NULL, NULL, NULL, DT_CENTER | DT_VCENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_WIFISTA_SSID, NULL, NULL, NULL, DT_CENTER | DT_VCENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_SIM_STATE, NULL, NULL, NULL, DT_CENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_WPS_ACTIVE, NULL, NULL, NULL, DT_CENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_NET_CONNECTING, NULL, NULL, NULL, DT_CENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TIP_NET_PROVIDER, NULL, NULL, NULL, DT_CENTER, 0, FALSE, FALSE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	{LCD_SHOW_TIP_UPDATE_INFO, NULL, NULL, NULL, DT_CENTER | DT_VCENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},//zk add for fotaupdate result
+
+	//===============================PAGE2=================================================
+	{LCD_SHOW_WIFI_SSID, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_WIFI_PASSWORD, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	//===============================PAGE4 SSID2 WIFI KEY=================================================
+	{LCD_SHOW_WIFI_SSID2, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_WIFI_PASSWORD2, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	//=================================PAGE5 CODE2=======================================================
+	{LCD_SHOW_WIFI_CODE2, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	//================================PAGE1====================================================
+	{LCD_SHOW_TRAFFIC, NULL, NULL, NULL, DT_RIGHT, 0, FALSE, TRUE, LCD_SHOW_TEXT, 0xffffffff, 0},
+	{LCD_SHOW_TRAFFIC_BAR, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_BOX, 0xffffffff, 0},
+	{LCD_SHOW_TRAFFIC_SLIDER, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_RECT, 0xffffffff, 0},
+	{LCD_SHOW_TRAFFIC_WARING, NULL, NULL, NULL, DT_CENTER, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	//=================================PAGE3=======================================================
+	{LCD_SHOW_WIFI_CODE, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	{LCD_SHOW_POWER_OFF_CHARGER, NULL, NULL, NULL, DT_CENTER | DT_VCENTER | DT_SINGLELINE, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+	{LCD_SHOW_FIRMWARE_VERSION, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_FIRMWARE_VERSION_VALUE, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_HARDWARE_VERSION, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_HARDWARE_VERSION_VALUE, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TEXT_SCAN_TO, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_TEXT_CONNECT, NULL, NULL, NULL, DT_LEFT, 0, FALSE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_LOGO, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+	{LCD_SHOW_OPERATOR, NULL, NULL, NULL, DT_CENTER, 0, TRUE, TRUE, LCD_SHOW_INVLAID, 0xffffffff, 0},
+
+};
+
+/*¶ÌÏûÏ¢ÅäÖñí*/
+typedef struct {
+	E_zMmi_Sms_Recvbox_Status status;
+	CHAR* path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+
+} T_SmsConfigInfo;
+
+static T_SmsConfigInfo g_SmsConfigInfoTab[] = {
+	{SMS_RECVBOX_STATUS_UNREAD, "sms_unread_2.png", FALSE, {0}},
+	{SMS_RECVBOX_STATUS_NEW, "sms_unread_2.png", FALSE, {0}},
+	{SMS_RECVBOX_STATUS_FULL, "sms_full.png", FALSE, {0}}
+};
+
+/*µç³ØµçÁ¿ÅäÖñí*/
+typedef enum {
+	E_BATTERY_LEVEL_NULL,
+	E_BATTERY_LEVEL_LOWER,
+	E_BATTERY_LEVEL_0,
+	E_BATTERY_LEVEL_1,
+	E_BATTERY_LEVEL_2,
+	E_BATTERY_LEVEL_3,
+	E_BATTERY_LEVEL_4,
+	E_BATTERY_LEVEL_OVERVOL,
+	E_BATTERY_LEVEL_CHARGER,
+	E_BATTERY_LEVEL_CHARRING
+} E_BATTERY_LEVER;
+
+typedef struct {
+	E_BATTERY_LEVER status;
+	SINT32 timer_period;
+	CHAR* path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_BatteryConfigInfo;
+
+#if 0
+static T_BatteryConfigInfo g_lcdBatteryConfigInfo[] = {
+	{E_BATTERY_LEVEL_NULL, 1000, "battery_null.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_LOWER, 0, "battery_low.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_0, 0, "battery_0.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_1, 0, "battery_1.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_2, 0, "battery_2.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_3, 0, "battery_3.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_4, 0, "battery_4.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_OVERVOL, 0, "overvoltage.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_CHARGER, 1000, NULL, FALSE, {0}}
+};
+#endif
+static T_BatteryConfigInfo g_lcdBatteryConfigInfo[] = {
+	{E_BATTERY_LEVEL_NULL, 1000, "battery_null.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_LOWER, 0, "battery_low.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_0, 0, "battery_0.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_1, 0, "battery_1.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_2, 0, "battery_2.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_3, 0, "battery_3.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_4, 0, "battery_4.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_OVERVOL, 0, "overvoltage.png", FALSE, {0}},
+	{E_BATTERY_LEVEL_CHARGER, 1000, NULL, FALSE, {0}},
+	{E_BATTERY_LEVEL_CHARRING, 0, "charring.png", FALSE, {0}}
+};
+
+static T_BatteryConfigInfo g_lcdPowerOffBatteryConfigInfo[] = {
+	{E_BATTERY_LEVEL_NULL, 0, NULL, FALSE, {0}},
+	{E_BATTERY_LEVEL_LOWER, 0, NULL, FALSE, {0}},
+	{E_BATTERY_LEVEL_0, 0, "poweroff_charging0.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_1, 0, "poweroff_charging1.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_2, 0, "poweroff_charging2.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_3, 0, "poweroff_charging3.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_4, 0, "poweroff_charging4.png", TRUE, {0}},
+	{E_BATTERY_LEVEL_CHARGER, 0, NULL, TRUE, {0}}
+};
+
+/*µçÐÅÍøÂçÅäÖñí*/
+typedef struct {
+	E_zMmi_Net_Mode netMode;
+	SINT32 sigLevel;
+	BOOL isRoam;
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_NetSignalConfigInfo;
+
+static T_NetSignalConfigInfo g_lcdNetSignalConfigInfoTab[] = {
+	{NET_MODE_4G, 5, FALSE, "4Gsignal5.png", FALSE, {0}},
+	{NET_MODE_4G, 4, FALSE, "4Gsignal5.png", FALSE, {0}},
+	{NET_MODE_4G, 3, FALSE, "4Gsignal3.png", FALSE, {0}},
+	{NET_MODE_4G, 2, FALSE, "4Gsignal3.png", FALSE, {0}},
+	{NET_MODE_4G, 1, FALSE, "4Gsignal1.png", FALSE, {0}},
+	{NET_MODE_4G, 0, FALSE, "4Gsignal1.png", FALSE, {0}},
+	{NET_MODE_4G, 5, TRUE, "4Gsignal5.png", FALSE, {0}},
+	{NET_MODE_4G, 4, TRUE, "4Gsignal5.png", FALSE, {0}},
+	{NET_MODE_4G, 3, TRUE, "4Gsignal3.png", FALSE, {0}},
+	{NET_MODE_4G, 2, TRUE, "4Gsignal3.png", FALSE, {0}},
+	{NET_MODE_4G, 1, TRUE, "4Gsignal1.png", FALSE, {0}},
+	{NET_MODE_4G, 0, TRUE, "4Gsignal1.png", FALSE, {0}},
+	{NET_MODE_3G, 5, FALSE, "3Gsignal5.png", FALSE, {0}},
+	{NET_MODE_3G, 4, FALSE, "3Gsignal4.png", FALSE, {0}},
+	{NET_MODE_3G, 3, FALSE, "3Gsignal3.png", FALSE, {0}},
+	{NET_MODE_3G, 2, FALSE, "3Gsignal2.png", FALSE, {0}},
+	{NET_MODE_3G, 1, FALSE, "3Gsignal1.png", FALSE, {0}},
+	{NET_MODE_3G, 0, FALSE, "3Gsignal0.png", FALSE, {0}},
+	{NET_MODE_3G, 5, TRUE, "3G_R_5.png", FALSE, {0}},
+	{NET_MODE_3G, 4, TRUE, "3G_R_4.png", FALSE, {0}},
+	{NET_MODE_3G, 3, TRUE, "3G_R_3.png", FALSE, {0}},
+	{NET_MODE_3G, 2, TRUE, "3G_R_2.png", FALSE, {0}},
+	{NET_MODE_3G, 1, TRUE, "3G_R_1.png", FALSE, {0}},
+	{NET_MODE_3G, 0, TRUE, "3G_R_0.png", FALSE, {0}},
+	{NET_MODE_2G, 5, FALSE, "2Gsignal5.png", FALSE, {0}},
+	{NET_MODE_2G, 4, FALSE, "2Gsignal4.png", FALSE, {0}},
+	{NET_MODE_2G, 3, FALSE, "2Gsignal3.png", FALSE, {0}},
+	{NET_MODE_2G, 2, FALSE, "2Gsignal2.png", FALSE, {0}},
+	{NET_MODE_2G, 1, FALSE, "2Gsignal1.png", FALSE, {0}},
+	{NET_MODE_2G, 0, FALSE, "2Gsignal0.png", FALSE, {0}},
+	{NET_MODE_2G, 5, TRUE, "2G_R_5.png", FALSE, {0}},
+	{NET_MODE_2G, 4, TRUE, "2G_R_4.png", FALSE, {0}},
+	{NET_MODE_2G, 3, TRUE, "2G_R_3.png", FALSE, {0}},
+	{NET_MODE_2G, 2, TRUE, "2G_R_2.png", FALSE, {0}},
+	{NET_MODE_2G, 1, TRUE, "2G_R_1.png", FALSE, {0}},
+	{NET_MODE_2G, 0, TRUE, "2G_R_0.png", FALSE, {0}},
+	{NET_MODE_NOSERVICE, 0, TRUE, "signalx.png", FALSE, {0}},
+	{NET_MODE_LIMITSERVICE, 0, TRUE, "signalx.png", FALSE, {0}},
+	{NET_MODE_DEFAULT, 0, TRUE, "signalx.png", FALSE, {0}},
+	{NET_MODE_NOTREADY, 0, TRUE, "no-sim.png", FALSE, {0}},
+};
+
+static T_NetSignalConfigInfo g_lcdOperatorConfigInfoTab[] = {
+	{NET_MODE_4G, 5, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 4, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 3, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 2, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 1, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 0, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 5, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 4, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 3, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 2, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 1, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_4G, 0, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 5, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 4, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 3, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 2, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 1, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 0, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 5, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 4, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 3, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 2, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 1, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_3G, 0, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 5, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 4, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 3, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 2, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 1, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 0, FALSE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 5, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 4, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 3, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 2, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 1, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_2G, 0, TRUE, "t-sel.png", FALSE, {0}},
+	{NET_MODE_NOSERVICE, 0, TRUE, "not-found.png", FALSE, {0}},
+	{NET_MODE_LIMITSERVICE, 0, TRUE, "not-found.png", FALSE, {0}},
+	{NET_MODE_DEFAULT, 0, TRUE, "not-found.png", FALSE, {0}},
+	{NET_MODE_NOTREADY, 0, TRUE, "no-sim.png", FALSE, {0}},
+};
+
+static CHAR* g_lcdNetConnectPicPath = "download.png";
+static BITMAP g_lcdNetConnectBmp = {0};
+/*WifiÁ¬½ÓÅäÖñí*/
+typedef struct {
+	E_zMmi_Wifi_State wifiState;
+	SINT32 connected_userNum;
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_WifiConfigInfo;
+
+static T_WifiConfigInfo g_lcdWifiConfigInfoTab[] = {
+	{WIFI_OFF, 0, "wifi_x.png", FALSE, {0}},
+	{WIFI_ON, 0, "wifi_0.png", FALSE, {0}},
+	{WIFI_ON, 1, "wifi_1.png", FALSE, {0}},
+	{WIFI_ON, 2, "wifi_2.png", FALSE, {0}},
+	{WIFI_ON, 3, "wifi_3.png", FALSE, {0}},
+	{WIFI_ON, 4, "wifi_4.png", FALSE, {0}},
+	{WIFI_ON, 5, "wifi_5.png", FALSE, {0}},
+	{WIFI_ON, 6, "wifi_6.png", FALSE, {0}},
+	{WIFI_ON, 7, "wifi_7.png", FALSE, {0}},
+	{WIFI_ON, 8, "wifi_8.png", FALSE, {0}},
+	{WIFI_ON, 9, "wifi_9.png", FALSE, {0}},
+	{WIFI_ON, 10, "wifi_10.png", FALSE, {0}},
+	{WIFI_ON, 11, "wifi_11.png", FALSE, {0}},
+	{WIFI_ON, 12, "wifi_12.png", FALSE, {0}},
+	{WIFI_ON, 13, "wifi_13.png", FALSE, {0}},
+	{WIFI_ON, 14, "wifi_14.png", FALSE, {0}},
+	{WIFI_ON, 15, "wifi_15.png", FALSE, {0}},
+	{WIFI_ON, 16, "wifi_16.png", FALSE, {0}},
+	{WIFI_ON, 17, "wifi_17.png", FALSE, {0}},
+	{WIFI_ON, 18, "wifi_18.png", FALSE, {0}},
+	{WIFI_ON, 19, "wifi_19.png", FALSE, {0}},
+	{WIFI_ON, 20, "wifi_20.png", FALSE, {0}},
+	{WIFI_ON, 21, "wifi_21.png", FALSE, {0}},
+	{WIFI_ON, 22, "wifi_22.png", FALSE, {0}},
+	{WIFI_ON, 23, "wifi_23.png", FALSE, {0}},
+	{WIFI_ON, 24, "wifi_24.png", FALSE, {0}},
+	{WIFI_ON, 25, "wifi_25.png", FALSE, {0}},
+	{WIFI_ON, 26, "wifi_26.png", FALSE, {0}},
+	{WIFI_ON, 27, "wifi_27.png", FALSE, {0}},
+	{WIFI_ON, 28, "wifi_28.png", FALSE, {0}},
+	{WIFI_ON, 29, "wifi_29.png", FALSE, {0}},
+	{WIFI_ON, 30, "wifi_30.png", FALSE, {0}},
+	{WIFI_ON, 31, "wifi_31.png", FALSE, {0}},
+	{WIFI_ON, 32, "wifi_32.png", FALSE, {0}}
+};
+
+typedef struct {
+	E_zMmi_WifiStation_State wifistationState;
+	SINT32 sigLevel;
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+
+} T_WifiStationConfigInfo;
+
+static T_WifiStationConfigInfo g_lcdWifiStationConfigInfoTab[] = {
+	{WIFISTATION_ON, 0, "/etc_ro/mmi/wifi_sig_0.png", FALSE, {0}},
+	{WIFISTATION_ON, 1, "/etc_ro/mmi/wifi_sig_1.png", FALSE, {0}},
+	{WIFISTATION_ON, 2, "/etc_ro/mmi/wifi_sig_2.png", FALSE, {0}},
+	{WIFISTATION_ON, 3, "/etc_ro/mmi/wifi_sig_3.png", FALSE, {0}},
+	{WIFISTATION_ON, 4, "/etc_ro/mmi/wifi_sig_4.png", FALSE, {0}}
+};
+
+typedef struct {
+	E_zMmi_WifiCode_State wificodeState;
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_WifiCodeConfigInfo;
+
+static T_WifiCodeConfigInfo g_lcdWifiCodeConfigInfoTab[] = {
+	{WIFICODE_MAIN, WIFICODE_MAIN_PATH, TRUE, {0}},
+	{WIFICODE_GUST1, WIFICODE_GUST1_PATH, TRUE, {0}}
+};
+
+typedef struct {
+	CHAR *path;
+	BOOL  isNeedReload;
+	BITMAP bmp;
+} T_LogoConfigInfo;
+
+static T_LogoConfigInfo g_lcdLogoConfigInfoTab[] = {
+	{"t-sel.png", FALSE, {0}}
+};
+
+/*****************************ÌáʾÐÅÏ¢Ïà¹Ø¶¨Òå******************************************/
+CHAR* g_mmiNewVersionBmpPath =  "fota_make_ready_0.png";
+BITMAP g_mmiNewVersionBmp = {0};
+
+typedef struct {
+	E_zMmi_Sim_Tip sim_state;
+	CHAR* tipString;
+} T_SimTipStringItem;
+
+T_SimTipStringItem g_simStaTipStringTab[] = {
+	{INSERT_SIM, "Insert SIM"},
+	{PIN_LOCK, "PIN Lock"},
+	{PUK_LOCK, "PUK Lock"},
+	{SIM_BUSY, "SIM Busy"},
+	{INVALID_SIM, "Invalid SIM"},
+	{SIM_LOCK, "SIM Lock"}
+};
+
+typedef struct {
+	E_zMmi_WpsAct_Tip wps_state;
+	CHAR* tipString;
+} T_WpsActTipStringItem;
+
+T_WpsActTipStringItem g_wpsActTipStringTab[] = {
+	{WPS_ACTIVING, "WPS Active Waiting"},
+	{WPS_DEACTIVING, "WPS Deactive Waiting"},
+	{WPS_ACTIVED, "WPS Active"},
+	{WPS_DEACTIVED, "WPS Deactive"},
+	{WPS_FAIL, "WPS Start Fail"},
+};
+
+typedef struct {
+	E_zMmi_NetCon_Tip net_con;
+	CHAR* tipString;
+} T_NetConTipStringItem;
+
+T_NetConTipStringItem g_netContTipStringTab[] = {
+	{NET_CONNECTING, "Connecting..."},
+	{NET_DISCONNECTING, "Disconnecting..."},
+	{NET_NOSERVICE, "No Service"},
+	{NET_LIMITSERVICE, "Limited Service"},
+	{NET_SEARCHING, "SIM Busy"},
+};
+
+
+typedef struct {
+	E_zMmi_Poc_State state;
+	CHAR* tips;
+} T_powerOffChargerTipsItem;
+
+static T_powerOffChargerTipsItem g_powerOffChargerLowBatteryTab[] = {
+	{POC_STATE_LOWBATTERY, "Low Battery"},
+	{POC_STATE_NOBATTERY, "No Battery"}
+};
+
+typedef struct {
+	E_zMMI_Fota_Tip fota_tip;
+	CHAR* tipString;
+} T_FotaTipStringItem;
+
+T_FotaTipStringItem g_FotaTipStringTab[] = {
+	{FOTA_DOWNLOADING, "Downloading"},
+	{FOTA_DOWNLOAD_FAILED, "Download failed"},
+	{FOTA_DOWNLOAD_OK, "Prepare to restart"},
+	{FOTA_DOWNLOAD_LOWBATTERY, "Low battery, please charge before update"},
+	{FOTA_UPDATE_SUCCESS, "Update success"},
+	{FOTA_UPDATE_FAILED, "Update failed"}
+};
+
+
+#define STRING_SSID 			"Wi-Fi SSID:"
+#define STRING_SSID1 			"SSID1:"
+#define STRING_SSID2 			"SSID2:"
+#define STRING_WIFIKEY		 	"Password:"
+
+#define STRING_FIRMWARE 		"Firmware Version:"
+#define STRING_VERSION 			"Version:"
+
+#define STRING_SCAN_TO          "Scan to"
+#define STRING_CONNECT          "Connect"
+
+//extern PLOGFONT mmi_middle_fourteen_font;
+extern PLOGFONT mmi_smallest_font;
+extern PLOGFONT mmi_small_font;
+extern PLOGFONT mmi_middle_twelve_font;
+extern PLOGFONT mmi_middle_sixteen_font;
+extern PLOGFONT mmi_middle_eight_font;
+
+/*****************************************************************************
+ ÒýÓñäÁ¿
+******************************************************************************/
+/* ÏÔʾͼƬ*/
+//static char* g_mmi_bitmem = NULL;
+static VOID mmi_showLcdPicture(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	BITMAP tempBitmap = {0};
+	VOID * temp = malloc((UINT32)(showInfo.bitmap->bmHeight * showInfo.bitmap->bmWidth * showInfo.bitmap->bmBytesPerPixel));
+	if(temp == NULL)
+	{
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_showLcdPicture no mem!!!\n");
+		return;
+	}
+	memcpy((VOID *)temp, (const VOID *)(showInfo.bitmap->bmBits), (UINT32)(showInfo.bitmap->bmHeight * showInfo.bitmap->bmWidth * showInfo.bitmap->bmBytesPerPixel));
+	memcpy((VOID *)(&tempBitmap), (const VOID *)showInfo.bitmap, sizeof(BITMAP));
+	tempBitmap.bmBits = temp;
+	FillBoxWithBitmap(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, \
+	                  g_LcdConfigInfoTab[showInfo.item].rect.top, RECTW(g_LcdConfigInfoTab[showInfo.item].rect), \
+	                  RECTH(g_LcdConfigInfoTab[showInfo.item].rect), &tempBitmap);
+	free(temp);
+}
+
+/* ÏÔʾÎÄ×Ö*/
+static BOOL g_ssid_need_scroll = FALSE;
+static BOOL g_wifikey_need_scroll = FALSE;
+static BOOL g_ssid2_need_scroll = FALSE;
+static BOOL g_wifikey2_need_scroll = FALSE;
+//static BOOL g_ssid1_need_scroll = FALSE;
+//static BOOL g_wifikey1_need_scroll = FALSE;
+static BOOL g_main_quota_need_scroll = FALSE;
+//static BOOL g_bonus_quota_need_scroll = FALSE;
+//static BOOL g_isdn_need_scroll = FALSE;
+static BOOL g_wifista_ssid_need_scroll = FALSE;
+
+static SINT32 iPos_ssid = 0;
+static SINT32 iPos_wifikey = 0;
+static SINT32 iPos_ssid2 = 0;
+static SINT32 iPos_wifikey2 = 0;
+//static SINT32 iPos_ssid1 = 0;
+//static SINT32 iPos_wifikey1 = 0;
+static SINT32 iPos_main_quota = 0;
+//static SINT32 iPos_bonus_quota = 0;
+//static SINT32 iPos_isdn = 0;
+static SINT32 iPos_wifista_ssid = 0;
+
+SINT32 mmi_scroll_text_timer_fb()
+{
+	if (g_ssid_need_scroll || g_wifikey_need_scroll || g_ssid2_need_scroll || g_wifikey2_need_scroll/* ||g_ssid1_need_scroll || g_wifikey1_need_scroll*/) {
+		mmi_set_update_flag(MMI_TASK_SSID);
+	} else if (g_main_quota_need_scroll) {
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+	} else if (g_wifista_ssid_need_scroll) {
+		mmi_set_update_flag(MMI_TASK_TIP_WIFISTATION);
+	}
+	return 0;
+}
+
+/*ÊÇ·ñÐèÒª¹ö¶¯ÏÔʾ*/
+BOOL isNeedScroll(T_LcdShowInfoItem showInfo)
+{
+	if (showInfo.item == LCD_SHOW_WIFI_SSID || showInfo.item == LCD_SHOW_WIFI_PASSWORD ||
+	    showInfo.item == LCD_SHOW_WIFI_SSID2 || showInfo.item == LCD_SHOW_WIFI_PASSWORD2/*||
+        showInfo.item == LCD_SHOW_WIFI_PASSWORD1 || showInfo.item == LCD_SHOW_WIFI_SSID1 */) {
+		if (showInfo.textLen > MMI_LCD_CHAR8_MAX_LEN) {
+			return FALSE;
+		}
+	} else {
+		if (showInfo.textLen > MMI_LCD_CHAR9_MAX_LEN) {
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+static SINT32 mmi_showWifiInfoText(T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	if (isNeedScroll(showInfo)) {
+		if (showInfo.item == LCD_SHOW_WIFI_SSID) {
+			g_ssid_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_ssid);
+		} else if (showInfo.item == LCD_SHOW_WIFI_PASSWORD) {
+			g_wifikey_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_wifikey);
+		} else if (showInfo.item == LCD_SHOW_WIFI_SSID2) {
+			g_ssid2_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_ssid2);
+		} else if (showInfo.item == LCD_SHOW_WIFI_PASSWORD2) {
+			g_wifikey2_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_wifikey2);
+		}
+
+		/*else if(showInfo.item == LCD_SHOW_WIFI_SSID1)
+		{
+			g_ssid1_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT|DT_VCENTER, &iPos_ssid1);
+		}
+		else if(showInfo.item == LCD_SHOW_WIFI_PASSWORD1)
+		{
+			g_wifikey1_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT|DT_VCENTER, &iPos_wifikey1);
+		}*/
+		//#if MMI_SHOW_PAGE_THIRD_ON
+		else if (g_show_pagefirst && showInfo.item == LCD_SHOW_TRAFFIC) {
+			g_main_quota_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER, &iPos_main_quota);
+		}
+		//#endif
+		else if (showInfo.item == LCD_SHOW_TIP_WIFISTA_SSID) {
+			g_wifista_ssid_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT | DT_VCENTER | DT_SINGLELINE, &iPos_wifista_ssid);
+		}
+		/*else if(showInfo.item == LCD_SHOW_TRAFFIC1)
+		{
+			g_bonus_quota_need_scroll = TRUE;
+			DrawScrollText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_LEFT|DT_VCENTER, &iPos_bonus_quota);
+		}*/
+		mmi_startLcdShowScrollSSIDTimer(mmi_scroll_text_timer_fb);
+	} else {
+		if (showInfo.item == LCD_SHOW_WIFI_SSID) {
+			iPos_ssid = 0;
+			g_ssid_need_scroll = FALSE;
+		} else if (showInfo.item == LCD_SHOW_WIFI_PASSWORD) {
+			iPos_wifikey = 0;
+			g_wifikey_need_scroll = FALSE;
+		} else if (showInfo.item == LCD_SHOW_WIFI_SSID2) {
+			iPos_ssid2 = 0;
+			g_ssid2_need_scroll = FALSE;
+		} else if (showInfo.item == LCD_SHOW_WIFI_PASSWORD2) {
+			iPos_wifikey2 = 0;
+			g_wifikey2_need_scroll = FALSE;
+		}
+		/*else if(showInfo.item == LCD_SHOW_WIFI_SSID1)
+		{
+			iPos_ssid1 = 0;
+			g_ssid1_need_scroll = FALSE;
+		}
+		else if(showInfo.item == LCD_SHOW_WIFI_PASSWORD1)
+		{
+			iPos_wifikey1= 0;
+			g_wifikey1_need_scroll = FALSE;
+		}*/
+		//#if MMI_SHOW_PAGE_THIRD_ON
+		else if (g_show_pagefirst && showInfo.item == LCD_SHOW_TRAFFIC) { //corem
+			iPos_main_quota = 0;
+			g_main_quota_need_scroll = FALSE;
+		}
+		//#endif
+		/*else if(showInfo.item == LCD_SHOW_TRAFFIC1)
+		{
+			iPos_bonus_quota= 0;
+			g_bonus_quota_need_scroll= FALSE;
+		}*/
+		else if (showInfo.item == LCD_SHOW_TIP_WIFISTA_SSID) {
+			iPos_wifista_ssid = 0;
+			g_wifista_ssid_need_scroll = FALSE;
+		}
+		if (!g_ssid_need_scroll && !g_wifikey_need_scroll && !g_ssid2_need_scroll
+		    && !g_wifikey2_need_scroll/*&& !g_ssid1_need_scroll && !g_wifikey1_need_scroll */
+		    && !g_main_quota_need_scroll && ! g_wifista_ssid_need_scroll/*&& !g_isdn_need_scroll&& !g_bonus_quota_need_scroll*/) {
+			mmi_stopLcdShowScrollSSIDTimer();
+		}
+		DrawText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), showInfo.nFormat);
+	}
+	return 0;
+}
+static SINT32 mmi_showLcdText(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	SetBkMode(hdc, BM_TRANSPARENT);
+	SelectFont(hdc, showInfo.font);
+	if (showInfo.color != 0) {
+		SetTextColor(hdc, showInfo.color);
+	} else {
+		SetTextColor(hdc, PIXEL_lightwhite);
+	}
+
+	if (showInfo.item == LCD_SHOW_WIFI_SSID || showInfo.item == LCD_SHOW_WIFI_PASSWORD ||
+	    showInfo.item == LCD_SHOW_WIFI_SSID2 || showInfo.item == LCD_SHOW_WIFI_PASSWORD2/* || */
+
+	    //#if MMI_SHOW_PAGE_THIRD_ON
+	    /* showInfo.item == LCD_SHOW_WIFI_SSID1|| showInfo.item == LCD_SHOW_WIFI_PASSWORD1*/ ||
+	    (g_show_pagefirst && showInfo.item == LCD_SHOW_TRAFFIC)/*|| showInfo.item == LCD_SHOW_TRAFFIC1 ||*/
+	    // #endif
+	    || showInfo.item == LCD_SHOW_TIP_WIFISTA_SSID) {
+		mmi_showWifiInfoText(showInfo, hdc);
+	} else if (showInfo.item == LCD_SHOW_TIP_WPS_ACTIVE) { /* ÐèÇóÒªÇówaiting·ÅÏÂÒ»ÐоÓÖÐÏÔʾ*/
+		CHAR * iPos = NULL;
+		CHAR * sPstr = "Waiting";
+
+		if (!showInfo.text) {
+			return 0;
+		}
+		if ((iPos = strstr(showInfo.text, sPstr)) != NULL) { /* Èç¹ûÓÐwaiting,·ÖÁ½ÐÐÏÔʾ*/
+			SINT32 iLen = iPos - showInfo.text ;
+			RECT nRect;
+
+			//zOss_Printf(SUBMDL_FS, PRINT_LEVEL_ABNORMAL, "ZTE_MMI mmi_showLcdText showInfo.textLen is %d,  iLen is %d\n", showInfo.textLen, iLen);
+			DrawText(hdc, showInfo.text, iLen - 1, &(g_LcdConfigInfoTab[showInfo.item].rect), DT_CENTER);
+
+			nRect.top = g_LcdConfigInfoTab[showInfo.item].rect.bottom - 17;
+			nRect.left = g_LcdConfigInfoTab[showInfo.item].rect.left;
+			nRect.right = g_LcdConfigInfoTab[showInfo.item].rect.right;
+			nRect.bottom = g_LcdConfigInfoTab[showInfo.item].rect.bottom + 17;
+			DrawText(hdc, sPstr,  strlen(sPstr), &nRect, DT_CENTER);
+		} else {
+			DrawText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), showInfo.nFormat);
+		}
+	} else {
+		DrawText(hdc, showInfo.text, showInfo.textLen, &(g_LcdConfigInfoTab[showInfo.item].rect), showInfo.nFormat);
+	}
+	return 0;
+}
+/* Ìî³ä·½¿ò*/
+static SINT32 mmi_showLcdRect(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	SetBrushColor(hdc, showInfo.color);
+	FillBox(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.top, RECTW(g_LcdConfigInfoTab[showInfo.item].rect), RECTH(g_LcdConfigInfoTab[showInfo.item].rect));
+	return 0;
+}
+
+/* »æÖÆ·½¿òÉÏÏÂÁ½ÌõÏß*/
+static SINT32 mmi_showLcdRectHLines(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	SetPenColor(hdc, showInfo.color);
+	//Draw_LineToEx(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.top, g_LcdConfigInfoTab[showInfo.item].rect.right, g_LcdConfigInfoTab[showInfo.item].rect.top);
+	//Draw_LineToEx(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.bottom - 1, g_LcdConfigInfoTab[showInfo.item].rect.right, g_LcdConfigInfoTab[showInfo.item].rect.bottom - 1);
+	Draw_Rectangle(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.top, g_LcdConfigInfoTab[showInfo.item].rect.right - 1, g_LcdConfigInfoTab[showInfo.item].rect.bottom - 1);
+	return 0;
+}
+
+/* »æÖÆË®Æ½ÃæÏßÏß*/
+static SINT32 mmi_showLcdHLines(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	SetPenColor(hdc, showInfo.color);
+	Draw_MoveTo(hdc, g_LcdConfigInfoTab[showInfo.item].rect.left, g_LcdConfigInfoTab[showInfo.item].rect.top);
+	Draw_LineTo(hdc, g_LcdConfigInfoTab[showInfo.item].rect.right, g_LcdConfigInfoTab[showInfo.item].rect.bottom);
+	return 0;
+}
+
+/* Ìî³ä±³¾°Í¼Æ¬*/
+extern BITMAP g_mmiMainBg;
+static SINT32 mmi_showLcdBackgound(HWND hwnd, T_LcdShowInfoItem showInfo, HDC hdc)
+{
+	FillBoxWithBitmap(hdc, 0, 0, 128, 128, &g_mmiMainBg);
+	return 0;
+}
+
+/* Ë¢ÐÂÆÁÄ» */
+SINT32 mmi_invalidateLcd(VOID* taskinfo)
+{
+	if (taskinfo == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_showLcd lcdInfo is null!!!\n");
+		return MMI_ERROR;
+	}
+	if (mmi_Ispoweron_state()) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_invalidateLcd poweron or poweroff now!!!\n");
+		return MMI_ERROR;
+	}
+#if 0
+	if (showInfo->type == LCD_SHOW_INVLAID) {
+		zOss_Printf(SUBMDL_FS, PRINT_LEVEL_ABNORMAL, "ZTE_MMI showInfo type is LCD_SHOW_INVLAID!!!\n");
+		return MMI_ERROR;
+	}
+#endif
+#if 0
+	if (showInfo->type == LCD_SHOW_PICTURE || showInfo->type == LCD_SHOW_TEXT || showInfo->type == LCD_SHOW_RECT) {
+		wndInvalidateRect(mmi_getMainWnd(), &(showInfo->rect), FALSE);
+	} else {
+		InvalidateRect(mmi_getMainWnd(), &(showInfo->rect), FALSE);
+	}
+#endif
+	InvalidateRect(mmi_getMainWnd(), NULL, FALSE);
+	return MMI_SUCCESS;
+}
+
+/*ÏÔʾÆÁÄ»ÐÅÏ¢*/
+T_LcdShowInfoItem show_item_now = {0};
+
+SINT32 mmi_showLcdItem(T_LcdShowInfoItem showInfo, HDC hdc)
+{
+
+	show_item_now = showInfo;
+	switch (showInfo.type) {
+	case LCD_SHOW_PICTURE:
+		mmi_showLcdPicture(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_TEXT:
+		mmi_showLcdText(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_RECT:
+		mmi_showLcdRect(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_BOX:
+		mmi_showLcdRectHLines(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_BACKGROUD:
+		//mmi_showLcdBackgound(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	case LCD_SHOW_HLINE:
+		mmi_showLcdHLines(mmi_getMainWnd(), showInfo, hdc);
+		break;
+	default:
+		break;
+	}
+	return MMI_SUCCESS;
+}
+
+BOOL mmi_iswificodeItem(E_LCD_SHOW_CONTENT_ITEM item)
+{
+	if (g_show_pagethird)
+		return (item == LCD_SHOW_WIFI_CODE);
+
+	else
+		return FALSE;
+}
+BOOL mmi_isItemNeedShow(E_LCD_SHOW_CONTENT_ITEM item)
+{
+	if (mmi_get_lcd_page_index() == MMI_SHOW_PAGE_THIRD) { //&& mmi_get_wps_switch_flag() == TRUE)
+		return mmi_iswificodeItem(item);
+	} else {
+		return !mmi_iswificodeItem(item);
+	}
+}
+
+
+void mmi_lcd_backlight_start(void)
+{
+	send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_AT_FILTER_REQ, 0, NULL);
+
+	slog(MMI_PRINT, SLOG_NORMAL, "[TEST]mmi_lcd_backlight_start\n");
+
+	tp_man_lcd_backlight_start(255);
+}
+
+
+void mmi_lcd_backlight_end(void)
+{
+	char indNeedAt[AT_CMD_MAX] = "+ZMMI+ZURDY+ZUSLOT+ZICCID^MODE+ZPBIC+ZMSRI+CREG+CEREG+CGREG+CGEV+ZGIPDNS^DSCI+ZCPI+CMT+CMTI+CDS+CDSI";
+
+	slog(MMI_PRINT, SLOG_NORMAL, "[TEST]mmi_lcd_backlight_end\n");
+
+	send_soc_msg(NEAR_PS, MODULE_ID_AT_CTL, MSG_CMD_AT_FILTER_REQ, strlen(indNeedAt), indNeedAt);
+
+	tp_man_lcd_backlight_end();
+}
+
+/*ÏÔʾÆÁÄ»ÐÅÏ¢*/
+SINT32 mmi_showLcd(HDC hdc)
+{
+	UINT32  i = 0;
+	mmi_getMutex(&g_mmi_refresh_lcd_mutex);
+	if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+		mmi_showLcdItem(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER], hdc);
+	} else {
+		for (i = 0; i < sizeof(g_LcdShowInfoTab) / sizeof(T_LcdShowInfoItem); ++ i) {
+#if 0
+			if (!mmi_isItemNeedShow(g_LcdShowInfoTab[i].item)) {
+				continue;
+			}
+#endif
+			if (g_LcdShowInfoTab[i].needShowFL && g_LcdShowInfoTab[i].needShow && g_LcdShowInfoTab[i].type != LCD_SHOW_INVLAID) {
+				mmi_showLcdItem(g_LcdShowInfoTab[i], hdc);
+			}
+		}
+	}
+	zCore_Set_SkipUpdateflag(FALSE);
+	mmi_putMutex(&g_mmi_refresh_lcd_mutex);
+	return 0;
+}
+
+VOID mmi_set_poweroff_charge_show(BOOL showflag)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_set_poweroff_charge_show\n");
+	g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].needShow = showflag;
+}
+static VOID mmi_setPowerOffAniInfo(E_zMmi_Work_Mode mode)
+{
+	tp_man_Lcd_Sleep_Exit();
+	mmi_lcd_backlight_start();
+	switch (mode) {
+	case MMI_POWEROFF_MODE:
+		mmi_startPowerOffFrame();
+		break;
+	case MMI_RESET_MODE:
+		mmi_startPowerResetFrame();
+		break;
+	case MMI_RESTART_MODE:
+		mmi_startPowerRestartFrame();
+		break;
+	default:
+		break;
+	}
+}
+SINT32 mmi_getLcdCtrlInfo(UINT32 taskInfo)
+{
+	E_zMmi_Work_Mode workMode = *(E_zMmi_Work_Mode*)taskInfo;
+	switch (workMode) {
+	case MMI_POWERON_MODE:
+		mmi_startPowerOnFrame();
+		break;
+	case MMI_FAST_POWERON_MODE:
+		tp_man_Lcd_Sleep_Exit();
+		mmi_setMainWindToBg();
+		mmi_startFastPowerOnFrame();
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_SECOND);
+		mmi_lcd_backlight_start();
+		break;
+	/*case MMI_POWEROFF_MODE:
+		//tp_man_Lcd_Sleep_Exit();
+		//tp_man_lcd_backlight_start(255);
+		mmi_startPowerOffFrame();
+		break;
+	case MMI_RESET_MODE:
+		mmi_startPowerResetFrame();
+		break;
+	case MMI_RESTART_MODE:
+		mmi_startPowerRestartFrame();
+		break;*/
+	case MMI_BACKLIGHT_HALFBRIGHT_MODE:
+		tp_man_lcd_set_brightness(32);
+		break;
+	case MMI_BACKLIGHT_OFF_MODE:
+	case MMI_FAKE_POWEROFF_MODE:
+		mmi_setMainWindToBg();//¹Ø±³¹âǰ½«ÆÁĻˢºÚ
+		mmi_lcd_backlight_end();
+		tp_man_Lcd_Sleep_Enter();
+		set_wake_unlock(MMI_MAIN_LOCK_ID);
+		break;
+	case MMI_ACTIVE_MODE:
+	case MMI_FAKE_POWEROFF_CHARGE_MODE:
+		tp_man_Lcd_Sleep_Exit();
+		mmi_lcd_backlight_start();
+		break;
+	default:
+		break;
+	}
+	if (workMode == MMI_POWEROFF_MODE || workMode == MMI_RESET_MODE || workMode == MMI_RESTART_MODE) {
+		mmi_setPowerOffAniInfo(workMode);
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_getBitmapFromFile(PBITMAP pdesBitmap, CHAR* path, PBITMAP psrcBitmap, BOOL isNeedReload)
+{
+	CHAR * sPstr[2] = {"/", "\\"};
+	CHAR sPath[64] = {0};
+	CHAR *iPos = NULL;
+	int i = 0;
+	SINT32 ret = -1;
+	BITMAP tempBitmap = {0};
+	BITMAP tempBitmapFree = {0};
+
+	for (i = 0; i < 2; i++) {
+		if ((iPos = strstr(path, sPstr[i])) != NULL)
+			break;
+	}
+	if (iPos == NULL) {
+		//strcpy(sPath, MMI_RESOURCE_PATH);
+		//strcat(sPath, path);
+		snprintf(sPath, sizeof(sPath), MMI_RESOURCE_PATH"%s", path);
+	} else {
+		strncpy(sPath, path, sizeof(sPath)-1);
+	}
+
+	if (psrcBitmap == NULL) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_getBitmapFromFile psrcBitmap=NULL!!\n");
+		return -1;
+	}
+
+	if (!isNeedReload && psrcBitmap->bmBits != NULL) {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getBitmapFromFile memcpy ,path:%s!!!\n", path);
+		memcpy((VOID *)pdesBitmap, (const VOID *)psrcBitmap, sizeof(BITMAP));
+		return 0;
+	} else {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getBitmapFromFile reload ,path:%s!!!\n", path);
+		if (!isNeedReload) {
+			ret = LoadBitmapFromFile(HDC_SCREEN, psrcBitmap, sPath);
+			if (ret != 0) {
+				slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI load bitmap failed path:%s!!!\n", path);
+			}
+			memcpy((VOID *)pdesBitmap, (const VOID *)psrcBitmap, sizeof(BITMAP));
+		} else {
+			memcpy((VOID *)(&tempBitmapFree), (const VOID *)pdesBitmap, sizeof(BITMAP));
+			ret = LoadBitmapFromFile(HDC_SCREEN, &tempBitmap, sPath);
+			if (ret != 0) {
+				slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI load bitmap failed path:%s!!!\n", path);
+			}
+			memcpy((VOID *)pdesBitmap, (const VOID *)(&tempBitmap), sizeof(BITMAP));
+			UnloadBitmap(&tempBitmapFree);
+		}
+		return ret;
+	}
+}
+
+#if 1
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐÅlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+static BOOL g_LastNewSmsHasShow = FALSE;
+static BOOL g_LastFullSmsHasShow = FALSE;
+
+VOID mmi_getLcdSmsNewInfo(SINT32 smsUnreadCount)
+{
+	if (smsUnreadCount > 0) {
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_PICTURE;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_SMS].bitmap, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_NEW].path,
+		                          &g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_NEW].bmp, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_NEW].isNeedReload) != 0)
+
+		{
+			g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+		}
+
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_TEXT;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].font = mmi_smallest_font;
+		memset(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, 0, MMI_LCD_SHOW_STRING_LEN);
+		//sprintf(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, "58");
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, "%d", smsUnreadCount);
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text);
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].color = PIXEL_red;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].needShow = TRUE;
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_INVLAID;
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+	}
+}
+
+VOID mmi_getLcdSmsUnreadInfo(SINT32 smsUnreadCount)
+{
+	if (smsUnreadCount > 0) {
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_PICTURE;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_SMS].bitmap, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_UNREAD].path,
+		                          &g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_UNREAD].bmp, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_UNREAD].isNeedReload) != 0) {
+			g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+		}
+
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_TEXT;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].font = mmi_smallest_font;
+		memset(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, 0, MMI_LCD_SHOW_STRING_LEN);
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text, "%d", smsUnreadCount);
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].text);
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].color = PIXEL_red;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].needShow = TRUE;
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_INVLAID;
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+	}
+}
+
+VOID mmi_getLcdSmsFullInfo()
+{
+	g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_PICTURE;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_SMS].bitmap, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_FULL].path,
+	                          &g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_FULL].bmp, g_SmsConfigInfoTab[SMS_RECVBOX_STATUS_FULL].isNeedReload) != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLcdSmsFullInfo LastFullSmsHasShow==false!!!\n");
+}
+
+SINT32 mmi_getLcdSmsInfo(UINT32 taskInfo)
+{
+	T_zMmi_Sms_Info *pSmsInfo = (T_zMmi_Sms_Info*)taskInfo;
+	SINT32 smsUnreadNum = pSmsInfo->mSmsNum;
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLcdSmsInfo status = %d!!!", pSmsInfo->recvBox_sta);
+	switch (pSmsInfo->recvBox_sta) {
+	case SMS_RECVBOX_STATUS_UNREAD:
+		mmi_getLcdSmsUnreadInfo(smsUnreadNum);
+		break;
+	case SMS_RECVBOX_STATUS_NEW:
+		mmi_getLcdSmsNewInfo(smsUnreadNum);
+		break;
+	case SMS_RECVBOX_STATUS_FULL:
+		mmi_getLcdSmsFullInfo();
+		break;
+	default:
+		g_LcdShowInfoTab[LCD_SHOW_SMS].type = LCD_SHOW_INVLAID;
+		g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].type = LCD_SHOW_INVLAID;
+		break;
+	}
+	return MMI_SUCCESS;
+}
+#endif
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µç³ØlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+static BOOL g_LastNullBatteryHasShow = FALSE;
+static VOID mmi_getLcdBatteryLowInfo(T_zMMIBatteryInfo *pBatteryInfo)
+{
+#if 0
+	if (pBatteryInfo->bat_grid == 0) { //0-5%,ÐèÇóÒªÇóСµÈÓÚ5£¬ÏÔʾºì¿ò0¸ñ
+		mmi_startLcdBatteryTimer((SINT32)MMI_TASK_BATTERY);
+		if (!g_LastNullBatteryHasShow) {
+			g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = g_LcdConfigInfoTab[LCD_SHOW_BATTERY].type;
+			if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_BATTERY].bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_NULL].path,
+			                          &g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_NULL].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_NULL].isNeedReload) != 0) {
+				g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+			}
+			g_LastNullBatteryHasShow = TRUE;
+		} else {
+			g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_BACKGROUD;
+			g_LastNullBatteryHasShow = FALSE;
+		}
+	} else if (pBatteryInfo->bat_grid == 1) { //5%-25%ÐèÇóÒªÇó5-25£¬ÏÔʾºìÉ«1¸ñ
+		g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = g_LcdConfigInfoTab[LCD_SHOW_BATTERY].type;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_BATTERY].bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].path,
+		                          &g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].isNeedReload) != 0) {
+			g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+		}
+
+	}
+#endif
+	g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = g_LcdConfigInfoTab[LCD_SHOW_BATTERY].type;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_BATTERY].bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].path,
+								&g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_LOWER].isNeedReload) != 0)
+	{
+		g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+	}
+
+	return;
+}
+
+static VOID mmi_innerGetLcdBatteryCharinginfo(SINT32 task, T_LcdShowInfoItem* item)
+{
+	item->type = LCD_SHOW_PICTURE;
+	if (item->last < E_BATTERY_LEVEL_0 || item->last >= E_BATTERY_LEVEL_4) {
+		item->last = E_BATTERY_LEVEL_0;
+	} else {
+		(item->last)++;
+	}
+	if (task == MMI_TASK_POWEROFF_CHARGER || mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+		if (mmi_getBitmapFromFile(item->bitmap, g_lcdPowerOffBatteryConfigInfo[item->last].path,
+		                          &g_lcdPowerOffBatteryConfigInfo[item->last].bmp, g_lcdPowerOffBatteryConfigInfo[item->last].isNeedReload) != 0) {
+			item->type = LCD_SHOW_INVLAID;
+		}
+	} else {
+		if (mmi_getBitmapFromFile(item->bitmap, g_lcdBatteryConfigInfo[item->last].path,
+		                          &g_lcdBatteryConfigInfo[item->last].bmp, g_lcdBatteryConfigInfo[item->last].isNeedReload) != 0) {
+			item->type = LCD_SHOW_INVLAID;
+		}
+	}
+	mmi_startLcdBatteryTimer(task);
+}
+static VOID mmi_getLcdBatteryCharinginfo()
+{
+	g_LcdShowInfoTab[LCD_SHOW_POWER].needShow = FALSE;
+	if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+		mmi_innerGetLcdBatteryCharinginfo(MMI_TASK_BATTERY, &(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER]));
+	} else {
+		mmi_innerGetLcdBatteryCharinginfo(MMI_TASK_BATTERY, &(g_LcdShowInfoTab[LCD_SHOW_BATTERY]));
+	}
+
+}
+
+static VOID mmi_innerGetLcdBatteryFullinfo(T_LcdShowInfoItem* item)
+{
+	item->type = LCD_SHOW_PICTURE;
+	if (item->item == LCD_SHOW_POWER_OFF_CHARGER) {
+		if (mmi_getBitmapFromFile(item->bitmap, g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].path,
+		                          &g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].bmp, g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].isNeedReload) != 0) {
+			item->type = LCD_SHOW_INVLAID;
+		}
+	} else {
+		if (mmi_getBitmapFromFile(item->bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_4].path,
+		                          &g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_4].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_4].isNeedReload) != 0)
+
+		{
+			item->type = LCD_SHOW_INVLAID;
+		}
+	}
+}
+
+static VOID mmi_innerGetLcdOverVoltageinfo(T_LcdShowInfoItem* item)
+{
+	item->type = LCD_SHOW_PICTURE;
+	if (mmi_getBitmapFromFile(item->bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_OVERVOL].path,
+	                          &g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_OVERVOL].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_OVERVOL].isNeedReload) != 0) {
+		item->type = LCD_SHOW_INVLAID;
+	}
+}
+static VOID mmi_getLcdBatteryFullinfo(T_zMMIBatteryInfo *pBatteryInfo)
+{
+	if (mmi_get_lcd_mode() == MMI_FAKE_POWEROFF_CHARGE_MODE) {
+		mmi_innerGetLcdBatteryFullinfo(&(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER]));
+	} else {
+		mmi_innerGetLcdBatteryFullinfo(&(g_LcdShowInfoTab[LCD_SHOW_BATTERY]));
+	}
+}
+
+static VOID mmi_getLcdBatteryNormalinfo(T_zMMIBatteryInfo *pBatteryInfo)
+{
+	g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = g_LcdConfigInfoTab[LCD_SHOW_BATTERY].type;
+	g_LcdShowInfoTab[LCD_SHOW_CHARRING].needShow = FALSE;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_BATTERY].bitmap, g_lcdBatteryConfigInfo[pBatteryInfo->bat_grid + E_BATTERY_LEVEL_0].path,
+	                          &g_lcdBatteryConfigInfo[pBatteryInfo->bat_grid + E_BATTERY_LEVEL_0].bmp, g_lcdBatteryConfigInfo[pBatteryInfo->bat_grid + E_BATTERY_LEVEL_0].isNeedReload) != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+	}
+
+	if (STATE_CHARGING == pBatteryInfo->chg_state)
+	{
+		g_LcdShowInfoTab[LCD_SHOW_CHARRING].needShow = TRUE;
+		g_LcdShowInfoTab[LCD_SHOW_CHARRING].type = g_LcdConfigInfoTab[LCD_SHOW_CHARRING].type;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_CHARRING].bitmap, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_CHARRING].path,
+			&g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_CHARRING].bmp, g_lcdBatteryConfigInfo[E_BATTERY_LEVEL_CHARRING].isNeedReload) != 0)
+		{
+			g_LcdShowInfoTab[LCD_SHOW_CHARRING].type = LCD_SHOW_INVLAID;
+		}
+	}
+}
+
+SINT32 mmi_getLcdBatteryInfo(UINT32 taskInfo)
+{
+	T_zMMIBatteryInfo *pBatteryInfo = (T_zMMIBatteryInfo *)taskInfo;
+	g_LcdShowInfoTab[LCD_SHOW_BATTERY].type = LCD_SHOW_INVLAID;
+	mmi_stopLcdBatteryTimer();
+	switch (pBatteryInfo->chg_state) {
+	case STATE_CHARGING://charging
+		//mmi_getLcdBatteryCharinginfo();
+		mmi_getLcdBatteryNormalinfo(pBatteryInfo);
+		break;
+	case STATE_FULL://full
+		mmi_getLcdBatteryFullinfo(pBatteryInfo);
+		break;
+	case STATE_DISCHARGE: { //discharge
+#if 0
+		if (pBatteryInfo->bat_level == VOLT_5PERCENTLEVEL || pBatteryInfo->bat_level == VOLT_10PERCENTLEVEL
+		    || pBatteryInfo->bat_level == VOLT_20PERCENTLEVEL || pBatteryInfo->bat_level == VOLT_25PERCENTLEVEL) {
+			mmi_getLcdBatteryLowInfo(pBatteryInfo);
+		} else {
+			mmi_getLcdBatteryNormalinfo(pBatteryInfo);
+		}
+		break;
+#endif
+		mmi_getLcdBatteryNormalinfo(pBatteryInfo);
+		break;
+	}
+	case STATE_CHARGERROR:
+		break;
+	default:
+		break;
+	}
+
+	return MMI_SUCCESS;
+}
+SINT32 mmi_getLcdPowerInfo(UINT32 taskInfo)
+{
+	T_zMMIBatteryInfo *pBatteryInfo = (T_zMMIBatteryInfo *)taskInfo;
+	g_LcdShowInfoTab[LCD_SHOW_POWER].type = LCD_SHOW_TEXT;
+	if (!mmi_getFotaNewVersionInfo()) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].needShow = FALSE;
+		if (pBatteryInfo->chg_state != STATE_CHARGING) {
+			g_LcdShowInfoTab[LCD_SHOW_POWER].needShow = TRUE;
+		}
+		g_LcdShowInfoTab[LCD_SHOW_POWER].font = mmi_small_font;
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_POWER].text, "%d\%%", pBatteryInfo->bat_pers);
+		g_LcdShowInfoTab[LCD_SHOW_POWER].textLen = 0;
+		if (g_LcdShowInfoTab[LCD_SHOW_POWER].text != NULL) {
+			g_LcdShowInfoTab[LCD_SHOW_POWER].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_POWER].text);
+		}
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡wifiStationÁ¬½ÓʱlcdÏÔʾͼƬµÄ·¾¶ÐÅÏ¢  (СͼƬ»º´æÐÞ¸Äʱ ¸ÄΪ·µ»ØË÷Òý)
+***********************************************************************************/
+
+UINT32 mmi_getLcdWifiStationPicturePathFromWifiStationInfo(T_zMMIWifiStationInfo * wifistationInfo)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_lcdWifiStationConfigInfoTab) / sizeof(T_WifiStationConfigInfo); ++ i) {
+		if (wifistationInfo->signal_num == g_lcdWifiStationConfigInfoTab[i].sigLevel) {
+			break;
+		}
+	}
+	return i;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+
+UINT32 mmi_getLcdNetPicturePathFromNetInfo(T_zMMINetInfo * netInfo)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_lcdNetSignalConfigInfoTab) / sizeof(T_NetSignalConfigInfo); ++ i) {
+		if (netInfo->net_mode == NET_MODE_NOSERVICE || netInfo->net_mode == NET_MODE_LIMITSERVICE || netInfo->net_mode == NET_MODE_DEFAULT) {
+			if (netInfo->net_mode == g_lcdNetSignalConfigInfoTab[i].netMode) {
+				break;
+			}
+		} else {
+			if (netInfo->net_mode == g_lcdNetSignalConfigInfoTab[i].netMode && netInfo->signal_num == g_lcdNetSignalConfigInfoTab[i].sigLevel &&
+			    netInfo->roam_mode == g_lcdNetSignalConfigInfoTab[i].isRoam) {
+				break;
+			}
+		}
+	}
+	return i;
+}
+SINT32 mmi_getLcdNetInfo(UINT32 taskInfo)
+{
+	T_zMMINetInfo * pNetInfo = (T_zMMINetInfo *)taskInfo;
+	UINT32 nettab_index = 0;
+	char mmi_nv_value[32] = {0};
+	
+	g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].type = LCD_SHOW_INVLAID;
+	//g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].needShow = TRUE;
+
+	nettab_index = mmi_getLcdNetPicturePathFromNetInfo(pNetInfo);
+	if (nettab_index >= sizeof(g_lcdNetSignalConfigInfoTab) / sizeof(T_NetSignalConfigInfo))
+		return MMI_ERROR;
+
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].bitmap, g_lcdNetSignalConfigInfoTab[nettab_index].path,
+	                          &g_lcdNetSignalConfigInfoTab[nettab_index].bmp, g_lcdNetSignalConfigInfoTab[nettab_index].isNeedReload) == 0) {
+		g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].type = LCD_SHOW_PICTURE;
+	}
+
+	if (pNetInfo->net_mode == NET_MODE_NOSERVICE || pNetInfo->net_mode == NET_MODE_LIMITSERVICE || pNetInfo->net_mode == NET_MODE_DEFAULT)
+	{
+		cfg_get_item(NV_MODEM_MAIN_STATE, mmi_nv_value, sizeof(mmi_nv_value));
+		if (strcmp(mmi_nv_value, NV_SIM_STATE_INIT_COMPLETE))
+		{
+			nettab_index = sizeof(g_lcdOperatorConfigInfoTab) / sizeof(T_NetSignalConfigInfo) - 1; // no sim
+		}
+	}
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_OPERATOR].bitmap, g_lcdOperatorConfigInfoTab[nettab_index].path,
+	                          &g_lcdOperatorConfigInfoTab[nettab_index].bmp, g_lcdOperatorConfigInfoTab[nettab_index].isNeedReload) == 0) {
+		g_LcdShowInfoTab[LCD_SHOW_OPERATOR].type = LCD_SHOW_PICTURE;
+	}
+#if 0
+	if (pNetInfo->connect_status == 1 && pNetInfo->net_mode != NET_MODE_NOSERVICE && pNetInfo->net_mode != NET_MODE_LIMITSERVICE) { //e58
+		g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = FALSE;
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShow = TRUE;
+
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].bitmap, g_lcdNetConnectPicPath, &g_lcdNetConnectBmp, FALSE) == 0) {
+			g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].type = LCD_SHOW_PICTURE;
+		}
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShow = FALSE;
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].type = LCD_SHOW_INVLAID;
+		if (mmi_get_wifiStationConnect_state()) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = TRUE;
+		}
+	}
+#endif
+
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:ÉèÖÃLCDÖв¿ÏÔʾÏî
+***********************************************************************************/
+E_LCD_SHOW_CONTENT_ITEM g_mmi_cur_show_item = LCD_SHOW_MAX;
+
+static BOOL mmi_IsShowSimState(VOID)
+{
+	E_zMmi_Sim_Tip sim_sta = mmi_getSIMStateInfo();
+	return (sim_sta == INSERT_SIM || sim_sta == SIM_BUSY || sim_sta == PIN_LOCK || sim_sta == PUK_LOCK || sim_sta == SIM_LOCK || sim_sta == INVALID_SIM) ? TRUE : FALSE;
+}
+
+static BOOL mmi_IsShowNetPro(VOID)
+{
+	E_zMmi_NetCon_Tip net_sta = mmi_getNetConInfo();
+	return (net_sta != NET_MAX && net_sta != NET_SEARCHING && net_sta != NET_NOSERVICE
+	        && net_sta != NET_LIMITSERVICE && net_sta != NET_DISCONNECTING && net_sta != NET_CONNECTING) ? TRUE : FALSE;
+}
+
+static VOID mmi_set_middle_current_show(E_LCD_SHOW_CONTENT_ITEM item)
+{
+	g_LcdShowInfoTab[item].needShow = TRUE;
+	g_mmi_cur_show_item = item;
+
+}
+static VOID mmi_set_middle_needshow()
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].needShow = FALSE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].needShow = FALSE;
+	E_zMmi_WpsAct_Tip wps_sta = mmi_get_wps_state();
+	E_zMMI_Fota_Tip  fota_sta = (E_zMMI_Fota_Tip)mmi_getFotaUpdateStateInfo();
+
+	if (wps_sta == WPS_ACTIVE_MAX && (fota_sta == FOTA_MAX || fota_sta == FOTA_SHOW_FINISH)) {
+
+		if (mmi_get_wifiStationConnect_state()) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_middle_needshow show wifiSta!!\n");
+			mmi_set_middle_current_show(LCD_SHOW_TIP_WIFISTA_SSID);
+		} else if (mmi_IsShowSimState()) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_middle_needshow show SIM!!\n");
+			mmi_set_middle_current_show(LCD_SHOW_TIP_SIM_STATE);
+		} else if (mmi_IsShowNetPro()) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_middle_needshow show netpro!!\n");
+			mmi_set_middle_current_show(LCD_SHOW_TIP_NET_PROVIDER);
+		} else {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_middle_needshow show netcon!!\n");
+			mmi_set_middle_current_show(LCD_SHOW_TIP_NET_CONNECTING);
+		}
+	} else {
+		if (wps_sta != WPS_ACTIVE_MAX) {
+			if (fota_sta != FOTA_MAX && fota_sta != FOTA_SHOW_FINISH && g_mmi_cur_show_item == LCD_SHOW_TIP_WPS_ACTIVE) {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_middle_needshow WPS show FOTA!!\n");
+				mmi_set_middle_current_show(LCD_SHOW_TIP_UPDATE_INFO);
+			} else {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_middle_needshow show WPS!!\n");
+				mmi_set_middle_current_show(LCD_SHOW_TIP_WPS_ACTIVE);
+			}
+		} else {
+			//kw 3
+			//if (wps_sta != WPS_ACTIVE_MAX && g_mmi_cur_show_item == LCD_SHOW_TIP_UPDATE_INFO) {
+			//	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_middle_needshow FOTA show WPS!!\n");
+			//	mmi_set_middle_current_show(LCD_SHOW_TIP_WPS_ACTIVE);
+			//} else 
+			{
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_middle_needshow show FOTA!!\n");
+				mmi_set_middle_current_show(LCD_SHOW_TIP_UPDATE_INFO);
+			}
+		}
+	}
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFI¶þάÂëÏÔʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdWifiCodeInfo(UINT32 taskInfo)
+{
+	T_zMMIWifiCodeInfo *pWifiCodeInfo = (T_zMMIWifiCodeInfo *)taskInfo;
+
+	if (g_show_pagethird) {
+		g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].type = LCD_SHOW_INVLAID;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].bitmap, g_lcdWifiCodeConfigInfoTab[0].path,
+		                          &g_lcdWifiCodeConfigInfoTab[0].bmp, g_lcdWifiCodeConfigInfoTab[0].isNeedReload) == 0) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].needShow = TRUE;
+			g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].type = LCD_SHOW_PICTURE;
+		}
+	}
+
+	if (pWifiCodeInfo->multi_ssid_switch) {
+		g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].type = LCD_SHOW_INVLAID;
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].bitmap, g_lcdWifiCodeConfigInfoTab[1].path,
+		                          &g_lcdWifiCodeConfigInfoTab[1].bmp, g_lcdWifiCodeConfigInfoTab[1].isNeedReload) == 0) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].needShow = TRUE;
+			g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].type = LCD_SHOW_PICTURE;
+		}
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFI STATIONÏÔʾÐÅÏ¢
+***********************************************************************************/
+static VOID mmi_setLcdWifiStationSSID(CHAR *sta_ssid)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI mmi_getLcdWifiStationSSID sta_ssid=%s!!\n", sta_ssid);
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].type = LCD_SHOW_TEXT;
+	memset(g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].text, 0, MMI_LCD_SHOW_STRING_LEN);
+	strncpy(g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].text, sta_ssid, MMI_LCD_SHOW_STRING_LEN);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].font = mmi_middle_sixteen_font;
+
+	mmi_set_middle_needshow();
+}
+
+SINT32 mmi_getLcdWifiStationInfo(UINT32 taskInfo)//wifistation
+{
+	T_zMMIWifiStationInfo *pWifiStationInfo = (T_zMMIWifiStationInfo *)taskInfo;
+	UINT32 wifistatab_index = 0;
+	BOOL modemConnectState = mmi_net_connected();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLcdWifiStationInfo pWifiStationInfo->wifistation_connect_state= %d ssid=%s!!\n", pWifiStationInfo->wifistation_connect_state, pWifiStationInfo->wifista_ssid);
+
+	wifistatab_index = mmi_getLcdWifiStationPicturePathFromWifiStationInfo(pWifiStationInfo);
+	if (wifistatab_index >= sizeof(g_lcdWifiStationConfigInfoTab) / sizeof(T_WifiStationConfigInfo))
+		return MMI_ERROR;
+
+	if (modemConnectState) {
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShow = TRUE;
+		g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = FALSE;
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShow = FALSE;
+		if (pWifiStationInfo->wifistation_connect_state) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = TRUE;
+		} else {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShow = FALSE;
+		}
+	}
+	if (pWifiStationInfo->wifistation_connect_state) {
+		if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].bitmap, g_lcdWifiStationConfigInfoTab[wifistatab_index].path,
+		                          &g_lcdWifiStationConfigInfoTab[wifistatab_index].bmp, g_lcdWifiStationConfigInfoTab[wifistatab_index].isNeedReload) == 0) {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].type = LCD_SHOW_PICTURE;
+		} else {
+			g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].type = LCD_SHOW_INVLAID;
+		}
+	}
+
+	mmi_setLcdWifiStationSSID(pWifiStationInfo->wifista_ssid);
+	return MMI_SUCCESS;
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFIlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+UINT32 mmi_getLcdWifiPicturePathFromWifiInfo(T_zMMIWifiInfo * wifiInfo)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_lcdWifiConfigInfoTab) / sizeof(T_WifiConfigInfo); ++ i) {
+		if (g_lcdWifiConfigInfoTab[i].wifiState == wifiInfo->wifi_state &&
+		    g_lcdWifiConfigInfoTab[i].connected_userNum == wifiInfo->connected_userNum) {
+			return i;
+		}
+	}
+	return 0;
+}
+SINT32 mmi_getLcdWifiInfo(UINT32 taskInfo)
+{
+	T_zMMIWifiInfo * pWifiInfo = (T_zMMIWifiInfo *)taskInfo;
+	UINT32 wifitab_index = 0;
+
+	wifitab_index = mmi_getLcdWifiPicturePathFromWifiInfo(pWifiInfo);
+	g_LcdShowInfoTab[LCD_SHOW_WIFI].type = LCD_SHOW_INVLAID;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_WIFI].bitmap, g_lcdWifiConfigInfoTab[wifitab_index].path,
+	                          &g_lcdWifiConfigInfoTab[wifitab_index].bmp, g_lcdWifiConfigInfoTab[wifitab_index].isNeedReload) == 0) {
+		g_LcdShowInfoTab[LCD_SHOW_WIFI].type = LCD_SHOW_PICTURE;
+	}
+
+	return MMI_SUCCESS;
+}
+
+#define MMI_IS_VALID_TRAFFIC_NUM(num) (num >= 0 && num <= 0xFFFFFFFF)
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿lcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdTrafficInfo(UINT32 taskInfo)
+{
+	T_zMMITrafficInfo *pTrafficInfo = (T_zMMITrafficInfo *)taskInfo;
+
+	if (!g_show_pagefirst) {
+		return MMI_SUCCESS;
+	}
+
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].type = LCD_SHOW_TEXT;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].type = LCD_SHOW_INVLAID;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].needShow = TRUE;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].needShow = TRUE;
+
+	//sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%s\MB", pTrafficInfo->quota);
+	//g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text);
+	//g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].font = mmi_middle_fourteen_font;
+	g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].font = mmi_middle_twelve_font;
+
+
+	if (MMI_IS_VALID_TRAFFIC_NUM(pTrafficInfo->uesd_traffic) && MMI_IS_VALID_TRAFFIC_NUM(pTrafficInfo->total_traffic)
+	    /*&&pTrafficInfo->uesd_traffic <=  pTrafficInfo->total_traffic*/) {
+		memset(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, 0, MMI_LCD_SHOW_STRING_LEN);
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLcdTrafficInfo unit = %d!\n", pTrafficInfo->traffic_unit);
+		if (pTrafficInfo->traffic_unit == TRAFFIC_UNIT_DATA) {
+			if (pTrafficInfo->traffic_switch == TRAFFIC_LIMIT_SWITCH_OFF) {
+				if (pTrafficInfo->useddata_unit == TRAFFIC_DATA_UNIT_MB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\M/--", pTrafficInfo->uesd_traffic);
+				} else if (pTrafficInfo->useddata_unit == TRAFFIC_DATA_UNIT_GB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\G/--", pTrafficInfo->uesd_traffic);
+				} else if (pTrafficInfo->useddata_unit == TRAFFIC_DATA_UNIT_TB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\T/--", pTrafficInfo->uesd_traffic);
+				}
+			} else {
+				if (pTrafficInfo->data_unit == TRAFFIC_DATA_UNIT_MB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\M/%.2f\M", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+				} else if (pTrafficInfo->data_unit == TRAFFIC_DATA_UNIT_GB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\G/%.2f\G", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+				} else if (pTrafficInfo->data_unit == TRAFFIC_DATA_UNIT_TB) {
+					sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\T/%.2f\T", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+				}
+			}
+		} else if (pTrafficInfo->traffic_unit == TRAFFIC_UNIT_TIME) {
+			sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%.2f\hr/%.2f\hr", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+		}
+
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text);
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].nFormat = DT_RIGHT;
+
+		if (pTrafficInfo->traffic_switch == TRAFFIC_LIMIT_SWITCH_ON) {
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].needShow = TRUE;
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].type = LCD_SHOW_RECT;
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].color = PIXEL_red;
+
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].needShow = TRUE;
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].type = LCD_SHOW_RECT;
+
+			if (pTrafficInfo->total_traffic > 0) { //kw 3
+				if (pTrafficInfo->uesd_traffic > pTrafficInfo->total_traffic) {
+					g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].color = PIXEL_red;
+					g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_SLIDER].rect.right = g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_SLIDER].rect.left + \
+					        RECTW(g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_BAR].rect);
+				} else {
+					g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].color = RGBA2Pixel(HDC_SCREEN, 0, 0xff, 0, 0xff);//PIXEL_green;
+					g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_SLIDER].rect.right = g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_SLIDER].rect.left + \
+					        RECTW(g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_BAR].rect) * pTrafficInfo->uesd_traffic / pTrafficInfo->total_traffic;
+				}
+			}
+			g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_WARING].rect.left = g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_BAR].rect.left + \
+			        pTrafficInfo->warning_tip_level * RECTW(g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_BAR].rect) / 100;
+			g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_WARING].rect.right = g_LcdConfigInfoTab[LCD_SHOW_TRAFFIC_WARING].rect.left + 1;
+
+		} else {
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_WARING].needShow = FALSE;
+			g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].needShow = FALSE;
+		}
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].type = LCD_SHOW_BOX;
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].color = PIXEL_lightwhite;
+
+	} else {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI  used trffic = %f, total traffic =%f!!!", pTrafficInfo->uesd_traffic, pTrafficInfo->total_traffic);
+		memset(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, 0, MMI_LCD_SHOW_STRING_LEN);
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text, "%s", "get traffic failed");
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].text);
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].nFormat = DT_CENTER;
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¹Ø»ú³äµçlcdÏÔʾÐÅÏ¢
+***********************************************************************************/
+static VOID mmi_getLcdPowerOffChargerBatteryFullinfo()
+{
+	g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].type = LCD_SHOW_PICTURE;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].bitmap, g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].path,
+	                          &g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].bmp, g_lcdPowerOffBatteryConfigInfo[E_BATTERY_LEVEL_4].isNeedReload) != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].type = LCD_SHOW_INVLAID;
+	}
+}
+static VOID mmi_getLcdPowerOffChargerOverVoltageinfo()
+{
+	mmi_innerGetLcdOverVoltageinfo(&(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER]));
+}
+static VOID mmi_getLcdPowerOffChargerLowBatteryinfo(E_zMmi_Poc_State state)
+{
+	if (state == POC_STATE_LOWBATTERY || state == POC_STATE_NOBATTERY) {//klocwork
+		g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].type = LCD_SHOW_TEXT;
+		g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].font = mmi_middle_sixteen_font;//mmi_middle_fourteen_font;
+		g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].text = tp_i18n_get_text(g_powerOffChargerLowBatteryTab[state - POC_STATE_LOWBATTERY].tips);
+		if (g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].text != NULL)
+			g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER].text);
+	}
+}
+SINT32 mmi_getLcdPowerOffChagerInfo(UINT32 taskInfo)
+{
+	T_zMmi_Poc_Info *pPocInfo = (T_zMmi_Poc_Info *)taskInfo;
+	if (pPocInfo->backlight_sta == 0) {
+		mmi_lcd_backlight_end();
+		tp_man_Lcd_Sleep_Enter();
+		if(FALSE == mmi_is_offchg_poweroff)	{
+			set_wake_unlock(MMI_POWEROFF_LOCK_LCD_ID);
+		}		
+	} else {
+		mmi_getMutex(&g_mmi_poweron_mutex);
+		if (!g_mmi_poweroff_turnon_flag) {
+			tp_man_Lcd_Sleep_Exit();
+			mmi_lcd_backlight_start();
+		}
+		mmi_putMutex(&g_mmi_poweron_mutex);
+	}
+	if (pPocInfo->overvoltage_mode == TRUE) {
+		mmi_getLcdPowerOffChargerOverVoltageinfo();
+	} else {
+		if (pPocInfo->poc_sta == POC_STATE_FULL) {
+			mmi_getLcdPowerOffChargerBatteryFullinfo();
+		} else if (pPocInfo->poc_sta == POC_STATE_LOWBATTERY || pPocInfo->poc_sta == POC_STATE_NOBATTERY) {
+			mmi_getLcdPowerOffChargerLowBatteryinfo(pPocInfo->poc_sta);
+		} else {
+			mmi_innerGetLcdBatteryCharinginfo(MMI_TASK_POWEROFF_CHARGER, &(g_LcdShowInfoTab[LCD_SHOW_POWER_OFF_CHARGER]));
+		}
+	}
+	return MMI_SUCCESS;
+
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡Ìáʾlcd ÏÔʾÐÅÏ¢
+***********************************************************************************/
+static CHAR* mmi_findStringFromSimState(E_zMmi_Sim_Tip sim_sta)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_simStaTipStringTab) / sizeof(T_SimTipStringItem); ++ i) {
+		if (g_simStaTipStringTab[i].sim_state == sim_sta) {
+			//return g_simStaTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_simStaTipStringTab[i].tipString);
+		}
+	}
+	return NULL;
+}
+static CHAR* mmi_findStringFromWpsAct(E_zMmi_WpsAct_Tip wps_act)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_wpsActTipStringTab) / sizeof(T_WpsActTipStringItem); ++ i) {
+		if (g_wpsActTipStringTab[i].wps_state == wps_act) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_findStringFromWpsAct %s success!!\n", g_wpsActTipStringTab[i].tipString);
+			//return g_wpsActTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_wpsActTipStringTab[i].tipString);
+		}
+	}
+
+	return NULL;
+}
+
+static CHAR* mmi_findStringFromNetCon(E_zMmi_NetCon_Tip net_con)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_netContTipStringTab) / sizeof(T_NetConTipStringItem); ++ i) {
+		if (g_netContTipStringTab[i].net_con == net_con) {
+			//return g_netContTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_netContTipStringTab[i].tipString);
+		}
+	}
+	return NULL;
+}
+
+static CHAR* mmi_findStringFromFota(E_zMMI_Fota_Tip fota_tip)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_FotaTipStringTab) / sizeof(T_FotaTipStringItem); ++ i) {
+		if (g_FotaTipStringTab[i].fota_tip == fota_tip) {
+			//return g_FotaTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_FotaTipStringTab[i].tipString);
+		}
+	}
+	return NULL;
+}
+
+static VOID mmi_setSIMStateTipInfo(E_zMmi_Sim_Tip sim_sta)
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].type = LCD_SHOW_TEXT;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].text = mmi_findStringFromSimState(sim_sta);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].font = mmi_middle_sixteen_font;
+}
+
+static VOID mmi_setWpsActTipInfo(E_zMmi_WpsAct_Tip wps_act)
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].type = LCD_SHOW_TEXT;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].text = mmi_findStringFromWpsAct(wps_act);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].font = mmi_middle_sixteen_font;
+}
+
+static VOID mmi_setNeConTipInfo(E_zMmi_NetCon_Tip net_con)
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].type = LCD_SHOW_TEXT;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].text = mmi_findStringFromNetCon(net_con);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].font = mmi_middle_sixteen_font;
+}
+static VOID mmi_setNetProTipInfo(CHAR* net_pro)
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].type = LCD_SHOW_TEXT;
+	//g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text = net_pro;
+	memset(g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text, 0, MMI_LCD_SHOW_STRING_LEN);
+	strncpy(g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text, tp_i18n_get_text(net_pro), MMI_LCD_SHOW_STRING_LEN);
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].font = mmi_middle_sixteen_font;
+}
+
+static VOID mmi_setNewVersionTipInfo()
+{
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].type = LCD_SHOW_PICTURE;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].needShow = TRUE;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].bitmap, g_mmiNewVersionBmpPath, &g_mmiNewVersionBmp, FALSE) != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].type = LCD_SHOW_INVLAID;
+	}
+}
+
+static VOID mmi_setFotaTipInfo(E_zMMI_Fota_Tip fota_tip)
+{
+	CHAR *str_Fota = mmi_findStringFromFota(fota_tip);
+	g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].type = LCD_SHOW_TEXT;
+	memset(g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].text, 0, MMI_LCD_SHOW_STRING_LEN);
+	if (str_Fota != NULL) {
+		sprintf(g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].text, "%s", str_Fota);
+	}
+	if (g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].font = mmi_small_font;
+
+}
+
+static VOID mmi_strcatStringWithPre(CHAR* output, CHAR* key, CHAR* value, SINT32 totallen)
+{
+	memset(output, 0, totallen);
+	memcpy((VOID *)output, (const VOID *)key, (UINT32)strlen(key));
+	if (value != NULL && strlen(value) > 0) {
+		memcpy((VOID *)(output + strlen(key)), (const VOID *)value, (UINT32)(totallen - strlen(key) - 1));
+	} else {
+		memcpy((VOID *)(output + strlen(key)), (const VOID *)INVALID_STR, (UINT32)(strlen(INVALID_STR)));
+	}
+}
+
+static VOID mmi_setSSIDKeyTipInfo(T_LcdShowInfoItem *ssidItem, T_LcdShowInfoItem *wifikeyItem, CHAR* ssid, CHAR *wifikey)
+{
+	ssidItem->type = LCD_SHOW_TEXT;
+	ssidItem->needShow = TRUE;
+	if (mmi_get_multi_ssid_switch_flag()) {
+		mmi_strcatStringWithPre(ssidItem->text, (CHAR*)tp_i18n_get_text(STRING_SSID1), ssid, MMI_LCD_SHOW_STRING_LEN);
+	} else {
+		mmi_strcatStringWithPre(ssidItem->text, (CHAR*)tp_i18n_get_text(STRING_SSID), ssid, MMI_LCD_SHOW_STRING_LEN);
+	}
+	if (ssidItem->text != NULL) {
+		ssidItem->textLen = strlen(ssidItem->text);
+	}
+
+	ssidItem->font = mmi_middle_twelve_font;
+
+	wifikeyItem->type = LCD_SHOW_TEXT;
+	wifikeyItem->needShow = TRUE;
+	if (wifikeyItem->text != NULL) {
+		mmi_strcatStringWithPre(wifikeyItem->text, (CHAR*)tp_i18n_get_text(STRING_WIFIKEY), wifikey, MMI_LCD_SHOW_STRING_LEN);
+		wifikeyItem->textLen = strlen(wifikeyItem->text);
+	}
+	if (strlen(wifikey) > 35)
+	{
+		wifikeyItem->font = mmi_middle_eight_font;
+	}
+	else
+	{
+		wifikeyItem->font = mmi_middle_twelve_font;
+	}
+}
+
+static VOID mmi_setVersionTipInfo(T_LcdShowInfoItem *FirmwareVersionItem, T_LcdShowInfoItem *HardwareVersionItem, CHAR* FirmwareVersion, CHAR *HardwareVersion)
+{
+	FirmwareVersionItem->type = LCD_SHOW_TEXT;
+	FirmwareVersionItem->needShow = TRUE;
+
+	mmi_strcatStringWithPre(FirmwareVersionItem->text, (CHAR*)tp_i18n_get_text(STRING_FIRMWARE), FirmwareVersion, MMI_LCD_SHOW_STRING_LEN);
+	if (FirmwareVersionItem->text != NULL)
+	{
+		FirmwareVersionItem->textLen = strlen(FirmwareVersionItem->text);
+	}
+	FirmwareVersionItem->font = mmi_middle_twelve_font;
+
+	HardwareVersionItem->type = LCD_SHOW_TEXT;
+	HardwareVersionItem->needShow = TRUE;
+	if (HardwareVersionItem->text != NULL)
+	{
+		mmi_strcatStringWithPre(HardwareVersionItem->text, (CHAR*)tp_i18n_get_text(STRING_VERSION), HardwareVersion, MMI_LCD_SHOW_STRING_LEN);
+		HardwareVersionItem->textLen = strlen(HardwareVersionItem->text);
+	}
+	HardwareVersionItem->font = mmi_middle_twelve_font;
+}
+
+static VOID mmi_setVersionValueTipInfo(T_LcdShowInfoItem *FirmwareVersionItem, T_LcdShowInfoItem *HardwareVersionItem, CHAR* FirmwareVersion, CHAR *HardwareVersion)
+{
+	FirmwareVersionItem->type = LCD_SHOW_TEXT;
+	FirmwareVersionItem->needShow = TRUE;
+
+	mmi_strcatStringWithPre(FirmwareVersionItem->text, FirmwareVersion, NULL, MMI_LCD_SHOW_STRING_LEN);
+	if (FirmwareVersionItem->text != NULL)
+	{
+		FirmwareVersionItem->textLen = strlen(FirmwareVersionItem->text);
+	}
+	FirmwareVersionItem->font = mmi_middle_twelve_font;
+
+	HardwareVersionItem->type = LCD_SHOW_TEXT;
+	HardwareVersionItem->needShow = TRUE;
+	if (HardwareVersionItem->text != NULL)
+	{
+		mmi_strcatStringWithPre(HardwareVersionItem->text, HardwareVersion, NULL, MMI_LCD_SHOW_STRING_LEN);
+		HardwareVersionItem->textLen = strlen(HardwareVersionItem->text);
+	}
+	HardwareVersionItem->font = mmi_middle_twelve_font;
+}
+
+static VOID mmi_setTextConnectTipInfo(T_LcdShowInfoItem *TextScanToItem, T_LcdShowInfoItem *TextConnectItem)
+{
+	TextScanToItem->type = LCD_SHOW_TEXT;
+	TextScanToItem->needShow = TRUE;
+
+	mmi_strcatStringWithPre(TextScanToItem->text, (CHAR*)tp_i18n_get_text(STRING_SCAN_TO), NULL, MMI_LCD_SHOW_STRING_LEN);
+	if (TextScanToItem->text != NULL)
+	{
+		TextScanToItem->textLen = strlen(TextScanToItem->text);
+	}
+	TextScanToItem->font = mmi_middle_twelve_font;
+
+	TextConnectItem->type = LCD_SHOW_TEXT;
+	TextConnectItem->needShow = TRUE;
+	if (TextConnectItem->text != NULL)
+	{
+		mmi_strcatStringWithPre(TextConnectItem->text, (CHAR*)tp_i18n_get_text(STRING_CONNECT), NULL, MMI_LCD_SHOW_STRING_LEN);
+		TextConnectItem->textLen = strlen(TextConnectItem->text);
+	}
+	TextConnectItem->font = mmi_middle_twelve_font;
+}
+
+static VOID mmi_setSSIDKeyTip2Info(T_LcdShowInfoItem *ssidItem, T_LcdShowInfoItem *wifikeyItem, CHAR* ssid, CHAR *wifikey)
+{
+	ssidItem->type = LCD_SHOW_TEXT;
+	ssidItem->needShow = TRUE;
+	if (ssidItem->text != NULL) {
+		mmi_strcatStringWithPre(ssidItem->text, (CHAR*)tp_i18n_get_text(STRING_SSID2), ssid, MMI_LCD_SHOW_STRING_LEN);
+		ssidItem->textLen = strlen(ssidItem->text);
+	}
+	ssidItem->font = mmi_middle_twelve_font;
+
+	wifikeyItem->type = LCD_SHOW_TEXT;
+	wifikeyItem->needShow = TRUE;
+	if (wifikeyItem->text != NULL) {
+		mmi_strcatStringWithPre(wifikeyItem->text, (CHAR*)tp_i18n_get_text(STRING_WIFIKEY), wifikey, MMI_LCD_SHOW_STRING_LEN);
+		wifikeyItem->textLen = strlen(wifikeyItem->text);
+	}
+	wifikeyItem->font = mmi_middle_twelve_font;
+}
+
+SINT32 mmi_getLcdTipInfo(UINT32 taskInfo)//sim state sim cmcc
+{
+	T_zMMITipInfo *pTipInfo = (T_zMMITipInfo *)taskInfo;
+
+	if (pTipInfo->sim_tip != SIM_MAX) {
+		mmi_setSIMStateTipInfo(pTipInfo->sim_tip);
+		slog(MMI_PRINT, SLOG_DEBUG, "zte_mmi mmi_getLcdTipInfo ready for show SIM\n");
+	} else if (mmi_IsShowNetPro()) {
+		mmi_setNetProTipInfo(pTipInfo->net_pro);
+		slog(MMI_PRINT, SLOG_DEBUG, "zte_mmi mmi_getLcdTipInfo ready for show NET CONNECT\n");
+	}
+
+	mmi_set_middle_needshow();
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_getLcdTipNetConnInfo(UINT32 taskInfo)//net connect
+{
+	T_zMMITipInfo *pTipInfo = (T_zMMITipInfo *)taskInfo;
+	mmi_setNeConTipInfo(pTipInfo->net_tip);
+	mmi_set_middle_needshow();
+	return MMI_SUCCESS;
+}
+SINT32 mmi_getLcdTipWpsInfo(UINT32 taskInfo)//wps
+{
+	T_zMMIWifiInfo *pWpsInfo = (T_zMMIWifiInfo *)taskInfo;
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLcdTipWpsInfo pWpsInfo->wps_state= %d!!\n", pWpsInfo->wps_state);
+	mmi_setWpsActTipInfo(pWpsInfo->wps_state);
+	mmi_set_middle_needshow();
+	return MMI_SUCCESS;
+}
+SINT32 mmi_getLcdTipFotaInfo(UINT32 taskInfo)//FOTA
+{
+	T_zMMIFotaInfo *pFotaInfo = (T_zMMIFotaInfo *)taskInfo;
+	if (pFotaInfo->fota_update != 0) {
+		g_LcdShowInfoTab[LCD_SHOW_POWER].needShow = FALSE;
+		mmi_setNewVersionTipInfo();
+	} else {
+		g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].needShow = FALSE;
+		g_LcdShowInfoTab[LCD_SHOW_POWER].needShow = TRUE;
+	}
+	mmi_setFotaTipInfo(pFotaInfo->fota_tip);
+	mmi_set_middle_needshow();
+
+	return MMI_SUCCESS;
+}
+
+#if 0
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñȡʱ¼äÏÔʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdTimeInfo(UINT32 taskInfo)
+{
+	T_zMMITimeInfo *pTimeInfo = (T_zMMITimeInfo *)taskInfo;
+	g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].type = LCD_SHOW_TEXT;
+	sprintf(g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].text, "%s:%s", pTimeInfo->hour, pTimeInfo->minute);
+	if (g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].text != NULL) {
+		g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].textLen = strlen(g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].text);
+	}
+	g_LcdShowInfoTab[LCD_SHOW_CURRENT_TIME].font = mmi_middle_twelve_font;
+	return MMI_SUCCESS;
+}
+#endif
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡SSID/WIFIKEYÏÔʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLcdSSIDKeyInfo(UINT32 taskInfo)
+{
+	T_zMMISSIDInfo *pssidInfo = (T_zMMISSIDInfo *)taskInfo;
+	mmi_setSSIDKeyTipInfo(&(g_LcdShowInfoTab[LCD_SHOW_WIFI_SSID]), &(g_LcdShowInfoTab[LCD_SHOW_WIFI_PASSWORD]), pssidInfo->ssid, pssidInfo->wifi_key);
+	if (mmi_get_multi_ssid_switch_flag()) {
+		mmi_setSSIDKeyTip2Info(&(g_LcdShowInfoTab[LCD_SHOW_WIFI_SSID2]), &(g_LcdShowInfoTab[LCD_SHOW_WIFI_PASSWORD2]), pssidInfo->ssid2, pssidInfo->wifi_key2);
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_getLcdVersionInfo(UINT32 taskInfo)
+{
+	T_zMMIVERSIONInfo *VersionInfo = (T_zMMIVERSIONInfo *)taskInfo;
+	mmi_setVersionTipInfo(&(g_LcdShowInfoTab[LCD_SHOW_FIRMWARE_VERSION]), &(g_LcdShowInfoTab[LCD_SHOW_HARDWARE_VERSION]), NULL, NULL);
+	mmi_setVersionValueTipInfo(&(g_LcdShowInfoTab[LCD_SHOW_FIRMWARE_VERSION_VALUE]), &(g_LcdShowInfoTab[LCD_SHOW_HARDWARE_VERSION_VALUE]), VersionInfo->firmware_version, VersionInfo->hardware_version);
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_getLcdTextConnectInfo(UINT32 taskInfo)
+{
+	mmi_setTextConnectTipInfo(&(g_LcdShowInfoTab[LCD_SHOW_TEXT_SCAN_TO]), &(g_LcdShowInfoTab[LCD_SHOW_TEXT_CONNECT]));
+
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_getLcdLogoInfo(UINT32 taskInfo)
+{
+	T_zMMIWifiCodeInfo *pWifiCodeInfo = (T_zMMIWifiCodeInfo *)taskInfo;
+
+	g_LcdShowInfoTab[LCD_SHOW_LOGO].type = LCD_SHOW_INVLAID;
+	if (mmi_getBitmapFromFile(g_LcdShowInfoTab[LCD_SHOW_LOGO].bitmap, g_lcdLogoConfigInfoTab[0].path,
+	                          &g_lcdLogoConfigInfoTab[0].bmp, g_lcdLogoConfigInfoTab[0].isNeedReload) == 0)
+	{
+		g_LcdShowInfoTab[LCD_SHOW_LOGO].type = LCD_SHOW_PICTURE;
+	}
+
+	return MMI_SUCCESS;
+}
+
+VOID mmi_initLcdShowInfoTab()
+{
+	UINT32 i = 0;
+	//int length = 0;
+	//length = tp_man_get_lcd_byte_length();
+	for (i = 0; i < sizeof(g_LcdShowInfoTab) / sizeof(T_LcdShowInfoItem); ++ i) {
+		if (g_LcdConfigInfoTab[g_LcdShowInfoTab[i].item].type == LCD_SHOW_PICTURE) {
+			g_LcdShowInfoTab[i].bitmap = (BITMAP*)malloc(sizeof(BITMAP));
+			memset((VOID *)g_LcdShowInfoTab[i].bitmap, 0, sizeof(BITMAP));
+		}
+		if (g_LcdConfigInfoTab[g_LcdShowInfoTab[i].item].type == LCD_SHOW_TEXT) {
+			g_LcdShowInfoTab[i].text = (CHAR*)malloc(MMI_LCD_SHOW_STRING_LEN);
+		}
+	}
+	/*g_mmi_bitmem = (CHAR*)malloc(length);
+	if (g_mmi_bitmem == NULL) {
+		assert(0);
+	}*/
+}
+#endif
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd.h b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd.h
new file mode 100755
index 0000000..a7bfe83
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd.h
@@ -0,0 +1,131 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#ifndef DISABLE_LCD
+#include "mmi_common.h"
+#include "mmiAppMainwin.h"
+#include "app_infos.h"
+#include "app_global_defines.h"
+
+/*****************************ÌáʾÐÅÏ¢Ïà¹Ø¶¨Òå******************************************/
+
+/*ÏÔʾÊý¾ÝÀàÐÍ*/
+typedef enum {
+	LCD_SHOW_PICTURE = 1,
+	LCD_SHOW_TEXT,
+	LCD_SHOW_RECT,
+	LCD_SHOW_BACKGROUD,
+	LCD_SHOW_ANIMATION,
+	LCD_SHOW_BOX,//»æÖÆ·½¿òµÄÉÏÏÂÁ½ÌõÏß
+	LCD_SHOW_HLINE,
+	LCD_SHOW_INVLAID,
+} E_LCD_SHOW_CONTENT_TYPE;
+
+/*ÏÔʾÏî*/
+typedef enum {
+	//===========top bar===========
+	LCD_SHOW_NET_SIGNAL,
+	LCD_SHOW_NET_CONNECT,
+	LCD_SHOW_WIFISTATION_CONNECT,
+	LCD_SHOW_SMS,
+	LCD_SHOW_SMS_NUM,
+	LCD_SHOW_WIFI,
+	LCD_SHOW_TIP_NEW_VERSION,
+	LCD_SHOW_POWER,//µçÁ¿
+	LCD_SHOW_BATTERY,//µç³Ø
+	LCD_SHOW_CHARRING, //³äµçͼ±ê
+
+	//============PAGE1============
+	//============middle==========
+	LCD_SHOW_CMCC,
+	LCD_SHOW_TIP_WIFISTA_SSID,
+	LCD_SHOW_TIP_SIM_STATE,
+	LCD_SHOW_TIP_WPS_ACTIVE,
+	LCD_SHOW_TIP_NET_CONNECTING,
+	LCD_SHOW_TIP_NET_PROVIDER,
+	LCD_SHOW_TIP_UPDATE_INFO,//zk add for fotaupdate result
+
+	//============temp=============
+	LCD_SHOW_WIFI_SSID,
+	LCD_SHOW_WIFI_PASSWORD,
+	//==========PAGE SSID2 WIFI KEY=============
+	LCD_SHOW_WIFI_SSID2,
+	LCD_SHOW_WIFI_PASSWORD2,
+	LCD_SHOW_WIFI_CODE2,
+
+
+	//============PAGE1=============
+	LCD_SHOW_TRAFFIC,
+	LCD_SHOW_TRAFFIC_BAR,
+	LCD_SHOW_TRAFFIC_SLIDER,
+	LCD_SHOW_TRAFFIC_WARING,
+
+	//==========PAGE3=============
+	LCD_SHOW_WIFI_CODE,
+	//LCD_SHOW_ACESS_DURATION_PRE,
+	//LCD_SHOW_ACESS_DURATION,//add
+	//LCD_SHOW_CURRENT_USAGE_PRE,
+	//LCD_SHOW_CURRENT_USAGE,//add
+	LCD_SHOW_POWER_OFF_CHARGER	,
+
+	LCD_SHOW_FIRMWARE_VERSION,
+	LCD_SHOW_FIRMWARE_VERSION_VALUE,
+	LCD_SHOW_HARDWARE_VERSION,
+	LCD_SHOW_HARDWARE_VERSION_VALUE,
+	LCD_SHOW_TEXT_SCAN_TO,
+	LCD_SHOW_TEXT_CONNECT,
+	LCD_SHOW_LOGO,
+	LCD_SHOW_OPERATOR,
+
+	LCD_SHOW_MAX,
+
+} E_LCD_SHOW_CONTENT_ITEM;
+
+/*ÏÔÊ¾ÇøÓòλÖá¢ÄÚÈݶÔÓ¦¹ØÏµ*/
+typedef struct {
+	E_LCD_SHOW_CONTENT_ITEM item;
+	RECT rect;
+	E_LCD_SHOW_CONTENT_TYPE type;
+} T_LcdConfigInfo;
+
+
+/*ÏÔʾÐÅÏ¢*/
+typedef struct {
+	E_LCD_SHOW_CONTENT_ITEM item;
+	BITMAP* bitmap;
+	CHAR* text;
+	PLOGFONT font;
+	ZDWORD nFormat;
+	SINT32 textLen;
+	BOOL needShowFL;//½â¾öÏÔʾ¿ØÖƳåÍ»ÎÊÌ⣬¸Ã±äÁ¿ÓÅÏȼ¶¸ßÓÚneedShow
+	BOOL needShow;
+	E_LCD_SHOW_CONTENT_TYPE type;
+	UINT32 last;
+	UINT32 color;
+} T_LcdShowInfoItem;
+
+extern T_zMMITaskInfoItem g_zMMITaskInfoTab[MMI_TASK_MAX];
+
+typedef VOID (*SCROLLED_TIMER_CALLBACK)(VOID);
+
+/*ÏÔʾÆÁÄ»ÐÅÏ¢*/
+//SINT32 mmi_showLcd(UINT32 lcdInfo);
+VOID mmi_initLcdShowInfoTab();
+HWND mmi_getMainWnd();
+
+VOID mmi_startPowerOnFrame();
+VOID mmi_startPowerOffFrame();
+VOID mmi_startPowerResetFrame();
+VOID mmi_startFastPowerOnFrame();
+#endif
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd_init.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd_init.c
new file mode 100755
index 0000000..c707b21
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd_init.c
@@ -0,0 +1,480 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd_info.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºÏÔʾʱ¼ä¡¢¶ÌÐÅ¡¢ÍøÂçÐźš¢WIFI¡¢µçÁ¿¡¢Á÷Á¿µÈÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2015-1-4
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+ Í·Îļþ
+******************************************************************************/
+#ifndef DISABLE_LCD
+#include "mmi_common.h"
+#include "os_type.h"
+#include "app_infos.h"
+#include "app_global_defines.h"
+
+/****************************************************************************/
+
+#define MMI_LCD_WIDTH					160
+#define MMI_LCD_HEIGHT   				80
+
+/*
+¿ª¹Ø»ú¶¯»­
+*/
+typedef enum {
+	E_POWERONOFF_FRAME_0 = 0,
+	E_POWERONOFF_FRAME_1,
+	E_POWERONOFF_FRAME_2,
+	E_POWERONOFF_FRAME_3,
+	E_POWERONOFF_FRAME_4,
+	E_POWERONOFF_FRAME_5,
+	E_POWERONOFF_FRAME_6,
+	E_POWERONOFF_FRAME_7,
+	E_POWERONOFF_FRAME_8,
+	E_POWERONOFF_FRAME_9,
+	E_POWERONOFF_FRAME_10,
+	E_POWERONOFF_FRAME_11,
+	E_POWERONOFF_FRAME_12
+} E_POWONOFF_FRAME_ID;
+
+
+typedef struct {
+	E_zMmi_Work_Mode workMode;
+	CHAR* tipString;
+} T_PowerOnOffTipStringItem;
+
+T_PowerOnOffTipStringItem g_PowerOnOffTipStringTab[] = {
+	{MMI_POWERON_MODE, "Welcome"},
+	{MMI_POWEROFF_MODE, "Poweroff"},
+	{MMI_RESET_MODE, "Resetting"},
+	{MMI_RESTART_MODE, "Restarting"}
+};
+
+typedef struct {
+	E_POWONOFF_FRAME_ID frameID;
+	CHAR* path;
+} T_PowerOnOffFrameItem;
+
+T_PowerOnOffFrameItem g_powerOnoffFramTab[] = {
+	{E_POWERONOFF_FRAME_0, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_1, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_2, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_3, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_4, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_5, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_6, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_7, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_8, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_9, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_10, "/etc_ro/mmi/cartoon_1.png"},
+	{E_POWERONOFF_FRAME_11, "welcome"}
+};
+
+T_PowerOnOffFrameItem g_poweroffFramTab[] = {
+	{E_POWERONOFF_FRAME_0, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_1, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_2, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_3, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_4, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_5, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_6, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_7, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_8, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_9, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_10, "/etc_ro/mmi/cartoon_2.png"},
+	{E_POWERONOFF_FRAME_11, "bye"}
+};
+
+/********************************************************************************
+  È«¾Ö±äÁ¿ÒýÓÃ
+**********************************************************************************/
+extern UINT32 g_smstask_enable;
+extern UINT32 g_voicetask_enable;
+extern E_zMmiShowMode g_showMode;
+
+
+/********************************************************************************
+  È«¾Ö±äÁ¿¶¨Òå
+**********************************************************************************/
+CHAR* g_mmiMainWinBgPath = "/etc_ro/mmi/background.png";
+HWND  g_mmiMainWin = HWND_INVALID;
+BITMAP g_mmiMainBg = {0};
+
+PLOGFONT mmi_smallest_font = NULL;
+PLOGFONT mmi_small_font = NULL;
+PLOGFONT mmi_middle_twelve_font = NULL;
+PLOGFONT mmi_middle_eight_font = NULL;
+//PLOGFONT mmi_middle_fourteen_font = NULL;
+PLOGFONT mmi_middle_sixteen_font = NULL;
+/*PLOGFONT mmi_middle_twenty_font = NULL;*/
+//PLOGFONT mmi_big_font = NULL;
+
+/**********************************************************************************
+  ³õʼ»¯×ÖÌå
+***********************************************************************************/
+void mmi_InitFont()
+{
+#ifdef ENABLE_TTF_FONT	
+	mmi_smallest_font = CreateLogFont(FONT_TYPE_NAME_SCALE_TTF, "song", "ISO8859-1",
+	                                  FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 10, 0);
+	mmi_small_font = CreateLogFont(FONT_TYPE_NAME_SCALE_TTF, "song", "ISO8859-1",
+	                               FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                               FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 11, 0);
+	mmi_middle_twelve_font = CreateLogFont(FONT_TYPE_NAME_SCALE_TTF, "song", "ISO8859-1",
+	                                       FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                       FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 12, 0);
+	mmi_middle_eight_font = CreateLogFont(FONT_TYPE_NAME_SCALE_TTF, "song", "ISO8859-1",
+	                                       FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                       FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 8, 0);
+
+
+	mmi_middle_sixteen_font = CreateLogFont(FONT_TYPE_NAME_SCALE_TTF, "song", "ISO8859-1",
+	                                        FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                        FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,  16, 0);
+#else
+	mmi_smallest_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                                  FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 10, 0);
+	mmi_small_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                               FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                               FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 11, 0);
+	mmi_middle_twelve_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                                       FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                       FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 12, 0);
+	mmi_middle_eight_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                                       FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                       FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 8, 0);
+	mmi_middle_sixteen_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+	                                        FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+	                                        FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,  16, 0);
+#endif
+	/*mmi_middle_twenty_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+		  FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+		  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 20, 0);*/
+	/*mmi_big_font = CreateLogFont(FONT_TYPE_NAME_BITMAP_RAW, "song", "GB2312",
+		  FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
+		  FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 24, 0);*/
+
+	slog(MMI_PRINT, SLOG_NORMAL, "zcore ZTE_MMI_InitFont finish!!!!!\n");
+}
+
+/* power on off*/
+static SINT32 g_mmiCurrentFrameID = E_POWERONOFF_FRAME_0;
+static BOOL showingPowerOn = TRUE;
+static BOOL showingPowerOff = FALSE;
+static BOOL showingPowerOffCharger = FALSE;
+
+POWER_ON_OFF_CALLBACK_FUN g_PowerOnOffFun = NULL;
+
+BOOL mmi_Ispoweron_state(VOID)
+{
+	return showingPowerOn;
+}
+
+VOID mmi_registerLcdPowerOnOff(POWER_ON_OFF_CALLBACK_FUN fun)
+{
+	g_PowerOnOffFun = fun;
+}
+
+VOID mmi_changePowerOnOffFrame(VOID)
+{
+	if (showingPowerOn) {
+		g_mmiCurrentFrameID ++ ;
+	}
+	if (showingPowerOff) {
+		g_mmiCurrentFrameID -- ;
+	}
+}
+
+VOID mmi_showPowerOnOffFrame(HDC hdc)
+{
+	BITMAP bitmap = {0};
+	SINT32 ret = -1;
+
+	if (g_mmiCurrentFrameID == E_POWERONOFF_FRAME_11) { //show text "welcome"
+		SINT32 tempID = g_mmiCurrentFrameID;
+		RECT rect = {0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT};
+		FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &g_mmiMainBg);
+		SetBkMode(hdc, BM_TRANSPARENT);
+		SelectFont(hdc, mmi_middle_sixteen_font);
+		SetTextColor(hdc, PIXEL_lightwhite);
+		//DrawText(hdc, g_powerOnoffFramTab[tempID].path, strlen(g_powerOnoffFramTab[tempID].path), &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
+		//DrawText(hdc, g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path, strlen(g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path), &rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
+	}
+#if 1
+	else if (g_mmiCurrentFrameID >= E_POWERONOFF_FRAME_0 && g_mmiCurrentFrameID < E_POWERONOFF_FRAME_11) { //show poweronoff ani
+		if(showingPowerOff)
+		{
+			ret = LoadBitmapFromFile(hdc, &bitmap, g_poweroffFramTab[g_mmiCurrentFrameID].path);
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_showPowerOnOffFrame load bitmap path:%s!!!\n", g_poweroffFramTab[g_mmiCurrentFrameID].path);
+			if (ret != 0) {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI load bitmap failed path:%s!!!\n", g_poweroffFramTab[g_mmiCurrentFrameID].path);
+				return;
+			}
+			FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &bitmap);
+			UnloadBitmap(&bitmap);
+		}
+		else if(showingPowerOn)
+		{
+			ret = LoadBitmapFromFile(hdc, &bitmap, g_powerOnoffFramTab[g_mmiCurrentFrameID].path);
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_showPowerOnOffFrame load bitmap path:%s!!!\n", g_powerOnoffFramTab[g_mmiCurrentFrameID].path);
+			if (ret != 0) {
+				slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI load bitmap failed path:%s!!!\n", g_powerOnoffFramTab[g_mmiCurrentFrameID].path);
+				return;
+			}
+			FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &bitmap);
+			UnloadBitmap(&bitmap);
+		}
+	}
+	if (showingPowerOn) {
+		if (g_mmiCurrentFrameID <= E_POWERONOFF_FRAME_10) {
+			mmi_startLcdPowerOnOffTimer();
+		} else if (g_mmiCurrentFrameID == E_POWERONOFF_FRAME_11) {
+			mmi_startLcdPowerOnOffTextFrameTimer();
+		} else {
+			showingPowerOn = FALSE;
+			mmi_set_update_flag(MMI_TASK_BATTERY);//update all app show
+			mmi_set_update_flag(MMI_TASK_POWER);
+			mmi_set_update_flag(MMI_TASK_WIFI);
+			mmi_set_update_flag(MMI_TASK_LED_WPS);
+
+			if (g_voicetask_enable)
+				mmi_set_update_flag(MMI_TASK_VOIP);
+			else if (g_smstask_enable)
+				mmi_set_update_flag(MMI_TASK_SMS);
+
+			mmi_set_update_flag(MMI_TASK_NET);
+			mmi_set_update_flag(MMI_TASK_TIP);
+			mmi_set_lcd_mode(MMI_ACTIVE_MODE);
+		}
+	}
+	if (showingPowerOff) {
+		if (g_mmiCurrentFrameID == E_POWERONOFF_FRAME_11) {
+			mmi_startLcdPowerOnOffTextFrameTimer();
+		} else if (g_mmiCurrentFrameID >= E_POWERONOFF_FRAME_0) {
+			mmi_startLcdPowerOnOffTimer();
+		} else {
+			mmi_set_poweroff_charge_show(TRUE);
+			showingPowerOff = FALSE;
+			if (g_PowerOnOffFun != NULL) {
+				slog(MMI_PRINT, SLOG_DEBUG, "mmi_showPowerOnOffFrame  g_PowerOnOffFun!\n");
+				g_PowerOnOffFun();
+			}
+		}
+	}
+#endif
+
+}
+
+BOOL mmi_getShowingPowerOnInfo(VOID)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getShowingPowerOnInfo showingPowerOn:%d!!!\n", showingPowerOn);
+	return showingPowerOn;
+}
+
+static CHAR* mmi_findStringFromMode(E_zMmi_Work_Mode workMode)
+{
+	UINT32 i = 0;
+	for (i = 0; i < sizeof(g_PowerOnOffTipStringTab) / sizeof(T_PowerOnOffTipStringItem); ++ i) {
+		if (g_PowerOnOffTipStringTab[i].workMode == workMode) {
+			//return g_PowerOnOffTipStringTab[i].tipString;
+			return (CHAR*)tp_i18n_get_text(g_PowerOnOffTipStringTab[i].tipString);
+		}
+	}
+	return NULL;
+}
+
+VOID mmi_startPowerOnFrame()
+{
+	showingPowerOn = TRUE;
+	showingPowerOff = FALSE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_0;
+	g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_POWERON_MODE);
+}
+
+VOID mmi_startFastPowerOnFrame()
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI mmi_startFastPowerOnFrame!! \n\n");
+	mmi_set_poweroff_charge_show(FALSE);
+	showingPowerOn = TRUE;
+	showingPowerOff = FALSE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_0;
+	g_powerOnoffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_POWERON_MODE);
+	InvalidateRect(g_mmiMainWin, NULL, FALSE);
+}
+
+VOID mmi_startPowerOffFrame()
+{
+	showingPowerOn = FALSE;
+	showingPowerOff = TRUE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_10;
+	g_poweroffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_POWEROFF_MODE);
+}
+
+
+VOID mmi_startPowerResetFrame()
+{
+	showingPowerOn = FALSE;
+	showingPowerOff = TRUE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_11;
+	g_poweroffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_RESET_MODE);
+}
+
+VOID mmi_startPowerRestartFrame()
+{
+	showingPowerOn = FALSE;
+	showingPowerOff = TRUE;
+	g_mmiCurrentFrameID = E_POWERONOFF_FRAME_11;
+	g_poweroffFramTab[E_POWERONOFF_FRAME_11].path = mmi_findStringFromMode(MMI_RESTART_MODE);
+}
+VOID mmi_startPowerOffChagerFrame()
+{
+	showingPowerOn = FALSE;
+	showingPowerOff = FALSE;
+	showingPowerOffCharger = TRUE;
+}
+
+//BITMAP testbitmap = {0};
+/**********************************************************************************
+  ʱ¼ä½çÃæ´°¿Ú¹ý³Ìº¯Êý
+***********************************************************************************/
+SINT32 mmi_InfoWinProc(HWND hWnd, SINT32 message, WPARAM wParam, LPARAM lParam)
+{
+	//HDC hdc = HDC_INVALID;
+	//slog(MMI_PRINT,SLOG_DEBUG,"zcore ZTE_MMI_InfoWinProc !!!!!message=0x%x\n",message);
+
+	switch (message) {
+	case MSG_CREATE: {
+		break;
+	}
+	case MSG_PAINT: {
+		HDC hdc = BeginPaint(g_mmiMainWin);
+
+		//FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &testbitmap);
+
+#if 1
+		if (showingPowerOn || showingPowerOff) {
+			mmi_showPowerOnOffFrame(hdc);
+		} else {
+			FillBoxWithBitmap(hdc, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &g_mmiMainBg);
+			zCore_Set_SkipUpdateflag(TRUE);
+			mmi_showLcd(hdc);
+		}
+#endif
+		EndPaint(g_mmiMainWin, hdc);
+		return 0;
+	}
+	case MSG_TIMER: {
+		break;
+	}
+	case MSG_KEYDOWN:
+	case MSG_KEYUP: {
+		break;
+	}
+	case MSG_CLOSE: {
+		DestroyMainWindowIndirect(hWnd);
+		g_mmiMainWin = HWND_INVALID;
+		break;
+	}
+	default: {
+		break;
+	}
+	}
+	return DefaultMainWinProc(hWnd, message, wParam, lParam);
+}
+
+
+/**********************************************************************************
+´´½¨´°¿Ú
+***********************************************************************************/
+
+VOID mmi_MainWinCreate()
+{
+	MAINWINCREATE CreateInfo = {0};
+	CreateInfo.dwStyle = WS_VISIBLE;
+	CreateInfo.dwExStyle = WS_EX_NONE;
+	CreateInfo.spCaption = "";
+	CreateInfo.hHosting = HWND_DESKTOP;
+	CreateInfo.MainWindowProc = mmi_InfoWinProc;
+	CreateInfo.lx = 0;
+	CreateInfo.ty = 0;
+	CreateInfo.rx = MMI_LCD_WIDTH;
+	CreateInfo.by = MMI_LCD_HEIGHT;
+	CreateInfo.iBkColor = PIXEL_black;
+	CreateInfo.dwAddData = 0;
+	CreateInfo.dwReserved = 0;
+	CreateInfo.hHosting = HWND_DESKTOP;
+	g_mmiMainWin = CreateMainWindow(&CreateInfo);
+
+	// ShowWindow(mmi_info_win, SW_SHOWNORMAL);
+	slog(MMI_PRINT, SLOG_NORMAL, "zcore ZTE_MMI_InfoWinCreate finish!!!!!mmi_test_Win=0x%x\n", g_mmiMainWin);
+
+
+}
+
+extern OS_SEMA_ID g_mmi_init_sem_id;
+extern OS_SEMA_ID g_mmi_gui_init_sem_id;
+
+/**********************************************************************************
+  LCD³õʼ»¯Èë¿Úº¯Êý
+***********************************************************************************/
+static VOID *lcd_main_entry(VOID *arg)
+{
+	MSG msg = {0};
+
+	slog(MMI_PRINT, SLOG_DEBUG, "zcore ZTE_MMI_task_main_entry!!!!\n");
+	prctl(PR_SET_NAME, "mmi_lcd_main", 0, 0, 0);
+	InitGUI();
+	//zOss_Sleep(15000);
+	mmi_InitFont();
+	LoadBitmapFromFile(HDC_SCREEN, &g_mmiMainBg, g_mmiMainWinBgPath);
+	//LoadBitmapFromFile(HDC_SCREEN, &testbitmap, "c:\\mmi\\RGB.bmp");
+	mmi_initLcdShowInfoTab();
+	mmi_MainWinCreate();
+	mmi_PutSemaphore(&g_mmi_init_sem_id);
+
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		mmi_PutSemaphore(&g_mmi_gui_init_sem_id);
+	}
+
+	while (GetMessage(&msg, g_mmiMainWin)) {
+		TranslateMessage(&msg);
+		DispatchMessage(&msg);
+	} 
+	return NULL;
+}
+
+VOID mmi_setMainWindToBg()
+{
+	RECT tmpRect = {0, 0, 160, 80};
+	FillBoxWithBitmap(HDC_SCREEN, 0, 0, MMI_LCD_WIDTH, MMI_LCD_HEIGHT, &g_mmiMainBg);
+	SDev_LcdDirectRefresh(&tmpRect);
+}
+
+HWND mmi_getMainWnd()
+{
+	return g_mmiMainWin;
+}
+
+VOID mmi_initLcd(BOOL isPowerOffChager)
+{
+	int ret = -1;
+	pthread_t mmi_lcdmain_thread;
+	if (isPowerOffChager) {
+		mmi_startPowerOffChagerFrame();
+	} else {
+		mmi_startPowerOnFrame();
+	}
+	ret = pthread_create(&mmi_lcdmain_thread, NULL, &lcd_main_entry, NULL);
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMIcorem mmi_initLcd end ret = %d\n", ret);
+}
+#endif
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd_page.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd_page.c
new file mode 100755
index 0000000..48b7a4d
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_lcd_page.c
@@ -0,0 +1,266 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd_page.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#ifndef DISABLE_LCD
+#include "mmi_lcd.h"
+
+extern T_LcdShowInfoItem g_LcdShowInfoTab[];
+extern E_zMmi_Sim_Tip s_mmi_sim_tip;
+extern pthread_mutex_t g_mmi_refresh_lcd_mutex;
+
+extern UINT32 g_show_pagefirst;
+extern UINT32 g_show_pagesecond;
+extern UINT32 g_show_pagethird;
+
+static E_zMMI_Lcd_Page_Index g_mmi_lcd_page_index = MMI_SHOW_PAGE_FIRST;
+/***********************************************************************************
+   º¯Êý×÷ÓÃ:ÊÇ·ñÏÔʾ¶¥²ãͼ±ê, visible: TRUE£¬ÏÔʾ;FALSE, Òþ²Ø
+***********************************************************************************/
+static VOID mmi_set_top_bar_visibility(BOOL visible)
+{
+	g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_NET_CONNECT].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_WIFISTATION_CONNECT].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_SMS].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_SMS_NUM].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_WIFI].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NEW_VERSION].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_BATTERY].needShowFL = visible;
+}
+
+static VOID mmi_set_middle_visibility(BOOL visible)
+{
+	g_LcdShowInfoTab[LCD_SHOW_CMCC].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_SIM_STATE].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WPS_ACTIVE].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_CONNECTING].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_NET_PROVIDER].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_WIFISTA_SSID].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_TIP_UPDATE_INFO].needShowFL = visible;
+}
+
+static VOID mmi_set_ssid_page_visibility(BOOL visible)
+{
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_PASSWORD].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_SSID].needShowFL = visible;
+}
+
+static VOID mmi_set_ssid2_page_visibility(BOOL visible)
+{
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_PASSWORD2].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_SSID2].needShowFL = visible;
+}
+
+static VOID mmi_set_first_page_visibility(BOOL visible)
+{
+	if (g_show_pagefirst) {
+#if 0
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_BAR].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_TRAFFIC_SLIDER].needShowFL = visible;
+#endif
+		g_LcdShowInfoTab[LCD_SHOW_WIFI].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_NET_SIGNAL].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_BATTERY].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_CHARRING].needShowFL = visible;
+		//g_LcdShowInfoTab[LCD_SHOW_LOGO].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_OPERATOR].needShowFL = visible;
+	}
+}
+
+static VOID mmi_set_second_page_visibility(BOOL visible)
+{
+	if (g_show_pagesecond) {
+		//mmi_set_middle_visibility(visible);
+		mmi_set_ssid_page_visibility(visible);
+	}
+}
+
+static VOID mmi_set_third_page_visibility(BOOL visible)
+{
+	if (g_show_pagethird) {
+		g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_TEXT_SCAN_TO].needShowFL = visible;
+		g_LcdShowInfoTab[LCD_SHOW_TEXT_CONNECT].needShowFL = visible;
+	}
+}
+
+static VOID mmi_set_four_page_visibility(BOOL visible)
+{
+#if 0
+//»ùÏßÐèÇó¶àssidʱҪÏÔʾ
+	mmi_set_middle_visibility(visible);
+	mmi_set_ssid2_page_visibility(visible);
+#endif
+	g_LcdShowInfoTab[LCD_SHOW_FIRMWARE_VERSION].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_FIRMWARE_VERSION_VALUE].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_HARDWARE_VERSION].needShowFL = visible;
+	g_LcdShowInfoTab[LCD_SHOW_HARDWARE_VERSION_VALUE].needShowFL = visible;
+}
+
+static VOID mmi_set_five_page_visibility(BOOL visible)
+{
+//»ùÏßÐèÇó¶àssidʱҪÏÔʾ
+	g_LcdShowInfoTab[LCD_SHOW_WIFI_CODE2].needShowFL = visible;
+}
+
+static VOID mmi_set_all_page_invisibility()
+{
+	mmi_set_first_page_visibility(FALSE);
+	mmi_set_second_page_visibility(FALSE);
+	mmi_set_third_page_visibility(FALSE);
+	mmi_set_four_page_visibility(FALSE);
+	mmi_set_ssid2_page_visibility(FALSE);
+	mmi_set_five_page_visibility(FALSE);
+}
+
+
+BOOL mmi_is_the_last_page()
+{
+	int lastpage = 0;
+
+	if (g_show_pagethird)
+		lastpage = MMI_SHOW_PAGE_THIRD;
+
+	else if (g_show_pagefirst)
+		lastpage = MMI_SHOW_PAGE_SECOND;
+
+	return (g_mmi_lcd_page_index == lastpage);
+}
+
+E_zMMI_Lcd_Page_Index mmi_get_lcd_page_index(VOID)
+{
+	return g_mmi_lcd_page_index;
+}
+
+static E_zMMI_Lcd_Page_Index mmi_get_lcd_next_page_index(VOID)
+{
+	E_zMMI_Lcd_Page_Index index = mmi_get_lcd_page_index();
+	E_zMMI_Lcd_Page_Index next_index = index;
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI  mmi_get_lcd_next_page_index index = %d\n", index);
+
+	while (index < MMI_SHOW_PAGE_MAX) {
+		if (index == MMI_SHOW_PAGE_FIVE) {
+			index = MMI_SHOW_PAGE_FIRST;
+		} else {
+			index++;
+		}
+
+		if (index == MMI_SHOW_PAGE_FIRST) {
+			if (g_show_pagesecond) {
+				next_index = index;
+				break;
+			}
+		} else if (index == MMI_SHOW_PAGE_SECOND) {
+			if (g_show_pagefirst) {
+				next_index = index;
+				break;
+			}
+		} else if ((index == MMI_SHOW_PAGE_THIRD) && (mmi_get_qrcode_state() == TRUE)) {
+			if (g_show_pagethird) {
+				next_index = index;
+				break;
+			}
+		}
+		else if (index == MMI_SHOW_PAGE_FOUR)
+		{
+			next_index = index;
+			break;
+		}
+		if (mmi_get_multi_ssid_switch_flag()) {
+			if (index == MMI_SHOW_PAGE_FOUR) {
+				next_index = index;
+				break;
+			} else if ((index == MMI_SHOW_PAGE_FIVE) && (mmi_get_qrcode_state() == TRUE)) {
+				next_index = index;
+				break;
+			}
+		}
+	}
+
+	return next_index;
+}
+
+
+VOID mmi_set_lcd_page_index(E_zMMI_Lcd_Page_Index index)
+{
+	mmi_getMutex(&g_mmi_refresh_lcd_mutex);
+	g_mmi_lcd_page_index = index;
+	switch (index) {
+	case MMI_SHOW_PAGE_FIRST:
+		mmi_set_all_page_invisibility();
+		//mmi_set_top_bar_visibility(TRUE);
+		//mmi_set_middle_visibility(TRUE);
+		mmi_set_first_page_visibility(TRUE);
+		break;
+	case MMI_SHOW_PAGE_SECOND:
+		//mmi_set_top_bar_visibility(TRUE);
+		mmi_set_all_page_invisibility();
+		mmi_set_second_page_visibility(TRUE);//µÚÒ»Ò³¿ÉÄÜÓÉÆäËüÒ³ÃæÖ±½ÓÇлØËùÒÔÐèÒª½«ÆäËüÒ³ÃæÈ«²¿ÖÃfalse
+		break;
+	case MMI_SHOW_PAGE_THIRD:
+		//mmi_set_top_bar_visibility(FALSE);
+		mmi_set_all_page_invisibility();
+		mmi_set_third_page_visibility(TRUE);
+		break;
+	case MMI_SHOW_PAGE_FOUR:
+		//mmi_set_top_bar_visibility(TRUE);
+		mmi_set_all_page_invisibility();
+		mmi_set_four_page_visibility(TRUE);
+		break;
+	case MMI_SHOW_PAGE_FIVE:
+		//mmi_set_top_bar_visibility(FALSE);
+		mmi_set_all_page_invisibility();
+		mmi_set_five_page_visibility(TRUE);
+		break;
+	default:
+		break;
+	}
+	mmi_putMutex(&g_mmi_refresh_lcd_mutex);
+
+}
+
+
+VOID mmi_handle_lcd_key_switch_page()
+{
+	int page_index = mmi_get_lcd_next_page_index();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI  mmi_handle_lcd_key_switch_page page_index = %d\n", page_index);
+
+	//¹ö¶¯ÏÔʾSSID¶¨Ê±Æ÷stop £¬Î»ÖÃÖÃΪ0
+	mmi_stopLcdShowScrollSSIDTimer();
+	mmi_set_wificode_show_flag(FALSE);
+	if (page_index == MMI_SHOW_PAGE_FIRST) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_FIRST);
+		mmi_set_update_flag(MMI_TASK_WIFI);           // wifi ÍøÂçÖÊÁ¿ µçÁ¿ ÔËÓªÉÌÃûT-SEL
+		mmi_set_update_flag(MMI_TASK_NETSIGNAL);
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+		//mmi_set_update_flag(MMI_TASK_LOGO);
+	} else if (page_index == MMI_SHOW_PAGE_SECOND) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_SECOND);
+		mmi_set_update_flag(MMI_TASK_SSID);               //wifi ssid
+	} else if (page_index == MMI_SHOW_PAGE_THIRD) {
+		mmi_set_wificode_show_flag(TRUE);
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_THIRD);
+		mmi_set_update_flag(MMI_TASK_WIFICODE);           //¶þάÂë
+		mmi_set_update_flag(MMI_TASK_TEXT_CONNECT);       // scan to connect
+	} else if (page_index == MMI_SHOW_PAGE_FOUR) {
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_FOUR);
+		mmi_set_update_flag(MMI_TASK_VERSION);            //°æ±¾ºÅ
+	} else if (page_index == MMI_SHOW_PAGE_FIVE) {
+		mmi_set_wificode_show_flag(TRUE);
+		mmi_set_lcd_page_index(MMI_SHOW_PAGE_FIVE);
+		mmi_set_update_flag(MMI_TASK_WIFICODE);
+	}
+
+}
+#endif
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_led.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_led.c
new file mode 100755
index 0000000..7b0792d
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_led.c
@@ -0,0 +1,903 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_led.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £º
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include "mmi_common.h"
+
+/********************************************************************************
+  È«¾Ö±äÁ¿ÒýÓÃ
+**********************************************************************************/
+extern UINT32 g_smstask_enable;
+extern UINT32 g_voicetask_enable;
+extern UINT32 g_led_sleep_mode;
+
+/*****************************************************************************
+ È«¾Ö±äÁ¿¶¨Òå
+******************************************************************************/
+MMI_LED_STATE s_mmi_batled_laststate = LED_STATE_MAX;//±ê¼Çµç³ØµÆµÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_wanled_laststate = LED_STATE_MAX;//±ê¼ÇÍøÂçµÆµÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_lanled_laststate = LED_STATE_MAX;//±ê¼ÇwifiµÆµÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_smsled_laststate = LED_STATE_MAX;//±ê¼Ç¶ÌÐŵƵÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_traled_laststate = LED_STATE_MAX;//±ê¼ÇÁ÷Á¿µÆµÄÉÏÒ»´Î״̬
+MMI_LED_STATE s_mmi_voiled_laststate = LED_STATE_MAX;//±ê¼ÇÓïÒôµÆµÄÉÏÒ»´Î״̬
+
+extern POWER_ON_OFF_CALLBACK_FUN g_PowerOnOffFun;
+extern T_zMmiSmsLedConfig g_mmi_smsled_config_tab[];
+extern T_zMmiWifiLedConfig g_mmi_wifiled_config_tab[];
+extern T_zMmiNetLedConfig g_mmi_netled_config_tab[];
+extern T_zMmiBatteryLedConfig g_mmi_batled_config_tab[];
+extern T_zMmiVoipLedConfig g_mmi_voipled_config_tab[];
+extern T_zMmiNetLedConfig g_mmi_signalled_config_tab[];
+extern T_zMmiWifiLedConfig g_mmi_wpsled_config_tab[];
+extern T_zMmiRj11LedConfig g_mmi_rj11led_config_tab[];
+extern T_zMmiRj45LedConfig g_mmi_rj45led_config_tab[];
+
+
+extern sem_t g_mmi_traffic_warn_sem_id;
+BOOL s_mmi_trafficled_warn_flag = FALSE;//±ê¼ÇÁ÷Á¿¸æ¾¯µÆÊÇ·ñÕýÔÚË«ÉÁÖÐ
+extern int g_customer_type;
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:LEDµÆ²Ù×÷
+***********************************************************************************/
+static VOID mmi_led_operate_blink_off(T_zMmi_Led_Info*  userInfo)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_led_operate name= %d\n", userInfo->led_name);
+	T_zMmi_Led_Info tmpInfo = {0};
+	memcpy((VOID *)(&tmpInfo), (const VOID *)userInfo, sizeof(T_zMmi_Led_Info));
+	tmpInfo.led_state = LED_STATE_OFF;
+	tmpInfo.led_color = userInfo->led_color;
+	mmi_led_operate(&tmpInfo);
+
+}
+
+static VOID mmi_led_operate_set_blinktime(T_zMmi_Led_Blink_Time *blink_time, MMI_LED_BLINK_SPEED speed)
+{
+	switch (speed) {
+	case LED_STATE_FAST_BLINK: {
+		blink_time->uBlinkOnTime = LED_FAST_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_FAST_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_SLOW_BLINK: {
+		blink_time->uBlinkOnTime = LED_SLOW_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_SLOW_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_BAT_BLINK: {
+		blink_time->uBlinkOnTime = LED_BAT_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_BAT_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_LAN_BLINK: {
+		blink_time->uBlinkOnTime = LED_LAN_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_LAN_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_SMS_BLINK: {
+		blink_time->uBlinkOnTime = LED_SMS_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_SMS_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_WAN_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_VOIP_BLINK: {
+		blink_time->uBlinkOnTime = LED_VOIP_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_VOIP_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_WAN_FAST_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_FAST_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_FAST_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_WAN_SLOW_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_SLOW_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_SLOW_BLINK_OFF_TIME;
+		break;
+	}
+	//yaoyuan cpe
+	case LED_STATE_WAN_CPE_FAST_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_CPE_FAST_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_CPE_FAST_BLINK_OFF_TIME;
+		break;
+	}
+	case LED_STATE_WAN_CPE_SLOW_BLINK: {
+		blink_time->uBlinkOnTime = LED_WAN_CPE_SLOW_BLINK_ON_TIME;
+		blink_time->uBlinkOffTime = LED_WAN_CPE_SLOW_BLINK_OFF_TIME;
+		break;
+	}
+	default: {
+		break;
+	}
+	}
+}
+
+static VOID mmi_set_led_laststate(T_zMmi_Led_Info*  userInfo)
+{
+	switch (userInfo->led_name) {
+	case LED_BATTERY: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_batled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_batled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_batled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_batled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_WAN: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_wanled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_wanled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_wanled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_wanled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_LAN: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_lanled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_lanled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_lanled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_lanled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_SMS: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_smsled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_smsled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_smsled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_smsled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_TRAFFIC: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_traled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_traled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_traled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_traled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_VOIP: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_voiled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_voiled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_voiled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_voiled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+#if 0
+	//yao yuan
+	case LED_SIGNAL: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_sigled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_voiled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_sigled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_sigled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_WPS: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_wpsled_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_voiled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_wpsled_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_wpsled_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_RJ11: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_rj11led_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_voiled_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_rj11led_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_rj11led_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+	case LED_RJ45: {
+		if (userInfo->led_state == LED_STATE_BLINK) {
+			s_mmi_rj45led_laststate = LED_STATE_BLINK;
+		} else if (userInfo->led_state == LED_STATE_ON && s_mmi_rj45led_laststate == LED_STATE_BLINK) {
+			mmi_led_operate_blink_off(userInfo);
+			s_mmi_rj45led_laststate = LED_STATE_MAX;
+		} else {
+			s_mmi_rj45led_laststate = LED_STATE_MAX;
+		}
+		break;
+	}
+#endif	
+	default: {
+		break;
+	}
+	}
+}
+
+SINT32 mmi_showLed(UINT32 ledInfo)
+{
+	T_zMmi_Led_Info *led_info = (T_zMmi_Led_Info *)ledInfo;
+	T_zMmi_Led_Blink_Time blink_time = {0};
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_showLed name= %d ,state = %d, color=%d !\n", led_info->led_name, led_info->led_state, led_info->led_color);
+
+	mmi_set_led_laststate(led_info);
+	if (led_info->led_state == LED_STATE_BLINK) {
+		mmi_led_operate_set_blinktime(&blink_time, led_info->ledBlink_speed);
+		led_info->ledBlink_time = blink_time;
+	}
+	if (led_info->led_name == LED_TRAFFIC && s_mmi_traled_laststate == LED_STATE_BLINK && led_info->led_state == LED_STATE_OFF) {
+		mmi_led_operate(led_info);//Á÷Á¿µÆÉÏÒ»¸ö״̬ʱÉÁ˸£¬ÐèÒª¹ØÁ½´Î²ÅÄܹصô
+	}
+	mmi_led_operate(led_info);
+	return 0;
+}
+
+static VOID mmi_setLedShowInfo(T_zMmi_Led_Info* outLedInfo, T_zMmi_Led_Info inLedInfo)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_setLedShowInfo inLedInfo name:%d,state:%d,color:%d\n", inLedInfo.led_name, inLedInfo.led_state, inLedInfo.led_color);
+	outLedInfo->led_name = inLedInfo.led_name;
+	outLedInfo->led_color = inLedInfo.led_color;
+	outLedInfo->traffic = inLedInfo.traffic;
+	outLedInfo->led_state = inLedInfo.led_state;
+	outLedInfo->ledBlink_speed = inLedInfo.ledBlink_speed;
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_setLedShowInfo outLedInfo name:%d,state:%d,color:%d\n", outLedInfo->led_name, outLedInfo->led_state, outLedInfo->led_color);
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡¶ÌÐŵÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedSmsInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMmi_Sms_Info *pSmsInfo = (T_zMmi_Sms_Info*)taskInfo;
+	UINT32 i = 0;
+	
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedSmsInfo recvBox_sta=%d\n",pSmsInfo->recvBox_sta);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_SMS) / sizeof(T_zMmiSmsLedConfig); ++ i) {
+		if (pSmsInfo->recvBox_sta == g_mmi_smsled_config_tab[i].sms_info.recvBox_sta) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_smsled_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÓïÒôÌáʾµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedVoipInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMmi_Voip_Info *pVoipInfo = (T_zMmi_Voip_Info*)taskInfo;
+	UINT32 i = 0;
+	
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedVoipInfo voip_sta=%d\n",pVoipInfo->voip_sta);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_VOIP) / sizeof(T_zMmiVoipLedConfig); ++ i) {
+		if (pVoipInfo->voip_sta == g_mmi_voipled_config_tab[i].voip_info.voip_sta) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_voipled_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡rj11µÆÐÅÏ¢ Ò¢Ô¶cpe
+***********************************************************************************/
+SINT32 mmi_getLedRj11Info(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMmi_Rj11_Info *pVoipInfo = (T_zMmi_Rj11_Info*)taskInfo;
+	UINT32 i = 0;
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedRj11Info rj11_sta=%d\n",pVoipInfo->rj11_sta);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_RJ11) / sizeof(T_zMmiRj11LedConfig); ++ i) {
+		if (pVoipInfo->rj11_sta == g_mmi_rj11led_config_tab[i].rj11_info.rj11_sta) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_rj11led_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡rj45µÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedRj45Info(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMmi_Rj45_Info *pRj45Info = (T_zMmi_Rj45_Info*)taskInfo;
+	UINT32 i = 0;
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedRj45Info rj45_sta=%d\n",pRj45Info->rj45_sta);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_RJ45) / sizeof(T_zMmiRj45LedConfig); ++ i) {
+		if (pRj45Info->rj45_sta == g_mmi_rj45led_config_tab[i].rj45_info.rj45_sta) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_rj45led_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡µç³ØµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedBatteryInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMIBatteryInfo *pBatteryInfo = (T_zMMIBatteryInfo *)taskInfo;
+	UINT32 i = 0;
+	int charging_idx = -1;
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedBatteryInfo chg_sta=%d\n", pBatteryInfo->chg_state);
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_BATTERY) / sizeof(T_zMmiBatteryLedConfig); ++ i) {
+		if (STATE_DISCHARGE == g_mmi_batled_config_tab[i].bat_info.chg_state) {
+			if (pBatteryInfo->bat_level == g_mmi_batled_config_tab[i].bat_info.bat_level) {
+				if (pBatteryInfo->chg_state == STATE_DISCHARGE) {
+					mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[i].led_info);
+					return MMI_SUCCESS;
+				}
+				else
+				{
+					if (charging_idx != -1 && STATE_CHARGING == pBatteryInfo->chg_state)
+					{
+						g_mmi_batled_config_tab[charging_idx].led_info.led_color = g_mmi_batled_config_tab[i].led_info.led_color;
+						mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[charging_idx].led_info);
+                                		return MMI_SUCCESS;
+					}
+					break;
+				}
+			} 
+		}
+		else if (STATE_CHARGING == g_mmi_batled_config_tab[i].bat_info.chg_state)
+		{
+			charging_idx = i;
+		}
+		else if (pBatteryInfo->chg_state == g_mmi_batled_config_tab[i].bat_info.chg_state ) {
+			 mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[i].led_info);
+                         return MMI_SUCCESS;
+		}
+	}
+	if ( charging_idx != -1 && STATE_CHARGING == pBatteryInfo->chg_state )
+	{
+		mmi_setLedShowInfo(pLedInfo, g_mmi_batled_config_tab[charging_idx].led_info);
+		return MMI_SUCCESS;
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedNetInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMINetInfo *pNetInfo = (T_zMMINetInfo *)taskInfo;
+	UINT32 i = 0;
+	int customer_type = g_customer_type; 
+	E_zMmi_Net_Mode net_mode = pNetInfo->net_mode;
+	char mmi_nv_value[32] = {0};
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedNetInfo net_mode=%d connect=%d signal_weak=%d customer_type=%d\n",pNetInfo->net_mode,pNetInfo->connect_status,pNetInfo->signal_weak,g_customer_type);
+
+	//cfg_get_item("mmi_led_plan", mmi_nv_value, sizeof(mmi_nv_value));
+	//if (0 == strcmp(mmi_nv_value, "yaoyuan")) {
+	//	customer_type = CUSTOMER_YAOYUAN;
+		
+		cfg_get_item(NV_MODEM_MAIN_STATE, mmi_nv_value, sizeof(mmi_nv_value));
+		if (strcmp(mmi_nv_value, NV_SIM_STATE_INIT_COMPLETE)) {
+			net_mode = NET_MODE_NOTREADY;
+		}
+	//}
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_WAN) / sizeof(T_zMmiNetLedConfig); ++ i) {
+		if ((net_mode == g_mmi_netled_config_tab[i].net_info.net_mode) && (customer_type == g_mmi_netled_config_tab[i].custom_type)) {
+			if (net_mode == NET_MODE_NOSERVICE 
+				|| net_mode == NET_MODE_LIMITSERVICE
+				|| net_mode == NET_MODE_NOTREADY) {
+				mmi_setLedShowInfo(pLedInfo, g_mmi_netled_config_tab[i].led_info);
+				return MMI_SUCCESS;
+			} else {
+				//if ((pNetInfo->connect_status == g_mmi_netled_config_tab[i].net_info.connect_status) && (pNetInfo->socket_state == g_mmi_netled_config_tab[i].net_info.socket_state)) {
+				if ((pNetInfo->signal_weak == g_mmi_netled_config_tab[i].net_info.signal_weak)) {
+					mmi_setLedShowInfo(pLedInfo, g_mmi_netled_config_tab[i].led_info);
+					slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI mmi_getLedNetInfo netmode = %d, signal_weak = %d,i = %d,ledsta = %d\n", net_mode, pNetInfo->signal_weak, i, g_mmi_netled_config_tab[i].led_info.led_state);
+					return MMI_SUCCESS;
+				}
+			}
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçÐźŸñÐÅÏ¢£¨Ò¢Ô¶cpe£©
+***********************************************************************************/
+SINT32 mmi_getLedNetSigInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMINetInfo *pNetInfo = (T_zMMINetInfo *)taskInfo;
+	UINT32 i = 0;
+	int customer_type = g_customer_type; 
+	E_zMmi_Net_Mode net_mode = pNetInfo->net_mode;
+	char mmi_nv_value[32] = {0};
+
+	cfg_get_item("mmi_led_plan", mmi_nv_value, sizeof(mmi_nv_value));
+	if (0 == strcmp(mmi_nv_value, "yaoyuan")) {
+		customer_type = CUSTOMER_YAOYUAN;
+	}
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedNetSigInfo net_mode=%d signal_num %d customer_type=%d\n",pNetInfo->net_mode,pNetInfo->signal_num,customer_type);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_SIGNAL) / sizeof(T_zMmiNetLedConfig); ++ i) {
+		if ((net_mode == g_mmi_signalled_config_tab[i].net_info.net_mode) && (customer_type == g_mmi_signalled_config_tab[i].custom_type)) {
+			if (net_mode == NET_MODE_NOSERVICE 
+				|| net_mode == NET_MODE_LIMITSERVICE
+				|| net_mode == NET_MODE_NOTREADY) {
+				mmi_setLedShowInfo(pLedInfo, g_mmi_signalled_config_tab[i].led_info);
+				return MMI_SUCCESS;
+			} else {
+				if (pNetInfo->signal_num == g_mmi_signalled_config_tab[i].net_info.signal_num) {
+					mmi_setLedShowInfo(pLedInfo, g_mmi_signalled_config_tab[i].led_info);
+					slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI mmi_getLedNetSigInfo netmode = %d, con_sta = %d,i = %d,ledsta = %d\n", net_mode, pNetInfo->connect_status, i, g_mmi_netled_config_tab[i].led_info.led_state);
+					return MMI_SUCCESS;
+				}
+			}
+		}
+	}
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡WIFIµÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedWifiInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMIWifiInfo * pWifiInfo = (T_zMMIWifiInfo *)taskInfo;
+	UINT32 i = 0;
+	
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedWifiInfo wifi_state=%d, wifidata_state=%d\n",pWifiInfo->wifi_state,pWifiInfo->wifidata_state);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_LAN) / sizeof(T_zMmiWifiLedConfig); ++ i) {
+		if (pWifiInfo->wifi_state == g_mmi_wifiled_config_tab[i].wifi_info.wifi_state
+		    && pWifiInfo->wifidata_state == g_mmi_wifiled_config_tab[i].wifi_info.wifidata_state
+		    && (g_customer_type == g_mmi_wifiled_config_tab[i].custom_type)) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_wifiled_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+	
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡wpsµÆÐÅÏ¢ Ò¢Ô¶cpe
+***********************************************************************************/
+SINT32 mmi_getLedWpsInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	T_zMMIWifiInfo * pWifiInfo = (T_zMMIWifiInfo *)taskInfo;
+	UINT32 i = 0;
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedWpsInfo wps_state=%d customer_type=%d\n",pWifiInfo->wps_state, g_customer_type);
+
+	for (i = 0; i < (UINT32)mmi_get_config_tab_size(LED_WPS) / sizeof(T_zMmiWifiLedConfig); ++ i) {
+		if (pWifiInfo->wps_state == g_mmi_wpsled_config_tab[i].wifi_info.wps_state
+		    && (g_customer_type == g_mmi_wpsled_config_tab[i].custom_type)) {
+			mmi_setLedShowInfo(pLedInfo, g_mmi_wpsled_config_tab[i].led_info);
+			return MMI_SUCCESS;
+		}
+	}
+
+	return MMI_ERROR;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:Á÷Á¿¸æ¾¯Ë«ÉÁµÆ
+***********************************************************************************/
+VOID mmi_set_led_double_blink()
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI mmi_set_led_double_blink 1000ms off\n");
+
+	T_zMmi_Led_Info userInfo = {0};
+	userInfo.led_name = LED_WAN;
+	userInfo.led_state = LED_STATE_OFF;
+	userInfo.led_color = LED_COLOR_YELLOW;
+	mmi_led_operate(&userInfo);
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(1000, 0);
+
+	int sem_ret1 = -1;
+	sem_ret1 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret1 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI DBget1 FAILED! errno=%d\n",errno);
+	}
+	userInfo.led_color = LED_COLOR_RED;
+	userInfo.led_state = LED_STATE_ON;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(100, 0);
+
+	int sem_ret2 = -1;
+	sem_ret2 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret2 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI DBget2 FAILED! errno=%d\n",errno);
+	}
+
+	userInfo.led_state = LED_STATE_OFF;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(100, 0);
+
+	int sem_ret3 = -1;
+	sem_ret3 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret3 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI DBget3 FAILED! errno=%d\n",errno);
+	}
+
+	userInfo.led_state = LED_STATE_ON;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(100, 0);
+
+	int sem_ret4 = -1;
+	sem_ret4 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret4 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI DBget4 FAILED! errno=%d\n",errno);
+	}
+
+	userInfo.led_state = LED_STATE_OFF;
+	mmi_led_operate(&userInfo);
+	mmi_startLedTrafficWarnTimer(1000, 0);
+
+	int sem_ret5 = -1;
+	sem_ret5 = mmi_GetSemaphoreEintr(&g_mmi_traffic_warn_sem_id, MMI_WAIT_FOREVER);
+	if (sem_ret5 != MMI_SUCCESS) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI DBget5 FAILED! errno=%d\n",errno);
+	}
+
+	mmi_set_update_flag(MMI_TASK_NET);
+	mmi_startLedTrafficWarnTimer(4000, 1);
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:ÉèÖÃÁ÷Á¿¾¯¸æ±êÖ¾
+***********************************************************************************/
+VOID mmi_set_traffic_warn_flag(BOOL flag)
+{
+	s_mmi_trafficled_warn_flag = flag;
+}
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡Á÷Á¿µÆÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_getLedTrafficInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMMITrafficInfo * pTrafficInfo = (T_zMMITrafficInfo *)taskInfo;
+
+#if 0
+	pLedInfo->led_name = IOCTL_LED_TRAFFIC;
+	pLedInfo->userPara.uBrightness = 0;
+	pLedInfo->userPara.uColor = LED_COLOR_GREEN;
+	pLedInfo->userPara.uSleep = LED_SLEEP_MAX;
+	if (pTrafficInfo->traffic_switch == TRAFFIC_LIMIT_SWITCH_OFF) {
+		pLedInfo->userPara.uState = LED_STATE_OFF;
+		pLedInfo->speed = LED_STATE_DEFAULT_BLINK;
+		pLedInfo->userPara.uTraffic = LED_TRAFFIC_100;
+	} else {
+		if (pTrafficInfo->warning_tip_flag == 0) {
+			pLedInfo->userPara.uState = LED_STATE_ON;
+			pLedInfo->speed = LED_STATE_DEFAULT_BLINK;
+		} else {
+			pLedInfo->userPara.uState = LED_STATE_BLINK;
+			pLedInfo->speed = LED_STATE_FAST_BLINK;
+		}
+	}
+#endif
+
+	UINT32 temp = 100 * (pTrafficInfo->uesd_traffic / pTrafficInfo->total_traffic);
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedTrafficInfo temp = %d, level = %d\n", temp, pTrafficInfo->warning_tip_level);
+	if ((pTrafficInfo->warning_tip_level != 0) && (temp >= pTrafficInfo->warning_tip_level) && (pTrafficInfo->traffic_switch == TRAFFIC_LIMIT_SWITCH_ON)) {
+		if (!s_mmi_trafficled_warn_flag) {
+			mmi_set_traffic_warn_flag(TRUE);
+			mmi_set_led_double_blink();
+		}
+	} else {
+		mmi_set_traffic_warn_flag(FALSE);
+		mmi_stopLedTrafficWarnTimer();
+		mmi_set_update_flag(MMI_TASK_NET);
+	}
+	return MMI_ERROR;
+
+}
+
+static VOID mmi_set_allleds_off(E_zMMI_BatLed_Mode mode)
+{
+	T_zMmi_Led_Info userInfo = {0};
+
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI mmi_set_allleds_off mode = %d\n", mode);
+	mmi_set_traffic_warn_flag(FALSE);
+	mmi_stopLedTrafficWarnTimer();
+	mmi_clean_update_flag(MMI_TASK_NET);
+	mmi_clean_update_flag(MMI_TASK_TRAFFIC);
+	mmi_clean_update_flag(MMI_TASK_WIFI);
+	
+	mmi_clean_update_flag(MMI_TASK_NETSIGNAL);
+	mmi_clean_update_flag(MMI_TASK_LED_WPS);
+	mmi_clean_update_flag(MMI_TASK_RJ11);
+	mmi_clean_update_flag(MMI_TASK_RJ45);
+
+	if (g_voicetask_enable)
+		mmi_clean_update_flag(MMI_TASK_VOIP);
+	else if (g_smstask_enable)
+		mmi_clean_update_flag(MMI_TASK_SMS);
+
+	if (mode == MODE_OFF) {
+		userInfo.led_name = LED_BATTERY;
+		userInfo.led_color = LED_COLOR_YELLOW;
+		userInfo.led_state = LED_STATE_OFF;
+
+		mmi_led_operate(&userInfo);
+	} else if (mode == MODE_CHARGING) {
+
+	} else if (mode == MODE_STANDBY) {
+		userInfo.led_name = LED_BATTERY;
+		userInfo.led_color = LED_COLOR_GREEN;
+		userInfo.led_state = LED_STATE_BLINK;
+		userInfo.ledBlink_time.uBlinkOffTime = LED_BREATH_BLINK_OFF_TIME;
+		userInfo.ledBlink_time.uBlinkOnTime = LED_BREATH_BLINK_ON_TIME;
+		mmi_led_operate(&userInfo);
+	}
+	userInfo.led_name = LED_WAN;
+	userInfo.led_state = LED_STATE_OFF;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_LAN;
+	mmi_led_operate(&userInfo);
+	if (g_voicetask_enable)
+		userInfo.led_name = LED_VOIP;
+	else if (g_smstask_enable)
+		userInfo.led_name = LED_SMS;
+	mmi_led_operate(&userInfo);
+	//yaoyuan cpe
+	userInfo.led_color = LED_COLOR_BLUE;
+	userInfo.led_name = LED_WPS;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ11;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ45;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_SIGNAL;
+	mmi_led_operate(&userInfo);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¹Ø»ú»òÖØÆôʱËùÓеÆÏÈÈ«ÁÁÔÙÈ«Ãð
+***********************************************************************************/
+VOID mmi_set_allleds_blink(VOID)
+{
+
+	mmi_set_traffic_warn_flag(FALSE);
+	mmi_stopLedTrafficWarnTimer();
+	mmi_clean_update_flag(MMI_TASK_NET);
+	mmi_clean_update_flag(MMI_TASK_TRAFFIC);
+	mmi_clean_update_flag(MMI_TASK_WIFI);
+	//yao yuan
+	mmi_clean_update_flag(MMI_TASK_NETSIGNAL);
+	mmi_clean_update_flag(MMI_TASK_LED_WPS);
+	mmi_clean_update_flag(MMI_TASK_RJ11);
+	mmi_clean_update_flag(MMI_TASK_RJ45);
+
+	if (g_voicetask_enable)
+		mmi_clean_update_flag(MMI_TASK_VOIP);
+	else if (g_smstask_enable)
+		mmi_clean_update_flag(MMI_TASK_SMS);
+
+	T_zMmi_Led_Info userInfo = {0};
+
+	userInfo.led_name = LED_BATTERY;
+	userInfo.led_state = LED_STATE_ON;
+	userInfo.led_color = LED_COLOR_RED;
+	mmi_led_operate(&userInfo);
+
+	userInfo.led_name = LED_LAN;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	if (g_voicetask_enable)
+		userInfo.led_name = LED_VOIP;
+	else if (g_smstask_enable)
+		userInfo.led_name = LED_SMS;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	userInfo.led_name = LED_WAN;
+	if(g_customer_type == CUSTOMER_SDK_MIN)
+		userInfo.led_color = LED_COLOR_GREEN;
+	else
+		userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	//yaoyuan cpe
+	userInfo.led_color = LED_COLOR_BLUE;
+	userInfo.led_name = LED_WPS;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ11;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ45;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_SIGNAL;
+	userInfo.traffic = TRAFFIC_LED_5;
+	mmi_led_operate(&userInfo);
+
+
+	mmi_sleep(LED_BLINK_TIME_INTERVAL);
+
+	userInfo.led_state = LED_STATE_OFF;
+
+	userInfo.led_name = LED_BATTERY;
+	userInfo.led_color = LED_COLOR_RED;
+	mmi_led_operate(&userInfo);
+
+	userInfo.led_name = LED_LAN;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	if (g_voicetask_enable)
+		userInfo.led_name = LED_VOIP;
+	else if (g_smstask_enable)
+		userInfo.led_name = LED_SMS;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+
+	userInfo.led_name = LED_WAN;
+	userInfo.led_color = LED_COLOR_BLUE;
+	mmi_led_operate(&userInfo);
+	//yaoyuan cpe
+	userInfo.led_color = LED_COLOR_BLUE;
+	userInfo.led_name = LED_WPS;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ11;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_RJ45;
+	mmi_led_operate(&userInfo);
+	userInfo.led_name = LED_SIGNAL;
+	mmi_led_operate(&userInfo);
+	
+	slog(MMI_PRINT, SLOG_DEBUG, "mmi_set_allleds_blink  off!\n");
+}
+SINT32 mmi_getLedCtrlInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMMICtrlInfo * pCtrlInfo = (T_zMMICtrlInfo *)taskInfo;
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+
+	pLedInfo->traffic = TRAFFIC_LED_MAX;
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_getLedCtrlInfo pCtrlInfo->ledmode = %d\n", pCtrlInfo->ledmode);
+	switch (pCtrlInfo->ledmode) {
+	case MMI_ACTIVE_MODE:
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+
+		if (g_voicetask_enable)
+			mmi_set_update_flag(MMI_TASK_VOIP);
+		else if (g_smstask_enable)
+			mmi_set_update_flag(MMI_TASK_SMS);
+
+		mmi_set_update_flag(MMI_TASK_WIFI);
+		mmi_set_update_flag(MMI_TASK_NET);
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+		mmi_set_update_flag(MMI_TASK_LED_WPS);
+		break;
+	case MMI_IDLE_LEDOFF_MODE:
+		if (g_customer_type == CUSTOMER_SDK || g_customer_type == CUSTOMER_SDK_MIN) {
+			mmi_set_allleds_off(MODE_OFF);
+		}		
+		set_wake_unlock(MMI_MAIN_LOCK_ID);
+		break;
+	case MMI_IDLE_STANDBY_LEDOFF_MODE:
+		if (g_customer_type == CUSTOMER_SDK || g_customer_type == CUSTOMER_SDK_MIN) {
+			mmi_set_allleds_off(MODE_STANDBY);
+		}		
+		set_wake_unlock(MMI_MAIN_LOCK_ID);
+		break;
+	case MMI_FAKE_POWEROFF_MODE:
+		mmi_set_allleds_off(MODE_OFF);
+		set_wake_unlock(MMI_MAIN_LOCK_ID);
+		break;
+	case MMI_IDLE_CHG_LEDOFF_MODE:
+		if (g_customer_type == CUSTOMER_SDK || g_customer_type == CUSTOMER_SDK_MIN) {
+			mmi_set_allleds_off(MODE_CHARGING);
+		}
+		break;
+	case MMI_FAKE_POWEROFF_CHARGE_MODE:
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+		mmi_set_allleds_off(MODE_CHARGING);
+		break;
+	case MMI_POWEROFF_MODE:
+	case MMI_RESET_MODE:
+	case MMI_RESTART_MODE:
+		if(g_customer_type == CUSTOMER_SDK || g_customer_type == CUSTOMER_SDK_MIN){
+			mmi_set_allleds_blink();
+		}
+#ifndef DISABLE_LCD
+		if (g_PowerOnOffFun != NULL) {
+			slog(MMI_PRINT, SLOG_DEBUG, "mmi_set_allleds_blink  g_PowerOnOffFun!\n");
+			g_PowerOnOffFun();
+		}
+#endif
+		break;
+	case MMI_FAST_POWERON_MODE:
+		mmi_set_allleds_blink();
+		mmi_set_update_flag(MMI_TASK_BATTERY);
+
+		if (g_voicetask_enable)
+			mmi_set_update_flag(MMI_TASK_VOIP);
+		else if (g_smstask_enable)
+			mmi_set_update_flag(MMI_TASK_SMS);
+
+		mmi_set_update_flag(MMI_TASK_WIFI);
+		mmi_set_update_flag(MMI_TASK_NET);
+		mmi_set_update_flag(MMI_TASK_TRAFFIC);
+		mmi_set_update_flag(MMI_TASK_LED_WPS);
+		break;
+	case MMI_POWEROFF_ON_MODE:
+		break;
+	default:
+		break;
+	}
+	return MMI_ERROR;
+}
+
+SINT32 mmi_getLedPowerOffChagerInfo(UINT32 taskInfo, UINT32 outLedInfo)
+{
+	T_zMmi_Poc_Info *pPocInfo = (T_zMmi_Poc_Info *)taskInfo;
+	T_zMmi_Led_Info* pLedInfo = (T_zMmi_Led_Info*)outLedInfo;
+	pLedInfo->led_name = LED_BATTERY;
+	pLedInfo->traffic = TRAFFIC_LED_MAX;
+	pLedInfo->led_color = LED_COLOR_GREEN;
+
+	if (pPocInfo->poc_sta == POC_STATE_FULL || pPocInfo->poc_sta == POC_STATE_TEMP_ERROR) {
+		pLedInfo->led_state = LED_STATE_ON;
+	}
+	else if (pPocInfo->poc_sta == POC_STATE_LOWBATTERY) {
+		pLedInfo->led_color = LED_COLOR_RED;
+		pLedInfo->led_state = LED_STATE_ON;
+	}
+	else {
+		pLedInfo->led_state = LED_STATE_BLINK;
+		pLedInfo->ledBlink_speed = LED_STATE_BAT_BLINK;
+	}
+	return MMI_SUCCESS;
+
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_led_adapter.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_led_adapter.c
new file mode 100755
index 0000000..412df2a
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_led_adapter.c
@@ -0,0 +1,1551 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmiledadapter.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºLED²Ù×÷
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+******************************************************************************/
+
+/*****************************************************************************
+ Í·Îļþ
+******************************************************************************/
+#include "mmi_common.h"
+
+#define itoa(i,a,b) (((b) == 16) ? sprintf((a), "%x", (i)) : sprintf((a), "%d", (i)))
+
+MMI_LED_LASTSTATE g_mmi_wanled_state = LED_ALL_OFF;//±ê¼ÇÍøÂçµÆµÄµ±Ç°×´Ì¬
+MMI_LED_BLINK_SPEED g_mmi_wanled_speed = LED_STATE_DEFAULT_BLINK;//±ê¼ÇÍøÂçµÆµÄÉÁ˸ƵÂÊ
+MMI_LED_LASTSTATE g_mmi_lanled_state = LED_ALL_OFF;//±ê¼ÇwifiµÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_batteryled_state = LED_ALL_OFF;//±ê¼Çµç³ØµÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_smsled_state = LED_ALL_OFF;//±ê¼Ç¶ÌÐŵƵĵ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_voipled_state = LED_ALL_OFF;//±ê¼ÇÓïÒôµÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_signalled_state = LED_ALL_OFF;//±ê¼ÇÒ¢Ô¶cpeÍøÂçÐźŵƵĵ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_wpsled_state = LED_ALL_OFF;//±ê¼ÇÒ¢Ô¶cpe wpsµÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_rj11led_state = LED_ALL_OFF;//±ê¼ÇÒ¢Ô¶cpe rj11µÆµÄµ±Ç°×´Ì¬
+MMI_LED_LASTSTATE g_mmi_rj45led_state = LED_ALL_OFF;//±ê¼Çrj45µÆµÄµ±Ç°×´Ì¬
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:дÎļþ²Ù×÷º¯Êý
+***********************************************************************************/
+SINT32 mmi_file_operate(char *filepath, char *buf)
+{
+#if 1
+	SINT32 ret_fd = 0;
+	SINT32 len = 0;
+
+	ret_fd = open(filepath, O_RDWR);
+	if (ret_fd == -1) {
+		slog(MMI_PRINT, SLOG_ERR,"ZTE_MMI mmi_file_operate open file fail: %s!\n", filepath);
+		return MMI_ERROR;
+	}
+
+	len = strlen(buf);
+	if (write(ret_fd, buf, len) != len) {
+		slog(MMI_PRINT, SLOG_ERR,"ZTE_MMI mmi_file_operate write file fail: %s!\n", filepath);
+		close((int)ret_fd);
+		return MMI_ERROR;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_file_operate write file: %s success!!\n", filepath);
+	close((int)ret_fd);
+#endif
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:µãÁÁ
+***********************************************************************************/
+static SINT32 mmi_led_opt_on(char *filepath)
+{
+	return mmi_file_operate(filepath, "1");
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:µãÃð
+***********************************************************************************/
+static SINT32 mmi_led_opt_off(char *filebrightness)
+{
+	return mmi_file_operate(filebrightness, "0");
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉÁ˸
+***********************************************************************************/
+static SINT32 mmi_led_opt_blinkon(T_zMmi_LedBlink_Info *info)
+{
+	char buf1[12] = {0};
+	char buf2[12] = {0};
+	SINT32 ret1, ret2, ret3 = 0;
+
+	ret1 = mmi_file_operate(info->fileblinkSwitch, LED_BLINKON_STATE);
+
+
+	itoa((int)(info->timeon), buf1, 10);
+	ret2 = mmi_file_operate(info->fileblinktimeon, buf1);
+
+	itoa((int)(info->timoff), buf2, 10);
+	ret3 = mmi_file_operate(info->fileblinktimeoff, buf2);
+	if (ret1 == MMI_ERROR || ret2 == MMI_ERROR || ret3 == MMI_ERROR) {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI led_setFastBlinkOn fail ret1 = %d ret2 = %d ret3 = %d!\n", ret1, ret2, ret3);
+		return MMI_ERROR;
+	}
+	return MMI_SUCCESS;
+
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉÁ˸¹Ø
+***********************************************************************************/
+static SINT32 mmi_led_opt_blinkoff(char *fileblinkSwitch)
+{
+	return mmi_file_operate(fileblinkSwitch, LED_BLINKOFF_STATE);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÉèÖÃ/»ñÈ¡µÆµÄÉÏ´Î״̬
+***********************************************************************************/
+static VOID mmi_setBatLedState(MMI_LED_LASTSTATE bat_state)
+{
+	g_mmi_batteryled_state = bat_state;
+}
+
+static VOID mmi_setWanLedState(MMI_LED_LASTSTATE wan_state)
+{
+	g_mmi_wanled_state = wan_state;
+}
+
+static VOID mmi_setWanLedSpeed(MMI_LED_BLINK_SPEED wan_speed)
+{
+	g_mmi_wanled_speed = wan_speed;
+}
+
+static VOID mmi_setLanLedState(MMI_LED_LASTSTATE lan_state)
+{
+	g_mmi_lanled_state = lan_state;
+}
+static VOID mmi_setSmsLedState(MMI_LED_LASTSTATE sms_state)
+{
+	g_mmi_smsled_state = sms_state;
+}
+static VOID mmi_setVoipLedState(MMI_LED_LASTSTATE voip_state)
+{
+	g_mmi_voipled_state = voip_state;
+}
+
+static MMI_LED_LASTSTATE mmi_getBatLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_batteryled_state;
+	return state;
+}
+
+static MMI_LED_LASTSTATE mmi_getWanLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_wanled_state;
+	return state;
+}
+static MMI_LED_BLINK_SPEED mmi_getWanLedSpeed(VOID)
+{
+	MMI_LED_BLINK_SPEED speed;
+	speed = g_mmi_wanled_speed;
+	return speed;
+}
+
+static MMI_LED_LASTSTATE mmi_getLanLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_lanled_state;
+	return state;
+}
+
+static MMI_LED_LASTSTATE mmi_getSmsLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_smsled_state;
+	return state;
+}
+
+static MMI_LED_LASTSTATE mmi_getVoipLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_voipled_state;
+	return state;
+}
+
+/********************************************************************************
+µç³ØµÆ²Ù×÷
+**********************************************************************************/
+VOID  mmi_BatLedOffOpt()
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_BatLedOffOpt !\n");
+	mmi_led_opt_blinkoff(LED_BATTERY_GREEN_BLINKSWITCH);
+	mmi_led_opt_off(LED_BATTERY_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkoff(LED_BATTERY_BLUE_BLINKSWITCH);
+	mmi_led_opt_off(LED_BATTERY_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkoff(LED_BATTERY_RED_BLINKSWITCH);
+	mmi_led_opt_off(LED_BATTERY_RED_BRIGHTNESS);
+	mmi_setBatLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_BatLedRedOn()
+{
+	mmi_led_opt_on(LED_BATTERY_RED_BRIGHTNESS);
+}
+
+static VOID mmi_BatLedRedBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_BATTERY_RED_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_RED_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_RED_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_BATTERY_RED_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+VOID mmi_BatLedGreenOn()
+{
+	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
+}
+
+
+static VOID mmi_BatLedBlueOn()
+{
+	mmi_led_opt_on(LED_BATTERY_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_BatLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_BATTERY_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_BATTERY_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_BatLedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_BATTERY_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_GREEN_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_BatLedYellowOn()
+{
+	mmi_led_opt_on(LED_BATTERY_RED_BRIGHTNESS);
+	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_BatLedYellowBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_BATTERY_RED_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_RED_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_RED_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_BATTERY_RED_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+
+	info.fileblinkSwitch = LED_BATTERY_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_BATTERY_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_BATTERY_GREEN_BLINKTIMEON;
+	mmi_led_opt_on(LED_BATTERY_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_BatLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE bat_sta = mmi_getBatLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_BatLedOnOpt  color=%d, bat_sta = %d!\n", color, bat_sta);
+	if (color == LED_COLOR_RED) {
+
+		if (bat_sta == LED_RED_ON) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedRedOn();
+		}
+		mmi_setBatLedState(LED_RED_ON);
+	} else if (color == LED_COLOR_GREEN) {
+		if (bat_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedGreenOn();
+		}
+		mmi_setBatLedState(LED_GREEN_ON);
+	} else if (color == LED_COLOR_BLUE) {
+		if (bat_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedBlueOn();
+		}
+		mmi_setBatLedState(LED_YELLOW_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_BatLedOnOpt invalid led color!\n");
+	}
+}
+
+static VOID mmi_BatLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE bat_sta = mmi_getBatLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_BatLedFastBlinkOpt  color=%d bat_sta = %d!\n", color, bat_sta);
+	if (color == LED_COLOR_RED) {
+		if (bat_sta == LED_RED_BLINK) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedRedBlink(time);
+		}
+		mmi_setBatLedState(LED_RED_BLINK);
+	} else if (color == LED_COLOR_GREEN) {
+		if (bat_sta == LED_GREEN_BLINK) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedGreenBlink(time);
+		}
+		mmi_setBatLedState(LED_GREEN_BLINK);
+	} else if (color == LED_COLOR_BLUE) {
+		if (bat_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_BatLedOffOpt();
+			mmi_BatLedBlueBlink(time);
+		}
+		mmi_setBatLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_BatLedFastBlinkOpt invalid led color!\n");
+	}
+}
+
+static VOID mmi_processbBatteryLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processbBatteryLed state = %d color = %d !\n",  state, color);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_BatLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_BatLedOffOpt();
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_BatLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processbBatteryLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+
+/********************************************************************************
+  ÍøÂçµÆ²Ù×÷
+**********************************************************************************/
+static VOID mmi_WanLedOffOpt()
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_WanLedOffOpt !\n");
+	mmi_led_opt_blinkoff(LED_WAN_GREEN_BLINKSWITCH);
+	mmi_led_opt_off(LED_WAN_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkoff(LED_WAN_RED_BLINKSWITCH);
+	mmi_led_opt_off(LED_WAN_RED_BRIGHTNESS);
+	mmi_led_opt_blinkoff(LED_WAN_BLUE_BLINKSWITCH);
+	mmi_led_opt_off(LED_WAN_BLUE_BRIGHTNESS);
+	mmi_setWanLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_WanLedRedOn()
+{
+	mmi_led_opt_on(LED_WAN_RED_BRIGHTNESS);
+}
+
+static VOID mmi_WanLedRedBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WAN_RED_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_RED_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_RED_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WAN_RED_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WanLedGreenOn()
+{
+	mmi_led_opt_on(LED_WAN_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_WanLedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WAN_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_GREEN_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WAN_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WanLedYellowOn()
+{
+	mmi_led_opt_on(LED_WAN_RED_BRIGHTNESS);
+	mmi_led_opt_on(LED_WAN_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_WanLedYellowBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WAN_RED_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_RED_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_RED_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WAN_RED_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+
+	info.fileblinkSwitch = LED_WAN_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_GREEN_BLINKTIMEON;
+	mmi_led_opt_on(LED_WAN_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WanLedBlueOn()
+{
+	mmi_led_opt_on(LED_WAN_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_WanLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WAN_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WAN_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_WAN_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WAN_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WanLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE wan_sta = mmi_getWanLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_WanLedOnOpt  color=%d, wan_sta = %d!\n", color, wan_sta);
+	if (color == LED_COLOR_RED) {
+		if (wan_sta == LED_RED_ON) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedRedOn();
+		}
+		mmi_setWanLedState(LED_RED_ON);
+	} else if (color == LED_COLOR_GREEN) {
+		if (wan_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedGreenOn();
+		}
+		mmi_setWanLedState(LED_GREEN_ON);
+	} else if (color == LED_COLOR_YELLOW) {
+		if (wan_sta == LED_YELLOW_ON) {
+			return;
+		} else if (wan_sta == LED_GREEN_ON) {
+			mmi_WanLedRedOn();
+		} else if (wan_sta == LED_RED_ON) {
+			mmi_WanLedGreenOn();
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedYellowOn();
+		}
+		mmi_setWanLedState(LED_YELLOW_ON);
+	} else if (color == LED_COLOR_BLUE) {
+		if (wan_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedBlueOn();
+		}
+		mmi_setWanLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_WanLedOnOpt invalid led color!\n");
+	}
+}
+
+static VOID mmi_WanLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time,MMI_LED_BLINK_SPEED speed)
+{
+	MMI_LED_LASTSTATE wan_sta = mmi_getWanLedState();
+	MMI_LED_BLINK_SPEED wan_speed = mmi_getWanLedSpeed();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_WanLedBlinkOpt  color=%d, wan_sta = %d wan_speed_last=%d!\n", color, wan_sta, wan_speed);
+	if (color == LED_COLOR_RED) {
+		if (wan_sta == LED_RED_BLINK) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedRedBlink(time);
+		}
+		mmi_setWanLedState(LED_RED_BLINK);
+	} else if (color == LED_COLOR_GREEN) {
+		if (wan_sta == LED_GREEN_BLINK && (speed == wan_speed)) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedGreenBlink(time);
+		}
+		mmi_setWanLedState(LED_GREEN_BLINK);
+		mmi_setWanLedSpeed(speed);
+	} else if (color == LED_COLOR_YELLOW) {
+		if (wan_sta == LED_YELLOW_BLINK) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedYellowBlink(time);
+		}
+		mmi_setWanLedState(LED_YELLOW_BLINK);
+	} else if (color == LED_COLOR_BLUE) {
+		if (wan_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_WanLedOffOpt();
+			mmi_WanLedBlueBlink(time);
+		}
+		mmi_setWanLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_WanLedFastBlinkOpt invalid led color!\n");
+	}
+}
+
+static VOID mmi_processWanLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time, MMI_LED_BLINK_SPEED speed)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processWanLed state = %d color=%d speed=%d!\n",  state, color, speed);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_WanLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_WanLedOffOpt();
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_WanLedBlinkOpt(color, time, speed);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processNetLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  WIFI µÆ²Ù×÷
+**********************************************************************************/
+static VOID mmi_LanLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_LanLedOffOpt!\n");
+	if (color == LED_COLOR_GREEN) {
+		mmi_led_opt_blinkoff(LED_LAN_GREEN_BLINKSWITCH);
+		mmi_led_opt_off(LED_LAN_GREEN_BRIGHTNESS);
+	} else if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_LAN_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_LAN_BLUE_BRIGHTNESS);
+	}
+	mmi_setLanLedState(LED_ALL_OFF);
+}
+static VOID mmi_LanLedGreenOn()
+{
+	mmi_led_opt_on(LED_LAN_GREEN_BRIGHTNESS);
+}
+static VOID mmi_LanLedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_LAN_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_LAN_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_LAN_GREEN_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_LAN_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_LanLedBlueOn()
+{
+	mmi_led_opt_on(LED_LAN_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_LanLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_LAN_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_LAN_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_LAN_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_LAN_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_LanLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE lan_sta = mmi_getLanLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_LanLedOnOpt lan_sta = %d!\n", lan_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (lan_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_LanLedOffOpt(color);
+			mmi_LanLedGreenOn();
+		}
+		mmi_setLanLedState(LED_GREEN_ON);
+	} else if (color == LED_COLOR_BLUE) {
+		if (lan_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_LanLedOffOpt(color);
+			mmi_LanLedBlueOn();
+		}
+		mmi_setLanLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_LanLedOnOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_LanLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE lan_sta = mmi_getLanLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_LanLedBlinkOpt lan_sta = %d!\n", lan_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (lan_sta == LED_GREEN_BLINK) {
+			return;
+		} else {
+			mmi_LanLedOffOpt(color);
+			mmi_LanLedGreenBlink(time);
+		}
+		mmi_setLanLedState(LED_GREEN_BLINK);
+	} else if (color == LED_COLOR_BLUE) {
+		if (lan_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_LanLedOffOpt(color);
+			mmi_LanLedBlueBlink(time);
+		}
+		mmi_setLanLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_LanLedBlinkOpt invalid color!!\n");
+	}
+}
+static VOID mmi_processLanLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processLanLed state=%d!\n", state);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_LanLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_LanLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_LanLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processLanLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+
+/********************************************************************************
+  ¶ÌÐŵƲÙ×÷
+**********************************************************************************/
+static VOID mmi_SmsLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_SmsLedOffOpt!\n");
+	if (color == LED_COLOR_GREEN) {
+		mmi_led_opt_blinkoff(LED_SMS_GREEN_BLINKSWITCH);
+		mmi_led_opt_off(LED_SMS_GREEN_BRIGHTNESS);
+	} else if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_SMS_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_SMS_BLUE_BRIGHTNESS);
+	}
+	mmi_setSmsLedState(LED_ALL_OFF);
+}
+static VOID mmi_SmsLedGreenOn()
+{
+	mmi_led_opt_on(LED_SMS_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_SmsLedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_SMS_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_SMS_GREEN_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_SMS_GREEN_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_SMS_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_SmsLedBlueOn()
+{
+	mmi_led_opt_on(LED_SMS_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_SmsLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_SMS_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_SMS_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_SMS_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_SMS_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_SmsLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE sms_sta = mmi_getSmsLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_SmsLedOnOpt  sms_sta = %d!\n", sms_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (sms_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_SmsLedOffOpt(color);
+			mmi_SmsLedGreenOn();
+		}
+		mmi_setSmsLedState(LED_GREEN_ON);
+	} else if (color == LED_COLOR_BLUE) {
+		if (sms_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_SmsLedOffOpt(color);
+			mmi_SmsLedBlueOn();
+		}
+		mmi_setSmsLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_SmsLedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_SmsLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sms_sta = mmi_getSmsLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_SmsLedBlinkOpt sms_sta = %d!\n", sms_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (sms_sta == LED_GREEN_BLINK) {
+			return;
+		} else {
+			mmi_SmsLedOffOpt(color);
+			mmi_SmsLedGreenBlink(time);
+		}
+		mmi_setSmsLedState(LED_GREEN_BLINK);
+	} else if (color == LED_COLOR_BLUE) {
+		if (sms_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_SmsLedOffOpt(color);
+			mmi_SmsLedBlueBlink(time);
+		}
+		mmi_setSmsLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_SmsLedBlinkOpt invalid color!!\n");
+	}
+
+}
+static VOID mmi_processSmsLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processSmsLed state=%d\n", state);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_SmsLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_SmsLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_SmsLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processSmsLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:Á÷Á¿µÆ²Ù×÷
+***********************************************************************************/
+static VOID mmi_TrafficLedOnOpt(MMI_TRAFFIC_LED traffic)
+{
+	switch (traffic) {
+	case TRAFFIC_LED_1:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_1_ON);
+		break;
+	case TRAFFIC_LED_2:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_2_ON);
+		break;
+	case TRAFFIC_LED_3:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_3_ON);
+		break;
+	case TRAFFIC_LED_4:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_4_ON);
+		break;
+	case TRAFFIC_LED_5:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_5_ON);
+		break;
+	case TRAFFIC_LED_6:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_6_ON);
+		break;
+	case TRAFFIC_LED_7:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_7_ON);
+		break;
+	case TRAFFIC_LED_8:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_8_ON);
+		break;
+	case TRAFFIC_LED_9:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_9_ON);
+		break;
+	case TRAFFIC_LED_10:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_10_ON);
+		break;
+	default:
+		break;
+	}
+}
+
+static VOID mmi_TrafficLedBlinkOpt(MMI_TRAFFIC_LED traffic)
+{
+	switch (traffic) {
+	case TRAFFIC_LED_1:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_1_BLINK);
+		break;
+	case TRAFFIC_LED_2:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_2_BLINK);
+		break;
+	case TRAFFIC_LED_3:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_3_BLINK);
+		break;
+	case TRAFFIC_LED_4:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_4_BLINK);
+		break;
+	case TRAFFIC_LED_5:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_5_BLINK);
+		break;
+	case TRAFFIC_LED_6:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_6_BLINK);
+		break;
+	case TRAFFIC_LED_7:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_7_BLINK);
+		break;
+	case TRAFFIC_LED_8:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_8_BLINK);
+		break;
+	case TRAFFIC_LED_9:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_9_BLINK);
+		break;
+	case TRAFFIC_LED_10:
+		mmi_file_operate(TRAFFIC_LED_PATH, TRAFIIC_LED_10_BLINK);
+		break;
+	default:
+		break;
+	}
+}
+
+static VOID mmi_TrafficLedOffOpt()
+{
+	mmi_file_operate(TRAFFIC_LED_PATH, LED_TRAFFIC_ALL_OFF);
+}
+static VOID mmi_processTrafficLed(MMI_LED_STATE state, MMI_TRAFFIC_LED traffic)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processTrafficLed state = %d traffic = %d\n", state, traffic);
+	switch (state) {
+	case LED_STATE_ON:
+		mmi_TrafficLedOnOpt(traffic);
+		break;
+	case LED_STATE_BLINK:
+		mmi_TrafficLedBlinkOpt(traffic);
+		break;
+	case LED_STATE_OFF:
+		mmi_TrafficLedOffOpt();
+		break;
+	default:
+		break;
+
+	}
+}
+
+/********************************************************************************
+  ÓïÒôÌáʾµÆ²Ù×÷
+**********************************************************************************/
+static VOID mmi_VoipLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_VoipLedOffOpt!\n");
+	if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_VOIP_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_VOIP_BLUE_BRIGHTNESS);
+	}
+	mmi_setVoipLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_VoipLedBlueOn()
+{
+	mmi_led_opt_on(LED_VOIP_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_VoipLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_VOIP_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_VOIP_BLUE_BLINKTIMEOFF;
+	info.fileblinktimeon = LED_VOIP_BLUE_BLINKTIMEON;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_VOIP_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_VoipLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE voip_sta = mmi_getVoipLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_VoipLedOnOpt  voip_sta = %d!\n", voip_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (voip_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_VoipLedOffOpt(color);
+			mmi_VoipLedBlueOn();
+		}
+		mmi_setVoipLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_VoipLedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_VoipLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE voip_sta = mmi_getVoipLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_VoipLedBlinkOpt voip_sta = %d!\n", voip_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (voip_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_VoipLedOffOpt(color);
+			mmi_VoipLedBlueBlink(time);
+		}
+		mmi_setVoipLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_VoipLedBlinkOpt invalid color!!\n");
+	}
+
+}
+static VOID mmi_processVoipLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processVoipLed state=%d\n", state);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_VoipLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_VoipLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_VoipLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processVoipLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  ÐźÅÇ¿¶ÈÌáʾµÆ²Ù×÷ Ò¢Ô¶cpe
+**********************************************************************************/
+static MMI_LED_LASTSTATE mmi_getSignalLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_signalled_state;
+	return state;
+}
+
+static VOID mmi_setSignalLedState(MMI_LED_LASTSTATE sig_state)
+{
+	g_mmi_signalled_state = sig_state;
+}
+
+static MMI_LED_LASTSTATE mmi_transSignalLedState(MMI_TRAFFIC_LED traffic)
+{
+	MMI_LED_LASTSTATE state;
+    switch (traffic)
+    {
+    	case TRAFFIC_LED_1:
+	        state = LED_BLUE1_ON;
+	        break;
+
+    	case TRAFFIC_LED_2:
+	        state = LED_BLUE2_ON;
+	        break;
+
+		case TRAFFIC_LED_3:
+	        state = LED_BLUE3_ON;
+	        break;
+
+		case TRAFFIC_LED_4:
+	        state = LED_BLUE4_ON;
+	        break;
+
+		case TRAFFIC_LED_5:
+	        state = LED_BLUE5_ON;
+	        break;
+
+		case TRAFFIC_LED_MAX:
+			state = LED_BLUE_BLINK;
+			break;
+
+    	default:
+	        state = LED_ALL_OFF;
+	        break;
+    }
+
+	return state;
+}
+
+
+static VOID mmi_SignalLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_SignalLedOffOpt!\n");
+	if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_SIGNAL1_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_SIGNAL1_BLUE_BRIGHTNESS);
+		mmi_led_opt_off(LED_SIGNAL2_BLUE_BRIGHTNESS);
+		mmi_led_opt_off(LED_SIGNAL3_BLUE_BRIGHTNESS);
+		mmi_led_opt_off(LED_SIGNAL4_BLUE_BRIGHTNESS);
+		mmi_led_opt_off(LED_SIGNAL5_BLUE_BRIGHTNESS);
+	}
+	mmi_setSignalLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_SignalLedBlueOn(MMI_LED_LASTSTATE state)
+{
+	switch (state)
+    {
+    	case LED_BLUE1_ON:
+			mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+	        break;
+
+    	case LED_BLUE2_ON:
+	        mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL2_BLUE_BRIGHTNESS);
+	        break;
+
+		case LED_BLUE3_ON:
+	        mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL2_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL3_BLUE_BRIGHTNESS);
+	        break;
+
+		case LED_BLUE4_ON:
+	        mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL2_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL3_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL4_BLUE_BRIGHTNESS);
+	        break;
+
+		case LED_BLUE5_ON:
+	        mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL2_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL3_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL4_BLUE_BRIGHTNESS);
+			mmi_led_opt_on(LED_SIGNAL5_BLUE_BRIGHTNESS);
+	        break;
+
+    	default:
+	        slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_SignalLedBlueOn  state = %d!\n", state);
+	        break;
+    }
+}
+
+static VOID mmi_SignalLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_SIGNAL1_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_SIGNAL1_BLUE_BLINKTIMEON;
+	info.fileblinktimeon = LED_SIGNAL1_BLUE_BLINKTIMEOFF;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_SIGNAL1_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_SignalLedOnOpt(MMI_LED_COLOR color, MMI_TRAFFIC_LED traffic)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getSignalLedState();
+	MMI_LED_LASTSTATE traffic_trans = mmi_transSignalLedState(traffic);
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_SignalLedOnOpt  sig_sta = %d,%d!\n", sig_sta, traffic_trans);
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == traffic_trans) {
+			return;
+		} else {
+			mmi_SignalLedOffOpt(color);
+			mmi_SignalLedBlueOn(traffic_trans);
+		}
+		mmi_setSignalLedState(traffic_trans);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_SignalLedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_SignalLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getSignalLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_SignalLedBlinkOpt voip_sta = %d!\n", sig_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_SignalLedOffOpt(color);
+			mmi_SignalLedBlueBlink(time);
+		}
+		mmi_setSignalLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_SignalLedBlinkOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_processSignalLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time, MMI_TRAFFIC_LED traffic)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processSignalLed state=%d\n", state);
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_SignalLedOnOpt(color, traffic);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_SignalLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_SignalLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processSignalLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  WPSµÆ²Ù×÷ Ò¢Ô¶cpe
+**********************************************************************************/
+static MMI_LED_LASTSTATE mmi_getWpsLedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_wpsled_state;
+	return state;
+}
+
+static VOID mmi_setWpsLedState(MMI_LED_LASTSTATE sig_state)
+{
+	g_mmi_wpsled_state = sig_state;
+}
+
+static VOID mmi_WpsLedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_WpsLedOffOpt!\n");
+	if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_WPS_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_WPS_BLUE_BRIGHTNESS);
+	}
+	mmi_setWpsLedState(LED_ALL_OFF);
+}
+
+static VOID mmi_WpsLedBlueOn()
+{
+	mmi_led_opt_on(LED_WPS_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_WpsLedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_WPS_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_WPS_BLUE_BLINKTIMEON;
+	info.fileblinktimeon = LED_WPS_BLUE_BLINKTIMEOFF;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_WPS_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_WpsLedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getWpsLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_WpsLedOnOpt  sig_sta = %d!\n", sig_sta);
+
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_WpsLedOffOpt(color);
+			mmi_WpsLedBlueOn();
+		}
+		mmi_setWpsLedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_WpsLedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_WpsLedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getWpsLedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_SignalLedBlinkOpt voip_sta = %d!\n", sig_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_WpsLedOffOpt(color);
+			mmi_WpsLedBlueBlink(time);
+		}
+		mmi_setWpsLedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_SignalLedBlinkOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_processWpsLed(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processWpsLed state=%d\n", state);
+
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_WpsLedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_WpsLedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_WpsLedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processWpsLed invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  rj11µÆ²Ù×÷ Ò¢Ô¶cpe
+**********************************************************************************/
+static MMI_LED_LASTSTATE mmi_getRj11LedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_rj11led_state;
+	return state;
+}
+
+static VOID mmi_setRj11LedState(MMI_LED_LASTSTATE sig_state)
+{
+	g_mmi_rj11led_state = sig_state;
+}
+
+static VOID mmi_Rj11LedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_Rj11LedOffOpt!\n");
+	if (color == LED_COLOR_BLUE) {
+		mmi_led_opt_blinkoff(LED_RJ11_BLUE_BLINKSWITCH);
+		mmi_led_opt_off(LED_RJ11_BLUE_BRIGHTNESS);
+	}
+	mmi_setRj11LedState(LED_ALL_OFF);
+}
+
+static VOID mmi_Rj11LedBlueOn()
+{
+	mmi_led_opt_on(LED_RJ11_BLUE_BRIGHTNESS);
+}
+
+static VOID mmi_Rj11LedBlueBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_RJ11_BLUE_BLINKSWITCH;
+	info.fileblinktimeoff = LED_RJ11_BLUE_BLINKTIMEON;
+	info.fileblinktimeon = LED_RJ11_BLUE_BLINKTIMEOFF;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_RJ11_BLUE_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_Rj11LedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getRj11LedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_Rj11LedOnOpt  sig_sta = %d!\n", sig_sta);
+
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_ON) {
+			return;
+		} else {
+			mmi_Rj11LedOffOpt(color);
+			mmi_Rj11LedBlueOn();
+		}
+		mmi_setRj11LedState(LED_BLUE_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_Rj11LedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_Rj11LedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getRj11LedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_Rj11LedBlinkOpt voip_sta = %d!\n", sig_sta);
+	if (color == LED_COLOR_BLUE) {
+		if (sig_sta == LED_BLUE_BLINK) {
+			return;
+		} else {
+			mmi_Rj11LedOffOpt(color);
+			mmi_Rj11LedBlueBlink(time);
+		}
+		mmi_setRj11LedState(LED_BLUE_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_Rj11LedBlinkOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_processRj11Led(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processRj11Led state=%d\n", state);
+printf("ZTE_MMI mmi_processRj11Led state=%d\n", state);
+
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_Rj11LedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_Rj11LedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_Rj11LedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processRj11Led invalid state!\n");
+		break;
+	}
+	}
+}
+
+/********************************************************************************
+  rj45µÆ²Ù×÷
+**********************************************************************************/
+static MMI_LED_LASTSTATE mmi_getRj45LedState(VOID)
+{
+	MMI_LED_LASTSTATE state;
+	state = g_mmi_rj45led_state;
+	return state;
+}
+
+static VOID mmi_setRj45LedState(MMI_LED_LASTSTATE sig_state)
+{
+	g_mmi_rj45led_state = sig_state;
+}
+
+static VOID mmi_Rj45LedOffOpt(MMI_LED_COLOR color)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_Rj45LedOffOpt!\n");
+	if (color == LED_COLOR_GREEN) {
+		mmi_led_opt_blinkoff(LED_RJ45_GREEN_BLINKSWITCH);
+		mmi_led_opt_off(LED_RJ45_GREEN_BRIGHTNESS);
+	}
+	mmi_setRj45LedState(LED_ALL_OFF);
+}
+
+static VOID mmi_Rj45LedGreenOn()
+{
+	mmi_led_opt_on(LED_RJ45_GREEN_BRIGHTNESS);
+}
+
+static VOID mmi_Rj45LedGreenBlink(T_zMmi_Led_Blink_Time time)
+{
+	T_zMmi_LedBlink_Info info = {0};
+	info.fileblinkSwitch = LED_RJ45_GREEN_BLINKSWITCH;
+	info.fileblinktimeoff = LED_RJ45_GREEN_BLINKTIMEON;
+	info.fileblinktimeon = LED_RJ45_GREEN_BLINKTIMEOFF;
+	info.timeon = (char *)time.uBlinkOnTime;
+	info.timoff = (char *)time.uBlinkOffTime;
+	mmi_led_opt_on(LED_RJ45_GREEN_BRIGHTNESS);
+	mmi_led_opt_blinkon(&info);
+}
+
+static VOID mmi_Rj45LedOnOpt(MMI_LED_COLOR color)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getRj45LedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_Rj45LedOnOpt  sig_sta = %d!\n", sig_sta);
+
+	if (color == LED_COLOR_GREEN) {
+		if (sig_sta == LED_GREEN_ON) {
+			return;
+		} else {
+			mmi_Rj45LedOffOpt(color);
+			mmi_Rj45LedGreenOn();
+		}
+		mmi_setRj45LedState(LED_GREEN_ON);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_Rj45LedOnOpt invalid color!!\n");
+	}
+}
+static VOID mmi_Rj45LedBlinkOpt(MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	MMI_LED_LASTSTATE sig_sta = mmi_getRj45LedState();
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_Rj45LedBlinkOpt voip_sta = %d!\n", sig_sta);
+	if (color == LED_COLOR_GREEN) {
+		if (sig_sta == LED_GREEN_BLINK) {
+			return;
+		} else {
+			mmi_Rj45LedOffOpt(color);
+			mmi_Rj45LedGreenBlink(time);
+		}
+		mmi_setRj45LedState(LED_GREEN_BLINK);
+	} else {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_Rj45LedBlinkOpt invalid color!!\n");
+	}
+}
+
+static VOID mmi_processRj45Led(MMI_LED_STATE state, MMI_LED_COLOR color, T_zMmi_Led_Blink_Time time)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_processRj45Led state=%d\n", state);
+	printf("ZTE_MMI mmi_processRj45Led state=%d\n", state);
+
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_Rj45LedOnOpt(color);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_Rj45LedOffOpt(color);
+		break;
+	}
+	case LED_STATE_BLINK: {
+		mmi_Rj45LedBlinkOpt(color, time);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_processRj45Led invalid state!\n");
+		break;
+	}
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¿ª¹Ø»úʱËùÓеÆÈ«ÁÁÈ«Ãð²Ù×÷
+***********************************************************************************/
+static VOID mmi_processAllLed(MMI_LED_STATE state)
+{
+	switch (state) {
+	case LED_STATE_ON: {
+		mmi_file_operate(ALL_LED_PATH, LED_ALL_POWER_ON);
+		break;
+	}
+	case LED_STATE_OFF: {
+		mmi_file_operate(ALL_LED_PATH, LED_ALL_POWER_OFF);
+		break;
+	}
+	default:
+		break;
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:µãµÆ²Ù×÷º¯Êý
+***********************************************************************************/
+VOID mmi_led_operate(T_zMmi_Led_Info *ledinfo)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_led_operate ledname = %d state = %d color=%d,traffic=%d\n", ledinfo->led_name, ledinfo->led_state, ledinfo->led_color, ledinfo->traffic);
+	switch (ledinfo->led_name) {
+	case LED_BATTERY: {
+		mmi_processbBatteryLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_WAN: {
+		mmi_processWanLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time, ledinfo->ledBlink_speed);
+		break;
+	}
+	case LED_LAN: {
+		mmi_processLanLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_SMS: {
+		mmi_processSmsLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_TRAFFIC: {
+		mmi_processTrafficLed(ledinfo->led_state, ledinfo->traffic);
+		break;
+	}
+	case LED_VOIP: {
+		mmi_processVoipLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	//yao yuan
+	case LED_SIGNAL: {
+		mmi_processSignalLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time, ledinfo->traffic);
+		break;
+	}
+	case LED_WPS: {
+		mmi_processWpsLed(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_RJ11: {
+		mmi_processRj11Led(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_RJ45: {
+		mmi_processRj45Led(ledinfo->led_state, ledinfo->led_color, ledinfo->ledBlink_time);
+		break;
+	}
+	case LED_ALL: {
+		mmi_processAllLed(ledinfo->led_state);
+		break;
+	}
+	default: {
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_led_operate invalid ledname!\n");
+		break;
+	}
+	}
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_net.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_net.c
new file mode 100755
index 0000000..41d5ecb
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_net.c
@@ -0,0 +1,419 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_net.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡ÍøÂçÏà¹ØÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+
+/*****************************************************************************
+*                       Í·Îļþ
+*******************************************************************************/
+#include <limits.h>
+
+#include "mmi_common.h"
+#include "mmi_lcd.h"
+
+/*****************************************************************************
+*                       È«¾Ö±äÁ¿¶¨Òå
+*******************************************************************************/
+#define NETWORKMODE_2G                      3
+#define NETWORKMODE_3G_5                    5
+#define NETWORKMODE_3G_15                   15
+#define NETWORKMODE_4G                      17
+#define NETTYPE_NO_SERVICE                  "No Service"
+#define NETTYPE_LIMITED_SERVICE             "Limited Service"
+#define NETTYPE_NULL                        ""
+#define NETTYPE_E                           "E"
+#define NETTYPE_G                           "G"
+#define NETTYPE_3G                          "3G"
+#define NETTYPE_4G                          "4G"
+#define NETTYPE_4G_LTE                      "LTE"
+#define PPP_STATUS_CONNECTED                "ppp_connected"
+#define PPP_STATUS_IPV6_CONNECTED           "ipv6_connected"
+#define PPP_STATUS_IPV4_IPV6_CONNECTED      "ipv4_ipv6_connected"
+
+static UINT32 NET_Connect_State  = 0;	//ÍøÂçÁ¬½Ó״̬
+static UINT32 NET_MutilConnect_State  = 0;	//¶à·PDP¼¤»î×´Ì¬ÍøÂçÁ¬½Ó״̬
+static UINT32 NET_Signal_num = 0;       //ÍøÂçÐźŸñÊý  LCDʹÓÃ
+static UINT32 NET_Signal_Weak = 1;   	//ÍøÂçÐźűäÈõ״̬ LEDʹÓà 0-weak, 1-normal, 2-strong
+static UINT32 NET_Roam_Mode = 0;    	//ÂþÓÎģʽ
+static UINT32 NET_Socket_State = NET_SOCKET_INACTIVE;     //SOCKETÊÇ·ñ½¨Á¢Á¬½Ó״̬
+static UINT32 NET_McuSocket_State = NET_SOCKET_INACTIVE;     //SOCKETÊÇ·ñ½¨Á¢Á¬½Ó״̬
+
+struct list_head g_mmi_socket_queue;//·¢Ëͽ¨Á¢SOCKETÁ¬½ÓÏûÏ¢µÄÄ£¿éÁ´±í
+struct list_head g_mmi_multiconnect_queue;//·¢ËͶà·PDP¼¤»îÏûÏ¢µÄÄ£¿éÁ´±í
+
+static E_zMmi_Net_Mode s_mmi_net_mode = NET_MODE_DEFAULT;//ÍøÂçÖÆÊ½
+extern E_zMmiShowMode g_showMode;
+extern int g_customer_type;
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:·µ»ØÊÇ·ñÁªÍø×´Ì¬
+***********************************************************************************/
+BOOL mmi_net_connected()
+{
+	if (NET_Connect_State == 1 && s_mmi_net_mode != NET_MODE_NOSERVICE && s_mmi_net_mode != NET_MODE_LIMITSERVICE) { //e58
+		return TRUE;
+	}
+	return FALSE;
+}
+
+/**********************************************************************************
+*º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_netinfo(UINT32 netinfo)
+{
+	if (netinfo != 0) {
+		T_zMMINetInfo * pNetInfo = (T_zMMINetInfo *)netinfo;
+		pNetInfo->net_mode = s_mmi_net_mode;
+		pNetInfo->connect_status = (E_zMmi_Net_State)NET_Connect_State;
+		pNetInfo->signal_num = NET_Signal_num;
+		pNetInfo->signal_weak = NET_Signal_Weak;
+		pNetInfo->roam_mode = NET_Roam_Mode;
+		pNetInfo->socket_state = NET_Socket_State || NET_McuSocket_State;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterNetTaskInfoItem()
+{
+	T_zMMITaskInfoItem netTaskInfoItem = {0};
+	netTaskInfoItem.task = MMI_TASK_NET;
+	netTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMINetInfo));
+	netTaskInfoItem.get_taskinfo_fun = mmi_get_netinfo;
+	netTaskInfoItem.get_ledinfo_fun = mmi_getLedNetInfo;
+#ifndef DISABLE_LCD
+	netTaskInfoItem.get_lcdinfo_fun = mmi_getLcdNetInfo;
+#endif
+	netTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	mmi_register_taskinfo_item(&netTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterNetSigTaskInfoItem()
+{
+	T_zMMITaskInfoItem netTaskInfoItem = {0};
+	netTaskInfoItem.task = MMI_TASK_NETSIGNAL;
+	netTaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMINetInfo));
+	netTaskInfoItem.get_taskinfo_fun = mmi_get_netinfo;
+	netTaskInfoItem.get_ledinfo_fun = mmi_getLedNetSigInfo;
+#ifndef DISABLE_LCD
+	netTaskInfoItem.get_lcdinfo_fun = mmi_getLcdNetInfo;
+#endif
+	netTaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	mmi_register_taskinfo_item(&netTaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_net_update()
+{
+	if (g_showMode == MMI_MODE_LCD || g_showMode == MMI_MODE_ALL) {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_net_update LCD!!!\n");
+		mmi_set_update_flag(MMI_TASK_NET);
+		mmi_set_update_flag(MMI_TASK_NETSIGNAL);
+	}
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_set_net_update LED mode=%d!!!\n",mode);
+		if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN){//guodian
+			mmi_set_update_flag(MMI_TASK_NET);
+		}else{
+			if (mode != MMI_RESET_MODE && mode != MMI_RESTART_MODE && mode != MMI_POWEROFF_MODE && mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_IDLE_CHG_LEDOFF_MODE
+				&& mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_FAKE_POWEROFF_CHARGE_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+				mmi_set_update_flag(MMI_TASK_NET);
+				mmi_set_update_flag(MMI_TASK_NETSIGNAL);
+			}
+		}
+	}
+}
+
+UINT32 mmi_get_net_state(VOID)
+{
+	return NET_Connect_State;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SIM¿¨°Î³öʱ£¬Å¼ÏÖat_server²»Éϱ¨¶ÏÍø×´Ì¬£¬Ðè×ÔÐн«ÍøÂç״̬ÖÃΪ¶Ï¿ª×´Ì¬
+***********************************************************************************/
+VOID mmi_clean_net_state()
+{
+	s_mmi_net_mode = NET_MODE_NOSERVICE;
+	NET_Connect_State = 0;
+	mmi_set_net_update();
+	mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¸ù¾ÝÍøÂçÁ¬½Ó״̬²Ù×÷ÍøÂçµÆ
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Connect_Status(VOID *data)
+{
+	NET_Connect_State = *(UINT32*)data;//ÍøÂç״̬0-¶Ï¿ª£¬1-Á¬½Ó  2-Á¬½ÓÖÐ 3-¶Ï¿ªÖÐ
+	if(1 == NET_MutilConnect_State && 0 == NET_Connect_State){
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI svr_handle_msg_connect_status NET_Connect_State = %d\n", NET_Connect_State);
+		return 0;
+	}
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI svr_handle_msg_connect_status NET_Connect_State = %d\n", NET_Connect_State);
+	if (NET_Connect_State == 1 || NET_Connect_State == 0) {
+		mmi_set_net_update();
+		ipc_send_message(MODULE_ID_MMI, MODULE_ID_FLUXSTAT, MSG_CMD_CHANNEL_CONNECT_STATUS, sizeof(NET_Connect_State), (UCHAR *)&NET_Connect_State, 0);
+	}
+	mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+
+	return 0;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¸ù¾Ý¶à·PDP¼¤»î״̬²Ù×÷ÍøÂçµÆ£¬,×¢Òâ¿ÉÄÜ»áÓжà¸ösocket_proxy½øÐжà·PDP¼¤»î
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_MultiConnect_Status(VOID *data, int src_id)
+{	
+	NET_MutilConnect_State = *(UINT32*)data;//ÍøÂç״̬0-¶Ï¿ª£¬1-Á¬½Ó  	
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI zMMI_Handle_Msg_MultiConnect_Status NET_MutilConnect_State = %d\n", NET_MutilConnect_State);
+
+	if(1 == NET_MutilConnect_State){
+		mmi_add_list(&g_mmi_multiconnect_queue, src_id);
+	}else{
+		mmi_del_list(&g_mmi_multiconnect_queue, src_id);
+	}
+	if(list_empty(&g_mmi_multiconnect_queue)) {
+		NET_MutilConnect_State = 0;
+	}else {
+		NET_MutilConnect_State = 1;
+	}
+	NET_Connect_State = NET_MutilConnect_State;
+	mmi_set_net_update();
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_FLUXSTAT, MSG_CMD_CHANNEL_CONNECT_STATUS, sizeof(NET_Connect_State), (UCHAR *)&NET_Connect_State, 0);
+
+	mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¸ù¾ÝÍøÂçÖÆÊ½²Ù×÷ÍøÂçµÆ
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Network_Mode(VOID *data)
+{
+	SINT32 networkStatus = 0;
+	SINT32 networkMode = 0;
+	SINT32 netroamMode = 0;
+	networkMode = ((T_zAt_SysinfoRes*)data) ->sysMode;	//ÍøÂçÖÆÊ½
+	networkStatus = ((T_zAt_SysinfoRes*)data) ->srvStatus;//ÊÇ·ñÕý³£·þÎñ:0-ÎÞ·þÎñ 1-ÏÞÖÆ·þÎñ ÆäËû-Õý³£·þÎñ
+	netroamMode = ((T_zAt_SysinfoRes*)data) ->roamStatus;
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI svr_handle_msg_network_mode networkStatus = %d,networkMode=%d !!!\n", networkStatus, networkMode);
+
+	if (netroamMode == 1) {
+		NET_Roam_Mode = 1;
+	} else {
+		NET_Roam_Mode = 0;
+	}
+	if (networkStatus == 0) {
+		s_mmi_net_mode = NET_MODE_NOSERVICE;
+		mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+	} else if (networkStatus == 1) {
+		s_mmi_net_mode = NET_MODE_LIMITSERVICE;
+		mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+	} else {
+		if (NETWORKMODE_2G == networkMode) {
+			s_mmi_net_mode = NET_MODE_2G;
+		} else if ((NETWORKMODE_3G_5 == networkMode) || (NETWORKMODE_3G_15 == networkMode)) {
+			s_mmi_net_mode = NET_MODE_3G;
+		} else if (NETWORKMODE_4G == networkMode) {
+			s_mmi_net_mode = NET_MODE_4G;
+		} else {
+			s_mmi_net_mode = NET_MODE_NOSERVICE;
+		}
+		mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+	}
+	mmi_set_net_update();
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÍøÂçÐźűäÈõʱ´¦Àíº¯Êý
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Signal_Num(VOID *data)
+{
+	UINT32 sig_num = 0;
+	sig_num = *(UINT32*)data;
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI svr_handle_msg_Signal_Num sig_num = %d\n", sig_num);
+	if (sig_num <= 1)
+	{
+		NET_Signal_Weak = 0;
+	}
+	else if (sig_num >= 4)
+	{
+		NET_Signal_Weak = 2;
+	}
+	else
+	{
+		NET_Signal_Weak = 1;
+	}
+
+	if (sig_num == 0 || sig_num == 1)
+	{
+		NET_Signal_num = 1;
+	}
+	else if (sig_num == 2 || sig_num == 3)
+	{
+		NET_Signal_num = 3;
+	}
+	else if (sig_num == 4 || sig_num == 5)
+	{
+		NET_Signal_num = 5;
+	}
+	else
+	{
+		NET_Signal_num = sig_num;
+	}
+	//NET_Signal_num = sig_num;
+	mmi_set_net_update();
+	return 0;
+
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SIMcard °Î³ö»òδ²åÈë´¦Àíº¯Êý
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Simcard_Info(VOID *data)
+{
+	UINT32 sig_num = 0;
+	sig_num = *(UINT32*)data;
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI zMMI_Handle_Msg_Simcard_Info sig_num = %d\n", sig_num);
+
+	if (g_showMode == MMI_MODE_LCD)
+		return 0;
+
+	mmi_clean_net_state();
+
+	return 0;
+
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SOCKETÁ¬½Ó״̬±ä»¯´¦Àíº¯Êý,×¢Òâ¿ÉÄÜ»áÓжà¸ösocket_proxy½¨Á¢SOCKETÁ¬½Ó
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_Socket_Status(VOID *data, int src_id)
+{
+	NET_Socket_State = *(UINT32*)data;//socket״̬0-¶Ï¿ª£¬1-Á¬½Ó 
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI zMMI_Handle_Msg_Socket_Status NET_Socket_State = %d\n", NET_Socket_State);
+	
+	if(1 == NET_Socket_State){
+		mmi_add_list(&g_mmi_socket_queue, src_id);
+	}else{
+		mmi_del_list(&g_mmi_socket_queue, src_id);
+	}
+	if(list_empty(&g_mmi_socket_queue)) {
+		NET_Socket_State = NET_SOCKET_INACTIVE;
+	}else {
+		NET_Socket_State = NET_SOCKET_ACTIVE;
+	}
+	mmi_set_net_update();
+	return 0;
+}
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÍâÖÃSOCKETÁ¬½Ó״̬±ä»¯´¦Àíº¯Êý
+***********************************************************************************/
+SINT32 zMMI_Handle_Msg_MCUSocket_Status(VOID *data)
+{
+	NET_McuSocket_State = *(UINT32*)data;//socket״̬0-¶Ï¿ª£¬1-Á¬½Ó 
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI zMMI_Handle_Msg_MCUSocket_Status NET_McuSocket_State = %d\n", NET_McuSocket_State);
+	if (NET_McuSocket_State == NET_SOCKET_INACTIVE || NET_McuSocket_State == NET_SOCKET_ACTIVE) {
+		mmi_set_net_update();		
+	}
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯ÍøÂçָʾµÆ
+***********************************************************************************/
+static VOID mmi_init_wan_led(VOID)
+{
+	CHAR nettype[20] = {0};
+	CHAR netstate[20] = {0};
+	CHAR signal_num[2] = {0};
+	UINT32 tmp_signal_num = 0;
+
+	cfg_get_item(NV_NETWORK_TYPE, nettype, 20);
+	cfg_get_item(NV_PPP_STATUS, netstate, 20);
+	cfg_get_item(NV_SIGNALBAR, signal_num, 2);
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_init_wan_led nettype = %s netstate = %s signal_num = %s\n", nettype, netstate, signal_num);
+	if (!strncmp(nettype, NETTYPE_LIMITED_SERVICE, strlen(NETTYPE_LIMITED_SERVICE))) {
+		s_mmi_net_mode = NET_MODE_LIMITSERVICE;
+	} else if ((!strncmp(nettype, NETTYPE_G, 1)) || (!strncmp(nettype, NETTYPE_E, 1))) {
+		s_mmi_net_mode = NET_MODE_2G;
+	} else if (!strncmp(nettype, NETTYPE_3G, 2)) {
+		s_mmi_net_mode = NET_MODE_3G;
+	} else if (!strncmp(nettype, NETTYPE_4G, 2)) {
+		s_mmi_net_mode = NET_MODE_4G;
+	} else if (!strncmp(nettype, NETTYPE_4G_LTE, 3)) {
+		s_mmi_net_mode = NET_MODE_4G;
+	} else {
+		s_mmi_net_mode = NET_MODE_NOSERVICE;
+	}
+	if ((!strncmp(netstate, PPP_STATUS_CONNECTED, strlen(PPP_STATUS_CONNECTED))) || (!strncmp(netstate, PPP_STATUS_IPV6_CONNECTED, strlen(PPP_STATUS_IPV6_CONNECTED))) || (!strncmp(netstate, PPP_STATUS_IPV4_IPV6_CONNECTED, strlen(PPP_STATUS_IPV4_IPV6_CONNECTED)))) {
+		NET_Connect_State = 1;
+	} else {
+		NET_Connect_State = 0;
+	}
+	if (strlen(signal_num) == 0)
+	{
+		NET_Signal_Weak = 1;
+	}
+	else
+	{
+		int sig_num = atoi(signal_num);
+		if (sig_num <= 1)
+		{
+			NET_Signal_Weak = 0;
+		}
+		else if (sig_num >= 4)
+		{
+			NET_Signal_Weak = 2;
+		}
+		else
+		{
+			NET_Signal_Weak = 1;
+		}
+	}
+	//kw 3
+	tmp_signal_num = (strlen(signal_num) == 0 ? 0 : atoi(signal_num));
+	if (tmp_signal_num > INT_MAX-1) {
+		tmp_signal_num = 0;
+		slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI signal_num = %s\n", signal_num);
+	}
+	if (tmp_signal_num == 0 || tmp_signal_num == 1)
+	{
+		NET_Signal_num = 1;
+	}
+	else if (tmp_signal_num == 2 || tmp_signal_num == 3)
+	{
+		NET_Signal_num = 3;
+	}
+	else if (tmp_signal_num == 4 || tmp_signal_num == 5)
+	{
+		NET_Signal_num = 5;
+	}
+	else
+	{
+		NET_Signal_num = tmp_signal_num;
+	}
+	mmi_update_net_tip(NET_Connect_State, s_mmi_net_mode);
+	mmi_set_net_update();
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:ÍøÂçָʾµÆ³õʼ»¯
+***********************************************************************************/
+VOID mmi_net_init(VOID)
+{
+	INIT_LIST_HEAD(&g_mmi_socket_queue);
+	INIT_LIST_HEAD(&g_mmi_multiconnect_queue);
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_net_Led_Init finish !!\n");
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_rj45.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_rj45.c
new file mode 100644
index 0000000..ebc33e9
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_rj45.c
@@ -0,0 +1,94 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_rj45.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMIÒÔÌ«ÍøÌáʾµÆ²Ù×÷
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2024-8-28
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include "mmi_common.h"
+//#include "mmi_lcd.h"
+
+extern E_zMmiShowMode g_showMode;
+
+static E_zMmi_Rj45_Status s_mmi_rj45_state = RJ45_STATUS_NOR;//±£´ærj45µÄµ±Ç°×´Ì¬
+
+SINT32 mmi_get_rj45info(UINT32 rj45info)
+{
+	if (rj45info != 0) {
+		T_zMmi_Rj45_Info * pRj45Info = (T_zMmi_Rj45_Info *)rj45info;
+		pRj45Info->rj45_sta = s_mmi_rj45_state;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterRj45TaskInfoItem()
+{
+	T_zMMITaskInfoItem rj45TaskInfoItem = {0};
+	rj45TaskInfoItem.task = MMI_TASK_RJ45;
+	rj45TaskInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMmi_Rj45_Info));
+	rj45TaskInfoItem.get_taskinfo_fun = mmi_get_rj45info;
+	rj45TaskInfoItem.get_ledinfo_fun = mmi_getLedRj45Info;
+	rj45TaskInfoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	mmi_register_taskinfo_item(&rj45TaskInfoItem);
+	return MMI_SUCCESS;
+}
+
+static VOID mmi_set_rj45_update()
+{
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		E_zMmi_Work_Mode mode = mmi_get_led_mode();
+		if (mode != MMI_IDLE_LEDOFF_MODE && mode != MMI_IDLE_CHG_LEDOFF_MODE
+		    && mode != MMI_FAKE_POWEROFF_MODE && mode != MMI_FAKE_POWEROFF_CHARGE_MODE && mode != MMI_IDLE_STANDBY_LEDOFF_MODE) {
+			mmi_set_update_flag(MMI_TASK_RJ45);
+		}
+	}
+}
+
+VOID mmi_get_rj45_status(VOID)
+{
+	char nv_rj45_state[16] = {0};
+	cfg_get_item("rj45_pluginstate", nv_rj45_state, sizeof(nv_rj45_state));
+	int state = atoi(nv_rj45_state);
+	if (0 == state) {
+		s_mmi_rj45_state = RJ45_STATUS_OUT;
+	} else {
+		s_mmi_rj45_state = RJ45_STATUS_IN;
+	}
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI mmi_get_rj45_status nv_rj45_state = %s s_mmi_rj45_state= %d !\n", nv_rj45_state, s_mmi_rj45_state);
+}
+
+SINT32 zMMI_Handle_Msg_Rj45_Status(VOID * data)
+{
+	slog(MMI_PRINT, SLOG_NORMAL, "ZTE_MMI zMMI_Handle_Msg_Rj45_Status !\n");
+	mmi_get_rj45_status();
+	mmi_set_rj45_update();
+	return 0;
+}
+
+static VOID * mmi_get_rj45_info_timer_callback(VOID *arg)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_get_rj45_info_timer_callback!!!\n");
+	mmi_get_rj45_status();
+	mmi_set_rj45_update();
+	return NULL;
+}
+
+VOID mmi_rj45_init(VOID)
+{
+	int ret = -1;
+	mmi_get_rj45_status();
+	mmi_set_rj45_update();
+
+	ret = CreateSoftTimer(SET_RJ45_INFO_WAIT_TIMER, TIMER_FLAG_RESTART, SET_RJ45_INFO_WAIT_TIME, &mmi_get_rj45_info_timer_callback, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_ERR, " ZTE_MMI rj45 init Start Timer FAILED,cause=%d!!\n", ret);
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_rj45_init finish!!!\n");
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_tip.c b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_tip.c
new file mode 100755
index 0000000..79959ef
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_comm/zte_mmi/mmi_tip.c
@@ -0,0 +1,628 @@
+/*****************************************************************************
+*  °æ±¾ËùÓÐ (C)ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾
+*  Ä£¿éÃû    £ºMMI
+*  ÎļþÃû    £ºmmi_lcd_tip.c
+*  Îļþ±êʶ  £º
+*  Ïà¹ØÎļþ  £º
+*  ʵÏÖ¹¦ÄÜ  £ºMMI»ñÈ¡ÌáʾÐÅÏ¢
+*  ×÷Õß      £º
+*  °æ±¾      £ºV1.0
+*  Íê³ÉÈÕÆÚ  £º2014-6-20
+*  ÆäËü˵Ã÷  £º
+*
+*******************************************************************************/
+#include <limits.h>
+#include "mmi_common.h"
+
+static BOOL gMultiSSIDSwitchFlag = FALSE;//±ê¼ÇwebuiÊÇ·ñÉèÖÃÁ˶àSSID
+
+static SINT32 s_mmi_ssid_show_timer_status = 0;//ssid¹ö¶¯ÏÔʾʱÓõ½µÄ¶¨Ê±Æ÷״̬±ê¼Ç
+E_zMmi_Sim_Tip s_mmi_sim_tip = SIM_MAX;//sim¿¨×´Ì¬
+static E_zMmi_Sim_Tip s_mmi_sim_tipEx = SIM_MAX;//ÿs²éѯʱ£¬±£´æsim¿¨ÉÏÒ»´ÎµÄ״̬
+static E_zMmi_NetCon_Tip s_mmi_netcon_tip = NET_MAX;//ÍøÂçÁ¬½Ó×°Ì×
+//static E_zMmi_WpsAct_Tip s_mmi_wpsact_tip = WPS_ACTIVE_MAX;
+static CHAR s_mmi_net_pro [64] = {0};//±£´æÍøÂçÔËÓªÉÌÐÅÏ¢
+static CHAR s_mmi_ssid [36] = {"--"};//±£´æÖ÷ssid
+static CHAR s_mmi_wifikey [64] = {"--"};//±£´æÖ÷wifikey
+static CHAR s_mmi_ssid2 [36] = {"--"};//±£´æ¸±ssid
+static CHAR s_mmi_wifikey2 [64] = {"--"};//±£´æ¸±wifikey
+static CHAR s_mmi_msisdn[16] = {"--"};//ÊÇ·ñɾµô?
+static CHAR s_mmi_pci[8] = {"__"};
+static CHAR s_mmi_rapr_dBm[16] = {"--"};
+static CHAR s_mmi_sinr_dB[12] = {"--"};
+static CHAR s_mmi_acess_duration[16] = {"--"};
+static CHAR s_mmi_current_uasge[8] = {"--"};
+static CHAR s_mmi_update_result[16] = {0};
+static SINT32 s_mmi_update_tip = 0;
+static SINT32 s_mmi_update_tipEx = 0;
+extern E_zMmiShowMode g_showMode;
+static CHAR s_mmi_firmware_version [32] = {"--"};
+static CHAR s_mmi_hardware_version [32] = {"--"};
+
+//static SINT32 i_mmi_check_fota_result_times = 120;
+//static SINT32 i_mmi_show_fota_result_times = 10;
+//static BOOL b_mmi_show_fota_result = FALSE;
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡SIM¿¨×´Ì¬ÐÅÏ¢
+***********************************************************************************/
+E_zMmi_Sim_Tip mmi_getSIMStateInfo(VOID)
+{
+	return s_mmi_sim_tip;
+}
+
+E_zMmi_NetCon_Tip mmi_getNetConInfo(VOID)
+{
+	return s_mmi_netcon_tip;
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡ÌáʾÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_tipinfo(UINT32 tipinfo)
+{
+	if (tipinfo != 0) {
+		T_zMMITipInfo * pTipInfo = (T_zMMITipInfo *)tipinfo;
+		pTipInfo->sim_tip = s_mmi_sim_tip;
+		pTipInfo->net_tip = s_mmi_netcon_tip;
+		pTipInfo->net_pro = s_mmi_net_pro;
+		//pTipInfo->update_tip = s_mmi_update_tip;
+		//pTipInfo->update_result = s_mmi_update_result;
+	}
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áÌáʾģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipTaskInfoItem()
+{
+	T_zMMITaskInfoItem tipInfoItem = {0};
+	tipInfoItem.task = MMI_TASK_TIP;
+	tipInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMITipInfo));
+	tipInfoItem.get_taskinfo_fun = mmi_get_tipinfo;
+#ifndef DISABLE_LCD
+	tipInfoItem.get_lcdinfo_fun = mmi_getLcdTipInfo;
+#endif
+	//tipInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&tipInfoItem);
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áÌáʾģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipNetConnectTaskInfoItem()
+{
+	T_zMMITaskInfoItem tipInfoItem = {0};
+	tipInfoItem.task = MMI_TASK_TIP_NET_CONNECT;
+	tipInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMITipInfo));
+	tipInfoItem.get_taskinfo_fun = mmi_get_tipinfo;
+#ifndef DISABLE_LCD
+	tipInfoItem.get_lcdinfo_fun = mmi_getLcdTipNetConnInfo;
+#endif
+	//tipInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&tipInfoItem);
+	return MMI_SUCCESS;
+}
+#if 0
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²áFOTA Éý¼¶Ìáʾģ¿é
+***********************************************************************************/
+SINT32 mmi_RegisterTipFotaTaskInfoItem()
+{
+	T_zMMITaskInfoItem tipInfoItem = {0};
+	tipInfoItem.flag = MMI_TASK_TIP_FOTA;
+	tipInfoItem.taskinfo = malloc(sizeof(T_zMMITipInfo));
+	tipInfoItem.get_taskinfo_fun = mmi_get_tipinfo;
+	tipInfoItem.get_lcdinfo_fun = mmi_getLcdTipFotaInfo;
+	tipInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&tipInfoItem);
+	return MMI_SUCCESS;
+}
+#endif
+/**********************************************************************************
+º¯Êý×÷ÓÃ:×¢²á/»ñÈ¡SSID/WIFIKEY
+***********************************************************************************/
+SINT32 mmi_get_ssidinfo(UINT32 ssidinfo)
+{
+	if (ssidinfo != 0) {
+		T_zMMISSIDInfo * pSSIDInfo = (T_zMMISSIDInfo *)ssidinfo;
+		pSSIDInfo->ssid = s_mmi_ssid;
+		pSSIDInfo->wifi_key = s_mmi_wifikey;
+		pSSIDInfo->ssid2 = s_mmi_ssid2;
+		pSSIDInfo->wifi_key2 = s_mmi_wifikey2;
+	}
+	return MMI_SUCCESS;
+}
+SINT32 mmi_RegisterSSIDInfoTaskInfoItem()
+{
+	T_zMMITaskInfoItem ssidInfoItem = {0};
+	ssidInfoItem.task = MMI_TASK_SSID;
+	ssidInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMISSIDInfo));
+	ssidInfoItem.get_taskinfo_fun = mmi_get_ssidinfo;
+#ifndef DISABLE_LCD
+	ssidInfoItem.get_lcdinfo_fun = mmi_getLcdSSIDKeyInfo;
+#endif
+	//ssidInfoItem.show_mode = 2;
+	mmi_register_taskinfo_item(&ssidInfoItem);
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_get_versioninfo(UINT32 versioninfo)
+{
+	if (versioninfo != 0)
+	{
+		T_zMMIVERSIONInfo * pVERSIONInfo = (T_zMMIVERSIONInfo *)versioninfo;
+		pVERSIONInfo->firmware_version = s_mmi_firmware_version;
+		pVERSIONInfo->hardware_version = s_mmi_hardware_version;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterTipFirmwareVersionTaskInfoItem()
+{
+	T_zMMITaskInfoItem versionInfoItem = {0};
+	versionInfoItem.task = MMI_TASK_VERSION;
+	versionInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMIVERSIONInfo));
+	versionInfoItem.get_taskinfo_fun = mmi_get_versioninfo;
+#ifndef DISABLE_LCD
+	versionInfoItem.get_lcdinfo_fun = mmi_getLcdVersionInfo;
+#endif
+	mmi_register_taskinfo_item(&versionInfoItem);
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_get_text_connect_info(UINT32 textinfo)
+{
+	if (textinfo != 0)
+	{
+		T_zMMITEXTCONNECTInfo * pTEXTInfo = (T_zMMITEXTCONNECTInfo *)textinfo;
+		pTEXTInfo->exist = 1;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterTipTextConnectTaskInfoItem()
+{
+	T_zMMITaskInfoItem textConnectInfoItem = {0};
+	textConnectInfoItem.task = MMI_TASK_TEXT_CONNECT;
+	textConnectInfoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMITEXTCONNECTInfo));
+	textConnectInfoItem.get_taskinfo_fun = mmi_get_text_connect_info;
+#ifndef DISABLE_LCD
+	textConnectInfoItem.get_lcdinfo_fun = mmi_getLcdTextConnectInfo;
+#endif
+	mmi_register_taskinfo_item(&textConnectInfoItem);
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_get_logoinfo(UINT32 logoinfo)
+{
+	if (logoinfo != 0)
+	{
+		T_zMMILOGOInfo * pLOGOInfo = (T_zMMILOGOInfo *)logoinfo;
+		pLOGOInfo->exist = 1;
+	}
+	return MMI_SUCCESS;
+}
+
+SINT32 mmi_RegisterLogoTaskInfoItem()
+{
+	T_zMMITaskInfoItem logoItem = {0};
+	logoItem.task = MMI_TASK_LOGO;
+	logoItem.taskinfo = (VOID *)malloc(sizeof(T_zMMILOGOInfo));
+	logoItem.get_taskinfo_fun = mmi_get_logoinfo;
+#ifndef DISABLE_LCD
+	logoItem.get_lcdinfo_fun = mmi_getLcdLogoInfo;
+#endif
+	logoItem.ledinfo = (VOID *)malloc(sizeof(T_zMmi_Led_Info));
+	mmi_register_taskinfo_item(&logoItem);
+	return MMI_SUCCESS;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡ÍøÂçÐźÅÐÅÏ¢
+***********************************************************************************/
+SINT32 mmi_get_netsignalinfo(UINT32 netsiginfo)
+{
+	if (netsiginfo != 0) {
+		T_zMMINetSignalInfo * pNetSigInfo = (T_zMMINetSignalInfo *)netsiginfo;
+		pNetSigInfo->msisdn = s_mmi_msisdn;
+		pNetSigInfo->pci = s_mmi_pci;
+		pNetSigInfo->rapr_dBm = s_mmi_rapr_dBm;
+		pNetSigInfo->sinr_dB = s_mmi_sinr_dB;
+	}
+	return MMI_SUCCESS;
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡ÔËÓªÉÌÃû³Æ
+***********************************************************************************/
+static VOID mmi_get_network_provider(VOID)
+{
+	char nv_net_pro [64] = {0};
+	cfg_get_item(NV_NETWORK_PROVIDER, nv_net_pro, 64);
+	if (strlen(nv_net_pro) == 0) {
+		strcpy(s_mmi_net_pro, "UnKnown");
+	} else {
+		if (!strcasecmp(nv_net_pro, NV_NET_PROVIDER_CMCC)) {
+			strcpy(s_mmi_net_pro, "CMCC");
+		} else if (!strcasecmp(nv_net_pro, NV_NET_PROVIDER_CUCC)) {
+			strcpy(s_mmi_net_pro, "CUCC");
+		} else if (!strcasecmp(nv_net_pro, NV_NET_PROVIDER_CTCC)) {
+			strcpy(s_mmi_net_pro, "CTCC");
+		} else if (!strcasecmp(nv_net_pro, NV_NET_BOLT_4G_1) || !strcasecmp(nv_net_pro, NV_NET_BOLT_4G_2) || !strcasecmp(nv_net_pro, NV_NET_BOLT_4G_3) || !strcasecmp(nv_net_pro, NV_NET_BOLT_4G_4) || !strcasecmp(nv_net_pro, NV_NET_BOLT_4G_5)) {
+			strcpy(s_mmi_net_pro, "BOLT! SUPER 4G");
+		} else {
+			strcpy(s_mmi_net_pro, nv_net_pro);
+		}
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_get_network_provider s_mmi_net_pro_tip = %s!!\n", s_mmi_net_pro);
+}
+
+VOID mmi_update_netprovider(VOID)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_update_netprovider !!!\n");
+	mmi_get_network_provider();
+	mmi_set_update_flag(MMI_TASK_TIP);
+}
+
+VOID mmi_update_net_connect_tip(SINT32 con_state, E_zMmi_Net_Mode net_mode)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_update_net_connect_tip con_state = %d, net_mod = %d !!\n", con_state, net_mode);
+	if (net_mode == NET_MODE_NOSERVICE) {
+		s_mmi_netcon_tip = NET_NOSERVICE;
+		mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+	} else if (net_mode == NET_MODE_LIMITSERVICE) {
+		s_mmi_netcon_tip = NET_LIMITSERVICE;
+		mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+	} else {
+		s_mmi_netcon_tip = (E_zMmi_NetCon_Tip)con_state;
+		if (s_mmi_netcon_tip != NET_DISCONNECTED && s_mmi_netcon_tip != NET_CONNECTED) {
+			mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+		}
+	}
+}
+
+VOID mmi_update_net_tip(SINT32 con_state, E_zMmi_Net_Mode net_mode)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_update_net_tip !!!\n");
+	mmi_update_net_connect_tip(con_state, net_mode);
+	mmi_update_netprovider();
+}
+SINT32 zMMI_Handle_Msg_Get_Provider(VOID *data)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI svr_Handle_Msg_Get_Provider !!!\n");
+	mmi_update_netprovider();
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:´¦Àí»Øµ÷º¯ÊýÖз¢¸ø×Ô¼ºµÄÏûÏ¢
+***********************************************************************************/
+VOID zMMI_Handle_Msg_Get_Connecting_Tip(VOID *arg)
+{
+	SINT32 tip_conntent = 0;
+	tip_conntent  = *(SINT32*)arg;
+	s_mmi_netcon_tip = (E_zMmi_NetCon_Tip)tip_conntent;
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI zMMI_Handle_Msg_Get_Connecting_Tip s_mmi_netcon_tip = %d!!!\n", s_mmi_netcon_tip);
+
+	if (s_mmi_netcon_tip != NET_DISCONNECTED && s_mmi_netcon_tip != NET_CONNECTED) {
+		mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+	} else {
+		if (s_mmi_netcon_tip == NET_CONNECTED) {
+			mmi_get_network_provider();
+		}
+		mmi_set_update_flag(MMI_TASK_TIP);
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SIM¿¨×´Ì¬¼à²â¶¨Ê±Æ÷»Øµ÷
+***********************************************************************************/
+static VOID mmi_check_sim_state(VOID)
+{
+	char nv_sim_state[32] = {0};
+	static BOOL run_once = FALSE;
+	cfg_get_item(NV_MODEM_MAIN_STATE, nv_sim_state, 32);
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_check_sim_state nv_sim_state = %s,s_mmi_sim_tipEx = %d !!\n", nv_sim_state, s_mmi_sim_tipEx);
+	if (!strcmp(nv_sim_state, NV_SIM_STATE_PUK_WATIT)) {
+		s_mmi_sim_tip = PUK_LOCK;
+	} else if (!strcmp(nv_sim_state, NV_SIM_STATE_PIN_WATIT)) {
+		s_mmi_sim_tip = PIN_LOCK;
+	} else if (!strcmp(nv_sim_state, NV_SIM_STATE_UNDETECTED)) {
+		s_mmi_sim_tip = INSERT_SIM;
+	} else if (!strcmp(nv_sim_state, NV_SIM_STATE_NCK_WAIT)) {
+		s_mmi_sim_tip = SIM_LOCK;
+	} else if (!strcmp(nv_sim_state, NV_SIM_STATE_DESTROY)) {
+		s_mmi_sim_tip = INVALID_SIM;
+	} else {
+		s_mmi_sim_tip = SIM_MAX;
+	}
+
+	if ((!strcmp(nv_sim_state, NV_SIM_STATE_INIT_COMPLETE) || !strcmp(nv_sim_state, NV_SIM_STATE_INIT_EXCPTION))) {
+		if (!run_once) {
+			s_mmi_netcon_tip = NET_SEARCHING;
+			mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+			run_once = TRUE;
+		}
+	}
+	if (s_mmi_sim_tip != s_mmi_sim_tipEx) {
+		if (s_mmi_sim_tip == SIM_MAX) {
+			mmi_set_update_flag(MMI_TASK_TIP_NET_CONNECT);
+		} else if (s_mmi_sim_tip == INSERT_SIM) {
+			mmi_clean_net_state();
+		}
+		mmi_set_update_flag(MMI_TASK_TIP);
+		s_mmi_sim_tipEx = s_mmi_sim_tip;
+	}
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_check_sim_state s_mmi_sim_tip = %d,s_mmi_sim_tipEx = %d !!\n", s_mmi_sim_tip, s_mmi_sim_tipEx);
+}
+
+#if 0
+static VOID mmi_check_lte_sinr(VOID)
+{
+	CHAR sinr_nv[12] = {0};
+	cfg_get_item(NV_SINR, sinr_nv, 12);
+	if (sinr_nv != NULL && strlen(sinr_nv) > 0) {
+		memset(s_mmi_sinr_dB, 0, sizeof(s_mmi_sinr_dB));
+		snprintf(s_mmi_sinr_dB, 9, "%sdB", sinr_nv);
+	} else {
+		strcpy(s_mmi_sinr_dB, INVALID_STR);
+	}
+	//slog(MMI_PRINT,SLOG_DEBUG,"ZTE_MMI mmi_check_lte_sinr s_mmi_sinr_dB  %s!!!\n",s_mmi_sinr_dB);
+	mmi_set_update_flag(MMI_CONTENT_FLAG_SIGNAL_INFO);
+}
+static VOID mmi_check_lte_pci(VOID)
+{
+	CHAR pci_nv[8] = {0};
+	cfg_get_item(NV_PCI, pci_nv, 8);
+	if (pci_nv != NULL) {
+		strncpy(s_mmi_pci, pci_nv, 8);
+	} else {
+		strcpy(s_mmi_pci, INVALID_STR);
+	}
+	//slog(MMI_PRINT,SLOG_DEBUG,"ZTE_MMI mmi_check_lte_pci s_mmi_pci  %s!!!\n",s_mmi_pci);
+	mmi_set_update_flag(MMI_CONTENT_FLAG_SIGNAL_INFO);
+}
+#endif
+/**********************************************************************************
+º¯Êý×÷ÓÃ:¼à²â¶¨Ê±Æ÷»Øµ÷
+***********************************************************************************/
+static VOID * mmi_tip_check_timer_cb(VOID *arg)
+{
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MMI, (USHORT)MSG_CMD_MMICHECK_TIP_INFO, 0, NULL, 0);
+	return NULL;
+}
+
+SINT32 zMMI_Handle_Msg_Check_Tip_Info(VOID *data)
+{
+	mmi_check_sim_state();
+	mmi_check_new_version_state();
+	//mmi_check_lte_sinr();
+	//mmi_check_lte_pci();
+	mmi_check_fota_upgrade_result();
+	mmi_check_fota_download_state();
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SIM¿¨×´Ì¬¼à²â¶¨Ê±Æ÷ 1S
+***********************************************************************************/
+static VOID mmi_tip_check_timer_create(VOID)
+{
+	int ret = -1;
+	ret = CreateSoftTimer(SET_TIP_CHECK_TIMER, TIMER_FLAG_RESTART, SET_TIP_CHECK_TIME, &mmi_tip_check_timer_cb, NULL);
+	if (ret != 0) {
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_tip_check_timer_create FAILED !!");
+	}
+}
+
+static VOID mmi_tip_check_timer_stop(VOID)
+{
+	DeleteSoftTimer(SET_TIP_CHECK_TIMER);
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡¸±WIFIKEY
+***********************************************************************************/
+static VOID mmi_get_multi_wifikey(VOID)
+{
+	char nv_multi_authmode[16] = {0};
+	char nv_multi_encryp_type[16] = {0};
+	char nv_multi_key[2] = {0};
+	SINT32 key_multi_index = -1;
+	char m_keystr[16] = {0};
+	cfg_get_item("m_AuthMode", nv_multi_authmode, sizeof(nv_multi_authmode));
+	cfg_get_item("m_EncrypType", nv_multi_encryp_type, sizeof(nv_multi_encryp_type));
+
+	if (((!strcmp("WEP", nv_multi_encryp_type)) && (!strcmp("OPEN", nv_multi_authmode))) || (!strcmp("SHARED", nv_multi_authmode)) || (!strcmp("WEPAUTO", nv_multi_authmode))) { //WEP
+		cfg_get_item("m_DefaultKeyID", nv_multi_key, sizeof(nv_multi_key));
+		key_multi_index = atoi(nv_multi_key); //kw 3
+		if(key_multi_index < 0 || key_multi_index > INT_MAX-1) {// 0~3
+			slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_get_multi_wifikey %d!!\n", key_multi_index);
+			key_multi_index = 0;
+		}
+		key_multi_index = key_multi_index + 1;
+		snprintf(m_keystr, sizeof(m_keystr), "m_Key%dStr1", key_multi_index);//klocwork
+		cfg_get_item(m_keystr, s_mmi_wifikey2, sizeof(s_mmi_wifikey2));
+	} else if (!strcmp("NONE", nv_multi_encryp_type) && !strcmp("OPEN", nv_multi_authmode)) {
+		strcpy(s_mmi_wifikey2, "");
+	} else {
+		cfg_get_item(NV_WIFIKEY2, s_mmi_wifikey2, sizeof(s_mmi_wifikey2));
+	}
+}
+
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡Ö÷WIFIKEY
+***********************************************************************************/
+static VOID mmi_get_main_wifikey(VOID)
+{
+	char nv_authmode[16] = {0};
+	char nv_encryp_type[16] = {0};
+	char nv_key[2] = {0};
+	SINT32 key_index = -1;
+	char keystr[16] = {0};
+	cfg_get_item("AuthMode", nv_authmode, sizeof(nv_authmode));
+	cfg_get_item("EncrypType", nv_encryp_type, sizeof(nv_encryp_type));
+
+	if (((!strcmp("WEP", nv_encryp_type)) && (!strcmp("OPEN", nv_authmode))) || (!strcmp("SHARED", nv_authmode)) || (!strcmp("WEPAUTO", nv_authmode))) { //WEP
+		cfg_get_item("DefaultKeyID", nv_key, sizeof(nv_key));
+		key_index = atoi(nv_key); //kw 3
+		if(key_index < 0 || key_index > INT_MAX-1) {// 0~3
+			slog(MMI_PRINT, SLOG_ERR, "ZTE_MMI mmi_get_main_wifikey %d!!\n", key_index);
+			key_index = 0;
+		}
+		key_index = key_index + 1;
+		snprintf(keystr, sizeof(keystr), "Key%dStr1", key_index);//klocwork
+		cfg_get_item(keystr, s_mmi_wifikey, sizeof(s_mmi_wifikey));
+	} else if (!strcmp("NONE", nv_encryp_type) && !strcmp("OPEN", nv_authmode)) {
+		strcpy(s_mmi_wifikey, "");
+	} else {
+		cfg_get_item(NV_WPAPSK1, s_mmi_wifikey, sizeof(s_mmi_wifikey));
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:»ñÈ¡SSID
+***********************************************************************************/
+static VOID mmi_get_ssid_wifikey(VOID)
+{
+	char nv_multi_ssid_switch[2] = {0};
+	char nv_ssid_write_flag[2] = {0};
+	cfg_get_item(NV_SSID_WRITE_FLAG, nv_ssid_write_flag, sizeof(nv_ssid_write_flag));
+	if (!strcmp(nv_ssid_write_flag, "1")) {
+		cfg_get_item(NV_SSID1, s_mmi_ssid, sizeof(s_mmi_ssid));
+		mmi_get_main_wifikey();
+	} else {
+		strcpy(s_mmi_ssid, "--");
+		strcpy(s_mmi_wifikey, "--");
+	}
+	cfg_get_item(NV_MULTI_SSID_SWITCH, nv_multi_ssid_switch, sizeof(nv_multi_ssid_switch));
+	if (!strcmp(nv_multi_ssid_switch, "1")) {
+		gMultiSSIDSwitchFlag = TRUE;
+		cfg_get_item(NV_SSID2, s_mmi_ssid2, sizeof(s_mmi_ssid2));
+		mmi_get_multi_wifikey();
+	} else {
+		gMultiSSIDSwitchFlag = FALSE;
+	}
+
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_get_ssid_wifikey s_mmi_ssid = %s s_mmi_wifikey= %s s_multi_mmi_ssid = %s s_multi_mmi_wifikey= %s!!\n",
+	     s_mmi_ssid, s_mmi_wifikey, s_mmi_ssid2, s_mmi_wifikey2);
+}
+
+BOOL mmi_get_multi_ssid_switch_flag(VOID)
+{
+	return gMultiSSIDSwitchFlag;
+}
+
+SINT32 zMMI_Handle_Msg_Get_SSID_Key(VOID *data)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI zMMI_Handle_Msg_Get_SSID_Key !!\n");
+	mmi_get_ssid_wifikey();
+#ifndef DISABLE_LCD
+	if (!mmi_get_multi_ssid_switch_flag()) {
+		//mmi_set_lcd_page_index(MMI_SHOW_PAGE_SECOND);
+	}
+#endif
+	mmi_set_update_flag(MMI_TASK_SSID);
+	return 0;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:SSID&WIFIKEYÏÔʾʱ¼ä¶¨Ê±Æ÷£¬Ê±¼ä20Ã룬һ´ÎÐÔ¶¨Ê±Æ÷
+***********************************************************************************/
+static VOID * mmi_ssid_show_timer_cb(VOID *arg)
+{
+	ipc_send_message(MODULE_ID_MMI, MODULE_ID_MMI, (USHORT)MSG_CMD_MMISHOW_SSID_INFO, 0, NULL, 0);
+	return NULL;
+}
+
+SINT32 zMMI_Handle_Msg_SSID_Show_Info(VOID *data)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_ssid_show_timer_cb !!\n");
+	s_mmi_ssid_show_timer_status = 0;
+#ifndef DISABLE_LCD
+	mmi_set_lcd_page_index(MMI_SHOW_PAGE_FIRST);
+#endif
+	mmi_set_update_flag(MMI_TASK_TRAFFIC);
+	return 0;
+}
+
+BOOL mmi_getSSIDFirstShowInfo(VOID)
+{
+	return s_mmi_ssid_show_timer_status ;
+}
+
+static VOID mmi_ssid_show_timer_create(VOID)
+{
+	if (s_mmi_ssid_show_timer_status == 0) {
+		int ret = -1;
+		ret = CreateSoftTimer(SET_SSID_SHOW_TIMER, TIMER_FLAG_ONCE, SET_SSID_SHOW_TIME, &mmi_ssid_show_timer_cb, NULL);
+		if (ret != 0) {
+			slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_ssid_show_timer_create FAILED !!");
+		}
+		s_mmi_ssid_show_timer_status = 1;
+	}
+}
+VOID mmi_ssid_show_timer_stop(VOID)
+{
+	if (s_mmi_ssid_show_timer_status == 1) {
+		DeleteSoftTimer(SET_SSID_SHOW_TIMER);
+		s_mmi_ssid_show_timer_status = 0;
+		slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_ssid_show_timer_stop !!\n");
+	}
+}
+static VOID mmi_show_ssid_poweron()
+{
+	mmi_get_ssid_wifikey();
+	mmi_set_update_flag(MMI_TASK_SSID);
+#if 0
+#ifndef DISABLE_LCD
+	mmi_set_lcd_page_index(MMI_SHOW_PAGE_SECOND);
+#endif
+	mmi_ssid_show_timer_create();
+#endif
+}
+
+static VOID mmi_get_version()
+{
+	cfg_get_item("wa_version", s_mmi_firmware_version, sizeof(s_mmi_firmware_version));
+	cfg_get_item("hw_version", s_mmi_hardware_version, sizeof(s_mmi_firmware_version));
+
+	return;
+}
+
+static VOID mmi_set_logo_status()
+{
+	mmi_set_update_flag(MMI_TASK_LOGO);
+
+	return;
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:MMI SIM¼ì²â¶¨Ê±Æ÷KILL£¬  ¹Ø»úºÍÖØÆôʱµ÷ÓÃ
+***********************************************************************************/
+VOID mmi_kill_tip_timer(VOID)
+{
+	if (g_showMode == MMI_MODE_LED || g_showMode == MMI_MODE_ALL) {
+		mmi_tip_check_timer_stop();
+	}
+}
+
+/**********************************************************************************
+º¯Êý×÷ÓÃ:³õʼ»¯Ìáʾģ¿é
+***********************************************************************************/
+VOID mmi_init_lcd_tip(VOID)
+{
+	slog(MMI_PRINT, SLOG_DEBUG, "ZTE_MMI mmi_init_lcd_tip !!!\n");
+	mmi_check_sim_state();
+	mmi_show_ssid_poweron();
+	mmi_get_network_provider();
+	mmi_tip_check_timer_create();
+	mmi_get_version();
+	mmi_set_logo_status();
+}
diff --git a/lynq/MD310EU/ap/app/zte_ufi/Makefile b/lynq/MD310EU/ap/app/zte_ufi/Makefile
new file mode 100755
index 0000000..a13c58d
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_ufi/Makefile
@@ -0,0 +1,321 @@
+#*******************************************************************************

+# include ZTE application makefile

+#*******************************************************************************

+include $(zte_app_mak)

+#include ../net_team.mk

+include $(COMMON_MK)

+

+CPU_PUB_ROOT=$(TOPDIR_AP)/../pub

+##############USER COMIZE BEGIN################

+EXEC = zte_ufi 

+EXEC1 = zte-rtc-clock 

+EXEC2 = router_msg_proxy 

+OBJS = zte_ufi.o ../zte_comm/nvserver/nvserver.o  ../zte_comm/nvserver/nvupdate.o  \

+       $(patsubst %.c,%.o,$(wildcard ../zte_comm/at_ctl/src/atctrl/*.c ../zte_comm/at_ctl/src/atconfig/*.c ../zte_comm/at_ctl/src/phone/*.c ../zte_comm/at_ctl/src/phone/src/*.c)) \

+       ../zte_comm/rtc-service/rtc-service.o \

+       $(filter-out ../zte_comm/zte_mainctrl/router_msg_proxy.o,$(patsubst %.c,%.o,$(wildcard ../zte_comm/zte_mainctrl/*.c))) \

+       ../zte_comm/zte_hotplug/hotplug.o ../zte_comm/zte_hotplug/netdev_plug.o ../zte_comm/zte_hotplug/drv_plug.o \

+       $(patsubst %.c,%.o,$(wildcard ../zte_comm/zte_drv_ctrl/usb/*.c ../zte_comm/zte_drv_ctrl/serial/*.c)) \

+       ../zte_comm/fluxstat/fluxstat.o \

+       ../zte_comm/sntp/sntp.o \

+	   ../zte_comm/schedule_restart/schedule_restart.o \

+       $(patsubst %.c,%.o,$(wildcard ../zte_comm/sms/src/*.c ))

+ifeq ($(USE_FOTA),yes)

+OBJS += $(patsubst %.c,%.o,$(wildcard ../zte_comm/fota_dm/src/*.c ))

+endif

+OBJS += $(patsubst %.c,%.o,$(wildcard ../zte_comm/phonebook/src/*.c ))   ../zte_comm/zte_audio_ctrl/audio_res_ctrl.o

+

+OBJS1 = ../zte_comm/rtc-service/zte-rtc-clock.o

+OBJS2 = ../zte_comm/zte_mainctrl/router_msg_proxy.o

+

+ZTE_MMI_DEP = zte_mmi_app

+ZTE_MMI_TOBJS = mmi_adapter.o mmi.o mmi_battery.o mmi_net.o mmi_wifi.o mmi_tip.o mmi_sms.o mmi_lcd_page.o mmi_lcd.o mmi_lcd_init.o mmi_ctrl.o \

+		  mmi_keystrokes.o mmi_lcd_timer.o mmi_led.o mmi_led_init.o mmi_led_adapter.o mmi_poweroff_charger.o mmi_traffic.o mmi_fota.o mmi_msg.o \

+		  mmi_cfg.o mmi_poweroff.o mmi_battery_adapter.o mmi_mo.o mmi_mo_en.o mmi_mo_zh.o mmi_voip.o mmi_plat_adapter.o mmi_rj45.o

+ZTE_MMI_OBJS = $(addprefix ../zte_comm/zte_mmi/,$(ZTE_MMI_TOBJS))

+

+ZTE_LOCKNET_DEP = zte_locknet_app

+ZTE_LOCKNET_OBJS = $(patsubst %.c,%.o,$(wildcard ../zte_comm/zte_locknet/src/*.c ))

+

+ZTE_WATCHDOG_DEP = zte_watchdog_app

+ZTE_WATCHDOG_TOBJS = watchdog.o watchdog_adapter.o watchdog_battery.o

+ZTE_WATCHDOG_OBJS = $(addprefix ../zte_comm/zte_watchdog/,$(ZTE_WATCHDOG_TOBJS))

+

+#wifi

+ifeq ($(CONFIG_WIFI_MODULE),realtek)

+CFLAGS	 +=	-D__REALTEK_8192_CHIP__

+ifeq ($(CONFIG_WIFI_RTL_WPA2),yes)

+tools_dir += ../zte_comm/wlan/realtek_tools_wpa2/auth  ../zte_comm/wlan/realtek_tools_wpa2/mini_upnp ../zte_comm/wlan/realtek_tools_wpa2/utility

+tools_dir += ../zte_comm/wlan/realtek_tools_wpa2/wsc ../zte_comm/wlan/realtek_tools_wpa2/wireless_tools.25

+else

+tools_dir += ../zte_comm/wlan/realtek_tools/auth  ../zte_comm/wlan/realtek_tools/mini_upnp ../zte_comm/wlan/realtek_tools/utility

+tools_dir += ../zte_comm/wlan/realtek_tools/wsc ../zte_comm/wlan/realtek_tools/wireless_tools.25

+endif

+else ifeq ($(CONFIG_WIFI_MODULE),rda5995)

+CFLAGS	 += -D__RDA_5995_CHIP__

+tools_dir += ../zte_comm/wlan/rda_tools

+else ifeq ($(CONFIG_WIFI_MODULE),esp8089)

+CFLAGS	 += -D__ESP_8089_CHIP__

+tools_dir += ../zte_comm/wlan/esp_tools/eagle_test   ../zte_comm/wlan/esp_tools/fcctest

+else ifeq ($(CONFIG_WIFI_MODULE),xr819)

+CFLAGS	 += -D__XR_819_CHIP__

+#tools_dir +=

+else ifeq ($(CONFIG_WIFI_MODULE),ssv6x5x)

+CFLAGS	 += -D__SSV_6X5X_CHIP__

+#tools_dir +=

+else ifeq ($(CONFIG_WIFI_MODULE),aic8800)

+CFLAGS	 += -D__AIC_8800DW_CHIP__

+tools_dir += ../zte_comm/wlan/aic_tools/rftest

+ifeq ($(CONFIG_WIFI_SINGLEAP), no)

+CFLAGS  +=  -D__MULTI_AP__

+endif

+endif

+

+$(warning  CONFIG_WIFI_FUNCTION=$(CONFIG_WIFI_FUNCTION))

+

+ifeq ($(findstring sta,$(CONFIG_WIFI_FUNCTION)), sta)

+WLAN_STA_FUNC=yes

+endif

+

+ifeq ($(findstring ap,$(CONFIG_WIFI_FUNCTION)), ap)

+WLAN_AP_FUNC=yes

+endif

+

+CFLAGS 	 += -D__QRCODE_WIFI__

+CFLAGS 	 += -D__USE_AES__

+

+ifeq ($(WLAN_STA_FUNC),yes)

+CFLAGS += -D__STA_FUNC__

+ifneq ($(WLAN_AP_FUNC),yes)

+ifeq ($(CONFIG_WIFI_MODULE),aic8800)

+CFLAGS	 += -I$(zte_app_path)/wpa_supplicant-2.10/src/common

+LDLIBS   += -lwpa_client -L$(zte_app_path)/wpa_supplicant-2.10/wpa_supplicant

+else

+CFLAGS	 += -I$(zte_app_path)/wpa_supplicant-2.6/src/common

+LDLIBS   += -lwpa_client -L$(zte_app_path)/wpa_supplicant-2.6/wpa_supplicant

+endif

+endif

+endif

+ifeq ($(WLAN_AP_FUNC),yes)

+CFLAGS += -D__AP_FUNC__

+ifeq ($(CONFIG_WIFI_MODULE),aic8800)

+CFLAGS	 += -I$(zte_app_path)/hostapd-2.10/src/common

+LDLIBS   += -lwpa_client -L$(zte_app_path)/hostapd-2.10/hostapd

+else

+CFLAGS	 += -I$(zte_app_path)/hostapd-2.6/src/common

+LDLIBS   += -lwpa_client -L$(zte_app_path)/hostapd-2.6/hostapd

+endif

+endif

+

+OBJS +=  ../zte_comm/wlan/src/wlan_main.o ../zte_comm/wlan/src/wifi_socket.o ../zte_comm/wlan/src/wlan_rtc_sleep.o ../zte_comm/wlan/src/wifi_drv_ko.o \

+		  ../zte_comm/wlan/src/wifi_sta_ctrl.o ../zte_comm/wlan/src/wifi_util.o  ../zte_comm/wlan/src/wlan_config_ssid.o   ../zte_comm/wlan/src/wlan_netlink.o ../zte_comm/wlan/src/Vector.o

+ifeq ($(CONFIG_WIFI_MODULE),realtek)

+OBJS +=  ../zte_comm/wlan/src/wifi_hal.o

+	ifeq ($(WLAN_STA_FUNC),yes)

+		OBJS +=  ../zte_comm/wlan/src/wlan-station.o

+	endif

+LDLIBS   += -lwlan_interface

+LDLIBS   += -L$(zte_lib_path)/libwlan_interface

+else ifeq ($(CONFIG_WIFI_MODULE),rda5995)

+	ifeq ($(WLAN_STA_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wlan_sta_manager.o  ../zte_comm/wlan/src/wlan_sm.o 

+	endif

+	

+	ifeq ($(WLAN_AP_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wifi_ap_ctrl.o

+LDLIBS   += -lwlan_interface

+LDLIBS   += -L$(zte_lib_path)/libwlan_interface

+	endif

+else ifeq ($(CONFIG_WIFI_MODULE),esp8089)

+	ifeq ($(WLAN_STA_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wlan_sta_manager.o  ../zte_comm/wlan/src/wlan_sm.o 

+	endif

+	

+	ifeq ($(WLAN_AP_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wifi_ap_ctrl.o

+LDLIBS   += -lwlan_interface

+LDLIBS   += -L$(zte_lib_path)/libwlan_interface		

+	endif

+else ifeq ($(CONFIG_WIFI_MODULE),xr819)

+	ifeq ($(WLAN_STA_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wlan_sta_manager.o  ../zte_comm/wlan/src/wlan_sm.o 

+	endif

+	

+	ifeq ($(WLAN_AP_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wifi_ap_ctrl.o

+LDLIBS   += -lwlan_interface

+LDLIBS   += -L$(zte_lib_path)/libwlan_interface		

+	endif

+else ifeq ($(CONFIG_WIFI_MODULE),ssv6x5x)

+	ifeq ($(WLAN_STA_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wlan-station.o 

+	endif

+	

+	ifeq ($(WLAN_AP_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wifi_ap_ctrl.o

+LDLIBS   += -lwlan_interface

+LDLIBS   += -L$(zte_lib_path)/libwlan_interface		

+	endif

+else ifeq ($(CONFIG_WIFI_MODULE),aic8800)

+	ifeq ($(WLAN_STA_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wlan-station.o 

+	endif

+	

+	ifeq ($(WLAN_AP_FUNC),yes)

+		OBJS += ../zte_comm/wlan/src/wifi_ap_ctrl.o

+LDLIBS   += -lwlan_interface

+LDLIBS   += -L$(zte_lib_path)/libwlan_interface		

+	endif

+endif

+#aes

+CFLAGS += -I$(zte_lib_path)/libssl/install/include

+LDLIBS += -L$(zte_lib_path)/libssl/install/lib -lcrypto

+

+#ifeq ($(CONFIG_USE_WEBUI_SECURITY),yes)

+#CFLAGS	+= -DWEBS_SECURITY

+#endif

+#*******************************************************************************

+# include path

+#*******************************************************************************

+CFLAGS += -I./

+CFLAGS += -I../include

+CFLAGS += -I../zte_comm/nvserver

+CFLAGS += -I$(LIB_DIR)/libnvram

+CFLAGS += -I$(APP_DIR)/include                                                   

+CFLAGS += -g -Werror=implicit-function-declaration 

+

+CFLAGS += -I../zte_comm/zte_hotplug

+CFLAGS += -I../zte_comm/at_ctl/inc

+CFLAGS += -I../zte_comm/at_ctl/src/phone/inc

+CFLAGS += -I$(zte_app_path)/include

+CFLAGS += -I$(zte_lib_path)/libatext

+CFLAGS += -I$(zte_lib_path)/libsqlite

+CFLAGS += -I$(zte_lib_path)/libnvram

+CFLAGS += -I$(LINUX_DIR)

+CFLAGS += -I$(zte_lib_path)/libzcore/std/inc/zCore/bl

+CFLAGS += -I$(zte_lib_path)/libzcore/std/inc/zCore/gui

+CFLAGS += -I$(CPU_PUB_ROOT)/project/zx297520v3/include/nv

+CFLAGS += -O -Dlinux=1 -DHIGH_SPEED=1

+

+

+CFLAGS += -I$(zte_lib_path)/libsoftap

+#CFLAGS += -I.

+

+

+CFLAGS += -I$(zte_lib_path)/libsoft_timer

+

+CFLAGS += -I../zte_comm/sms/inc

+CFLAGS += -I../zte_comm/phonebook/inc

+

+CFLAGS	 += -I../zte_comm/wlan/inc

+

+

+CFLAGS	+= -I../zte_comm/fota_dm/inc

+#CFLAGS 	+= -I../zte_comm/fota_dm/gs_lib

+CFLAGS 	+= -I../zte_comm/fota_dm/rs_lib

+CFLAGS 	+= -I$(zte_lib_path)/libzte_dmapp/inc

+

+#*******************************************************************************

+# library

+#*******************************************************************************

+LDLIBS += -lnvram -L$(zte_lib_path)/libnvram -lpthread

+ifeq ($(LINUX_TYPE),uClinux)

+LDFLAGS += -Wl,--allow-multiple-definition,-elf2flt=-s131072

+endif

+

+

+LDLIBS  += -lsoftap -L$(zte_lib_path)/libsoftap

+LDLIBS  += -lsoft_timer -L$(zte_lib_path)/libsoft_timer

+LDLIBS  += -latutils -L$(zte_lib_path)/libatutils

+LDLIBS  += -lsqlite -L$(zte_lib_path)/libsqlite

+LDLIBS  += -latext -L$(zte_lib_path)/libatext

+LDLIBS  += -lm

+#LDLIBS  += -ltinyalsa -L$(zte_lib_path)/libtinyalsa

+LDLIBS  += -lcpnv -L$(zte_lib_path)/libcpnv

+LDLIBS  += -lamt -L$(zte_lib_path)/libamt

+LDLIBS  += -lkey -L$(zte_lib_path)/libkey

+LDLIBS  += -lcurl -L$(zte_lib_path)/libcurl/install/lib

+

+ifneq ($(CONFIG_MMI_LCD),no)

+LDLIBS += -lzcore

+LDLIBS += -lrt

+ifeq ($(USE_TTF_FONT), yes)

+LDLIBS += -lft2

+LDLIBS += -lttf_font

+else

+LDLIBS += -lbitmap_font

+endif

+LDLIBS += -L$(zte_lib_path)/libzcore/min

+ifeq ($(USE_TTF_FONT), yes)

+LDLIBS += -L$(zte_lib_path)/libzcore/min/prebuilts/freetype

+endif

+endif

+ifeq ($(USE_FOTA),yes)

+LDLIBS +=  -lztedmapp  -L$(zte_lib_path)/libzte_dmapp

+#LIBSHARE_GS =  ../zte_comm/fota_dm/gs_lib/libdmgr.so.1

+#LDLIBS +=  -L../zte_comm/fota_dm/gs_lib -ldmgr

+

+LIBSHARE_GS =  ../zte_comm/fota_dm/rs_lib/librsdlsdk.so

+LDLIBS +=  -L../zte_comm/fota_dm/rs_lib -lrsdlsdk

+endif

+

+LDLIBS1 += -lnvram -L$(zte_lib_path)/libnvram -lpthread

+LDLIBS1  += -lsoftap -L$(zte_lib_path)/libsoftap

+LDLIBS1  += -lsoft_timer -L$(zte_lib_path)/libsoft_timer

+

+##############USER COMIZE END##################

+

+all: $(EXEC) $(EXEC1) $(EXEC2)

+ifneq ($(tools_dir), )

+	for i in $(tools_dir) ; do $(MAKE) -C $$i || exit $?; done

+endif

+ifeq ($(USE_FOTA),yes)

+	(cd ../zte_comm/fota_dm/gs_lib;rm libdmgr.so;ln -s libdmgr.so.1  libdmgr.so; cd ../../../zte_comm)

+endif

+

+$(EXEC): $(OBJS) $(ZTE_MMI_DEP) $(ZTE_LOCKNET_DEP) $(ZTE_WATCHDOG_DEP)

+	$(CC) $(LDFLAGS) -o $@ $(OBJS) $(ZTE_MMI_OBJS) $(ZTE_LOCKNET_OBJS) $(ZTE_WATCHDOG_OBJS) -Wl,--start-group $(LDLIBS) -Wl,--end-group

+	@cp $@ $@.elf

+

+$(EXEC1): $(OBJS1)

+	$(CC) $(CFLAGS) -o $@ $(OBJS1) -Wl,--start-group $(LDLIBS1) -Wl,--end-group

+	@cp $@ $@.elf

+

+$(EXEC2): $(OBJS2)

+	$(CC) $(CFLAGS) -o $@ $(OBJS2) -Wl,--start-group $(LDLIBS1) -Wl,--end-group

+	@cp $@ $@.elf

+

+romfs:

+	$(ROMFSINST)  /sbin/$(EXEC)

+	$(ROMFSINST)  /sbin/$(EXEC1)

+	$(ROMFSINST)  /sbin/$(EXEC2)

+ifeq ($(USE_FOTA),yes)

+	$(ROMFSINST) $(LIBSHARE_GS) /lib/

+endif

+ifneq ($(tools_dir), )

+	for i in $(tools_dir) ; do $(MAKE) -C $$i romfs || exit $?; done

+endif

+

+clean:

+	-rm -f $(EXEC) *.elf *.gdb *.o

+	-rm -f $(EXEC1) *.elf *.gdb *.o

+	-rm -f $(EXEC2) *.elf *.gdb *.o

+	-find ../zte_comm/ -name \*.o -exec rm -rf {} \; 

+	-find . -name \*.o -exec rm -rf {} \;

+ifneq ($(tools_dir), )

+	for i in $(tools_dir) ; do $(MAKE) -C $$i clean || exit $?; done

+endif

+ifeq ($(CONFIG_USER_SINGLE_DM), zx)

+ifeq ($(USE_FOTA),yes)

+	rm -rf $(ROOTFS_DIR)//bin/$(EXEC_GS)

+endif	

+endif

+

+$(ZTE_MMI_DEP):

+	${MAKE} -C ../zte_comm/zte_mmi lib

+

+$(ZTE_LOCKNET_DEP):

+	${MAKE} -C ../zte_comm/zte_locknet lib

+

+$(ZTE_WATCHDOG_DEP):

+	${MAKE} -C ../zte_comm/zte_watchdog lib

diff --git a/lynq/MD310EU/ap/app/zte_ufi/zte_ufi.c b/lynq/MD310EU/ap/app/zte_ufi/zte_ufi.c
new file mode 100755
index 0000000..e41eaab
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_ufi/zte_ufi.c
@@ -0,0 +1,284 @@
+#define _GNU_SOURCE /**/
+
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <time.h>
+#include <syslog.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <netdb.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/uio.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/sysctl.h>
+#include <net/if.h>
+#include <poll.h>
+#include <stddef.h>
+#include <linux/if_packet.h>
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+#include <arpa/inet.h>
+#include <pthread.h>
+#include <zte_ufi.h>
+#include "softap_api.h"
+
+void nvserver_entry(void)
+{
+	nvserver_main(0,NULL);
+	return;
+}
+
+void at_ctl_entry(char *arg)
+{
+	//printf("at_ctl_entry boot:%s\n", arg);
+	char *argv[2];
+	argv[0] = NULL;
+	argv[1] = arg;
+
+	at_ctl_main(2, argv);
+	return;
+}
+
+void rtc_service_entry(char *arg)
+{
+	rtc_service_main(0,NULL);
+	return;
+}
+
+void zte_mainctrl_entry(char *arg)
+{
+	/*if (0 == strcmp(arg, "2")) {
+		char *argv[2];
+		argv[0] = NULL;
+		argv[1] = "poweroff_charger";
+
+		zte_mainctrl_main(2, argv);
+	} else {*/
+		zte_mainctrl_main(0,NULL);
+	//}
+
+	return;
+}
+
+void zte_hotplug_entry(char *arg)
+{
+	zte_hotplug_main(0,NULL);
+	return;
+}
+
+void zte_audio_res_ctrl_entry(char *arg)
+{
+	zte_audio_res_ctrl_main(0,NULL);
+	return;
+}
+
+void zte_drv_serial_ctrl_entry(char *arg)
+{
+	zte_drv_serial_ctrl_main();
+	return;
+}
+
+void zte_drv_usb_ctrl_entry(char *arg)
+{
+	if(arg)
+		zte_drv_usb_ctrl_main(3,NULL);
+	else
+		zte_drv_usb_ctrl_main(0,NULL);
+	return;
+}
+
+void zte_mmi_entry(char *arg)
+{
+	//printf("zte_mmi_entry boot:%s\n", arg);
+/*	if (0 == strcmp(arg, "2")) {
+		char *argv[2];
+		argv[0] = NULL;
+		argv[1] = "poweroff_charger";
+
+		zte_mmi_main(2, argv);
+	} else {*/
+		zte_mmi_main(0,NULL);
+	//}
+	return;
+}
+
+void zte_locknet_entry(char *arg)
+{
+	zte_locknet_main(0,NULL);
+	//return; //klocwork
+}
+
+void zte_watchdog_entry(char *arg)
+{
+	zte_watchdog_main(0,NULL);
+	return;
+}
+
+void fluxstat_entry(char *arg)
+{
+	fluxstat_main(0,NULL);
+	return;
+}
+
+void sntp_entry(char *arg)
+{
+	sntp_main(0,NULL);
+	return;
+}
+
+void schedule_restart_entry(char *arg)
+{
+	schedule_restart_main(0,NULL);
+	return;
+}
+
+/*
+void sd_hotplug_entry(char *arg)
+{
+	sd_hotplug_main(0,NULL);
+	return;
+}
+*/
+void sms_entry(char *arg)
+{
+	sms_main(0,NULL);
+}
+
+void phonebook_entry(char *arg)
+{
+	phonebook_main(0,NULL);
+	return;
+}
+
+void wlan_entry(char *arg)
+{
+	wlan_main(0,NULL);
+	return;
+}
+
+#ifndef FOTA_DISABLE
+void fota_dm_entry(char *arg)
+{
+	fota_dm_main(0,NULL);
+}
+#endif
+
+int main(int argc, char *argv[])
+{
+	int ret = 0;
+	/* nvserver */
+    pthread_t nvserver_thread_tid;
+    pthread_create(&nvserver_thread_tid, NULL, (void *)nvserver_entry, NULL);
+	
+	/* zte_hotplug */
+	pthread_t zte_hotplug_thread_tid;
+	pthread_create(&zte_hotplug_thread_tid, NULL, (void *)zte_hotplug_entry, NULL);
+	
+    /* zte_drv_serial_ctrl */
+	pthread_t zte_drv_serial_ctrl_thread_tid;
+	pthread_create(&zte_drv_serial_ctrl_thread_tid, NULL, (void *)zte_drv_serial_ctrl_entry, NULL);
+	if (0 == strcmp(argv[2], "amt")) {
+		ret = cfg_set("ver_mode", "0");
+		if(ret < 0)
+			printf("zte_ufi set vermode fail\n");
+		else
+			cfg_save();
+		printf("---set ver mode to 0\n");
+	}
+	/* zte_drv_usb_ctrl */
+	pthread_t zte_drv_usb_ctrl_thread_tid;
+
+	if (0 != strcmp(argv[2], "amt")) { //³äµç»òÕý³£¿ª»úģʽ
+		char LanEnable[10] = {0};
+		/* at_ctl */
+		pthread_t at_ctl_thread_tid;
+		pthread_create(&at_ctl_thread_tid, NULL, (void *)at_ctl_entry, argv[1]);
+		/* rtc_service */
+		pthread_t rtc_service_thread_tid;
+		pthread_create(&rtc_service_thread_tid, NULL, (void *)rtc_service_entry, NULL);
+		/* zte_mainctrl */
+		pthread_t zte_mainctrl_thread_tid;
+		pthread_create(&zte_mainctrl_thread_tid, NULL, (void *)zte_mainctrl_entry, argv[1]);
+			
+		/* zte_audio_res_ctrl */
+		pthread_t zte_audio_res_ctrl_thread_tid;
+		pthread_create(&zte_audio_res_ctrl_thread_tid, NULL, (void *)zte_audio_res_ctrl_entry, NULL);
+	
+		cfg_get_item("LanEnable", LanEnable, sizeof(LanEnable));
+		if(atoi(LanEnable) == 1) { //mifiÐÎ̬
+			/* zte_mmi */
+			pthread_t zte_mmi_thread_tid;
+			pthread_create(&zte_mmi_thread_tid, NULL, (void *)zte_mmi_entry, argv[1]);
+		}	
+		
+		//if(0 != strcmp(argv[1], "2")){
+			pthread_create(&zte_drv_usb_ctrl_thread_tid, NULL, (void *)zte_drv_usb_ctrl_entry, NULL);
+			
+			if(atoi(LanEnable) == 1) { //mifiÐÎ̬
+					/* zte_locknet */
+				pthread_t zte_locknet_thread_tid;
+				pthread_create(&zte_locknet_thread_tid, NULL, (void *)zte_locknet_entry, NULL);
+				/* fluxstat */
+
+								
+				pthread_t fluxstat_thread_tid;
+				pthread_create(&fluxstat_thread_tid, NULL, (void *)fluxstat_entry, NULL);
+				/* sntp */
+				pthread_t sntp_thread_tid;
+				pthread_create(&sntp_thread_tid, NULL, (void *)sntp_entry, NULL);
+				/* schedule_restart */
+				pthread_t schedule_restart_thread_tid;
+				pthread_create(&schedule_restart_thread_tid, NULL, (void *)schedule_restart_entry, NULL);
+				/* sd_hotplug */
+				//pthread_t sd_hotplug_thread_tid;
+				//pthread_create(&sd_hotplug_thread_tid, NULL, (void *)sd_hotplug_entry, NULL);
+				//sd_hotplug_init();
+				/* sms */
+				pthread_t sms_thread_tid;
+				pthread_create(&sms_thread_tid, NULL, (void *)sms_entry, NULL);
+				/* phonebook */
+				//NV_NEED_SUPPORT_PB
+				pthread_t phonebook_thread_tid;
+				pthread_create(&phonebook_thread_tid, NULL, (void *)phonebook_entry, NULL);
+
+				/* wifi_manager */
+				pthread_t wlan_thread_tid;
+				pthread_create(&wlan_thread_tid, NULL, (void *)wlan_entry, NULL);
+				
+			}	
+#ifndef FOTA_DISABLE
+			/* fota_dm */
+			pthread_t fota_dm_thread_tid;
+			pthread_create(&fota_dm_thread_tid, NULL, (void *)fota_dm_entry, NULL);			
+#endif
+/*		}else{
+			pthread_create(&zte_drv_usb_ctrl_thread_tid, NULL, (void *)zte_drv_usb_ctrl_entry, "poweroff_charger");
+		}*/
+
+		
+		/* zte_watchdog */
+		pthread_t zte_watchdog_thread_tid;
+		pthread_create(&zte_watchdog_thread_tid, NULL, (void *)zte_watchdog_entry, NULL);
+	}
+	else
+	{
+		pthread_create(&zte_drv_usb_ctrl_thread_tid, NULL, (void *)zte_drv_usb_ctrl_entry, NULL);
+	}
+
+
+	while(1)
+	{
+		sleep(20);
+		//printf("zte app test -1 \n");
+	}
+
+	return 0;
+}
+
diff --git a/lynq/MD310EU/ap/app/zte_ufi/zte_ufi.h b/lynq/MD310EU/ap/app/zte_ufi/zte_ufi.h
new file mode 100755
index 0000000..014e91b
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_ufi/zte_ufi.h
@@ -0,0 +1,60 @@
+/*******************************************************************************
+* ��Ȩ���� (C)2016, ����ͨѶ�ɷ����޹�˾��
+* 
+* �����:     zte_ufi.h
+* �ļ���ʶ:     zte_ufi.h
+* ����ժҪ:     ufi�ϲ�Ӧ��ͷ�ļ�
+* ʹ�÷���:     #include <zte_ufi.h>
+* 
+* 
+*******************************************************************************/
+#ifndef _ZTE_UFI_H
+#define _ZTE_UFI_H
+
+/*******************************************************************************
+*                                   ͷ�ļ�                                     *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                                   �궨��                                     *
+*******************************************************************************/
+    
+	
+/*******************************************************************************
+*                                �������Ͷ���                                  *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                                ȫ�ֱ�������                                  *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*                                ȫ�ֺ�������                                  *
+*******************************************************************************/
+int nvserver_main(int argc, char *argv[]);
+int at_ctl_main(int argc, char * argv[]);
+int rtc_service_main(int argc, char **argv);
+int zte_mainctrl_main(int argc, char * argv[]);
+int zte_hotplug_main(int argc, char * argv[]);
+int zte_audio_res_ctrl_main(int argc, char * argv[]);
+int zte_drv_serial_ctrl_main();
+int zte_drv_usb_ctrl_main(int argc, char* argv[]);
+int zte_mmi_main(int argc, char* argv[]);
+int zte_locknet_main(int argc, char* argv[]);
+int zte_watchdog_main(int argc, char * argv[]);
+int fluxstat_main(int argc, char * argv[]);
+int sntp_main(int argc, char * argv[]);
+int schedule_restart_main(int argc, char * argv[]);
+int sd_hotplug_init(viod);
+int sd_hotplug_main(int argc, char* argv[]);
+int sms_main(int argc, char* argv[]);
+int phonebook_main(int argc, char* argv[]);
+int wlan_main (int argc, char *argv[]);
+int fota_dm_main(int argc, char**argv);
+
+
+#endif
+
diff --git a/lynq/MD310EU/ap/app/zte_webui/css/com.css b/lynq/MD310EU/ap/app/zte_webui/css/com.css
new file mode 100755
index 0000000..50110dd
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/css/com.css
@@ -0,0 +1,2602 @@
+/* Reset the container */
+.container {
+  width: 970px !important;
+  max-width: none !important;
+}
+
+.container .navbar-header,
+.container .navbar-collapse {
+  margin-right: 0;
+  margin-left: 0;
+}
+
+/* Always float the navbar header */
+.navbar-header {
+  float: left;
+}
+
+/* Undo the collapsing navbar */
+.navbar-collapse {
+  display: block !important;
+  height: auto !important;
+  padding-bottom: 0;
+  overflow: visible !important;
+}
+
+.navbar-toggle {
+  display: none;
+}
+.navbar-collapse {
+  border-top: 0;
+}
+
+.navbar-brand {
+  margin-left: -15px;
+}
+
+/* Always apply the floated nav */
+.navbar-nav {
+  float: left;
+  margin: 0;
+}
+.navbar-nav > li {
+  float: left;
+}
+.navbar-nav > li > a {
+  padding: 15px;
+}
+
+/* Redeclare since we override the float above */
+.navbar-nav.navbar-right {
+  float: right;
+}
+
+/* Undo custom dropdowns */
+.navbar .navbar-nav .open .dropdown-menu {
+  position: absolute;
+  float: left;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .15);
+  border-width: 0 1px 1px;
+  border-radius: 0 0 4px 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+.navbar-default .navbar-nav .open .dropdown-menu > li > a {
+  color: #333;
+}
+.navbar .navbar-nav .open .dropdown-menu > li > a:hover,
+.navbar .navbar-nav .open .dropdown-menu > li > a:focus,
+.navbar .navbar-nav .open .dropdown-menu > .active > a,
+.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+  color: #fff !important;
+  background-color: #008AD7 !important;
+}
+.navbar .navbar-nav .open .dropdown-menu > .disabled > a,
+.navbar .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+.navbar .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+  color: #999 !important;
+  background-color: transparent !important;
+}
+
+body {
+    min-width: 970px;
+    padding-bottom: 30px;
+}
+
+.lead {
+  font-size: 16px;
+}
+
+.page-header {
+  margin-bottom: 30px;
+}
+.page-header .lead {
+  margin-bottom: 10px;
+}
+h1, .h1 {
+    font-size: 20px;
+}
+h2, .h2 {
+    font-size: 18px;
+}
+h3, .h3 {
+    font-size: 18px;
+}
+label{
+    font-weight: normal;
+}
+h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6{
+    font-weight: bold;
+}
+
+.label-primary {
+    background-color: #018AD8;
+}
+
+.arrow-down {
+    bottom:0;
+    border-width: 8px 4px 0;
+	width: 0;
+    height: 0;
+    border-color: #018AD8 transparent transparent;
+    border-style: solid;
+}
+
+.absolute-center {
+    position: absolute;
+    left: 49%;
+}
+
+.info-title.label {
+    padding: 0.3em 0.7em 0.3em;
+}
+
+.margin-top-10 {margin-top: 10px;}
+.margin-top-15 {margin-top: 15px;}
+.margin-top-20 {margin-top: 20px;}
+.margin-top-50 {margin-top: 50px;}
+.margin-top-80 {margin-top: 80px;}
+.margin-top-160 {margin-top: 160px;}
+
+.margin-bottom-10{margin-bottom: 10px;}
+.margin-bottom-20{margin-bottom: 20px;}
+.margin-bottom-50{margin-bottom: 50px;}
+
+.margin-left-10{margin-left: 10px;}
+.margin-left-15{margin-left: 15px;}
+.margin-left-3em{margin-left: 3em;}
+
+.margin-right-20{margin-right: 20px;}
+
+.padding-top-10{padding-top: 10px;}
+
+.padding-right-10{padding-right: 10px;}
+.padding-right-15{padding-right: 15px;}
+.padding-right-90 {
+    padding-right: 90px;
+}
+
+.line-height-20{line-height: 20px;}
+.line-height-30{line-height: 30px;}
+.line-height-40{line-height: 40px;}
+.line-height-60{line-height: 60px;}
+
+.width-60{width: 60px;}
+
+.font-weight-bold{
+    font-weight: bold;
+}
+
+.smsUnreadCount {
+    width: 30px;
+    height: 20px;
+    line-height: 20px;
+    padding: 2px;
+    top: -13px;
+    left: 20px;
+    position: absolute;
+    text-align: center;
+    z-index: 10;
+    background: url("../pic/png_new_sms_bg.png") no-repeat scroll 0 -5px transparent;
+    color: white;
+}
+
+.tooltip {
+    width: auto;
+    min-width: 5px;
+    position: absolute;
+    padding: 6px;
+    display: none;
+    color: #fff;
+    background-color: #4B4B4B;
+    border-radius: 4px;
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    box-shadow: 0 3px 5px #999;
+    -moz-box-shadow: 0 3px 5px #999;
+    -webkit-box-shadow: 0 3px 5px #999;
+    margin-top: 5px;
+    *+margin-top:0px;
+}
+
+#statusBar span{
+    margin-right: 10px;
+}
+
+#statusBar span.smsUnreadCount{
+    margin-left: 0;
+}
+
+#statusBar .statusItem{
+    color: #696E72;
+    font-weight: bold;
+    line-height: 35px;
+    vertical-align: middle;
+}
+
+#statusBar #wifi_status{
+    width: 36px;
+    display: inline-block;
+}
+
+#statusBar #wifi_status i{
+    width: 36px;
+    height: 24px;
+    line-height: 24px;
+    display: inline-block;
+}
+
+#statusBar .icon_connection{
+    width: 50px;
+    display: inline-block;
+}
+
+#statusBar .wifi_connected{
+    width: 42px;
+    height: 30px;
+    background:url("../pic/pic_wifi_connect.png") no-repeat scroll center 2px transparent;
+}
+
+#statusBar .rj45_connected{
+    width: 42px;
+    height: 30px;
+    background:url("../pic/pic_rj45_connect.png") no-repeat scroll center 2px transparent;
+}
+
+#statusBar .connecting{
+    width: 36px;
+    height: 30px;
+    background:url("../pic/pic_connecting.gif") no-repeat scroll center 3px transparent;
+}
+
+#statusBar .disconnect{
+    width: 42px;
+    height: 30px;
+    background:url("../pic/pic_disconnect.png") no-repeat scroll center 3px transparent;
+}
+
+#statusBar .connectionNone{
+    height: 30px;
+    background:url("../pic/pic_connection.png") no-repeat scroll center 3px transparent;
+}
+
+#statusBar .connectionUp{
+    height: 30px;
+    background:url("../pic/pic_connection.png") no-repeat scroll center -27px transparent;
+}
+
+#statusBar .connectionDown{
+    height: 30px;
+    background:url("../pic/pic_connection.png") no-repeat scroll center -57px transparent;
+}
+
+#statusBar .connectionBoth{
+    height: 30px;
+    background:url("../pic/pic_connection.png") no-repeat scroll center -87px transparent;
+}
+
+#statusBar .signal{
+    width: 40px;
+    height: 30px;
+    display: inline-block;
+}
+
+#statusBar .signal_none{
+    width: 30px;
+    height: 30px;
+    background:url("../pic/res_signal.png") no-repeat scroll 6px -268px transparent;
+}
+
+#statusBar .signal0{
+    height: 30px;
+    background:url("../pic/res_signal.png") no-repeat scroll center -3px transparent;
+}
+
+#statusBar .signal1{
+    height: 30px;
+    background:url("../pic/res_signal.png") no-repeat scroll center -45px transparent;
+}
+
+#statusBar .signal2{
+    height: 30px;
+    background:url("../pic/res_signal.png") no-repeat scroll center -92px transparent;
+}
+
+#statusBar .signal3{
+    height: 30px;
+    background:url("../pic/res_signal.png") no-repeat scroll center -140px transparent;
+}
+
+#statusBar .signal4{
+    height: 30px;
+    background:url("../pic/res_signal.png") no-repeat scroll center -185px transparent;
+}
+
+#statusBar .signal5{
+    height: 30px;
+    background:url("../pic/res_signal.png") no-repeat scroll center -227px transparent;
+}
+
+#statusBar .wifi_status0{
+    background: url("../pic/wlan.png") no-repeat scroll 0 4px transparent;
+}
+
+#statusBar .wifi_status1{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -20px transparent;
+}
+
+#statusBar .wifi_status2{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -45px transparent;
+}
+
+#statusBar .wifi_status3{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -70px transparent;
+}
+
+#statusBar .wifi_status4{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -95px transparent;
+}
+
+#statusBar .wifi_status5{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -120px transparent;
+}
+
+#statusBar .wifi_status6{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -145px transparent;
+}
+
+#statusBar .wifi_status7{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -170px transparent;
+}
+
+#statusBar .wifi_status8{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -195px transparent;
+}
+
+#statusBar .wifi_status9{
+    background: url("../pic/wlan.png") no-repeat scroll 0 -220px transparent;
+}
+
+#statusBar .wifi_status10{
+    background: url("../pic/wlan.png") no-repeat scroll -40px 4px transparent;
+}
+
+#statusBar .wifi_status11{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -20px transparent;
+}
+
+#statusBar .wifi_status12{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -45px transparent;
+}
+
+#statusBar .wifi_status13{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -70px transparent;
+}
+
+#statusBar .wifi_status14{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -95px transparent;
+}
+
+#statusBar .wifi_status15{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -120px transparent;
+}
+
+#statusBar .wifi_status16{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -145px transparent;
+}
+
+#statusBar .wifi_status17{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -170px transparent;
+}
+
+#statusBar .wifi_status18{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -195px transparent;
+}
+
+#statusBar .wifi_status19{
+    background: url("../pic/wlan.png") no-repeat scroll -40px -220px transparent;
+}
+
+#statusBar .wifi_status20{
+    background: url("../pic/wlan.png") no-repeat scroll -78px 5px transparent;
+}
+
+#statusBar .wifi_status21{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -20px transparent;
+}
+
+#statusBar .wifi_status22{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -45px transparent;
+}
+
+#statusBar .wifi_status23{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -70px transparent;
+}
+
+#statusBar .wifi_status24{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -95px transparent;
+}
+
+#statusBar .wifi_status25{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -120px transparent;
+}
+
+#statusBar .wifi_status26{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -145px transparent;
+}
+
+#statusBar .wifi_status27{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -170px transparent;
+}
+
+#statusBar .wifi_status28{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -195px transparent;
+}
+
+#statusBar .wifi_status29{
+    background: url("../pic/wlan.png") no-repeat scroll -78px -220px transparent;
+}
+
+#statusBar .wifi_status30{
+    background: url("../pic/wlan.png") no-repeat scroll -116px 5px transparent;
+}
+
+#statusBar .wifi_status31{
+    background: url("../pic/wlan.png") no-repeat scroll -116px -20px transparent;
+}
+
+#statusBar .wifi_status32{
+    background: url("../pic/wlan.png") no-repeat scroll -116px -45px transparent;
+}
+
+#statusBar .wifi_status_off{
+    background:url('../pic/wlan_off.png') no-repeat;
+}
+
+/* Overlay */
+#loading {
+    display: none;
+}
+
+#result-overlay {
+    display: none;
+}
+
+#result_wording h2{
+    font-size: 20px;
+    margin-top: 5px;
+    margin-bottom: 8px;
+}
+
+#result-overlay #result-image {
+    height: 75px;
+    margin: 0 auto;
+    width: 75px;
+}
+
+#result-overlay .overlay-success {
+    background: url("../pic/res_succ.png") no-repeat scroll 0 0 transparent;
+}
+
+#result-overlay .overlay-error {
+    background: url("../pic/res_failure.png") no-repeat scroll 0 0 transparent;
+}
+
+#loading_container{padding-bottom: 15px;}
+
+#loading_container a {
+    outline: none;
+}
+
+#progress {
+    display: none;
+}
+
+
+.ko-grid-search{
+    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
+    margin-top: 3px;
+    margin-right: 15px;
+    width: 155px;
+    height: 30px;
+    line-height: 30px;
+    padding-right: 5px;
+    display: inline-block;
+    border: 1px solid #a1a1a1 ;
+    border-radius: 5px;
+    -moz-border-radius: 5px;
+    -webkit-border-radius: 5px;
+    -khtml-border-radius: 5px;
+    -ms-border-radius: 5px;
+    -o-border-radius: 5px;
+}
+
+.ko-grid-search input{
+    border: 0;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+    border: none;
+    height: 20px;
+    line-height: 20px;
+    padding: 5px 0;
+    background: none;
+    outline: none;
+    display: inline;
+}
+
+.ko-grid-search input.focusIn[type="text"]{
+    width: 100px;
+    padding: 2px 0;
+    margin: 0;
+    color: #767676;
+    background: none;
+    border: none;
+    box-shadow: none;
+}
+
+#frmPhoneBook #ko_grid_search_txt{
+    width: 100px;
+    padding: 2px 0;
+    color: #767676;
+    font-style:italic;
+}
+
+#smsListForm #searchInput{
+    width: 100px;
+    padding: 2px 0;
+    color: #767676;
+    font-style:italic;
+}
+
+#ko_grid_search_txt::-ms-clear {
+    display: none;
+}
+
+.ko-grid-search input.focusIn[type="text"], input.focusIn[type="password"] ,textarea:focus{
+    border-color:none;
+    outline: 0;
+    /* IE6-9 */
+    -webkit-box-shadow:none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+
+.checkbox {
+    width: 16px;
+    height: 16px;
+    margin-top: 0;
+    margin-bottom: 0;
+    cursor: pointer;
+    vertical-align: middle;
+    display: inline-block;
+    background:url("../pic/tickbox.png") no-repeat;
+}
+
+.checkbox:hover {
+    display: inline-block;
+}
+
+.checkbox input {
+    display: none;
+}
+
+.checkbox_selected {
+    background:url("../pic/tickbox_in.png") no-repeat;
+}
+
+p.checkbox.disable{
+    background:url("../pic/tickbox_disable.png") no-repeat;
+}
+
+p.checkbox.checked_disable{
+    background:url("../pic/tickbox_in_disable.png") no-repeat;
+}
+
+.header-bottom {
+    padding-bottom: 10px;
+    border-bottom: 1px solid #d3d3d3;
+}
+
+.popover_title{
+    font-size: 14px;
+    font-weight: normal;
+    line-height: 18px;
+    margin: 0;
+    padding: 8px 14px;
+    border-bottom: 1px solid #ebebeb;
+    border-radius: 5px 5px 0 0;
+    background-color: #f7f7f7;
+}
+
+.popover_content{
+    margin-top: 1em;
+    padding: 0 8px 8px 8px;
+}
+
+.popover_row label.error{
+    width: 100%;
+    text-align: left;
+}
+
+.form-title{
+    margin-bottom: 20px;
+    border-bottom: 1px solid #eee;
+}
+
+#footer{
+    /*margin-top: 40px;
+    background: #eeeeee;*/
+    height: 60px;
+    line-height: 60px;
+    text-align: center;
+}
+
+#smsChatRoom {
+    width: 100%;
+    font-size: 12px;
+    padding-left: 0;
+    float: left;
+    display: none;
+}
+
+#smsChatRoom #chosenUserSelect{
+    width: 690px;
+}
+
+#chosenUser {
+    padding: 10px;
+    background-color: #D4DAE2;
+    box-shadow: 0 -3px 8px #ddd;
+}
+
+#chosenUser1{
+    margin-top: 0;
+}
+
+#chatlist {
+    padding-left: 10px;
+    padding-top: 10px;
+    background-color: white;
+    position: relative;
+    min-height: 240px;
+    box-shadow: 0 -3px 8px #D4DAE2;
+    *display: inline;
+}
+
+#chatlist a{
+    text-decoration: underline;
+    color: blue;
+}
+
+#chatpanel {
+    height: 250px;
+    border: 1px solid #e1e1e1;
+    overflow-x: hidden;
+    overflow-y: hidden;
+    background-color: white;
+}
+
+#chatpanel .clear-container {
+    width: 100%;
+    height: 250px;
+    border: 1px solid #e1e1e1;
+    border-top: none;
+    border-left: none;
+    position: relative;
+    overflow-x: hidden;
+    overflow-y: auto;
+}
+
+#inputpanel {
+    height: 142px;
+    padding: 10px 0;
+    position: relative;
+}
+
+.chatform {
+    margin: 0;
+    height: 120px;
+}
+
+textarea {
+	resize: none;
+}
+
+.chatform .chattextinput textarea {
+    height: 110px;
+    line-height:normal;
+    font-size: 14px;
+    color: #696e72;
+    overflow: auto;
+}
+
+#sendSmsErrorLi{
+    color: #CC0000;
+}
+
+.chatfun {
+    padding-top: 8px;
+}
+
+.chatfun ul.ext {
+    float: left;
+}
+
+.chatfun ul.ext li {
+    float: left;
+    padding-left: 10px;
+    margin-right: 20px;
+}
+
+.chatfun ul.btn {
+    float: right;
+}
+
+.chatfun ul.btn li {
+    float: left;
+    margin-right: 10px;
+}
+
+.chatfun ul.btn li button {
+    padding: 1px 0;
+}
+
+.grid-talk .main-wrap {
+    margin-right: 36px;
+    _margin-right: 18px;
+}
+
+.grid-talkf .main-wrap {
+    margin-left: 36px;
+    _margin-left: 18px;
+}
+
+.col-main {
+    float: left;
+    width: 100%;
+    min-height: 1px;
+}
+
+
+.progress-content{
+    text-align: center
+}
+
+.progress-bar-container{
+    width:400px; height:32px;
+    margin:0 auto;
+    padding:1px;
+    border:1px #CCC solid;
+    text-align: left;
+    position:relative;
+}
+
+.progress-bar{
+    width:200px;
+    height:28px;
+    background:#429aff;
+}
+
+.progress-bar-value{
+    top:7px;
+    width:400px;
+    position:absolute;
+    text-align:center;
+    overflow:hidden;
+    font-weight:bold;
+}
+
+.progress-prompt{
+    font-size:small;
+    font-weight:bold;
+    padding-bottom: 15px;
+}
+
+#simplemodal-overlay {
+    cursor: wait;
+    background-color: #000;
+}
+
+#confirm,#popupSettingWindow{
+    display: none;
+}
+
+/* Overlay */
+#confirm-overlay {
+    cursor: wait;
+    background-color: #000;
+}
+
+/* Container */
+#confirm-container {
+    width: 420px;
+    border: 2px solid #dddddd;
+    border-radius: 6px;
+    -webkit-border-radius: 6px;
+    -moz-border-radius: 6px;
+    text-align: left;
+    background: none repeat scroll 0 0 #fff;
+}
+
+#confirm-container .header {
+    width: 100%;
+    height: 30px;
+    line-height: 30px;
+    color: #000;
+    font-weight: bold;
+    background-color: #eaeaea;
+    border-bottom: 1px solid #cbcbcb;
+}
+
+#confirm-container .header span {
+    padding-left: 8px;
+}
+
+#confirm-container .buttons {
+    padding: 10px 8px;
+    text-align: right;
+}
+
+#confirm-container .message {
+    color: #000;
+    font-size: 14px;
+}
+
+#confirm .message > i {
+    font-size: 0.9em;
+}
+
+#confirm-message-container{
+    margin: 10px 5px;
+}
+
+#confirm .icon {
+    width: 50px;
+    margin: 0 0 0 10px;
+    vertical-align: top;
+    display: inline-block;
+}
+
+#confirm .confirm-message {
+    width: 310px;
+    margin: 10px 10px 10px 0;
+    vertical-align: top;
+    display: inline-block;
+}
+
+.simplemodal-wrap .form-title{
+    font-size: 16px;
+    font-weight: bold;
+}
+
+.cursorhand{
+    cursor: pointer;
+}
+
+.device-block{
+    width: 100px;
+    margin: 0 24px 5px 0;
+    text-align: center;
+    text-decoration: none;
+    display: inline-block;
+}
+
+.device-block-desc{
+    padding-top: 100px;
+    width: 100px;
+    display: inline-block;
+    overflow: hidden;
+    vertical-align: middle;
+    text-align: center;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    background: url("../pic/mobile.png") no-repeat scroll 0 0 transparent;
+}
+
+.expend-desc{
+    padding-left: 2em;
+}
+
+.arrow-right{
+    padding-right: 30px;
+    background: url("../pic/direct-right.png") no-repeat scroll right center transparent;
+}
+
+#pc_main_form .content {
+    padding-left: 2em;
+}
+
+table.colorHoverTable thead tr {
+    height: 27px;
+}
+
+.header-center th{
+    text-align: center;
+}
+
+#pc_time_limited_form table thead tr{
+    background: none;
+}
+
+#pc_time_limited_form table thead td{
+    min-width: 4%;
+}
+
+#pc_time_limited_form table tbody td{
+    border: 1px solid #ccc;
+    height: 40px;
+    vertical-align: middle;
+	/*line-height: 40px;*/
+    padding: 0;
+    border-collapse: collapse;
+}
+
+#pc_time_limited_form table tbody td.active{
+    background-color: red;
+}
+
+#pc_time_limited_form table tbody td:first-child{
+    width: 50px;
+    border-width: 0 1px 0 0;
+}
+
+#pc_time_limited_form .pc_time_block{
+    width: 20px;
+    height: 20px;
+    display: inline-block;
+    border: 1px solid #ccc;
+}
+
+#pc_time_limited_form .time_td_hover{
+    background: #eee;
+}
+
+#pc_time_limited_form .forbid_time{
+    background-color: red;
+}
+
+#pc_children_group_form table td{
+    line-height: 32px;
+}
+
+.layout:after,.main-wrap:after,.col-sub:after,.col-extra:after {
+    content: '\20';
+    display: block;
+    height: 0;
+    clear: both;
+}
+
+.talk-item {
+    margin: 10px 0 5px 0;
+}
+
+.talk-item .info-user {
+    width: 30px;
+    padding: 2px;
+    border: 1px solid #335A8B;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    background-color: #fff;
+}
+
+.talk-item .info-user img {
+    width: 30px;
+    display: block;
+}
+
+.talk-item .time {
+    height: 20px;
+    line-height: 20px;
+    clear: both;
+}
+
+.talk-item .msg {
+    padding: 10px;
+    max-width: 560px;
+    line-height: 180%;
+    position: relative;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    word-break: break-all;
+    word-wrap: break-word;
+    color: #000;
+}
+
+.talk-item .msg s.arrow {
+    width: 7px;
+    height: 13px;
+    bottom: 10px;
+    display: block;
+    position: absolute;
+    background: url(../pic/a-direct.png) no-repeat;
+}
+
+.talk-b .msg_fail s.arrow{
+    bottom: 10px;
+    display: block;
+    width: 7px;
+    height: 13px;
+    left: 100%;
+    position: absolute;
+    background: url(../pic/c-direct.png) no-repeat;
+}
+
+.talk-item .msg_fail {
+    padding: 10px;
+    line-height: 180%;
+    max-width: 560px;
+    position: relative;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    word-break: break-all;
+    word-wrap: break-word;
+    color: #000;
+}
+
+.talk-b .msg_fail{
+    float: right;
+    min-width: 70px;
+    padding: 10px 10px 15px 10px;
+    background: #ffdbdb;
+    border: 1px solid #f46c6c;
+    min-width: 350px;
+}
+
+.msg_fail pre{
+    border: medium none;
+    line-height: 17px;
+    margin: 0;
+    overflow-x: auto;
+    padding: 0;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    color: #696e72;
+    background: none repeat scroll 0 0 transparent;
+}
+
+#smsChatRoom .error {
+    color: #CC0000;
+}
+
+.info-talk{
+    color: #87acd6;
+}
+
+.talk-a .info-talk {
+    float: left;
+    padding: 0 20% 10px 10px;
+    min-width: 420px;
+    _float: none;
+    _padding-left: 26px;
+}
+
+.talk-a .msg {
+    min-width: 350px;
+    min-height: 20px;
+    border: 1px solid #ccc;
+    background: #eef2f4;
+}
+
+.talk-a .msg s.arrow {
+    left: -7px;
+    _left: -17px;
+}
+
+.talk-b {
+    margin-right: 10px;
+    _margin-right: 20px;
+}
+
+.talk-b .info-talk {
+    float: right;
+    min-width: 420px;
+    padding: 0 10px 10px 20%;
+}
+
+.talk-b .msg {
+    float: right;
+    min-width: 350px;
+    min-height: 20px;
+    border: 1px solid #ADCAE3;
+    padding: 10px 10px 10px 10px;
+    background: #bce3f4;
+}
+
+.talk-c {
+    margin-right: 20px;
+    _margin-right: 30px;
+}
+
+.talk-b .info-talk {
+    float: right;
+    min-width: 420px;
+    padding: 0 10px 10px 20%;
+}
+
+.talk-c .msg {
+    float: right;
+    min-width: 70px;
+    padding: 10px 10px 15px 10px;
+    border: 1px solid #ADCAE3;
+    background: #bce3f4;
+}
+
+.talk-b .msg s.arrow {
+    left: 100%;
+    background: url("../pic/b-direct.png") no-repeat;
+}
+
+#smslist-main .smslist-btns.smsListFloatButs{
+    position: fixed;
+    top: 0;
+    width: 770px;
+    height: 50px;
+    padding: 6px 0 0 0;
+    border: 1px solid #018AD8;
+    display: block;
+    z-index: 9999;
+    background: #F5F9FE;
+    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F5F9FE), to(#018AD8) );
+    background: -ms-linear-gradient(top, #F5F9FE, #018AD8);
+    background: -moz-linear-gradient(top, #F5F9FE, #018AD8);
+    background: -o-linear-gradient(top, #F5F9FE, #018AD8);
+    filter: progid:dximagetransform.microsoft.gradient(enabled='true', startColorstr='#FFF5F9FE', endColorstr='#FF018AD8', GradientType=0);
+}
+
+#popupSettingWindow .tag-popup-close{
+    height: 0;
+    position: relative;
+    z-index: 2000;
+}
+
+#popupSettingWindow .tag-popup-close a {
+    float: right;
+    display: block;
+    top: 15px;
+    right: 15px;
+    width: 12px;
+    height: 13px;
+    font-size: 1px;
+    background: url("../pic/select-sprite.png") no-repeat scroll right -11px transparent;
+    position: absolute;
+}
+
+#innerTagPopup{
+    z-index: 250;
+    width: 185px;
+    line-height: 130%;
+    border: 1px solid #D4DAE2;
+    border-radius: 5px;
+    position: absolute;
+    background-color: #D4DAE2;
+    box-shadow: 0 -3px 8px #DDDDDD;
+}
+
+#innerTagPopup label.error{
+    color: #CC0000;
+    display: block;
+}
+
+#innerTagPopup .popup-wrapper {
+    background: #fff;
+    border: 2px solid #76b2de;
+    padding: 5px;
+}
+
+#innerTagPopup .tag-popup-close a {
+    float: right;
+    display: block;
+    width: 12px;
+    height: 13px;
+    font-size: 1px;
+    background: url("../pic/select-sprite.png") no-repeat scroll right -11px transparent;
+}
+
+
+#home_control{
+    color: #fff;
+    margin: 4px 0 0;
+}
+
+#home_control #change{
+    color: #ffffff;
+    font-weight: bold;
+    padding: 3px 15px;
+    background-color: transparent;
+}
+
+#home_image{
+    height: 400px;
+    color: #fff;
+}
+
+.label-font-normal label{
+    font-weight: normal;
+}
+
+#showDetailInfo ~ .popover{
+    min-width: 400px;
+}
+
+#showDetailInfo ~ .popover label{
+    font-size: 12px;
+    line-height: 1.5em;
+    word-wrap: break-word;
+}
+
+#h_qrcode {
+    width: 115px;
+    height: 115px;
+    background-color: #ffffff;
+    border: 1px solid #ffffff;
+}
+
+#h_wire_device {
+    top: 38px;
+    left: 130px;
+	display:inline;
+	margin-right:25px;
+    font-size: 30px;
+	display:inline-block;
+}
+
+#h_wireless_device {
+    font-size: 30px;
+    top: 105px;
+    left: 60px;
+	display:inline-block;
+}
+
+#h_network_type{
+    height: 30px;
+    top: 183px;
+    left: 415px;
+    line-height: 30px;
+    text-align: center;
+    font-size: 18px;
+}
+
+.data-card #h_network_type{
+    top: 156px;
+    left: 218px;
+}
+
+#h_network_type.no-btn {
+}
+
+#h_connect_btn{
+    width: 72px;
+    height: 35px;
+    display:inline-block;
+}
+
+.data-card #h_connect_btn{
+    top: 153px;
+    left: 323px;
+}
+
+.h_connect_on{
+    background: url('../pic/dial-on.png') no-repeat scroll 0 0 transparent;
+}
+
+.h_connect_off{
+    background: url('../pic/dial-off.png') no-repeat scroll 0 0 transparent;
+}
+
+#h_internet_setting_div{
+    top: 222px;
+    left: 418px;
+    width: 170px;
+    height: 35px;
+	margin-top:20px;
+    line-height: 35px;
+    text-align: center;
+}
+
+.data-card #h_internet_setting_div{
+    top: 205px;
+    left: 221px;
+}
+
+#h_internet_setting_btn{
+    width: 170px;
+    height: 35px;
+    line-height: 35px;
+    padding-right: 25px;
+    color: #fff;
+    display: block;
+    font-weight: bold;
+}
+
+#h_wifi_setting_div{
+    top: 318px;
+    left: 418px;
+    width: 170px;
+    height: 35px;
+    line-height: 35px;
+    text-align: center;
+}
+
+#h_wifi_setting_btn{
+    width: 170px;
+    height: 35px;
+    line-height: 35px;
+    padding-right: 25px;
+    color: #fff;
+    display: block;
+    font-weight: bold;
+}
+
+#h_connect_status{
+    top: 272px;
+    left: 670px;
+    width: 25px;
+    height: 25px;
+    position: absolute;
+}
+
+.h_status_connected{
+    background: url('../pic/local-connected.png') no-repeat scroll 0 0 transparent;
+}
+
+.h_status_disconnected{
+    background: url('../pic/local-disconnected.png') no-repeat scroll 0 0 transparent;
+}
+
+.h_status_connecting{
+    background: url('../pic/local-connecting.png') no-repeat scroll 0 0 transparent;
+}
+
+.h_status_disconnecting{
+    background: url('../pic/local-disconnecting.png') no-repeat scroll 0 0 transparent;
+}
+
+.color_block{
+    width: 20px;
+    height: 20px;
+    line-height: 20px;
+    border: 1px solid #ccc;
+    vertical-align: middle;
+    display: inline-block;
+}
+
+.color_block_desc{
+    line-height: 20px;
+    vertical-align: middle;
+    margin-left: 8px;
+    display: inline-block;
+}
+
+.colorRed{
+    color: #CC0000;
+}
+
+.msg pre{
+    line-height: 17px;
+    border: none;
+    margin: 0;
+    padding: 0;
+    overflow-x: hidden;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+    color: #696e72;
+    background: none;
+}
+
+.smslist-item-icon {
+    width: 80px;
+    height: 80px;
+    margin-left: 10px;
+    margin-top: -6px;
+}
+
+.smslist-item-name {
+    max-width: 550px;
+    color: #000;
+    display: inline-block;
+    overflow: hidden;
+}
+
+.smslist-item-name2 {
+    color: #000;
+}
+
+.smslist-item-name-draftShowName{
+    display:inline;
+}
+
+.smslist-item-total-count-style{
+    float:left;
+    width:50px;
+    display:inline-block;
+    color:#696e72;
+}
+
+.smslist-item-repeat {
+    font-weight: bold;
+    line-height: 18px;
+    text-indent: 3px;
+    color: #7D8DA3;
+}
+
+.smslist-item-repeat:hover {
+    color: #207DDD;
+}
+
+.smslist-item{
+    border-bottom: 1px solid #e1e1e1;
+    margin-bottom: 10px;
+}
+
+.repeat-icon {
+    width: 18px;
+    height: 18px;
+    display: block;
+    background: url("../pic/png_forward.png") no-repeat;
+}
+
+.repeat-icon:hover {
+    width: 18px;
+    height: 18px;
+    display: block;
+    background: url("../pic/png_forward_hover.png") no-repeat;
+}
+
+.sms-forward-icon {
+    width: 18px;
+    height: 18px;
+    display: block;
+    background: url("../pic/png_forward.png") no-repeat scroll;
+}
+
+.sms-forward-icon:hover {
+    width: 18px;
+    height: 18px;
+    display: block;
+    background: url("../pic/png_forward_hover.png") no-repeat scroll;
+}
+
+.smslist-item-delete {
+    width: 18px;
+    height: 18px;
+    display: block;
+}
+
+.smslist-item-delete:hover {
+    width: 18px;
+    height: 18px;
+    display: block;
+}
+
+.sms-add-contact-icon {
+    width: 13px;
+    height: 13px;
+    display: inline-block;
+    background: url("../pic/png_add_contact.png") no-repeat scroll 0 0 transparent;
+}
+
+.sms-add-contact-icon:hover {
+    width: 13px;
+    height: 13px;
+    display: inline-block;
+    background: url("../pic/png_add_contact_hover.png") no-repeat scroll 0 0 transparent;
+}
+
+.smslist-item-delete:hover .trash-icon {
+    width: 18px;
+    height: 18px;
+    display: block;
+    background: url("../pic/png_delete_hover.png") no-repeat;
+}
+
+.trash-icon {
+    width: 18px;
+    height: 18px;
+    display: block;
+    background: url("../pic/png_delete.png") no-repeat;
+}
+
+.smslist-item-resend {
+    font-weight: bold;
+    line-height: 22px;
+    text-indent: 3px;
+    color: #7D8DA3;
+}
+
+.sms-resend-icon {
+    width: 18px;
+    height: 18px;
+    display: block;
+    background: transparent url("../pic/png_resend1.png") no-repeat;
+}
+
+.smslist-item-resend:hover {
+    color: #207DDD;
+}
+
+.smslist-item-resend:hover .sms-resend-icon{
+    background: transparent url("../pic/png_resend_hover.png") no-repeat;
+}
+
+.clock-icon {
+    width: 18px;
+    height: 30px;
+    line-height: 30px;
+    display: block;
+    background: url("../pic/png_time.png") no-repeat;
+}
+
+.clock-icon:hover {
+    width: 18px;
+    height: 30px;
+    line-height: 30px;
+    display: block;
+    background: url("../pic/png_time.png") no-repeat;
+}
+
+.smslist-item-new-count {
+    width: 29px;
+    height: 35px;
+    line-height: 35px;
+    margin-right: 5px;
+    text-align: center;
+    font-weight: bold;
+    color: #ffffff;
+    background: url("../pic/png_new_sms_bg.png") no-repeat scroll 0 0 transparent;
+}
+
+#mainContainer .width100p {
+    width: 100%;
+}
+
+.height15 {
+    height: 15px;
+    line-height: 15px;
+}
+
+
+label.error{
+    color: #a94442;
+}
+
+#frmPassword label.error {
+    white-space: nowrap;
+}
+
+.form-information{
+    margin-top: 10px;
+}
+
+.form-information p{
+    padding: 15px;
+}
+
+body[lang=en] .label-absolute{
+    height: 40px;
+}
+
+body[lang=en] .label-absolute > label{
+    top: 0;
+    left: 40px;
+    position: absolute;
+}
+
+.ko-grid-pageLinks {
+
+    padding-left: 0;
+    margin: 20px 0;
+    border-radius: 4px;
+    width: 100%;
+    display: inline-block;
+}
+
+.ko-grid-pageLinks > a,
+.ko-grid-pageLinks > span {
+    display: inline;
+    position: relative;
+    float: left;
+    padding: 6px 12px;
+    line-height: 1.42857143;
+    text-decoration: none;
+    color: #008AD7;
+    background-color: #ffffff;
+    border: 1px solid #dddddd;
+    margin-left: -1px;
+}
+
+.ko-grid-pageLinks > a:first-child,
+.ko-grid-pageLinks > span:first-child {
+    margin-left: 0;
+    border-radius: 4px 0 0 4px;
+}
+
+.ko-grid-pageLinks > a:last-child,
+.ko-grid-pageLinks > span:last-child {
+    margin-left: 0;
+    border-radius: 0 4px 4px 0;
+}
+
+.ko-grid-pageLinks > a.ko-grid-pager-selected,
+.ko-grid-pageLinks > span.ko-grid-pager-selected,
+.ko-grid-pageLinks > a.ko-grid-pager-selected:hover,
+.ko-grid-pageLinks > span.ko-grid-pager-selected:hover {
+    z-index: 2;
+    cursor: default;
+    color: #ffffff;
+    background-color: #008AD7;
+    border-color: #008AD7;
+}
+
+.ko-grid-pageLinks > a:hover,
+.ko-grid-pageLinks > span:hover {
+    z-index: 2;
+    background-color: #EEEEEE;
+    border-color: #DDDDDD;
+}
+
+.ko-grid-pageLinks > span.ko-grid-pager-disabled,
+.ko-grid-pageLinks > span.ko-grid-pager-disabled:hover,
+.ko-grid-pageLinks > span.ko-grid-pager-disabled:focus,
+.ko-grid-pageLinks > a.ko-grid-pager-disabled,
+.ko-grid-pageLinks > a.ko-grid-pager-disabled:hover,
+.ko-grid-pageLinks > a.ko-grid-pager-disabled:focus {
+    color: #777777;
+    background-color: #ffffff;
+    border-color: #dddddd;
+    cursor: not-allowed;
+}
+
+.nav-tabs > li > a, .nav-tabs.nav-justified > li > a{
+    -webkit-border-radius: 0;
+    -moz-border-radius: 0;
+    border-radius: 0;
+}
+.nav-tabs > li > a, .nav-tabs > li > a:hover, .nav-tabs > li > a:focus{
+    color: #333333;
+    text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+    background-color: #f5f5f5;
+    *background-color: #e6e6e6;
+    background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+    background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+    background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+    background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+    background-repeat: repeat-x;
+    border: 1px solid #cccccc;
+    *border: 0;
+    border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+    border-bottom-color: #b3b3b3;
+    filter: progid:DXImageTransform.Microsoft.gradient(enabled='true', startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+    *zoom: 1;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.nav-tabs > li:first-child > a, .nav-tabs > li:first-child > a:hover, .nav-tabs > li:first-child > a:focus{
+    -webkit-border-radius: 4px 0 0 4px;
+    -moz-border-radius: 4px 0 0 4px;
+    border-radius: 4px 0 0 4px;
+}
+
+.nav-tabs > li:last-child > a, .nav-tabs > li:last-child > a:hover, .nav-tabs > li:last-child > a:focus{
+    -webkit-border-radius: 0 4px 4px 0;
+    -moz-border-radius: 0 4px 4px 0;
+    border-radius: 0 4px 4px 0;
+}
+
+.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus,
+.nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus{
+    color: #ffffff;
+    text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+    background-color: #006dcc;
+    *background-color: #0044cc;
+    border-color: #0044cc #0044cc #002a80;
+    border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+    background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+    background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+    background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+    background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+    background-repeat: repeat-x;
+    filter: progid:DXImageTransform.Microsoft.gradient(enabled='true', startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+}
+
+#result-overlay .simplemodal-data, #result-overlay .simplemodal-wrap, #result-overlay .alert{
+    border-radius: 8px;
+    -moz-border-radius: 8px;
+    -webkit-border-radius: 8px;
+    box-shadow: 0 3px 5px #999;
+    -moz-box-shadow: 0 3px 5px #999;
+    -webkit-box-shadow: 0 3px 5px #999;
+}
+
+.form-note .notes-title {
+    height: 30px;
+    cursor: pointer;
+    padding-bottom: 5px;
+    background: url("../pic/res_help.png") no-repeat scroll left center transparent;
+}
+
+.form-note .notes-content {
+    display: none;
+}
+
+.form-note .notes-dot {
+    border-bottom: 1px solid #ffffff;
+}
+
+.form-body .form-note {
+    border-radius: 4px;
+    font-size: 12px;
+    margin-bottom: 10px;
+    margin-top: 20px;
+    padding: 10px;
+    background-color: #ededed;
+}
+
+.form-body .form-note li {
+    line-height: 30px;
+    list-style: none outside none;
+    padding-left: 15px;
+    background: url("../pic/res_point.png") no-repeat scroll 0 12px transparent;
+}
+
+.form-body .form-note li.no-style {
+    background: none;
+}
+
+.border-color-transition {;
+    -moz-transition: border-color .5s ease-in;
+    -webkit-transition: border-color .5s ease-in;
+    -o-transition: border-color .5s ease-in;
+    -ms-transition: border-color .5s ease-in;
+    transition: border-color .5s ease-in;
+}
+
+.attention-focus{
+    border-color: red;
+}
+
+.popover-title{
+    background-color: #eaeaea;
+    border-bottom: 1px solid #cbcbcb;
+}
+
+.fixTableScroll {
+    width:100%;
+    overflow-x:auto;
+    overflow-y:hidden;
+    height:100%;
+    overflow-scrolling: touch;
+}
+
+.fixTableScroll:hover {
+    height:100%;
+}
+
+#h_internet_setting_btn:hover {
+    background-image: url("../pic/internet_setting_hover.png");
+}
+
+#h_wifi_setting_btn:hover {
+    background-image: url("../pic/wlan_setting_hover.jpg");
+}
+
+.connected_devices_container {    
+    float:left;
+    width: 280px;
+	height: 400px;
+	margin-left:20px;
+    text-align: center;
+    border-radius:10px;
+    cursor: pointer;
+	filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #70EBE6, endColorstr = #059EC4); 
+	background: -webkit-linear-gradient(left top, #70EBE6 , #059EC4); /* Safari 5.1 - 6.0 */
+    background: -o-linear-gradient(bottom right, #70EBE6 , #059EC4); /* Opera 11.1 - 12.0 */
+    background: -moz-linear-gradient(bottom right, #70EBE6 , #059EC4); /* Firefox 3.6 - 15 */
+    background: linear-gradient(to bottom right, #70EBE6 , #059EC4); /* 标准的语法(必须放在最后)*/
+}
+
+.connected_devices_container .item_icon{
+	height: 45%;
+    background: url(../pic/new/device.png) center center no-repeat;
+}
+
+.home_h3{
+    font-size: 25px;
+    -webkit-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    -moz-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    -ms-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);	
+	text-align: center;
+}
+
+.network_control_container {
+    float:left;
+    width: 280px;
+    height: 400px;
+	margin-left:20px;
+	border-radius:10px;
+	filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #36A4FF, endColorstr = #0877D4); 
+	background: -webkit-linear-gradient(left top, #36A4FF , #0877D4); /* Safari 5.1 - 6.0 */
+    background: -o-linear-gradient(bottom right, #36A4FF , #0877D4); /* Opera 11.1 - 12.0 */
+    background: -moz-linear-gradient(bottom right, #36A4FF , #0877D4); /* Firefox 3.6 - 15 */
+    background: linear-gradient(to bottom right, #36A4FF , #0877D4); /* 标准的语法(必须放在最后)*/
+}
+
+.network_control_container .item_icon{
+	height: 45%;
+    background: url(../pic/new/router.png) center center no-repeat;
+}
+
+.internet_status_container{	
+	float:left;
+    width: 280px;
+    height: 400px;
+	margin-left:60px;
+	border-radius:10px;
+	filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #D014FE, endColorstr = #7109D5); 
+	background: -webkit-linear-gradient(left top, #D014FE , #7109D5); /* Safari 5.1 - 6.0 */
+    background: -o-linear-gradient(bottom right, #D014FE , #7109D5); /* Opera 11.1 - 12.0 */
+    background: -moz-linear-gradient(bottom right, #D014FE , #7109D5); /* Firefox 3.6 - 15 */
+    background: linear-gradient(to bottom right, #D014FE , #7109D5); /* 标准的语法(必须放在最后)*/	
+	text-align: center;
+}
+
+.internet_status_container .item_icon_connect{
+	height: 45%;
+    background: url(../pic/new/surfing1.png) center center no-repeat;
+}
+
+.internet_status_container .item_icon_disconnect{
+	height: 45%;
+    background: url(../pic/new/surfing2.png) center center no-repeat;
+}
+
+.internet_status_container .data-card{
+    top: 180px;
+    left: 636px;
+}
+
+.traffic_control_container{
+    float:left;
+    width: 280px;
+    height: 305px;
+	margin-left:45px;
+	border-radius:10px;
+	color:#fff;
+	filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #FCCA53, endColorstr = #F45406); 
+	background: -webkit-gradient(linear, 0 0, 0 100%, from(#FCCA53), to(#F45406));
+	background: -webkit-linear-gradient(left top, #FCCA53 , #F45406); /* Safari 5.1 - 6.0 */
+    background: -o-linear-gradient(bottom right, #FCCA53 , #F45406); /* Opera 11.1 - 12.0 */
+    background: -moz-linear-gradient(bottom right, #FCCA53 , #F45406); /* Firefox 3.6 - 15 */
+	background: -ms-linear-gradient(left, #FCCA53, #F45406);   
+    background: linear-gradient(to bottom right, #FCCA53 , #F45406); /* 标准的语法(必须放在最后)*/
+
+}
+.device_info_container{
+    float:left;
+    width: 580px;
+    height: 305px;
+	border-radius:10px;
+	filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #B454F6, endColorstr = #0096D7); 
+	background: -webkit-linear-gradient(left top, #B454F6 , #0096D7); /* Safari 5.1 - 6.0 */
+    background: -o-linear-gradient(bottom right, #B454F6 , #0096D7); /* Opera 11.1 - 12.0 */
+    background: -moz-linear-gradient(bottom right, #B454F6 , #0096D7); /* Firefox 3.6 - 15 */
+    background: linear-gradient(to bottom right, #B454F6 , #0096D7); /* 标准的语法(必须放在最后)*/
+}
+
+.device_info_container_hastraffic{
+    margin-left:20px;
+}
+
+.device_info_container_notraffic{
+    margin-left:210px;
+}
+
+.device_info_container a{
+    padding-right: 2em;
+	margin-right:1em;
+    color: #FFF;
+    background: url(../pic/new/direct.png) right center no-repeat;
+}
+
+
+#smslist-table td{
+    vertical-align: middle;
+    line-height: 1.2;
+}
+
+#simMsgList_container td{
+    vertical-align: middle;
+    line-height: 1.2;
+}
+
+.smslist-item-msg pre{
+    overflow: hidden;
+    text-overflow: ellipsis;
+    border: none;
+    padding: 0;
+    margin:0;
+    font-size: 14px;
+    line-height: 1.2;
+    white-space: nowrap;
+    background-color: transparent;
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.smslist-btns {
+}
+
+#smsScrollLoading {
+    margin: 25px auto;
+    font-size: 22px;
+    font-weight: bold;
+    text-align: center;
+    color: #7D8DA3;
+}
+
+#smsScrollLoadingBtn {
+    margin: 25px auto;
+    font-size: 22px;
+    font-weight: bold;
+    text-align: center;
+    color: #7D8DA3;
+    cursor: pointer;
+}
+
+#smslist_container{
+    position: relative;
+}
+
+#smslist_container table,#smslist_container table td,#smslist_container table th {
+    padding: 0;
+    margin: 0;
+    border: none;
+}
+
+.smslist-item-checkbox{float: left; width: 20px;}
+.chosen-container-multi .chosen-choices li.search-field input[type="text"]{
+    height: auto;
+}
+
+.sms-table-content{
+    width: 450px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.showFullHeight{
+    white-space: normal;
+}
+
+#buttom-bubble{
+    width: 230px;
+    height: auto;
+    right: 0;
+    bottom: 0;
+    margin-right: 10px;
+    position: fixed;
+    z-index: 100;
+}
+
+#buttom-bubble .bubbleItem{
+    margin-top: 8px;
+    border-radius: 10px 10px 0 0;
+    position: relative;
+}
+
+#buttom-bubble h3{
+    padding: 8px 30px 8px 8px;
+    background-color: #eaeaea;
+    border: 2px solid #eaeaea;
+    border-bottom: 0;
+    border-radius: 8px 8px 0 0;
+    margin-bottom: 0;
+    font-size: 14px;
+}
+
+#buttom-bubble .bubbleItem.report h3{
+    color: #E47602;
+}
+
+#buttom-bubble h3 a.bubbleCloseBtn{
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    border: 1px solid #E2E2E2;
+    -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
+    -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
+    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
+}
+
+#buttom-bubble h3 a.bubbleCloseBtn:hover{
+    border: 1px solid #2063AB;
+}
+
+#buttom-bubble .bubbleCloseBtn{
+    width: 16px;
+    height: 14px;
+    display: block;
+    background: url("../pic/res_delete.png");
+}
+
+#buttom-bubble .bubbleContainer{
+    border: 2px solid #E2E2E2;
+    padding: 2px 8px 8px 8px;
+    line-height: 150%;
+    overflow: hidden;
+    border-top: 0;
+    font-size: 12px;
+    background: #F2F2F2;
+    background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(white), to(#eaeaea) );
+    background: -ms-linear-gradient(top, white, #eaeaea);
+    background: -moz-linear-gradient(top, white, #eaeaea);
+    background: -o-linear-gradient(top, white,#eaeaea);
+    filter: progid:dximagetransform.microsoft.gradient(enabled='true', startColorstr='#FFFFFFFF', endColorstr='#ffeaeaea', GradientType=0);
+}
+
+#buttom-bubble .bubbleContent{
+    max-height: 55px;
+    overflow: hidden;
+    line-height: 18px;
+    word-break: break-all;
+    word-wrap: break-word;
+}
+
+#buttom-bubble .bubbleDatetime{
+    padding-right: 10px;
+    text-align: right;
+    font-size: 10px;
+}
+
+#topContainer{
+    padding-top: 10px;
+    padding-bottom: 10px;
+    background-color: #EAEAEA;
+}
+
+.login-page-bg{
+    background: url("../pic/res_login-bg.png") repeat-x scroll 0 0 transparent;
+}
+
+#login-form-container{
+    border: 1px solid gray;
+    border-radius: 8px;
+    -moz-border-radius: 8px;
+    -webkit-border-radius: 8px;
+    background-color: white;
+    box-shadow: 0 3px 5px #053984;
+    -moz-box-shadow: 0 3px 5px #053984;
+    -webkit-box-shadow: 0 3px 5px #053984;
+}
+
+#htmlContainer{
+    padding: 0;
+}
+
+#htmlContainer .form-title{
+    padding: 10px 15px 10px 15px;
+    margin-bottom: 0;
+    border-bottom: 1px solid #cbcbcb;
+    background-color: #eaeaea;
+}
+
+#htmlContainer .content{
+    padding: 15px;
+}
+
+#simplemodal-data .alert{
+    border: 1px solid gray;
+    border-radius: 8px;
+    box-shadow: 0 6px 10px #053984;
+    width: 400px;
+    height: 150px;
+    background-color: white;
+}
+
+.btn-primary{
+    background-color: #008AD7;
+}
+
+#pblist tr td {
+    cursor: pointer;
+}
+
+#pblist tr td:first-child {
+    cursor: default;
+}
+
+.form-buttons {
+    margin-right: 20px;
+    margin-bottom: 5px;
+    text-align: right;
+}
+
+.align-right {
+    text-align: right;
+}
+
+.margin-right-10 {
+    margin-right: 10px;
+}
+
+.beautiful_bg #indexContainer{
+}
+
+.header-row {
+    background-color: #018ad8;
+    border-left-width: 0;
+    border-radius: 10px 10px 0 0;
+    margin: -1px 0 30px -11px;
+    width: 940px;
+    color: white;
+	filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #B454F6, endColorstr = #0096D7); 
+	background: -webkit-gradient(linear, 0 0, 0 100%, from(#B454F6), to(#0096D7));
+	background: -webkit-linear-gradient(left top, #B454F6 , #0096D7); /* Safari 5.1 - 6.0 */
+    background: -o-linear-gradient(bottom right, #B454F6 , #0096D7); /* Opera 11.1 - 12.0 */
+    background: -moz-linear-gradient(bottom right, #B454F6 , #0096D7); /* Firefox 3.6 - 15 */	
+	background: -ms-linear-gradient(left, #B454F6, #0096D7);
+    background: linear-gradient(to bottom right, #B454F6  , #0096D7); /* 标准的语法(必须放在最后)*/
+}
+
+.header-row .form-title {
+    border: none;
+    margin-bottom: 0;
+	text-align:center;
+}
+
+#innerContainer {
+    width: 100%;
+    margin: 35px auto;
+    padding: 0 10px 20px 10px;
+    border: 1px solid #fff;
+	border-bottom:0px;
+    border-radius: 10px;
+	background: -webkit-linear-gradient(top, #F1F9FC , #fff); /* Safari 5.1 - 6.0 */
+    background: -o-linear-gradient(bottom, #F1F9FC , #fff); /* Opera 11.1 - 12.0 */
+    background: -moz-linear-gradient(bottom, #F1F9FC , #fff); /* Firefox 3.6 - 15 */
+    background: linear-gradient(to bottom, #F1F9FC , #fff); /* 标准的语法(必须放在最后)*/
+	}
+
+.form-title-multi h1 {
+    margin-top: 10px;
+    margin-bottom: 5px;
+}
+
+.form-title-multi p {
+    margin-bottom: 0;
+}
+.mobile_version_link{
+    color: #A0AFCB;
+}
+
+#opmode_form .content {
+    background-color: #FFFFFF;
+}
+
+#sms_unread_count a:hover {
+    text-decoration: none;
+}
+
+.customfile-input {
+    outline: none;
+    position: absolute;
+    height: 100px;
+    cursor: pointer;
+    background: transparent;
+    border: 0;
+    z-index: 999;
+    opacity: 0;
+    -moz-opacity: 0;
+    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0 );
+}
+
+.customfile {
+    width: 400px;
+    padding: 2px;
+    border: 1px solid #444;
+    line-height: 30px;
+    background: #FAFAFA;
+    background: -ms-linear-gradient(#FAFAFA, #CACACA);
+    background: -moz-linear-gradient(#FAFAFA, #CACACA);
+    background : -webkit-linear-gradient( #FAFAFA, #EAEAEA);
+    cursor: pointer;
+    overflow: hidden;
+    -moz-border-radius: 7px;
+    -webkit-border-radius: 7px;
+    border-radius: 7px;
+    position: relative;
+    float: left;
+}
+
+.customfile-disabled {
+    opacity: .5;
+    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0 );
+    cursor: default;
+}
+
+.customfile-feedback {
+    display: block;
+    margin: 1px 1px 1px 5px;
+    font-size: 1.2em;
+    color: #767676;
+    font-style: italic;
+}
+
+.customfile-feedback-populated {
+    color: #111;
+    padding-left: 20px;
+    line-height: 24px;
+    margin-top: 6px;
+    width:290px;
+    font-style: normal;
+    font-weight: bold;
+    background: url(../pic/pic-file.png) left 0px no-repeat;
+    white-space:nowrap;
+    display: block;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+.customfile-button {
+    border: 1px solid #999;
+    background-color: #008AD7;
+    color: #fff;
+    float: right;
+    padding: 0px 10px;
+    text-align: center;
+    text-decoration: none;
+    font-size: 1em;
+    -moz-border-radius: 5px;
+    -webkit-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.customfile-hover .customfile-button,.customfile-focus .customfile-button {
+    background-color: #3071A9;
+    border-color: #285E8E;
+    padding: 0px 10px;
+    color: #fff;
+}
+
+.customfile-focus .customfile-button {
+    outline: 1px dotted #ccc;
+}
+
+/*file type icons*/
+.customfile-ext-jpg, .customfile-ext-gif, .customfile-ext-png, .customfile-ext-jpeg, .customfile-ext-bmp { background-image: url(../pic/pic-picture.png);}
+.customfile-ext-mp4, .customfile-ext-mov, .customfile-ext-swf, .customfile-ext-m4v { background-image: url(../pic/pic-film.png);}
+.customfile-ext-mp3, .customfile-ext-wav { background-image: url(../pic/pic-mp3.png);}
+.customfile-ext-zip, .customfile-ext-tar, .customfile-ext-sit { background-image: url(../pic/pic-rar.png);}
+
+input[type='file']:focus{
+    outline: none;
+}
+
+#smslist-checkAll, #simMsgList-checkAll {
+    margin-left: -4px;
+}
+
+.not-allowed {
+    color: #D1D1D1 !important;
+    cursor: not-allowed;
+}
+
+.not-allowed:hover {
+    outline: 0;
+    text-decoration: none;
+}
+
+.not-allowed:focus {
+    outline: 0;
+    text-decoration: none;
+}
+
+.margin-top-5 {
+    margin-top: 5px;
+}
+
+.colorLightBlue{
+    color: #09F;
+}
+
+.sd_invalid_notes ul li{
+    height: 2em;
+    line-height: 2em;
+}
+
+.sd_invalid_notes .notes-content{
+    display: block;
+}
+
+#fileControlSection li {
+    list-style: outside none none;
+    display: inline;
+}
+
+
+.my_router_list,.net_surfing_list{
+    margin-top: 20px;
+}
+
+.my_router_list ul,.net_surfing_list ul,.statistics_list ul,.nav_right ul{
+    -webkit-padding-start: 0px;
+	margin:0px;
+	padding:0px;
+}
+
+.my_router_list li,.net_surfing_list li,.statistics_list li{
+    padding: 0 1em;
+	list-style:none;
+}
+
+.my_router_list li,.my_router_list li a,.net_surfing_list li{
+    text-align: left;
+    line-height: 2em;
+    font-size: 18px;
+
+}
+
+.my_router_list li a{
+    display: block;
+    color: #FFF;
+    background: url(../pic/new/direct.png) right center no-repeat;
+    -webkit-transition: all ease-in .3s;
+    -moz-transition: all ease-in .3s;
+    -ms-transition: all ease-in .3s;
+    transition: all ease-in .3s;
+}
+
+.my_router_list li a:hover{
+    color: #FAFAFA;
+    -webkit-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    -moz-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    -ms-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+}
+
+.net_surfing_list li{
+    text-align: center;
+}
+
+.net_surfing_list i{
+    display: inline-block;
+    width: 17px;
+    height: 24px;
+    margin-right: 15px;
+    vertical-align: middle;
+}
+
+.net_surfing_list i.up{
+    background: url(../pic/new/direct_top.png);
+}
+
+.net_surfing_list i.down{
+    background: url(../pic/new/direct_down.png);
+}
+
+.statistics_list ul li{
+    padding: 0 20px;
+    text-align: left;
+    margin-top: 15px;
+	font-size:18px;
+}
+
+.statistics_list ul li a{
+    color: #FFF;
+    display: block;
+    background: url(../pic/new/direct.png) right center no-repeat;
+    -webkit-transition: all ease-in .3s;
+    -moz-transition: all ease-in .3s;
+    -ms-transition: all ease-in .3s;
+    transition: all ease-in .3s;
+}
+
+.statistics_list ul li a:hover{
+    -webkit-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    -moz-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    -ms-text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+    text-shadow: 0px 1px 2px rgba(100, 100, 10, 0.5);
+}
+
+.type_items{
+	width:880px;
+    height: 100px;
+    text-align: center;
+	margin:0 0 0 45px;
+    -webkit-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -moz-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -ms-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -webkit-border-radius: 8px;
+    -moz-border-radius: 8px;
+    -ms-border-radius: 8px;
+    border-radius: 10px;	
+	filter: progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr = #B454F6, endColorstr = #0096D7); 
+	background: -webkit-linear-gradient(left top, #B454F6 , #0096D7); /* Safari 5.1 - 6.0 */
+    background: -o-linear-gradient(bottom right, #B454F6 , #0096D7); /* Opera 11.1 - 12.0 */
+    background: -moz-linear-gradient(bottom right, #B454F6 , #0096D7); /* Firefox 3.6 - 15 */
+    background: linear-gradient(to bottom right, #B454F6 , #0096D7); /* 标准的语法(必须放在最后)*/
+}
+
+.type_items ul{
+    width: auto;
+	-webkit-padding-start: 0px;
+	margin:0px;
+	padding:0px;
+}
+
+.type_items ul li{
+    display: inline-block;
+	float:left;
+	list-style:none;
+}
+
+.type_items a{
+    display: table-cell;
+    width: 125px;
+    height: 100px;
+    color: #FFF;
+    vertical-align: middle;
+    -webkit-transition: all ease-in .3s;
+    -moz-transition: all ease-in .3s;
+    -ms-transition: all ease-in .3s;
+    transition: all ease-in .3s;
+    border-left: 1px solid;
+}
+
+.type_items a,.nav_right a:hover{
+    -webkit-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -moz-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -ms-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+}
+
+.nav_right{
+    margin: 0 auto 0px -10px;
+    text-align: center;	
+
+}
+
+.nav_right ul{
+    width: auto;
+    margin: 0 auto;
+}
+
+.nav_right ul li{
+    margin: 15px 20px 0 0;
+	width:100%;
+	list-style:none;
+}
+
+.nav_right .active a{
+    display: table-cell;
+    width: 138px;
+    height: 50px;
+    color: #fff;
+	font-weight:bold;
+    vertical-align: middle;
+    -webkit-transition: all ease-in .3s;
+    -moz-transition: all ease-in .3s;
+    -ms-transition: all ease-in .3s;
+    transition: all ease-in .3s;
+	-webkit-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -moz-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -ms-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    box-shadow: 0px 8px 10px rgba(172, 172, 172, 0.5);
+    background-color:rgb(66, 153, 237);	
+}
+
+.nav_right a{
+    width: 138px;
+    height: 50px;
+    display: table-cell;
+    color: #000;
+    vertical-align: middle;
+    -webkit-transition: all ease-in .3s;
+    -moz-transition: all ease-in .3s;
+    -ms-transition: all ease-in .3s;
+    transition: all ease-in .3s;
+	-webkit-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -moz-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    -ms-box-shadow: 0px 2px 4px rgba(172, 172, 172, 0.5);
+    box-shadow: 0px 8px 10px rgba(172, 172, 172, 0.5);
+    background-color:rgb(182, 214, 232);	
+}
+
+.sd-total {
+    text-align: right;
+    padding-right: 20px;
+}
+
+.icon-folder{
+    background: url("../pic/pic-folder.png") no-repeat;
+}
+
+.icon-pdf{
+    background: url("../pic/pic-pdf.png") no-repeat;
+}
+
+.icon-rar{
+    background: url("../pic/pic-rar.png") no-repeat;
+}
+
+.icon-mp3{
+    background: url("../pic/pic-mp3.png") no-repeat;
+}
+
+.icon-file{
+    background: url("../pic/pic-file.png") no-repeat;
+}
+
+.icon-film{
+    background: url("../pic/pic-film.png") no-repeat;
+}
+
+.icon-picture{
+    background: url("../pic/pic-picture.png") no-repeat;
+}
+
+.icon-doc{
+    background: url("../pic/pic-doc.png") no-repeat;
+}
+
+.icon-ppt{
+    background: url("../pic/pic-ppt.png") no-repeat;
+}
+
+.icon-xls{
+    background: url("../pic/pic-xls.png") no-repeat;
+}
+
+.icon-xml{
+    background: url("../pic/pic-xml.png") no-repeat;
+}
+
+.icon-download{
+    background: url("../pic/pic-download.png") no-repeat;
+}
+
+.mini-icon{
+    width: 20px;
+    height: 20px;
+    font-size: 16px;
+    display: block;
+}
+
+.cursor-pointer {
+    cursor: pointer;
+}
+
+#fileListSection th {
+    text-align: center;
+}
+
+.margin-left-5 {
+    margin-left: 5px;
+}
+
+.margin-top-2 {
+    margin-top: 2px;
+}
+
+.push-right {
+    text-align: right;
+}
+
+.data-card-language {
+    top: -25px;
+    right: 10px;
+    position: absolute;
+    display: block;
+}
diff --git a/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_en.properties b/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_en.properties
new file mode 100755
index 0000000..5bd1c7c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_en.properties
@@ -0,0 +1,1723 @@
+#menu 英文

+pc_version = PC

+mobile_version = Mobile

+home = Home

+phonebook = Phonebook

+sms = SMS

+sd = SD Card

+setting = Settings

+status = Information

+net_select = Network Selection

+dial_setting = Dial-up Settings

+apn_setting = APN

+wifi_advance = Advanced Settings

+management = Management

+net_setting = Connection Settings

+quick_setting = Quick Settings

+

+device_info = Status Information

+traffic_statistics = Statistics

+traffic_alert = Data Management

+

+wifi = Wi-Fi Settings

+wifi_basic = Basic Settings

+device_setting = Device Settings

+sim = SIM Card

+device = Device

+router_setting = Router

+mac_filter = WLAN MAC Filter

+

+wps = WPS

+sleep_mode = Power-save

+lan = LAN

+

+firewall = Firewall

+system_security = System Security

+port_forward = Port Forwarding

+port_filter = Port Filtering

+fastboot = Fast Boot

+display_password = Display Password

+display_QR = Display QR Code

+cable = cable

+wireless = wireless

+

+my_router = Network Settings

+net_surfing = Connect Status

+

+#validate

+phonenumbers_check = Input 5 phone numbers at most, and separate them by ';'

+required = Required

+remote = Please fix this field

+url = Please input a valid URL

+siteLink_check = Please input a valid URL

+siteName_check = Please input a valid name

+date = Please input a valid date

+dateISO = Please input a valid date (ISO)

+number = Please input a valid digit

+digits = Please input integer only

+decimalRange = Please enter a positive number and decimal places a maximum of 2

+any_digits = Please input integer only

+creditcard = Please input a valid credit card number

+equalTo = Please input the same value again

+accept = Please input a value with a valid extension

+maxlength = Please input no more than {0} characters

+minlength = Please input at least {0} characters

+rangelength = Please input a value between {0} and {1} characters in length

+range = Please input a value between {0} and {1}

+max = Please input a value less than or equal to {0}

+min = Please input a value greater than or equal to {0}

+ssid = Please input a valid SSID

+ssid_ap = Please input a valid SSID(, ; " \ are invalid characters)

+email_check = Please input a valid email

+ipv4 = Please input a valid IP address

+ipv6 = Please enter a valid IPv6 address

+name_check = Please input a valid name

+phonenumber_check = Please input a valid phone number

+sms_service_center_check = Please enter a valid center number

+pin_check = Please input 4 to 8 digits

+puk_check = Please input 8 digits.

+password_check = Please input a valid password

+subnetmask_check = Invalid subnet mask

+dhcp_check = DHCP {0} IP is not in the range of LAN subnet

+dns_check = Invalid DNS. DNS can''t be 255.255.255.255 or 0.0.0.0

+start = start

+end = end

+dhcpCompare = Invalid IP address. Start IP shouldn't be greater than end IP

+ipRange = IP pool can't contain LAN IP address (DHCP start IP should be greater than LAN IP address)

+lanip_check = Please input a valid IP address

+ip_check = Please input a full and valid IP address

+dmz_ip_check = Please input a valid IP address

+wps_pin_check = Invalid PIN number

+wps_pin_length_check = Please enter 4 or 8 digits

+browse_sdcard = View SD card

+portCompare = Invalid port range

+comment_check = Invalid character

+check_file_path = The folder name contains invalid characters

+check_filefold_name = The folder name contains invalid characters: ` ~ # & * + | \ : ? / < > . " '

+apn_check = Please input a valid APN

+ppp_username_check = Please input a valid username

+ppp_password_check = Please input a valid password

+unlock_code_check =  Please input a valid unlock code. The code must be 0-9, a-f or A-F, and its length must be 16 characters.

+apn_profile_name_check = The APN profile name contains invalid characters

+dlna_name_check = The Device Name must be 0-9, a-z, A-Z or _

+wifi_password_check = Please input a valid password

+wifi_wep_password_check = Please input 5 or 13 ASCII characters or input 10 or 26 Hex characters.

+range_except = Input a value between {0} and {1}, except for that between 32000 and 32007

+

+#common

+copyright = Copyright &copy; 2010-2022 demo Corporation. All rights reserved

+enable = Enable

+disable = Disable

+apply = Apply

+cancel = Cancel

+clear = Clear

+reset = Reset

+add = Add

+add_new = Add New

+save = Save

+new = New

+view = View

+select = Select

+edit = Edit

+delete = Delete

+delete_all = Delete All

+success_info = Success

+error_info = Failure

+connect = Connect

+disconnect = Disconnect

+connected = Connected

+disconnected = Disconnected

+connecting = Connecting…

+disconnecting = Disconnecting…

+cancelconnect = Cancel Connect

+confirm = Confirm

+prompt = Prompt

+info = Information

+alert = Alert

+yes = Yes

+no = No

+ok = OK

+back = Back

+exit = Exit

+next_step = Next

+prev_step = Previous

+next_page = &gt;&gt;

+prev_page = &lt;&lt;

+root = Root

+create = Create

+speed = Speed

+upload = Upload

+download = Download

+uploaded = Uploaded

+downloaded = Downloaded

+on = On

+off = Off

+need_login_again = You''re logged out of your account. Please login again.

+modify = Change

+content = Content

+time = Time

+processing = Processing...

+saving = Saving...

+deleting = Deleting...

+scanning = State: scanning...

+dlna_scanning = DLNA state: rescanning...

+scanned = DLNA state: rescan complete.

+need_rescan = DLNA state: need rescan.

+sending = Sending...

+creating = Creating...

+uploading = Uploading...

+waiting = Waiting...

+leave_page_info = You have unsaved changes. Are you sure you want to continue?

+colon = :

+page = Page:

+go = GO

+ALL = ALL

+open_source_licenses = Open Source Licenses

+vertical_bar = |

+#security

+security_policy = Security Policy

+security_mode = Security Mode

+security_mode_OPEN = OPEN

+security_mode_SHARED = SHARED

+security_mode_WPA2PSK = WPA2(AES)-PSK

+security_mode_WPAPSKWPA2PSK = WPA-PSK/WPA2-PSK

+security_mode_WPA3Personal = WPA3-Personal

+security_mode_WPA2WPA3 = WPA2(AES)/WPA3-Personal

+wpa = WPA

+pass_phrase = Pass Phrase

+

+#station

+station_info = Connected Devices

+station_number = No.

+host_name = Host Name

+

+#Wifi Basic

+multi_ssid_enable = Multi SSID Switch

+multi_ssid_1 = Main SSID

+multi_ssid_2 = Guest SSID

+multi_ssid_enable_confirm = If enable multi-SSID, Internet Wi-Fi will be disabled. Continue?

+multi_ssid_enable_confirm2 = If enable multi-SSID, Internet Wi-Fi will be disabled. And all connected Wi-Fi devices will probably need to reconnect. Continue?

+multi_ssid_max_access_number_alert = The combined max access number of Main SSID and Guest SSID can''t be more than {0}!

+network_band_selection = Band Selection 

+network_mode = Network Mode

+network_name = Network Name(SSID)

+broadcast_network_name = SSID Broadcast

+country_region_code = Country/Region Code

+frequency_channel = Frequency (Channel)

+rate = Rate

+max_station_number = Max Station Number

+wifi_basic_note = When clicking Apply, any connected Wi-Fi devices will need to reconnect.

+wifi_disconnect_confirm = All connected Wi-Fi devices will need to reconnect. <br/>Do you want to continue?

+wifi_disconnect_confirm2 = All connected Wi-Fi devices will probably need to reconnect. <br/>Do you want to continue?

+network_mode_2 = 802.11 n only

+network_mode_4 = 802.11 b/g/n

+network_mode_5 = 802.11 a only

+network_mode_6 = 802.11 b/g/n/ax

+frequency_channel_0 = Auto

+frequency_channel_1 = (Channel 1)

+frequency_channel_2 = (Channel 2)

+frequency_channel_3 = (Channel 3)

+frequency_channel_4 = (Channel 4)

+frequency_channel_5 = (Channel 5)

+frequency_channel_6 = (Channel 6)

+frequency_channel_7 = (Channel 7)

+frequency_channel_8 = (Channel 8)

+frequency_channel_9 = (Channel 9)

+frequency_channel_10 = (Channel 10)

+frequency_channel_11 = (Channel 11)

+frequency_channel_12 = (Channel 12)

+frequency_channel_13 = (Channel 13)

+frequency_channel_14 = (Channel 14)

+frequency_channel_15 = (Channel 15)

+frequency_channel_16 = (Channel 16)

+frequency_channel_17 = (Channel 17)

+frequency_channel_18 = (Channel 18)

+frequency_channel_19 = (Channel 19)

+frequency_channel_20 = (Channel 20)

+frequency_channel_21 = (Channel 21)

+frequency_channel_22 = (Channel 22)

+frequency_channel_23 = (Channel 23)

+frequency_channel_24 = (Channel 24)

+frequency_channel_25 = (Channel 25)

+frequency_channel_26 = (Channel 26)

+frequency_channel_36 = (Channel 36)

+frequency_channel_40 = (Channel 40)

+frequency_channel_44 = (Channel 44)

+frequency_channel_48 = (Channel 48)

+frequency_channel_149 = (Channel 149)

+frequency_channel_153 = (Channel 153)

+frequency_channel_157 = (Channel 157)

+frequency_channel_161 = (Channel 161)

+frequency_channel_165 = (Channel 165)

+rate_0 = Auto

+rate_1 = 1 Mbps

+rate_2 = 2 Mbps

+rate_3 = 5.5 Mbps

+rate_4 = 6 Mbps

+rate_5 = 6.5 Mbps

+rate_6 = 9 Mbps

+rate_7 = 11 Mbps

+rate_8 = 12 Mbps

+rate_9 = 13 Mbps

+rate_10 = 18 Mbps

+rate_11 = 19.5 Mbps

+rate_12 = 24 Mbps

+rate_13 = 26 Mbps

+rate_14 = 36 Mbps

+rate_15 = 39 Mbps

+rate_16 = 48 Mbps

+rate_17 = 52 Mbps

+rate_18 = 54 Mbps

+rate_19 = 58.5 Mbps

+rate_20 = 65 Mbps

+cannot_operate_when_wifi_connected = You can''t operate when Wi-Fi is connected!

+network_mode_select_2 = 802.11 n only

+network_mode_select_4 = 802.11 b/g/n

+network_mode_select_6 = 802.11 b/g/n/ax

+network_modes_band_select_2 = 802.11 n only

+network_modes_band_select_4 = 802.11 a/n

+network_modes_band_select_5 = 802.11 a only

+

+#net select

+auto_select = Automatic

+manual_select = Manual

+auto_select_type_WCDMA_preferred = Automatic

+auto_select_type_LTE_preferred = Automatic

+auto_select_type_NETWORK_auto = Automatic

+auto_select_type_Only_LTE = 4G Only

+auto_select_type_WCDMA_AND_LTE = 4G/3G Only

+auto_select_type_Only_WCDMA = 3G Only

+auto_select_type_TD_W = 3G Only

+auto_select_type_Only_GSM = 2G Only

+

+search = Search

+searching_net = Searching, please wait...

+registering_net = Registering, please wait...

+network_list = Network List

+register = Register

+auto = Auto

+unknown = Unknown

+available = Available

+current = Current

+forbidden = Forbidden

+net_select_note_automatic = Automatic: The device will search available network automatically.

+net_select_note_manual = Manual: The device will search available network manually.

+net_status = Status

+mccmnc = MCCMNC

+option = Option

+networktype = Network Type

+subnet = Act

+

+#home

+ap_station_clear = Clear all

+current_flux = Current Data

+total_flux = Total Used Data

+connected_time = Duration

+flux_up = Upload

+flux_down = Download

+traffic_current_connection = Current Connection

+traffic_current_month_data = Current Month

+traffic_total_traffic = Total Used Data

+traffic_used_data_month = Data usage of this month:

+traffic_used_time_month = The online time of this month:

+traffic_data_approximated = Data usage is approximate only. For actual usage, please refer to your network operator.

+traffic_used_month = Used:

+traffic_left_month = Left:

+traffic_exceeded_month = Exceeded:

+traffic_total_month = Limit:

+traffic_apply_volume_limit = Data Management

+traffic_data_limit_type = Data Type

+traffic_data = Data

+traffic_time = Time

+traffic_limit_data_month = Monthly

+traffic_alert_when_data_reach = Remind me

+traffic_limit_time_month = Monthly

+traffic_alert_when_time_reach = Remind me

+traffic_million_byte = MB

+traffic_percent = %

+traffic_limit_disconnect_msg = Your data/time used reaches {0} percent. Do you want to disconnect from network?

+traffic_limit_connect_msg = Your data/time used reaches {0} percent. Do you still want to connect to network?

+traffic_limit_msg = Your data/time used reaches {0} percent.

+traffic_beyond_disconnect_msg = Your data/time used exceeds limit. Do you want to disconnect from network?

+traffic_beyond_connect_msg = Your data/time used exceeds limit. Do you still want to connect to network?

+traffic_beyond_msg = Your data/time used exceeds limit.

+traffic_calibrate_note = Support data calibrate function. If the data that web page displayed is not in agreement with the actual used, you can modify the used data by this operation.

+traffic_note = Remind me when used data/time reaches specified percentage.

+traffic_over_note = When the data plan''s unit is MB, the used data should be less than 4096TB.

+traffic_clear_confirm = Are you sure to clear?

+traffic_not_support = The current mode does not support this feature.

+

+#APN

+apn_currentApn = Current APN

+apn_mode = Mode

+apn_auto_apn = Auto

+apn_manual_apn = Manual

+apn_profile = Profile

+apn_profile_name = Profile Name

+apn = APN

+apn_ipv4_apn = IPv4 APN

+apn_ipv6_apn = IPv6 APN

+apn_dns_mode = DNS Mode

+apn_dns_mode_ipv4 = IPv4 DNS Mode

+apn_dns_mode_ipv6 = IPv6 DNS Mode

+apn_auto_dns = Auto

+apn_manual_dns = Manual

+apn_dns1 = DNS 1

+apn_dns2 = DNS 2

+apn_dns1_ipv4 = IPv4 DNS 1

+apn_dns2_ipv4 = IPv4 DNS 2

+apn_dns1_ipv6 = IPv6 DNS 1

+apn_dns2_ipv6 = IPv6 DNS 2

+apn_authentication = Authentication

+apn_authentication_ipv4 = IPv4 Authentication

+apn_authentication_ipv6 = IPv6 Authentication

+apn_user_name = User Name

+apn_user_name_ipv4 = IPv4 User Name

+apn_user_name_ipv6 = IPv6 User Name

+apn_password = Password

+apn_password_ipv4 = IPv4 Password

+apn_password_ipv6 = IPv6 Password

+apn_pdp_type = PDP Type

+set_default = Set as default

+apn_save_profile_exist = Profile Name already exists, please select another name.

+apn_delete_cant_delete_default = You can''t delete the default profile!

+apn_delete_confirm = Are you sure to delete?

+apn_cant_modify_status = Can''t change the current APN setting when the network is {0}!

+apn_cant_modify_current = You can''t change the APN that is in use!

+apn_cant_delete_current = You can''t delete the current profile!

+apn_profile_full = You can only add {0} items at most!

+dial_num = Dial No.

+apn_no_select_alert = Please choose a valid profile!

+

+#Status bar

+network_status = Network Status

+connection_status = Wireless Broadband Connection status

+rj45_connection_status = Cable Broadband Connection status

+battery = Battery

+charging = Charging

+sim_status = SIM Status

+sim_status_modem_waitpin = Invalid SIM card

+sim_status_modem_waitpuk = Invalid SIM card

+sim_status_modem_sim_undetected = Invalid SIM card

+sim_status_modem_undetected = Invalid SIM card

+sim_status_modem_imsi_waitnck = Invalid SIM card

+sim_status_modem_sim_destroy = Invalid SIM card

+sim_status_modem_destroy = Invalid SIM card

+sim_status_modem_init_complete = Valid SIM card

+sim_status_modem_ready = SIM is ready

+wifi_status = Wi-Fi Status

+wifi_status_on = Wi-Fi on

+wifi_status_off = Wi-Fi off

+wifi_status1 = Number of users:1

+wifi_status2 = Number of users:2

+wifi_status3 = Number of users:3

+wifi_status4 = Number of users:4

+wifi_status5 = Number of users:5

+wifi_status6 = Number of users:6

+wifi_status7 = Number of users:7

+wifi_status8 = Number of users:8

+wifi_status9 = Number of users:9

+wifi_status10 = Number of users:10

+enable_pin = Enable PIN

+remaining_time = Remaining Time

+signal = Signal

+network_type = Network type

+network_type_limited_service = Limited Service

+network_type_no_service = No Service

+network_provider = Operator

+roaming_status = Roaming status

+sim_status_ready = SIM is ready

+sim_status_waitpin = Ready to input PIN

+sim_status_waitpuk = Ready to input PUK

+sim_status_undetected = No SIM card detected

+sim_status_waitnck = Ready to input NCK

+sim_status_destroy = SIM is corrupted

+signal_strength = Signal strength

+signal_strength_label = Signal Strength

+battery_level = Battery level

+

+#dial_setting

+dial_note = WAN Connection Status

+dial_mode = Connection Mode

+dial_mode_cpe = Dial-up Mode

+dial_roam_info = The Roaming Setting is disabled. To enable it, please go to setting page and click in the checkbox.

+dial_setting_note_automatic = Automatic: The device will automatically connect to network when it is powered on.

+dial_setting_note_manual = Manual: The device will connect to network manually.

+dial_roaming_remind = Check here, you can connect to internet in the roaming status.

+dial_roaming_connect = Your device is roaming. Connecting to network may occur additional charges. Continue?

+

+#net_status

+net_info = Network Status

+pci = PCI

+rsrp = RSRP

+rsrq = RSRQ

+plmn = PLMN

+band = BAND

+

+#phonebook

+search = Search

+save_location = Save Location

+save_location_0 = SIM Card

+save_location_1 = Device

+group_all = All

+group_null = -

+group_common = Common

+group_family = Family

+group_friend =  Friend

+group_colleague = Colleague

+name = Name

+mobile_phone_number = Mobile Number

+home_phone_number = Home Number

+office_phone_number = Office Number

+mail = Email

+group = Group

+no_data_selected = Please select an item!

+confirm_data_delete = Are you sure to delete?

+confirm_pb_delete = Delete selected contact(s)?

+too_many_data_selected = Too many numbers are selected! Please select one number!

+delete_fail_try_again = Delete failed, please try again.

+max_send_number = You can enter 5 phone numbers at most!

+send = Send

+send_sms = Send Message

+new_message = New SMS

+send_numbers = Number

+contents = Contents

+device_full =  Phonebook space on your device is full!

+sim_full = SIM card is full!

+phonebook_init_fail = The phone book failed to initialize!<br/>Please check SIM card and restart the device.

+sim_removed = SIM card was removed!

+change_device_to_sim_confirm = Information may be lost, and whether there is a need to continue to deposit?

+

+#SMS

+smslist = Device SMS

+sms_setting = SMS Settings

+sim_messages = SIM SMS

+refresh = Refresh

+forward = Forward

+draft = Draft

+send_fail_try_again = Send failed.

+sms_content_required = Please type a SMS.

+sms_contact_required = Please select a contact.

+select_some_options = You can choose 5 contacts at most

+select_an_option = Select an Option

+chat_input_placehoder = Please type message here

+sms_chat_input_confirm = Please press Enter or enter ";" to complete

+sms_capacity_will_full = SMS capacity will be full, please delete some SMS

+sms_capacity_is_full = SMS capacity is full, please delete some SMS

+sms_capacity_is_full_for_send = SMS capacity is full, please delete some SMS to receive or send message.

+sms_capacity_will_full_just = SMS capacity will be full, you could send {0} SMS(s)

+sms_init_fail = SMS failed to initialize!<br/>Please check SIM card and restart the device.

+sms_resending = Resending SMS...

+sms_resend_fail = SMS resend failure.

+sms_stop_sending = Stop Sending

+sms_unread_count = Unread SMS

+sms_delivery_report_1 = SMS is delivered.

+sms_delivery_report_2 = SMS is undelivered.

+sms_delivery_report_3 = Sending SMS...

+sms_report = Delivery Report

+sms_cancel_sending = Cancelling...

+sms_save_draft_success = SMS is saved as a draft

+sms_save_draft_failed = Draft save failed

+sms_to_save_draft = SMS was modified, save it as a draft?

+sms_no_recipient = Your SMS doesn''t have any recipients, and this SMS will be discarded.

+phone_number_invalid = Phone number invalid

+sms_to = To:

+confirm_sms_delete = Delete selected message(s)?

+sms_save_tip = Saving...

+

+#login

+password = Password

+puk = PUK

+login = Login

+logout = Logout

+new_pin = New PIN

+confirm_pin = Confirm New PIN

+puk_locked = Your SIM card is locked permanently. Please contact your operator.

+password_error = Password is incorrect!

+password_error_left = Password is incorrect!<br/>You have {0} attempt(s) left.

+password_error_account_lock = Your account is locked. <br/>Remaining time:

+password_error_five_times = You''ve input 5 times incorrectly. Retry in 5 minutes.

+password_error_account_lock_time = Your account is locked. <br/>Please try later.

+enter_pin = SIM card is locked, please input PIN to unlock.

+enter_puk = SIM card is PIN-locked, please input PUK to unlock.

+last_enter_pin = Final attempt. If incorrect again, your SIM card will be locked!

+last_enter_puk = Final attempt. If incorrect again, your SIM card will be corrupted!

+attempts_left = Attempts Left:

+pin_error = PIN is incorrect!

+puk_error = PUK is incorrect!

+confirm_logout = Do you want to logout?

+

+#advanced password

+password_management = Login Password

+current_password = Current Password

+new_password = New Password

+confirm_password = Confirm New Password

+current_password_error = Current password is incorrect!

+password_note_info = You can change login password on this page.

+password_note_valid = The password can''t be empty and must contain at most 32 characters.

+password_note_input = The password contains 0-9 a-z A-Z ! # $ * + , - . % : = ? @ [ ] ^ _ { | } ~

+password_note_first_change = Please change your initial login password!

+password_note_too_low = Your password complexity is too low (the password could contain uppercase and lowercase letters, numbers, special characters and no less than 8 characters). Do you want to continue?

+

+#advanced pin

+pin = PIN

+current_pin = Current PIN

+pin_management = PIN Management

+pin_status = PIN Status

+modify_pin = Change PIN

+cannot_operate_when_connected = Can''t operate when connecting to network!

+cannot_change_pin_when_connected = Can''t change PIN when connecting to network!

+pin_note_info = Apply PIN security settings in PIN Management to prevent unauthorized use of the SIM, USIM, or UIM card. If you want to change current settings, please disconnect from network first.

+pin_note_operator = If enable PIN, you may need to enter PIN when the device is powered on. If disable PIN, no PIN is required.

+pin_note_modify = You can change PIN when PIN is enabled.

+

+#lan

+lan_setting = LAN Interface Setup

+ip_address = IP Address

+subnet_mask = Subnet Mask

+mac_address = MAC Address

+dhcp_server = DHCP Server

+dhcp_ip_pool = DHCP IP Pool

+dhcp_lease = DHCP Lease Time

+hours = hour(s)

+minutes = minute(s)

+lan_note = Your settings will take effect after restarting your device.

+lan_note_ip_address = IP Address: LAN IP address of the router. You can access page management on device via this IP address.

+lan_note_subnet_mask = Subnet Mask: Subnet mask for IP address.

+lan_note_dhcp_server_enable = DHCP Server Enable: If the Dynamic Host Configuration Protocol (DHCP) service is enabled, the device allocates IP addresses to clients connected to it.

+lan_note_dhcp_server_disable = DHCP Server Disable: If the Dynamic Host Configuration Protocol (DHCP) service is disabled, the device does not allocate IP addresses to clients connected to it and IP addresses must be entered manually from each client.

+lan_note_dhcp_ip_pool = DHCP IP Pool: Starting and Ending IP address specify IP address range which is assigned by DHCP server to access devices. The IP address out of this range cannot be assigned by DHCP server.

+lan_note_dhcp_lease_time = DHCP Lease Time: Lease Time specifies how long a computer can use IP address. If the device will continue to use IP address, it must initiate request again before lease time expires. This IP address will not assign to other device until the old device initiates no request when its lease time expires.

+lan_confirm_reopen = Your settings will take effect after restarting your device. Do you want to continue?<br/><br/><i>Note: Click Yes to submit the request and restart the device. If you choose No, it means that you give up the current operation.</i>

+lan_tip_staticip_notsame = IP Address and static IP address can''t be in the same segment!

+

+#sms_setting

+sms_validity = Validity

+sms_validity_twelve_hours = 12 Hours

+sms_validity_one_day = 1 Day

+sms_validity_one_week = 1 Week

+sms_validity_largest = Maximum

+center_number = Center Number

+delivery_report = Delivery Report

+list = List

+

+#restore

+restore = Reset

+restore_title = Reset Factory Settings

+restore_button = Reset Factory Settings

+restore_confirm = Parameters will be reset to factory defaults, the device will restart. Continue?

+restore_when_connected = Please disconnect from WAN first!

+restoring = Resetting factory settings

+restore_note_info = Click Reset to reset all settings to defaults, and the device will restart automatically.

+

+#wps

+wps_note_all = WPS (Wi-Fi Protected Setup) is a standard that allows users to set up a wireless network in an easy and secure way without specific configuration, such as: SSID, security mode and password.

+wps_note_pin = PIN: You need to enter the PIN that is generated by the access client.

+wps_note_pbc = PBC: You can select the PBC (Push Button Configuration) on the web page or hold the WPS button for 3-4 seconds on the device to enable WPS function.

+wps_note_wait = The device will wait for receiving the access request of wireless access client within 2 minutes.

+wps_pin = PIN

+wps_pbc = PBC

+wps_wifi_off = You can''t operate when Wi-Fi is off!

+wps_auth_open = Current encryption type does not support WPS.

+wps_on_info = WPS is enabled now, please try again later.

+wps_ssid_broadcast_disable = You can''t operate when SSID broadcast is disabled!

+

+#sleep mode

+wifi_sleep = Wi-Fi Sleep

+wifi_sleep_mode = Power saving mode

+sleep_time = Shutdown after

+sleep_select_0 = Sleep

+sleep_select_1 = Power off

+sleep_mode_-1 = Never Sleep

+sleep_mode_5 = 5 Minutes

+sleep_mode_10 = 10 Minutes

+sleep_mode_20 = 20 Minutes

+sleep_mode_30 = 30 Minutes

+sleep_mode_60 = 1 Hour

+sleep_mode_120 = 2 Hours

+wifi_sleep_note_info = Shutdown after: When there''s no Wi-Fi connection in specific time, Wi-Fi will be unavailable, and the system will power off for power-saving.

+wifi_sleep_confirm = The current setting changes may restart Wi-Fi, continue any way?

+

+#system security

+remote_management = Remote Management (via WAN)

+ping_from_wan = Ping From WAN Filter

+

+#portforward

+protocol_TCP&UDP = TCP+UDP

+protocol_TCP = TCP

+protocol_UDP = UDP

+virtual_server_setting = Virtual Server Settings

+port_forward_setting = Port Forwarding Settings

+port_forward_list = Current Virtual Servers in system

+port_forward_note_info = Configure a Port Forward to enable external computers to access WWW, FTP or other services provided by LAN.

+port_forward_note_port = Port Range: Set port numbers to be forwarded.

+port_forward_note_ip_address = IP Address: Set the source IP address which you want to forward.

+port_forward_note_protocol = Protocol: Set the protocol for forwarding.

+port_forward_note_comment = Comment: Type comment for Port Forwarding rule. It contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ .

+port_range = Port Range

+protocol = Protocol

+comment = Comment

+ipExam = (e.g., 192.168.0.101)

+rules_max = The rule number exceeds {0}.

+rule_exist = This rule already exists.

+rule_max_note = The maximum number of rules is 10.

+rule_max_note_v4v6 = The maximum of rules for IPv4 and IPv6 is 10 respectively.

+

+rules_max_v4v6 =  The {0} rule number exceeds {1}.

+rule_exist_v4v6 = This {0} rule already exists.

+

+#quick setting

+step_number_1 = 1

+step_number_2 = 2

+step_number_3 = 3

+step_number_4 = 4

+step_number_5 = 5

+step_number_6 = 6

+step_name_1 = 1.Quick Setup

+step_name_2 = 2.PPP Profile Configuration

+step_name_3 = 3.PPP Authentication

+step_name_4 = 4.SSID Configuration

+step_name_5 = 5.Security Configuration

+step_name_6 = Configuration as Follows

+step1_exp1 = The wizard will show you how to set up basic parameters of gateway safely: Click "Previous" & "Next" to navigate, and click "Apply" to save settings.For advanced parameters, set them in other menu.

+step1_exp2 = Set basic parameters in this wizard. For advanced parameters, set them in other menu.

+apn_settings = APN Settings

+step2_auto_apn_explain = If you select Auto APN, the second step, i.e., PPP Authentication, will be skipped.

+step2_profile_name_explain = Profile Name: The default profile that you use currently.

+ppp_authentication = PPP Authentication

+step3_authentication_apn_explain1 = Authentication: It is provided by your Internet Service Provider (ISP). Password Authentication Protocol (PAP) provides a simple method without encryption for the peer to establish its identity using a 2-way handshake. Challenge-Handshake Authentication Protocol (CHAP) is used to periodically verify the identity of the peer using a 3-way handshake.

+step3_authentication_apn_explain2 = User Name: It is used to obtain authentication from the ISP when connection is established.

+step3_authentication_apn_explain3 = Password: It is used to obtain authentication from the ISP when connection is established.

+step3_username_password_explain = Click "Set as default" to set this profile as the default profile.

+ssid_title = SSID

+ssid_name = Network Name(SSID)

+ssid_broadcast = SSID Broadcast

+step4_ssid_explain = Network Name: Service Set Identifier (SSID). Enter name of your wireless local area network (WLAN), which is less than 32 characters.

+step4_ssid_broadcast_explain1 = SSID Broadcast: Disable or Enable (Default) this function. Once enabled, the router will broadcast SSID, and other devices can discover and connect to it.

+step4_ssid_broadcast_explain2 = Disable: The gateway disables broadcasting and hides the name of your network.

+step5_encryption_mode_info = Security Mode:

+step5_encryption_mode_explain1 = OPEN: Authentication and encryption won''t be performed. There are risks that private information may be intercepted, or network may be used by unauthorized individuals. This encryption scheme isn''t recommended.

+step5_encryption_mode_explain2 = WPA2(AES)-PSK: It is the secure version of WPA with implementation of the 802.11i standard.

+step5_encryption_mode_explain3 = WPA-PSK/WPA2-PSK: WPA Pre-Shared Key (WPA-PSK). WPA2-PSK is the secure version of WPA with implementation of the 802.11i standard.

+step5_encryption_mode_explain4 = Pass Phrase: The pass-phrase contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _  { | } ~

+step6_apply_explain = You need to reconnect wireless network when committing.

+quick_setting_wifi_disable_confirm = 1. Wi-Fi is off, the settings for Wi-Fi won''t take effect.<br\>Continue?

+quick_setting_param_changed_confirm = 1. Connected Wi-Fi devices probably need to reconnect when Wi-Fi configuration changes.<br\>Continue?

+#SD Card

+sdcard = SD Card

+httpshare = HTTP Share

+sd_card_mode = Mode

+sd_card_share_setting = Share Setting

+sd_card_share_usb_mode = USB

+sd_card_share_http_share_mode = HTTP SHARE

+http_title = HTTP Share Settings

+sd_card_status = Status

+sd_card_file_to_share = File to Share

+sd_card_access_type = Access Type

+sd_card_path_to_share = Path to Share

+sd_card_entire_sd_card = Entire SD Card

+sd_card_custom_setting = Custom 

+sd_card_read_write = Read/Write

+sd_card_readonly = Read Only

+sd_card_share_setting_no_sdcard = No SD Card!

+sd_card_share_setting_exist = The folder/file already exists!

+sd_card_share_setting_noexist = The folder/file does not exist!

+sd_card_status_info_0 = No SD Card!

+sd_card_status_info_1 = SD Card already exists and can be used now

+sd_card_status_info_2 = SD Card already exists, but it is invalid now! Please retry in 5 minutes. If still invalid, please check SD Card!

+sd_card_status_info_2_reason = Possible reasons are as follows

+sd_card_status_info_2_reason_1 = SD card is of NTFS format, please switch to USB mass storage.

+sd_card_status_info_2_reason_2 = SD card is loading, please retry in 5 minutes. If still invalid, please check SD card.

+sd_card_invalid_chars_cant_download = The file name contains invalid characters and can not be downloaded! (< > " '' & + / \\ : * | # ? ~ ` are invalid characters)

+note_not_support_fs_ntfs = In HTTP Share Mode, the device only supports FAT/FAT32 file system!

+note_web_share_mode = HTTP Share Mode: Share SD card via web browser. The removable drive mapping of SD card via USB port will be disabled.

+note_usb_access = USB Access Only: By the removable drive mapping, user can access SD card via USB cable only. The web page of sharing SD card will be disabled.

+note_http_share_usb_access = USB Access Only: By the removable drive mapping, user can access SD card via USB cable only. The web page of sharing SD card will be disabled.

+note_http_share_cannot_access = You can''t access this page!

+note_path_to_share_example = Path to Share: You can input the sharing path, such as /Picture. By typing only a slash in Path to Share filed, you agree to share entire SD card.

+note_upload_not_refresh = When you''re in process of downloading or uploading the file, please don''t refresh the page!

+note_upload_single_file_2g = The single file upload can not be above 2G.

+note_upload_filelenth_25 = The name of the file / folder name modification function supports 25 characters at most.

+note_uploading_not_refresh = Uploading, please don''t refresh the page!

+note_invalid_file_path = Path to Share can''t be a dot, and can''t contain following characters: < > " '' & + / \\ : * | # ? ~ `

+browse_btn = Browse

+change_btn = Change

+no_file_selected = No file selected...

+sd_no_file_selected = Please select a file

+sd_name = Name

+sd_path = Path:

+sd_rename = Rename

+sd_download = Download

+sd_file_size = File Size

+sd_update_time = Updated Time

+no_sdcard = No SD Card!

+no_exist = The file is not exist!

+sd_card_folder_name_is_null = Please enter a name

+get_file_list_failure = Get file list failed

+create_folder_failure = Create folder failed

+delete_folder_failure = Delete folder/file failed

+sd_card_path_too_long = File path too long.

+sd_file_size_too_big = The file is too large. The single file upload can not be above 2G.

+sd_file_name_invalid = File name containing * is not supported. Please update the file name.

+back_to_login = Back to Login

+sd_config_changed_reload = The settings for SD card share are changed, and the page will reload.

+sd_upload_space_not_enough = The space is not enough!

+sd_upload_data_lost = Upload failed, please retry.

+sd_upload_file_is_downloading = File is downloading, try later!

+sd_share_path_is_invalid = Path to Share is invalid, please set the share path

+sd_share_path_cant_rename = The folder was shared and cannot be renamed.

+sd_share_path_cant_delete = The folder "{0}" was shared and cannot be deleted.

+sd_share_path_invalid = The shared path does not exist.

+sd_file_processing_cant_delete = File is being used, cannot be deleted.

+sd_file_processing_cant_rename = File is being used, cannot be renamed.

+sd_not_support = The card format don''t support or other reasons, please re-insert or replace SD card.

+sd_usb_forbidden = The card is busy now, cannot be changed.

+sd_upload_rename = The file already exists! Please change the file name and select "yes" to continue. Select "no" will cancel the upload.

+sd_upload_rename_null = Can''t be empty or more than 25 characters!

+

+#port filter

+filter_basic_setting = Basic Settings

+port_filter_enabled = MAC/IP/Port Filtering

+default_policy = Default Policy

+default_policy_note = You can set firewall policies to protect your network from viruses, worms and malicious activities on the Internet.

+default_policy_note_filter = Only when filtering is enabled, the filter policy is available.

+accepted = Accepted

+dropped = Dropped

+port_filter_setting = MAC/IP/Port Filtering Settings

+mac_address = MAC Address

+macExam = (e.g., 00:1E:90:FF:FF:FF)

+dest_ip_address = Dest. IP Address

+source_ip_address = Source IP Address

+port_filter_action = Action

+filter_accept = Accept

+filter_drop = Drop

+protocol_None = ALL

+protocol_ICMP = ICMP

+port_filter_list = Current MAC/IP/Port Filtering Rules in System

+dest_port_range = Dest. Port Range

+source_port_range = Source Port Range

+filter_accept_note = Others would be accepted.

+filter_drop_note = Others would be dropped.

+filter_optional = Please input any IP, MAC or/and port value

+mac_check = Invalid MAC address

+filter_ip_setting = IP Settings

+filter_ipv4 = IPv4

+filter_ipv6 = IPv6

+ip_type = IP Type

+source_ipv6_address = Source IPv6 Address

+dest_ipv6_address = Dest. IPv6 Address

+port_filter_note_mac_address = MAC Address: Set MAC address to be filtered.

+port_filter_note_source_ip_address = Source IP Address: Set source IP address to be filtered.

+port_filter_note_dest_ip_address = Dest IP Address: Set dest IP address to be filtered.

+port_filter_note_protocol = Protocol: Set protocol to be used for filtering.

+port_filter_note_source_port_range = Source Port Range: Set source port numbers to be filtered.

+port_filter_note_dest_port_range = Dest Port Range: Set dest port numbers to be filtered.

+port_filter_note_action = Action: Set to handle the packet if it matches with the rule.

+port_filter_note_comment = Comment: Enter comment for filter settings. It contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ .

+port_filter_note_info = The filter policies are matched one by one with the rules. And if met this provision, it won''t continue to match the rules listed below.

+confirm_data_effect = Your settings may not take effect immediately. If you need to fully take effect, proposed restart the device. Continue?

+

+#wifi_range

+wifi_range_settings = Wi-Fi Performance Settings

+wifi_range = Wi-Fi Coverage

+wifi_short_mode = Short Wi-Fi Coverage - Best battery life

+wifi_medium_mode = Medium Wi-Fi Coverage

+wifi_long_mode = Long Wi-Fi Coverage

+wifi_des_short_mode = Short Wi-Fi Coverage

+wifi_des_medium_mode = Medium Wi-Fi Coverage

+wifi_des_long_mode = Long Wi-Fi Coverage

+wifi_range_note_range = Wi-Fi Coverage:

+wifi_range_note_short = Short Wi-Fi Coverage: Coverage and launch small power consumption, it is the best battery life.

+wifi_range_note_medium = Medium Wi-Fi Coverage: Coverage and emission power consumption is half of equipment support ability, normal power consume.

+wifi_range_note_long = Long Wi-Fi Coverage: Maximum emission power and coverage, if the terminal device still connect to your Wi-Fi network, which will decrease battery life.

+wifi_range_note_short_cpe = Short Wi-Fi Coverage: Minimum power consumption and coverage.

+wifi_range_note_medium_cpe = Medium Wi-Fi Coverage: 50% of device power consumption and coverage.

+wifi_range_note_long_cpe = Long Wi-Fi Coverage: Maximum power consumption and coverage.

+

+#upnp

+upnp = UPnP

+upnp_setting = UPnP Settings

+upnp_note_info = Universal Plug and Play (UPnP) is a set of networking protocols that allows networked devices, such as PC, printers, Internet gateways, Wi-Fi access points and mobile devices, to seamlessly discover each other''s presence on the network and establish functional network services for data sharing, communications, and entertainment.

+

+#dmz

+dmz = DMZ

+dmz_setting = DMZ Settings

+dmz_note_info = If a terminal device can''t run network applications via this device, please enter IP address of the terminal device in the entry box when DMZ is enabled.

+dmz_note_function = You can configure DMZ address, enable or disable DMZ on this page.

+

+#Device Information

+max_access_num = Max Access Number

+lan_domain = LAN Domain

+sim_serial_number = SIM Card Number

+software_version = Software Version

+firmware_version = Firmware Version

+hardware_version = Hardware Version

+imei = IMEI

+imsi = IMSI

+iccid = ICCID

+wan_ip_address = WAN IP Address

+ipv6_wan_ip_address = WAN IPv6 Address

+network_name_ssid1 = Network Name (Main SSID)

+pass_phrase_ssid1 = Pass Phrase (Main SSID)

+max_access_num_ssid1 = Max Access Number (Main SSID)

+network_name_ssid2 = Network Name (Guest SSID)

+pass_phrase_ssid2 = Pass Phrase (Guest SSID)

+max_access_num_ssid2 = Max Access Number (Guest SSID)

+

+#port map

+port_map = Port Mapping

+port_map_basic = Basic Settings

+port_map_setting = Port Mapping Settings

+source_port = Src. Port

+dest_port = Dest. Port

+port_map_list = Current Port Mapping Rules in System

+port_map_note_info = Configure a Port Mapping to enable external computers to access WWW, FTP or other services provided by LAN.

+port_map_note_port = Src. Port/Dest Port: The port of the computer that provides services.

+port_map_note_dest_ip_address = Dest. IP Address: Specify a computer located at LAN to provide services.

+port_map_note_protocol = Protocol: Protocols applied by services.

+port_map_note_comment = Comment: Type comment for Port Mapping rule. It contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ .

+

+#USSD Info

+USSD = USSD

+ussd = USSD

+ussd_send_to = Send to

+ussd_send = Send

+ussd_cancel = Cancel

+ussd_reply_to = Reply to

+ussd_reply = Reply

+ussd_contents = Contents

+ussd_timeout = Network Timeout!

+ussd_operation_timeout = Operation Timeout!

+ussd_no_service = No Network Service!

+ussd_retry = Operation Failed! Please Retry!

+ussd_unsupport = USSD is unsupported!

+ussd_info_error = Get Information Error!

+ussd_fail = Operation Failed!

+ussd_error_input = Error Input!

+ussd_note1 = You can send a command to the network (have predefined numbers or symbols), the network will be based on the instruction for you to provide the corresponding services.

+

+#dlna setting

+dlna_setting = DLNA Settings

+dlna_language = Language

+dlna_language_chinese = Chinese

+dlna_language_english = English

+dlna_device_name = Device Name

+dlna_media_type = Shared Media Type

+dlna_media_info = Share Settings

+dlna_audio = Music

+dlna_image = Image

+dlna_video = Video

+dlna_rescan = Rescan

+dlna_note_info = You can set Digital Living Network Alliance(DLNA) when SD card is available or HTTP Share Mode is enabled.

+dlna_note_httpshare = You can set Digital Media Server (DMS) language, device name, and media type which you want to share on this page.

+dlna_note_rescan = In order to allow DLNA multimedia database to be synchronized with SD card, please rescan.

+

+#nosimcard

+no_sim_card_title = System Information

+no_sim_card_message = No SIM Card or SIM Card invalid!

+

+#network_locked

+network_locked = SIM Lock!

+network_locked_explain = This device is network locked. Please contact your service provider to get unlock code.

+network_locked_times_explain =  Attempts left for unlock code input:

+network_locked_enter_explain = Please input unlock code:

+network_locked_zero_times = This device is network locked. Please contact your service provider.

+

+#update_info

+update_info = Update Information

+update_no_info = Software is up to date

+update_new_version_found = New version available

+update_current_version = Current Version

+update_new_version = New Version

+update_link_prompt = Click the following links to download update tools.

+update_skip_btn = Apply

+update_id_skip_info = If you don''t want to update, please click &quot;Skip&quot;.

+update_remind = Remind me when new version found.

+update_management = Update Management

+update_log = Bug Fixed

+update_note = Note

+update_notice = New version found. For more details, please goto Settings->Device Settings->Update management

+update_note_info = Click the link to download update tool.

+update_note_install = Extract update tool and then run it to start updating.

+update_note_linux = Can''t upgrade online in Linux. Please upgrade in Windows or on a Mac.

+update_status = Status

+update_settings = Update

+wifi_connect_alert = You can only update by connecting the ethernet cable.

+

+#AP_Station

+ap_station = Internet Wi-Fi

+ap_station_switch = Internet Wi-Fi Switch

+ap_station_wlan_mode = Preferred Network

+ap_station_wifi_prior = Wi-Fi

+ap_station_3g_prior = WWAN

+ap_station_current_status = Current Status

+ap_station_wlan_connected = Wi-Fi connected

+ap_station_wan_connected = WAN connected

+ap_station_no_connection = No connection

+ap_station_hotspot_list = Wi-Fi Hotspot

+ap_station_connect = Connect

+ap_station_disconnect = Disconnect

+ap_station_add_hotspot = Add Wi-Fi Hotspot

+ap_station_edit_hotspot = Edit Wi-Fi Hotspot

+ap_station_show_password = Display Password

+ap_station_encrypt_type = Encryption Type

+ap_station_wep_keys = WEP Keys

+ap_station_encrypt_type_none = NO ENCRYPTION

+ap_station_encrypt_type_wep = WEP

+ap_station_wep_key_type_ascii = ASCII

+ap_station_wep_key_type_hex = HEX

+ap_station_cipher = WPA Algorithms

+ap_station_cipher_TKIP = TKIP

+ap_station_cipher_AES = AES

+ap_station_cipher_AUTO = AUTO

+ap_station_security_mode_OPEN = OPEN

+ap_station_security_mode_WPAPSKWPA2PSK = WPA-PSK/WPA2-PSK

+ap_station_security_mode_SHARED = SHARED

+ap_station_security_mode_WPAPSK = WPA-PSK

+ap_station_security_mode_WPA2PSK = WPA2-PSK

+ap_station_security_mode_EAPAKASIM = EAP-AKA/SIM

+ap_station_security_mode_EAP-SIM/AKA = EAP-SIM/AKA

+ap_station_security_mode_WPA3Personal = WPA3-Personal

+ap_station_security_mode_WPA2WPA3 = WPA2(AES)/WPA3-Personal

+ap_station_wep_default_key = Default Key

+ap_station_wep_key = Key

+ap_station_wep_key_0 = Key 1

+ap_station_wep_key_1 = Key 2

+ap_station_wep_key_2 = Key 3

+ap_station_wep_key_3 = Key 4

+ap_station_exceed_list_max = The max number of AP is {0}!

+ap_station_search_hotspot_fail = Search hotspot failure!

+ap_station_connect_change_alert = Will disconnect from WAN. Continue?

+ap_station_update_fail = Operate failed. The hotspot is in connection.

+ap_station_enable_confirm = Multi SSID cannot be used when Internet Wi-Fi is being used. Multi SSID is automatically turned OFF if Internet Wi-Fi is ON. Still change settings?

+ap_station_processing = Background busy, please try again.

+ap_station_exist = Hot spots of the same name already exist.

+ap_connect_error = Failed to connect {0}!

+

+#fastboot

+fastboot = Fast Boot

+fastboot_setting = Fast Boot Settings

+fastboot_note = If enable Fast Boot function, your device will start in a short time.

+

+#notes

+wifi_channel_bandwidth = Channel Bandwidth

+

+home_note = The table shows the information of connected wireless device(s).

+

+sms_setting_note_validity = Validity: Set valid period of outgoing messages.

+sms_setting_note_center_number = Center Number: Enter SMS center number. For more information, please contact your service provider.

+sms_setting_note_delivery_report = Delivery Report: Receive or reject a prompt informing you that the message is delivered to the recipient.

+

+apn_note_whole_page = You can set the Access Point Name(APN) on this page.

+apn_note_mode = Mode: If a fixed APN is provided by your service provider, select Manual APN. Otherwise, please select Auto APN, and the device will automatically obtain parameters.

+apn_note_profile = Profile: It contains one or more profile names.

+apn_note_pdp_type = PDP Type: IPv4/IPv6/IPv4&IPv6.

+apn_note_profile_name = Profile Name: It refers to the name that you assign to the new profile.

+apn_note_apn = APN: Access Point Name. The APN contains 0-9 a-z A-Z . - and it can''t start with and end with .or -.

+apn_note_dns_mode = DNS Mode: If a fixed IP address is provided by your service provider, select Manual DNS. Otherwise, please select Auto DNS, and the device will automatically obtain parameters.

+apn_note_authentication = Authentication: It is provided by your Internet Service Provider(ISP).Password Authentication Protocol (PAP) provides a simple method without encryption for the peer to establish its identity using a 2-way handshake. Challenge-Handshake Authentication Protocol (CHAP) is used to periodically verify the identity of the peer using a 3-way handshake.

+apn_note_username = User Name: User name is used to obtain authentication from the ISP when the connection is established.

+apn_note_password = Password: Password is used to obtain authentication from the ISP when the connection is established.

+apn_note_set_default = Click "Set as default" to set this profile as the default profile.

+

+wifi_basic_note_multi_ssid_switch = Multi SSID Switch: 2 SSID can be used at the same time.

+wifi_basic_note_network_name = Network Name(SSID): SSID can be understood as network name. When change the SSID, please enter a string less than 32 characters as the name for your Wi-Fi. The string contains numbers, letters (a-z, A-Z), special characters (!#()+-./%=?@^_{|}~) and space, and it can''t start and end with space.

+wifi_basic_note_network_name_input = The network name contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ and space, and it can''t start and end with space.

+wifi_basic_note_broadcast = SSID Broadcast: If enable this function, the device will broadcast SSID. Other wireless devices will discover and connect to this device.

+wifi_basic_note_security_mode = Security Mode:

+wifi_basic_note_no_encryption = OPEN: Unencrypted mode. There are risks that network will be used by unauthorized individuals. This encryption mode isn't recommended.

+wifi_basic_note_shared = SHARED(WEP): Link authentication mode is shared key authentication, the encryption method is WEP.

+wifi_basic_note_wpa_psk_aes = WPA2(AES)-PSK: It is the secure version of WPA with implementation of the 802.11i standard.

+wifi_basic_note_wpa_psk = WPA-PSK/WPA2-PSK: WPA Pre-Shared Key (WPA-PSK). WPA2-PSK is the secure version of WPA with implementation of the 802.11i standard.

+wifi_basic_note_wpa3 = WPA3-Personal: It is the successor to WPA2.

+wifi_basic_note_wpa2_wpa3 = WPA2(AES)/WPA3-Personal: WPA2-PSK is the secure version of WPA with implementation of the 802.11i standard. WAP3 is the successor to WPA2.

+wifi_basic_note_pass_phrase = Pass Phrase: The pass-phrase contains 0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~

+wifi_basic_note_max_station_number1 = Max Station Number: You can select the maximum number of wireless terminals which can connect to the device.The Wi-Fi Hotspot connected by Internet Wi-Fi is also calculated.

+wifi_basic_note_max_station_number = Max Station Number: You can select the maximum number of wireless terminals which can connect to the device.

+

+wifi_advanced_note_whole_page = You can set Wi-Fi advanced characters on this page.

+wifi_advanced_note_band_selection = Band Selection: You can select the suitable band for your device.

+wifi_advanced_note_network_mode = Network Mode: Select the suitable Wi-Fi network mode, the device Wi-Fi performance will be improved.

+wifi_advanced_note_country_code = Country/Region Code: You can select the suitable Country/Region Code for your device.

+wifi_advanced_note_frequency = Frequency (Channel): Select appropriate channel to optimize the performance and coverage of your wireless network.

+

+ap_station_note_info = Please make sure that the IP address of Wi-Fi hotspot you''ve connected isn''t in the range of this device IP address, or you won''t have access to Internet via the Wi-Fi hotspot.

+ap_station_note_disable_info = If enable multi-SSID, Internet Wi-Fi will be disabled.

+ap_station_on_info = You can''t operate when Wi-Fi is enabled!

+

+wif_filter_note1 = Set MAC address filtering mode in the WLAN MAC Filter drop-down list box.

+wif_filter_note2 = Ruleless:Disable the WLAN MAC fliter.

+wif_filter_note3 = White List:Allow a client to connect to the device using the WLAN if the client's MAC address exists in the MAC Address list.

+wif_filter_note4 = Black List:Deny a client's connection to the device using the WLAN if the client's MAC address exists in the MAC Address list.

+

+#restart

+restart = Restart

+restart_button = Restart Device

+restart_confirm = Restart the device?

+restarting = Restarting Device

+

+#diconneted_operate_note

+diconneted_operate_note = To change current setting, please disconnect from network.

+diconneted_network_confirm = This operation may disconnect from network, continue any way?

+

+#ota_update

+ota_update = Update Management

+ota_title = Update

+ota_no_new_version = No new version found.

+ota_new_version = Found new version. Do you want to update?

+ota_connect_server = Connecting to server

+ota_connect_server_successfully = Connected to server successfully

+ota_downloading = Downloading...

+ota_download_failed = Download failed

+ota_no_network = No network

+ota_network_disconnected = Please connect to network before updating!

+ota_interrupted_alert = Found new version. Please login to update!

+ota_interrupted = Resume the downloading task which was interrupted before?

+ota_download_success = Download completed, and the device will restart. Please wait. Please do not power off, or reset factory settings, or turn off the device during the update.

+ota_pkg_download_success = Upgrade package has been downloaded already, and the device will restart. Please wait. Please do not power off, or reset factory settings, or turn off the device during the update.

+ota_update_success = Updated successfully!

+ota_update_failed = Update failed.

+ota_connect_server_failed = Unable to connect to server.

+ota_download_warning = Make sure there''s enough battery; Don''t force stop during download process.

+ota_update_warning = Attention: Don''t force stop during update process.

+ota_cancel = Update has been cancelled!

+ota_pkg_exceed = The update package is too large!

+ota_have_cancel = You have already cancelled!

+ota_roamming = The Roaming Setting is disabled. To enable it, please click in the checkbox  on this page.

+ota_low_battery = Download completed and battery is low, please charge before update!

+ota_pkg_low_battery = Upgrade package has been downloaded already,and battery is low, please charge before update!

+ota_md5_error = Check update package failed.

+ota_version = Version:

+ota_update_setting = Auto Check Settings

+ota_auto_update_switch = Auto-check New Version

+ota_update_interval_day = Auto-check Cycle

+ota_roaming_setting = Roaming Settings

+ota_update_roaming_remind = Check this option, the device will update when roaming, which will incur roaming charges.

+ota_update_manual = Check New Version

+ota_check_new_version = Check

+ota_check_new_version_desc = Click Check button for checking new version immediately.

+ota_check_roaming_confirm = You are on roaming! Would you like to continue?

+ota_update_every_day = Every day

+ota_update_15_day = 15 days

+ota_update_30_day = 30 days

+ota_new_version_checking = Checking new version...

+ota_update_running = Checking is ongoing...

+ota_check_fail = Check new version failed!

+ota_manual_upgrade_url = Upgrade File Download Address

+wefota_check_new_version = Check New Version And Upgrade 

+fota_package_downloading = A new version has been detected and is currently being downloaded. The upgrade will begin after the download is complete. Please do not power off, reset to factory settings, or shut down

+fota_package_no_new_version = No new version detected

+fota_package_already_download = Upgrade package has been downloaded,after waiting for equipment to restart to complete.

+software_upload = Software Upload

+local_upload = Local Upgrade

+upload_update_success = The upgrade file upload successful and will be about to restart,do not power off.

+upload_update_failed0 = parse file failed.   

+upload_update_failed1 = verify file failed.   

+upload_update_failed2 = write file failed.   

+upload_update_failed3 = write update flag failed.

+upload_update_failed4 = verify flash failed.

+error_file_selected = please choose right files.

+upload_tip = Should not close,refresh or open more webui,when uploading until restart.

+########CPE more wording##############

+opmode = Change Mode

+wds = WDS

+url_filter = URL Filtering

+

+voip_settings = VoIP Settings

+voip_basic_settings = Basic Settings

+voip_user_details = User Details

+voip_advanced_settings = Advanced Settings

+voip_supplementary_service = Supplementary Service

+

+url_check = invalid URL

+url_filter_check = invalid url filter format

+sntp_invalid_server_name = Invalid URL format or invalid ip address

+server_alreay_exist = This server is already exist

+forwarding_uri_check = Invalid Value

+

+wifi_switch = Wi-Fi Switch

+ap_isolation = AP Isolation

+#mac filter

+black_list = Black List

+black_list_switch = Black List Switch

+block = Block

+black_list_max = The max number of black list is 10!

+mac_repeat_tip = Please delete the repeated MAC addresses!

+black_yourself_tip = You can''t block yourself!

+wifi_status11 = Number of users:11

+wifi_status12 = Number of users:12

+wifi_status13 = Number of users:13

+wifi_status14 = Number of users:14

+wifi_status15 = Number of users:15

+wifi_status16 = Number of users:16

+wifi_status17 = Number of users:17

+wifi_status18 = Number of users:18

+wifi_status19 = Number of users:19

+wifi_status20 = Number of users:20

+wifi_status21 = Number of users:21

+wifi_status22 = Number of users:22

+wifi_status23 = Number of users:23

+wifi_status24 = Number of users:24

+wifi_status25 = Number of users:25

+wifi_status26 = Number of users:26

+wifi_status27 = Number of users:27

+wifi_status28 = Number of users:28

+wifi_status29 = Number of users:29

+wifi_status30 = Number of users:30

+wifi_status31 = Number of users:31

+wifi_status32 = Number of users:32

+

+auto_connect = Auto Connect

+manual_connect = Manual Connect

+

+default_Gateway = Default Gateway

+primary_dns = Primary DNS Server

+secondary_dns = Secondary DNS Server

+gateway_check = Please input a valid gateway

+

+mac_filter_lable = MAC Filter Format

+

+wlan_mac_filter_0 = Ruleless

+wlan_mac_filter_1 = White List

+wlan_mac_filter_2 = Black List

+

+#SNTP

+local_current_time = Current Local Time

+time_set_mode = Time Set Mode

+time_set_time_manual = Manual Set Time

+time_set_time_auto = Sntp auto Synchronization

+year = Year

+month = Month

+date = Date

+hour = Hour

+minute = Minute

+second = Second

+sunday = Sunday

+monday = Monday

+tuesday = Tuesday

+wednesday = Wednesday

+thursday = Thursday

+friday = Friday

+saturday = Saturday

+stnp_server1 = SNTP Server1

+stnp_server2 = SNTP Server2

+stnp_server3 = SNTP Server3

+time_zone = Time Zone

+daylight_saving_time = Daylight Saving Time

+daylightsave_0 = Disable

+daylightsave_1 = Enable

+sntp_syn_time_wan_connected = SNTP time synchronization can be used after networking!

+operation_not_supported = operation not supported!

+network_terminated = USSD terminated by network

+upgrade_file_nomatch = You do not select the root_uImage or modem.zip!

+upgrade_confirm = Do you really want to upgrade the Image?

+upgrading = Upgrading, please wait....

+upgrading_alert = Upgrading, please don''t cut off your power supply. After upgrade, it will restart automaticly!

+upgrad_note = Please select the version you want to upgrade, then click the ''Apply'' button to start upgrade.

+sntp_processing = Synchronizing, please wait....

+sntp_req_success = The SNTP request has been sent!

+time_zone_<-12>12_0 = (GMT-12:00) Dateline West

+time_zone_SST11_0 = (GMT-11:00) Midway Islands, Samoa

+time_zone_<-10>10_0 = (GMT-10:00) Hawaii

+time_zone_<-09>9_0 = (GMT-09:00) Alaska

+time_zone_PST8PDT,M3.2.0,M11.1.0_0 = (GMT-08:00) Pacific time (USA and Canada), Tijuana

+time_zone_<-07>7_0 = (GMT-07:00) Mountain time (USA and Canada)

+time_zone_<-07>7_1 = (GMT-07:00) Arizona

+time_zone_MST7MDT,M4.1.0,M10.5.0_2 = (GMT-07:00) Chihuahua, La Paz, Mazza Tran

+time_zone_<-06>6_0 = (GMT-06:00) Saskatchewan

+time_zone_<-06>6_1 = (GMT-06:00) Central time (USA and Canada)

+time_zone_<-06>6_2 = (GMT-06:00) Central America

+time_zone_<-06>6_3 = (GMT-06:00) Guadalajara City, Mexico City, Monterey

+time_zone_<-05>5_0 = (GMT-05:00) Bogota, Lima, Quito

+time_zone_<-05>5_1 = (GMT-05:00) Eastern time (USA and Canada)

+time_zone_EST5EDT,M3.2.0,M11.1.0_2 = (GMT-05:00) Indiana (East)

+#time_zone_-4.5 = (GMT-04:30)

+time_zone_AST4ADT,M3.2.0,M11.1.0_0 = (GMT-04:00) Atlantic time (Canada)

+time_zone_<-04>4_1 = (GMT-04:00) Caracas, La Paz

+time_zone_<-04>4<-03>,M8.2.6/24,M5.2.6/24_2 = (GMT-04:00) Santiago

+time_zone_NST3:30NDT,M3.2.0,M11.1.0_0 = (GMT-03:30) Newfoundland

+time_zone_<-03>3_0 = (GMT-03:00) Brasilia

+time_zone_<-03>3_1 = (GMT-03:00) Buenos Aires, Georgetown

+time_zone_<-03>3_2 = (GMT-03:00) Greenland

+time_zone_<-02>2_0 = (GMT-02:00) Mid-Atlantic

+time_zone_<-01>1_0 = (GMT-01:00) Cape Verde Islands

+time_zone_<-01>1<+00>,M3.5.0/0,M10.5.0/1_1 = (GMT-01:00) Azores

+time_zone_GMT0IST,M3.5.0/1,M10.5.0_0 = (GMT) GMT: Dublin, Edinburgh, London, Lisbon

+time_zone_WET0WEST,M3.5.0,M10.5.0/3_1 = (GMT) Casablanca, Monrovia

+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_0 = (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna

+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_1 = (GMT+01:00) Belgrad, Bratislava, Budapest, Ljubljana, Prague

+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_2 = (GMT+01:00) Brussels, Copenhagen, Madrid, Paris

+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_3 = (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb

+time_zone_<+01>-1_4 = (GMT+01:00) Western Central African

+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_0 = (GMT+02:00) Bucharest

+time_zone_CAT-2_1 = (GMT+02:00) Pretoria, Harare

+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_2 = (GMT+02:00) Helsinki, Kiev, Riga, Sofia, Tallinn, Vilnius

+time_zone_EET-2_3 = (GMT+02:00) Cairo

+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_4 = (GMT+02:00) Athens, Beirut, Istanbul, Minsk

+time_zone_IST-2IDT,M3.4.5/02:00:00,M10.5.0/02:00:00_5 = (GMT+02:00) Jerusalem

+time_zone_<+03>-3_0 = (GMT+03:00) Baghdad

+time_zone_<+03>-3_1 = (GMT+03:00) Riyadh, Kuwait

+time_zone_<+03>-3_2 = (GMT+03:00) Moscow, St Petersburg, Volgograd

+time_zone_EAT-3_3 = (GMT+03:00) Nairobi

+time_zone_<+0330>-3:30<+0430>,J80/0,J264/0_0 = (GMT+03:30) Teheran

+time_zone_<+04>-4_0 = (GMT+04:00) Abu Zabi, Muscat

+time_zone_<+04>-4_1 = (GMT+04:00) Baku, Tbilisi, Yerevan

+time_zone_<+0430>-4:30_0 = (GMT+04:30) Kabul

+time_zone_<+05>-5_0 = (GMT+05:00) Yekaterinburg

+time_zone_PKT-5_1 = (GMT+05:00) Islamabad, Karachi, Tashkent

+time_zone_<+0530>-5:30_0 = (GMT+05:30) Madras, Calcutta, Mumbai, New Delhi

+time_zone_<+0545>-5:45_0 = (GMT+05:45) Kathmandu

+time_zone_<+06>-6_0 = (GMT+06:00) Ala Mutu, Novosibirsk

+time_zone_<+06>-6_1 = (GMT+06:00) Dhaka, Astana

+time_zone_<+06>-6_2 = (GMT+06:00) Sri Haya Ed Denny Pla

+time_zone_<+0630>-6:30_0 = (GMT+06:30) Yangon

+time_zone_<+07>-7_0 = (GMT+07:00) Krasnoyarsk

+time_zone_<+07>-7_1 = (GMT+07:00) Bangkok, Hanoi, Jakarta

+time_zone_CST-8_0 = (GMT+08:00) Beijing, Chongqing, Hongkong Special Administrative Region, Urumqi

+time_zone_<+08>-8_1 = (GMT+08:00) Kuala Lumpur, Singapore

+time_zone_AWST-8_2 = (GMT+08:00) Perth

+time_zone_CST-8_3 = (GMT+08:00) Taipei

+time_zone_<+08>-8_4 = (GMT+08:00) Irkutsk, Ulam Batu

+time_zone_JST-9_0 = (GMT+09:00) Osaka, Sapporo, Tokyo

+time_zone_KST-9_1 = (GMT+09:00) Seoul

+time_zone_<+09>-9_2 = (GMT+09:00) Yakutsk

+time_zone_ACST-9:30ACDT,M10.1.0,M4.1.0/3_0 = (GMT+09:30) Adelaide

+time_zone_ACST-9:30_1 = (GMT+09:30) Darwin

+time_zone_AEST-10_0 = (GMT+10:00) Brisbane

+time_zone_<+10>-10_1 = (GMT+10:00) Vladivostok

+time_zone_<+10>-10_2 = (GMT+10:00) Guam, Port Moresby

+time_zone_AEST-10AEDT,M10.1.0,M4.1.0/3_3 = (GMT+10:00) Hobart

+time_zone_AEST-10AEDT,M10.1.0,M4.1.0/3_4 = (GMT+10:00) Canberra, Melbourne, Sydney

+time_zone_<+11>-11_0 = (GMT+11:00) Magadan, Solomon islands, New Caledonia

+time_zone_<+12>-12_0 = (GMT+12:00) Wellington, Oakland

+time_zone_<+12>-12_1 = (GMT+12:00) Fiji, Kamchatka, Marshall Islands

+time_zone_<+13>-13_0 = (GMT+13:00) Nukualofa

+

+#operation mode

+opmode_auto = Automatic

+opmode_bridge = Bridge Mode

+opmode_cable = Cable Broadband Mode

+opmode_gateway = Wireless Broadband Mode

+EthPort_Status = Ethernet Port Status

+change_mode = Change Mode

+current_mode = Current Mode:

+change = Change

+change_mode_alert = Cable Broadband mode can only use Wi-Fi to access, please remember Wi-Fi SSID and password! Continue?

+opmode_msg1 = If wireless broadband mode is enabled, please remove network cable of public network.

+opmode_msg2 = The device will be restarted when operation mode is changed.

+opmode_msg3 = The network cable of public network has been removed.

+#pppoe dial

+pppoe_mode = PPPoE

+pppoe_success = PPPoE dial successfully

+pppoe_fail = PPPoE dial failed

+pppoe_processing = PPPoE dialing

+static_success = Successfully set static IP

+static_fail = Set static IP failed

+static_processing = Setting static IP

+dyn_success = Successfully obtained dynamic IP

+dyn_fail = Obtain dynamic IP failed

+dyn_processing = Obtaining dynamic IP

+pppoe_msg = The network cable of public network has been removed

+pppoe_message_send_fail = Send message failed!

+ip_gate_not_same = IP Address and Default Gateway can''t be same!

+ip_innergate_not_same = IP Address and  LAN IP address of the router can''t be in the same segment!

+auto_success = AUTO dial successfully

+auto_fail = AUTO dial failed

+auto_processing = AUTO dialing

+#url filter

+url_filter_list = Current URL Filtering

+url_filter_max = The maximum number of URL filter rules is {0}

+url_repeated = This URL already exists.

+url_note1 = You can set the web address of URL filter to protect your network from some of the bad site (not support https).

+url_note2 = URL: Set the URL address that needs to be filtered.

+url_note3 = URL: Maximum length is 32.

+

+#wds

+wds_mode = WDS Mode

+wds_mode_0 = Disable

+wds_mode_1 = RootAP Mode

+wds_mode_2 = Bridge Mode

+wds_mode_3 = Repeater Mode

+repeater_ssid = Repeater SSID

+wpa_algorithms = WPA Algorithms

+enable_wds_confirm = If enable WDS, Wi-Fi basic settings will be disabled. Continue?

+#sys log

+sys_log = System Log

+log_setting = Log Settings

+syslog_mode_all = All

+syslog_mode_wan_connect = WAN Connect

+syslog_mode_sms = SMS

+syslog_mode_tr069 = tr069

+syslog_mode_voip = VoIP

+syslog_mode_dlna = DLNA

+syslog_mode_wlan = WLAN

+syslog_mode_router = Router

+view_log = View log

+log_info = Log information

+

+#add at 2013.6.20

+periodic_inform = Periodic Inform

+periodic_inform_interval = Periodic Inform Interval

+periodic_inform_time = Periodic Inform Time

+certificate_import = Certificate

+import_certificate_btn = Import

+certificate_file_nomatch = You do not select the ca-cert.crt!

+#voip setting

+outbound_mode = Outbound Mode

+outbound_server = Outbound Server

+outbound_port = Outbound Port

+stun_mode = STUN Mode

+stun_server = STUN Server

+register_every = Register Every

+advanced_options = Advanced Options

+sip_port = SIP Port

+rtp_port = RTP Port

+voip_outbound_port_check = Invalid port.

+voip_time_check = Invalid register time.

+timeRange = [1, 3600] seconds

+voip_sip_port_check = Invalid port.

+voip_port_compare = Invalid port range.

+warn_information = The parameters of VoIP set success, please register again.

+#voip user details

+user_details_title = SIP Server and Configuration

+sip_register_server = SIP Register Server

+sip_domain = SIP Domain

+sip_realm = SIP Realm

+sip_proxy_mode = SIP Proxy Mode

+sip_proxy_server = SIP Proxy Server

+authorization = Authorization

+display_name = Display Name

+authorized_user_name = Authorized User Name

+authorized_password = Authorized Password

+voip_register_status = VoIP Register Status

+register_failed = Register Fail

+register_success = Register Success

+register_connecting = Register Connecting

+unregister = Unregister

+deregister = Deregister

+sip_domain_check = SIP Domain Address invalid

+sip_realm_check = SIP Realm invalid

+sip_proxy_server_check = IP Proxy Server invalid

+display_name_check = Display Name invalid

+authorized_username_check = Authorized User Name invalid

+account_password_check = Password invalid

+#voip advanced settings

+sip_advanced_options = Advanced Options

+adv_sip_t38 = T.38 FAX Encoder

+sip_dtmf = DTMF

+voip_sip_dtmf_method_inband = InBand

+voip_sip_dtmf_method_rfc2833 = RFC2833

+voip_sip_dtmf_method_sipinfo = SIPInfo

+sip_encoder = Encoder

+voip_sip_encoder_method_0 = G.711 u-Law

+voip_sip_encoder_method_1 = G.711 a-Law

+voip_sip_encoder_method_2 = G.722

+voip_sip_encoder_method_3 = G.729

+voip_sip_encoder_method_4 = G.726-16kps

+voip_sip_encoder_method_5 = G.726-24kps

+voip_sip_encoder_method_6 = G.726-32kps

+voip_sip_encoder_method_7 = G.726-40kps

+sip_vad = VAD

+sip_cng = CNG

+#voip supplementary service

+sip_protocol_voip = VoIP supplementary service

+sip_protocol_call_forw = Call Forwarding

+voip_forwarding_mode_1 = Unconditional forwarding

+voip_forwarding_mode_2 = When busy

+voip_forwarding_mode_3 = When no answer

+voip_forwarding_mode_0 = Cancel all forwarding

+sip_protocol_forw_uri = Forwarding URI

+show_msg = Please press '*80' on the phone!

+sip_protocol_incoming_call = Do Not Disturb

+sip_protocol_call_waiting = Call Waiting

+wds_note = WDS: Wireless Distribution System

+#voip user details

+connect_note = Please connect to internet if you want to use VoIP phone!

+#fota

+upgrade_pack_fix_success = Upgrade success!

+upgrade_pack_fix_failed = Upgrade failed!

+have_new_version = New version is found,the device will update.

+upload_file = File upload in progress!

+update_status_error = Fail to read the update status file, unable to update!

+verify_error = Verification upgrade file failed, unable to update!

+start_update = The upgrade file has been successfully verified and is currently being upgraded. Please do not power off, restore factory settings, or shut down the device!

+

+######key same value different###########

+dmz_note_info = If a terminal device can''t run network applications via this device, please enter IP address of the terminal device in the entry box when DMZ is enabled.

+dlna_note_info = DLNA: Digital Living Network Alliance.

+dlna_note_httpshare = You can set Digital Media Server (DMS) device name, and media type which you want to share on this page.

+#############串口转网口###################

+switch_port_title = Switch ethernet port to serial port

+open_serial_port = Turn ethernet port to serial port

+close_serial_port = Close ethernet port to serial port

+switching = switching...

+##############定时重启功能wording###################

+restart_schedule = Restart Schedule

+enable_reboot_switch = Turn on automatic restart function

+enable_reboot_byday = Automatic restart schedule based on every day

+enable_reboot_byweek = Automatic restart schedule based on the week

+enable_reboot_bymonth = Automatic restart schedule based on the month

+synchronized = synchronized

+unsynchronized = unsynchronized

+week = Week

+login_password_length_check = Please input 4 characters at least.

+system_time_not_syn = System time not synchronized!

+fota_note1 = You can set up an auto-check cycle for your device, so that the device automatically detects whether there is a new version of the software.

+local_note = You can choose the upgrade file on the local computer, upgrade the device software to the selected version, complete the system repair and optimization.

+

+#new word

+modify_password = Login Setting

+

+#parental control

+parental_control = Parental Control

+pc_children_group = Kids Devices

+pc_children_group_manage = Kids Manage

+pc_manage = Manage

+pc_no_children_device = Not set Kids Devices

+pc_children_group_desc = All kids devices will follow network access policy

+pc_edit_host_name = Edit the hostname:

+pc_internet_rule = Network Access Policy

+pc_time_limited =  Online Time Setting

+pc_site_white_list = Website Whitelist

+pc_manage_children_group = Manage Kids Devices

+pc_current_attached_devices = Current Devices

+pc_action = Operation

+pc_remove = Remove

+pc_remove_all = Remove All

+pc_add = Add

+pc_leave = Leave

+pc_add_white_site = Add The White List

+pc_in_child_group = Added as kids device

+pc_forbid_time = Not Allow

+pc_allow_time = Allow

+pc_setting_desc = Click with your mouse to allow or forbid network access

+pc_name = Name

+pc_link = URL

+pc_not_save = Data not saved, please pay attention to save

+pc_link_exist = URL already exists!

+no_data = No data

+sun = SUN

+mon = MON

+tues = TUES

+wed = WED

+thur = THUR

+fri = FRI

+sat = SAT

+

+#定时休眠唤醒

+tsw_settings = Wi-Fi Awake Settings

+tsw = Wi-Fi Awake

+time_sleep_wake_up = Wi-Fi Awake Settings

+tsw_timer_on = Wake-up Time

+tsw_timer_off = Sleep Time

+tsw_sys_time_mode_alert = Please connect to the network and using the SNTP auto synchronizing time.

+tsw_time_interval_alert = The time interval should not be less than 10 minutes.

+

+#new wording

+advanced_settings = Advanced Settings

+others = Others

+others_restart_reset = Restart and Reset

+others_note_info = Please login again after rebooting or resetting router

+

+pwd_sub_title = Manage information about your wireless router

+pwd_note = When you log in wireless router, need to input this password (password is different from your wireless network password)

+current_network = Current Network

+

+wifi_wireless_settings = Wi-Fi Settings

+wifi_main_sub_title = Set up wireless hotspot so that your mobile phone or laptop could access network via it

+wifi_broadcast_desc = SSID Broadcast

+wifi_isolated_desc = All the wireless client device is completely isolated

+

+detail_info = Detail Information

+sd_u_share = SD Sharing

+

+settings_wireless = Wi-Fi Settings

+settings_internet = Network Settings

+not_connect_network = Disconnected

+

+traffic_data_plan = Statistics

+traffic_pie_title = Data Plan

+traffic_sub_title = You can create statistic plan, query used and left statistic

+traffic_used = Used

+traffic_used_text = {0} Used

+traffic_limit_data = Data Plan

+traffic_limit_data_text = {0} Data Plan

+traffic_alert_reach_text = When reached {0}%, {1} to remind me

+traffic_data_left_text = {0} of remaining

+traffic_when = When reached

+traffic_remind_me = %, to remind me

+traffic_remind_me_time = , to remind me

+traffic_limit_time_text = {0} Plan

+traffic_limit_time_h = {0} Hour(s) Plan

+traffic_limit_time_m = {0} Minute(s) Plan

+traffic_not_set_limited = Not set, click Settings

+

+echarts_used = Used

+echarts_left1 = Left

+echarts_alert = Alert

+echarts_alarm = Used(exceed alert)

+echarts_free = Left

+echarts_full = Exceed

+echarts_no = Not set

+

+3g = 3G

+wan = WAN

+connection_mode = Connection Mode

+wireless_access_device = Wireless Access Device

+cable_access_device = Cable Access Devices

+station_info_sub_title = All of wireless devices connected to this router will show on the page, including device name and MAC address

+station_info_desc = More access control options, please click here

+

+device_unit = &nbsp;

+ota_last_update_check = Last Update Time:

+main_ssid_num = Main SSID ({0})

+guest_ssid_num = Guest SSID ({0})

+wifi_slider_desc = * Drag the progress bar has adjusted the SSID maximum access number

+wif_guest_disabled = Guest SSID is disabled

+

+phone_number = Number

+equalToPin = The PINs you've entered do not match

+equalToPassword = The passwords you've entered do not match

+

+pppoe_mode_type_PPPOE = PPPoE

+pppoe_mode_type_STATIC = Static IP

+pppoe_mode_type_DHCP = Dynamic IP

+pppoe_mode_type_AUTO = Auto

+

+tsw_note = Awake Settings: When awake settings is enabled, device will automatically sleep; Wi-Fi will be unavailable.

+tsw_note_on = Wake-up Time: You can set the wake-up time.

+tsw_note_off = Sleep Time: You can set the sleep time.

+

+parent_control_note_kids = Kids Devices: Show Kids devices.

+parent_control_note_manage = Kids Management: Manage Kids devices.

+parent_control_note_time = Online Time Setting: Set online time for kids.

+parent_control_note_whitelist = Website Whitelist: Set website white list for kids to access websites.

+

+wan_note_dial = Dial-up Mode:

+wan_note_connection_mode = Please select network connection mode for your device:

+wan_note_connection_mode_pppoe = PPPoE: Access Internet. You may ask your network provider for PPPoE username and password.

+wan_note_connection_mode_dhcp =  Dynamic IP: Access Internet via dynamic IP address.

+wan_note_connection_mode_static = Static IP: Access Internet via static IP address. Please set IP address, subnet mask, default gateway, primary and secondary DNS.

+wan_note_user_name = User Name: Enter your PPPoE account.

+wan_note_password = Password: Enter your PPPoE password.

+wan_note_connection_mode_auto = AUTO: Access Internet via dynamic IP address or PPPoE. You may ask your network provider for PPPoE username and password.

+parent_control_note_siteName = The White List namecan''t contain following characters: < > [ ] * $ & : , ; " ' ` / \\ | ? ¥

+parent_control_note_siteLink = The white list link should start with "http://" or "https://".

+firewal_note = Note : Firewall''s related rule settings may not take effect immediately, need to wait for a few minutes or restart the device. If you need to take effect immediately, it is recommended to restart the device.

+

+wps_pin_validator = Please input a valid PIN number

+device_rename = Please input a valid name.

+

+turnoff_button = Turn Off Device

+others_turn_off= Turn Off Device

+turnoff_confirm  = Turn Off the device?

+turnoff = Turn Off...

+setting_no_change = Your settings did not change.

+Extend_accessDevice = The Max Station Number is not less than current access device number.

+

+TBcheck = Please input a value between 1 and 4095

+apn_pdptype_change_note = If the setting is changed,you may have a risk not to visit the Webpage by {0}. Then please try {1} to visit.

+apn_alert = This operation may restart the device. Continue any way?

+apn_alert_restart = The default APN settings are successful and the device is being restarted.

+apn_diconneted_network_confirm = This operation may disconnect from network, continue any way?

+

+#super

+super = Lock cell Settings

+lockCell_settings = Lock cell Settings

+v4_settings = Lock(V4 Encryption)

+cell_id1 = Cell Id 1

+cell_id2 = Cell Id 2

+cell_id3 = Cell Id 3

+cell_id4 = Cell Id 4

+cell_id5 = Cell Id 5

+v4_check = Invalid character, The character must be 0-9, a-z, A-Z

+v4_note = Your settings will take effect after restarting your device,Do you want to continue?

+

+export_title = Export settings

+band_3 = Band 3

+band_8 = Band 8

+band_38 = Band 38

+band_39 = Band 39

+band_40 = Band 40

+band_info = Band Settings

+cell_id = Current registration Cell

+cellid = CELLID

+lock_apply = Lock

+unlock_apply= Unlock

+sinr = SINR

+band_cell_settings = Band Cell Settings

+export = Export

+cell_not_correct= Not Lock Cell,Connected Fail!

+cell_id_lock = Locked Cell

+

+sip_uri_format = URI format

+user_name = User Name

+pin_v4_encrypt = PIN encrypt

+wep_cannot_2040 = When Current Security Mode of Main SSID or Guest SSID is OPEN (WEP) or SHARED, Channel Bandwidth can''t be 20MHz/40MHz!

+2040_cannot_wep = When Channel Bandwidth is 20MHz/40MHz, Current Security Mode of SSID can''t be OPEN (WEP) or SHARED.

+wifi_device_busy = Wi-Fi driver is busy, please wait...

+manufactory_code = Manufactory Code

+key_version_number = Key Version Number

+key_value = Key Value

+

+white_list = White List

+black_enable= Black list

+white_enable = White list

+mac_white_address = MAC Address

+max_white_list = The maximum number of white list is 6.

+LockCell_note1 =  Cell locking is for the LTE network community lock, the current registration area and locking the same cell allows network, currently registered residential and residential lock inconsistent when inhibit the initiation network.

+LockCell_note2 =  Residential lock to open and save the locking area not is empty, network community of the current registration of every boot and timing 8:00/14:00/20:00 ratio on the and locking area is the same, if different is broken network processing.

+mac_blank = MAC Address can''t be empty.

+

+vlan_switch = VLAN Switch

+vlan_notice = If you choose the Disable, it will take effect after restarting your device. Do you want to continue?

+vlan_notice2 = If you want to Enable this function, the Multi SSID Switch must be Enable. Do you want to open Multi SSID Switch and Enable this function?

+ap_hide = AP Hide

+

+urlparent = The end of URL can''t follow with /.

+not_change_mode = The device is setting parameters, please wait...

+#device

+device_status = Device Status

+device_status_0 = Decrypted

+device_status_1 = Encrypted

+

+######DDNS###########

+ddns = DDNS

+Hash value is empty = Hash value is empty!

+DDNS Provider is empty = DDNS Provider is empty!

+register successful = Register successful

+login error = Login error

+network error = Network error

+registering = Registering

+not registered = Not registered

+error registering = Error registering

+error = error

+ddns_set_mode = DDNS

+mode_set_mode_1 = Enable

+mode_set_mode_0 = Disable

+mode_select_auto = Auto

+mode_select_manual = Manual

+ddns_mode = DDNS Mode

+Auto = Auto

+Manual = Manual

+DDNS_Status = DDNS Status

+DDNSHashValue = Hash Value

+ddns_ProviderList = Dynamic DNS Provider

+ddns_account = Account

+ddns_passwd = Password

+ddns_domainName = Domain Name

+ddns_hashvalue_check = Invalid character, The character must be 0-9, a-z, A-Z or =

+ddns_note1 = You can set the dynamic domain name service to assign a fixed domain name for the dynamic IP WAN address.

+ddns_note2 = Dynamic DNS Provider: Set the server which will provide dynamic domain name service.

+ddns_note3 = Password: The pass-phrase contains: 0-9 a-z A-Z ! # $ * + , - . % : = ? @ [ ] ^ _ { | } ~ 

+ddns_note4 = Domain Name: Set the domain name you want to apply for.

+ddns_note5 = Hash Value: DDNS hash value, you need to fill in the Hash value when select the freedns server. It contains: 0-9 a-z A-Z 或 = 

+

+#########PING#########

+ping_diagnostics = PING diagnosis

+ping_times = PING times

+ping_url = URL or IP address

+ping_start = Start

+ping_end = End

+ping_clear = Clear

+ping_starting = Start diagnosis ...

diff --git a/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_zh-cn.properties b/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_zh-cn.properties
new file mode 100755
index 0000000..618bd46
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/i18n/Messages_zh-cn.properties
@@ -0,0 +1,1729 @@
+#menu 中文字符

+pc_version = PC版

+mobile_version = 手机版

+home = 首页

+phonebook = 电话本

+sms = 短信

+sd = SD卡

+setting = 设置

+status = 基本信息

+net_select = 找网方式

+dial_setting = 拨号设置

+apn_setting = APN设置

+wifi_advance = 高级设置

+management = 管理

+net_setting = 联网设置

+quick_setting = 快速设置

+

+device_info = 状态信息

+traffic_statistics = 流量统计

+traffic_alert = 流量管理

+

+wifi = Wi-Fi 设置

+wifi_basic = 基本设置

+device_setting = 设备设置

+sim = SIM卡侧

+device = 设备侧

+router_setting = 路由

+mac_filter = 无线MAC过滤

+

+wps = WPS

+sleep_mode = 省电

+lan = 局域网

+

+firewall = 防火墙

+system_security = 系统安全

+port_forward = 端口转发

+port_filter = 端口过滤

+fastboot = 快速开机

+display_password = 显示密码

+display_QR = 显示二维码

+cable = 有线

+wireless = 无线

+

+my_router = 网络设置

+net_surfing = 网络连接

+

+#validate

+phonenumbers_check = 最多可输入 5 个电话号码,并且用 ';' 将号码隔开

+required = 必填项

+remote = 请修正该字段

+url = 请输入有效的网址

+siteLink_check = 请输入有效的网址

+siteName_check = 请输入有效的网站名

+date = 请输入有效的日期

+dateISO = 请输入有效的日期 (ISO)

+number = 请输入有效的数字

+digits = 只能输入整数

+decimalRange = 请输入正数且小数位最多2位

+any_digits = 只能输入整数

+creditcard = 请输入有效的信用卡号

+equalTo = 请再次输入相同的值

+accept = 请输入拥有效后缀名的字符串

+maxlength = 最多输入 {0} 个字符

+minlength = 最少输入 {0} 个字符

+rangelength = 请输入一个长度介于 {0} 和 {1} 之间的字符串

+range = 请输入一个介于{0}和{1}之间的值

+max = 请输入一个最大为 {0} 的值

+min = 请输入一个最小为 {0} 的值

+ssid = 请输入有效的 SSID

+ssid_ap = 请输入有效的 SSID(无效字符包括 , ; " \)

+email_check = 请输入有效的邮箱

+ipv4 = 请输入有效的 IP 地址

+ipv6 = 请输入有效的 IPv6 地址

+name_check = 请输入有效的姓名

+phonenumber_check = 请输入有效的电话号码

+sms_service_center_check = 请输入有效的短信中心号码

+pin_check = 请输入 4 到 8 位的数字

+puk_check = 请输入 8 位数字

+password_check = 请输入有效的密码

+subnetmask_check = 无效的子网掩码

+dns_check = 无效的 DNS,DNS不能为255.255.255.255或0.0.0.0

+dhcp_check = DHCP 的 {0}IP 超出局域网子网范围

+start = 起始

+end = 结束

+dhcpCompare = 无效的 IP 地址,起始地址不能大于结束地址

+ipRange = IP 地址池不能包含局域网 IP 地址(DHCP 起始地址应该比局域网 IP 地址大)

+lanip_check = 请输入有效的 IP 地址

+ip_check = 请输入完整且有效的 IP 地址

+dmz_ip_check = 请输入有效的 IP 地址

+wps_pin_check = 无效的 PIN

+wps_pin_length_check = 请输入4位或8位数字

+browse_sdcard = 查看 SD 卡

+portCompare = 无效的端口范围

+comment_check = 无效字符

+check_file_path = 文件夹名称中包含无效的字符

+check_filefold_name = 文件夹名称中包含无效的字符: ` ~ # & * + | \ : ? / < > . " '

+apn_check = 请输入有效的 APN

+ppp_username_check = 请输入有效的用户名

+ppp_password_check = 请输入有效的密码

+unlock_code_check =  请输入正确的解锁码。解锁码只能输入 0-9、a-f、A-F,并且长度为 16 个字符

+apn_profile_name_check = APN 配置文件名称中包含无效的字符

+dlna_name_check = 设备名称只能输入 0-9、a-z、A-Z 或 _

+wifi_password_check = 请输入有效的密码

+wifi_wep_password_check = 请输入 5 或 13 位ASCII密钥,或者输入 10 或 26 位 Hex 密钥。

+range_except = 请输入有效值,有效范围:{0}-{1}。(32000-32007 的范围值除外)。

+

+#common

+copyright = Copyright &copy; 2010-2022 示例公司 版权所有

+enable=启用

+disable=关闭

+apply= 应用

+cancel = 取消

+clear = 清除

+reset = 重置

+add = 添加

+add_new = 新增

+save = 保存

+new = 新建

+view = 查看

+select = 选择

+edit = 编辑

+delete = 删除

+delete_all = 删除所有

+success_info = 成功

+error_info = 失败

+connect = 连接

+disconnect = 断开连接

+connected = 已连接

+disconnected = 已断开连接

+connecting = 正在连接…

+disconnecting = 正在断开连接…

+cancelconnect = 取消连接

+confirm = 确认

+prompt = 提示

+info = 信息

+alert = 提醒

+yes = 是

+no = 否

+ok = 确定

+back = 返回

+exit = 退出

+next_step = 下一步

+prev_step = 上一步

+next_page = &gt;&gt;

+prev_page = &lt;&lt;

+root = 根目录

+create = 创建

+speed = 速率

+upload = 上传

+download = 下载

+uploaded = 已上传

+downloaded = 已下载

+on = 打开

+off = 关闭

+need_login_again = 您的帐户已退出,请重新登录。

+modify = 更改

+content = 内容

+time = 时间

+processing = 处理中…

+saving = 保存中…

+deleting = 删除中…

+scanning = 状态:扫描中…

+dlna_scanning = 状态:扫描中…

+scanned = 状态:扫描结束。

+need_rescan = 状态: 需要重新扫描。

+sending = 发送中…

+creating = 创建中…

+uploading = 上传中…

+waiting = 请稍等…

+leave_page_info = 您有未保存的修改。您确定要继续吗?

+colon = :

+page = 页码:

+go = 跳转

+ALL = 全部

+open_source_licenses = 开放源代码许可

+vertical_bar = |

+

+#security

+security_policy = 安全策略

+security_mode = 安全模式

+security_mode_OPEN = OPEN

+security_mode_SHARED = SHARED

+security_mode_WPA2PSK = WPA2(AES)-PSK

+security_mode_WPAPSKWPA2PSK = WPA-PSK/WPA2-PSK

+security_mode_WPA3Personal = WPA3-Personal

+security_mode_WPA2WPA3 = WPA2(AES)/WPA3-Personal

+wpa = WPA

+pass_phrase = 密码

+

+#Station

+station_info = 接入设备

+station_number = 序号

+host_name = 主机名

+

+#Wifi Basic

+multi_ssid_enable = 多重网络名称开关

+multi_ssid_1 = 主SSID

+multi_ssid_2 = 副SSID

+multi_ssid_enable_confirm = 如果开启“多重网络名称”,Internet Wi-Fi 功能将会停用。您要继续吗?

+multi_ssid_enable_confirm2 = 如果开启“多重网络名称”,Internet Wi-Fi 功能将会停用。且已连接的 Wi-Fi 设备可能需要重连。您要继续吗?

+multi_ssid_max_access_number_alert = 主SSID 和 副SSID 的最大接入数之和不能超过 {0}!

+network_band_selection = 频段选择

+network_mode = 网络模式

+network_name = 网络名称(SSID)

+broadcast_network_name = SSID 广播

+country_region_code = 国家/地区 码

+frequency_channel = 信道

+rate = 速率

+max_station_number = 最大接入数

+wifi_basic_note = 点击“应用”时,任意已连接的 Wi-Fi 设备需要重新连接。

+wifi_disconnect_confirm = 所有已连接的 Wi-Fi 设备需要重连。您要继续吗?

+wifi_disconnect_confirm2 = 已连接的 Wi-Fi 设备可能需要重连。您要继续吗?

+network_mode_2 = 仅 802.11 n

+network_mode_4 = 802.11 b/g/n

+network_mode_5 = 仅 802.11 a

+network_mode_6 = 802.11 b/g/n/ax

+frequency_channel_0 = 自动

+frequency_channel_1 = (频道 1)

+frequency_channel_2 = (频道 2)

+frequency_channel_3 = (频道 3)

+frequency_channel_4 = (频道 4)

+frequency_channel_5 = (频道 5)

+frequency_channel_6 = (频道 6)

+frequency_channel_7 = (频道 7)

+frequency_channel_8 = (频道 8)

+frequency_channel_9 = (频道 9)

+frequency_channel_10 = (频道 10)

+frequency_channel_11 = (频道 11)

+frequency_channel_12 = (频道 12)

+frequency_channel_13 = (频道 13)

+frequency_channel_14 = (频道 14)

+frequency_channel_15 = (频道 15)

+frequency_channel_16 = (频道 16)

+frequency_channel_17 = (频道 17)

+frequency_channel_18 = (频道 18)

+frequency_channel_19 = (频道 19)

+frequency_channel_20 = (频道 20)

+frequency_channel_21 = (频道 21)

+frequency_channel_22 = (频道 22)

+frequency_channel_23 = (频道 23)

+frequency_channel_24 = (频道 24)

+frequency_channel_25 = (频道 25)

+frequency_channel_26 = (频道 26)

+frequency_channel_36 = (频道 36)

+frequency_channel_40 = (频道 40)

+frequency_channel_44 = (频道 44)

+frequency_channel_48 = (频道 48)

+frequency_channel_149 = (频道 149)

+frequency_channel_153 = (频道 153)

+frequency_channel_157 = (频道 157)

+frequency_channel_161 = (频道 161)

+frequency_channel_165 = (频道 165)

+rate_0 = 自动

+rate_1 = 1 Mbps

+rate_2 = 2 Mbps

+rate_3 = 5.5 Mbps

+rate_4 = 6 Mbps

+rate_5 = 6.5 Mbps

+rate_6 = 9 Mbps

+rate_7 = 11 Mbps

+rate_8 = 12 Mbps

+rate_9 = 13 Mbps

+rate_10 = 18 Mbps

+rate_11 = 19.5 Mbps

+rate_12 = 24 Mbps

+rate_13 = 26 Mbps

+rate_14 = 36 Mbps

+rate_15 = 39 Mbps

+rate_16 = 48 Mbps

+rate_17 = 52 Mbps

+rate_18 = 54 Mbps

+rate_19 = 58.5 Mbps

+rate_20 = 65 Mbps

+cannot_operate_when_wifi_connected = Wi-Fi 连接时无法进行该操作!

+network_mode_select_2 = 仅 802.11 n

+network_mode_select_3 = 802.11 b/g

+network_mode_select_4 = 802.11 b/g/n

+network_mode_select_6 = 802.11 b/g/n/ax

+network_modes_band_select_2 = 仅802.11 n

+network_modes_band_select_4 = 802.11 a/n

+network_modes_band_select_5 = 仅 802.11 a

+

+#net select

+auto_select = 自动

+manual_select = 手动

+auto_select_type_WCDMA_preferred = 自动

+auto_select_type_LTE_preferred = 自动

+auto_select_type_NETWORK_auto = 自动

+auto_select_type_Only_LTE = 仅4G

+auto_select_type_WCDMA_AND_LTE = 仅4G/3G

+auto_select_type_Only_WCDMA = 仅3G

+auto_select_type_TD_W = 仅3G

+auto_select_type_Only_GSM = 仅2G

+

+search = 搜索

+searching_net = 搜索中,请稍候...

+registering_net = 注册中,请稍候...

+network_list = 网络列表

+register = 注册

+auto = 自动

+unknown = 未知

+available = 可用

+current = 当前

+forbidden = 禁止

+net_select_note_automatic = 自动:该设备将会自动搜索可用网络。

+net_select_note_manual = 手动:将会手动搜索可用网络。

+net_status = 网络状态

+mccmnc = MCCMNC

+option = 选项

+networktype = 网络类型

+subnet = 制式

+

+#home

+ap_station_clear = 清空

+current_flux = 当前流量

+total_flux = 已用总流量

+connected_time = 持续时间

+flux_up = 上传速率

+flux_down = 下载速率

+traffic_current_connection = 当前连接

+traffic_current_month_data = 当月

+traffic_total_traffic = 已用总流量

+traffic_used_data_month = 本月流量使用情况:

+traffic_used_time_month = 本月上网时间:

+traffic_data_approximated = 流量仅供参考,建议向运营商查询以获得准确流量。

+traffic_used_month = 已用:

+traffic_left_month = 剩余:

+traffic_exceeded_month = 超出:

+traffic_total_month = 限额:

+traffic_apply_volume_limit = 流量管理

+traffic_data_limit_type = 套餐形式

+traffic_data = 流量

+traffic_time = 时间

+traffic_limit_data_month = 每月

+traffic_alert_when_data_reach = 提醒设置

+traffic_limit_time_month = 当月配额

+traffic_alert_when_time_reach = 提醒设置

+traffic_million_byte = MB

+traffic_percent = %

+traffic_limit_disconnect_msg = 您的流量/时间已经达到 {0}%,要断开网络连接吗?

+traffic_limit_connect_msg = 您的流量/时间已经达到 {0}%,要继续连接网络吗?

+traffic_limit_msg = 您的流量/时间已经达到 {0}%。

+traffic_beyond_disconnect_msg = 您的流量/时间已超出配额,要断开网络连接吗?

+traffic_beyond_connect_msg = 您的流量/时间已超出配额,要继续连接网络吗?

+traffic_beyond_msg = 您的流量/时间已超出配额。

+traffic_calibrate_note = 支持手动校准流量功能。如果页面流量统计与实际有偏差,您可以修改实际已用流量。

+traffic_note = 当已用流量/时间达到设置的百分比时提醒我。

+traffic_over_note = 当流量套餐单位为MB时,已使用流量的统计范围需小于4096TB。

+traffic_clear_confirm = 您确定要清除吗?

+traffic_not_support = 当前模式不支持此功能。

+

+#APN

+apn_currentApn = 当前 APN

+apn_mode = 模式

+apn_auto_apn = 自动

+apn_manual_apn = 手动

+apn_profile = 配置文件

+apn_profile_name = 配置文件名称

+apn = APN

+apn_ipv4_apn = IPv4 APN

+apn_ipv6_apn = IPv6 APN

+apn_dns_mode = DNS 模式

+apn_dns_mode_ipv4 = IPv4 DNS 模式

+apn_dns_mode_ipv6 = IPv6 DNS 模式

+apn_auto_dns = 自动

+apn_manual_dns = 手动

+apn_dns1 = DNS 1

+apn_dns2 = DNS 2

+apn_dns1_ipv4 = IPv4 DNS 1

+apn_dns2_ipv4 = IPv4 DNS 2

+apn_dns1_ipv6 = IPv6 DNS 1

+apn_dns2_ipv6 = IPv6 DNS 2

+apn_authentication = 鉴权方式

+apn_authentication_ipv4 = IPv4 鉴权方式

+apn_authentication_ipv6 = IPv6 鉴权方式

+apn_user_name = 用户名

+apn_user_name_ipv4 = IPv4 用户名

+apn_user_name_ipv6 = IPv6 用户名

+apn_password = 密码

+apn_password_ipv4 = IPv4 密码

+apn_password_ipv6 = IPv6 密码

+apn_pdp_type = PDP 类型

+set_default = 设为默认

+apn_save_profile_exist = 配置文件名称已存在,请选择其他名称。

+apn_delete_cant_delete_default = 无法删除默认配置文件。

+apn_delete_confirm = 确定删除?

+apn_cant_modify_status = 网络为 {0} 时无法更改当前的 APN 设置! 

+apn_cant_modify_current = 无法更改正在使用的 APN!

+apn_cant_delete_current = 无法删除正在使用的配置文件!

+apn_profile_full = 最多只能添加 {0} 项设置!

+dial_num = 拨号号码

+apn_no_select_alert = 请选择有效的配置文件!

+

+#Status bar

+network_status = 网络状态

+connection_status = 无线宽带连接状态

+rj45_connection_status = 有线宽带连接状态

+battery = 电量

+charging = 充电中

+sim_status = SIM卡状态

+sim_status_modem_waitpin = 无效的 SIM卡

+sim_status_modem_waitpuk = 无效的 SIM卡

+sim_status_modem_sim_undetected = 无效的 SIM卡

+sim_status_modem_undetected = 无效的 SIM卡

+sim_status_modem_imsi_waitnck = 无效的 SIM卡

+sim_status_modem_sim_destroy = 无效的 SIM卡

+sim_status_modem_destroy = 无效的 SIM卡

+sim_status_modem_init_complete = 有效的 SIM卡

+sim_status_modem_ready = SIM卡就绪

+wifi_status = Wi-Fi 状态

+wifi_status_on = Wi-Fi 开

+wifi_status_off = Wi-Fi 关

+wifi_status1 = 用户数:1

+wifi_status2 = 用户数:2

+wifi_status3 = 用户数:3

+wifi_status4 = 用户数:4

+wifi_status5 = 用户数:5

+wifi_status6 = 用户数:6

+wifi_status7 = 用户数:7

+wifi_status8 = 用户数:8

+wifi_status9 = 用户数:9

+wifi_status10 = 用户数:10

+enable_pin = 启用 PIN

+remaining_time = 剩余时间

+signal = 信号

+network_type = 网络类型

+network_type_limited_service = 服务受限

+network_type_no_service = 无服务

+network_provider = 运营商

+roaming_status = 漫游状态

+sim_status_ready = SIM卡就绪

+sim_status_waitpin = 等待输入 PIN

+sim_status_waitpuk = 等待输入 PUK

+sim_status_undetected = 未检测到 SIM卡

+sim_status_waitnck = 等待输入 NCK

+sim_status_destroy = SIM卡已损毁

+signal_strength = 信号强度

+signal_strength_label = 信号强度

+battery_level = 电量

+

+#dial_setting

+dial_note = WAN 连接状态

+dial_mode = 连接模式

+dial_mode_cpe = 拨号方式

+dial_roam_info = 您尚未开启漫游设置。要开启漫游功能,请到设置页面中勾选复选框。

+dial_setting_note_automatic = 自动:开机后,设备会自动连接到网络。

+dial_setting_note_manual = 手动:开机后,设备需要手动连接到网络。

+dial_roaming_remind = 勾选此项,您可以在漫游状态下连接到网络,且可能会产生额外费用。

+dial_roaming_connect = 设备处于漫游状态,连接网络会使您的资费增加。确定继续?

+

+#net_status

+net_info = 网络状态

+pci = PCI

+rsrp = RSRP

+rsrq = RSRQ

+plmn = PLMN

+band = BAND

+

+#phonebook

+search = 搜索

+save_location = 存储位置

+save_location_0 = SIM卡

+save_location_1 = 设备

+group_all = 全部

+group_null = -

+group_common = 普通

+group_family = 家人

+group_friend =  朋友

+group_colleague = 同事

+name = 姓名

+mobile_phone_number = 移动电话

+home_phone_number = 住宅电话

+office_phone_number = 单位电话

+mail = 邮箱

+group = 群组

+no_data_selected = 请选择一项!

+confirm_data_delete = 确定删除?

+confirm_pb_delete = 确定要删除所选联系人吗?

+too_many_data_selected = 选择电话号码过多,请选择一个电话号码!

+delete_fail_try_again = 删除失败,请重试。

+max_send_number = 最多输入 5 个电话号码!

+send = 发送

+send_sms = 发送短信

+new_message = 新短信

+send_numbers = 电话号码

+contents = 短信内容

+device_full = 设备的电话本存储空间已满!

+sim_full = SIM卡已满!

+phonebook_init_fail = 电话本初始化失败!<br/>请检查SIM卡并重启设备。

+sim_removed = SIM卡已被移除!

+change_device_to_sim_confirm = 可能会丢掉信息,是否需要继续转存?

+

+#SMS

+smslist = 设备侧短信

+sms_setting = 短信设置

+sim_messages = SIM侧短信

+refresh = 刷新

+forward = 转发

+draft = 草稿

+send_fail_try_again = 发送失败。

+sms_content_required = 请输入短信息内容。

+sms_contact_required = 请选择联系人。

+select_some_options = 最多可选择5位联系人

+select_an_option = 请选择一个选项

+chat_input_placehoder = 请在此输入信息

+sms_chat_input_confirm = 请按回车键或者用分号完成输入

+sms_capacity_will_full = 短信容量将满,请删除部分短信

+sms_capacity_is_full = 短信容量满,请删除部分短信

+sms_capacity_is_full_for_send = 短信容量满,请删掉部分短信以正常收发新信息。

+sms_capacity_will_full_just = 容量将满,您最多只能发送 {0} 条。

+sms_init_fail = 短信初始化失败!<br/>请检查SIM卡并重启设备。

+sms_resending = 正在重发短信...

+sms_resend_fail = 短信重发失败。

+sms_stop_sending = 停止发送

+sms_unread_count = 未读短信

+sms_delivery_report_1 = 短信已送达对方。

+sms_delivery_report_2 = 短信未送达对方。

+sms_delivery_report_3 = 正在发送短信...

+sms_report = 发送报告

+sms_cancel_sending = 取消中…

+sms_save_draft_success = 短信已存为草稿

+sms_save_draft_failed = 草稿保存失败

+sms_to_save_draft = 短信已修改,要存为草稿吗?

+sms_no_recipient = 您尚未选择收件人,该短信将被舍弃。

+phone_number_invalid = 电话号码无效

+sms_to = 接收人:

+confirm_sms_delete = 确定要删除所选信息吗?

+sms_save_tip = 保存草稿中...

+

+#login

+password = 密码

+puk = PUK

+login = 登录

+logout = 退出

+new_pin = 新 PIN

+confirm_pin = 确认新 PIN

+puk_locked = 您的 SIM卡已彻底锁定。请联系您的运营商。

+password_error = 密码不正确!

+password_error_left = 密码不正确!<br/>您的剩余尝试次数:{0}。

+password_error_account_lock = 你的账户被锁定。<br/>剩余时间:

+password_error_five_times = 您已经输错5次。请5分钟后再试。

+password_error_account_lock_time = 您的账户已被锁定。<br/>请稍后再试。

+enter_pin = SIM卡已锁,请输入 PIN码以解锁。

+enter_puk = SIM卡 PIN码已锁,请输入 PUK码以解锁。

+last_enter_pin = 最后尝试机会。如果再次错误,您的 SIM卡将被锁定!

+last_enter_puk = 最后尝试机会。如果再次错误,您的 SIM卡将会损毁!

+attempts_left = 剩余次数:

+pin_error = PIN码不正确!

+puk_error = PUK码不正确!

+confirm_logout = 您要注销吗?

+

+#advanced password

+password_management = 登录密码

+current_password = 当前密码

+new_password = 新密码

+confirm_password = 确认新密码

+current_password_error = 当前密码错误!

+password_note_info = 您可以在该网页更改登录密码。

+password_note_valid = 密码不能为空,且最多包含 32 个字符。

+password_note_input = 密码的有效字符包含:0-9 a-z A-Z ! # $ * + , - . % : = ? @ [ ] ^ _ { | } ~

+password_note_first_change = 请修改您的初始登陆密码!

+password_note_too_low = 您的密码复杂度太低(密码中可以包含大小写字母、数字、特殊字符,且不小于8位)。您要继续吗?

+

+#advanced pin

+pin = PIN

+current_pin = 当前 PIN

+pin_management = PIN码管理

+pin_status = PIN码状态

+modify_pin = 更改 PIN

+cannot_operate_when_connected = 网络连接时无法进行该操作!

+cannot_change_pin_when_connected = 网络连接时无法更改 PIN!

+pin_note_info = “PIN码管理”提供PIN保密设置功能,防止对SIM/USIM/UIM卡的非授权使用。如果要改变当前设置,请先断开网络。

+pin_note_operator = 启用PIN码后,下次启动设备时,需要输入PIN码;关闭PIN码后,下次启动设备时,不需要输入PIN码。

+pin_note_modify = 启用PIN码后,可修改PIN码。

+

+#lan

+lan_setting = 局域网接口设置

+ip_address = IP 地址

+subnet_mask = 子网掩码

+mac_address = MAC地址

+dhcp_server = DHCP服务

+dhcp_ip_pool = DHCP IP池

+dhcp_lease = DHCP租期

+hours = 小时

+minutes = 分钟

+lan_note = 新的设置会在设备重启后生效。

+lan_note_ip_address = IP 地址:路由器局域网的IP地址,使用该IP地址可以通过浏览器管理设备。

+lan_note_subnet_mask = 子网掩码:对应 IP 地址的子网掩码。

+lan_note_dhcp_server_enable = DHCP服务启用:如果开启DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)服务,设备将会为所连接的客户端自动分配IP地址。

+lan_note_dhcp_server_disable = DHCP服务关闭:如果关闭DHCP服务,设备将不会为连接的客户端自动分配IP地址,客户端必须手动输入IP地址。

+lan_note_dhcp_ip_pool = DHCP IP 池:起始IP地址和终止IP地址指定了DHCP服务器分配给接入设备的IP地址范围。这个范围之外的地址不能由DHCP服务器分配。

+lan_note_dhcp_lease_time = DHCP 租期时间:租期时间表示计算机获取IP地址后可以使用这个IP地址的期限,到达租期时间后,如果客户端需要继续使用这个地址,必须在到期前重新发起请求。只有当原来的客户端租期到期并且不再发起续租请求时,这个地址才能分配给其他客户端使用。

+lan_confirm_reopen = 您的设置将在设备重启后生效。您要继续吗?<br/><br/><i>注意:选择是,表示提交请求并重启设备。如果选择否,表示您放弃当前的选择。</i>

+lan_tip_staticip_notsame = 路由器局域网的IP地址不能与静态IP地址在同一个网段内!

+

+#sms_setting

+sms_validity = 有效期

+sms_validity_twelve_hours = 12 小时

+sms_validity_one_day = 1 天

+sms_validity_one_week = 1 周

+sms_validity_largest = 最长

+center_number = 中心号码

+delivery_report = 发送报告

+list = 列表

+

+#restore

+restore = 恢复出厂

+restore_title = 恢复出厂设置

+restore_button = 恢复出厂设置

+restore_confirm = 所有参数将恢复为出厂设置,设备会重启。确定继续?

+restore_when_connected = 请先断开 WAN 网络!

+restoring = 出厂设置恢复中

+restore_note_info = 点击“恢复出厂”以将所有设置还原为默认值,并且设备会自动重启。

+

+#wps

+wps_note_all = WPS(Wi-Fi Protected Setup)代表Wi-Fi保护设置,是一个简单且安全地建立无线网络的标准,您可以通过这一过程轻松地将无线客户端连接到设备,而无需进行任何具体的配置,例如SSID、安全模式和密码。

+wps_note_pin = PIN:您需要输入客户端的PIN码。

+wps_note_pbc = PBC:您可以在该网页选择PBC(Push Button Configuration)或者长按(3-4秒)设备上的WPS按键启用WPS功能。

+wps_note_wait = 该设备在 2 分钟内会等候接收无线接入客户端的访问请求。

+wps_pin = PIN

+wps_pbc = PBC

+wps_wifi_off = Wi-Fi 关闭时无法进行操作!

+wps_auth_open = 当前的加密类型不支持WPS。

+wps_on_info = WPS 已经启用,请稍后再试!

+wps_ssid_broadcast_disable = SSID 广播关闭时无法进行该操作!

+

+#sleep mode

+wifi_sleep = Wi-Fi 休眠设置

+wifi_sleep_mode = 省电模式

+sleep_time = 关机时间

+sleep_select_0 = 休眠

+sleep_select_1 = 关机

+sleep_mode_-1 = 从不休眠

+sleep_mode_5 = 5分钟

+sleep_mode_10 = 10分钟

+sleep_mode_20 = 20分钟

+sleep_mode_30 = 30分钟

+sleep_mode_60 = 1小时

+sleep_mode_120 = 2小时

+wifi_sleep_note_info = 关机时间:当在指定的时间内无 Wi-Fi 连接时,Wi-Fi 功能将会停用,系统会直接关机以节省电量。

+wifi_sleep_confirm = 当前设置改变时将会重启wifi,是否继续?

+

+#system security

+remote_management = 远程管理(通过 WAN 口)

+ping_from_wan = 从外网 PING 入

+

+#portforward

+protocol_TCP&UDP = TCP+UDP

+protocol_TCP = TCP

+protocol_UDP = UDP

+virtual_server_setting = 虚拟服务器设置

+port_forward_setting = 端口转发设置

+port_forward_list = 系统当前虚拟服务器

+port_forward_note_info = 配置端口转发以启用外部计算机,访问局域网提供的网络、FTP 或其他服务。

+port_forward_note_port = 端口范围:设置要转发的源端口数量。

+port_forward_note_ip_address = IP 地址:设置要转发的源 IP 地址。

+port_forward_note_protocol = 协议:设置用于转发的协议。

+port_forward_note_comment = 注释:输入用于转发设置的注释。有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ 。

+port_range = 端口范围

+protocol = 协议

+comment = 注释

+ipExam = (例如:192.168.0.101)

+rules_max = 规则数量已达最大值{0}。

+rule_exist = 规则已经存在。

+rule_max_note = 规则的最大数量为 10。

+rule_max_note_v4v6 = IPv4 或 IPv6 规则的最大数量为 10。

+

+rules_max_v4v6 =  {0}规则数量已达最大值{1}。

+rule_exist_v4v6 = {0}规则已经存在。

+

+#quick setting

+step_number_1 = 1

+step_number_2 = 2

+step_number_3 = 3

+step_number_4 = 4

+step_number_5 = 5

+step_number_6 = 6

+step_name_1  = 1.快速设置

+step_name_2  = 2.APN 设置

+step_name_3  = 3.PPP 鉴权

+step_name_4  = 4.SSID 配置

+step_name_5  = 5.安全配置

+step_name_6  = 配置如下

+step1_exp1 = 该向导帮助您安全设置网关基本参数:点击“上一步”和“下一步”进行导航;点击“应用”以保存设置。您也可以在其他菜单中设置高级参数。

+step1_exp2 = 在该向导中设置基本参数。您也可以在其他菜单中设置高级参数。

+apn_settings = APN 设置

+step2_auto_apn_explain = 如果您选择了“自动 APN”,将跳过第二步设置(PPP 鉴权)。

+step2_profile_name_explain = 配置文件名称:您当前使用的默认配置文件。

+ppp_authentication = PPP 鉴权

+step3_authentication_apn_explain1 = 鉴权方式:由您的互联网服务提供商 (ISP) 来提供。密码验证协议 (PAP) 不用加密就可以通过两次握手建立对端的身份。询问握手认证协议(CHAP)通过三次握手周期性的校验对端的身份。

+step3_authentication_apn_explain2 = 用户名:用于建立连接时,从互联网服务提供商获取验证。

+step3_authentication_apn_explain3 = 密码:用于建立连接时,从互联网服务提供商获取验证。

+step3_username_password_explain = 点击“设为默认”以将该配置文件设置为默认配置文件。

+ssid_title = SSID

+ssid_name = 网络名称 (SSID)

+ssid_broadcast = SSID 广播

+step4_ssid_explain = 网络名称:服务集标识符 (SSID)。输入无线局域网 (WLAN) 名称,最多 32 个字符。

+step4_ssid_broadcast_explain1 = SSID 广播:停用或启用(默认为启用)该功能。一旦启用该功能,路由器将会广播 SSID,其他设备将会发现该设备并进行连接。

+step4_ssid_broadcast_explain2 = 禁用:网关停止广播 SSID,在网络中隐藏您的网络名称。

+step5_encryption_mode_info = 安全模式:

+step5_encryption_mode_explain1 = OPEN:不进行验证以及加密。这可能会导致个人信息被拦截,或者网络被他人滥用,因此不推荐使用此方式。

+step5_encryption_mode_explain2 = WPA2(AES)-PSK:WPA2(AES)-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。

+step5_encryption_mode_explain3 = WPA-PSK/WPA2-PSK:WPA 预共享密钥 (WPA-PSK)。以纯文本 (ASCII) 密码的方式输入预共享密钥。WPA2-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。

+step5_encryption_mode_explain4 = 密码:密码的有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _  { | } ~

+step6_apply_explain = 一旦设置完成时,您需要重新连接无线网络。

+quick_setting_wifi_disable_confirm = 1、Wi-Fi 已关闭,与 Wi-Fi 相关的设置不会生效。<br\>要继续吗?

+quick_setting_param_changed_confirm = 1、Wi-Fi 配置更改后已连接的 Wi-Fi 设备可能需要重连。<br\>要继续吗?

+#SD Card

+sdcard = SD卡

+httpshare = HTTP 共享

+sd_card_mode = 模式

+sd_card_share_setting = 共享设置

+sd_card_share_usb_mode = USB

+sd_card_share_http_share_mode = HTTP 共享

+http_title = HTTP 共享设置

+sd_card_status = 状态

+sd_card_file_to_share = 共享文件

+sd_card_access_type = 访问类型

+sd_card_path_to_share = 路径共享

+sd_card_entire_sd_card = 整个SD卡

+sd_card_custom_setting = 自定义

+sd_card_read_write = 读/写

+sd_card_readonly = 只读

+sd_card_share_setting_no_sdcard = 无 SD卡!

+sd_card_share_setting_exist = 该文件或文件夹已经存在!

+sd_card_share_setting_noexist = 该文件或文件夹不存在!

+sd_card_status_info_0 = 无 SD卡!

+sd_card_status_info_1 = SD卡存在,现在可以使用了

+sd_card_status_info_2 = SD卡存在,但目前处于无效状态,请 5 秒后重试。如果无法使用,请检查 SD卡!

+sd_card_status_info_2_reason = 可能的原因如下

+sd_card_status_info_2_reason_1 = SD卡格式是NTFS,请切换至USB方式使用。

+sd_card_status_info_2_reason_2 = SD卡内容正在加载中,请5分钟后再试;如果仍然无效,请检查SD卡。

+sd_card_invalid_chars_cant_download = 文件名称中包含无效的字符,无法下载!(无效字符包括 < > " '' & + / \\ : * | # ? ~ `)。

+note_not_support_fs_ntfs = 在 HTTP 共享模式下,设备仅支持 FAT/FAT32 文件系统!

+note_web_share_mode = HTTP 分享模式:通过网络浏览器分享 SD 卡。此模式将会停用通过 USB 端口访问 SD 卡的可移动驱动器映射功能。

+note_usb_access = 仅通过 USB 访问:在可移动的驱动器映射模式下,用户仅能通过 USB 数据线来访问 SD 卡。共享的 SD 卡的网页将会停用。

+note_http_share_usb_access = 仅通过 USB 访问:在可移动的驱动器映射模式下,用户仅能通过 USB 数据线来访问 SD 卡。共享的 SD 卡的网页将会停用。

+note_http_share_cannot_access = 无法访问此页面!

+note_path_to_share_example = 路径共享:您可以输入共享路径,例如:/Picture。当仅输入斜线号“/”时,表示共享整个SD卡。

+note_upload_not_refresh = 当下载或者上传文件时,请不要刷新该网页!

+note_upload_single_file_2g = 单个文件上传最大支持2G。

+note_upload_filelenth_25 = 文件名、文件夹名称修改支持最长25个字符。

+note_uploading_not_refresh = 文件上传中,请不要刷新该页面!

+note_invalid_file_path = 路径共享不能为单独的小数点,也不能包含以下字符: < > " '' & + / \\ : * | # ? ~ `

+browse_btn = 浏览

+change_btn = 更改

+no_file_selected = 未选择文件

+sd_no_file_selected = 请选择一个文件

+sd_name = 名称

+sd_path = 路径:

+sd_rename = 重命名

+sd_download = 下载

+sd_file_size = 文件大小

+sd_update_time = 更新时间

+no_sdcard = 无 SD卡!

+no_exist = 文件不存在!

+sd_card_folder_name_is_null = 请输入名称

+get_file_list_failure = 获取文件列表失败

+create_folder_failure = 创建文件夹失败

+delete_folder_failure = 删除文件或文件夹失败

+sd_card_path_too_long = 文件路径过长。

+sd_file_size_too_big = 文件过大。单个文件上传最大支持2G。

+sd_file_name_invalid = 本设备不支持含有*号的文件名,请更新文件名。

+back_to_login = 返回登录

+sd_config_changed_reload = SD卡共享设置已改变,页面将重新加载。

+sd_upload_space_not_enough = SD卡空间不足!

+sd_upload_data_lost = 文件上传出现异常,请重试。

+sd_upload_file_is_downloading = 文件正在下载中,请稍候!

+sd_share_path_is_invalid = 共享路径无效,请重新设置

+sd_share_path_cant_rename = 文件夹已共享,无法重命名。

+sd_share_path_cant_delete = 文件夹“{0}”已共享,无法删除。

+sd_share_path_invalid = 共享路径失效。

+sd_file_processing_cant_delete = 文件正在被使用,无法删除。

+sd_file_processing_cant_rename = 文件正在被使用,无法重命名。

+sd_not_support = SD卡格式不支持或其它原因,请重新插入或更换SD卡。

+sd_usb_forbidden = SD卡正在被使用,无法切换。

+sd_upload_rename = 该文件已经存在!如需继续上传请修改文件名并选择“是”。选择“否”将取消上传。

+sd_upload_rename_null = 文件名不能为空或超过25个字符!

+

+#port filter

+filter_basic_setting = 基本设置

+port_filter_enabled = MAC/IP/端口过滤

+default_policy = 默认策略

+default_policy_note = 您可以设置防火墙策略以保护网络免受病毒、蠕虫和恶意网络行为的攻击。

+default_policy_note_filter = 过滤策略仅在启用过滤功能时可用。

+accepted = 放行

+dropped = 丢弃

+port_filter_setting = MAC/IP/端口过滤设置

+mac_address = MAC 地址

+macExam = (例如:00:1E:90:FF:FF:FF)

+dest_ip_address = 目的 IP 地址

+source_ip_address = 源 IP 地址

+port_filter_action = 操作

+filter_accept = 放行

+filter_drop = 丢弃

+protocol_None = 全部

+protocol_ICMP = ICMP

+port_filter_list = 系统当前 MAC/IP/端口过滤规则

+dest_port_range = 目的端口范围

+source_port_range = 源端口范围

+filter_accept_note = 其它数据包会被放行。

+filter_drop_note = 其它数据包会被丢弃。

+filter_optional = 请输入IP,MAC 或者端口值

+mac_check = 无效的 MAC 地址

+filter_ip_setting = IP设置

+filter_ipv4 = IPv4

+filter_ipv6 = IPv6

+ip_type = IP 类型

+source_ipv6_address = 源 IPv6 地址

+dest_ipv6_address = 目的 IPv6 地址

+port_filter_note_mac_address = MAC 地址:设置要过滤的 MAC 地址。

+port_filter_note_source_ip_address = 源 IP 地址:设置要过滤的源 IP 地址。

+port_filter_note_dest_ip_address = 目的 IP 地址:设置要过滤的目的 IP 地址。

+port_filter_note_protocol = 协议:设置用于过滤的协议。

+port_filter_note_source_port_range = 源端口范围:设置要过滤的源端口数量。

+port_filter_note_dest_port_range = 目的端口范围:设置要过滤的目的端口数量。

+port_filter_note_action = 操作:如果信息包与规则相符,可设置处理信息包。

+port_filter_note_comment = 注释:输入用于过滤设置的注释。有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ 。

+port_filter_note_info = 过滤策略同规则是一一对应的。如果与此条款相抵触,将不会继续同下列规则匹配。

+confirm_data_effect = 您的设置可能不会立即生效,如果需要全部生效,建议重启设备,是否继续?

+

+#wifi_range

+wifi_range_settings = Wi-Fi 性能设置

+wifi_range = Wi-Fi 覆盖范围

+wifi_short_mode = 近距离 Wi-Fi 范围 - 最佳电池续航

+wifi_medium_mode = 中距离 Wi-Fi 范围

+wifi_long_mode = 远距离 Wi-Fi 范围

+wifi_des_short_mode = 近距离 Wi-Fi 范围

+wifi_des_medium_mode = 中距离 Wi-Fi 范围

+wifi_des_long_mode = 远距离 Wi-Fi 范围

+wifi_range_note_range = Wi-Fi 范围:

+wifi_range_note_short =  近距离 Wi-Fi 范围:覆盖范围和发射功耗小,是最佳电池续航方案。

+wifi_range_note_medium = 中距离 Wi-Fi 范围:覆盖范围和发射功耗是设备支持能力的一半,正常耗电。

+wifi_range_note_long = 远距离 Wi-Fi 范围:设备最大发射功耗和覆盖范围,如果一直有终端接入,耗电会增加,减少电池续航。

+wifi_range_note_short_cpe =  近距离 Wi-Fi 范围:覆盖范围和发射功耗最小。

+wifi_range_note_medium_cpe = 中距离 Wi-Fi 范围:覆盖范围和发射功耗是设备支持能力的一半。

+wifi_range_note_long_cpe = 远距离 Wi-Fi 范围:设备最大发射功耗和覆盖范围。

+

+#upnp

+upnp = UPnP

+upnp_setting = UPnP 设置

+upnp_note_info = 通用即插即用 (UPnP) 是网络协议集。它允许电脑、打印机、互联网网关、Wi-Fi 接入点和移动设备之间在网络上更方便地进行互相搜索,并为数据共享、通信和娱乐建立功能性的网络服务。

+

+#dmz

+dmz = DMZ

+dmz_setting = DMZ 设置

+dmz_note_info = 如果终端设备无法通过该设备运行网络应用程序,请启用 DMZ,在输入框输入该终端设备的 IP 地址。

+dmz_note_function = 您可以在该网页配置 DMZ 地址、启用或停用 DMZ 功能。

+

+#Device Information

+max_access_num = 最大连接数

+lan_domain = 局域网域名

+sim_serial_number = SIM卡卡号

+software_version = 软件版本

+firmware_version = 固件版本

+hardware_version = 硬件版本

+imei = IMEI

+imsi = IMSI

+iccid = ICCID

+wan_ip_address = WAN IP 地址

+ipv6_wan_ip_address = WAN IPv6 地址

+network_name_ssid1 = 网络名称 (主SSID)

+pass_phrase_ssid1 = 密码 (主SSID)

+max_access_num_ssid1 = 最大连接数 (主SSID)

+network_name_ssid2 = 网络名称 (副SSID)

+pass_phrase_ssid2 = 密码 (副SSID)

+max_access_num_ssid2 = 最大连接数 (副SSID)

+

+#port map

+port_map = 端口映射

+port_map_basic = 基本设置

+port_map_setting = 端口映射设置

+source_port = 源端口

+dest_port = 目的端口

+port_map_list = 当前映射规则

+port_map_note_info = 配置端口映射以启用外部计算机,访问局域网提供的网络、FTP 或其他服务。

+port_map_note_port = 源端口/目的端口:提供服务的计算机端口。

+port_map_note_dest_ip_address = 目的 IP 地址:指定一台加入局域网的计算机以提供服务。

+port_map_note_protocol = 协议:由服务应用的协议。

+port_map_note_comment = 注释:输入用于端口映射规则的注释。有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ 。

+

+#USSD Info

+USSD = USSD

+ussd = USSD

+ussd_send_to = 发送

+ussd_send = 发送

+ussd_cancel = 取消

+ussd_reply_to = 回复

+ussd_reply = 回复

+ussd_contents = 内容

+ussd_timeout = 网络超时!

+ussd_operation_timeout = 操作超时!

+ussd_no_service = 无网络服务!

+ussd_retry = 操作失败!请重试!

+ussd_unsupport = 不支持 USSD 功能!

+ussd_info_error = 获取信息出错!

+ussd_fail = 操作失败!

+ussd_error_input = 输入有误!

+ussd_note1 = 您可以向网络发送一条指令(已预先制定的数字或者符号),网络将会根据指令给您提供相应的服务。

+

+#dlna setting

+dlna_setting = DLNA 设置

+dlna_language = 语言

+dlna_language_chinese = 中文

+dlna_language_english = 英文

+dlna_device_name = 设备名称

+dlna_media_type = 共享媒体类型

+dlna_media_info = 共享设置

+dlna_audio = 音乐

+dlna_image = 图片

+dlna_video = 视频

+dlna_rescan = 重新扫描

+dlna_note_info = 当 SD 卡可用或者 HTTP 共享模式启用时,您可以设置数字生活网络联盟 (DLNA)。

+dlna_note_httpshare = 您可以设置要在该网页上共享的数字媒体服务器 (DMS) 语言、设备名称和媒体类型。

+dlna_note_rescan = 为了使 DLNA 多媒体文件数据库与 SD 卡保持同步,建议重新扫描。

+

+#nosimcard

+no_sim_card_title = 系统信息

+no_sim_card_message = 没有 SIM卡或者 SIM卡无效!

+

+#network_locked

+network_locked = 网络被锁!

+network_locked_explain = 设备的网络被锁,请联系您的服务提供商获取解锁码。

+network_locked_times_explain = 解锁码输入剩余次数:

+network_locked_enter_explain = 请输入解锁码:

+network_locked_zero_times = 网络被锁,请联系您的服务提供商。

+

+#update_info

+update_info = 升级信息

+update_no_info = 当前已是最新版本

+update_new_version_found = 有新版本可用

+update_current_version = 当前版本

+update_new_version = 新版本

+update_link_prompt = 点击下面的链接下载升级工具

+update_skip_btn = 应用

+update_id_skip_info = 如果不想升级至此版本,请点击“跳过”按钮

+update_remind = 有新版本时提醒我。

+update_management = 更新管理

+update_log = 问题解决

+update_note = 备注

+update_notice = 发现新版本。通过“设置->设备设置->更新管理”查看详情。

+update_note_info = 点击链接以下载对应系统的更新工具。

+update_note_install = 解压更新工具并运行,进行版本更新。

+update_note_linux = Linux 系统不支持在线升级。如需升级,请在 Windows 系统或 Mac 上完成。

+update_status = 状态

+update_settings = 升级

+wifi_connect_alert = 您只能通过以太网升级。

+

+#AP_Station

+ap_station = Internet Wi-Fi

+ap_station_switch = Internet Wi-Fi 开关

+ap_station_wlan_mode = 首选网络

+ap_station_wifi_prior = Wi-Fi

+ap_station_3g_prior = WWAN

+ap_station_current_status = 当前状态

+ap_station_wlan_connected = Wi-Fi 已连接

+ap_station_wan_connected = WAN 已连接

+ap_station_no_connection = 无任何连接

+ap_station_hotspot_list = Wi-Fi 热点

+ap_station_connect = 连接

+ap_station_disconnect = 断开连接

+ap_station_add_hotspot = 添加 Wi-Fi 热点

+ap_station_edit_hotspot = 编辑 Wi-Fi 热点

+ap_station_show_password = 显示密码

+ap_station_encrypt_type = 加密方式

+ap_station_wep_keys = WEP密钥

+ap_station_encrypt_type_none = 不加密

+ap_station_encrypt_type_wep = WEP

+ap_station_wep_key_type_ascii = ASCII

+ap_station_wep_key_type_hex = HEX

+ap_station_cipher = WPA算法

+ap_station_cipher_TKIP = TKIP

+ap_station_cipher_AES = AES

+ap_station_cipher_AUTO = AUTO

+ap_station_security_mode_OPEN = OPEN

+ap_station_security_mode_WPAPSKWPA2PSK = WPA-PSK/WPA2-PSK

+ap_station_security_mode_SHARED = SHARED

+ap_station_security_mode_WPAPSK = WPA-PSK

+ap_station_security_mode_WPA2PSK = WPA2-PSK

+ap_station_security_mode_EAPAKASIM = EAP-AKA/SIM

+ap_station_security_mode_EAP-SIM/AKA = EAP-SIM/AKA

+ap_station_security_mode_WPA3Personal = WPA3-Personal

+ap_station_security_mode_WPA2WPA3 = WPA2(AES)/WPA3-Personal

+ap_station_wep_default_key = 网络密钥

+ap_station_wep_key = WEP密钥

+ap_station_wep_key_0 = 密钥 1

+ap_station_wep_key_1 = 密钥 2

+ap_station_wep_key_2 = 密钥 3

+ap_station_wep_key_3 = 密钥 4

+ap_station_exceed_list_max = 最多可添加 {0} 个热点!

+ap_station_search_hotspot_fail = 搜索热点失败!

+ap_station_connect_change_alert = WAN连接将断开,要继续吗?

+ap_station_update_fail = 操作失败,该热点处于连接状态。

+ap_station_enable_confirm = 当Internet Wi-Fi使用时多重网络名称不能使用。如果开启Internet Wi-Fi,多重网络名称将自动关闭,是否修改设置?

+ap_station_processing = 后台忙,请重试。

+ap_station_exist = 存在同名热点。

+ap_connect_error = 无法连接上热点 {0}!

+

+#fastboot

+fastboot = 快速开机

+fastboot_setting = 快速开机设置

+fastboot_note = 如果启用了快速开机功能,设备将花费较短的时间开机。

+

+#notes

+wifi_channel_bandwidth = 频带宽度

+

+home_note = 表格中显示了已连接的无线终端设备信息。

+

+sms_setting_note_validity = 有效期:设置外发短信的有效期。

+sms_setting_note_center_number = 中心号码:请输入短信中心号码。如需详情请联系您的服务提供商。

+sms_setting_note_delivery_report = 发送报告:当短信已送达收件人时,接收或者拒绝送达提示。

+

+apn_note_whole_page = 您可以在该网页设置接入点名称 (APN)。

+apn_note_mode = 模式:如果您的服务提供商向您提供了固定的 APN,请选择“手动 APN”。如果没有提供,请选择“自动 APN”,该设备将会自动获取参数。

+apn_note_profile = 配置文件:包含了一个或多个配置文件名称。

+apn_note_pdp_type = PDP 类型:IPv4/IPv6/IPv4&IPv6。

+apn_note_profile_name = 配置文件名称:有关您指定的新的配置文件的名称。

+apn_note_apn = APN:接入点名称。有效字符包含:0-9 a-z A-Z . - 且开头和结尾不能是 . 或者 - 。

+apn_note_dns_mode = DNS 模式:如果您的服务提供商向您提供了固定的 IP 地址,请选择“手动 DNS”,如果没有提供,请选择“自动 DNS”,该设备将会自动获取参数。

+apn_note_authentication = 鉴权方式:由您的互联网服务提供商 (ISP) 来提供。密码验证协议 (PAP) 不用加密就可以通过两次握手建立对端的身份。询问握手认证协议(CHAP)通过三次握手周期性的校验对端的身份。

+apn_note_username = 用户名:用于建立连接时,从互联网服务提供商处获取验证。

+apn_note_password = 密码:用于建立连接时,从互联网服务提供商处获取验证。

+apn_note_set_default = 点击“设为默认”以将该配置文件设置为默认配置文件。

+

+wifi_basic_note_multi_ssid_switch = 多重网络名称开关:可以同时使用 2 个网络名称。

+wifi_basic_note_network_name = 网络名称(SSID):SSID可以简单地理解为无线网络的名称。修改SSID时,请在本框中输入一个最多不超过32个字符的字符串,该字符串由数字、字母(a-z、A-Z)、特殊字符(!#()+-./%=?@^_{|}~)和空格,且开头和结尾不能是空格。

+wifi_basic_note_network_name_input = 网络名称的有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~ 和空格且开头和结尾不能是空格。

+wifi_basic_note_broadcast = SSID 广播:启用后,设备将会广播其无线网络标识(SSID)。这样附近的计算机或其他无线客户端即可搜索到本路由器的无线信号并连接到该设备。

+wifi_basic_note_security_mode = 安全模式:

+wifi_basic_note_no_encryption = OPEN:无数据加密。这可能会导致网络被他人滥用,因此不推荐使用此方式。

+wifi_basic_note_shared = SHARED(WEP):链路认证方式为共享密钥认证方式,加密方式为WEP加密。

+wifi_basic_note_wpa_psk_aes = WPA2(AES)-PSK: WPA2(AES)-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。

+wifi_basic_note_wpa_psk = WPA-PSK/WPA2-PSK:WPA 预共享密钥 (WPA-PSK)。WPA2-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。

+wifi_basic_note_wpa3 = WPA3-Personal:WPA2加密协议的升级版本。

+wifi_basic_note_wpa2_wpa3 = WPA2(AES)/WPA3-Personal: WPA2-PSK 是 Wi-Fi 网络安全存取 (WPA) 的安全保护版本,该版本施行了802.11i 无线安全标准。WAP3是WPA2加密协议的升级版本。

+wifi_basic_note_pass_phrase = 密码:密码的有效字符包含:0-9 a-z A-Z ! # ( ) + - . / % = ? @ ^ _ { | } ~

+wifi_basic_note_max_station_number1 = 最大接入数:通过本操作,可以选择连接到该设备的最大无线终端接入数。通过Internet Wi-Fi功能连接的Wi-Fi热点也属于该设备的无线终端接入设备。

+wifi_basic_note_max_station_number = 最大接入数:通过本操作,可以选择连接到该设备的最大无线终端接入数。

+

+wifi_advanced_note_whole_page = 您可以在该网页设置 Wi-Fi 高级字符。

+wifi_advanced_note_band_selection = 频段选择:您可以为您的设备选择合适的频段。

+wifi_advanced_note_network_mode = 网络模式:选择合适的无线网络模式,该设备的无线性能会提高。

+wifi_advanced_note_country_code = 国家/地区码:您可以为您的设备选择合适的国家/地区码。

+wifi_advanced_note_frequency = 信道:选择合适的频道来优化Wi-Fi网络性能和覆盖范围。

+

+ap_station_note_info = 请确保您所连接的 Wi-Fi 热点的IP地址段与本设备的IP地址段不在同一范围内,否则您将无法通过该 Wi-Fi 热点连接网络。

+ap_station_note_disable_info = 如果开启“多重网络名称”,Internet Wi-Fi 功能将会停用。

+ap_station_on_info = Internet Wi-Fi 功能启用时无法进行该操作!

+

+wif_filter_note1 = 无线局域网地址过滤规则设置。

+wif_filter_note2 = 无规则:不启用无线局域网地址过滤规则。

+wif_filter_note3 = 白名单:允许MAC地址列表中的用户通过无线网络与本设备连接。

+wif_filter_note4 = 黑名单:不允许MAC地址列表中的用户通过无线网络与本设备连接。

+

+#restart

+restart = 重启

+restart_button = 重启设备

+restart_confirm = 确定重启设备吗?

+restarting = 设备重启中

+

+#diconneted_operate_note

+diconneted_operate_note = 要更改当前设置,请断开网络连接。

+diconneted_network_confirm = 当前操作将会断开网络,是否继续?

+

+#ota_update

+ota_update = 更新管理

+ota_title = 更新 

+ota_no_new_version = 没有发现新版本。

+ota_new_version = 发现新版本,是否更新? 

+ota_connect_server = 正在连接服务器 

+ota_connect_server_successfully = 连接服务器成功  

+ota_downloading = 正在下载...  

+ota_download_failed = 下载失败  

+ota_no_network = 无网络  

+ota_network_disconnected = 请连接网络后更新! 

+ota_interrupted_alert = 发现新版本,请登陆后更新!

+ota_interrupted = 是否恢复上次被中断的下载任务?

+ota_download_success = 下载完成,设备将重启,请稍候。升级过程中请不要断电、恢复出厂设置或关机。

+ota_pkg_download_success = 升级包已存在,设备将重启,请稍候。升级过程中请不要断电、恢复出厂设置或关机。

+ota_update_success = 更新成功。 

+ota_update_failed = 更新失败。  

+ota_connect_server_failed = 无法连接到服务器  

+ota_download_warning = 请保持电量充足;请不要强制中断下载。 

+ota_update_warning = 注意事项:请不要强制中断更新。 

+ota_cancel = 更新已取消! 

+ota_pkg_exceed = 更新包太大! 

+ota_have_cancel = 你已经选择取消了! 

+ota_roamming = 您尚未开启漫游设置。要开启漫游功能,请勾选本页复选框。

+ota_low_battery = 下载成功,设备电量不足,请充电后再升级! 

+ota_pkg_low_battery = 升级包已存在,设备电量不足,请充电后再升级!

+ota_md5_error = 检测更新包失败。

+ota_version = 版本:

+ota_update_setting = 自动检测设置

+ota_auto_update_switch = 自动检测新版本 

+ota_update_interval_day = 自动检测周期  

+ota_roaming_setting = 漫游设置 

+ota_update_roaming_remind = 勾选此项后,设备将在漫游状态下进行更新,并且会产生漫游费用。

+ota_update_manual = 检测新版本  

+ota_check_new_version = 检测  

+ota_check_new_version_desc = 点击“检测”按钮,立即检测新版本。 

+ota_check_roaming_confirm = 当前处于漫游网络下,您确定要升级吗?

+ota_update_every_day = 每天  

+ota_update_15_day = 15天  

+ota_update_30_day = 30天  

+ota_new_version_checking = 新版本检测中...

+ota_update_running = 检测已经在进行...

+ota_check_fail = 检测新版本失败!

+ota_manual_upgrade_url = 升级文件下载地址

+wefota_check_new_version = 检测新版本并升级

+fota_package_downloading = 检测到新版本,正在下载中,下载完成后会开始升级,请不要断电、恢复出厂设置或关机

+fota_package_no_new_version = 没有检测到新版本

+fota_package_already_download = 升级包已下载,待设备重启后完成升级

+software_upload = 软件升级

+local_upload = 本地升级

+upload_update_success = 升级文件上传成功,即将重启,请勿断电。

+upload_update_failed0 = 文件解析失败。   

+upload_update_failed1 = 文件校验失败。   

+upload_update_failed2 = 文件写入失败。   

+upload_update_failed3 = 升级标志写入失败。

+upload_update_failed4 = Flash校验失败。

+error_file_selected = 请选择正确的升级文件

+upload_tip = 上传中,请勿关闭、刷新或多页面操作webui,直至重启。

+########CPE more wording##############

+opmode = 模式切换

+wds = WDS

+url_filter = URL过滤设置

+

+voip_settings = VoIP设置

+voip_user_details = 用户详情

+voip_advanced_settings = 高级设置

+voip_supplementary_service = 补充业务

+

+url_check = 无效的URL

+url_filter_check = 无效的URL过滤规则

+sntp_invalid_server_name = 无效的URL格式或者IP地址!

+server_alreay_exist = 该服务器已经存在!

+forwarding_uri_check = 无效值

+

+wifi_switch = Wi-Fi开关

+ap_isolation = AP 隔离

+#mac filter

+black_list = 黑名单

+black_list_switch = 黑名单开关

+block = 屏蔽

+black_list_max = 黑名单支持的最大个数是10!

+mac_repeat_tip = 请删除设置列表中重复的MAC地址!

+black_yourself_tip = 你不能屏蔽你自己!

+wifi_status11 = 用户数:11

+wifi_status12 = 用户数:12

+wifi_status13 = 用户数:13

+wifi_status14 = 用户数:14

+wifi_status15 = 用户数:15

+wifi_status16 = 用户数:16

+wifi_status17 = 用户数:17

+wifi_status18 = 用户数:18

+wifi_status19 = 用户数:19

+wifi_status20 = 用户数:20

+wifi_status21 = 用户数:21

+wifi_status22 = 用户数:22

+wifi_status23 = 用户数:23

+wifi_status24 = 用户数:24

+wifi_status25 = 用户数:25

+wifi_status26 = 用户数:26

+wifi_status27 = 用户数:27

+wifi_status28 = 用户数:28

+wifi_status29 = 用户数:29

+wifi_status30 = 用户数:30

+wifi_status31 = 用户数:31

+wifi_status32 = 用户数:32

+

+auto_connect = 自动连接

+manual_connect = 手动连接

+

+default_Gateway = 默认网关

+primary_dns = 首选 DNS

+secondary_dns = 备用 DNS

+gateway_check = 请输入有效的网关

+

+mac_filter_lable = MAC过滤规则

+

+wlan_mac_filter_0 = 无规则

+wlan_mac_filter_1 = 白名单

+wlan_mac_filter_2 = 黑名单

+black_enable= 黑名单

+white_list = 白名单

+white_enable = 白名单

+mac_white_address = MAC 地址

+max_white_list = 白名单最多只能添加6条。

+

+#SNTP

+local_current_time = 本地当前时间

+time_set_mode = 时间设置模式

+time_set_time_manual = 手动设置时间

+time_set_time_auto = 自动同步Sntp

+year = 年

+month = 月

+date = 日

+hour = 时

+minute = 分

+second = 秒

+sunday = 星期日

+monday = 星期一

+tuesday = 星期二

+wednesday = 星期三

+thursday = 星期四

+friday = 星期五

+saturday = 星期六

+stnp_server1 = SNTP 服务器1

+stnp_server2 = SNTP 服务器2

+stnp_server3 = SNTP 服务器3

+time_zone =  时区

+daylight_saving_time = 夏时制

+daylightsave_0 = 禁用

+daylightsave_1 = 启用

+sntp_syn_time_wan_connected = 联网后才可以使用sntp时间同步!

+operation_not_supported = 不支持该操作!

+network_terminated = 网络终止!

+upgrade_file_nomatch = 升级文件错误!

+upgrade_confirm = 您确认要升级吗?

+upgrading = 升级中,请稍等...

+upgrading_alert = 升级中,请勿切断电源。升级后,系统将会自动重启!

+upgrad_note = 请选择您要升级的版本,然后点击“应用”按钮后,开始升级。

+sntp_processing = 同步中,请稍等...

+sntp_req_success = 同步请求已发送!

+time_zone_<-12>12_0 = (GMT-12:00) 日界线西

+time_zone_SST11_0 = (GMT-11:00) 中途岛,萨摩亚群岛

+time_zone_<-10>10_0 = (GMT-10:00) 夏威夷

+time_zone_<-09>9_0 = (GMT-09:00) 阿拉斯加

+time_zone_PST8PDT,M3.2.0,M11.1.0_0 = (GMT-08:00) 太平洋时间(美国和加拿大),蒂华纳

+time_zone_<-07>7_0 = (GMT-07:00) 山地时间(美国和加拿大)

+time_zone_<-07>7_1 = (GMT-07:00) 亚利桑那

+time_zone_MST7MDT,M4.1.0,M10.5.0_2 = (GMT-07:00) 奇瓦瓦,拉巴斯,马扎特兰

+time_zone_<-06>6_0 = (GMT-06:00) 萨斯喀彻温

+time_zone_<-06>6_1 = (GMT-06:00) 中部时间(美国和加拿大)

+time_zone_<-06>6_2 = (GMT-06:00) 中美洲

+time_zone_<-06>6_3 = (GMT-06:00) 瓜达拉哈拉,墨西哥城,蒙特雷

+time_zone_<-05>5_0 = (GMT-05:00) 波哥大,利马,基多

+time_zone_<-05>5_1 = (GMT-05:00) 东部时间(美国和加拿大)

+time_zone_EST5EDT,M3.2.0,M11.1.0_2 = (GMT-05:00) 印第安纳州(东部)

+#time_zone_-4.5 = (GMT-04:30)

+time_zone_AST4ADT,M3.2.0,M11.1.0_0 = (GMT-04:00) 大西洋时间(加拿大)

+time_zone_<-04>4_1 = (GMT-04:00) 加拉加斯,拉巴斯

+time_zone_<-04>4<-03>,M8.2.6/24,M5.2.6/24_2 = (GMT-04:00) 圣地亚哥

+time_zone_NST3:30NDT,M3.2.0,M11.1.0_0 = (GMT-03:30) 纽芬兰

+time_zone_<-03>3_0 = (GMT-03:00) 巴西利亚

+time_zone_<-03>3_1 = (GMT-03:00) 布宜诺斯艾利斯,乔治敦

+time_zone_<-03>3_2 = (GMT-03:00) 格陵兰

+time_zone_<-02>2_0 = (GMT-02:00) 中大西洋

+time_zone_<-01>1_0 = (GMT-01:00) 佛得角群岛

+time_zone_<-01>1<+00>,M3.5.0/0,M10.5.0/1_1 = (GMT-01:00) 亚速尔群岛

+time_zone_GMT0IST,M3.5.0/1,M10.5.0_0 = (GMT) 格林威治标准时间:都柏林,爱丁堡,伦敦,里斯本

+time_zone_WET0WEST,M3.5.0,M10.5.0/3_1 = (GMT) 卡萨布兰卡,蒙罗维亚

+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_0 = (GMT+01:00) 阿姆斯特丹,柏林,伯尔尼,罗马,斯德哥尔摩,维也纳

+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_1 = (GMT+01:00) 贝尔格莱德,布拉迪斯拉发,布达佩斯,卢布尔雅那,布拉格

+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_2 = (GMT+01:00) 布鲁塞尔,哥本哈根,马德里,巴黎

+time_zone_CET-1CEST,M3.5.0,M10.5.0/3_3 = (GMT+01:00) 萨拉热窝,斯科普里,华沙,萨格勒布

+time_zone_<+01>-1_4 = (GMT+01:00) 中非西部

+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_0 = (GMT+02:00) 布加勒斯特

+time_zone_CAT-2_1 = (GMT+02:00) 哈拉雷,比勒陀利亚

+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_2 = (GMT+02:00) 赫尔辛基,基辅,里加,索非亚,塔林,维尔纽斯

+time_zone_EET-2_3 = (GMT+02:00) 开罗

+time_zone_EET-2EEST,M3.5.0/3,M10.5.0/4_4 = (GMT+02:00) 雅典,贝鲁特,伊斯坦布尔,明斯克

+time_zone_IST-2IDT,M3.4.5/02:00:00,M10.5.0/02:00:00_5 = (GMT+02:00) 耶路撒冷

+time_zone_<+03>-3_0 = (GMT+03:00) 巴格达

+time_zone_<+03>-3_1 = (GMT+03:00) 科威特,利雅得

+time_zone_<+03>-3_2 = (GMT+03:00) 莫斯科,圣彼得堡,伏尔加格勒

+time_zone_EAT-3_3 = (GMT+03:00) 内罗毕

+time_zone_<+0330>-3:30<+0430>,J80/0,J264/0_0 = (GMT+03:30) 德黑兰

+time_zone_<+04>-4_0 = (GMT+04:00) 阿布扎比,马斯喀特

+time_zone_<+04>-4_1 = (GMT+04:00) 巴库,第比利斯,埃里温

+time_zone_<+0430>-4:30_0 = (GMT+04:30) 喀布尔

+time_zone_<+05>-5_0 = (GMT+05:00) 叶卡捷琳堡

+time_zone_PKT-5_1 = (GMT+05:00) 伊斯兰堡,卡拉奇,塔什干

+time_zone_<+0530>-5:30_0 = (GMT+05:30) 马德拉斯,加尔各答,孟买,新德里

+time_zone_<+0545>-5:45_0 = (GMT+05:45) 加德满都

+time_zone_<+06>-6_0 = (GMT+06:00) 阿拉木图,新西伯利亚

+time_zone_<+06>-6_1 = (GMT+06:00) 阿斯塔纳,达卡

+time_zone_<+06>-6_2 = (GMT+06:00) 斯里哈亚华登尼普拉

+time_zone_<+0630>-6:30_0 = (GMT+06:30) 仰光

+time_zone_<+07>-7_0 = (GMT+07:00) 克拉斯诺亚尔斯克

+time_zone_<+07>-7_1 = (GMT+07:00) 曼谷,河内,雅加达

+time_zone_CST-8_0 = (GMT+08:00) 北京,重庆,香港特别行政区,乌鲁木齐

+time_zone_<+08>-8_1 = (GMT+08:00) 吉隆坡,新加坡

+time_zone_AWST-8_2 = (GMT+08:00) 珀斯

+time_zone_CST-8_3 = (GMT+08:00) 台北

+time_zone_<+08>-8_4 = (GMT+08:00) 伊尔库茨克,乌兰巴图

+time_zone_JST-9_0 = (GMT+09:00) 大阪,札幌,东京

+time_zone_KST-9_1 = (GMT+09:00) 汉城

+time_zone_<+09>-9_2 = (GMT+09:00) 雅库茨克

+time_zone_ACST-9:30ACDT,M10.1.0,M4.1.0/3_0 = (GMT+09:30) 阿德莱德

+time_zone_ACST-9:30_1 = (GMT+09:30) 达尔文

+time_zone_AEST-10_0 = (GMT+10:00) 布里斯班

+time_zone_<+10>-10_1 = (GMT+10:00) 弗拉迪沃斯托克

+time_zone_<+10>-10_2 = (GMT+10:00) 关岛,莫尔兹比港

+time_zone_AEST-10AEDT,M10.1.0,M4.1.0/3_3 = (GMT+10:00) 霍巴特

+time_zone_AEST-10AEDT,M10.1.0,M4.1.0/3_4 = (GMT+10:00) 堪培拉,墨尔本,悉尼

+time_zone_<+11>-11_0 = (GMT+11:00) 马加丹,所罗门群岛,新喀里多尼亚

+time_zone_<+12>-12_0 = (GMT+12:00) 奥克兰,惠灵顿

+time_zone_<+12>-12_1 = (GMT+12:00) 斐济,勘察加半岛,马绍尔群岛

+time_zone_<+13>-13_0 = (GMT+13:00) 努库阿洛法

+

+#operation mode

+opmode_auto = 自动模式

+opmode_bridge = 桥模式

+opmode_cable = 有线宽带模式

+opmode_gateway = 无线宽带模式

+EthPort_Status = 以太网端口状态

+change_mode = 选择模式

+current_mode = 当前模式:

+change = 改变

+change_mode_alert = 有线宽带模式只能使用Wi-Fi访问,请记住Wi-Fi SSID和密码!要继续吗?

+

+opmode_msg1 = 无线宽带模式下请将公网网线拔掉。

+opmode_msg2 = 改变工作模式后,设备会自动重启。

+#pppoe dial

+pppoe_mode = PPPoE

+pppoe_success = PPPoE拨号成功

+pppoe_fail = PPPoE拨号失败

+pppoe_processing = 正在进行PPPoE拨号

+static_success = 配置静态IP成功

+static_fail = 配置静态IP失败

+static_processing = 正在获取静态IP

+dyn_success = 动态获取IP成功

+dyn_fail = 动态获取IP失败

+dyn_processing = 正在获取动态IP

+pppoe_msg = 公网网线未连上

+pppoe_message_send_fail = 消息发送失败!

+ip_gate_not_same = IP地址和默认网关不可以相同!

+ip_innergate_not_same = IP地址和局域网的IP地址不可以在同一网段中!

+auto_success = 自动拨号成功

+auto_fail = 自动拨号失败

+auto_processing = 正在进行自动拨号

+#url filter

+url_filter_list = 当前系统的URL过滤规则

+url_filter_max = URL过滤规则最大数量为{0}

+url_repeated = URL已经存在。

+url_note1 = 您可以设置网页地址的过滤以过滤一些不良的网站(不支持https过滤)。

+url_note2 = URL:设置需要过滤的url地址。

+url_note3 = URL:最大长度为32。

+

+#wds

+wds_mode = WDS模式

+wds_mode_0 = 禁用

+wds_mode_1 = RootAP 模式

+wds_mode_2 = Bridge 模式

+wds_mode_3 = Repeater 模式

+repeater_ssid = Repeater SSID

+wpa_algorithms = WPA算法

+enable_wds_confirm = 如果开启WDS,那么Wi-Fi基本设置将被禁用,继续吗?

+#sys log

+sys_log = 系统日志

+log_setting = 日志设置

+syslog_mode_all = 所有

+syslog_mode_wan_connect = WAN Connect

+syslog_mode_sms = SMS

+syslog_mode_tr069 = tr069

+syslog_mode_voip = VoIP

+syslog_mode_dlna = DLNA

+syslog_mode_wlan = Wi-Fi

+syslog_mode_router = Router

+view_log = 查看日志

+log_info = 日志信息

+

+#add at 2013.6.20

+periodic_inform = 周期性通知

+periodic_inform_interval = 周期性通知间隔

+periodic_inform_time = 周期性通知时间

+certificate_import = 证书

+import_certificate_btn = 导入

+certificate_file_nomatch = 证书文件错误

+#voip setting

+outbound_mode = Outbound模式

+outbound_server = Outbound服务器

+outbound_port = Outbound端口

+stun_mode = STUN模式

+stun_server = STUN服务器

+register_every = 注册有效期

+advanced_options = 高级选项

+sip_port = SIP端口

+rtp_port = RTP端口

+voip_outbound_port_check = 无效端口

+voip_time_check = 注册时间无效

+timeRange = [1,3600]秒

+voip_sip_port_check = 无效端口

+voip_port_compare = 无效的端口范围

+warn_information = VoIP参数设置成功,请重新注册。

+#voip user details

+user_details_title = SIP服务器和配置

+sip_register_server = SIP注册服务器

+sip_domain = SIP域

+sip_realm = SIP范围

+sip_proxy_mode = SIP代理模式

+sip_proxy_server = SIP代理服务器

+authorization = 鉴权

+display_name = 显示名称

+authorized_user_name = 鉴权用户名

+authorized_password = 授权密码

+voip_register_status = VoIP注册状态

+register_failed = 注册失败

+register_success = 注册成功

+register_connecting = 注册连接中

+unregister = 注销成功

+deregister = 注销

+sip_domain_check = SIP域地址无效!

+sip_realm_check = SIP域无效!

+sip_proxy_server_check = 代理服务器无效!

+display_name_check = 显示名称无效!

+authorized_username_check = 鉴权用户名无效!

+account_password_check = 密码无效!

+#voip advanced settings

+sip_advanced_options = 高级选项

+adv_sip_t38 = T.38传真编码

+sip_dtmf = DTMF

+voip_sip_dtmf_method_inband = InBand

+voip_sip_dtmf_method_rfc2833 = RFC2833

+voip_sip_dtmf_method_sipinfo = SIPInfo

+sip_encoder = 编码

+voip_sip_encoder_method_0 = G.711 u-Law

+voip_sip_encoder_method_1 = G.711 a-Law

+voip_sip_encoder_method_2 = G.722

+voip_sip_encoder_method_3 = G.729

+voip_sip_encoder_method_4 = G.726-16kps

+voip_sip_encoder_method_5 = G.726-24kps

+voip_sip_encoder_method_6 = G.726-32kps

+voip_sip_encoder_method_7 = G.726-40kps

+sip_vad = VAD

+sip_cng = CNG

+#voip supplementary service

+sip_protocol_voip = VoIP补充业务

+sip_protocol_call_forw = 呼叫转移

+voip_forwarding_mode_1 = 无条件呼叫转移

+voip_forwarding_mode_2 = 遇忙转移

+voip_forwarding_mode_3 = 无应答转移

+voip_forwarding_mode_0 = 禁止所有转移

+sip_protocol_forw_uri = 发送URI

+show_msg = 请在电话上按'*80'!

+sip_protocol_incoming_call = 免扰功能

+sip_protocol_call_waiting = 呼叫等待

+wds_note = WDS:无线分布式系统

+#voip user details

+connect_note = 请先连接网络,再使用VOIP功能!

+#fota

+upgrade_pack_fix_success = 升级成功!

+upgrade_pack_fix_failed = 升级失败!

+have_new_version = 发现新版本,设备将升级。

+upload_file = 文件上传中!

+update_status_error = 获取更新状态文件失败,无法升级!

+verify_error = 校验文件失败,无法升级!

+start_update = 校验升级文件成功,正在升级中,请不要断电、恢复出厂设置或关机!

+

+######key same value different###########

+dmz_note_info = 如果终端设备无法通过该设备运行网络应用程序,请启用 DMZ,在输入框输入该终端设备的 IP 地址。

+dlna_note_info = DLNA: 数字生活网络联盟。

+dlna_note_httpshare = 您可以设置要在该网页上共享的数字媒体服务器 (DMS) 设备名称和媒体类型。

+#############串口转网口###################

+switch_port_title = 网口转串口

+open_serial_port = 开启网口转串口

+close_serial_port = 关闭网口转串口

+switching = 转换中...

+##############定时重启功能wording###################

+restart_schedule = 定时重启

+enable_reboot_switch = 启动定时重启功能

+restart_schedule_time = 定时重启时间

+enable_reboot_byday = 按天自动重启

+enable_reboot_byweek = 按周自动重启

+enable_reboot_bymonth = 按月自动重启

+synchronized = 已同步

+unsynchronized = 未同步

+week = 星期

+eyeryday = 每日

+login_password_length_check = 请输入至少4位字符。

+system_time_not_syn = 系统时间未同步!

+fota_note1 = 您可以为您的设备设置自动检测周期,使设备定时自动检测是否有新版本的软件。

+local_note = 您可以选择本地电脑中的升级文件,将设备软件升级到选中的版本,完成系统修复和优化。

+

+#new word

+modify_password = 登录设置

+

+#家长控制

+parental_control = 家长控制

+pc_children_group = 儿童组设备

+pc_children_group_manage = 儿童组管理

+pc_manage = 管理

+pc_no_children_device = 没有设置儿童组设备

+pc_children_group_desc = 添加到儿童组的所有设备将受到上网规则的限制

+pc_edit_host_name = 修改主机名:

+pc_internet_rule = 上网规则

+pc_time_limited = 上网时间设置

+pc_site_white_list = 网站白名单

+pc_manage_children_group = 管理儿童组设备

+pc_current_attached_devices =当前接入设备

+pc_action = 操作

+pc_remove = 移除

+pc_remove_all = 移除所有

+pc_add = 添加

+pc_leave = 离开

+pc_add_white_site = 添加白名单

+pc_in_child_group = 已在儿童组

+pc_forbid_time = 禁止上网时段

+pc_allow_time = 允许上网时段

+pc_setting_desc =可用鼠标点按设置禁止或允许上网时段

+pc_name = 网站名

+pc_link = 链接

+pc_not_save = 数据还未保存,请注意保存。

+pc_link_exist = 链接已存在!

+no_data = 没有数据

+sun = 周日

+mon = 周一

+tues = 周二

+wed = 周三

+thur = 周四

+fri = 周五

+sat = 周六

+

+#定时休眠唤醒

+tsw_settings = 定时休眠唤醒设置

+tsw = 定时休眠唤醒

+time_sleep_wake_up = 定时休眠唤醒设置

+tsw_timer_on = 定时唤醒时间

+tsw_timer_off = 定时休眠时间

+tsw_sys_time_mode_alert = 请先连接网络,使SNTP同步服务器时间后即可设置。

+tsw_time_interval_alert = 时间间隔不得小于10分钟。

+

+#new wording

+advanced_settings = 高级设置

+others = 其他

+others_restart_reset = 重启与复位

+others_note_info = 当重启或复位路由器后,你需要重新登陆

+

+pwd_sub_title = 管理你的无线路由器有关信息

+pwd_note = 当你登陆无线路由器时,需要输入此密码(不同于你的无线网络密码)

+current_network = 当前网络

+

+wifi_wireless_settings = Wi-Fi设置

+wifi_main_sub_title = 建立你的无线热点,以供手机或笔记本等无线设备上网使用

+wifi_broadcast_desc = SSID 广播

+wifi_isolated_desc = 将所有的无线客户端设备完全隔离

+

+detail_info = 详细信息

+sd_u_share = U盘共享

+

+settings_wireless = 设置无线内网

+settings_internet = 设置外网连接

+not_connect_network = 未连接网络

+

+traffic_data_plan = 流量统计

+traffic_pie_title = 流量套餐

+traffic_sub_title = 您可以在该页面创建流量计划、查询已用流量及剩余流量

+traffic_used = 已使用

+traffic_used_text = {0} 已使用

+traffic_limit_data = 流量套餐

+traffic_limit_data_text = {0} 流量套餐

+traffic_alert_reach_text = 当达到{0}%,{1} 时提醒我

+traffic_data_left_text = {0} 剩余

+traffic_when = 当达到

+traffic_remind_me = %,时提醒我

+traffic_remind_me_time = ,时提醒我

+traffic_limit_time_text = {0}套餐

+traffic_limit_time_h =  {0} 小时套餐

+traffic_limit_time_m =  {0} 分钟套餐

+traffic_not_set_limited = 未设置流量套餐,点按设置

+

+echarts_used = 已使用

+echarts_left1 = 未使用

+echarts_alert = 提醒值

+echarts_alarm = 已使用(超出提醒值)

+echarts_free = 未使用

+echarts_full = 流量超出

+echarts_no = 未设置

+

+3g = 3G

+wan = WAN

+connection_mode = 联网模式

+wireless_access_device = 无线接入设备

+cable_access_device = 有线接入设备

+station_info_sub_title = 本页面显示了连接到本路由器的所有无线终端,其中包括无线终端的设备名称、MAC(介质访问控制)地址

+station_info_desc = 更多的权限控制选项,请查看

+

+device_unit = 台

+ota_last_update_check = 最后更新时间:

+main_ssid_num = 主 SSID ({0})

+guest_ssid_num = 副 SSID ({0})

+wifi_slider_desc = * 拖动进度条已调整各SSID最大可接入数量

+wif_guest_disabled = 副SSID 没有开启

+

+phone_number = 号码

+equalToPin = 两次输入的PIN码不一致

+equalToPassword = 两次输入的密码不一致

+

+pppoe_mode_type_PPPOE = PPPoE

+pppoe_mode_type_STATIC = 静态IP

+pppoe_mode_type_DHCP = 动态IP

+pppoe_mode_type_AUTO = 自动

+

+tsw_note = 定时休眠唤醒功能,当定时休眠唤醒功能打开时,设备将进入休眠状态,此时设备的Wi-Fi功能将会自动关闭。

+tsw_note_on = 定时唤醒时间:您可以设置设备唤醒时间。

+tsw_note_off = 定时休眠时间:您可以设置设备定时休眠时间。

+

+parent_control_note_kids = 儿童组设备:显示当前儿童组设备。

+parent_control_note_manage = 儿童组管理:管理儿童组设备,您可以从当前连接设备列表添加儿童组设备。

+parent_control_note_time = 上网时间设置:设置儿童上网时间规则,即允许儿童设备上网的时间。

+parent_control_note_whitelist = 网站白名单:设置网站白名单,即允许儿童设备访问的网站。

+parent_control_note_siteName = 白名单网站名不能包含以下字符: < > [ ] * $ & : , ; " ' ` / \\ | ? ¥

+parent_control_note_siteLink = 白名单链接输入时请以“http://”或“https://”开头。

+firewal_note = 注意:防火墙相关的规则设置,可能不会立即生效,需等待几分钟或重启设备,如需立即生效,建议重启设备。

+

+wan_note_dial = 拨号方式:

+wan_note_connection_mode = 请为您的设备设置合适的网络连接方式:

+wan_note_connection_mode_pppoe = PPPoE:通过PPPoE方式接入外网,您需要向您的运营商咨询PPPoE用户名和密码。

+wan_note_connection_mode_dhcp =  动态IP:通过动态IP地址方式接入外网。

+wan_note_connection_mode_static = 静态IP:通过设置静态IP地址的方式接入外网,您需要设置IP地址、子网掩码、默认网关、首选DNS及备用DNS。

+wan_note_user_name = 用户名:填写您的PPPoE帐号。

+wan_note_password = 密码:填写您的PPPoE密码。

+wan_note_connection_mode_auto = 自动:自动选择动态IP或PPPoE方式接入外网,您需要向您的运营商咨询PPPoE用户名和密码。

+

+wps_pin_validator = 请输入有效的PIN码

+device_rename = 请输入有效的名称。

+

+turnoff_button = 关机

+others_turn_off = 关机

+turnoff_confirm  = 确定关机吗?

+turnoff = 关机中...

+setting_no_change = 您的设置未发生变化。

+Extend_accessDevice = WIFI最大接入数不能小于当前接入设备数。

+TBcheck = 请输入一个介于1和4095之间的值。

+apn_pdptype_change_note = 如果该设置被改变,通过域名 {0} 访问Web页面可能存在打不开的风险,这时候请尝试 {1} 来访问。

+apn_alert = 当前操作将会重启设备。是否继续?

+apn_alert_restart = 默认APN设置成功,设备正在重启。

+apn_diconneted_network_confirm = 当前操作将会断开网络,是否继续?

+

+#super

+super = 锁小区设置

+lockCell_settings = 锁小区设置

+v4_settings = 机卡互锁 (V4 加密)

+

+cell_id1 = Cell Id 1

+cell_id2 = Cell Id 2

+cell_id3 = Cell Id 3

+cell_id4 = Cell Id 4

+cell_id5 = Cell Id 5

+

+v4_check = 无效字符,只能输入 0-9、a-z、A-Z

+v4_note = 您的设置将在设备重启后生效,您要继续吗?

+export_title = 导出设置

+band_3 = 频段 3

+band_8 = 频段 8

+band_38 = 频段 38

+band_39 = 频段 39

+band_40 = 频段 40

+band_info = 频段设置

+cell_id = 当前注册的小区

+cellid = CELLID

+lock_apply = 加锁

+unlock_apply= 解锁

+band_cell_settings = 频段小区设置

+export = 导出

+sinr = SINR

+cell_not_correct = 非锁定小区,联网失败!

+cell_id_lock = 已锁定的小区

+

+sip_uri_format = URI 模式

+user_name = 用户名

+pin_v4_encrypt = PIN 加密

+wep_cannot_2040 = 当主SSID或者副SSID的安全模式是OPEN (WEP)或者SHARED的时候,频带宽度不能是20MHz/40MHz!

+2040_cannot_wep = 当频带宽度是20MHz/40MHz的时候,SSID的安全模式不能为OPEN (WEP)或者SHARED。

+wifi_device_busy = Wi-Fi驱动繁忙中,请稍等...

+v4_settings = 机卡互锁 (V4 加密)

+manufactory_code = 厂商代码

+key_version_number = 密钥版本号

+key_value = 密钥值

+

+LockCell_note1 =  锁小区功能是用于对LTE网络的小区锁定,当前注册小区与锁定小区一致时允许联网,当前注册小区与锁定小区不一致时禁止发起联网。

+LockCell_note2 =  锁定小区功能开启且保存的锁定小区不为空时,每天开机和定时(8:00/14:00/20:00)比对当前注册的网络小区与锁定小区是否相同,如果不同则做断网处理。

+mac_blank = MAC地址不能为空

+

+vlan_switch = VLAN开关

+vlan_notice = 如果您要停用该功能,重启后才生效。请问您是否继续?

+vlan_notice2 = 如果您要开启该功能,多重网络名称开关必须是开启状态。请问您是否开启多重网络名称开关并开启VLAN功能?

+ap_hide = AP隐藏

+

+urlparent = 主域名后面不能再跟随以/开始的内容。

+not_change_mode = 设备正在后台配置相关参数,请稍后尝试

+

+

+#device

+device_status = 设备加密状态

+device_status_0 = 已解密

+device_status_1 = 未解密

+

+######DDNS###########

+ddns = DDNS

+Hash value is empty = Hash 值为空!

+DDNS Provider is empty = DDNS 服务器为空!

+register successful = 注册成功

+login error = 登陆错误

+network error = 网络错误

+registering = 正在注册

+not registered = 未注册

+error registering = 注册失败

+error = 错误

+ddns_set_mode = DDNS

+mode_set_mode_1 = 启用

+mode_set_mode_0 = 禁用

+mode_select_auto = 自动

+mode_select_manual = 手动

+ddns_mode = DDNS 模式

+Auto = 自动

+Manual = 手动

+DDNS_Status = DDNS 状态

+DDNSHashValue = Hash 值

+ddns_ProviderList = 动态DNS服务器

+ddns_account = 用户

+ddns_passwd = 密码

+ddns_domainName = 域名

+ddns_hashvalue_check = 无效字符,只能输入 0-9、a-z、A-Z 或 =

+ddns_note1 = 您可以设置动态域名服务,为动态WAN IP地址分配一个固定域名。

+ddns_note2 = 动态DNS服务器:设置提供动态域名服务的服务器。

+ddns_note3 = 密码:密码的有效字符包含:0-9 a-z A-Z ! # $ * + , - . % : = ? @ [ ] ^ _ { | } ~ 

+ddns_note4 = 域名:设置要申请的域名。

+ddns_note5 = Hash 值:DDNS哈希值,在使用freedns服务器的时候需要。有效字符包含:0-9 a-z A-Z 或 = 

+

+##############ping 诊断##################

+ping_diagnostics = PING 诊断

+ping_times = PING 次数

+ping_url = URL 或者 IP 地址

+ping_start = 开始

+ping_end = 结束

+ping_clear = 清除结果

+ping_starting = 开始诊断...

diff --git a/lynq/MD310EU/ap/app/zte_webui/index.html b/lynq/MD310EU/ap/app/zte_webui/index.html
new file mode 100755
index 0000000..f64166a
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/index.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html>

+<html>

+<head>

+<meta charset="UTF-8"/>

+<meta name="renderer" content="webkit"/>

+<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/>

+<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>

+<meta http-equiv="Pragma" content="no-cache"/>

+<meta http-equiv="Expires" content="0"/>

+<title></title>

+<script type="text/javascript">

+document.write("<link rel='stylesheet' type='text/css' href='css/csn.css?random=" + Math.random() + "' />");

+document.write("<link rel='stylesheet' type='text/css' href='css/bt_strp.css?random=" + Math.random() + "' />");

+document.write("<link rel='stylesheet' type='text/css' href='css/com.css?random=" + Math.random() + "' />");

+</script>

+<link href="favicon.ico" rel="shortcut icon" />

+<!--[if lt IE 9]>

+<script type="text/javascript">

+document.write("<script type='text/javascript' rc='js/3rd/html5shiv.js?random=" + Math.random() + "'></s" + "cript>");

+document.write("<script type='text/javascript' rc='js/3rd/respond.js?random=" + Math.random() + "'></s" + "cript>");

+</script>

+<![endif]-->

+</head>

+<body>

+<div class="container" id="topContainer">

+    <div id="langLogoBar" class="row">

+        <div class="col-xs-4">

+            <a href="index.html" style="display: none;">

+			<script type="text/javascript">

+			document.write("<img src='pic/res_logo_web.png?random=" + Math.random() + "' />");

+			</script>

+            </a>

+            <!--span class="center-block" id="webui_title"></span-->

+        </div>

+        <div id="statusBar" style="display: none;" class="col-xs-8 text-right">

+            <span id="networkType" title="network_type" i18n="true" data-bind="text: networkType" class="statusItem"></span>

+            <span id="operator" title="network_provider" i18n="true" data-bind="text: networkOperator" class="statusItem"></span>

+            <span id="OTA" title="ota_title" i18n="true" data-bind="visible:isShowFotaNewversionIcon()" class="statusItem">

+                <a onclick="return showOTAAlert();">

+				<script type="text/javascript">

+				document.write("<img src='pic/res_update.gif?random=" + Math.random() + "' class='paddingbottom6' />");

+				</script>

+                </a>

+            </span>

+            <span id="signal_strength" title="signal_strength" i18n="true" class="statusItem"><i data-bind="attr:{'class': signalCssClass}" class="signal">&nbsp;</i></span>

+            <span id="connection_status" title="connection_status" i18n="true" class="statusItem"><i data-bind="attr:{'class': connectionCssClass}" class="icon_connection">&nbsp;</i></span>

+            <span id="rj45_connection_status" title="rj45_connection_status" i18n="true" data-bind="visible: isShowRj45ConnectionIcon" class="statusItem"><i data-bind="attr:{'class': rj45ConnectionCssClass}" class="icon_connection">&nbsp;</i></span>

+            <span id="sms_unread_count" title="sms_unread_count" i18n="true" data-bind="visible: smsUnreadCount() > 0 || showSmsDeleteConfirm()" style="display: none; position: relative;" class="statusItem">

+                <a onclick="return gotoSmsList();" href="javascript: void(0)">

+					<script type="text/javascript">

+					document.write("<img data-bind='visible: smsUnreadCount() > 0 && !showSmsDeleteConfirm()' src='./pic/msg_unread.png?random=" + Math.random() + "' class='paddingbottom6'/>");

+					document.write("<img data-bind='visible: showSmsDeleteConfirm()' src='./pic/msg_full.gif?random=" + Math.random() + "' class='paddingbottom6'/>");

+					</script>

+                    <sup data-bind="visible: smsUnreadCount() > 0, text: smsUnreadCount" class="smsUnreadCount"></sup>

+                </a>

+            </span>

+            <span id="statusItemSimStatus" title="sim_status" i18n="true"  class="statusItem"><img data-bind="attr: {src: simStatus}" class="paddingbottom6"/></span>

+            <span id="roamingStatus" title="roaming_status" i18n="true" data-bind="visible: roamingStatus() == 'R'" style="display: none;" class="statusItem">

+			<script type="text/javascript">

+			document.write("<img src='./pic/res_roaming.png?random=" + Math.random() + "' class='paddingbottom6'/>");

+			</script>			

+			</span>

+            <span id="wifi_status" title="wifi_status" i18n="true" data-bind="visible: hasWifi" class="statusItem">

+                <!--img class="paddingbottom6" id="wifi_status_img" data-bind="attr: {src: wifiStatusImg}"/-->

+                <i class="wifi_status" data-bind="attr:{'class': wifiStatusCssClass}">&nbsp;</i>

+            </span>

+            <span title="battery_level" i18n="true" data-bind="visible: hasBattery" class="statusItem"><img id="batteryCharging" data-bind="attr: {src: batteryPers}" class="paddingbottom6"/></span>

+        </div>

+    </div>

+    <div id="manageBar" class="row">

+        <div id="manageContainer" class="col-xs-12 text-right">

+            <span id="logout">

+                <a data-trans="modify_password" href="#pwd_mode" data-bind="visible:showLogout()" class="margin-right-10"></a>

+                <a id="logoutlink" data-trans="logout" href="javascript:void(0)" data-bind="click:logout,visible:showLogout() " style="display: none;" class="margin-right-10"></a>

+            </span>

+            <select id="language" data-bind="options: languages, value: currentLan, optionsText: 'text', optionsValue: 'value', event:{ change: langChangeHandler}" class="marginright10"></select>

+        </div>

+    </div>

+</div>

+<div id="indexContainer" class="container">

+    <div id="mainContainer" style="min-height: 450px;">

+        <div id='container'></div>

+    </div>

+</div>

+<!-- <div id="footer" style="border-top:1px solid #dddddd" class="container margin-top-5">

+    <span data-trans='copyright'></span>&nbsp;  -->

+    <!--span data-trans="vertical_bar"></span> &nbsp;<a href="http://www.demo.com" target="_blank" data-trans="open_source_licenses" class="extendLink"></a-->

+<!-- </div> -->

+

+<div id='result-overlay'>

+    <div class='header'></div>

+    <br/>

+    <div class="text-center">

+        <div>

+            <div id="result-image"></div>

+        </div>

+        <div id="result_wording"></div>

+    </div>

+</div>

+

+<div id='loading'>

+    <div class='header'><span id="loadMsg"></span></div>

+    <br/>

+    <div class="text-center">

+		<div><span id="loading_wording" class="message"></span></div>

+        <img id="loadingImg" src="pic/res_loading.gif?bG9hZGluZy5naWY="/>

+        <div id="loading_container"></div>

+    </div>

+</div>

+

+<div id='progress'>

+    <div class='header'><span id="barMsg"></span></div>

+     <br/>

+     <div class="progress-content">

+         <div class="progress-bar-container">

+             <div id="bar" class="progress-bar"></div>

+             <div id="barValue" class="progress-bar-value"></div>

+         </div>

+         <div id="progress_container" class="progress-prompt"></div>

+     </div>

+ </div>

+<!-- confirm content -->

+<div id='confirm'>

+    <div class='header'><span id="popTitle"></span></div>

+    <div id="confirm-message-container">

+        <div class='icon'><img id='confirmImg'/></div>

+        <div class="confirm-message">

+            <div class='message'></div>

+            <div class='promptDiv'>

+                <input id="promptInput" name="promptInput" type="text" maxlength="25" class="width190"/><br/>

+                <label class="promptErrorLabel colorRed"></label>

+            </div>

+        </div>

+    </div>

+    <div class='buttons'>

+        <input id='okbtn' type="button" data-trans='ok' class="btn btn-default simplemodal-close"/>

+        <input id='yesbtn' type="button" data-trans='yes' class="btn btn-default "/>

+        <input id='nobtn' type="button" data-trans='no' class="btn btn-default simplemodal-close"/>

+    </div>

+</div>

+<div id='popupSettingWindow'>

+    <div class='header'>

+		<p class="tag-popup-close"><a href="javascript:hidePopupSettingWindow();"></a></p>

+	</div>

+	<div id="htmlContainer" class="modal-body"></div>

+</div>

+<div id="buttom-bubble">

+</div>

+<script type="text/x-jquery-tmpl" id="newMessagePopTmpl">

+    <div class="bubbleItem ${report}" id="${mark}">

+        <h3>

+			<span data-trans="${titletrans}">${title}</span> ${name} <a href="javascript:void(0);" data-targetid="${mark}" class="bubbleCloseBtn"></a>

+		</h3>

+        <div class="bubbleContainer">

+            <div class="bubbleContent">${content}</div>

+            <div class="bubbleDatetime">${datetime}</div>

+        </div>

+    </div>

+</script>

+<script type="text/javascript">

+document.write("<script type='text/javascript' data-main='js/main' src='js/3rd/require-jquery.js?random=" + Math.random() + "'></s" + "cript>");

+</script>

+</body>

+</html>

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/com.js b/lynq/MD310EU/ap/app/zte_webui/js/com.js
new file mode 100755
index 0000000..de5ca46
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/com.js
@@ -0,0 +1,11444 @@
+

+define("service","underscore jquery set CryptoJS".split(" "), function (_, $, config, CryptoJS) {

+    function addTimerSomething(querys, cb) {

+        if (_.isArray(querys)) {

+            for (var i = 0; i < querys.length; i++) {

+                addQueryString(querys[i]);

+            }

+        } else {

+            addQueryString(querys);

+        }

+        addCallback(cb);

+    }

+    function removeTimerSomething(querys, cb) {

+        if (_.isArray(querys)) {

+            for (var i = 0; i < querys.length; i++) {

+                removeQueryString(querys[i]);

+            }

+        } else {

+            removeQueryString(querys);

+        }

+        removeCallback(cb);

+    }

+    function getCurretnMAC() {

+        return getUserMacAddr({}).get_user_mac_addr;

+    }

+    function getDdnsParams(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "DDNS_Enable,DDNS_Mode,DDNSProvider,DDNSAccount,DDNSPassword,DDNS,DDNS_Hash_Value"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    DDNS_Enable: paramD.DDNS_Enable,

+                    DDNS_Mode: paramD.DDNS_Mode,

+                    DDNSProvider: paramD.DDNSProvider,

+                    DDNSAccount: paramD.DDNSAccount,

+                    DDNSPassword: paramD.DDNSPassword,

+                    DDNS: paramD.DDNS,

+                    DDNS_Hash_Value: paramD.DDNS_Hash_Value

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setDDNSForward() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+   function getLoginData() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "modem_main_state,puknumber,pinnumber,blc_wan_mode,blc_wan_auto_mode,psw_fail_num_str,login_lock_time,psw_changed";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.blc_wan_mode == "AUTO") {

+                    paramD.blc_wan_mode = paramD.blc_wan_auto_mode ? paramD.blc_wan_auto_mode : 'AUTO_PPP';

+                } else {

+                    paramD.blc_wan_mode = paramD.blc_wan_mode ? paramD.blc_wan_mode : 'PPP';

+                }

+                paramD.psw_fail_num_str = paramD.psw_fail_num_str == '' ? config.MAX_LOGIN_COUNT : paramD.psw_fail_num_str;

+                paramD.login_lock_time = paramD.login_lock_time == '' ? '300' : paramD.login_lock_time;

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function login() {

+        return stuffMake(arguments, {}, prepare, deal, {

+            errorType: 'badPassword'

+        }, true);

+        function prepare(values, isPost) {

+            var obj = {

+                goformId: "LOGIN",

+                password: config.PASSWORD_ENCODE ? Base64.encode(values.password) : values.password

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.result == "0" || paramD.result == "4")) {

+                informationAll.isLoggedIn = true;

+                return {

+                    result: true

+                };

+            } else {

+                var loginError = {};

+                switch (paramD.result) {

+                case "1":

+                    loginError = {

+                        errorType: "Login Fail"

+                    };

+                    break;

+                case "2":

+                    loginError = {

+                        errorType: "duplicateUser"

+                    };

+                    break;

+                case "3":

+                    loginError = {

+                        errorType: "badPassword"

+                    };

+                    break;

+                default:

+                    loginError = {

+                        errorType: "Login Fail"

+                    };

+                    break;

+                }

+                informationAll.isLoggedIn = false;

+                return $.extend(errUnknownObj, loginError);

+            }

+        }

+    }

+    function getLoginStatus() {

+        if (informationAll.isLoggedIn != undefined) {

+            return stuffMake(arguments, {

+                status: informationAll.isLoggedIn ? 'loggedIn' : 'loggedOut'

+            });

+        } else {

+            var resultObject = {};

+            if (!config.HAS_LOGIN) {

+                resultObject.status = 'loggedIn';

+                resultObject.errorType = 'no_login';

+                informationAll.isLoggedIn = true;

+            }

+            return stuffMake(arguments, resultObject, prepare, deal, null, false);

+        }

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "loginfo";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.loginfo || paramD.loginfo == "") {

+                var loginStatus = {};

+                switch (paramD.loginfo) {

+                case "ok":

+                    informationAll.isLoggedIn = true;

+                    loginStatus.status = "loggedIn";

+                    break;

+                default:

+                    informationAll.isLoggedIn = false;

+                    loginStatus.status = "loggedOut";

+                    break;

+                }

+                return loginStatus;

+            } else {

+                informationAll.isLoggedIn = undefined;

+                return $.extend(errUnknownObj, {

+                    errorType: "LoginStatusError"

+                });

+            }

+        }

+    }

+    function enterPIN() {

+        return stuffMake(arguments, {}, prepare, deal, {}, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "ENTER_PIN";

+            obj.PinNumber = values.PinNumber;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function enterPUK() {

+        return stuffMake(arguments, {}, prepare, deal, {}, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "ENTER_PUK";

+            obj.PUKNumber = values.PUKNumber;

+            obj.PinNumber = values.PinNumber;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }	

+

+    function getStatusInfo() {

+        if (informationAll.isLoggedIn === undefined) {

+            var loginStatus = getLoginStatus();

+            return {

+                networkType: informationAll.networkType,

+                signalImg: informationAll.signalImg,

+                networkOperator: informationAll.networkOperator,

+                spn_b1_flag: informationAll.spn_b1_flag,

+                spn_name_data: informationAll.spn_name_data,

+                spn_b2_flag: informationAll.spn_b2_flag,

+                connectStatus: informationAll.connectStatus,

+                rj45ConnectStatus: informationAll.rj45ConnectStatus,

+                ssid1AttachedNum: informationAll.ssid1AttachedNum,

+                ssid2AttachedNum: informationAll.ssid2AttachedNum,

+                wirelessDeviceNum: informationAll.ssid1AttachedNum + informationAll.ssid2AttachedNum,

+                roamingStatus: informationAll.roamingStatus,

+                wifiStatus: informationAll.wifiStatus,

+                simStatus: informationAll.simStatus,

+                pinStatus: informationAll.pinStatus,

+                batteryStatus: informationAll.batteryStatus,

+                batteryLevel: informationAll.batteryLevel,

+                batteryPers: informationAll.batteryPers,

+                batteryTime: informationAll.batteryTime,

+                ssid: informationAll.ssid,

+                authMode: informationAll.authMode,

+                data_counter: informationAll.data_counter,

+                isLoggedIn: loginStatus.status == "loggedIn",

+                newSmsReceived: informationAll.newSmsReceived,

+                smsReportReceived: informationAll.smsReportReceived,

+                smsUnreadCount: informationAll.smsUnreadCount,

+                limitVolumeEnable: informationAll.limitVolumeEnable,

+                limitVolumeType: informationAll.limitVolumeType,

+                limitVolumePercent: informationAll.limitVolumePercent,

+                limitVolumeSize: informationAll.limitVolumeSize,

+                connectWifiProfile: informationAll.connectWifiProfile,

+                connectWifiSSID: informationAll.connectWifiSSID,

+                connectWifiStatus: informationAll.connectWifiStatus,

+                multi_ssid_enable: informationAll.multi_ssid_enable,

+                roamMode: informationAll.roamMode,

+                blc_wan_mode: informationAll.blc_wan_mode,

+                current_upgrade_state: informationAll.current_upgrade_state,

+                is_mandatory: informationAll.is_mandatory,

+                new_version_state: informationAll.new_version_state,

+                allowRoamingUpdate: informationAll.allowRoamingUpdate,

+                ap_station_enable: informationAll.ap_station_enable,

+                ap_station_mode: informationAll.ap_station_mode,

+                dialMode: informationAll.dialMode,

+                fota_package_already_download: informationAll.fota_package_already_download,

+                ethWanMode: informationAll.ethWanMode,

+                fota_user_selector: informationAll.fota_user_selector,

+                defaultWanName: informationAll.defaultWanName

+            };

+        }

+        return {

+            networkType: informationAll.networkType,

+            signalImg: informationAll.signalImg,

+            networkOperator: informationAll.networkOperator,

+            spn_b1_flag: informationAll.spn_b1_flag,

+            spn_name_data: informationAll.spn_name_data,

+            spn_b2_flag: informationAll.spn_b2_flag,

+            connectStatus: informationAll.connectStatus,

+            rj45ConnectStatus: informationAll.rj45ConnectStatus,

+            ssid1AttachedNum: informationAll.ssid1AttachedNum,

+            ssid2AttachedNum: informationAll.ssid2AttachedNum,

+            wirelessDeviceNum: informationAll.ssid1AttachedNum + informationAll.ssid2AttachedNum,

+            roamingStatus: informationAll.roamingStatus,

+            wifiStatus: informationAll.wifiStatus,

+            simStatus: informationAll.simStatus,

+            pinStatus: informationAll.pinStatus,

+            batteryStatus: informationAll.batteryStatus,

+            batteryLevel: informationAll.batteryLevel,

+            batteryPers: informationAll.batteryPers,

+            batteryTime: informationAll.batteryTime,

+            ssid: informationAll.ssid,

+            authMode: informationAll.authMode,

+            data_counter: informationAll.data_counter,

+            isLoggedIn: informationAll.isLoggedIn,

+            newSmsReceived: informationAll.newSmsReceived,

+            smsReportReceived: informationAll.smsReportReceived,

+            smsUnreadCount: informationAll.smsUnreadCount,

+            limitVolumeEnable: informationAll.limitVolumeEnable,

+            limitVolumeType: informationAll.limitVolumeType,

+            limitVolumePercent: informationAll.limitVolumePercent,

+            limitVolumeSize: informationAll.limitVolumeSize,

+            connectWifiProfile: informationAll.connectWifiProfile,

+            connectWifiSSID: informationAll.connectWifiSSID,

+            connectWifiStatus: informationAll.connectWifiStatus,

+            multi_ssid_enable: informationAll.multi_ssid_enable,

+            blc_wan_mode: informationAll.blc_wan_mode,

+            roamMode: informationAll.roamMode,

+            current_upgrade_state: informationAll.current_upgrade_state,

+            is_mandatory: informationAll.is_mandatory,

+            new_version_state: informationAll.new_version_state,

+            allowRoamingUpdate: informationAll.allowRoamingUpdate,

+            ap_station_enable: informationAll.ap_station_enable,

+            ap_station_mode: informationAll.ap_station_mode,

+            dialMode: informationAll.dialMode,

+            fota_package_already_download: informationAll.fota_package_already_download,

+            ethWanMode: informationAll.ethWanMode,

+            fota_user_selector: informationAll.fota_user_selector,

+            defaultWanName: informationAll.defaultWanName

+        };

+    }

+    function getConnectionInfo() {

+        var isData = informationAll.limitVolumeType == '1';

+        var result = {

+            data_counter: informationAll.data_counter,

+            connectStatus: informationAll.connectStatus,

+            rj45ConnectStatus: informationAll.rj45ConnectStatus,

+            limitVolumeEnable: informationAll.limitVolumeEnable,

+            limitVolumeType: informationAll.limitVolumeType,

+            limitVolumePercent: informationAll.limitVolumePercent,

+            networkType: informationAll.networkType

+        };

+        if (isData) {

+            result.limitDataMonth = informationAll.limitVolumeSize;

+            result.limitTimeMonth = 0;

+        } else {

+            result.limitTimeMonth = informationAll.limitVolumeSize;

+            result.limitDataMonth = 0;

+        }

+        result.blc_wan_mode = informationAll.blc_wan_mode;

+        return result;

+    }

+    function resetNewSmsReceivedVar() {

+        informationAll.newSmsReceived = false;

+    }

+    function resetSmsReportReceivedVar() {

+        informationAll.smsReportReceived = false;

+    }

+    function getSmsCapability() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "sms_capacity_info";

+            return valueReq;

+        }

+        function deal(paramD) {

+            return {

+                nvTotal: parseInt(paramD.sms_nv_total, 10),

+                nvUsed: parseInt(paramD.sms_nv_rev_total, 10) + parseInt(paramD.sms_nv_send_total, 10) + parseInt(paramD.sms_nv_draftbox_total, 10),

+                simTotal: parseInt(paramD.sms_sim_total, 10),

+                simUsed: parseInt(paramD.sms_sim_rev_total, 10) + parseInt(paramD.sms_sim_send_total, 10) + parseInt(paramD.sms_sim_draftbox_total, 10),

+                nvReceive: parseInt(paramD.sms_nv_rev_total, 10),

+                nvSend: parseInt(paramD.sms_nv_send_total, 10),

+                nvDraft: parseInt(paramD.sms_nv_draftbox_total, 10),

+                simReceive: parseInt(paramD.sms_sim_rev_total, 10),

+                simSend: parseInt(paramD.sms_sim_send_total, 10),

+                simDraft: parseInt(paramD.sms_sim_draftbox_total, 10)

+            };

+        }

+    }

+    function connect() {

+        var callback = arguments[1];

+        var checkPoint = 0;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "CONNECT_NETWORK";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                checkPoint = new Date().getTime();

+                addCallback(checkConnectStatus);

+            } else {

+                callback({

+                    result: false

+                });

+            }

+        }

+        function checkConnectStatus(paramD) {

+            if (paramD.ppp_status == "ppp_connecting") {

+                informationAll.connectStatus = "ppp_connecting";

+            } else if (paramD.ppp_status == "ppp_connected") {

+                removeCallback(checkConnectStatus);

+                informationAll.connectStatus = "ppp_connected";

+                callback({

+                    result: true,

+                    status: informationAll.connectStatus

+                });

+            } else if (new Date().getTime() - checkPoint < 1e4) {

+                informationAll.connectStatus = "ppp_connecting";

+            } else {

+                removeCallback(checkConnectStatus);

+                callback({

+                    result: false

+                });

+            }

+        }

+    }

+    function disconnect() {

+        var callback = arguments[1];

+        var checkPoint = 0;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "DISCONNECT_NETWORK";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                checkPoint = new Date().getTime();

+                addCallback(checkDisconnectStatus);

+            } else {

+                callback({

+                    result: false

+                });

+            }

+        }

+        function checkDisconnectStatus(paramD) {

+            if (paramD.ppp_status == "ppp_disconnecting") {

+                informationAll.connectStatus = "ppp_disconnecting";

+            } else if (paramD.ppp_status == "ppp_disconnected") {

+                removeCallback(checkDisconnectStatus);

+                informationAll.connectStatus = "ppp_disconnected";

+                callback({

+                    result: true,

+                    status: informationAll.connectStatus

+                });

+            } else if (new Date().getTime() - checkPoint < 1e4) {

+                informationAll.connectStatus = "ppp_disconnecting";

+            } else {

+                removeCallback(checkDisconnectStatus);

+                callback({

+                    result: false

+                });

+            }

+        }

+    }

+    function getApnSettings() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "APN_configtmp0,APN_configtmp1,APN_configtmp2,APN_configtmp3,APN_configtmp4,APN_configtmp5,APN_configtmp6,APN_configtmp7,APN_configtmp8,APN_configtmp9," + "APN_configtmp10,APN_configtmp11,APN_configtmp12,APN_configtmp13,APN_configtmp14,APN_configtmp15,APN_configtmp16,APN_configtmp17,APN_configtmp18,APN_configtmp19," + "ipv6_APN_configtmp0,ipv6_APN_configtmp1,ipv6_APN_configtmp2,ipv6_APN_configtmp3,ipv6_APN_configtmp4,ipv6_APN_configtmp5,ipv6_APN_configtmp6,ipv6_APN_configtmp7,ipv6_APN_configtmp8,ipv6_APN_configtmp9," + "ipv6_APN_configtmp10,ipv6_APN_configtmp11,ipv6_APN_configtmp12,ipv6_APN_configtmp13,ipv6_APN_configtmp14,ipv6_APN_configtmp15,ipv6_APN_configtmp16,ipv6_APN_configtmp17,ipv6_APN_configtmp18,ipv6_APN_configtmp19," + "m_profile_name,profile_name,wan_dial,pdp_type,pdp_select,index,Current_index,apn_auto_config,ipv6_apn_auto_config," + "apn_mode,wan_apn,ppp_auth_mode,ppp_username,ppp_passtmp," + "ipv6_wan_apn,ipv6_pdp_type,ipv6_ppp_auth_mode,ipv6_ppp_username,ipv6_ppp_passtmp,apn_num_preset";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(result) {

+            if (result) {

+                return {

+                    APNs: result.APN_configtmp0 + "||" + result.APN_configtmp1 + "||" + result.APN_configtmp2 + "||" + result.APN_configtmp3 + "||" + result.APN_configtmp4 + "||"

+                    +result.APN_configtmp5 + "||" + result.APN_configtmp6 + "||" + result.APN_configtmp7 + "||" + result.APN_configtmp8 + "||" + result.APN_configtmp9 + "||"

+                    +result.APN_configtmp10 + "||" + result.APN_configtmp11 + "||" + result.APN_configtmp12 + "||" + result.APN_configtmp13 + "||" + result.APN_configtmp14 + "||"

+                    +result.APN_configtmp15 + "||" + result.APN_configtmp16 + "||" + result.APN_configtmp17 + "||" + result.APN_configtmp18 + "||" + result.APN_configtmp19,

+                    ipv6APNs: result.ipv6_APN_configtmp0 + "||" + result.ipv6_APN_configtmp1 + "||" + result.ipv6_APN_configtmp2 + "||" + result.ipv6_APN_configtmp3 + "||" + result.ipv6_APN_configtmp4 + "||"

+                    +result.ipv6_APN_configtmp5 + "||" + result.ipv6_APN_configtmp6 + "||" + result.ipv6_APN_configtmp7 + "||" + result.ipv6_APN_configtmp8 + "||" + result.ipv6_APN_configtmp9 + "||"

+                    +result.ipv6_APN_configtmp10 + "||" + result.ipv6_APN_configtmp11 + "||" + result.ipv6_APN_configtmp12 + "||" + result.ipv6_APN_configtmp13 + "||" + result.ipv6_APN_configtmp14 + "||"

+                    +result.ipv6_APN_configtmp15 + "||" + result.ipv6_APN_configtmp16 + "||" + result.ipv6_APN_configtmp17 + "||" + result.ipv6_APN_configtmp18 + "||" + result.ipv6_APN_configtmp19,

+                    apnMode: result.apn_mode,

+                    profileName: result.m_profile_name || result.profile_name,

+                    wanDial: result.wan_dial,

+                    pdpType: result.pdp_type == 'IP' ? 'IP' : result.ipv6_pdp_type,

+                    pdpSelect: result.pdp_select,

+                    index: result.index,

+                    currIndex: result.Current_index,

+                    autoApns: result.apn_auto_config,

+                    autoApnsV6: result.ipv6_apn_auto_config,

+                    wanApn: result.wan_apn,

+                    authMode: result.ppp_auth_mode.toLowerCase(),

+                    username: result.ppp_username,

+                    password: result.ppp_passtmp,

+                    dnsMode: "",

+                    dns1: "",

+                    dns2: "",

+                    wanApnV6: result.ipv6_wan_apn,

+                    authModeV6: result.ipv6_ppp_auth_mode.toLowerCase(),

+                    usernameV6: result.ipv6_ppp_username,

+                    passwordV6: result.ipv6_ppp_passtmp,

+                    dnsModeV6: "",

+                    dns1V6: "",

+                    dns2V6: "",

+                    apnNumPreset: result.apn_num_preset

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function getNetworkStatus() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "NETWORK_INFO";

+            return valueReq;

+        }

+        function deal(result) {

+            return {

+                sinr: result.lte_sinr,

+                rsrp: result.lte_rsrp,

+                rsrq: result.lte_rsrq,

+                plmn: result.lte_plmn,

+                pci: result.lte_pci,

+                cellid: result.lte_cellid,

+                band: result.lte_band

+            };

+       }

+    }

+    function deleteApn() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                apn_action: "delete",

+                apn_mode: "manual",

+                index: values.index

+            };

+            valueReq.goformId = "APN_PROC_EX";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function setDefaultApn() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var requestParam = {

+                goformId: "APN_PROC_EX",

+                apn_mode: values.apnMode

+            };

+            if (values.apnMode == 'manual') {

+                requestParam.apn_action = "set_default";

+                requestParam.set_default_flag = "1";

+                requestParam.pdp_type = values.pdpType;

+                requestParam.index = values.index;

+            }

+            return requestParam;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function addOrEditApn() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "APN_PROC_EX",

+                apn_action: "save",

+                apn_mode: "manual",

+                profile_name: values.profileName,

+                wan_dial: '*99#',

+                pdp_type: values.pdpType,

+                pdp_select: 'auto',

+                index: values.index

+            };

+            if (values.pdpType == "IP") {

+                $.extend(valueReq, {

+                    wan_apn: values.wanApn,

+                    ppp_auth_mode: values.authMode,

+                    ppp_username: values.username,

+                    ppp_passtmp: values.password,

+                });

+            } else if (values.pdpType == "IPv6") {

+                $.extend(valueReq, {

+                    ipv6_wan_apn: values.wanApnV6,

+                    ipv6_ppp_auth_mode: values.authModeV6,

+                    ipv6_ppp_username: values.usernameV6,

+                    ipv6_ppp_passtmp: values.passwordV6

+                });

+            } else {

+                $.extend(valueReq, {

+                    wan_apn: values.wanApn,

+                    ppp_auth_mode: values.authMode,

+                    ppp_username: values.username,

+                    ppp_passtmp: values.password,

+                    dns_mode: values.dnsMode,

+                    prefer_dns_manual: values.dns1,

+                    standby_dns_manual: values.dns2,

+                    ipv6_wan_apn: values.wanApnV6,

+                    ipv6_ppp_auth_mode: values.authModeV6,

+                    ipv6_ppp_username: values.usernameV6,

+                    ipv6_ppp_passtmp: values.passwordV6

+                });

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    var timerQueryString = ["modem_main_state", "pin_status", "blc_wan_mode", "blc_wan_auto_mode", "loginfo", "fota_new_version_state", "fota_current_upgrade_state", "fota_upgrade_selector", "network_provider", "is_mandatory", "sta_count", "m_sta_count"];

+    var loginTimerQueryString = ["signalbar", "network_type", "sub_network_type", "ppp_status", "rj45_state", "EX_SSID1", "sta_ip_status", "EX_wifi_profile", "m_ssid_enable", "wifi_cur_state", "SSID1", "simcard_roam", "lan_ipaddr", "battery_charging", "battery_vol_percent", "battery_pers", "spn_name_data", "spn_b1_flag", "spn_b2_flag", "realtime_tx_bytes", "realtime_rx_bytes", "realtime_time", "realtime_tx_thrpt", "realtime_rx_thrpt", "monthly_rx_bytes", "monthly_tx_bytes", "traffic_alined_delta", "monthly_time", "date_month", "data_volume_limit_switch", "data_volume_limit_size", "data_volume_alert_percent", "data_volume_limit_unit", "roam_setting_option", "upg_roam_switch", "fota_package_already_download", 'ssid', 'dial_mode', 'ethwan_mode', 'default_wan_name'];

+    if (config.HAS_SMS) {

+        $.merge(loginTimerQueryString, ["sms_received_flag", "sts_received_flag", 'sms_unread_num']);

+    }

+    var timerCallbackStack = [];

+    var timerCallbacks = [timerUpdateStatus];

+    function timerUpdater() {

+        if (!updateTimerFlag) {

+            setTimeout(function () {

+                timerUpdater();

+            }, 1000);

+            return;

+        }

+        var queryParams = checkTimerUpdaterParameters();

+        reqAsync(queryParams, function (paramD) {

+            for (var i = 0; i < timerCallbacks.length; i++) {

+                if (typeof timerCallbacks[i] === "function") {

+                    timerCallbacks[i](paramD);

+                }

+            }

+            $.merge(timerCallbacks, timerCallbackStack);

+            timerCallbackStack = [];

+            setTimeout(function () {

+                timerUpdater();

+            }, 1000);

+        }, function () {

+            timerUpdaterErrorCallback();

+            setTimeout(function () {

+                timerUpdater();

+            }, 1000);

+        }, false);

+    }

+    function checkTimerUpdaterParameters() {

+        var queryParams = {

+            multi_data: 1,

+        };

+        if (window.location.hash && window.location.hash != '#entry' && informationAll.isLoggedIn) {

+            if (config.HAS_SMS) {

+                queryParams.sms_received_flag_flag = 0;

+                queryParams.sts_received_flag_flag = 0;

+            }

+            if (loginTimerQueryString.length > 0 && _.indexOf(timerQueryString, loginTimerQueryString[0]) == -1) {

+                $.each(loginTimerQueryString, function (i, n) {

+                    timerQueryString.push(n);

+                });

+            }

+        } else {

+            if (loginTimerQueryString.length > 0 && _.indexOf(timerQueryString, loginTimerQueryString[0]) != -1) {

+                timerQueryString = _.without(timerQueryString, loginTimerQueryString);

+            }

+        }

+        queryParams.cmd = timerQueryString.join(",");

+        return queryParams;

+    }

+    function addCallback(cb) {

+        if (_.indexOf(timerCallbackStack, cb) == -1) {

+            timerCallbackStack.push(cb);

+        }

+    }

+    function removeCallback(cb) {

+        timerCallbacks = _.without(timerCallbacks, cb);

+        if (timerCallbacks.length == 0) {

+            timerCallbacks.push(timerUpdateStatus);

+        }

+        return timerCallbackStack;

+    }

+    function addQueryString(query) {

+        if (_.indexOf(timerQueryString, query) == -1) {

+            timerQueryString.push(query);

+        }

+    }

+    function removeQueryString(query) {

+        timerQueryString = _.without(timerQueryString, query);

+        return timerQueryString;

+    }

+    function timerUpdateStatus(paramD) {

+        informationAll.defaultWanName = paramD.default_wan_name;

+        informationAll.signalImg = typeof paramD.signalbar == 'undefined' ? '0' : paramD.signalbar;

+        informationAll.networkType = paramD.sub_network_type ? paramD.sub_network_type : (paramD.network_type ? paramD.network_type : '');

+        if (informationAll.networkType.toLowerCase().indexOf("limited_service") != -1 || informationAll.networkType.toLowerCase().indexOf("limited service") != -1) {

+            informationAll.networkType = "limited_service";

+        } else if (informationAll.networkType.toLowerCase().indexOf("no_service") != -1 || informationAll.networkType.toLowerCase().indexOf("no service") != -1) {

+            informationAll.networkType = "no_service";

+        }

+        informationAll.networkOperator = paramD.network_provider ? paramD.network_provider : '';

+        informationAll.spn_b1_flag = paramD.spn_b1_flag;

+        informationAll.spn_b2_flag = paramD.spn_b2_flag;

+        informationAll.spn_name_data = paramD.spn_name_data;

+        informationAll.connectStatus = typeof paramD.ppp_status == 'undefined' ? 'ppp_disconnected' : paramD.ppp_status;

+        informationAll.rj45ConnectStatus = (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state;

+        informationAll.ethWanMode = paramD.ethwan_mode;

+        informationAll.ssid1AttachedNum = paramD.sta_count == "" ? 0 : parseInt(paramD.sta_count, 10);

+        informationAll.ssid2AttachedNum = paramD.m_sta_count == "" ? 0 : parseInt(paramD.m_sta_count, 10);

+        informationAll.roamingStatus = getRoamStatus(informationAll.networkType, paramD.modem_main_state, paramD.simcard_roam);

+        informationAll.wifiStatus = paramD.wifi_cur_state == "1";

+        informationAll.simStatus = paramD.modem_main_state;

+        informationAll.pinStatus = paramD.pin_status;

+        var needMinutes = 3 * 60 * 60;

+        var batteryLevel = (paramD.battery_vol_percent && paramD.battery_vol_percent.length > 0) ? paramD.battery_vol_percent : 100;

+        informationAll.batteryPers = paramD.battery_pers;

+        var remainMinutes = Math.round(needMinutes * (1 - batteryLevel / 100));

+        informationAll.batteryStatus = (typeof paramD.battery_charging == 'undefined') ? '0' : paramD.battery_charging;

+        informationAll.batteryLevel = batteryLevel;

+        informationAll.batteryTime = remainMinutes.toString();

+        informationAll.data_counter = {

+            uploadRate: paramD.realtime_tx_thrpt == '' ? 0 : paramD.realtime_tx_thrpt,

+            downloadRate: paramD.realtime_rx_thrpt == '' ? 0 : paramD.realtime_rx_thrpt,

+            currentSent: paramD.realtime_tx_bytes == '' ? 0 : paramD.realtime_tx_bytes,

+            currentReceived: paramD.realtime_rx_bytes == '' ? 0 : paramD.realtime_rx_bytes,

+            currentConnectedTime: paramD.realtime_time == '' ? 0 : paramD.realtime_time,

+            monthlySent: paramD.monthly_tx_bytes == '' ? 0 : paramD.monthly_tx_bytes,

+            monthlyReceived: paramD.monthly_rx_bytes == '' ? 0 : paramD.monthly_rx_bytes,

+            traffic_alined_delta: paramD.traffic_alined_delta == '' ? 0 : paramD.traffic_alined_delta,

+            monthlyConnectedTime: paramD.monthly_time == '' ? 0 : paramD.monthly_time,

+            month: paramD.date_month == '' ? 1 : paramD.date_month

+        };

+        informationAll.ssid = paramD.SSID1;

+        informationAll.authMode = paramD.AuthMode;

+        informationAll.isLoggedIn = config.HAS_LOGIN ? paramD.loginfo == "ok" : true;

+        if (config.HAS_SMS) {

+            if (!informationAll.newSmsReceived) {

+                informationAll.newSmsReceived = paramD.sms_received_flag > 0;

+            }

+            if (!informationAll.smsReportReceived) {

+                informationAll.smsReportReceived = paramD.sts_received_flag > 0;

+            }

+            if (typeof paramD.sms_dev_unread_num != "undefined") {

+                informationAll.smsUnreadCount = config.SMS_UNREAD_NUM_INCLUDE_SIM ? parseInt(paramD.sms_dev_unread_num | 0, 10) + parseInt(paramD.sms_sim_unread_num | 0, 10) : parseInt(paramD.sms_dev_unread_num | 0, 10);

+            } else {

+                informationAll.smsUnreadCount = parseInt(paramD.sms_unread_num | 0, 10)

+            }

+        }

+        if (paramD.data_volume_limit_switch == '1') {

+            informationAll.limitVolumeEnable = true;

+            informationAll.limitVolumeType = paramD.data_volume_limit_unit == 'data' ? '1' : '0';

+            informationAll.limitVolumePercent = paramD.data_volume_alert_percent;

+            if (paramD.data_volume_limit_unit == 'data') {

+                var limitMonth = paramD.data_volume_limit_size.split("_");

+                informationAll.limitVolumeSize = limitMonth[0] * limitMonth[1] * 1024 * 1024;

+            } else {

+                informationAll.limitVolumeSize = paramD.data_volume_limit_size * 60 * 60;

+            }

+        } else {

+            informationAll.limitVolumeEnable = false;

+            informationAll.limitVolumeType = '1';

+            informationAll.limitVolumePercent = '100';

+            informationAll.limitVolumeSize = '0';

+        }

+        informationAll.connectWifiProfile = paramD.EX_wifi_profile;

+        informationAll.connectWifiSSID = paramD.EX_SSID1;

+        informationAll.connectWifiStatus = paramD.sta_ip_status;

+        informationAll.multi_ssid_enable = paramD.m_ssid_enable;

+        informationAll.roamMode = paramD.roam_setting_option;

+        if (paramD.blc_wan_mode == "AUTO") {

+            informationAll.blc_wan_mode = paramD.blc_wan_auto_mode ? paramD.blc_wan_auto_mode : 'AUTO_PPP';

+        } else {

+            informationAll.blc_wan_mode = paramD.blc_wan_mode ? paramD.blc_wan_mode : 'PPP';

+        }

+        informationAll.new_version_state = paramD.fota_new_version_state == "has_critical" || paramD.fota_new_version_state == "has_optional" || paramD.fota_new_version_state == "already_has_pkg";

+        informationAll.current_upgrade_state = paramD.fota_current_upgrade_state;

+        if (informationAll.current_upgrade_state == "verify_failed") {

+            informationAll.current_upgrade_state = "upgrade_pack_error";

+        }

+        informationAll.fota_user_selector = paramD.fota_upgrade_selector;

+        informationAll.is_mandatory = paramD.is_mandatory == "1" || paramD.fota_new_version_state == "has_critical";

+        informationAll.allowRoamingUpdate = paramD.upg_roam_switch;

+        informationAll.dialMode = paramD.dial_mode;

+        informationAll.fota_package_already_download = paramD.fota_package_already_download;

+    }

+    function timerUpdaterErrorCallback() {

+        informationAll.batteryStatus = '0';

+    }

+    function getRoamStatus(networkType, modemState, simcardRoam) {

+        if (("" == $.trim(networkType)) || "no_service" == networkType.toLowerCase() || "limited_service" == networkType.toLowerCase() || "modem_sim_undetected" == modemState || "modem_waitpin" == modemState || "modem_waitpuk" == modemState) {

+            return false;

+        }

+        if ("Internal" == simcardRoam || "International" == simcardRoam) {

+            return true;

+        } else {

+            return false;

+        }

+    }

+    $(document).ready(function () {

+        setTimeout(function () {

+            timerUpdater();

+        }, 0);

+    });

+    function setNetwork(strNetworkNumber, nRat, nSubAct, callback) {

+        if ((typeof(strNetworkNumber) !== "string") || (strNetworkNumber === "") || (typeof(nRat) !== "number") || (isNaN(nRat))) {

+            if (typeof(callback) === "function") {

+                callback(false);

+                return;

+            }

+        }

+        var nRat1 = -1;

+        if (nRat === 0) {

+            nRat1 = 0;

+        } else if (nRat === 2) {

+            nRat1 = 2;

+        } else if (nRat == 7) {

+            nRat1 = 7;

+        } else {

+            nRat1 = -1;

+        }

+        if (-1 === nRat1) {

+            if (typeof(callback) === "function") {

+                callback(false);

+                return;

+            }

+        }

+        var SubAct;

+        if (nSubAct.toString() == "NaN") {

+            SubAct = "";

+        } else {

+            SubAct = nSubAct;

+        }

+        reqAsync({

+            goformId: "SET_NETWORK",

+            NetworkNumber: strNetworkNumber,

+            Rat: nRat,

+            nSubrat: SubAct

+        }, function (paramD) {

+            if (paramD && paramD.result == "success") {

+                var flag;

+                var counter = 0;

+                var timer = setInterval(function () {

+                    var obj = reqSync({

+                        cmd: 'm_netselect_result',

+                    }, false);

+                    if (!obj) {

+                        callback(false);

+                        return;

+                    }

+                    if (obj.m_netselect_result == "manual_success") {

+                        flag = "1";

+                        window.clearInterval(timer);

+                        callback(true);

+                    } else if (obj.m_netselect_result == "manual_fail") {

+                        flag = "0";

+                        window.clearInterval(timer);

+                        callback(false);

+                    } else if (counter < 120) {

+                        counter++;

+                    } else {

+                        window.clearInterval(timer);

+                        callback(false);

+                    }

+                }, 1000);

+            } else {

+                callback(false);

+            }

+        }, function (paramD) {

+            callback(false);

+        }, true);

+    }

+    function savePhoneBook() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "PBM_CONTACT_ADD";

+            valueReq.location = values.location;

+            valueReq.name = encodeMessage(values.name);

+            valueReq.mobilephone_num = values.mobile_phone_number;

+            if (valueReq.location == 1) {

+                valueReq.add_index_pc = values.index;

+                valueReq.homephone_num = values.home_phone_number;

+                valueReq.officephone_num = values.office_phone_number;

+                valueReq.email = encodeMessage(values.mail);

+                valueReq.groupchoose = values.group;

+                if (!valueReq.groupchoose) {

+                    valueReq.groupchoose = "common";

+                }

+            } else {

+                valueReq.edit_index = values.index;

+            }

+            if (values.delId != undefined) {

+                valueReq.delId = values.delId;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addTimerSomething("pbm_write_flag", checkSavePhoneBook);

+            } else {

+                callback(paramD);

+            }

+        }

+        function checkSavePhoneBook(paramD) {

+            checkPbmWriteFlag(paramD, callback, checkSavePhoneBook);

+        }

+    }

+    function checkPbmWriteFlag(paramD, callback, fn) {

+        if (paramD.pbm_write_flag == "0") {

+            removeTimerSomething("pbm_write_flag", fn);

+            callback({

+                result: "success"

+            });

+        } else if (paramD.pbm_write_flag == "6" || paramD.pbm_write_flag == "7" || paramD.pbm_write_flag == "8" || paramD.pbm_write_flag == "9" || paramD.pbm_write_flag == "10" || paramD.pbm_write_flag == "11" || paramD.pbm_write_flag == "14") {

+            removeTimerSomething("pbm_write_flag", fn);

+            callback({

+                result: "fail"

+            });

+        } else {}

+    }

+    function deletePhoneBooks() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "PBM_CONTACT_DEL";

+            valueReq.del_option = "delete_num";

+            valueReq.delete_id = values.indexs.join(",");

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addTimerSomething("pbm_write_flag", checkDeletePhoneBooks);

+            } else {

+                callback(paramD);

+            }

+        }

+        function checkDeletePhoneBooks(paramD) {

+            checkPbmWriteFlag(paramD, callback, checkDeletePhoneBooks);

+        }

+    }

+    function deleteAllPhoneBooks() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "PBM_CONTACT_DEL";

+            valueReq.del_option = "delete_all";

+            valueReq.del_all_location = values.location;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addTimerSomething("pbm_write_flag", checkDeleteAllPhoneBooks);

+            } else {

+                callback(paramD);

+            }

+        }

+        function checkDeleteAllPhoneBooks(paramD) {

+            checkPbmWriteFlag(paramD, callback, checkDeleteAllPhoneBooks);

+        }

+    }

+    function deleteAllPhoneBooksByGroup() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.notCallback = true;

+            valueReq.goformId = "PBM_CONTACT_DEL";

+            valueReq.del_option = "delete_all_by_group";

+            valueReq.del_all_location = 3;

+            valueReq.del_group = values.group;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addTimerSomething("pbm_write_flag", checkDeleteAllPhoneBooksByGroup);

+            } else {

+                callback(paramD);

+            }

+        }

+        function checkDeleteAllPhoneBooksByGroup(paramD) {

+            checkPbmWriteFlag(paramD, callback, checkDeleteAllPhoneBooksByGroup);

+        }

+    }

+    function setConnectionMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_CONNECTION_MODE";

+            valueReq.ConnectionMode = values.connectionMode;

+            valueReq.roam_setting_option = values.isAllowedRoaming;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                callback(paramD);

+            }

+        }

+    }

+    function getConnectionMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "ConnectionMode";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.connectionMode = paramD.connectionMode;

+                result.isAllowedRoaming = paramD.autoConnectWhenRoaming;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function _getPhoneBooks(array, location) {

+        if (array[0].data_per_page == 0) {

+            return {

+                "pbm_data": []

+            };

+        }

+        return stuffMake(array, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.mem_store = location;

+            if (location == 2) {

+                valueReq.cmd = "pbm_data_total";

+            } else {

+                valueReq.cmd = "pbm_data_info";

+            }

+            valueReq.page = values.page;

+            valueReq.data_per_page = values.data_per_page;

+            valueReq.orderBy = values.orderBy;

+            valueReq.isAsc = values.isAsc;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.pbm_data) {

+                var books = [];

+                $.each(paramD.pbm_data, function (i) {

+                    books.push({

+                        pbm_id: paramD.pbm_data[i].pbm_id,

+                        pbm_location: paramD.pbm_data[i].pbm_location,

+                        pbm_number: paramD.pbm_data[i].pbm_number,

+                        pbm_anr: paramD.pbm_data[i].pbm_anr,

+                        pbm_anr1: paramD.pbm_data[i].pbm_anr1,

+                        pbm_group: paramD.pbm_data[i].pbm_group,

+                        pbm_name: decodeMessage(paramD.pbm_data[i].pbm_name),

+                        pbm_email: decodeMessage(paramD.pbm_data[i].pbm_email)

+                    });

+                });

+                return {

+                    pbm_data: books

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPhoneBooksByGroup() {

+        if (arguments[0].data_per_page == 0) {

+            return {

+                "pbm_data": []

+            };

+        }

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "pbm_data_total";

+            valueReq.mem_store = 3;

+            valueReq.pbm_group = values.group;

+            valueReq.page = values.page;

+            valueReq.data_per_page = values.data_per_page;

+            valueReq.orderBy = values.orderBy;

+            valueReq.isAsc = values.isAsc;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.pbm_data) {

+                var books = [];

+                $.each(paramD.pbm_data, function (i) {

+                    books.push({

+                        pbm_id: paramD.pbm_data[i].pbm_id,

+                        pbm_location: paramD.pbm_data[i].pbm_location,

+                        pbm_number: paramD.pbm_data[i].pbm_number,

+                        pbm_anr: paramD.pbm_data[i].pbm_anr,

+                        pbm_anr1: paramD.pbm_data[i].pbm_anr1,

+                        pbm_group: paramD.pbm_data[i].pbm_group,

+                        pbm_name: decodeMessage(paramD.pbm_data[i].pbm_name),

+                        pbm_email: decodeMessage(paramD.pbm_data[i].pbm_email)

+                    });

+                });

+                return {

+                    pbm_data: books

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getDevicePhoneBooks() {

+        return _getPhoneBooks(arguments, 1);

+    }

+    function getSIMPhoneBooks() {

+        return _getPhoneBooks(arguments, 0);

+    }

+    function getPhoneBooks() {

+        return _getPhoneBooks(arguments, 2);

+    }

+    function getPhoneBookReady() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "pbm_init_flag";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPhoneBookCapacity(array, isSIM) {

+        return stuffMake(array, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "pbm_capacity_info";

+            if (isSIM) {

+                valueReq.pbm_location = "pbm_sim";

+            } else {

+                valueReq.pbm_location = "pbm_native";

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSIMPhoneBookCapacity() {

+        var paramD = getPhoneBookCapacity(arguments, true);

+        return {

+            simPbmTotalCapacity: parseInt(paramD.pbm_sim_max_record_num),

+            simPbmUsedCapacity: parseInt(paramD.pbm_sim_used_record_num),

+            simType: paramD.pbm_sim_type,

+            maxNameLen: parseInt(paramD.pbm_sim_max_name_len),

+            maxNumberLen: parseInt(paramD.pbm_sim_max_number_len) > 40 ? 40 : parseInt(paramD.pbm_sim_max_number_len)

+        };

+    }

+    function getDevicePhoneBookCapacity() {

+        var paramD = getPhoneBookCapacity(arguments, false);

+        return {

+            pcPbmTotalCapacity: parseInt(paramD.pbm_dev_max_record_num),

+            pcPbmUsedCapacity: parseInt(paramD.pbm_dev_used_record_num)

+        };

+    }

+    function getAttachedCableDevices() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "lan_station_list"

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            var deviceArr = [];

+            var attachedDevices = paramD.lan_station_list || paramD.station_list;

+            for (var i = 0; attachedDevices && i < attachedDevices.length; i++) {

+                var obj = {};

+                obj.macAddress = attachedDevices[i].mac_addr;

+                var hostname = attachedDevices[i].hostname;

+                obj.hostName = hostname == "" ? $.i18n.prop("unknown") : hostname;

+                obj.ipAddress = attachedDevices[i].ip_addr;

+                deviceArr.push(obj);

+            }

+            return {

+                attachedDevices: deviceArr

+            };

+        }

+    }

+    function getCurrentlyAttachedDevicesInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "station_list"

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            var deviceArr = [];

+            var attachedDevices = paramD.station_list;

+            for (var i = 0; attachedDevices && i < attachedDevices.length; i++) {

+                var obj = {};

+                obj.macAddress = attachedDevices[i].mac_addr;

+                var hostname = attachedDevices[i].hostname;

+                obj.hostName = hostname == "" ? $.i18n.prop("unknown") : hostname;

+                obj.ipAddress = attachedDevices[i].ip_addr;

+                deviceArr.push(obj);

+            }

+            return {

+                attachedDevices: deviceArr

+            };

+        }

+    }	

+

+    function setLanguage() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_WEB_LANGUAGE";

+            valueReq.Language = values.Language;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getLanguage() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "Language";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.Language = (paramD && paramD.Language) ? paramD.Language : "en";

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }	

+

+    function setBearerPreference() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_BEARER_PREFERENCE";

+            valueReq.BearerPreference = values.strBearerPreference;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function scanForNetwork(callback) {

+        $.post("/reqproc/proc_post", {

+            goformId: "SCAN_NETWORK"

+        }, function (paramD) {

+            if (paramD.result == "success") {

+                checkScanStatus();

+            } else {

+                callback(false, []);

+            }

+        }, "json").error(function () {

+            callback(false, []);

+        });

+        function checkScanStatus() {

+            $.getJSON("/reqproc/proc_get", {

+                cmd: "m_netselect_status",

+                "_": new Date().getTime()

+            }, function (paramD) {

+                if (paramD.m_netselect_status == "manual_selecting") {

+                    setTimeout(checkScanStatus, 1000);

+                } else {

+                    $.getJSON("/reqproc/proc_get", {

+                        cmd: "m_netselect_contents",

+                        "_": new Date().getTime()

+                    }, function (paramD2) {

+                        if (trim(paramD2.m_netselect_contents) != "") {

+                            parseScanResult(paramD2.m_netselect_contents);

+                        } else {

+                            callback(false, []);

+                        }

+                    }).error(function () {

+                        callback(false, []);

+                    });

+                }

+            }).error(function () {

+                callback(false, []);

+            });

+        }

+        function parseScanResult(result) {

+            var pattern = /([^,;]*),([^,]*),([^,]*),([^,]*),([^,;]*)/g;

+            var listNetwork = [];

+            var mts;

+            var unit = result.split(";");

+            var unitString = "";

+            for (i = 0; i < unit.length; i++) {

+                var unitLength = unit[i].split(",").length;

+                if (unitLength == 4) {

+                    unitString += unit[i] + ",NON;";

+                } else {

+                    unitString += unit[i] + ";";

+                }

+            }

+            while (mts = pattern.exec(unitString)) {

+                if (mts != null) {

+                    listNetwork.push({

+                        strShortName: mts[2].replace(/\"/g, ''),

+                        strNumeric: mts[3].replace(/\D/g, ''),

+                        nRat: parseInt(mts[4], 10),

+                        nState: parseInt(mts[1], 10),

+                        SubAct: parseInt(mts[5], 10)

+                    });

+                }

+            }

+            callback(true, listNetwork);

+        }

+    }

+	    function getNetSelectInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "current_network_mode,m_netselect_save,net_select_mode,m_netselect_contents,net_select,ppp_status,modem_main_state";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.current_network_mode = paramD.current_network_mode;

+                result.net_select_mode = paramD.net_select_mode;

+                result.m_netselect_save = paramD.m_netselect_save;

+                result.m_netselect_contents = paramD.m_netselect_contents;

+                result.net_select = paramD.net_select;

+                result.ppp_status = paramD.ppp_status;

+                result.modem_main_state = paramD.modem_main_state;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }	

+

+    function getSMSMessages() {

+        return stuffMake(arguments, {}, prepare, deal, {}, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "sms_data_total",

+                page: values.page,

+                data_per_page: config.SMS_DATABASE_SORT_SUPPORT ? values.smsCount : 500,

+                mem_store: values.nMessageStoreType,

+                tags: values.tags,

+                order_by: values.orderBy

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.messages && paramD.messages.length > 0) {

+                return {

+                    messages: parseMessages(paramD.messages)

+                };

+            } else {

+                return {

+                    messages: []

+                };

+            }

+        }

+    }

+    function parseMessages(messages, isReport) {

+        var result = [];

+        for (var i = 0; i < messages.length; i++) {

+            if (!config.SHOW_UN_COMPLETE_CONCAT_SMS && typeof messages[i].received_all_concat_sms != "undefined" && messages[i].received_all_concat_sms == '0') {

+                continue;

+            }

+            var oneMessage = {};

+            oneMessage.id = messages[i].id;

+            oneMessage.number = messages[i].number;

+            oneMessage.content = isReport ? messages[i].content : decodeMessageContent(messages[i].content);

+            oneMessage.time = transTime('20' + messages[i].date);

+            oneMessage.isNew = messages[i].tag == "1";

+            oneMessage.groupId = messages[i].draft_group_id;

+            oneMessage.tag = messages[i].tag;

+            oneMessage.receivedAll = messages[i].received_all_concat_sms == '1';

+            result.push(oneMessage);

+        }

+        if (!config.SMS_DATABASE_SORT_SUPPORT) {

+            var ids = [];

+            var tmpResult = [];

+            for (var i = result.length; i--; ) {

+                var n = result[i];

+                var idx = $.inArray(n.id, ids);

+                if (idx == -1) {

+                    ids.push(n.id);

+                    tmpResult.push(n);

+                } else {

+                    if (n.content.length > tmpResult[idx].content.length) {

+                        tmpResult[idx] = n;

+                    }

+                }

+            }

+            return _.sortBy(tmpResult, function (n) {

+                return 0 - n.id;

+            });

+        } else {

+            return result;

+        }

+    }

+    function decodeMessageContent(msgContent) {

+        return decodeMessage(escapeMessage(msgContent));

+    }

+    function sendSMS() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {

+                goformId: "SEND_SMS",

+                notCallback: true,

+                Number: values.number,

+                sms_time: getCurrentTimeString(),

+                MessageBody: escapeMessage(encodeMessage(values.message)),

+                ID: values.id,

+                encode_type: getEncodeType(values.message).encodeType

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "sendFail",

+                        errorText: "send_fail_try_again"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                setTimeout(function () {

+                    getSmsStatusInfo({

+                        smsCmd: 4,

+                        errorType: "sendFail",

+                        errorText: "send_fail_try_again"

+                    }, callback, errorCabllback);

+                }, 1000);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "sendFail",

+                        errorText: "send_fail_try_again"

+                    }));

+            }

+        }

+    }

+    function saveSMS() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {

+                notCallback: true,

+                goformId: "SAVE_SMS",

+                SMSMessage: escapeMessage(encodeMessage(values.message)),

+                SMSNumber: values.numbers.join(";") + ";",

+                Index: values.index,

+                encode_type: getEncodeType(values.message).encodeType,

+                sms_time: values.currentTimeString,

+                draft_group_id: values.groupId

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "saveFail",

+                        errorText: "save_fail"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                getSmsStatusInfo({

+                    smsCmd: 5,

+                    errorType: "saveFail",

+                    errorText: "save_fail"

+                }, callback, errorCabllback);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "saveFail",

+                        errorText: "save_fail"

+                    }));

+            }

+        }

+    }

+    function deleteAllMessages() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {

+                goformId: "ALL_DELETE_SMS",

+                notCallback: true,

+                which_cgi: values.location

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                addTimerSomething("sms_cmd_status_info", checkDeleteStatus);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+            }

+        }

+        function checkDeleteStatus(paramD) {

+            var status = paramD.sms_cmd_status_info;

+            if (status == "2") {

+                removeTimerSomething("sms_cmd_status_info", checkDeleteStatus);

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+            } else if (status == "3") {

+                removeTimerSomething("sms_cmd_status_info", checkDeleteStatus);

+                callback({

+                    result: true

+                });

+            }

+        }

+    }

+    function deleteMessage() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var msgIds = values.ids.join(";") + ";";

+            var obj = {

+                goformId: "DELETE_SMS",

+                msg_id: msgIds,

+                notCallback: true

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                getSmsStatusInfo({

+                    smsCmd: 6,

+                    errorType: "deleteFail",

+                    errorText: "delete_fail_try_again"

+                }, callback, errorCabllback);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+            }

+        }

+    }

+    function getSmsStatusInfo(obj, callback, errorCabllback) {

+        reqAsync({

+            cmd: "sms_cmd_status_info",

+            sms_cmd: obj.smsCmd,

+        }, function (paramD) {

+            if (paramD) {

+                var status = paramD.sms_cmd_status_result;

+                if (status == "2") {

+                    errorCabllback($.extend(errUnknownObj, {

+                            errorType: obj.errorType,

+                            errorText: obj.errorText

+                        }));

+                } else if (status == "3") {

+                    callback({

+                        result: "success"

+                    });

+                } else {

+                    window.setTimeout(function () {

+                        getSmsStatusInfo(obj, callback, errorCabllback);

+                    }, 1000);

+                }

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: obj.errorType,

+                        errorText: obj.errorText

+                    }));

+            }

+        }, function (paramD) {

+            errorCabllback($.extend(errUnknownObj, {

+                    errorType: obj.errorType,

+                    errorText: obj.errorText

+                }));

+        }, false);

+    }

+    function getSMSReady() {

+        if (config.smsIsReady) {

+            var callback = arguments[1];

+            if (callback) {

+                return callback({

+                    "sms_cmd": "1",

+                    "sms_cmd_status_result": "3"

+                });

+            } else {

+                return {

+                    "sms_cmd": "1",

+                    "sms_cmd_status_result": "3"

+                };

+            }

+        } else {

+            return stuffMake(arguments, {}, prepare, deal, null, false);

+        }

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "sms_cmd_status_info";

+            valueReq.sms_cmd = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.sms_cmd_status_result == "3") {

+                    config.smsIsReady = true;

+                }

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSmsRead() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var msgIds = values.ids.join(";");

+            if (values.ids.length > 0) {

+                msgIds += ";";

+            }

+            var obj = {

+                goformId: "SET_MSG_READ",

+                msg_id: msgIds,

+                tag: 0

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function getSMSDeliveryReport() {

+        return stuffMake(arguments, {}, prepare, deal, {}, false);

+        function prepare(values, isPost) {

+            var obj = {

+                cmd: "sms_status_rpt_data",

+                page: values.page,

+                data_per_page: values.smsCount

+            };

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    messages: parseMessages(paramD.messages, true)

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function logout() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = $.extend({}, values);

+            obj.goformId = "LOGOUT";

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                informationAll.isLoggedIn = false;

+                return {

+                    result: true

+                };

+            } else {

+                return $.extend(errUnknownObj, {

+                    errorType: "loggedOutError"

+                });

+            }

+        }

+    }

+    function changeManageInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.newPassword = config.PASSWORD_ENCODE ? Base64.encode(values.newValue) : values.newValue;

+            obj.oldPassword = config.PASSWORD_ENCODE ? Base64.encode(values.oldValue) : values.oldValue;

+            obj.goformId = "CHANGE_PASSWORD";

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return $.extend(errUnknownObj, {

+                    errorType: "badPassword"

+                });

+            }

+        }

+    }

+    function getPinData() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "pinnumber,pin_status,puknumber";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function enablePin() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "ENABLE_PIN";

+            obj.OldPinNumber = values.oldPin;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function disablePin() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "DISABLE_PIN";

+            obj.OldPinNumber = values.oldPin;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function changePin() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var obj = {};

+            obj.goformId = "ENABLE_PIN";

+            obj.OldPinNumber = values.oldPin;

+            obj.NewPinNumber = values.newPin;

+            return obj;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result === "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function getLanInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "lan_ipaddr,lan_netmask,mac_address,dhcpEnabled,dhcpStart,dhcpEnd,dhcpLease_hour";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.ipAddress = paramD.lan_ipaddr;

+                result.subnetMask = paramD.lan_netmask;

+                result.macAddress = paramD.mac_address;

+                result.dhcpServer = paramD.dhcpEnabled;

+                result.dhcpStart = paramD.dhcpStart;

+                result.dhcpEnd = paramD.dhcpEnd;

+                result.dhcpLease = parseInt(paramD.dhcpLease_hour, 10);

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setLanInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DHCP_SETTING";

+            valueReq.lanIp = values.ipAddress;

+            valueReq.lanNetmask = values.subnetMask;

+            valueReq.lanDhcpType = values.dhcpServer == "1" ? "SERVER" : "DISABLE";

+            if (valueReq.lanDhcpType == "SERVER") {

+                valueReq.dhcpStart = values.dhcpStart;

+                valueReq.dhcpEnd = values.dhcpEnd;

+                valueReq.dhcpLease = values.dhcpLease;

+            }

+            valueReq.dhcp_reboot_flag = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSmsSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "sms_parameter_info";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.centerNumber = paramD.sms_para_sca;

+                result.memStroe = paramD.sms_para_mem_store;

+                result.deliveryReport = paramD.sms_para_status_report;

+                switch (parseInt(paramD.sms_para_validity_period, 10)) {

+                case 143:

+                    result.validity = "twelve_hours";

+                    break;

+                case 167:

+                    result.validity = "one_day";

+                    break;

+                case 173:

+                    result.validity = "one_week";

+                    break;

+                case 244:

+                    result.validity = "largest";

+                    break;

+                case 255:

+                    result.validity = "largest";

+                    break;

+                default:

+                    result.validity = "twelve_hours";

+                    break;

+                }

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSmsSetting() {

+        var callback = arguments[1];

+        var errorCabllback = arguments[2] ? arguments[2] : callback;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_MESSAGE_CENTER";

+            valueReq.save_time = values.validity;

+            valueReq.MessageCenter = values.centerNumber;

+            valueReq.status_save = values.deliveryReport;

+            valueReq.save_location = 'native';

+            valueReq.notCallback = true;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "smsSettingFail",

+                        errorText: "error_info"

+                    }));

+                return;

+            }

+            if (paramD.result == "success") {

+                getSmsStatusInfo({

+                    smsCmd: 3,

+                    errorType: "smsSettingFail",

+                    errorText: "error_info"

+                }, callback, errorCabllback);

+            } else {

+                errorCabllback($.extend(errUnknownObj, {

+                        errorType: "deleteFail",

+                        errorText: "delete_fail_try_again"

+                    }));

+            }

+        }

+    }

+    function restoreFactorySettings() {

+        var preErrorObj = {};

+        if (config.HAS_PARENTAL_CONTROL && config.currentUserInChildGroup != false) {

+            preErrorObj = {

+                errorType: 'no_auth'

+            };

+        }

+        return stuffMake(arguments, preErrorObj, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "RESTORE_FACTORY_SETTINGS";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function checkRestoreStatus(successCallback) {

+        var valueReq = {};

+        valueReq.cmd = "restore_flag";

+        valueReq.multi_data = 1;

+        reqAsync(valueReq, function (paramD) {

+            if (paramD && paramD.restore_flag === "1") {

+                successCallback();

+            } else {

+                setTimeout(function () {

+                    checkRestoreStatus(successCallback);

+                }, 5000);

+            }

+        }, function () {

+            setTimeout(function () {

+                checkRestoreStatus(successCallback);

+            }, 5000);

+        }, false);

+    }

+    function getWpsInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "wifi_wps_index,WscModeOption,AuthMode,wifi_cur_state,EncrypType,wps_mode,WPS_SSID,m_ssid_enable,SSID1,m_SSID,m_EncrypType,m_AuthMode,wifi_sta_connection";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.wpsFlag = paramD.WscModeOption;

+                result.authMode = paramD.AuthMode;

+                result.wpsType = paramD.wps_mode;

+                result.radioFlag = paramD.wifi_cur_state == "1" ? "1" : "0";

+                result.encrypType = paramD.EncrypType;

+                result.wpsSSID = paramD.WPS_SSID;

+                result.ssidEnable = paramD.m_ssid_enable;

+                result.ssid = paramD.SSID1;

+                result.multiSSID = paramD.m_SSID;

+                result.m_encrypType = paramD.m_EncrypType;

+                result.wifi_wps_index = paramD.wifi_wps_index;

+                result.AuthMode = paramD.AuthMode;

+                result.m_AuthMode = paramD.m_AuthMode;

+                result.ap_station_enable = paramD.wifi_sta_connection;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function openWps() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "WIFI_WPS_SET";

+            valueReq.WPS_SSID = values.wpsSSID;

+            valueReq.wps_mode = values.wpsType;

+            valueReq.wifi_wps_index = values.wpsIndex;

+            if (valueReq.wps_mode == 'PIN') {

+                valueReq.wps_pin = values.wpsPin;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function openWps_5g() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "WIFI_M_WPS_SET";

+            valueReq.m_WPS_SSID = values.wpsSSID;

+            valueReq.m_wps_mode = values.wpsType;

+            valueReq.m_wifi_wps_index = values.wpsIndex;

+            if (valueReq.m_wps_mode == 'PIN') {

+                valueReq.m_wps_pin = values.wpsPin;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSleepMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "wifi_sleep_mode,Sleep_interval";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.wifiSleepMode = paramD.wifi_sleep_mode;

+                result.sleepMode = paramD.Sleep_interval;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSleepMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_WIFI_SLEEP_INFO";

+            valueReq.sysWifiSleepMode = values.wifiSleepMode;

+            valueReq.sysIdleTimeToSleep = values.sleepMode;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSysSecurity() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "RemoteManagement,WANPingFilter";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.remoteFlag = paramD.RemoteManagement == "1" ? "1" : "0";

+                result.pingFlag = paramD.WANPingFilter == "1" ? "1" : "0";

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSysSecurity() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "FW_SYS";

+            valueReq.remoteManagementEnabled = values.remoteFlag;

+            valueReq.pingFrmWANFilterEnabled = values.pingFlag;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPortForward() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "PortForwardEnable,PortForwardRules_0,PortForwardRules_1,PortForwardRules_2,PortForwardRules_3,PortForwardRules_4,PortForwardRules_5,PortForwardRules_6,PortForwardRules_7,PortForwardRules_8,PortForwardRules_9";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.portForwardEnable = paramD.PortForwardEnable;

+                var rules = [];

+                if (paramD.PortForwardRules_0 != "") {

+                    rules.push([0, paramD.PortForwardRules_0]);

+                }

+                if (paramD.PortForwardRules_1 != "") {

+                    rules.push([1, paramD.PortForwardRules_1]);

+                }

+                if (paramD.PortForwardRules_2 != "") {

+                    rules.push([2, paramD.PortForwardRules_2]);

+                }

+                if (paramD.PortForwardRules_3 != "") {

+                    rules.push([3, paramD.PortForwardRules_3]);

+                }

+                if (paramD.PortForwardRules_4 != "") {

+                    rules.push([4, paramD.PortForwardRules_4]);

+                }

+                if (paramD.PortForwardRules_5 != "") {

+                    rules.push([5, paramD.PortForwardRules_5]);

+                }

+                if (paramD.PortForwardRules_6 != "") {

+                    rules.push([6, paramD.PortForwardRules_6]);

+                }

+                if (paramD.PortForwardRules_7 != "") {

+                    rules.push([7, paramD.PortForwardRules_7]);

+                }

+                if (paramD.PortForwardRules_8 != "") {

+                    rules.push([8, paramD.PortForwardRules_8]);

+                }

+                if (paramD.PortForwardRules_9 != "") {

+                    rules.push([9, paramD.PortForwardRules_9]);

+                }

+                result.portForwardRules = parsePortForwardRules(rules);

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function parsePortForwardRules(paramD) {

+            var rules = [];

+            if (paramD && paramD.length > 0) {

+                for (var i = 0; i < paramD.length; i++) {

+                    var aRule = {};

+                    var elements = paramD[i][1].split(",");

+                    aRule.index = paramD[i][0];

+                    aRule.ipAddress = elements[0];

+                    aRule.portRange = elements[1] + ' - ' + elements[2];

+                    aRule.protocol = transProtocol(elements[3]);

+                    aRule.comment = elements[4];

+                    rules.push(aRule);

+                }

+            }

+            return rules;

+        }

+    }

+    function setPortForward() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "FW_FORWARD_ADD";

+            valueReq.ipAddress = values.ipAddress;

+            valueReq.portStart = values.portStart;

+            valueReq.portEnd = values.portEnd;

+            valueReq.protocol = values.protocol;

+            valueReq.comment = values.comment;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteForwardRules() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "FW_FORWARD_DEL";

+            valueReq.delete_id = values.indexs.join(';') + ";";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function enableVirtualServer() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "VIRTUAL_SERVER";

+            valueReq.PortForwardEnable = values.portForwardEnable;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function wifiDecode(fact1,fact2,encode_aes) {//wifiDecode(paramD.rnum_js,paramD.imei,paramD.WPAPSK1_enaes,paramD.m_WPAPSK1_enaes);

+        var kstr = fact1 + fact2 + "FFFFFFFFFFFFFFFFFFFFFFFF";

+        var kstr_final;

+	var kiv_final;

+

+        kstr_final = kstr.substring(0, 24);

+	kiv_final = kstr.substring(0, 16);

+

+        var tkey = CryptoJS.enc.Latin1.parse(kstr_final);

+	var tiv = CryptoJS.enc.Latin1.parse(kiv_final);

+        var decdata = CryptoJS.AES.decrypt(encode_aes, tkey, {

+            iv: tiv,

+            mode: CryptoJS.mode.CBC,

+            padding: CryptoJS.pad.ZeroPadding

+        }).toString(CryptoJS.enc.Utf8);

+

+        return decdata;

+    }

+    function getQuickSettingInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            var wpask = config.PASSWORD_ENCODE ? ",WPAPSK1_encode" : ",imei,rnum_js,WPAPSK1_enaes";

+            valueReq.cmd = "pdp_type,ipv6_pdp_type,wifi_cur_state,SSID1,HideSSID,AuthMode,WscModeOption,ppp_status,apn_index,ipv6_apn_index,ipv6_APN_index,m_profile_name,apn_mode,EncrypType,DefaultKeyID,Key1Str1,Key2Str1,Key3Str1,Key4Str1" + wpask + ",APN_configtmp0,APN_configtmp1,APN_configtmp2,APN_configtmp3,APN_configtmp4,APN_configtmp5,APN_configtmp6,APN_configtmp7,APN_configtmp8,APN_configtmp9,APN_configtmp10,APN_configtmp11,APN_configtmp12,APN_configtmp13,APN_configtmp14,APN_configtmp15,APN_configtmp16,APN_configtmp17,APN_configtmp18,APN_configtmp19" + ",ipv6_APN_configtmp0,ipv6_APN_configtmp1,ipv6_APN_configtmp2,ipv6_APN_configtmp3,ipv6_APN_configtmp4,ipv6_APN_configtmp5,ipv6_APN_configtmp6,ipv6_APN_configtmp7,ipv6_APN_configtmp8,ipv6_APN_configtmp9,ipv6_APN_configtmp10,ipv6_APN_configtmp11,ipv6_APN_configtmp12,ipv6_APN_configtmp13,ipv6_APN_configtmp14,ipv6_APN_configtmp15,ipv6_APN_configtmp16,ipv6_APN_configtmp17,ipv6_APN_configtmp18,ipv6_APN_configtmp19";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (config.PASSWORD_ENCODE) {

+                    paramD.WPAPSK1 = Base64.decode(paramD.WPAPSK1_encode);

+                } else {

+		    paramD.WPAPSK1 = wifiDecode(paramD.rnum_js,paramD.imei,paramD.WPAPSK1_enaes);

+		}

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setQuickSetting4IPv6() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var valueReq = {

+                goformId: "QUICK_SETUP_EX",

+                index: values.apn_index,

+                pdp_type: values.pdp_type,

+                apn_mode: values.apnMode,

+                profile_name: values.profile_name,

+                wan_apn: values.wan_apn,

+                ppp_auth_mode: values.ppp_auth_mode,

+                ppp_username: values.ppp_username,

+                ppp_passtmp: values.ppp_passtmp,

+                ipv6_wan_apn: values.ipv6_wan_apn,

+                ipv6_ppp_auth_mode: values.ipv6_ppp_auth_mode,

+                ipv6_ppp_username: values.ipv6_ppp_username,

+                ipv6_ppp_passtmp: values.ipv6_ppp_passtmp,

+                SSID_name: values.SSID_name,

+                SSID_Broadcast: values.SSID_Broadcast,

+                Encryption_Mode_hid: values.Encryption_Mode_hid,

+                security_shared_mode: values.security_shared_mode,

+                WPA_PreShared_Key: config.PASSWORD_ENCODE ? Base64.encode(values.WPA_PreShared_Key) : values.WPA_PreShared_Key,

+                wep_default_key: values.wep_default_key,

+                WPA_ENCRYPTION_hid: values.WPA_ENCRYPTION_hid

+            }

+            valueReq.wep_key_1 = values.wep_key_1;

+            valueReq.wep_key_2 = values.wep_key_2;

+            valueReq.wep_key_3 = values.wep_key_3;

+            valueReq.wep_key_4 = values.wep_key_4;

+            if (values.wep_default_key == '1') {

+                valueReq.WEP2Select = values.WEP2Select;

+            } else if (values.wep_default_key == '2') {

+                valueReq.WEP3Select = values.WEP3Select;

+            } else if (values.wep_default_key == '3') {

+                valueReq.WEP4Select = values.WEP4Select;

+            } else {

+                valueReq.WEP1Select = values.WEP1Select;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return $.extend(errUnknownObj, {

+                    errorType: "SetSetUpError"

+                });

+            }

+        }

+    }

+    function stuffMakeAndCheckServerIsOnline(arg, prepare, deal) {

+        var isServerOnline = false;

+        var isCallbackExecuted = false;

+        var values = prepare(arg[0]);

+        var callback = arg[1];

+        var successCallback = function (paramD) {

+            isServerOnline = true;

+            if (!isCallbackExecuted && callback) {

+                callback(deal(paramD));

+            }

+            isCallbackExecuted = true;

+        };

+        var errorMethod = arg[2];

+        var errorCallback = function () {

+            isServerOnline = true;

+            if (errorMethod) {

+                errorMethod();

+            }

+        };

+        reqAsync(values, successCallback, errorCallback, true);

+        addTimeout(function () {

+            if (isServerOnline == false) {

+                var timer = addInterval(function () {

+                    if (isServerOnline == false) {

+                        getLanguage({}, function (paramD) {

+                            window.clearInterval(timer);

+                            successCallback({

+                                result: "success"

+                            });

+                        });

+                    }

+                }, 1000);

+            }

+        }, 5000);

+    }

+    function getSDConfiguration() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "sdcard_mode_option,sd_card_state,HTTP_SHARE_STATUS,HTTP_SHARE_WR_AUTH,HTTP_SHARE_FILE",

+                multi_data: 1

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var fileToShare;

+                if ("mmc2" == paramD.HTTP_SHARE_FILE || "/mmc2" == paramD.HTTP_SHARE_FILE || "/mmc2/" == paramD.HTTP_SHARE_FILE) {

+                    fileToShare = "1";

+                } else {

+                    fileToShare = "0";

+                }

+                var result = {

+                    sd_mode: paramD.sdcard_mode_option == "1" ? "0" : "1",

+                    sd_status: paramD.sd_card_state,

+                    share_status: paramD.HTTP_SHARE_STATUS == "Enabled" ? "1" : "0",

+                    share_auth: paramD.HTTP_SHARE_WR_AUTH == "readOnly" ? "0" : "1",

+                    file_to_share: fileToShare,

+                    share_file: paramD.HTTP_SHARE_FILE

+                };

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSdCardMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "HTTPSHARE_MODE_SET",

+                mode_set: values.mode == "0" ? "http_share_mode" : "usb_mode"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return {

+                    result: 'success'

+                };

+            } else if (paramD && paramD.result == 'processing') {

+                return {

+                    result: 'processing'

+                };

+            } else {

+                return {

+                    result: false

+                };

+            }

+        }

+    }

+    function checkFileExists() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "GOFORM_HTTPSHARE_CHECK_FILE",

+                path_SD_CARD: values.path

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.result == "no_sdcard") {

+                    return {

+                        status: "no_sdcard"

+                    };

+                } else if (paramD.result == "noexist") {

+                    return {

+                        status: "noexist"

+                    };

+                } else if (paramD.result == "processing") {

+                    return {

+                        status: "processing"

+                    };

+                } else {

+                    return {

+                        status: "exist"

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getFileList() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "HTTPSHARE_ENTERFOLD",

+                path_SD_CARD: values.path,

+                indexPage: values.index

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.result == 'failure') {

+                    return $.extend(errUnknownObj, {

+                        errorType: "get_file_list_failure"

+                    });

+                } else if (paramD.result == "no_sdcard") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "no_sdcard"

+                    });

+                } else {

+                    return parseSdCardFile(paramD.result);

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function parseSdCardFile(result) {

+            var fileInfo = {};

+            fileInfo.totalRecord = result.totalRecord;

+            var fileArr = [];

+            var details = result.fileInfo;

+            for (var i = 0; details && i < details.length; i++) {

+                if (details[i].fileName == "") {

+                    continue;

+                }

+                var obj = {};

+                obj.fileName = details[i].fileName;

+                obj.attribute = details[i].attribute;

+                obj.size = details[i].size;

+                obj.lastUpdateTime = details[i].lastUpdateTime;

+                fileArr.push(obj);

+            }

+            fileInfo.details = fileArr;

+            return fileInfo;

+        }

+    }

+    function fileRename() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var d = new Date();

+            var currentTime = d.getTime();

+            var zoneOffsetSeconds = d.getTimezoneOffset() * 60;

+            return {

+                goformId: "HTTPSHARE_FILE_RENAME",

+                path_SD_CARD: values.path,

+                OLD_NAME_SD_CARD: values.oldPath,

+                NEW_NAME_SD_CARD: values.newPath,

+                path_SD_CARD_time: transUnixTime(currentTime),

+                path_SD_CARD_time_unix: Math.round((currentTime - zoneOffsetSeconds * 1000) / 1e3)

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.result == "success") {

+                    return {

+                        result: true

+                    };

+                } else if (paramD.result == "no_sdcard") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "no_sdcard"

+                    });

+                } else if (paramD.result == "noexist") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "no_exist"

+                    });

+                } else if (paramD.result == "processing") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "sd_file_processing_cant_rename"

+                    });

+                } else {

+                    return {

+                        result: false

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSdMemorySizes() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "HTTPSHARE_GETCARD_VALUE"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (!paramD || (paramD.result && paramD.result == "no_sdcard")) {

+                return $.extend(errUnknownObj, {

+                    errorType: "no_sdcard"

+                });

+            } else {

+                return {

+                    totalMemorySize: paramD.sd_card_total_size == "" ? 0 : paramD.sd_card_total_size * 32 * 1024,

+                    availableMemorySize: paramD.sd_card_avi_space == "" ? 0 : paramD.sd_card_avi_space * 32 * 1024

+                };

+            }

+        }

+    }

+    function deleteFilesAndFolders() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var currentTime = new Date().getTime();

+            var valueReq = {

+                goformId: "HTTPSHARE_DEL",

+                path_SD_CARD: values.path,

+                name_SD_CARD: values.names,

+                path_SD_CARD_time: transUnixTime(currentTime),

+                path_SD_CARD_time_unix: Math.round(currentTime / 1e3)

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result && paramD.result == "failure") {

+                return {

+                    status: "failure"

+                };

+            } else if (paramD.result && paramD.result == "no_sdcard") {

+                return {

+                    status: "no_sdcard"

+                };

+            } else if (paramD.result && paramD.result == "processing") {

+                return {

+                    status: "processing"

+                };

+            } else if (paramD.result && paramD.result == "success") {

+                return {

+                    status: "success"

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function createFolder() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var d = new Date();

+            var currentTime = d.getTime();

+            var zoneOffsetSeconds = d.getTimezoneOffset() * 60;

+            return {

+                goformId: "HTTPSHARE_NEW",

+                path_SD_CARD: values.path,

+                path_SD_CARD_time: transUnixTime(currentTime),

+                path_SD_CARD_time_unix: Math.round((currentTime - zoneOffsetSeconds * 1000) / 1e3)

+            };

+        }

+        function deal(paramD) {

+            if (paramD.result && paramD.result == "failure") {

+                return $.extend(errUnknownObj, {

+                    errorType: "create_folder_failure"

+                });

+            } else if (paramD.result && paramD.result == "no_sdcard") {

+                return $.extend(errUnknownObj, {

+                    errorType: "no_sdcard"

+                });

+            } else if (paramD.result && paramD.result == "success") {

+                return {

+                    result: true

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSdCardSharing() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "HTTPSHARE_AUTH_SET",

+                HTTP_SHARE_STATUS: values.share_status == "1" ? "Enabled" : "Disabled",

+                HTTP_SHARE_WR_AUTH: values.share_auth == "1" ? "readWrite" : "readOnly",

+                HTTP_SHARE_FILE: values.share_file

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.result == "no_sdcard") {

+                    return $.extend(errUnknownObj, {

+                        errorType: "no_sdcard"

+                    });

+                } else {

+                    return {

+                        result: true

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPortFilter() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "IPPortFilterEnable,DefaultFirewallPolicy,IPPortFilterRules_0,IPPortFilterRules_1,IPPortFilterRules_2,IPPortFilterRules_3,IPPortFilterRules_4,IPPortFilterRules_5,IPPortFilterRules_6,IPPortFilterRules_7,IPPortFilterRules_8,IPPortFilterRules_9";

+            valueReq.cmd += ",IPPortFilterRulesv6_0,IPPortFilterRulesv6_1,IPPortFilterRulesv6_2,IPPortFilterRulesv6_3,IPPortFilterRulesv6_4,IPPortFilterRulesv6_5,IPPortFilterRulesv6_6,IPPortFilterRulesv6_7,IPPortFilterRulesv6_8,IPPortFilterRulesv6_9";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.portFilterEnable = paramD.IPPortFilterEnable;

+                result.defaultPolicy = paramD.DefaultFirewallPolicy;

+                var rules = [];

+                if (paramD.IPPortFilterRules_0 != "") {

+                    rules.push([0, paramD.IPPortFilterRules_0]);

+                }

+                if (paramD.IPPortFilterRules_1 != "") {

+                    rules.push([1, paramD.IPPortFilterRules_1]);

+                }

+                if (paramD.IPPortFilterRules_2 != "") {

+                    rules.push([2, paramD.IPPortFilterRules_2]);

+                }

+                if (paramD.IPPortFilterRules_3 != "") {

+                    rules.push([3, paramD.IPPortFilterRules_3]);

+                }

+                if (paramD.IPPortFilterRules_4 != "") {

+                    rules.push([4, paramD.IPPortFilterRules_4]);

+                }

+                if (paramD.IPPortFilterRules_5 != "") {

+                    rules.push([5, paramD.IPPortFilterRules_5]);

+                }

+                if (paramD.IPPortFilterRules_6 != "") {

+                    rules.push([6, paramD.IPPortFilterRules_6]);

+                }

+                if (paramD.IPPortFilterRules_7 != "") {

+                    rules.push([7, paramD.IPPortFilterRules_7]);

+                }

+                if (paramD.IPPortFilterRules_8 != "") {

+                    rules.push([8, paramD.IPPortFilterRules_8]);

+                }

+                if (paramD.IPPortFilterRules_9 != "") {

+                    rules.push([9, paramD.IPPortFilterRules_9]);

+                }

+                result.portFilterRules = parsePortFilterRules(rules, "IPv4");

+                var v6Rules = [];

+                if (paramD.IPPortFilterRulesv6_0 != "") {

+                    v6Rules.push([10, paramD.IPPortFilterRulesv6_0]);

+                }

+                if (paramD.IPPortFilterRulesv6_1 != "") {

+                    v6Rules.push([11, paramD.IPPortFilterRulesv6_1]);

+                }

+                if (paramD.IPPortFilterRulesv6_2 != "") {

+                    v6Rules.push([12, paramD.IPPortFilterRulesv6_2]);

+                }

+                if (paramD.IPPortFilterRulesv6_3 != "") {

+                    v6Rules.push([13, paramD.IPPortFilterRulesv6_3]);

+                }

+                if (paramD.IPPortFilterRulesv6_4 != "") {

+                    v6Rules.push([14, paramD.IPPortFilterRulesv6_4]);

+                }

+                if (paramD.IPPortFilterRulesv6_5 != "") {

+                    v6Rules.push([15, paramD.IPPortFilterRulesv6_5]);

+                }

+                if (paramD.IPPortFilterRulesv6_6 != "") {

+                    v6Rules.push([16, paramD.IPPortFilterRulesv6_6]);

+                }

+                if (paramD.IPPortFilterRulesv6_7 != "") {

+                    v6Rules.push([17, paramD.IPPortFilterRulesv6_7]);

+                }

+                if (paramD.IPPortFilterRulesv6_8 != "") {

+                    v6Rules.push([18, paramD.IPPortFilterRulesv6_8]);

+                }

+                if (paramD.IPPortFilterRulesv6_9 != "") {

+                    v6Rules.push([19, paramD.IPPortFilterRulesv6_9]);

+                }

+                result.portFilterRules = _.union(result.portFilterRules, parsePortFilterRules(v6Rules, "IPv6"));

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function parsePortFilterRules(paramD, ipTypeTmp) {

+            var rules = [];

+            if (paramD && paramD.length > 0) {

+                for (var i = 0; i < paramD.length; i++) {

+                    var aRule = {};

+                    var elements = paramD[i][1].split(",");

+                    aRule.index = paramD[i][0];

+                    aRule.macAddress = elements[11];

+                    aRule.destIpAddress = elements[4] == "any/0" ? "" : elements[4];

+                    aRule.sourceIpAddress = elements[0] == "any/0" ? "" : elements[0];

+                    aRule.destPortRange = elements[6] == '0' ? '' : elements[6] + " - " + elements[7];

+                    aRule.sourcePortRange = elements[2] == '0' ? '' : elements[2] + " - " + elements[3];

+                    aRule.action = elements[9] == 1 ? "filter_accept" : "filter_drop";

+                    aRule.protocol = transProtocol(elements[8]);

+                    aRule.comment = elements[10];

+                    aRule.ipType = ipTypeTmp;

+                    rules.push(aRule);

+                }

+            }

+            return rules;

+        }

+    }

+    function setPortFilterBasic() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "BASIC_SETTING";

+            valueReq.portFilterEnabled = values.portFilterEnable;

+            valueReq.defaultFirewallPolicy = values.defaultPolicy;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setPortFilter() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_IP_PORT_FILETER_V4V6";

+            valueReq.ip_version = values.ipType;

+            valueReq.mac_address = values.macAddress;

+            valueReq.dip_address = values.destIpAddress;

+            valueReq.sip_address = values.sourceIpAddress;

+            valueReq.dFromPort = values.destPortStart;

+            valueReq.dToPort = values.destPortEnd;

+            valueReq.sFromPort = values.sourcePortStart;

+            valueReq.sToPort = values.sourcePortEnd;

+            valueReq.action = values.action;

+            valueReq.protocol = values.protocol;

+            valueReq.comment = values.comment;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteFilterRules() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            var deleteIds = _.filter(values.indexs, function (item) {

+                return item.length == 1;

+            });

+            valueReq.goformId = "DEL_IP_PORT_FILETER_V4V6";

+            var deletev6Ids = [];

+            _.each(values.indexs, function (item) {

+                if (item.length == 2) {

+                    deletev6Ids.push(item.substring(1));

+                }

+            });

+            valueReq.delete_id_v6 = deletev6Ids.length > 0 ? deletev6Ids.join(';') + ";" : "";

+            valueReq.delete_id = deleteIds.length > 0 ? deleteIds.join(';') + ";" : "";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getWifiAdvance() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "WirelessMode,CountryCode,Channel,HT_MCS,wifi_band,wifi_11n_cap,MAX_Access_num,m_MAX_Access_num,MAX_Station_num,wifi_sta_connection";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {

+                    mode: paramD.WirelessMode,

+                    countryCode: paramD.CountryCode,

+                    channel: paramD.Channel,

+                    rate: paramD.HT_MCS,

+                    wifiBand: paramD.wifi_band == 'a' ? 'a' : 'b',

+                    bandwidth: paramD.wifi_11n_cap,

+                    MAX_Station_num: $.isNumeric(paramD.MAX_Station_num) ? paramD.MAX_Station_num : config.MAX_STATION_NUMBER,

+                    MAX_Access_num: paramD.MAX_Access_num,

+                    m_MAX_Access_num: paramD.m_MAX_Access_num,

+                    ap_station_enable: paramD.wifi_sta_connection

+                };

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setWifiAdvance() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var valueReq = {

+                goformId: "SET_WIFI_INFO",

+                wifiMode: values.mode,

+                countryCode: values.countryCode,

+                MAX_Access_num: values.station,

+                m_MAX_Access_num: values.m_station

+            };

+            if (config.WIFI_BAND_SUPPORT) {

+                valueReq.wifi_band = values.wifiBand;

+            }

+            if (config.WIFI_BAND_SUPPORT && values.wifiBand == 'a') {

+                valueReq.selectedChannel = 'auto';

+            } else {

+                valueReq.selectedChannel = values.channel;

+                valueReq.abg_rate = values.rate;

+            }

+            if (config.WIFI_BANDWIDTH_SUPPORT) {

+                valueReq.wifi_11n_cap = values.bandwidth;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getDeviceInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+	    var wpask = config.PASSWORD_ENCODE ? "WPAPSK1_encode,m_WPAPSK1_encode," : "rnum_js,WPAPSK1_enaes,m_WPAPSK1_enaes,";

+            var valueReq = {

+                cmd: "wifi_coverage,m_ssid_enable,imei,ziccid,cell_id,network_type,sub_network_type,rssi,rscp,lte_rsrp,imsi,sim_imsi,cr_version,hw_version,MAX_Access_num," + wpask + "SSID1,AuthMode,m_SSID,m_AuthMode,m_HideSSID,m_MAX_Access_num,lan_ipaddr," + "mac_address,msisdn,LocalDomain,wan_ipaddr,static_wan_ipaddr,ipv6_wan_ipaddr,ipv6_pdp_type,pdp_type,ppp_status,sta_ip_status,rj45_state,ethwan_mode",

+                multi_data: 1

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    ssid: paramD.SSID1,

+                    authMode: paramD.AuthMode,

+                    passPhrase: config.PASSWORD_ENCODE ? Base64.decode(paramD.WPAPSK1_encode) : wifiDecode(paramD.rnum_js,paramD.imei,paramD.WPAPSK1_enaes),

+                    m_ssid: paramD.m_SSID,

+                    m_AuthMode: paramD.m_AuthMode,

+                    m_passPhrase: config.PASSWORD_ENCODE ? Base64.decode(paramD.m_WPAPSK1_encode) : wifiDecode(paramD.rnum_js,paramD.imei,paramD.m_WPAPSK1_enaes),

+                    m_max_access_num: paramD.m_MAX_Access_num,

+                    multi_ssid_enable: paramD.m_ssid_enable,

+                    ipAddress: paramD.lan_ipaddr,

+                    wanIpAddress: paramD.wan_ipaddr,

+                    staticWanIpAddress: paramD.static_wan_ipaddr,

+                    ipv6WanIpAddress: paramD.ipv6_wan_ipaddr,

+                    ipv6PdpType: paramD.ipv6_pdp_type,

+                    macAddress: paramD.mac_address,

+                    simSerialNumber: paramD.msisdn,

+                    lanDomain: paramD.LocalDomain,

+                    imei: paramD.imei,

+                    signal: convertSignal(paramD),

+                    imsi: paramD.imsi || paramD.sim_imsi,

+                    iccid: paramD.ziccid,

+                    cellid: paramD.cell_id,

+                    sw_version: paramD.cr_version,

+                    hw_version: paramD.hw_version,

+                    max_access_num: paramD.MAX_Access_num,

+                    wifiRange: paramD.wifi_coverage,

+                    pdpType: paramD.pdp_type,

+                    rj45ConnectStatus: (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state,

+                    blc_wan_mode: informationAll.blc_wan_mode,

+                    connectStatus: paramD.ppp_status,

+                    wifiConStatus: paramD.sta_ip_status,

+                    ethwan_mode: paramD.ethwan_mode.toUpperCase()

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getDeviceInfoLow() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "imei,rnum_js",

+                multi_data: 1

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var kstr = paramD.rnum_js + paramD.imei + "FFFFFFFFFFFFFFFFFFFFFFFF";

+                var kstr_final;

+		var kiv_final;

+

+                kstr_final = kstr.substring(0, 24);

+		kiv_final = kstr.substring(0, 16);

+

+                return {

+                    skey: kstr_final,

+		    siv: kiv_final

+            	};

+            } else {

+

+	        return {

+                    skey: "FFFFFFFFFFFFFFFFFFFFFFFF",

+		    siv: "FFFFFFFFFFFFFFFF"

+            	};

+            }

+        }

+    }

+    function getWifiRange() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "wifi_coverage";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.wifiRangeMode = paramD.wifi_coverage;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setWifiRange() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_WIFI_COVERAGE";

+            valueReq.wifi_coverage = values.wifiRangeMode;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUpnpSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "upnpEnabled";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.upnpSetting = paramD.upnpEnabled == "1" ? "1" : "0";

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setUpnpSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "UPNP_SETTING";

+            valueReq.upnp_setting_option = values.upnpSetting;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getDmzSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "DMZEnable,DMZIPAddress";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.dmzSetting = paramD.DMZEnable == "1" ? "1" : "0";

+                result.ipAddress = paramD.DMZIPAddress;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setDmzSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DMZ_SETTING";

+            valueReq.DMZEnabled = values.dmzSetting;

+            if (valueReq.DMZEnabled == '1') {

+                valueReq.DMZIPAddress = values.ipAddress;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPortMap() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "PortMapEnable,PortMapRules_0,PortMapRules_1,PortMapRules_2,PortMapRules_3,PortMapRules_4,PortMapRules_5,PortMapRules_6,PortMapRules_7,PortMapRules_8,PortMapRules_9",

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.portMapEnable = paramD.PortMapEnable;

+                var rules = [];

+                if (paramD.PortMapRules_0 != "") {

+                    rules.push([0, paramD.PortMapRules_0]);

+                }

+                if (paramD.PortMapRules_1 != "") {

+                    rules.push([1, paramD.PortMapRules_1]);

+                }

+                if (paramD.PortMapRules_2 != "") {

+                    rules.push([2, paramD.PortMapRules_2]);

+                }

+                if (paramD.PortMapRules_3 != "") {

+                    rules.push([3, paramD.PortMapRules_3]);

+                }

+                if (paramD.PortMapRules_4 != "") {

+                    rules.push([4, paramD.PortMapRules_4]);

+                }

+                if (paramD.PortMapRules_5 != "") {

+                    rules.push([5, paramD.PortMapRules_5]);

+                }

+                if (paramD.PortMapRules_6 != "") {

+                    rules.push([6, paramD.PortMapRules_6]);

+                }

+                if (paramD.PortMapRules_7 != "") {

+                    rules.push([7, paramD.PortMapRules_7]);

+                }

+                if (paramD.PortMapRules_8 != "") {

+                    rules.push([8, paramD.PortMapRules_8]);

+                }

+                if (paramD.PortMapRules_9 != "") {

+                    rules.push([9, paramD.PortMapRules_9]);

+                }

+                result.portMapRules = parsePortMapRules(rules);

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function parsePortMapRules(paramD) {

+            var rules = [];

+            if (paramD && paramD.length > 0) {

+                for (var i = 0; i < paramD.length; i++) {

+                    var aRule = {};

+                    var elements = paramD[i][1].split(",");

+                    aRule.index = paramD[i][0];

+                    aRule.sourcePort = elements[1];

+                    aRule.destIpAddress = elements[0];

+                    aRule.destPort = elements[2];

+                    aRule.protocol = transProtocol(elements[3]);

+                    aRule.comment = elements[4];

+                    rules.push(aRule);

+                }

+            }

+            return rules;

+        }

+    }

+    function setPortMap() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_PORT_MAP";

+            valueReq.portMapEnabled = values.portMapEnable;

+            valueReq.fromPort = values.sourcePort;

+            valueReq.ip_address = values.destIpAddress;

+            valueReq.toPort = values.destPort;

+            valueReq.protocol = values.protocol;

+            valueReq.comment = values.comment;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function enablePortMap() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "ADD_PORT_MAP";

+            valueReq.portMapEnabled = values.portMapEnable;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteMapRules() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "DEL_PORT_MAP";

+            valueReq.delete_id = values.indexs.join(';') + ";";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getTrafficAlertInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "data_volume_limit_switch,data_volume_limit_unit,data_volume_limit_size,data_volume_alert_percent,monthly_tx_bytes,monthly_rx_bytes,monthly_time,traffic_alined_delta",

+                multi_data: 1

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var isData = paramD.data_volume_limit_unit == 'data';

+                var result = {

+                    dataLimitChecked: paramD.data_volume_limit_switch,

+                    dataLimitTypeChecked: isData ? '1' : '0',

+                    limitDataMonth: isData ? paramD.data_volume_limit_size : '0',

+                    alertDataReach: isData ? paramD.data_volume_alert_percent : '0',

+                    limitTimeMonth: isData ? '0' : paramD.data_volume_limit_size,

+                    alertTimeReach: isData ? '0' : paramD.data_volume_alert_percent,

+                    monthlySent: paramD.monthly_tx_bytes == '' ? 0 : paramD.monthly_tx_bytes,

+                    monthlyReceived: paramD.monthly_rx_bytes == '' ? 0 : paramD.monthly_rx_bytes,

+                    monthlyConnectedTime: paramD.monthly_time == '' ? 0 : paramD.monthly_time,

+                    traffic_alined_delta: paramD.traffic_alined_delta == '' ? 0 : paramD.traffic_alined_delta

+                };

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setTrafficAlertInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var isData = values.dataLimitTypeChecked == '1';

+            var valueReq = {

+                goformId: "DATA_LIMIT_SETTING",

+                data_volume_limit_switch: values.dataLimitChecked

+            };

+            if (values.dataLimitChecked == '1') {

+                valueReq.data_volume_limit_unit = isData ? 'data' : 'time';

+                valueReq.data_volume_limit_size = isData ? values.limitDataMonth : values.limitTimeMonth;

+                valueReq.data_volume_alert_percent = isData ? values.alertDataReach : values.alertTimeReach;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUSSDResponse() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            if (values.sendOrReply == "send") {

+                return {

+                    goformId: "USSD_PROCESS",

+                    USSD_operator: values.operator,

+                    USSD_send_number: values.strUSSDCommand,

+                    notCallback: true

+                };

+            } else if (values.sendOrReply == "reply") {

+                return {

+                    goformId: "USSD_PROCESS",

+                    USSD_operator: values.operator,

+                    USSD_reply_number: values.strUSSDCommand,

+                    notCallback: true

+                };

+            }

+        }

+        function deal(paramD) {

+            if (!paramD) {

+                callback(false, "ussd_fail");

+                return;

+            }

+            if (paramD.result == "success") {

+                callbackTemp = callback;

+                getResponse();

+            } else {

+                callback(false, "ussd_fail");

+            }

+        }

+    }

+    function getResponse() {

+        $.ajax({

+            url: "/reqproc/proc_get",

+            data: {

+                cmd: "ussd_write_flag"

+            },

+            cache: false,

+            async: true,

+            dataType: "json",

+            success: function (result) {

+                if (result.ussd_write_flag == "1") {

+                    callbackTemp(false, "ussd_no_service");

+                } else if (result.ussd_write_flag == "4" || result.ussd_write_flag == "unknown" || result.ussd_write_flag == "3") {

+                    callbackTemp(false, "ussd_timeout");

+                } else if (result.ussd_write_flag == "15") {

+                    setTimeout(getResponse, 1000);

+                } else if (result.ussd_write_flag == "10") {

+                    callbackTemp(false, "ussd_retry");

+                } else if (result.ussd_write_flag == "99") {

+                    callbackTemp(false, "ussd_unsupport");

+                } else if (result.ussd_write_flag == "41") {

+                    callbackTemp(false, "operation_not_supported");

+                } else if (result.ussd_write_flag == "2") {

+                    callbackTemp(false, "network_terminated");

+                } else if (result.ussd_write_flag == "16") {

+                    $.ajax({

+                        url: "/reqproc/proc_get",

+                        data: {

+                            cmd: "ussd_data_info"

+                        },

+                        dataType: "json",

+                        async: true,

+                        cache: false,

+                        success: function (paramD) {

+                            var content = {};

+                            content.data = paramD.ussd_data;

+                            content.ussd_action = paramD.ussd_action;

+                            content.ussd_dcs = paramD.ussd_dcs;

+                            callbackTemp(true, content);

+                        },

+                        error: function () {

+                            callbackTemp(false, "ussd_info_error");

+                        }

+                    });

+                } else {

+                    callbackTemp(false, "ussd_fail");

+                }

+            },

+            error: function () {

+                callbackTemp(false, "ussd_fail");

+            }

+        });

+    }

+    function USSDReplyCancel(callback) {

+        $.ajax({

+            url: "/reqproc/proc_post",

+            data: {

+                goformId: "USSD_PROCESS",

+                USSD_operator: "ussd_cancel"

+            },

+            cache: false,

+            dataType: "json",

+            success: function (paramD) {

+                if (paramD.result == "success") {

+                    getCancelResponse();

+                } else {

+                    callback(false);

+                }

+            }

+        });

+        function getCancelResponse() {

+            $.ajax({

+                url: "/reqproc/proc_get",

+                data: {

+                    cmd: "ussd_write_flag"

+                },

+                cache: false,

+                async: true,

+                dataType: "json",

+                success: function (result) {

+                    if (result.ussd_write_flag == "15") {

+                        setTimeout(getCancelResponse, 1000);

+                    } else if (result.ussd_write_flag == "13") {

+                        callback(true);

+                    } else {

+                        callback(false);

+                    }

+                },

+                error: function () {

+                    callback(false);

+                }

+            });

+        }

+    }

+    function unlockNetwork() {

+        var callback = arguments[1];

+        var checkPoint = 0;

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "UNLOCK_NETWORK",

+                notCallback: true,

+                unlock_network_code: values.unlock_network_code

+            };

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                addCallback(checkUnlockNetworkStatus);

+            } else {

+                callback({

+                    result: 'fail'

+                });

+            }

+        }

+        function checkUnlockNetworkStatus() {

+            if (checkPoint > 5) {

+                removeCallback(checkUnlockNetworkStatus);

+                callback({

+                    result: 'fail'

+                });

+            } else if (informationAll.simStatus != 'modem_imsi_waitnck') {

+                removeCallback(checkUnlockNetworkStatus);

+                callback({

+                    result: 'success'

+                });

+            }

+            checkPoint++;

+        }

+    }

+    function getNetworkUnlockTimes() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "unlock_nck_time"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setUpdateInfoWarning() {

+        var callback = arguments[1];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "SET_UPGRADE_NOTICE",

+                upgrade_notice_flag: values.upgrade_notice_flag,

+                notCallback: true

+            };

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                callback(true);

+            } else {

+                callback(false);

+            }

+        }

+    }

+    function getUpdateInfoWarning() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "upgrade_notice_flag"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getAPStationBasic() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "wifi_sta_connection,pswan_priority,wifiwan_priority,ethwan_priority"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    ap_station_enable: paramD.wifi_sta_connection,

+                    ap_station_mode: parseInt(paramD.wifiwan_priority, 10) > parseInt(paramD.pswan_priority, 10) ? "wifi_pref" : "dial_pref"

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setAPStationBasic() {

+        var tmp = arguments[0];

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "WIFI_STA_CONTROL",

+                wifi_sta_connection: values.ap_station_enable

+            };

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                informationAll.ap_station_enable = tmp.ap_station_enable == 1;

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function refreshAPStationStatus() {

+        return getAPStationBasic({}, function (paramD) {

+            informationAll.ap_station_enable = paramD.ap_station_enable == 1;

+            informationAll.ap_station_mode = paramD.ap_station_mode;

+        });

+    }

+    function getHotspotList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var cmdStr = "wifi_profile_num,wifi_profile";

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                cmdStr = cmdStr + ",wifi_profile" + i;

+            }

+            return {

+                multi_data: 1,

+                cmd: cmdStr

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var wifiList = [];

+                for (var i = 0; i < config.AP_STATION_LIST_LENGTH; i++) {

+                    var wifiStr = "";

+                    if (i == 0) {

+                        wifiStr = paramD.wifi_profile;

+                    } else {

+                        wifiStr = paramD["wifi_profile" + i];

+                    }

+                    var wifiArray = wifiStr.split(";");

+                    for (var j = 0; j < wifiArray.length; j++) {

+                        var item = wifiArray[j].split(",");

+                        if (!item[0]) {

+                            break;

+                        }

+                        var wifiJson = {

+                            profileName: item[0],

+                            fromProvider: item[1],

+                            connectStatus: item[2],

+                            signal: item[3],

+                            ssid: item[4],

+                            authMode: item[5],

+                            encryptType: item[6],

+                            password: item[7] == "0" ? "" : item[7],

+                            keyID: item[8],

+                            mac: item[9]

+                        };

+                        wifiList.push(wifiJson);

+                    }

+                }

+                return {

+                    hotspotList: wifiList

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function searchHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "WLAN_SET_STA_REFRESH"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSearchHotspotList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "scan_finish,EX_APLIST,EX_APLIST1"

+            }

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.scan_finish == "0") {

+                    return {

+                        scan_finish: "0",

+                        hotspotList: []

+                    };

+                }

+                if (paramD.scan_finish == "2") {

+                    return {

+                        scan_finish: "2",

+                        hotspotList: []

+                    };

+                }

+                var wifiList = [];

+                for (var i = 0; i <= 1; i++) {

+                    var wifiStr;

+                    if (i == 0) {

+                        wifiStr = paramD.EX_APLIST;

+                    } else {

+                        wifiStr = paramD.EX_APLIST1;

+                    }

+                    var wifiArray = wifiStr.split(";");

+                    for (var j = 0; j < wifiArray.length; j++) {

+                        var item = wifiArray[j].split(",");

+                        if (!item[0]) {

+                            break;

+                        }

+                        var wifiJson = {

+                            fromProvider: item[0],

+                            connectStatus: item[1],

+                            ssid: item[2],

+                            signal: item[3],

+                            channel: item[4],

+                            authMode: item[5],

+                            encryptType: item[6],

+                            mac: item[7]

+                        }

+                        wifiList.push(wifiJson);

+                    }

+                }

+                return {

+                    scan_finish: "1",

+                    hotspotList: wifiList

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function creatHotspotString(hotspot) {

+        var tmp = [];

+        tmp.push(hotspot.profileName);

+        tmp.push(hotspot.fromProvider || "0");

+        tmp.push(hotspot.connectStatus || "0");

+        tmp.push(hotspot.signal);

+        tmp.push(hotspot.ssid);

+        tmp.push(hotspot.authMode);

+        tmp.push(hotspot.encryptType);

+        tmp.push(hotspot.password || "0");

+        tmp.push(hotspot.keyID);

+        tmp.push(hotspot.mac);

+        return tmp.join(",");

+    }

+    function saveHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var apList = values.apList;

+            var action = "modify";

+            if (values.profileName == "") {

+                action = "add";

+                var newName = (jQuery.fn.jquery + Math.random()).replace(/\D/g, "");

+                values.profileName = newName;

+                apList.push({

+                    profileName: newName,

+                    fromProvider: "0",

+                    connectStatus: "0",

+                    signal: values.signal,

+                    ssid: values.ssid,

+                    authMode: values.authMode,

+                    encryptType: values.encryptType,

+                    password: values.password || "0",

+                    keyID: values.keyID,

+                    mac: values.mac

+                });

+            }

+            var wifi = {

+                "profile0": []

+            };

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                wifi["profile" + i] = [];

+            }

+            var activeHotspotStr = "";

+            for (var i = 0; i < apList.length; i++) {

+                var hotspotStr = "";

+                if (values.profileName == apList[i].profileName) {

+                    hotspotStr = creatHotspotString(values);

+                    activeHotspotStr = hotspotStr;

+                } else {

+                    hotspotStr = creatHotspotString(apList[i]);

+                }

+                var index = parseInt(i % 10);

+                wifi["profile" + index].push(hotspotStr);

+            }

+            var profileParams = {

+                wifi_profile: wifi.profile0.join(";")

+            };

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                profileParams["wifi_profile" + i] = wifi["profile" + i].join(";");

+            }

+            var valueReq = $.extend({

+                goformId: "WIFI_SPOT_PROFILE_UPDATE",

+                wifi_profile_num: apList.length,

+                wifi_update_profile: activeHotspotStr,

+                action: action

+            }, profileParams);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var apList = values.apList;

+            var wifi = {

+                "profile0": []

+            };

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                wifi["profile" + i] = [];

+            }

+            var foundDelete = false;

+            var activeHotspotStr = "";

+            for (var i = 0; i < apList.length; i++) {

+                var hotspotStr = creatHotspotString(apList[i]);

+                if (apList[i].profileName == values.profileName) {

+                    foundDelete = true;

+                    activeHotspotStr = hotspotStr;

+                    continue;

+                }

+                var idIndex = i;

+                if (foundDelete) {

+                    idIndex = i - 1;

+                }

+                var index = parseInt(idIndex % 10);

+                wifi["profile" + index].push(hotspotStr);

+            }

+            var num = foundDelete ? apList.length - 1 : apList.length;

+            var profileParams = {

+                wifi_profile: wifi.profile0.join(";")

+            };

+            for (var i = 1; i < config.AP_STATION_LIST_LENGTH; i++) {

+                profileParams["wifi_profile" + i] = wifi["profile" + i].join(";");

+            }

+            var valueReq = $.extend({

+                goformId: "WIFI_SPOT_PROFILE_UPDATE",

+                wifi_profile_num: num,

+                wifi_update_profile: activeHotspotStr,

+                action: "delete"

+            }, profileParams);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function connectHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "WLAN_SET_STA_CON",

+                EX_SSID1: values.EX_SSID1,

+                EX_AuthMode: values.EX_AuthMode,

+                EX_EncrypType: values.EX_EncrypType,

+                EX_DefaultKeyID: values.EX_DefaultKeyID,

+                EX_WEPKEY: values.EX_WEPKEY,

+                EX_WPAPSK1: values.EX_WPAPSK1,

+                EX_wifi_profile: values.EX_wifi_profile,

+                EX_mac: values.EX_mac

+            };

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.result == "success" || paramD.result == "processing")) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function disconnectHotspot() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "WLAN_SET_STA_DISCON"

+            };

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getOpMode() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "blc_wan_mode,blc_wan_auto_mode,loginfo,ppp_status,rj45_state,ethwan_mode"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                if (paramD.blc_wan_mode == 'AUTO') {

+                    result.blc_wan_mode = paramD.blc_wan_auto_mode ? paramD.blc_wan_auto_mode : 'AUTO_PPP';

+                } else {

+                    result.blc_wan_mode = paramD.blc_wan_mode ? paramD.blc_wan_mode : 'PPP';

+                }

+                result.loginfo = paramD.loginfo;

+                result.ppp_status = paramD.ppp_status;

+                result.rj45_state = (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state;

+                result.ethwan_mode = paramD.ethwan_mode.toUpperCase();

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getRj45PlugState() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "rj45_plug"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.rj45_plug = paramD.rj45_plug == "" ? "wan_lan_off" : paramD.rj45_plug;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function checkOpMode(opmode, rj45state) {

+        if (config.RJ45_SUPPORT) {

+            if (rj45state == "dead" || rj45state == "") {

+                return 'PPP';

+            } else if (!opmode || opmode == "undefined") {

+                if (rj45state == "working") {

+                    return 'PPPOE';

+                } else {

+                    return 'PPP';

+                }

+            } else {

+                return opmode;

+            }

+        } else {

+            return 'PPP';

+        }

+    }

+    function SetOperationMode(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({

+                goformId: "OPERATION_MODE"

+            }, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPppoeParams() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "opms_wan_auto_mode,ethwan_mode,pppoe_username,pppoe_cc,ethwan_dialmode,ppp_status,static_wan_ipaddr,static_wan_netmask,static_wan_gateway,static_wan_primary_dns,static_wan_secondary_dns,rj45_state,lan_ipaddr,lan_netmask"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    opms_wan_auto_mode: paramD.opms_wan_auto_mode,

+                    ethwan_mode: paramD.ethwan_mode.toUpperCase(),

+                    pppoe_username: paramD.pppoe_username,

+                    pppoe_cc: paramD.pppoe_cc,

+                    ethwan_dialmode: paramD.ethwan_dialmode == "manual" ? "manual_dial" : "auto_dial",

+                    ppp_status: paramD.ppp_status,

+                    static_wan_ipaddr: paramD.static_wan_ipaddr,

+                    static_wan_netmask: paramD.static_wan_netmask,

+                    static_wan_gateway: paramD.static_wan_gateway,

+                    static_wan_primary_dns: paramD.static_wan_primary_dns,

+                    static_wan_secondary_dns: paramD.static_wan_secondary_dns,

+                    rj45_state: (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state,

+                    lan_ipaddr: paramD.lan_ipaddr,

+                    lan_netmask: paramD.lan_netmask

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setPppoeDialMode(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({

+                notCallback: true

+            }, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD.result == "success") {

+                callback({

+                    result: true

+                });

+            } else {

+                callback({

+                    result: false

+                });

+            }

+        }

+    }

+    function getSntpParams(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: 1,

+                cmd: "sntp_year,sntp_month,sntp_day,sntp_hour,sntp_minute,sntp_second,sntp_time_set_mode,sntp_static_server0,sntp_static_server1,sntp_static_server2,sntp_server0,sntp_server1,sntp_server2,sntp_server3,sntp_server4,sntp_server5,sntp_server6,sntp_server7,sntp_server8,sntp_server9,sntp_other_server0,sntp_other_server1,sntp_other_server2,sntp_timezone,sntp_timezone_index,sntp_dst_enable,ppp_status,sntp_process_result,rj45_state"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var sntp_servers = getSntpServers(paramD);

+                return {

+                    sntp_year: paramD.sntp_year,

+                    sntp_month: paramD.sntp_month,

+                    sntp_day: paramD.sntp_day,

+                    sntp_hour: paramD.sntp_hour,

+                    sntp_minute: paramD.sntp_minute,

+                    sntp_second: paramD.sntp_second,

+                    sntp_time_set_mode: paramD.sntp_time_set_mode,

+                    sntp_servers: sntp_servers,

+                    sntp_server0: paramD.sntp_server0,

+                    sntp_server1: paramD.sntp_server1,

+                    sntp_server2: paramD.sntp_server2,

+                    sntp_static_server0: paramD.sntp_static_server0,

+                    sntp_static_server1: paramD.sntp_static_server1,

+                    sntp_static_server2: paramD.sntp_static_server2,

+                    sntp_other_server0: paramD.sntp_other_server0,

+                    sntp_other_server1: paramD.sntp_other_server1,

+                    sntp_other_server2: paramD.sntp_other_server2,

+                    sntp_timezone: paramD.sntp_timezone,

+                    sntp_timezone_index: paramD.sntp_timezone_index ? paramD.sntp_timezone_index : "0",

+                    sntp_dst_enable: paramD.sntp_dst_enable,

+                    ppp_status: paramD.ppp_status,

+                    blc_wan_mode: informationAll.blc_wan_mode,

+                    sntp_process_result: paramD.sntp_process_result,

+                    rj45_state: (typeof paramD.rj45_state == 'undefined' || paramD.rj45_state == '') ? 'dead' : paramD.rj45_state

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+        function getSntpServers(paramD) {

+            var serverArray = [];

+            for (var i = 0; i < 3; i++) {

+                var tmp = "sntp_static_server" + (i).toString();

+                if (paramD[tmp] != "") {

+                    var obj = {};

+                    obj.name = paramD[tmp];

+                    obj.value = paramD[tmp];

+                    serverArray.push(obj);

+                }

+            }

+            var otherArray = [{

+                    name: "Other",

+                    value: "Other"

+                }, {

+                    name: "NONE",

+                    value: ""

+                }

+            ];

+            for (var j = 0; j < 2; j++) {

+                serverArray.push(otherArray[j]);

+            }

+            return serverArray;

+        }

+    }

+    function setSNTPDate(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSntpSetting(values, callback) {

+        var valueReq = $.extend({}, values); {

+            $.post("reqproc/proc_post", valueReq, function (paramD) {

+                if (paramD && paramD.result == "success") {

+                    if (values.manualsettime == "auto") {

+                        setTimeout(checkSyncStatus, 2000);

+                        callback(paramD);

+                    } else {

+                        callback(true);

+                    }

+                } else if (paramD && paramD.result == "processing") {

+                    callback(paramD);

+                } else {

+                    callback(false);

+                }

+            }, "json");

+        }

+        function checkSyncStatus() {

+            $.ajax({

+                url: "reqproc/proc_get",

+                dataType: "json",

+                data: {

+                    cmd: "sntp_process_result"

+                },

+                cache: false,

+                async: false,

+                success: function (paramD) {

+                    if (paramD.sntp_process_result == "failure") {

+                        callback(false);

+                    } else if (paramD.sntp_process_result == "success") {

+                        callback(true);

+                    } else {

+                        setTimeout(checkSyncStatus, 2000);

+                    }

+                },

+                error: function () {

+                    callback(false);

+                }

+            });

+        }

+    }

+    function addUrlFilterRule(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUrlFilterList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                cmd: "websURLFilters"

+            };

+        }

+        function deal(paramD) {

+            var urlFilterRules = [];

+            if (paramD) {

+                if (paramD.websURLFilters.length == 0) {

+                    return {

+                        urlFilterRules: []

+                    };

+                } else {

+                    var tempArray = paramD.websURLFilters.split(";");

+                    for (var i = 0; i < tempArray.length; i++) {

+                        var aRule = {};

+                        aRule.index = i;

+                        aRule.url = tempArray[i];

+                        urlFilterRules.push(aRule);

+                    }

+                    return {

+                        urlFilterRules: urlFilterRules

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function deleteSelectedRules(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getWdsInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: "1",

+                cmd: "wifi_wds_mode,wifi_wds_ssid,wifi_wds_AuthMode,wifi_wds_EncrypType,wifi_wds_WPAPSK1,wifi_cur_state "

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    currentMode: paramD.wifi_wds_mode,

+                    wdsSSID: paramD.wifi_wds_ssid,

+                    wdsAuthMode: paramD.wifi_wds_AuthMode,

+                    wdsEncrypType: paramD.wifi_wds_EncrypType,

+                    wdsWPAPSK1: paramD.wifi_wds_WPAPSK1,

+                    RadioOff: paramD.wifi_cur_state == "1" ? "1" : "0"

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setWDS(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSyslogInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: "1",

+                cmd: "syslog_mode,debug_level"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    currentMode: paramD.syslog_mode,

+                    debugLevel: paramD.debug_level

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setSysLog(values, callback) {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({}, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getMacFilterInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            return {

+                multi_data: "1",

+                cmd: "ACL_mode,wifi_mac_black_list,wifi_hostname_black_list,wifi_cur_state,user_ip_addr,client_mac_address,wifi_mac_white_list"

+            };

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    ACL_mode: paramD.ACL_mode,

+                    wifi_mac_black_list: paramD.wifi_mac_black_list,

+                    wifi_hostname_black_list: paramD.wifi_hostname_black_list,

+                    RadioOff: paramD.wifi_cur_state == "1" ? "1" : "0",

+                    user_ip_addr: paramD.user_ip_addr,

+                    client_mac_address: paramD.client_mac_address,

+                    wifi_mac_white_list: paramD.wifi_mac_white_list

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setMacFilter() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            var valueReq = $.extend({

+                goformId: 'WIFI_MAC_FILTER',

+            }, values);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getFastbootSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values) {

+            return {

+                cmd: "mgmt_quicken_power_on,need_hard_reboot,need_sim_pin",

+                multi_data: 1

+            };

+        }

+        function deal(paramD) {

+            return {

+                fastbootEnabled: paramD.mgmt_quicken_power_on == '1' ? '1' : '0',

+                need_hard_reboot: paramD.need_hard_reboot,

+                need_sim_pin: paramD.need_sim_pin == 'yes' ? 'yes' : 'no'

+            };

+        }

+    }

+    function setFastbootSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values) {

+            return {

+                goformId: "MGMT_CONTROL_POWER_ON_SPEED",

+                mgmt_quicken_power_on: values.fastbootEnabled

+            };

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function turnOffDevice() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "TURN_OFF_DEVICE";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function restart() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "REBOOT_DEVICE";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getScheduleSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "schedule_restart_enable,schedule_restart_hour,schedule_restart_minute";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.scheduleSetting = paramD.schedule_restart_enable == "1" ? "1" : "0";

+                result.scheduleHour = paramD.schedule_restart_hour;

+                result.scheduleMinute = paramD.schedule_restart_minute;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setScheduleSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SCHEDULE_SETTING";

+            valueReq.scheduleEnabled = values.scheduleSetting;

+            if (valueReq.scheduleEnabled == '1') {

+                valueReq.scheduleHour = values.scheduleHour;

+                valueReq.scheduleMinute = values.scheduleMinute;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPingResult() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "ping_result";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.pingResult = paramD.ping_result;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function pingResultClear() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "PING_RESULT_CLEAR";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPingSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "ping_repetition_count,ping_diag_addr";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.pingTimes = paramD.ping_repetition_count;

+                result.pingURL = paramD.ping_diag_addr;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setPingSettingStart() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "PINT_DIAGNOSTICS_START";

+            valueReq.ping_repetition_count = values.pingTimes;

+            valueReq.ping_diag_addr = values.pingURL;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getNewVersionState() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_new_version_state,fota_current_upgrade_state,fota_package_already_download";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var hasNewVersion = (paramD.fota_new_version_state == 'has_critical' || paramD.fota_new_version_state == 'has_optional' || paramD.fota_new_version_state == 'already_has_pkg');

+                paramD.hasNewVersion = hasNewVersion;

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function wefotagetNewVersionState() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "wefota_new_version_state,wefota_current_upgrade_state";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getMandatory() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            if (config.UPGRADE_TYPE == "OTA") {

+                valueReq.cmd = "is_mandatory";

+            } else {

+                valueReq.cmd = "fota_new_version_state";

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (config.UPGRADE_TYPE == "OTA") {

+                    return {

+                        "is_mandatory": paramD.is_mandatory == "1"

+                    };

+                } else {

+                    return {

+                        "is_mandatory": paramD.fota_new_version_state == "has_critical"

+                    };

+                }

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUpgradeResult() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "upgrade_result";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getCurrentUpgradeState() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_current_upgrade_state";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                paramD.current_upgrade_state = paramD.fota_current_upgrade_state;

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getPackSizeInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_pkg_total_size,fota_dl_pkg_size";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setUpgradeSelectOp() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "IF_UPGRADE";

+            valueReq.select_op = values.selectOp;

+            if (valueReq.select_op == 'check') {

+                valueReq.ota_manual_check_roam_state = 1;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_updateMode,fota_updateIntervalDay,fota_allowRoamingUpdate";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    updateMode: paramD.fota_updateMode,

+                    updateIntervalDay: paramD.fota_updateIntervalDay,

+                    allowRoamingUpdate: paramD.fota_allowRoamingUpdate

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SetUpgAutoSetting";

+            valueReq.UpgMode = values.updateMode;

+            valueReq.UpgIntervalDay = values.updateIntervalDay;

+            valueReq.UpgRoamPermission = values.allowRoamingUpdate;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getManualOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "fota_manualUpgradeURL";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return {

+                    updateURL: paramD.fota_manualUpgradeURL

+                };

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setManualOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SetUpgManualSetting";

+            valueReq.UpgURL = values.updateURL;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function setWefotaOTAUpdateSetting() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SetUpgWefotaSetting";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+

+    function getOTAlastCheckTime() {

+        return getParams({

+            nv: ['dm_last_check_time']

+        }, arguments[1], arguments[2]);

+    }

+    function getSignalStrength() {

+        return getParams({

+            nv: ['network_type', 'sub_network_type', 'rssi', 'rscp', 'lte_rsrp']

+        }, arguments[1], arguments[2]);

+    }

+    function clearUpdateResult() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "RESULT_RESTORE";

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function childGroupList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "childGroupList"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.childGroupList || paramD.devices)) {

+                return paramD;

+            } else {

+                return {

+                    devices: []

+                };

+            }

+        }

+    }

+    function addChildGroup() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "ADD_DEVICE",

+                mac: values.macAddress

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function removeChildGroup() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "DEL_DEVICE",

+                mac: values.mac

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function checkCurrentUserInChildGroup(devices) {

+        if (typeof config.currentUserInChildGroup == "undefined") {

+            var childGroupDevice = [];

+            if (typeof devices != "undefined") {

+                childGroupDevice = devices;

+            } else {

+                childGroupDevice = childGroupList({}).devices;

+            }

+            var userMacAddr = getUserMacAddr({}).get_user_mac_addr;

+            var found = _.find(childGroupDevice, function (item) {

+                return item.mac == userMacAddr;

+            });

+            config.currentUserInChildGroup = typeof found != 'undefined';

+            return {

+                result: typeof found != 'undefined'

+            };

+        }

+        return {

+            result: config.currentUserInChildGroup

+        };

+    }

+    function getUserMacAddr() {

+        return getParams({

+            nv: 'get_user_mac_addr'

+        }, arguments[1], arguments[2]);

+    }

+    function getHostNameList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "hostNameList"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.hostNameList || paramD.devices)) {

+                return paramD;

+            } else {

+                return {

+                    devices: []

+                };

+            }

+        }

+    }

+    function editHostName() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "EDIT_HOSTNAME",

+                mac: values.mac,

+                hostname: values.hostname

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getSiteWhiteList() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "site_white_list"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && (paramD.site_white_list || paramD.siteList)) {

+                return paramD;

+            } else {

+                return {

+                    siteList: []

+                };

+            }

+        }

+    }

+    function removeSiteWhite() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "REMOVE_WHITE_SITE",

+                ids: values.ids.join(',')

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function saveSiteWhite() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "ADD_WHITE_SITE",

+                name: values.name,

+                site: values.site

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getTimeLimited() {

+        var defaultResult = {

+            '0': [],

+            '1': [],

+            '2': [],

+            '3': [],

+            '4': [],

+            '5': [],

+            '6': []

+        };

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "time_limited"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return parseTimeLimited(paramD);

+            } else {

+                return defaultResult;

+            }

+        }

+        function parseTimeLimited(paramD) {

+            if (paramD.time_limited == '') {

+                return {

+                    time_limited: []

+                };

+            }

+            var weeks = paramD.time_limited.split(';');

+            _.each(weeks, function (week) {

+                var weekTime = week.split('+');

+                if (weekTime.length == 2) {

+                    defaultResult[weekTime[0]] = weekTime[1].split(',');

+                }

+            });

+            return defaultResult;

+        }

+    }

+    function saveTimeLimited() {

+        return stuffMake(arguments, config.currentUserInChildGroup == false ? {}

+             : {

+            errorType: 'no_auth'

+        }, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "SAVE_TIME_LIMITED",

+                time_limited: values.time

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getTsw() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "openEnable,closeEnable,openTime,closeTime",

+                multi_data: '1'

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                if (paramD.openTime.indexOf(':') != -1) {

+                    var open = paramD.openTime.split(':');

+                    paramD.openH = leftInsert(open[0], 2, '0');

+                    paramD.openM = leftInsert(open[1], 2, '0');

+                } else {

+                    paramD.openH = '06';

+                    paramD.openM = '00';

+                }

+                if (paramD.closeTime.indexOf(':') != -1) {

+                    var close = paramD.closeTime.split(':');

+                    paramD.closeH = leftInsert(close[0], 2, '0');

+                    paramD.closeM = leftInsert(close[1], 2, '0');

+                } else {

+                    paramD.closeH = '22';

+                    paramD.closeM = '00';

+                }

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function saveTsw() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "SAVE_TSW",

+                openEnable: values.openEnable,

+                closeEnable: values.closeEnable

+            };

+            if (values.openEnable == '1') {

+                valueReq.openTime = values.openTime;

+                valueReq.closeTime = values.closeTime;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else if (paramD && paramD.result == 'failure') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function trafficCalibration() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {

+                goformId: "FLOW_CALIBRATION_MANUAL",

+                calibration_way: values.way,

+                time: values.way == 'time' ? values.value : 0,

+                data: values.way == 'data' ? values.value : 0

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == 'success') {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getParams() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            if (_.isArray(values.nv)) {

+                valueReq.cmd = values.nv.join(',');

+                valueReq.multi_data = 1;

+            } else {

+                valueReq.cmd = values.nv;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getRedirectData() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "vwim_mc_state,traffic_overrun,detect_new_version";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.vwim_mc_state = paramD.vwim_mc_state;

+                result.traffic_overrun = paramD.traffic_overrun;

+                result.detect_new_version = paramD.detect_new_version;

+                result.blc_wan_mode = informationAll.blc_wan_mode;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function clearRedirectFlag() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "CLEAR_REDIRECT_FLAG";

+            valueReq.flag_id = values.redirectFlags;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getV4Switch() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "lock_zone_enable,pin_interlock_and_V4_lock";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setV4Switch() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "PIN_LOCK_V4_ENCODE";

+            valueReq.pin_interlock_and_V4_lock = values.pin_interlock_and_V4_lock;

+            valueReq.TspLock_key_data = values.TspLock_key_data;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getCellId() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "cell_id_list,global_cell_id,network_type,sub_network_type,cell_not_correct";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setCellIdSwitch() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "LOCK_ZONE";

+            valueReq.lock_zone_enable = values.lock_zone_enable;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD && paramD.result == "success") {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getUpdateType() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {

+                cmd: "update_type"

+            };

+            return valueReq;

+        }

+        function deal(paramD) {

+            return {

+                update_type: paramD.update_type ? paramD.update_type : "mifi_fota"

+            }

+        }

+    }

+    function getSecurityInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.cmd = "AuthMode,passPhrase";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {};

+                result.AuthMode = paramD.AuthMode;

+                result.passPhrase = config.PASSWORD_ENCODE ? Base64.decode(paramD.passPhrase) : paramD.passPhrase;

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    //can delete

+    function setSecurityInfo() {

+        return stuffMake(arguments, {}, prepare, deal, null, true);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            valueReq.goformId = "SET_WIFI_SECURITY_INFO";

+            valueReq.AuthMode = values.AuthMode;

+            if (valueReq.AuthMode == "WPAPSKWPA2PSK") {

+                valueReq.passPhrase = config.PASSWORD_ENCODE ? Base64.encode(values.passPhrase) : values.passPhrase;

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }	

+    function setWifiBasic() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var valueReq = {

+                goformId: "SET_WIFI_SSID1_SETTINGS",

+                ssid: values.SSID,

+                broadcastSsidEnabled: values.broadcast,

+                MAX_Access_num: values.station,

+                security_mode: values.AuthMode,

+                cipher: values.cipher,

+                NoForwarding: values.NoForwarding,

+                show_qrcode_flag: values.show_qrcode_flag

+            };

+            if (config.WIFI_WEP_SUPPORT) {

+                valueReq.wep_default_key = values.wep_default_key;

+                valueReq.wep_key_1 = values.wep_key_1;

+                valueReq.wep_key_2 = values.wep_key_2;

+                valueReq.wep_key_3 = values.wep_key_3;

+                valueReq.wep_key_4 = values.wep_key_4;

+                if (values.wep_default_key == '1') {

+                    valueReq.WEP2Select = values.WEP2Select;

+                } else if (values.wep_default_key == '2') {

+                    valueReq.WEP3Select = values.WEP3Select;

+                } else if (values.wep_default_key == '3') {

+                    valueReq.WEP4Select = values.WEP4Select;

+                } else {

+                    valueReq.WEP1Select = values.WEP1Select;

+                }

+            }

+            if (values.AuthMode == "WPAPSK" || values.AuthMode == "WPA2PSK" || values.AuthMode == "WPAPSKWPA2PSK" || values.AuthMode == "WPA3Personal" || values.AuthMode == "WPA2WPA3") {

+                valueReq.security_shared_mode = values.cipher;

+                valueReq.passphrase = config.PASSWORD_ENCODE ? Base64.encode(values.passPhrase) : values.passPhrase;

+            } else if (values.AuthMode == "SHARED") {

+                valueReq.security_shared_mode = "WEP";

+                valueReq.security_mode = "SHARED";

+            } else {

+                if (values.encryptType == "WEP") {

+                    valueReq.security_shared_mode = "WEP";

+                    valueReq.security_mode = "OPEN";

+                } else {

+                    valueReq.security_shared_mode = "NONE";

+                }

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function setWifiBasic4SSID2() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var valueReq = {

+                goformId: "SET_WIFI_SSID2_SETTINGS",

+                m_SSID: values.m_SSID,

+                m_HideSSID: values.m_broadcast,

+                m_MAX_Access_num: values.m_station,

+                m_AuthMode: values.m_AuthMode,

+                cipher: values.m_cipher,

+                m_NoForwarding: values.m_NoForwarding,

+                m_show_qrcode_flag: values.m_show_qrcode_flag

+            };

+            if (config.WIFI_WEP_SUPPORT) {

+                valueReq.m_DefaultKeyID = values.m_wep_default_key;

+                valueReq.m_Key1Str1 = values.m_wep_key_1;

+                valueReq.m_Key2Str1 = values.m_wep_key_2;

+                valueReq.m_Key3Str1 = values.m_wep_key_3;

+                valueReq.m_Key4Str1 = values.m_wep_key_4;

+                if (values.m_wep_default_key == '1') {

+                    valueReq.m_Key2Type = values.m_WEP2Select;

+                } else if (values.m_wep_default_key == '2') {

+                    valueReq.m_Key3Type = values.m_WEP3Select;

+                } else if (values.m_wep_default_key == '3') {

+                    valueReq.m_Key4Type = values.m_WEP4Select;

+                } else {

+                    valueReq.m_Key1Type = values.m_WEP1Select;

+                }

+            }

+            if (values.m_AuthMode == "WPAPSK" || values.m_AuthMode == "WPA2PSK" || values.m_AuthMode == "WPAPSKWPA2PSK" || values.m_AuthMode == "WPA3Personal" || values.m_AuthMode == "WPA2WPA3") {

+                valueReq.m_EncrypType = values.m_cipher;

+                valueReq.m_WPAPSK1 = config.PASSWORD_ENCODE ? Base64.encode(values.m_passPhrase) : values.m_passPhrase;

+            } else if (values.m_AuthMode == "SHARED") {

+                valueReq.m_EncrypType = "WEP";

+                valueReq.m_security_mode = "SHARED";

+            } else {

+                if (values.m_encryptType == "WEP") {

+                    valueReq.m_EncrypType = "WEP";

+                    valueReq.m_security_mode = "OPEN";

+                } else {

+                    valueReq.m_EncrypType = "NONE";

+                }

+            }

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function getWifiBasic() {

+        return stuffMake(arguments, {}, prepare, deal, null, false);

+        function prepare(values, isPost) {

+            var valueReq = {};

+            var wpapsk = config.PASSWORD_ENCODE ? "WPAPSK1_encode,m_WPAPSK1_encode," : "imei,rnum_js,WPAPSK1_enaes,m_WPAPSK1_enaes,";

+            valueReq.cmd = "m_ssid_enable,wifi_cur_state,NoForwarding,m_NoForwarding," + wpapsk + "MAX_Station_num," + "SSID1,AuthMode,HideSSID,MAX_Access_num,show_qrcode_flag,EncrypType,Key1Str1,Key2Str1,Key3Str1,Key4Str1,DefaultKeyID," + "m_SSID,m_AuthMode,m_HideSSID,m_MAX_Access_num,m_EncrypType,m_show_qrcode_flag,m_DefaultKeyID,m_Key1Str1,m_Key2Str1,m_Key3Str1,m_Key4Str1,rotationFlag,wifi_sta_connection";

+            valueReq.multi_data = 1;

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                var result = {

+                    wifi_enable: paramD.wifi_cur_state == "1" ? "1" : "0",

+                    multi_ssid_enable: paramD.m_ssid_enable,

+                    MAX_Station_num: $.isNumeric(paramD.MAX_Station_num) ? paramD.MAX_Station_num : config.MAX_STATION_NUMBER,

+                    AuthMode: paramD.AuthMode,

+                    SSID: paramD.SSID1,

+                    broadcast: paramD.HideSSID,

+                    apIsolation: paramD.NoForwarding,

+                    passPhrase: config.PASSWORD_ENCODE ? Base64.decode(paramD.WPAPSK1_encode) : wifiDecode(paramD.rnum_js,paramD.imei,paramD.WPAPSK1_enaes),

+                    MAX_Access_num: paramD.MAX_Access_num,

+                    cipher: paramD.EncrypType == "TKIP" ? "0" : paramD.EncrypType == "AES" ? 1 : 2,

+                    encryptType: paramD.EncrypType,

+                    show_qrcode_flag: paramD.show_qrcode_flag == "1" ? true : false,

+                    keyID: paramD.DefaultKeyID,

+                    Key1Str1: paramD.Key1Str1,

+                    Key2Str1: paramD.Key2Str1,

+                    Key3Str1: paramD.Key3Str1,

+                    Key4Str1: paramD.Key4Str1,

+                    m_SSID: paramD.m_SSID,

+                    m_broadcast: paramD.m_HideSSID,

+                    m_apIsolation: paramD.m_NoForwarding,

+                    m_MAX_Access_num: paramD.m_MAX_Access_num,

+                    m_AuthMode: paramD.m_AuthMode,

+                    m_passPhrase: config.PASSWORD_ENCODE ? Base64.decode(paramD.m_WPAPSK1_encode) : wifiDecode(paramD.rnum_js,paramD.imei,paramD.m_WPAPSK1_enaes),

+                    m_cipher: paramD.m_EncrypType == "TKIP" ? "0" : paramD.m_EncrypType == "AES" ? 1 : 2,

+                    m_show_qrcode_flag: paramD.m_show_qrcode_flag == "1" ? true : false,

+                    m_encryptType: paramD.m_EncrypType,

+                    m_keyID: paramD.m_DefaultKeyID,

+                    m_Key1Str1: paramD.m_Key1Str1,

+                    m_Key2Str1: paramD.m_Key2Str1,

+                    m_Key3Str1: paramD.m_Key3Str1,

+                    m_Key4Str1: paramD.m_Key4Str1,

+                    rotationFlag: paramD.rotationFlag,

+                    ap_station_enable: paramD.wifi_sta_connection

+                };

+                return result;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }	

+    function setWifiBasicMultiSSIDSwitch() {

+        stuffMakeAndCheckServerIsOnline(arguments, prepare, deal);

+        function prepare(values) {

+            var paraTemp = values;

+            if (values.wifiEnabled == '0') {

+                paraTemp = {

+                    wifiEnabled: values.wifiEnabled

+                }

+            }

+            var valueReq = $.extend({

+                goformId: "SET_WIFI_INFO",

+            }, paraTemp);

+            return valueReq;

+        }

+        function deal(paramD) {

+            if (paramD) {

+                return paramD;

+            } else {

+                return errUnknownObj;

+            }

+        }

+    }

+    function stuffMake(array, result, prepare, dealMethod, errorObject, isPost) {

+        var values = array[0],

+        callback = array[1],

+        errorCallback = array[2];

+        var objectToReturn;

+        if (result && typeof result.errorType === 'string') {

+            objectToReturn = $.extend(errUnknownObj, result);

+            if (!callback) {

+                return objectToReturn;

+            }

+            doCallback(objectToReturn, callback, errorCallback);

+        } else {

+            objectToReturn = $.extend({}, result);

+            var valueReq;

+            if (prepare) {

+                valueReq = prepare(values, isPost);

+            } else {

+                valueReq = values;

+            }

+            if (!callback) {

+                if (valueReq && (valueReq.cmd || valueReq.goformId)) {

+                    var r = reqSync(valueReq, isPost);

+                    if (dealMethod) {

+                        objectToReturn = $.extend({}, dealMethod(r));

+                    } else {

+                        objectToReturn = r;

+                    }

+                }

+                return objectToReturn;

+            } else {

+                if (valueReq && (valueReq.cmd || valueReq.goformId)) {

+                    reqAsync(valueReq, function (paramD) {

+                        if (dealMethod) {

+                            objectToReturn = $.extend({}, dealMethod(paramD));

+                        } else {

+                            objectToReturn = $.extend({}, paramD);

+                        }

+                        if (!valueReq.notCallback) {

+                            doCallback(objectToReturn, callback, errorCallback);

+                        }

+                    }, function () {

+                        if (errorObject) {

+                            objectToReturn = $.extend(errUnknownObj, errorObject);

+                        } else {

+                            objectToReturn = $.extend(errUnknownObj, {

+                                errorType: 'Unknown'

+                            });

+                        }

+                        doCallback(objectToReturn, callback, errorCallback);

+                    }, isPost);

+                } else {

+                    doCallback(objectToReturn, callback, errorCallback);

+                }

+            }

+        }

+        function doCallback(resultToReturn, callback, errorCallback) {

+            errorCallback = errorCallback ? errorCallback : callback;

+            if (isErrorObject(resultToReturn)) {

+                switch (resultToReturn.errorType) {

+                case 'cellularNetworkError':

+                case 'deviceError':

+                case 'wifiConnectionError':

+                    window.receivedNonSpecificError(resultToReturn);

+                    break;

+                default:

+                    errorCallback(resultToReturn);

+                }

+            } else {

+                callback(resultToReturn);

+            }

+        }

+    }	

+    function reqSync(values, isPost) {

+        return reqAJAX(values, null, null, false, isPost);

+    }

+    function reqAsync(values, successCallback, errorCallback, isPost) {

+        reqAJAX(values, successCallback, errorCallback, true, isPost);

+    }

+    function getString(values){

+    var regexp = /^[A-z0-9]+$/;

+    var matches = values.match(regexp);

+    if (matches == null){

+        return "error";

+    } else {

+        return values;

+    }

+    }

+    function reqAJAX(values, successCallback, errorCallback, async, isPost) {

+        var result = null;

+        $.ajax({

+            type: !!isPost ? "POST" : "GET",

+            url: isPost ? "/reqproc/proc_post" : values.cmd ? "/reqproc/proc_get" : "/reqproc/proc_post",

+            data: values,

+            dataType: "json",

+            async: !!async,

+            cache: false,

+            error: function (paramD) {

+                if (async) {

+                    errorCallback(paramD);

+                } else if (paramD.status == 200) {

+                    result = jQuery.parseJSON('(' + getString(paramD.responseText) + ')');

+                }

+            },

+            success: function (paramD) {

+                if (async) {

+                    successCallback(paramD);

+                } else {

+                    result = paramD;

+                }

+            }

+        });

+        if (!async) {

+            return result;

+        }

+    }

+	    var informationAll = {

+        networkType: "",

+        signalImg: "0",

+        spn_b1_flag: "1",

+        spn_name_data: "",

+        spn_b2_flag: "1",

+        networkOperator: "China Mobile",

+        connectStatus: "ppp_disconnected",

+        rj45ConnectStatus: "rj45_dead",

+        attachedDevices: [],

+        ssid1AttachedNum: 0,

+        ssid2AttachedNum: 0,

+        data_counter: {

+            uploadRate: 0,

+            downloadRate: 0,

+            totalSent: 0,

+            totalReceived: 0,

+            totalConnectedTime: 0,

+            currentSent: 0,

+            currentReceived: 0,

+            currentConnectedTime: 0,

+            monthlySent: 0,

+            monthlyReceived: 0,

+            monthlyConnectedTime: 0,

+            month: ''

+        },

+        newSmsReceived: false,

+        smsReportReceived: false,

+        smsUnreadCount: "0",

+        isLoggedIn: undefined,

+        limitVolumeEnable: false,

+        limitVolumeType: '1',

+        limitVolumePercent: "100",

+        limitVolumeSize: "0",

+        allowRoamingUpdate: "0",

+        blc_wan_mode: "",

+        ap_station_enable: undefined,

+        ap_station_mode: undefined,

+        dialMode: '',

+        ethWanMode: 'AUTO',

+        fota_user_selector: '',

+        defaultWanName: ""

+    };

+    var errUnknownObj = {

+        errorType: 'UnknownError',

+        errorId: '123',

+        errorText: 'UnknownError'

+    };

+    var updateTimerFlag = true;	

+    return {

+        clearRedirectFlag: clearRedirectFlag,

+        connect: connect,

+        disconnect: disconnect,

+        getSIMPhoneBookCapacity: getSIMPhoneBookCapacity,

+        getDevicePhoneBookCapacity: getDevicePhoneBookCapacity,

+		getDevicePhoneBooks: getDevicePhoneBooks,

+        getSIMPhoneBooks: getSIMPhoneBooks,

+        getPhoneBooks: getPhoneBooks,

+        getPhoneBookReady: getPhoneBookReady,

+        getPhoneBooksByGroup: getPhoneBooksByGroup,

+        deletePhoneBooks: deletePhoneBooks,

+        deleteAllPhoneBooks: deleteAllPhoneBooks,

+        deleteAllPhoneBooksByGroup: deleteAllPhoneBooksByGroup,		

+        savePhoneBook: savePhoneBook,

+        deleteAllMessages: deleteAllMessages,

+        deleteMessage: deleteMessage,

+        setSmsRead: setSmsRead,

+        sendSMS: sendSMS,

+        saveSMS: saveSMS,

+        getSMSReady: getSMSReady,

+        getSMSMessages: getSMSMessages,

+        getSMSDeliveryReport: getSMSDeliveryReport,

+        getSmsCapability: getSmsCapability,

+        resetNewSmsReceivedVar: resetNewSmsReceivedVar,

+        resetSmsReportReceivedVar: resetSmsReportReceivedVar,

+        getSmsSetting: getSmsSetting,

+        setSmsSetting: setSmsSetting,

+		getAttachedCableDevices: getAttachedCableDevices,

+		getCurrentlyAttachedDevicesInfo: getCurrentlyAttachedDevicesInfo,

+		getConnectionInfo: getConnectionInfo,

+        getRedirectData: getRedirectData,

+        getLanguage: getLanguage,

+        setLanguage: setLanguage,

+        getNetSelectInfo: getNetSelectInfo,		

+        getSecurityInfo: getSecurityInfo,

+        setSecurityInfo: setSecurityInfo,

+        getStatusInfo: getStatusInfo,

+        getConnectionMode: getConnectionMode,

+        setConnectionMode: setConnectionMode,

+        getWifiBasic: getWifiBasic,

+        setWifiBasic: setWifiBasic,

+        setWifiBasic4SSID2: setWifiBasic4SSID2,

+        setWifiBasicMultiSSIDSwitch: setWifiBasicMultiSSIDSwitch, 

+        getWpsInfo: getWpsInfo,

+        openWps: openWps,

+        getSleepMode: getSleepMode,

+        setSleepMode: setSleepMode,

+        getWifiAdvance: getWifiAdvance,

+        setWifiAdvance: setWifiAdvance,

+        getWifiRange: getWifiRange,

+        setWifiRange: setWifiRange,

+

+        getLoginStatus: getLoginStatus,

+        getLoginData: getLoginData,

+        login: login,

+        logout: logout, 

+        changeManageInfo: changeManageInfo,

+        getPinData: getPinData,

+        enablePin: enablePin,

+        disablePin: disablePin,

+        changePin: changePin,

+		enterPIN: enterPIN,

+        enterPUK: enterPUK,

+        getLanInfo: getLanInfo,

+        setLanInfo: setLanInfo,       

+        getApnSettings: getApnSettings,

+        getNetworkStatus: getNetworkStatus,

+        deleteApn: deleteApn,

+        setDefaultApn: setDefaultApn,

+        addOrEditApn: addOrEditApn,

+        getQuickSettingInfo: getQuickSettingInfo,

+        setQuickSetting4IPv6: setQuickSetting4IPv6,

+        scanForNetwork: scanForNetwork,

+        setBearerPreference: setBearerPreference,

+        editHostName: editHostName,

+        getSiteWhiteList: getSiteWhiteList,

+        removeSiteWhite: removeSiteWhite,

+        saveSiteWhite: saveSiteWhite,

+        setNetwork: setNetwork,

+        getUpnpSetting: getUpnpSetting,

+        setUpnpSetting: setUpnpSetting,

+        getDmzSetting: getDmzSetting,

+        setDmzSetting: setDmzSetting,

+        getDeviceInfo: getDeviceInfo,

+        getDeviceInfoLow: getDeviceInfoLow,

+        getPortForward: getPortForward,

+        setPortForward: setPortForward,

+        getPortFilter: getPortFilter,

+        setPortFilterBasic: setPortFilterBasic,

+        setPortFilter: setPortFilter,

+        deleteFilterRules: deleteFilterRules,

+        getPortMap: getPortMap,

+        setPortMap: setPortMap,

+        enablePortMap: enablePortMap,

+        deleteMapRules: deleteMapRules,

+        getTrafficAlertInfo: getTrafficAlertInfo,

+        setTrafficAlertInfo: setTrafficAlertInfo,

+        getCurrentUpgradeState: getCurrentUpgradeState,

+        setUpgradeSelectOp: setUpgradeSelectOp,

+        addTimerThings: addTimerSomething,

+        removeTimerThings: removeTimerSomething,

+        getPackSizeInfo: getPackSizeInfo,

+        getMandatory: getMandatory,

+        getOTAUpdateSetting: getOTAUpdateSetting,

+        setOTAUpdateSetting: setOTAUpdateSetting,

+        getManualOTAUpdateSetting: getManualOTAUpdateSetting,

+        setManualOTAUpdateSetting: setManualOTAUpdateSetting,

+        setWefotaOTAUpdateSetting: setWefotaOTAUpdateSetting,

+        getSignalStrength: getSignalStrength,

+        getOTAlastCheckTime: getOTAlastCheckTime,

+        clearUpdateResult: clearUpdateResult,

+        refreshAPStationStatus: refreshAPStationStatus,

+        getSntpParams: getSntpParams,

+        setSntpSetting: setSntpSetting,

+        setSNTPDate: setSNTPDate,

+        restoreFactorySettings: restoreFactorySettings,

+        checkRestoreStatus: checkRestoreStatus,

+        getSysSecurity: getSysSecurity,

+        setSysSecurity: setSysSecurity,

+        deleteForwardRules: deleteForwardRules,

+        enableVirtualServer: enableVirtualServer,

+        getSDConfiguration: getSDConfiguration,

+        setSdCardMode: setSdCardMode,

+        checkFileExists: checkFileExists,

+        getFileList: getFileList,

+        fileRename: fileRename,

+        getSdMemorySizes: getSdMemorySizes,

+        deleteFilesAndFolders: deleteFilesAndFolders,

+        createFolder: createFolder,

+        setSdCardSharing: setSdCardSharing,

+        setUpdateInfoWarning: setUpdateInfoWarning,

+        getUpdateInfoWarning: getUpdateInfoWarning,

+        getAPStationBasic: getAPStationBasic,

+        setAPStationBasic: setAPStationBasic,

+        getWdsInfo: getWdsInfo,

+        setWDS: setWDS,

+        addUrlFilterRule: addUrlFilterRule,

+        getUrlFilterList: getUrlFilterList,

+        deleteSelectedRules: deleteSelectedRules,

+        getMacFilterInfo: getMacFilterInfo,

+        setMacFilter: setMacFilter,

+        getFastbootSetting: getFastbootSetting,

+        setFastbootSetting: setFastbootSetting,

+        turnOffDevice: turnOffDevice,

+        restart: restart,

+        getScheduleSetting: getScheduleSetting,

+        setScheduleSetting: setScheduleSetting,

+        getPingResult: getPingResult,

+        pingResultClear: pingResultClear,

+        getPingSetting: getPingSetting,

+        setPingSettingStart: setPingSettingStart,

+        updateTimerFlag: updateTimerFlag,

+        childGroupList: childGroupList,

+        addChildGroup: addChildGroup,

+        removeChildGroup: removeChildGroup,

+        checkCurrentUserInChildGroup: checkCurrentUserInChildGroup,

+        getTimeLimited: getTimeLimited,

+        saveTimeLimited: saveTimeLimited,

+        getHostNameList: getHostNameList,

+        getHotspotList: getHotspotList,

+        searchHotspot: searchHotspot,

+        getSearchHotspotList: getSearchHotspotList,

+        saveHotspot: saveHotspot,

+        deleteHotspot: deleteHotspot,

+        connectHotspot: connectHotspot,

+        disconnectHotspot: disconnectHotspot,

+        getOpMode: getOpMode,

+        getRj45PlugState: getRj45PlugState,

+        SetOperationMode: SetOperationMode,

+        getPppoeParams: getPppoeParams,

+        setPppoeDialMode: setPppoeDialMode,

+        getTsw: getTsw,

+        saveTsw: saveTsw,

+        trafficCalibration: trafficCalibration,

+        getParams: getParams,

+        getNewVersionState: getNewVersionState,

+        wefotagetNewVersionState: wefotagetNewVersionState,

+        getUpgradeResult: getUpgradeResult,

+        getV4Switch: getV4Switch,

+        setV4Switch: setV4Switch,

+        getCellId: getCellId,

+        setCellIdSwitch: setCellIdSwitch,

+        getDdnsParams: getDdnsParams,

+        setDDNSForward: setDDNSForward,

+        getUpdateType: getUpdateType,

+        getCurretnMAC: getCurretnMAC,

+        getUSSDResponse: getUSSDResponse,

+        USSDReplyCancel: USSDReplyCancel,

+        getNetworkUnlockTimes: getNetworkUnlockTimes,

+        unlockNetwork: unlockNetwork,	

+        getSyslogInfo: getSyslogInfo,

+        setSysLog: setSysLog,		

+    };

+});

+

+ // Router����

+

+define("adm_lan","jquery knockout set service".split(" "),

+

+    function ($, ko, config, service) {

+

+    var originfrmLan = "";

+

+    // ��ȡ·������������Ϣ

+    function getLanInfo() {

+        return service.getLanInfo();

+    }	

+

+    function hex(val) {

+        var h = (val - 0).toString(16);

+        if (h.length == 1)

+            h = '0' + h;

+        return h.toUpperCase();

+    }	

+

+    function LanViewModel() {

+        var target = this;

+

+        var info = getLanInfo();

+

+        target.dhcpStart = ko.observable(info.dhcpStart);

+        target.dhcpEnd   = ko.observable(info.dhcpEnd);

+        target.dhcpLease = ko.observable(info.dhcpLease);		

+

+        target.ipAddress  = ko.observable(info.ipAddress);

+        target.subnetMask = ko.observable(info.subnetMask);

+        target.dhcpServer = ko.observable(info.dhcpServer);

+

+		target.macAddress = ko.observable(info.macAddress);

+        target.showMacAddress = ko.observable(config.SHOW_MAC_ADDRESS);

+

+        target.hasWifi        = ko.observable(config.HAS_WIFI);

+        target.hasUssd        = config.HAS_USSD;

+        target.hasDdns        = config.DDNS_SUPPORT;

+

+        target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+

+        target.clear = function () {

+            clearTimer();

+            init();

+            clearValidateMsg();

+        };		

+

+        target.refreshStatus = function () {

+            var connInfo = service.getConnectionInfo();

+            if (connInfo.connectStatus == 'ppp_disconnected') {

+                $('input', '#frmLan').each(function () {

+                    $(this).attr("disabled", false);

+                });

+            } else {

+                $('input', '#frmLan').each(function () {

+                    $(this).attr("disabled", true);

+                });

+

+                clearValidateMsg();

+            }

+        };

+

+        // ������Ӧ�������������ñ���

+        target.saveAct = function () {

+            showLoading();

+            var params = {

+                ipAddress:  target.ipAddress(),

+                subnetMask: target.subnetMask(),

+                dhcpServer: target.dhcpServer(),

+                dhcpStart:  target.dhcpStart(),

+                dhcpEnd:    target.dhcpEnd(),

+                dhcpLease:  target.dhcpLease()

+            };

+

+            service.setLanInfo(params, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                    target.clear();

+                } else {

+                    errorOverlay();

+                }

+            });

+        };		

+

+        // ������Ӧ�������������ñ���

+        target.save = function () {

+            var frmLanObj = $('#frmLan').serialize();

+            if (frmLanObj == originfrmLan) {

+                showAlert("setting_no_change");

+                return false;

+            }

+            if (config.RJ45_SUPPORT) {

+                var pppObj = service.getPppoeParams();

+                if (sf_isValidate_StaticIP(pppObj.static_wan_ipaddr, target.ipAddress(), target.subnetMask())) {

+                    showAlert("lan_tip_staticip_notsame");

+                    return false;

+                }

+            }

+            showConfirm("lan_confirm_reopen", function () {

+                target.saveAct();

+            });

+        };

+

+            target.refreshStatus();

+            // dhcpServer�л���Ӧ����

+            target.dhcpServerHandler = function () {

+                $("#txtIpAddress").parent().find(".error").hide();

+                $("#txtIpAddress").show();

+                return true;

+            };

+        addTimeout(function () {

+            originfrmLan = $('#frmLan').serialize();

+        }, 500);

+    }

+

+

+    function sf_opAnd4Byte(i_v1, i_v2) {

+        var index;

+        var var1 = [];

+        var var2 = [];

+        var result='0x';

+

+        for (index=2,index_tmp=0; index<10; index+=2,index_tmp++) {

+            var1[index_tmp]='0x'+i_v1.substring(index,index+2);

+            var2[index_tmp]='0x'+i_v2.substring(index,index+2);

+        }

+

+        for (index=0; index<4; index++) {

+            result = result + hex(var1[index]&var2[index]);

+        }

+

+        return result - 0;

+    }

+

+    // �������ر���У������	

+    $.validator.addMethod("dhcp_check", function (i_value, i_element, i_parameter) {

+        var dhcpIp =  i_parameter == "start" ?  $('#txtDhcpIpPoolStart').val() : $('#txtDhcpIpPoolEnd').val();

+        var result = sf_isValidate_Gateway($('#txtIpAddress').val(), $('#txtSubnetMask').val(), dhcpIp);

+        return this.optional(i_element) || result;

+    });

+

+    $.validator.addMethod("dhcpCompare", function (i_value, i_element, i_parameter) {

+        var result;

+        if(i_parameter == "#txtDhcpIpPoolStart") {

+            result = sf_isValidate_StartEndIp($('#txtIpAddress').val(), $('#txtSubnetMask').val(), $(i_parameter).val(), i_value);

+        }

+        else {

+            result = sf_isValidate_StartEndIp($('#txtIpAddress').val(), $('#txtSubnetMask').val(), i_value, $(i_parameter).val());

+        }

+        return result != 1;

+    });

+

+    $.validator.addMethod("ipRange", function (i_value, i_element, i_parameter) {

+        var DHCP_flag = false;

+        if($('#dhcpEnable').is(':checked')){

+            DHCP_flag = true;

+        }

+        var result = sf_isValidate_StartEndIp(i_value, $('#txtSubnetMask').val(), $('#txtDhcpIpPoolStart').val(), $('#txtDhcpIpPoolEnd').val(), DHCP_flag);

+        return result != 2;

+    });

+

+    $.validator.addMethod("subnetmask_check", function (i_value, i_element, i_parameter) {

+        var result = sf_isValidate_Netmask(i_value);

+        return this.optional(i_element) || result;

+    });	

+

+

+    // ��̬��ЧIPУ�麯��

+    function sf_isValidate_StaticIP(i_ip, i_lanIp, i_lanMask){

+            if(!i_ip || !i_lanIp || !i_lanMask){//������������

+                return false;

+            }

+

+		       //������IP����

+            if (i_ip == i_lanIp) { 

+                return true;

+            }

+

+            var res1 = [];

+            var res2 = [];

+

+            var mask_array = [];

+

+            ip_array = i_ip.split(".");

+            lanIp_array = i_lanIp.split(".");

+            mask_array  = i_lanMask.split(".");

+            for(var index = 0; index < ip_array.length; index += 1){

+                res1.push(parseInt(mask_array[index]) & parseInt(ip_array[index]));

+                res2.push(parseInt(mask_array[index]) & parseInt(lanIp_array[index]));

+            }

+            if(res2.join(".") != res1.join(".")){//�ڲ�ͬ����

+                return false;

+            }else{//��ͬһ����

+                return true;

+            }

+        }

+

+

+    function sf_isValidate_NetmaskIP(i_ip) {

+        return (i_ip == 255

+      		 || i_ip == 254 

+			 || i_ip == 252 

+			 || i_ip == 248

+             || i_ip == 240 

+			 || i_ip == 224 

+			 || i_ip == 192 

+			 || i_ip == 128

+			 || i_ip == 0);

+    }

+

+	function sf_convertIpToString(i_ip)

+	{

+        var s_i1 = i_ip.indexOf('.');

+        var s_i2 = i_ip.indexOf('.', (s_i1 + 1));

+        var s_i3 = i_ip.indexOf('.', (s_i2 + 1));

+        o_ip = hex(i_ip.substring(0, s_i1)) + hex(i_ip.substring((s_i1 + 1), s_i2)) + hex(i_ip.substring((s_i2 + 1), s_i3)) + hex(i_ip.substring((s_i3 + 1), i_ip.length));

+        o_ip = '0x' + o_ip;

+

+        return 	o_ip;	

+	}

+

+	function sf_getIpString_3(i_ip)

+	{

+        var i1 = i_ip.indexOf('.');

+        var i2 = i_ip.indexOf('.', (i1 + 1));

+        var i3 = i_ip.indexOf('.', (i2 + 1));

+        var i4 = i_ip.substring((i3+1),i_ip.length)-0;

+

+        return 	i4;	

+	}	

+

+

+    // ����У�麯��

+    function sf_isValidate_Gateway(i_wanIp, i_netmaskIp, i_gatewayIp) {

+	    var s_wanIp = sf_convertIpToString(i_wanIp);

+		var lan4 = sf_getIpString_3(i_wanIp);

+

+	    var s_netmaskIp = sf_convertIpToString(i_netmaskIp);

+		var mask4 = sf_getIpString_3(i_netmaskIp);		

+

+	    var s_gatewayIp = sf_convertIpToString(i_gatewayIp);

+		var pool4 = sf_getIpString_3(i_gatewayIp);	

+

+        var net_no;

+        var lo_broadcast;		

+

+        if (sf_opAnd4Byte(s_wanIp, s_netmaskIp) != sf_opAnd4Byte(s_gatewayIp, s_netmaskIp)) {

+            return false;

+        }

+

+        net_no       = (lan4 & mask4);

+        lo_broadcast =  (lan4 & mask4) + (255-mask4);

+

+        return !(pool4==net_no || pool4==lo_broadcast);		

+

+    }	

+

+	// ��������У�麯��		

+    function sf_isValidate_Netmask(i_netmask) {

+        var addr = i_netmask.split(".");

+

+		if ("0.0.0.0" == i_netmask || "255.255.255.255" == i_netmask) {

+            return false;

+        }

+

+        if (addr.length != 4) {

+            return false;

+        }

+

+        addr[0] = parseInt(addr[0]);

+        addr[1] = parseInt(addr[1]);

+        addr[2] = parseInt(addr[2]);

+        addr[3] = parseInt(addr[3]);

+

+        if (addr[3] != 0) {

+            if (addr[0] != 255 || addr[1] != 255 || addr[2] != 255) {

+                return false;

+            } else {

+                if (!sf_isValidate_NetmaskIP(addr[3])) {

+                    return false;

+                }

+            }

+        }

+

+        if (addr[2] != 0) {

+            if (addr[0] != 255 || addr[1] != 255) {

+                return false;

+            } else {

+                if (!sf_isValidate_NetmaskIP(addr[2])) {

+                    return false;

+                }

+            }

+        }

+

+        if (addr[1] != 0) {

+            if (addr[0] != 255) {

+                return false;

+            } else {

+                if (!sf_isValidate_NetmaskIP(addr[1])) {

+                    return false;

+                }

+            }

+        }

+

+        if (addr[0] != 255) {

+            return false;

+        }

+

+        return true;

+    }

+

+    // DHCP IP��У�麯��

+    function sf_isValidate_StartEndIp(i_lanIpaddr, i_netIp, i_startIp, i_endIp, i_DHCPFlag) {

+	    s_startIp = sf_convertIpToString(i_startIp);

+		s_endIp   = sf_convertIpToString(i_endIp);

+		s_lanIp   = sf_convertIpToString(i_lanIpaddr);

+

+		if(s_startIp>s_endIp) {

+            return 1;

+        }

+

+        if(s_lanIp >= s_startIp && s_lanIp <= s_endIp) {

+            return 2;

+        }

+

+        return 0;		

+	}

+

+

+    function init() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var fwVm = new LanViewModel();

+        ko.applyBindings(fwVm, container[0]);

+

+        addInterval(fwVm.refreshStatus, 1000);

+

+        $('#frmLan').validate({

+            submitHandler:function () {

+                fwVm.save();

+            },

+

+            rules:{

+                txtIpAddress: {

+                    lanip_check: true,

+                    ipRange: true

+                },

+                txtSubnetMask: {

+                    ipv4: true,

+                    subnetmask_check: true

+                },

+                txtDhcpIpPoolStart: {

+                    lanip_check: true,

+                    dhcp_check: "start",

+                    dhcpCompare: "#txtDhcpIpPoolEnd"

+                },

+                txtDhcpIpPoolEnd: {

+                    lanip_check: true,

+                    dhcp_check: "end",

+                    dhcpCompare: "#txtDhcpIpPoolStart"

+                },

+                txtDhcpLease: {

+                    range: [1, 65535],

+                    digits: true

+                }

+            },

+

+            groups: {

+                lanip_check: "txtDhcpIpPoolStart txtDhcpIpPoolEnd"

+            },

+

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "txtDhcpLease") {

+                    error.insertAfter("#errorHolder");

+                } else if (element.attr("name") == "txtDhcpIpPoolStart") {

+                    error.insertAfter("#txtDhcpIpPoolEnd");

+                } else {

+                    error.insertAfter(element);

+                }

+			}

+        });

+

+    }

+

+

+    return {

+        init:init

+    }

+});

+

+// others �����:Fast Boot Settings��Restart and Reset��SNTP��Turn Off Device��PIN Management

+define("adm_others","jquery knockout set service underscore".split(" "),

+

+    function ($, ko, config, service, _) {

+

+		var timeSetModes = _.map(config.sntpTimeSetMode, function(item) {

+			return new Option(item.name, item.value);

+		});

+

+		var timeZones    = _.map(config.timeZone, function(item){

+			return new Option(item.name, item.value);

+		});

+

+		var daylightSave = _.map(config.daylightSave, function(item){

+			return new Option(item.name, item.value);

+		});

+

+		var sv_sntpYears    = [];

+		var sv_sntpMonths   = [];

+		var sv_sntpDates    = [];  //���ݴ�С����������

+		var sv_sntpHours    = [];

+		var sv_sntpMinutes  = [];

+        var sc_startpHours  = [];

+		var sc_startMinutes = [];

+        var sc_pingTimes = [];

+

+		var sf_bigMonth     = [1, 3, 5, 7, 8, 10, 12];

+		var sf_smallMonth   = [4, 6, 9, 11];

+

+		function sf_produceArray(start, end, arryName) {

+			var item = {};

+			for(var i = start; i <= end; i++) {

+				item.name  = i;

+				item.value = i;

+				arryName.push(new Option(item.name, item.value));

+			}

+		}

+

+		//�����ꡢ�¡�ʱ���ֵ�����

+		sf_produceArray(2000, 2030, sv_sntpYears);

+		sf_produceArray(1, 12, sv_sntpMonths);

+		sf_produceArray(0, 23, sv_sntpHours);

+		sf_produceArray(0, 59, sv_sntpMinutes);			

+        sf_produceArray(0, 23, sc_startpHours);

+		sf_produceArray(0, 59, sc_startMinutes);		

+        sf_produceArray(0, 59, sc_startMinutes);

+        sf_produceArray(1, 10, sc_pingTimes);

+

+        function othersViewModel() {

+            var target = this;

+

+			var inChildGroup = false;

+            var scheduleInfo = service.getScheduleSetting();

+            var pingDiagInfo = service.getPingSetting();

+

+            target.fastbootSupport    = config.FAST_BOOT_SUPPORT;

+            target.turnOffSupport     = config.TURN_OFF_SUPPORT;     

+            target.SNTPSupport        = config.HAS_SNTP;

+			target.hasUssd            = config.HAS_USSD;

+			target.hasDdns            = config.DDNS_SUPPORT;

+			target.hasUpdateCheck     = config.HAS_UPDATE_CHECK;

+            target.scheduleSetting = ko.observable(scheduleInfo.scheduleSetting);

+            target.scheduleHour = ko.observable(parseInt(scheduleInfo.scheduleHour));

+            target.scheduleMinute = ko.observable(parseInt(scheduleInfo.scheduleMinute));

+            target.scr_hours   = ko.observableArray(sc_startpHours);

+			target.scr_minutes = ko.observableArray(sc_startMinutes);

+            target.src_times = ko.observableArray(sc_pingTimes);

+            target.pingTimes = ko.observable(pingDiagInfo.pingTimes);

+            target.pingURL = ko.observable(pingDiagInfo.pingURL);

+

+

+            if (config.HAS_PARENTAL_CONTROL) {

+                inChildGroup = service.checkCurrentUserInChildGroup().result;

+            }

+            target.currentUserInChildGroup = ko.observable(inChildGroup);

+

+            var sv_fastbootInfo = service.getFastbootSetting();

+            target.fastbootEnableFlag =  ko.observable(config.RJ45_SUPPORT ? (sv_fastbootInfo.need_sim_pin != "yes" && service.getRj45PlugState().rj45_plug == "wan_lan_off") : sv_fastbootInfo.need_sim_pin != "yes");

+            target.fastbootSetting = ko.observable(sv_fastbootInfo.fastbootEnabled);

+

+

+            // @method addInterval		

+			addInterval(function(){

+				target.fastbootEnableFlag(config.RJ45_SUPPORT ? (sv_fastbootInfo.need_sim_pin != "yes" && service.getRj45PlugState().rj45_plug == "wan_lan_off") : sv_fastbootInfo.need_sim_pin != "yes");

+			}, 1000);				

+

+            // �ָ���������

+            // @event restore

+            target.restore = function () {

+                showConfirm("restore_confirm", function () {

+                    showLoading("restoring");

+                    service.restoreFactorySettings({}, function (info) {

+                        if (info && info.result == "success") {

+                            successOverlay();

+                        } else {

+                            errorOverlay();

+                        }

+                    }, function (result) {

+                        if (isErrorObject(result) && result.errorType == 'no_auth') {

+                            errorOverlay();

+                        }

+                    });

+                });

+            };

+

+            target.restart = function () {

+                showConfirm("restart_confirm", function () {

+                    restartDevice(service);

+                });

+            };

+

+            target.scheduleRestart = function () {

+                showLoading();

+                var params = {};

+                params.scheduleSetting = target.scheduleSetting();

+                params.scheduleHour = target.scheduleHour();

+                params.scheduleMinute = target.scheduleMinute();

+                service.setScheduleSetting(params, function (result) {

+                    if (result.result != "success") {

+                        errorOverlay();

+                    } else {

+                        successOverlay();

+                    }

+                });

+            };

+

+            target.pingResult = ko.observable();

+

+            target.loadFileContent = function() {

+                var newPingResInfo = service.getPingResult();

+                if (newPingResInfo.pingResult !== target.pingResult()) { 

+                    target.pingResult(newPingResInfo.pingResult);

+                }

+            };

+

+            function showinfo(msgObj, minHeight) {

+                var option = {

+                    title: 'info',

+                    img: 'pic/res_info.png',

+                    msg: msgObj,

+                    minHeight: minHeight

+                };

+                popup(option);

+

+                $('#yesbtn, #nobtn, #okbtn').hide();

+

+                setTimeout(function() {

+                    $.modal.close();

+                }, 1000);

+            }

+

+            setInterval(target.loadFileContent, 1000);

+

+            target.pingStart = function () {

+                showinfo('ping_starting');

+                var params = {};

+                params.pingTimes = target.pingTimes();

+                params.pingURL = target.pingURL();

+                service.setPingSettingStart(params, function (result) {

+                    if (result.result != "success") {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            target.pingClear = function () {

+                showLoading();

+                service.pingResultClear({}, function (result) {

+                    if (result.result != "success") {

+                        errorOverlay();

+                    } else {

+                        successOverlay();

+                    }

+                });

+            };

+

+            // ���ٿ��ػ�����

+            target.saveFastBoot = function() {

+                showLoading();

+                var params = {

+                    fastbootEnabled: target.fastbootSetting(),

+                    need_hard_reboot: sv_fastbootInfo.need_hard_reboot

+                };

+                service.setFastbootSetting(params, function(result) {

+                    if (result.result == "success") {

+                        successOverlay();

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            // �ػ�

+            target.turnoff = function () {

+                showConfirm("turnoff_confirm", function () {

+                    showLoading("turnoff");

+                    service.turnOffDevice({}, function (info) {

+                        if (info && info.result == "success") {

+                            successOverlay();

+                        } else {

+                            errorOverlay();

+                        }

+                    }, $.noop);

+                });

+            };

+

+			//SNTP����serverУ׼ʱ��

+			service.setSNTPDate({

+				goformId: "SNTP_Getdatastatic"

+			});

+

+			var target       = this;

+			var sntpInfo   = service.getSntpParams();

+

+			globalTime     = new Date(parseInt(sntpInfo.sntp_year, 10),parseInt(sntpInfo.sntp_month, 10)-1, parseInt(sntpInfo.sntp_day, 10), parseInt(sntpInfo.sntp_hour, 10), parseInt(sntpInfo.sntp_minute, 10), parseInt(sntpInfo.sntp_second, 10));

+

+			target.day       = ko.observable();

+			target.localTime = ko.observable();

+

+			//��ʼ����ǰ����ʱ��

+			//target.updateCurrentTime; cov_2

+			target.timeSetModes    = ko.observableArray(timeSetModes);

+			target.isManualSetTime = ko.observable(false);

+			target.isAutoSntpTime  = ko.observable(false);

+

+			target.currentMode = ko.observable(sntpInfo.sntp_time_set_mode);

+

+			changeSetTimeMode();

+			target.changeSetTimeMode = function(){

+				changeSetTimeMode();

+			};

+

+			target.currentYear   = ko.observable(parseInt(sntpInfo.sntp_year, 10));

+			target.currentMonth  = ko.observable(parseInt(sntpInfo.sntp_month, 10));

+			target.currentDate   = ko.observable(parseInt(sntpInfo.sntp_day, 10));

+			target.currentHour   = ko.observable(parseInt(sntpInfo.sntp_hour, 10));

+			target.currentMinute = ko.observable(parseInt(sntpInfo.sntp_minute, 10));

+

+

+			// ��Ҫ��������ˢ�������б����ݣ�ע��˳�� 

+

+			target.years  = ko.observableArray(sv_sntpYears);

+			target.months = ko.observableArray(sv_sntpMonths);				

+			//���û�ѡ���·ݵ�ʱ���ı�����ѡ������ѡ��

+			target.initDateList = function(){

+				initDateList();

+				target.dates(sv_sntpDates);

+			}

+

+			//��ʼ�������б�

+			initDateList();

+			target.dates   = ko.observableArray(sv_sntpDates);

+			target.hours   = ko.observableArray(sv_sntpHours);

+			target.minutes = ko.observableArray(sv_sntpMinutes);

+

+			//�Զ�SNTP��ȡʱ�����ݰ󶨴���

+			var serverArray = _.map(sntpInfo.sntp_servers, function(item) {

+				return new Option(item.name, item.value)

+			});

+

+			target.serverList          = ko.observableArray(serverArray);

+

+			// �������ֲ����޸ģ��޸��޷�ˢ����ҳ

+

+			target.currentServer0 = ko.observable(sntpInfo.sntp_server0);

+			target.currentServer1 = ko.observable(sntpInfo.sntp_server1);

+			target.currentServer2 = ko.observable(sntpInfo.sntp_server2);

+			target.customServer0 = ko.observable(sntpInfo.sntp_other_server0);

+			target.customServer1 = ko.observable(sntpInfo.sntp_other_server1);

+			target.customServer2 = ko.observable(sntpInfo.sntp_other_server2);

+			target.isOther0 = ko.observable(false);

+			target.isOther1 = ko.observable(false);

+			target.isOther2 = ko.observable(false);

+

+			initOtherServer();

+

+			target.changeServerSelect = function(){

+				initOtherServer();

+			}

+

+			target.timeZones           = ko.observableArray(timeZones);

+			target.currentTimeZone     = ko.observable(sntpInfo.sntp_timezone + "_" + sntpInfo.sntp_timezone_index);

+			target.daylightSaves       = ko.observableArray(daylightSave);

+			target.currentDaylightSave = ko.observable(sntpInfo.sntp_dst_enable);

+

+			//���µ�ǰ��ʾʱ��

+			target.updateCurrentTime = function() {

+			    var globalDay = globalTime.getDay();

+

+				switch(globalDay){

+				    case 6:

+				    	target.day($.i18n.prop("saturday"));

+				    	break;		

+				    case 5:

+				    	target.day($.i18n.prop("friday"));

+				    	break;	

+				    case 4:

+				    	target.day($.i18n.prop("thursday"));

+				    	break;	

+				    case 3:

+				    	target.day($.i18n.prop("wednesday"));

+				    	break;

+				    case 2:

+				    	target.day($.i18n.prop("tuesday"));

+				    	break;	

+				    case 1:

+				    	target.day($.i18n.prop("monday"));

+				    	break;						

+				    case 0:

+				    	target.day($.i18n.prop("sunday"));

+				    	break;

+				    default:

+			        	break;

+				}

+

+				var localCurrentTime = globalTime.getFullYear() + "-" + getTwoDigit(globalTime.getMonth()+1) + "-" + getTwoDigit(globalTime.getDate()) + " " + getTwoDigit(globalTime.getHours()) + ":" + getTwoDigit(globalTime.getMinutes()) + ":" + getTwoDigit(globalTime.getSeconds());

+				target.localTime(localCurrentTime);

+				globalTime.setTime(globalTime.getTime()+1000);			

+			};

+

+            // SNTP����		

+			target.apply = function(){

+				var tmpArray = [];

+				for(var i=0; i< sntpInfo.sntp_servers.length; i++){

+					tmpArray.push(sntpInfo.sntp_servers[i].value);

+				}

+				var staInfo = service.getStatusInfo();

+				if(!checkConnectedStatus(staInfo.connectStatus, staInfo.rj45ConnectStatus, staInfo.connectWifiStatus) && target.currentMode() == "auto"){

+					showAlert("sntp_syn_time_wan_connected");

+					return;

+				}

+

+				showLoading("");

+				var requestParams = {

+					goformId: "SNTP",

+					manualsettime : target.currentMode(),

+					sntp_server1_ip : target.currentServer0(),

+					sntp_server2_ip : target.currentServer1(),

+					sntp_server3_ip : target.currentServer2(),

+					sntp_other_server0 : target.customServer0(),

+					sntp_other_server1 : target.customServer1(),

+					sntp_other_server2 : target.customServer2(),

+					timezone : target.currentTimeZone().split("_")[0],

+					sntp_timezone_index : target.currentTimeZone().split("_")[1],

+					DaylightEnabled : target.currentDaylightSave(),

+					time_year : target.currentYear(),

+					time_month : target.currentMonth(),

+					time_day : target.currentDate(),

+					time_hour : target.currentHour(),

+					time_minute : target.currentMinute()

+				};

+

+				service.setSntpSetting(requestParams, function(data2){

+					if(data2) {

+					    if(data2.result == "success" && target.currentMode() == "auto"){

+                            successOverlay("sntp_req_success");

+							//hideLoading();

+						}else if(data2.result == "processing" && target.currentMode() == "auto"){

+							successOverlay("sntp_processing");

+						}else{

+							//����serverУ׼ʱ��

+							service.setSNTPDate({

+								goformId: "SNTP_Getdatastatic"

+							}, function(result){

+									var sntpInfo = 	service.getSntpParams();

+									globalTime = new Date(parseInt(sntpInfo.sntp_year, 10),parseInt(sntpInfo.sntp_month, 10)-1, parseInt(sntpInfo.sntp_day, 10), parseInt(sntpInfo.sntp_hour, 10), parseInt(sntpInfo.sntp_minute, 10), parseInt(sntpInfo.sntp_second, 10));

+									successOverlay();

+							});

+						}

+					} else {

+						errorOverlay();

+					}

+				});

+			}

+

+            // �ֶ�/�Զ��л���Ӧ����		

+			function changeSetTimeMode() {

+				if(target.currentMode() == "manual") {

+					target.isManualSetTime(true);

+					target.isAutoSntpTime(false);

+				} else {

+					target.isManualSetTime(false);

+					target.isAutoSntpTime(true);

+				}

+				return true;

+			}

+

+            // ��ʼ��ʱ��

+			function initDateList(){

+				sv_sntpDates = [];

+				if($.inArray(parseInt(target.currentMonth(), 10), sf_smallMonth) != -1) {

+					sf_produceArray(1, 30, sv_sntpDates);

+				} else if($.inArray(parseInt(target.currentMonth(), 10), sf_bigMonth) != -1) {

+					sf_produceArray(1, 31, sv_sntpDates);

+				} else if(parseInt(target.currentYear(), 10)%4 == 0) {

+					sf_produceArray(1, 29, sv_sntpDates);

+				} else {

+					sf_produceArray(1, 28, sv_sntpDates);

+				}

+			}

+

+            // ��ʼ������������			

+			function initOtherServer(){

+				target.isOther0(target.currentServer0() == "Other");

+				target.isOther1(target.currentServer1() == "Other");

+				target.isOther2(target.currentServer2() == "Other");

+				!target.isOther0() && $("#sntp_server0").find(".error").hide();

+				!target.isOther1() && $("#sntp_server1").find(".error").hide();

+				!target.isOther2() && $("#sntp_server2").find(".error").hide();

+			}

+

+

+        }

+

+	    // ��ʼ�� ViewModel����������ͼ����

+        function init() {

+            var fwVm = new othersViewModel();

+            var container = $('#container')[0];

+		    ko.cleanNode(container);

+            ko.applyBindings(fwVm, container);

+			fwVm.updateCurrentTime();

+

+		    addInterval(function(){

+			    fwVm.updateCurrentTime();

+		    }, 1000);

+

+		    $("#sntpForm").validate({

+			    submitHandler: function(){

+				    fwVm.apply();

+			    },

+			    rules: {

+				    sntp_other_server0 : "sntp_invalid_server_name",

+				    sntp_other_server1 : "sntp_invalid_server_name",

+				    sntp_other_server2 : "sntp_invalid_server_name"

+			    }

+		    });

+        }

+

+        return {

+            init:init

+        }

+    });

+// �������� �

+

+define("adm_management","jquery knockout set service underscore CryptoJS".split(" "),

+

+    function ($, ko, config, service, _, CryptoJS) {

+

+        function manageViewModel() {

+            var target = this;

+

+            target.currentValue = ko.observable();

+            target.newValue     = ko.observable();

+            target.confirmValue = ko.observable();

+

+            function sf_changeValue() {

+            var sv_manageInfo = {};

+            if (config.PASSWORD_ENCODE) {

+                sv_manageInfo.oldValue = target.currentValue();

+                sv_manageInfo.newValue = target.newValue(); 

+            } else {            

+                var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,32}');

+

+                if (!pwdRegex.test(target.newValue())) {

+                    showConfirm("password_note_too_low", function () {

+

+                    var kparam = service.getDeviceInfoLow();

+                    var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+					var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                    var cipherold = CryptoJS.AES.encrypt(target.currentValue(), tkey, {

+                            iv: tiv,

+                            mode: CryptoJS.mode.CBC,

+                            padding: CryptoJS.pad.ZeroPadding

+                            }).toString();

+                    var ciphernew = CryptoJS.AES.encrypt(target.newValue(), tkey, {

+                            iv: tiv,

+                            mode: CryptoJS.mode.CBC,

+                            padding: CryptoJS.pad.ZeroPadding

+                            }).toString();

+

+                    sv_manageInfo.oldValue = cipherold;

+                    sv_manageInfo.newValue = ciphernew;

+

+                    showLoading();

+

+                    service.changeManageInfo(sv_manageInfo, function (resultInfo) {

+                        target.cancel();

+                        if (resultInfo && resultInfo.result == true) {

+                            successOverlay();

+                        } else {

+                            if (resultInfo && resultInfo.errorType == "badPassword") {

+                                hideLoading();

+                                showAlert("current_password_error",function(){

+                                    $("#txtCurrent").focus();

+                                });

+                            } else {

+                                errorOverlay();

+                            }

+                        }

+                    });

+                    });

+                    return;

+               }

+                var kparam = service.getDeviceInfoLow();

+                var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                var cipherold = CryptoJS.AES.encrypt(target.currentValue(), tkey, {

+                        iv: tiv,

+                        mode: CryptoJS.mode.CBC,

+                        padding: CryptoJS.pad.ZeroPadding

+                        }).toString();

+                var ciphernew = CryptoJS.AES.encrypt(target.newValue(), tkey, {

+                        iv: tiv,

+                        mode: CryptoJS.mode.CBC,

+                        padding: CryptoJS.pad.ZeroPadding

+                        }).toString();

+

+                sv_manageInfo.oldValue = cipherold;

+                sv_manageInfo.newValue = ciphernew;

+                }

+

+                showLoading();

+

+                service.changeManageInfo(sv_manageInfo, function (resultInfo) {

+                    target.cancel();

+                    if (resultInfo && resultInfo.result == true) {

+                        successOverlay();

+                    } else {

+                        if (resultInfo && resultInfo.errorType == "badPassword") {

+                            hideLoading();

+                            showAlert("current_password_error",function(){

+                                $("#txtCurrent").focus();

+                            });

+                        } else {

+                            errorOverlay();

+                        }

+                    }

+                });     

+            }

+

+            // ��������������

+            function sf_cancel() {

+                target.currentValue("");

+                target.newValue("");

+                target.confirmValue("");

+            }           

+

+            target.cancel = sf_cancel;

+

+            // �޸�����

+            target.changeValue = sf_changeValue;

+        }

+

+        function init() {

+            var container = $('#container');

+            ko.cleanNode(container[0]);

+            var fwVm = new manageViewModel();

+            ko.applyBindings(fwVm, container[0]);

+

+            $('#frmPassword').validate({

+                submitHandler:function () {

+                    fwVm.changeValue();

+                },

+                rules:{

+                    txtCurrent:"manage_info_check",

+                    txtNew:"manage_info_check",

+                    txtConfirm:{ equalTo:"#txtNew"}

+                }

+            });

+        }

+

+        return {

+            init:init

+        }

+    }

+);

+// PIN�����

+

+define("adm_pin","jquery knockout set service".split(" "),

+

+    function ($, ko, config, service) {

+        var pageState = {common:0, requirePin:1, modifyPin:2, requirePuk:3, destroyed:4};

+        var pinStatus = {enable:"1", disable:"0"};

+

+

+        function pinViewModel() {

+            var target = this;

+            var sv_currentPinData     = service.getPinData();

+

+            target.isDataCard         = config.PRODUCT_TYPE == 'DATACARD';

+            target.originPinStatus    = ko.observable(sv_currentPinData.pin_status);

+

+            target.pinStatus          = ko.observable(sv_currentPinData.pin_status);

+            target.pinNumber          = ko.observable(sv_currentPinData.pinnumber);

+            target.pukNumber          = ko.observable(sv_currentPinData.puknumber);

+

+            target.currentPin         = ko.observable();

+            target.newPin             = ko.observable();

+            target.confirmPin         = ko.observable();

+

+            target.puk                = ko.observable();

+

+            target.pageState          = ko.observable();

+            // �����������ɹ���־λ

+            target.operateSuccessFlag = true;

+

+			target.callback           = sf_callback;		

+

+			function sf_callback(info) {

+                if (info && info.result == true) {

+                    target.operateSuccessFlag = true;

+                    successOverlay();

+                } else {

+                    target.operateSuccessFlag = false;

+

+                    // ����һ��ǰҪ������ʾ					 

+                    if(target.pinNumber() == 2){

+                      showAlert("last_enter_pin");    

+                    } else if(target.pukNumber() == 2){

+                      showAlert("last_enter_puk");    

+                    }

+                    else{

+                      errorOverlay();      

+                    }   

+                }

+                init(target);

+            }

+

+

+            // ȷ����ť�¼������������޸�PIN������PUK����PIN������PIN��ʹ��״̬

+

+            function sf_changePin() {

+                if (target.isConnectedNetWork()) {

+                    showAlert("cannot_operate_when_connected");

+                    return;

+                }

+

+                if (target.pageState() == pageState.common) {

+                    return;

+                }

+

+                var sv_pinPara = {

+                    oldPin:target.currentPin(),

+                    newPin:target.newPin()

+                };

+                showLoading();

+

+                if (target.pageState() == pageState.modifyPin) {

+                    service.changePin(sv_pinPara, target.callback);

+                } else if (target.pageState() == pageState.requirePuk) {

+                    sv_pinPara = {

+                        PinNumber:target.newPin(),

+                        PUKNumber:target.puk()

+                    };

+                    service.enterPUK(sv_pinPara, target.callback);

+                } else {

+                    if (target.pinStatus() == pinStatus.enable) {

+                        service.enablePin(sv_pinPara, target.callback);

+                    } else {

+                        service.disablePin(sv_pinPara, target.callback);

+                    }

+                }

+            }	

+

+

+			// ȡ���¼�����

+            function sf_cancel() {

+                target.pageState(pageState.common);

+                target.pinStatus(target.originPinStatus());

+                target.clear();

+            }		

+

+            // ����ҳ�������ͼ�����Ϣ

+			function sf_clear() {

+                target.confirmPin("");			

+                target.currentPin("");

+                target.newPin("");

+                target.puk("");

+                clearValidateMsg();

+            }	

+

+            // �������ݣ����õ�ǰ��ҳ��״̬

+            function sf_computePageState(i_pinData) {

+                if (i_pinData.pinnumber > 0) {

+                    //�����ɹ�ҳ���ص���ʼ״̬������ʧ�ܲ���pinnumber>0,ҳ�治��ת

+                    if (target.operateSuccessFlag) {

+                        target.cancel();

+                    } else {

+                        target.clear();

+                    }

+                } else {

+                    target.clear();

+                    if (i_pinData.puknumber > 0) {

+                        target.pageState(pageState.requirePuk);

+                    } else {

+                        target.pageState(pageState.destroyed);

+                    }

+                }

+            }

+

+            // ����PIN�޸�״̬�¼�����

+			function sf_displayModifyPinPage() {

+                if (target.isConnectedNetWork()) {

+                    showAlert("cannot_operate_when_connected");

+                    return;

+                }

+                target.pinStatus(target.originPinStatus());

+                target.pageState(pageState.modifyPin);

+                target.clear();

+            }

+

+			// ����ҳ��Ԫ�ص�ʹ��״̬

+			function sf_fixPageEnable() {

+                if (target.isConnectedNetWork()) {

+                    $('#frmPin :input').each(function () {

+                        disableBtn($(this));

+                    });

+                    clearValidateMsg();

+                } else {

+                    $('#frmPin :input').each(function () {

+                        if (this.id == "txtPin" || this.id == "btnPinApply") {

+                            if (target.pageState() == pageState.common) {

+                                disableBtn($(this));

+                                return;

+                            }

+                        }

+                        if (this.id == "btnModifyPin") {

+                            if (target.originPinStatus() != pinStatus.enable) {

+                                disableBtn($(this));

+                                return;

+                            }

+                        }

+                        if (this.id == "pinEnable" || this.id == "pinDisable") {

+                            if (target.pageState() == pageState.modifyPin) {

+                                disableBtn($(this));

+                                return;

+                            }

+                        }

+                        enableBtn($(this));

+                    });

+

+                }

+            }

+

+			// �Ƿ�������

+			function sf_isConnectedNetWork() {

+                var info = service.getConnectionInfo();

+                return info.connectStatus == "ppp_connected";

+            }

+

+            // PINʹ�ܸı�ʱ�¼�����

+			function sf_pinStatusChangeEvent() {

+                if (target.pinStatus() == target.originPinStatus()) {

+                    target.pageState(pageState.common);

+                } else {

+                    target.pageState(pageState.requirePin);

+                }

+                target.clear();

+            }

+

+            target.changePin            = sf_changePin;

+            target.cancel               = sf_cancel;

+            target.clear                = sf_clear;	

+            target.computePageState     = sf_computePageState;

+

+            target.computePageState(sv_currentPinData);			

+

+            target.displayModifyPinPage = sf_displayModifyPinPage;   

+            target.fixPageEnable        = sf_fixPageEnable;		

+            target.isConnectedNetWork   = sf_isConnectedNetWork;

+

+            target.pinStatusChangeEvent = ko.dependentObservable(sf_pinStatusChangeEvent, this);			

+        }

+

+        function init(oldViewModel) {

+

+            var fwVm = oldViewModel;		

+

+            if (fwVm) {

+                var sv_currentPinData = service.getPinData();

+                fwVm.originPinStatus(sv_currentPinData.pin_status);

+                fwVm.pinNumber(sv_currentPinData.pinnumber);

+                fwVm.pukNumber(sv_currentPinData.puknumber);

+                fwVm.computePageState(sv_currentPinData);

+            } else {

+                fwVm = new pinViewModel();

+                addInterval(function () {

+                    fwVm.fixPageEnable();

+                }, 1000);

+            }

+

+            var container = $('#container')[0];

+		    ko.cleanNode(container);

+            ko.applyBindings(fwVm, container);

+            fwVm.fixPageEnable();

+

+            $('#frmPin').validate({

+                submitHandler:function () {

+                    fwVm.changePin();

+                },

+                rules:{

+                    txtPuk:"puk_check",

+                    txtPin:"pin_check",

+                    txtNewPin:"pin_check",

+                    txtConfirmPin:{equalToPin:"#txtNewPin"}

+                }

+            });

+        }

+

+        return {

+            init:init

+        }

+    }

+);

+

+// ��������

+define("adm_quick_set","jquery knockout set service underscore CryptoJS".split(" "),

+

+    function ($, ko, config, service, _, CryptoJS) {

+

+        var sv_wifiState = {ok:0, wps_on:1, wifi_off:2};

+        var sv_apnMode   = {auto:"auto", manual:"manual"};

+        var sv_minStep   = 1;

+        var sv_maxStep   = 5;

+

+        // ��ȡ��Ȩ��ʽ

+        function sf_fetchAuthenticationModes() {

+            return _.map(config.APN_AUTH_MODES, function (item) {

+                return new Option(item.name, item.value);

+            });

+        }

+

+        // WIFI��ȫģʽѡ��

+        var sv_securityModes = _.map(config.WIFI_WEP_SUPPORT ? config.AUTH_MODES_WEP : config.AUTH_MODES, function (item) {

+            return new Option(item.name, item.value);

+        });

+

+

+        function quickSettingViewModel() {

+            var target = this;

+

+            var sv_quickSettingInfo        = service.getQuickSettingInfo();

+

+            target.currentStep            = ko.observable(sv_minStep);

+            target.ipType                 = ko.observable(sv_quickSettingInfo.pdp_type == "IP" ? "IP" : sv_quickSettingInfo.ipv6_pdp_type);			

+            target.supportIPv6            = config.IPV6_SUPPORT;

+            target.supportIpv4AndIpv6     = config.IPV4_AND_V6_SUPPORT;

+

+            target.wpsFlag                = ko.observable(sv_quickSettingInfo.WscModeOption);		

+

+            function sf_apnDisabled() {

+                return (sv_quickSettingInfo.apn_index < config.defaultApnSize || sv_quickSettingInfo.ppp_status == "ppp_connected" || sv_quickSettingInfo.ppp_status == "ppp_connecting");

+            }

+

+			function sf_apnModeDisabled() {

+                return (sv_quickSettingInfo.ppp_status == "ppp_connected" || sv_quickSettingInfo.ppp_status == "ppp_connecting" || (!target.profileName() && target.apnMode() == sv_apnMode.auto));//ѡ��Ϊ�ջ��������ӻ�������

+            }	

+

+            function sf_currAPN() {

+                var sv_APNText = sv_quickSettingInfo["APN_configtmp" + sv_quickSettingInfo.apn_index];

+                var strIPv6APN = sv_quickSettingInfo["ipv6_APN_configtmp" + sv_quickSettingInfo.apn_index];

+

+                var sv_apn     = [];

+                var sv_ipv6APNItems = [];

+

+                if (sv_APNText) {

+                    sv_apn = sv_APNText.split("($)");

+                }

+

+                if (strIPv6APN) {

+                    sv_ipv6APNItems = strIPv6APN.split("($)");

+                }

+

+                return {

+                    m_profile_name:sv_apn[0],

+                    wan_apn:sv_apn[1],

+                    ppp_auth_mode: sv_apn[4] == "" || typeof(sv_apn[4]) == "undefined" ? "" : sv_apn[4].toLowerCase(),					

+                    ppp_username:sv_apn[5],

+                    ppp_passtmp:sv_apn[6],						

+                    pdp_type: sv_apn[7],			

+                    ipv6_wan_apn:sv_ipv6APNItems[1],	

+                    ipv6_ppp_auth_mode:typeof(sv_ipv6APNItems[4]) == "undefined" || sv_ipv6APNItems[4] == ""? "" : sv_ipv6APNItems[4].toLowerCase(),

+                    ipv6_ppp_username:sv_ipv6APNItems[5],					

+                    ipv6_ppp_passtmp:sv_ipv6APNItems[6],					

+                    ipv6_pdp_type:sv_ipv6APNItems[7]			

+                }

+            }			

+

+            // ��ǰAPN����			

+            target.currAPN                = ko.computed(sf_currAPN);

+

+			target.apn                    = ko.observable(target.currAPN().wan_apn);

+			target.ipv6_apn               = ko.observable(target.currAPN().ipv6_wan_apn);

+            target.ipv6_selectedAuthMode  = ko.observable(target.currAPN().ipv6_ppp_auth_mode);				

+            target.ipv6_username          = ko.observable(target.currAPN().ipv6_ppp_username);

+            target.ipv6_password          = ko.observable(target.currAPN().ipv6_ppp_passtmp);			

+			target.profileName            = ko.observable(target.currAPN().m_profile_name);	

+			target.selectedAuthMode       = ko.observable(target.currAPN().ppp_auth_mode);

+            target.username               = ko.observable(target.currAPN().ppp_username);

+            target.password               = ko.observable(target.currAPN().ppp_passtmp);

+

+            target.transAPN               = ko.observable("apn_ipv4_apn");

+			target.transAPNIPv6           = ko.observable("apn_ipv6_apn");			

+            target.transAuthMode          = ko.observable("apn_authentication_ipv4");

+			target.transAuthModeIPv6      = ko.observable("apn_authentication_ipv6");

+            target.transUserName          = ko.observable("apn_user_name_ipv4");

+            target.transPassword          = ko.observable("apn_password_ipv4");     

+            target.transUserNameIPv6      = ko.observable("apn_user_name_ipv6");

+            target.transPasswordIPv6      = ko.observable("apn_password_ipv6");	

+

+

+

+            target.apnDisabled            = ko.computed(sf_apnDisabled);

+			target.apnMode                = ko.observable(sv_quickSettingInfo.apn_mode);	

+            target.apnModeDisabled        = ko.computed(sf_apnModeDisabled);

+            target.authModes              = ko.observableArray(sf_fetchAuthenticationModes());

+

+            if (target.ipType() == "IPv6") {

+                target.showIPv4 = false;

+                target.showIPv6 = true;

+                target.transAPNIPv6("apn");

+                target.transAuthModeIPv6("apn_authentication");

+                target.transUserNameIPv6("apn_user_name");

+                target.transPasswordIPv6("apn_password");

+            } else if (config.IPV4_AND_V6_SUPPORT && target.ipType() == "IPv4v6") {

+                target.showIPv4 = true;

+                target.showIPv6 = true;

+                //ʹ��Ĭ��

+            } else if (target.ipType() == "IP" || target.ipType() == "IPv4") {

+                target.showIPv4 = true;

+                target.showIPv6 = false;

+                target.transAPN("apn");

+                target.transAuthMode("apn_authentication");

+                target.transUserName("apn_user_name");

+                target.transPassword("apn_password");

+            } else { //pdp_type == "IPv4v6" && config.IPV4V6_SUPPORT

+                target.showIPv4 = true;

+                target.showIPv6 = false;

+                target.transAPN("apn");

+                target.transAuthMode("apn_authentication");

+                target.transUserName("apn_user_name");

+                target.transPassword("apn_password");

+            }

+

+            target.wifiDisabled                  = (sv_quickSettingInfo.wifi_cur_state != "1");

+            target.ssid                          = ko.observable(sv_quickSettingInfo.SSID1);

+            target.broadcast                     = ko.observable(sv_quickSettingInfo.HideSSID);

+	    target.hasWifiWep                    = config.WIFI_WEP_SUPPORT;

+	    target.hasWifiWpa3                   = config.WIFI_WAP3_SUPPORT;

+	    target.hasWifiWpa23                  = config.WIFI_WPA2_WAP3_SUPPORT;

+

+            target.securityModes                 = ko.observableArray(sv_securityModes);

+            target.selectedSecurityMode          = ko.observable(sv_quickSettingInfo.AuthMode);

+            target.WPAKey                        = ko.observable(sv_quickSettingInfo.WPAPSK1);

+

+            target.apnMode_display               = ko.observable("");

+

+            target.apnMode_trans                 = ko.computed(sf_apnMode_trans);

+            target.selectedAuthMode_display      = ko.computed(sf_selectedAuthMode_display);

+            target.ipv6_selectedAuthMode_display = ko.computed(sf_ipv6_selectedAuthMode_display);

+

+            target.showWifiPassword              = ko.observable(false);

+            target.showWifiPasswordHandler       = sf_showWifiPasswordHandler;

+

+			//�ж��Ƿ���802 n only��

+			var sv_adInfo                        = service.getWifiAdvance();

+			target.adBand                        = ko.observable(sv_adInfo.wifiBand);

+			target.adMode                        = ko.observable(sv_adInfo.mode);

+

+			target.encryptType                   = ko.observable(sv_quickSettingInfo.EncrypType);

+			target.keyID                         = ko.observable(sv_quickSettingInfo.DefaultKeyID);

+			target.wepPassword                   = ko.observable("");

+

+			target.getWepPassword                = sf_getWepPassword;

+			target.wepPassword(target.getWepPassword());

+			target.profileChangeHandler          = sf_profileChangeHandler;

+

+            target.broadcast_display             = ko.observable("");

+            target.broadcast_trans               = ko.computed(sf_broadcast_trans);

+

+            target.selectedSecurityMode_display  = ko.observable();   

+            target.selectedSecurityMode_trans    = ko.computed(sf_selectedSecurityMode_trans);

+

+

+            target.callback                      = sf_callback;

+            target.next                          = sf_button_next;			

+            target.previous                      = sf_button_previous;					

+            target.save                          = sf_button_save;

+

+			function sf_apnMode_trans() {

+                if (sv_apnMode.auto == target.apnMode()) {

+                    target.apnMode_display($.i18n.prop("apn_auto_apn"));

+                    return "apn_auto_apn";

+                } else {

+                    target.apnMode_display($.i18n.prop("apn_manual_apn"));

+                    return "apn_manual_apn";

+                }

+            }

+

+			function sf_broadcast_trans() {

+                if ("0" == target.broadcast()) {

+                    target.broadcast_display($.i18n.prop("enable"));

+                    return "enable";

+                } else {

+                    target.broadcast_display($.i18n.prop("disable"));

+                    return "disable";

+                }

+            }

+

+			function sf_button_next() {

+                var currentStep = target.currentStep();

+                var toStep = target.currentStep() + 1;

+                sf_changeStep(toStep);

+

+                if (currentStep == 1 && target.apnMode() == sv_apnMode.auto) {

+                    toStep = target.currentStep() + 1;

+                    sf_changeStep(toStep);

+                }

+            }

+

+			function sf_button_previous() {

+

+                var currentStep = target.currentStep();

+                var toStep = target.currentStep() - 1;

+

+                sf_changeStep(toStep);

+

+                if (currentStep == 3 && target.apnMode() == sv_apnMode.auto) {

+                    toStep = target.currentStep() - 1;

+                    sf_changeStep(toStep);

+                }

+            }

+			function sf_button_save() {

+                var submit = function () {

+                    sf_quickSetting4IPv6();

+                };

+                var result = sf_isDisabled_Wifi();

+                if(result == sv_wifiState.wifi_off){

+                    showConfirm("quick_setting_wifi_disable_confirm", submit);

+                } else if (result == sv_wifiState.wps_on) {

+                    showAlert("wps_on_info");

+                } else{

+                    showConfirm("quick_setting_param_changed_confirm", submit);//submit();

+                }

+            }

+            // ���������ύ���Ļص�����

+			function sf_callback(data) {

+                if (data.result == "success") {

+                    successOverlay();

+                    location.hash = "#network_choose";

+                }

+                else {

+                    errorOverlay();

+                }

+            }

+

+            // �任����ʱ����

+            function sf_changeStep(i_step) {

+                if (i_step > sv_maxStep) {

+                    i_step = sv_maxStep;

+                } else if (i_step < sv_minStep) {

+                    i_step = sv_minStep;

+                }

+

+                target.currentStep(i_step);

+                return true;

+            }			

+

+			function sf_ipv6_selectedAuthMode_display() {

+                var mode = target.ipv6_selectedAuthMode();

+                return sf_getAuthModeNameByValue(mode);

+            }

+			// ���ݼ�Ȩģʽ��ֵ��������

+            function sf_getAuthModeNameByValue(authMode) {

+                for (var i = 0; i < config.APN_AUTH_MODES.length; i++) {

+                    if (authMode == config.APN_AUTH_MODES[i].value) {

+                        return config.APN_AUTH_MODES[i].name;

+                    }

+                }

+            }

+

+			function sf_getWepPassword(){

+				return target.keyID() == '3' ? sv_quickSettingInfo.Key4Str1 : (target.keyID() == '2' ? sv_quickSettingInfo.Key3Str1 : target.keyID() == '1' ? sv_quickSettingInfo.Key2Str1 : sv_quickSettingInfo.Key1Str1);

+			}

+

+            function sf_isDisabled_Wifi() {

+                var s_wpsInfo = service.getWpsInfo();

+                if(s_wpsInfo.radioFlag == "0"){

+                    return sv_wifiState.wifi_off;

+                }else if (s_wpsInfo.wpsFlag == '1') {

+                    return sv_wifiState.wps_on;

+                }

+                return sv_wifiState.ok;

+            }			

+			function sf_profileChangeHandler(i_data, i_event) {

+			    $("#pwdWepKey").parent().find("label[class='error']").hide();		

+			    target.wepPassword(target.getWepPassword());

+			    return true;

+		    }

+

+           // ���������ύ(֧��IPv6��

+            function sf_quickSetting4IPv6() {

+                showLoading();

+                var useIPv4ForV6 = config.IPV4V6_SUPPORT && target.currAPN().pdp_type == "IPv4v6";

+

+                var ciphertext = "";

+                if (config.PASSWORD_ENCODE) {

+		    ciphertext = target.WPAKey();

+		} else {

+                    var kparam = service.getDeviceInfoLow();

+                    var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		    var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                    ciphertext = CryptoJS.AES.encrypt(target.WPAKey(), tkey, {

+                        iv: tiv,

+                        mode: CryptoJS.mode.CBC,

+                        padding: CryptoJS.pad.ZeroPadding

+                        }).toString();

+		}

+

+                var s_quickSettingParameters = {

+                    apn_index: sv_quickSettingInfo.apn_index,

+                    apnMode: target.apnMode(),		

+                    Encryption_Mode_hid: target.selectedSecurityMode(),	

+                    ipv6_ppp_auth_mode: useIPv4ForV6 ? target.selectedAuthMode() : target.ipv6_selectedAuthMode(),

+                    ipv6_ppp_username: useIPv4ForV6 ? target.username() : target.ipv6_username(),

+                    ipv6_ppp_passtmp: useIPv4ForV6 ? target.password() : target.ipv6_password(),	

+                    ipv6_wan_apn: useIPv4ForV6 ? target.apn() : target.ipv6_apn(),					

+                    pdp_type: target.ipType(),

+                    ppp_auth_mode: target.selectedAuthMode(),

+                    ppp_username: target.username(),

+                    ppp_passtmp: target.password(),

+                    profile_name: target.profileName(),

+                    //Ŀǰ����ģʽֻ��2�֣�����3������Ϊ�̶�ֵ

+                    //������Ҫ����Ϊ5�֣�����ֵ��Ҫ����

+                    security_shared_mode: "NONE",					

+                    SSID_Broadcast: target.broadcast(),

+                    SSID_name: target.ssid(),

+                    wan_apn: target.apn(),		

+                    wep_default_key: 0,				

+                    WPA_ENCRYPTION_hid: target.selectedSecurityMode() == "OPEN" ? "NONE" : target.selectedSecurityMode() == "WPA2PSK" ? 1 : 2,					

+                    WPA_PreShared_Key: ciphertext

+                }

+

+				s_quickSettingParameters.wep_default_key = target.keyID();	

+

+				if(target.encryptType() == "SHARED" || target.selectedSecurityMode() == "WEP") {

+

+					s_quickSettingParameters.security_shared_mode = "WEP";

+

+                    s_quickSettingParameters.wep_key_1 = sv_quickSettingInfo.Key1Str1;

+					s_quickSettingParameters.wep_key_2 = sv_quickSettingInfo.Key2Str1;

+					s_quickSettingParameters.wep_key_3 = sv_quickSettingInfo.Key3Str1;

+					s_quickSettingParameters.wep_key_4 = sv_quickSettingInfo.Key4Str1;

+

+					var WEPSelectTmp = '0';

+

+                    if(target.wepPassword().length =='5' ||target.wepPassword().length =='13'){

+						WEPSelectTmp = '1';	

+					}else{

+						WEPSelectTmp = '0';	

+					}	

+

+					if(target.keyID() =='3'){

+						s_quickSettingParameters.wep_key_4  = target.wepPassword();

+						s_quickSettingParameters.WEP4Select = WEPSelectTmp;						

+					}else if(target.keyID() =='2'){	

+						s_quickSettingParameters.wep_key_3  = target.wepPassword();

+						s_quickSettingParameters.WEP3Select = WEPSelectTmp;						

+					}else if(target.keyID() =='1'){						

+						s_quickSettingParameters.wep_key_2  = target.wepPassword();

+						s_quickSettingParameters.WEP2Select = WEPSelectTmp;					

+					}else{

+						s_quickSettingParameters.wep_key_1  = target.wepPassword();

+						s_quickSettingParameters.WEP1Select = WEPSelectTmp;					

+					}					

+				}else if(target.encryptType() == "WPAPSKWPA2PSK") {

+					s_quickSettingParameters.security_shared_mode = "NONE";

+				}else {

+					s_quickSettingParameters.security_shared_mode = "NONE";

+				}

+

+                service.setQuickSetting4IPv6(s_quickSettingParameters, target.callback);

+            }			

+

+			function sf_selectedAuthMode_display() {

+                var mode = target.selectedAuthMode();

+                return sf_getAuthModeNameByValue(mode);

+            }

+

+            function sf_selectedSecurityMode_trans() {

+                var mode = target.selectedSecurityMode();

+				var modesOption = config.WIFI_WEP_SUPPORT ? config.AUTH_MODES_WEP : config.AUTH_MODES;

+                for (var i = 0; i < modesOption.length; i++) {

+                    if (mode == modesOption[i].value) {

+                        target.selectedSecurityMode_display($.i18n.prop("security_mode_" +  modesOption[i].value));

+                        return "security_mode_" +  modesOption[i].value;

+                    }

+                }

+            }

+

+			function sf_showWifiPasswordHandler(){

+				$("#pwdWepKey").parent().find(".error").hide();

+                $("#codeWPAKey").parent().find(".error").hide();

+                var checkbox = $("#showWifiPassword:checked");

+                if(checkbox && checkbox.length == 0){

+                    target.showWifiPassword(true);

+                }else{

+                    target.showWifiPassword(false);

+                }

+            }			

+

+        }

+

+        function init() {

+            var container = $('#container');

+            ko.cleanNode(container[0]);

+            var fwVm = new quickSettingViewModel();

+            ko.applyBindings(fwVm, container[0]);

+

+            $('#quickSettingForm').validate({

+                submitHandler:function () {

+                    if (fwVm.currentStep() < 5) {

+                        fwVm.next();

+                    } else {

+                        fwVm.save();

+                    }

+                },

+                rules:{

+                    txtAPN:"apn_check",

+                    txtIPv6APN:"apn_check",

+                    txtSSID:'ssid',

+                    pwdWepKey:{wifi_wep_password_check:true,wifi_password_check: true},

+                    txtWepKey:{wifi_wep_password_check:true,wifi_password_check: true},

+                    txtWPAKey:'wifi_password_check',

+                    codeWPAKey:'wifi_password_check',

+                    txtUserName:'ppp_username_check',

+                    txtIPv6UserName:'ppp_username_check',

+                    txtSecretCode:"ppp_secretcode_check",

+                    txtIPv6SecretCode:"ppp_secretcode_check"

+                },

+                errorPlacement:function (error, element) {

+                    var id = element.attr("id");

+                    if (id == "pwdWepKey" || id == "txtWepKey"){

+						error.insertAfter("#lblShowWepPassword");

+					} else if (id == "txtWPAKey" || id == "codeWPAKey") {

+                        error.insertAfter("#lblShowWifiPassword");

+                    } else {

+                        error.insertAfter(element);

+                    }

+                }

+            });

+        }

+

+        return {

+            init:init

+        };

+    }

+);

+

+define("main","set service knockout underscore jquery statusBar echarts".split(" "), function (set, fnc, libko, libus, libjq, barStat, echarts) {

+

+    var chartOptions = {

+        color: ['red', 'red', 'red', 'red', 'red'],	

+        series: [{

+                name: '��������',

+                type: 'pie',

+                radius: ['0', '72'],

+                itemStyle: {

+                    normal: {

+                        label: {

+                            show: false

+                        },

+                        labelLine: {

+                            show: false

+                        }

+                    }

+                },

+                data: [],

+                selectedOffset: 3

+            }

+        ],

+		animation: false,

+        title: {

+            text: '',

+            x: 'center',

+            y: 'center',

+            itemGap: 0,

+            textStyle: {

+                color: '#FFF',

+                fontFamily: '΢���ź�',

+                fontSize: 20,

+                fontWeight: 'bolder'

+            },

+            subtextStyle: {

+                color: '#FFF',

+                fontFamily: '΢���ź�',

+                fontSize: 16,

+                fontWeight: 'bolder'

+            }

+        },

+        tooltip: {

+            formatter: "{b}"

+        },

+    };

+	var languageOld = window.language;

+	var num_refresh = 0;

+	var traffic_graphic_chart = null;

+    var connStat = {

+        CONNECTED: 1,

+        DISCONNECTED: 2,

+        CONNECTING: 3,

+        DISCONNECTING: 4

+    };

+	function init() {

+        num_refresh = 0;

+        homeUtil.oldUsedData = null;

+        homeUtil.oldAlarmData = null;

+        traffic_graphic_chart = echarts.init(libjq("#traffic_graphic")[0]);

+        var container = libjq('#container')[0];

+        libko.cleanNode(container);

+        var tmp = new VmHome();

+        libko.applyBindings(tmp, container);

+		var data = fnc.getLoginData();

+		var psw_flg = data.psw_changed;

+		if (psw_flg != "1") {

+			showConfirm("password_note_first_change", function () {

+                    window.location.hash = '#pwd_mode';

+                });

+			return;

+		}										

+    }

+

+    var homeUtil = {

+        initStatus: null,

+        initShownStatus: function (data) {

+            this.initStatus = {};

+            var ipv6Mode = data.ipv6PdpType.toLowerCase().indexOf("v6") > 0;

+            if (set.RJ45_SUPPORT) {

+                var mode = checkCableMode(data.blc_wan_mode);

+                if (mode) {

+                    this.initStatus.showIpv6WanIpAddr = false;

+                    this.initStatus.showIpv4WanIpAddr = true;

+                } else if (set.IPV6_SUPPORT) {

+                    if (data.pdpType == "IP") {

+                        this.initStatus.showIpv6WanIpAddr = false;

+                        this.initStatus.showIpv4WanIpAddr = true;

+                    } else if (ipv6Mode) {

+                        if (data.ipv6PdpType == "IPv6") {

+                            this.initStatus.showIpv6WanIpAddr = true;

+                            this.initStatus.showIpv4WanIpAddr = false;

+                        } else {

+                            this.initStatus.showIpv6WanIpAddr = true;

+                            this.initStatus.showIpv4WanIpAddr = true;

+                        }

+                    }

+                } else {

+                    this.initStatus.showIpv6WanIpAddr = false;

+                    this.initStatus.showIpv4WanIpAddr = true;

+                }

+            } else {

+                if (set.IPV6_SUPPORT) {

+                    if (data.pdpType == "IP") {

+                        this.initStatus.showIpv6WanIpAddr = false;

+                        this.initStatus.showIpv4WanIpAddr = true;

+                    } else if (ipv6Mode) {

+                        if (data.ipv6PdpType == "IPv6") {

+                            this.initStatus.showIpv6WanIpAddr = true;

+                            this.initStatus.showIpv4WanIpAddr = false;

+                        } else {

+                            this.initStatus.showIpv6WanIpAddr = true;

+                            this.initStatus.showIpv4WanIpAddr = true;

+                        }

+                    }

+                } else {

+                    this.initStatus.showIpv6WanIpAddr = false;

+                    this.initStatus.showIpv4WanIpAddr = true;

+                }

+            }

+        },

+        wanIpGet: function (data) {

+            var addrInfo = {

+                wanIpAddress: '',

+                ipv6WanIpAddress: ''

+            };

+            addrInfo.wanIpAddress = verifyDeviceInfo(data.wanIpAddress);

+            addrInfo.ipv6WanIpAddress = verifyDeviceInfo(data.ipv6WanIpAddress);

+            return addrInfo;

+        },

+        cachedAPStationBasic: null,

+        cachedConnectionMode: null,

+        getCanConnectNetWork: function (param) {

+            var status = fnc.getStatusInfo();

+            if (status.simStatus != "modem_init_complete") {

+                return false;

+            }

+            var typeNetworkTmp = status.networkType.toLowerCase();

+            if (typeNetworkTmp == 'searching') {

+                return false;

+            }

+            if (typeNetworkTmp == '' || typeNetworkTmp == 'limited service') {

+                typeNetworkTmp = 'limited_service';

+            }

+            if (typeNetworkTmp == 'no service') {

+                typeNetworkTmp = 'no_service';

+            }

+            if (typeNetworkTmp == 'limited_service' || typeNetworkTmp == 'no_service') {

+                if (param.cStatus() != connStat.CONNECTED) {

+                    return false;

+                }

+            }

+            if (set.AP_STATION_SUPPORT) {

+                if (status.connectWifiStatus == "connect") {

+                    if (status.ap_station_mode == "wifi_pref") {

+                        return false;

+                    }

+                }

+            }

+            return true;

+        },

+        doConnect: function () {

+            showLoading('connecting');

+            fnc.connect({}, function (data) {

+                if (data.result) {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        },

+        refreshHomeData: function (param) {

+            var info = fnc.getConnectionInfo();

+            param.connectStatus(info.connectStatus);

+            param.canConnect(this.getCanConnectNetWork(param));

+            param.networkType(homeUtil.getNetworkType(info.networkType));

+            if (info.connectStatus == "ppp_connected") {

+                param.current_Flux(transUnit(parseInt(info.data_counter.currentReceived, 10) + parseInt(info.data_counter.currentSent, 10), false));

+                param.connected_Time(transSecond2Time(info.data_counter.currentConnectedTime));

+                param.up_Speed(transUnit(info.data_counter.uploadRate, true));

+                param.down_Speed(transUnit(info.data_counter.downloadRate, true));

+            } else {

+                param.current_Flux(transUnit(0, false));

+                param.connected_Time(transSecond2Time(0));

+                param.up_Speed(transUnit(0, true));

+                param.down_Speed(transUnit(0, true));

+            }

+            param.trafficAlertEnable(info.limitVolumeEnable);

+            if (info.limitVolumeEnable) {

+                if (info.limitVolumeType == '1') {

+                    param.trafficUsed(transUnit(parseInt(info.data_counter.monthlySent, 10) + parseInt(info.data_counter.monthlyReceived, 10), false));

+                    param.trafficLimited(transUnit(info.limitDataMonth, false));

+                } else {

+                    param.trafficUsed(transSecond2Time(info.data_counter.monthlyConnectedTime));

+                    param.trafficLimited(transSecond2Time(info.limitTimeMonth));

+                }

+            }

+            if (languageOld != window.language) {

+                languageOld = window.language;

+                num_refresh = 1;

+            }

+            if (param.showTraffic()) {

+                homeUtil.updateEcharts(info);

+            } else {

+                homeUtil.allFreeEcharts();

+            }

+            homeUtil.refreshStationInfo(param);

+        },

+        allFreeEcharts: function () {

+            var usedData = homeUtil.data.free;

+            usedData.value = 1;

+            usedData.selected = false;

+            usedData.name = libjq.i18n.prop("echarts_no");

+            chartOptions.series[0].data = [usedData];

+            chartOptions.title.text = '';

+            homeUtil.setEcharts(chartOptions, libjq.i18n.prop("echarts_no"));

+        },

+        getNetworkType: function (networkType) {

+            var typeNetworkTmp = networkType.toLowerCase();

+            if (typeNetworkTmp == '' || typeNetworkTmp == 'limited service') {

+                typeNetworkTmp = 'limited_service';

+            }

+            if (typeNetworkTmp == 'no service') {

+                typeNetworkTmp = 'no_service';

+            }

+            if (typeNetworkTmp == 'limited_service' || typeNetworkTmp == 'no_service') {

+                return libjq.i18n.prop("network_type_" + typeNetworkTmp);

+            } else {

+                return networkType;

+            }

+        },

+        data: {

+            full: {

+                value: 30,

+                name: '��������',

+                itemStyle: {

+                    normal: {

+                        color: '#DF4313'

+                    }

+                }

+            },		

+            used: {

+                value: 30,

+                name: '��ʹ��',

+                itemStyle: {

+                    normal: {

+                        color: '#8CC916'

+                    }

+                }

+            },

+            left1: {

+                value: 50,

+                name: '����ֵ��δʹ��',

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                }

+            },

+            free: {

+                value: 50,

+                name: 'δʹ��',

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                }

+            },

+            alert: {

+                value: 1,

+                name: '����ֵ',

+                itemStyle: {

+                    normal: {

+                        color: '#FF5500'

+                    }

+                }

+            },

+            alarm: {

+                value: 19.7,

+                name: '������',

+                itemStyle: {

+                    normal: {

+                        color: '#8CC916'

+                    }

+                }

+            },

+            start: {

+                value: 50,

+                name: '����ֵ��δʹ��',

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                }

+            },

+        },

+		getDataInfo: function (value) {

+            return {

+                data: /\d+(.\d+)?/.exec(value)[0],

+                unit: /[A-Z]{1,2}/.exec(value)[0]

+            }

+        },

+        oldAlarmData: null,

+        oldUsedData: null,

+        updateEcharts: function (info) {

+            var startName = libjq.i18n.prop("echarts_no");

+            num_refresh++;

+            if (num_refresh % 10 != 2) {

+                return false;

+            }

+            var total = 0,

+            used = 0,

+            reach = 0,

+            left = 0,

+            alarm = 0,

+            left1 = 0;

+            if (info.limitVolumeEnable) {

+                startName = libjq.i18n.prop("echarts_used");

+                chartOptions.series[0].data = [];

+                if (info.limitVolumeType == '1') {

+                    var limitedDataFormatted = transUnit(info.limitDataMonth, false);

+                    chartOptions.series[0].data = [];

+                    if (info.limitDataMonth == 0) {

+                        var usedData = homeUtil.data.used;

+                        usedData.value = 1;

+                        usedData.selected = false;

+                        usedData.name = libjq.i18n.prop("echarts_used");

+                        chartOptions.series[0].data.push(usedData);

+                    } else {

+                        var dataInfo = homeUtil.getDataInfo(limitedDataFormatted);

+                        total = dataInfo.data * homeUtil.getUnitValue(dataInfo.unit) * 1048576;

+                        used = parseInt(info.data_counter.monthlySent, 10) + parseInt(info.data_counter.monthlyReceived, 10);

+                        reach = total * info.limitVolumePercent / 100;

+                        if (used >= total) {

+                            var fullData = homeUtil.data.full;

+                            fullData.value = 100;

+                            fullData.name = libjq.i18n.prop("echarts_full");

+                            chartOptions.series[0].data.push(fullData);

+                            startName = libjq.i18n.prop("echarts_full");

+                        } else {

+                            if (reach - used > 0) {

+                                left1 = reach - used;

+                                left = total - reach;

+                            } else {

+                                alarm = used - reach;

+                                left = total - used;

+                            }

+                            var usedData = homeUtil.data.used;

+                            if (reach - used > 0) {

+                                usedData.value = used;

+                            } else {

+                                usedData.value = reach;

+                            }

+                            usedData.name = libjq.i18n.prop("echarts_used");

+                            chartOptions.series[0].data.push(usedData);

+                            if (left1 > 0) {

+                                var left1Data = homeUtil.data.left1;

+                                left1Data.value = left1;

+                                left1Data.name = libjq.i18n.prop("echarts_left1");

+                                chartOptions.series[0].data.push(left1Data);

+                            }

+                            var alertData = homeUtil.data.alert;

+                            alertData.value = total / 200;

+                            alertData.name = libjq.i18n.prop("echarts_alert");

+                            chartOptions.series[0].data.push(alertData);

+                            if (alarm > 0) {

+                                var alarmData = homeUtil.data.alarm;

+                                alarmData.value = alarm;

+                                alarmData.name = libjq.i18n.prop("echarts_alarm");

+                                chartOptions.series[0].data.push(alarmData);

+                            }

+                            var freeData = homeUtil.data.free;

+                            freeData.value = left;

+                            freeData.name = libjq.i18n.prop("echarts_free");

+                            chartOptions.series[0].data.push(freeData);

+                        }

+                    }

+                } else {

+                    chartOptions.series[0].data = [];

+                    if (info.limitTimeMonth == 0) {

+                        var usedData = homeUtil.data.used;

+                        usedData.value = 1;

+                        usedData.selected = false;

+                        usedData.name = libjq.i18n.prop("echarts_used");

+                        chartOptions.series[0].data.push(usedData);

+                    } else {

+                        total = info.limitTimeMonth;

+                        used = info.data_counter.monthlyConnectedTime;

+                        reach = total * info.limitVolumePercent / 100;

+                        if (used >= total) {

+                            var fullTime = homeUtil.data.full;

+                            fullTime.value = 100;

+                            fullTime.name = libjq.i18n.prop("echarts_full");

+                            chartOptions.series[0].data.push(fullTime);

+                            startName = libjq.i18n.prop("echarts_full");

+                        } else {

+                            if (reach - used > 0) {

+                                left1 = reach - used;

+                                left = total - reach;

+                            } else {

+                                alarm = used - reach;

+                                left = total - used;

+                            }

+                            var usedTime = homeUtil.data.used;

+                            if (reach - used > 0) {

+                                usedTime.value = used;

+                            } else {

+                                usedTime.value = reach;

+                            }

+                            usedTime.name = libjq.i18n.prop("echarts_used");

+                            chartOptions.series[0].data.push(usedTime);

+                            if (left1 > 0) {

+                                var left1Time = homeUtil.data.left1;

+                                left1Time.value = left1;

+                                left1Time.name = libjq.i18n.prop("echarts_left1");

+                                chartOptions.series[0].data.push(left1Time);

+                            }

+                            var alertTime = homeUtil.data.alert;

+                            alertTime.value = total / 200;

+                            alertTime.name = libjq.i18n.prop("echarts_alert");

+                            chartOptions.series[0].data.push(alertTime);

+                            if (alarm > 0) {

+                                var alarmTime = homeUtil.data.alarm;

+                                alarmTime.value = alarm;

+                                alarmTime.name = libjq.i18n.prop("echarts_alarm");

+                                chartOptions.series[0].data.push(alarmTime);

+                            }

+                            var freeTime = homeUtil.data.free;

+                            freeTime.value = left;

+                            freeTime.name = libjq.i18n.prop("echarts_free");

+                            chartOptions.series[0].data.push(freeTime);

+                        }

+                    }

+                }

+            } else {

+                var usedData = homeUtil.data.used;

+                usedData.value = 1;

+                usedData.selected = false;

+                usedData.name = libjq.i18n.prop("echarts_no");

+                chartOptions.series[0].data = [usedData];

+                chartOptions.title.text = '';

+            }

+            var firstEle = libus.find(chartOptions.series[0].data, function (n) {

+                return n.name == libjq.i18n.prop("echarts_used");

+            });

+            var alarmEle = libus.find(chartOptions.series[0].data, function (n) {

+                return n.name == libjq.i18n.prop("echarts_alarm");

+            });

+            if (!alarmEle) {

+                alarmEle = {

+                    value: 0

+                };

+            }

+            if (typeof firstEle == "undefined") {

+                homeUtil.setEcharts(chartOptions, startName);

+            } else if (homeUtil.oldUsedData != firstEle.value || homeUtil.oldAlarmData != alarmEle.value) {

+                homeUtil.oldUsedData = firstEle.value;

+                homeUtil.oldAlarmData = alarmEle.value;

+                homeUtil.setEcharts(chartOptions, startName);

+            }

+        },

+        getUnitValue: function (unit) {

+            unit = unit.toUpperCase();

+            if (unit == 'GB') {

+                return '1024';

+            } else if (unit == 'TB') {

+                return '1048576';

+            } else {

+                return '1';

+            }

+        },		

+        setEcharts: function (options, startName) {

+            var startPart = homeUtil.data.start;

+            startPart.value = 0;

+            startPart.name = startName;

+            startPart.selected = false;

+            var arr = [startPart].concat(options.series[0].data);

+            options.series[0].data = arr;

+            traffic_graphic_chart.setOption(options, true);

+            addTimeout(function () {

+                traffic_graphic_chart.resize();

+            }, 1000);

+        },

+        refreshStationInfo: function (param) {

+            param.wirelessDeviceNum(fnc.getStatusInfo().wirelessDeviceNum);

+            if (num_refresh % 10 == 2) {

+                fnc.getAttachedCableDevices({}, function (data) {

+                    param.wireDeviceNum(data.attachedDevices.length);

+                });

+            }

+        },		

+        getUnit: function (val) {

+            if (val == '1024') {

+                return 'GB';

+            } else if (val == '1048576') {

+                return 'TB';

+            } else {

+                return 'MB';

+            }

+        },

+        refreshOpmodeInfo: function (param) {

+            var obj = fnc.getOpMode();

+            param.isLoggedIn(obj.loginfo == "ok");

+            var currentMode = checkCableMode(obj.blc_wan_mode);

+            if (param.opCurMode() && !currentMode) {

+                var data = fnc.getLoginData();

+                var state = data.modem_main_state;

+                if (state == "modem_sim_undetected" || state == "modem_undetected" || state == "modem_sim_destroy" || state == "modem_waitpin" || state == "modem_waitpuk" || state == "modem_imsi_waitnck") {

+                    window.location.reload();

+                    return;

+                }

+            }

+            param.opCurMode(currentMode);

+            if (currentMode && obj.ethwan_mode == "DHCP") {

+                param.enableFlag(false);

+            } else if ((!currentMode && obj.ppp_status != "ppp_disconnected") || (currentMode && obj.rj45_state != "idle" && obj.rj45_state != "dead")) {

+                param.enableFlag(true);

+            } else {

+                param.enableFlag(false);

+            }

+            var mode = (obj.blc_wan_mode == "AUTO_PPP" || obj.blc_wan_mode == "AUTO_PPPOE") ? "AUTO" : obj.blc_wan_mode;

+            var currentOpMode = "";

+            switch (mode) {

+            case "AUTO":

+                currentOpMode = "opmode_auto";

+                break;

+            case "PPPOE":

+                currentOpMode = "opmode_cable";

+                break;

+            case "PPP":

+                currentOpMode = "opmode_gateway";

+                break;

+            default:

+                break;

+            }

+            libjq("#opmode").attr("data-trans", currentOpMode).text(libjq.i18n.prop(currentOpMode));

+            param.isShowHomeConnect(!currentMode);

+            param.showTraffic(set.TRAFFIC_SUPPORT && !currentMode);

+            param.isSupportQuicksetting(set.HAS_QUICK_SETTING && !currentMode);

+        }

+    };

+	function VmHome() {

+        var target = this;

+        target.hasSms = set.HAS_SMS;

+        target.hasPhonebook = set.HAS_PHONEBOOK;

+        target.isSupportSD = set.SD_CARD_SUPPORT;

+        target.isCPE = set.PRODUCT_TYPE == 'CPE';

+        target.hasRj45 = set.RJ45_SUPPORT;

+        target.notDataCard = set.PRODUCT_TYPE != 'DATACARD';

+        target.hasParentalControl = set.HAS_PARENTAL_CONTROL;

+        target.hasUssd = set.HAS_USSD;

+        var wifiInfo = fnc.getWifiBasic();

+        if (set.WIFI_SUPPORT_QR_SWITCH) {

+            target.showQRCode = set.WIFI_SUPPORT_QR_CODE && wifiInfo.show_qrcode_flag;

+        } else {

+            target.showQRCode = set.WIFI_SUPPORT_QR_CODE;

+        }

+        if(set.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_ssid_wifikey.png?_=' + libjq.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        if (target.hasRj45) {

+            var opModeObj = checkCableMode(fnc.getOpMode().blc_wan_mode);

+            target.opCurMode = libko.observable(opModeObj);

+            target.isShowHomeConnect = libko.observable(!opModeObj);

+            target.showTraffic = libko.observable(set.TRAFFIC_SUPPORT && !opModeObj);

+            target.isSupportQuicksetting = libko.observable(set.HAS_QUICK_SETTING && !opModeObj);

+        } else {

+            target.isShowHomeConnect = libko.observable(true);

+            target.showTraffic = libko.observable(set.TRAFFIC_SUPPORT);

+            target.isSupportQuicksetting = libko.observable(set.HAS_QUICK_SETTING);

+        }

+        if (set.PRODUCT_TYPE == 'DATACARD') {

+            libjq('#home_image').addClass('data-card');

+        }

+        var info = fnc.getConnectionInfo();

+        target.networkType = libko.observable(homeUtil.getNetworkType(info.networkType));

+        target.connectStatus = libko.observable(info.connectStatus);

+        target.canConnect = libko.observable(false);

+        target.cStatus = libko.computed(function () {

+            if (target.connectStatus().indexOf('_connected') != -1) {

+                return connStat.CONNECTED;

+            } else if (target.connectStatus().indexOf('_disconnecting') != -1) {

+                return connStat.DISCONNECTING;

+            } else if (target.connectStatus().indexOf('_connecting') != -1) {

+                return connStat.CONNECTING;

+            } else {

+                return connStat.DISCONNECTED;

+            }

+        });

+        target.current_Flux = libko.observable(transUnit(0, false));

+        target.connected_Time = libko.observable(transSecond2Time(0));

+        target.up_Speed = libko.observable(transUnit(0, true));

+        target.down_Speed = libko.observable(transUnit(0, true));

+        target.isLoggedIn = libko.observable(false);

+        target.enableFlag = libko.observable(true);

+        target.simSerialNumber = libko.observable('');

+        target.imei = libko.observable('');

+        target.imsi = libko.observable('');

+        target.iccid = libko.observable('');

+        target.cellid = libko.observable('');

+        target.ssid = libko.observable('');

+        target.hasWifi = set.HAS_WIFI;

+        target.showMultiSsid = libko.observable(set.HAS_MULTI_SSID && wifiInfo.multi_ssid_enable == "1");

+        target.trafficAlertEnable = libko.observable(false);

+        target.trafficUsed = libko.observable('');

+        target.trafficLimited = libko.observable('');

+        target.wireDeviceNum = libko.observable(fnc.getAttachedCableDevices().attachedDevices.length);

+        target.wirelessDeviceNum = libko.observable(fnc.getStatusInfo().wirelessDeviceNum);

+        target.showOpModeWindow = function () {

+            if (target.enableFlag()) {

+                return;

+            }

+            showSettingWindow("change_mode", "opmode_popup", "opmode_popup", 400, 300, function () {});

+        };

+        target.currentOpMode = libko.observable("0");

+        var popoverShown = false;

+        libjq('#showDetailInfo').popover({

+            html: true,

+            placement: 'top',

+            trigger: 'focus',

+            title: function () {

+                return libjq.i18n.prop('device_info')

+            },

+            content: function () {

+                return getDetailInfoContent();

+            }

+        }).on('shown.bs.popover', function () {

+            popoverShown = true;

+        }).on('hidden.bs.popover', function () {

+            popoverShown = false;

+        });

+        function fetchDeviceInfo() {

+            var data = fnc.getDeviceInfo();

+            target.simSerialNumber(verifyDeviceInfo(data.simSerialNumber));

+            target.imei(verifyDeviceInfo(data.imei));

+            target.imsi(verifyDeviceInfo(data.imsi));

+            target.iccid(verifyDeviceInfo(data.iccid));

+            target.cellid(verifyDeviceInfo(data.cellid));

+            target.ssid(verifyDeviceInfo(data.ssid));

+            target.showMultiSsid(set.HAS_MULTI_SSID && data.multi_ssid_enable == "1");

+            return data;

+        }

+        fetchDeviceInfo();

+        function getDetailInfoContent() {

+            var data = fetchDeviceInfo();

+            homeUtil.initShownStatus(data);

+            var addrInfo = homeUtil.wanIpGet(data);

+            var compiled = libus.template(libjq("#detailInfoTmpl").html());

+            var tmpl = compiled({

+                simSerialNumber: verifyDeviceInfo(data.simSerialNumber),

+                imei: verifyDeviceInfo(data.imei),

+                imsi: verifyDeviceInfo(data.imsi),

+                iccid : verifyDeviceInfo(data.iccid),

+                cellid: verifyDeviceInfo(data.cellid),

+                signal: signalFormat(data.signal),

+                hasWifi: set.HAS_WIFI,

+                isCPE: set.PRODUCT_TYPE == 'CPE',

+                hasRj45: set.RJ45_SUPPORT,

+                showMultiSsid: set.HAS_MULTI_SSID && data.multi_ssid_enable == "1",

+                ssid: verifyDeviceInfo(data.ssid),

+                max_access_num: verifyDeviceInfo(data.max_access_num),

+                m_ssid: verifyDeviceInfo(data.m_ssid),

+                m_max_access_num: verifyDeviceInfo(data.m_max_access_num),

+                wifi_long_mode: "wifi_des_" + data.wifiRange,

+                lanDomain: verifyDeviceInfo(data.lanDomain),

+                ipAddress: verifyDeviceInfo(data.ipAddress),

+                showMacAddress: set.SHOW_MAC_ADDRESS,

+                macAddress: verifyDeviceInfo(data.macAddress),

+                showIpv4WanIpAddr: homeUtil.initStatus.showIpv4WanIpAddr,

+                wanIpAddress: addrInfo.wanIpAddress,

+                showIpv6WanIpAddr: homeUtil.initStatus.showIpv6WanIpAddr,

+                ipv6WanIpAddress: addrInfo.ipv6WanIpAddress,

+                sw_version: verifyDeviceInfo(data.sw_version),

+                hw_version: verifyDeviceInfo(data.hw_version)

+            });

+            return libjq(tmpl).translate();

+        }

+        target.connectHandler = function () {

+            if (target.connectStatus() == "ppp_connected") {

+                showLoading('disconnecting');

+                fnc.disconnect({}, function (data) {

+                    if (data.result) {

+                        successOverlay();

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            } else {

+                if (fnc.getStatusInfo().roamingStatus) {

+                    showConfirm('dial_roaming_connect', function () {

+                        target.connect();

+                    });

+                } else {

+                    target.connect();

+                }

+            }

+        };

+        target.connect = function () {

+            var statusInfo = fnc.getStatusInfo();

+            var trafficResult = barStat.getTrafficResult(statusInfo);

+            if (statusInfo.limitVolumeEnable && trafficResult.showConfirm) {

+                var confirmMsg = null;

+                if (trafficResult.usedPercent > 100) {

+                    confirmMsg = {

+                        msg: 'traffic_beyond_connect_msg'

+                    };

+                    barStat.setTrafficAlertPopuped(true);

+                } else {

+                    confirmMsg = {

+                        msg: 'traffic_limit_connect_msg',

+                        params: [trafficResult.limitPercent]

+                    };

+                    barStat.setTrafficAlert100Popuped(false);

+                }

+                showConfirm(confirmMsg, function () {

+                    homeUtil.doConnect();

+                });

+            } else {

+                homeUtil.doConnect();

+            }

+        };

+        fnc.getSignalStrength({}, function (data) {

+            var signalTxt = signalFormat(convertSignal(data));

+            libjq("#fresh_signal_strength").text(signalTxt);

+            if (popoverShown) {

+                libjq("#popoverSignalTxt").text(signalTxt);

+            }

+        });

+        homeUtil.refreshHomeData(target);

+        addInterval(function () {

+            fnc.getSignalStrength({}, function (data) {

+                var signalTxt = signalFormat(convertSignal(data));

+                libjq("#fresh_signal_strength").text(signalTxt);

+                if (popoverShown) {

+                    libjq("#popoverSignalTxt").text(signalTxt);

+                }

+            });

+            homeUtil.refreshHomeData(target);

+        }, 1000);

+        if (target.hasRj45) {

+            homeUtil.refreshOpmodeInfo(target);

+            addInterval(function () {

+                homeUtil.refreshOpmodeInfo(target);

+            }, 1000);

+        }

+        target.showNetworkSettingsWindow = function () {

+            if (target.hasRj45) {

+                fnc.getOpMode({}, function (data) {

+                    var mode = checkCableMode(data.blc_wan_mode);

+                    if (mode) {

+                        window.location.hash = '#network_set';

+                    } else {

+                        window.location.hash = '#conn_set';

+                    }

+                });

+            } else {

+                window.location.hash = '#conn_set';

+            }

+        }

+    };

+    return {

+        init: init

+    };

+});

+

+

+define("language","knockout service jquery set underscore".split(" "), 

+    function(ko, service, $, config, _) {

+

+    //  ��ȡ��ǰ������

+    function getCurrentLanguage() {

+        return service.getLanguage();

+    }		

+

+    //  ��������������������Դ������ҳ���ϵ�body����

+    //  @param {String} current ������:zh-cn

+    function loadLanguageAndRefresh(current){

+        window.CURRENT_LANGUAGE = current;

+        $("body").attr('lang', current);

+        $.i18n.properties({

+            name:'Messages',

+            path:'i18n/',

+            mode:'map',

+            cache: true,

+            language:current,

+            callback: function() {

+                jQuery.validator.messages = $.i18n.map;

+                $('body').translate();

+            }

+        });

+    }

+

+	window.language = null;

+

+

+    function LanguageViewModel() {

+        var target = this;

+        var currentLan = getCurrentLanguage();

+        var languages = _.map(config.LANGUAGES, function(item) {

+            return new Option(item.name, item.value);

+        });

+

+        document.title = config.WEBUI_TITLE;

+        if($('#webui_title')[0]) {

+            $('#webui_title').html(config.WEBUI_TITLE);

+        }

+

+        target.languages   = ko.observableArray(languages);

+        target.currentLan = ko.observable(currentLan.Language);

+		window.language      = target.currentLan();

+

+        //  �л������¼�����

+        //  @event langChangeHandler 

+        target.langChangeHandler = function(info, event) {

+            clearValidateMsg();

+

+            service.setLanguage({Language: target.currentLan()}, function() {

+                loadLanguageAndRefresh(target.currentLan());

+				window.language = target.currentLan();

+            });

+        };

+

+        // ���������б���ˢ�½���

+        loadLanguageAndRefresh(target.currentLan());

+    }

+

+    //  ��ʼ������VM������

+    function init() {

+        ko.applyBindings(new LanguageViewModel(), $('#language')[0]);

+    }

+

+    return {

+        init: init

+    };

+});

+

+

+// ��½ ģ��

+define("entry","jquery knockout set service underscore menu logout CryptoJS".split(" "), 

+	function($, ko,config, service, _, menu, logout, CryptoJS) {

+

+

+        var pageState      = {LOGIN:0, WAIT_PIN:1, WAIT_PUK:2, PUK_LOCKED:3, LOGGEDIN:4, LOADING:5};

+        var timer          = loginStatusCheckingTimer();

+        var loginLockTimer = 0;

+        var lastLoginStatus = "0";

+

+        function loginViewModel() {

+            var target        = this;

+            var data        = service.getLoginData();

+            var loginStatus = service.getLoginStatus();

+

+            target.confirmPIN           = ko.observable();	

+            target.leftSeconds          = ko.observable(0);				

+            target.loginCount           = ko.observable(0);

+            target.loginSecuritySupport = ko.observable(config.LOGIN_SECURITY_SUPPORT);

+            target.newPIN               = ko.observable();			

+            target.password             = ko.observable();

+            target.PIN                  = ko.observable();

+            target.pinNumber            = ko.observable(data.pinnumber);			

+            target.PUK                  = ko.observable();

+            target.pukNumber            = ko.observable(data.puknumber);	

+            target.showEntrance         = ko.observable(false);

+            target.sharePathInvalid     = ko.observable(false);			

+            target.uiLoginTimer         = ko.observable(300);

+

+            // ע��˳�򣬵���ǰ�����޷�ˢ�³�����

+            target.accountLocked        = ko.computed(function () {

+                return target.loginCount() == config.MAX_LOGIN_COUNT && target.leftSeconds() != '-1';

+            });			

+

+            target.leftUnlockTime       = ko.computed(function () {

+                target.leftSeconds();

+                var formatted = transSecond2Time(target.uiLoginTimer());

+                return formatted.substring(formatted.indexOf(':') + 1, formatted.length);

+            });

+

+

+            if(config.SD_CARD_SUPPORT){

+                service.getSDConfiguration({}, function (data) {

+                    target.showEntrance(data.sd_status == "1" && data.share_status == "1" && data.sd_mode == "0");

+                    if(target.showEntrance()){

+                        service.checkFileExists({

+                            path: data.share_file

+                        }, function (data1) {

+                            if (data1.status == 'exist' || data1.status == 'processing') {

+                                target.sharePathInvalid(false);

+                            } else {

+                                target.sharePathInvalid(true);

+                            }

+                        });

+                    }

+                });

+            }

+

+            var state = computePageState(loginStatus, data);

+            target.pageState = ko.observable(state);

+            if (state == pageState.LOADING) {

+                addTimeout(refreshPage, 500);

+            }

+            setFocus();

+

+

+            // login �¼�����

+

+            target.login = function () {

+                if(config.LOGIN_SECURITY_SUPPORT && target.accountLocked()){

+                    showAlert("password_error_account_lock_time", function () {

+                        setFocus();

+                    });

+                    return false;

+                }

+                target.pageState(pageState.LOADING);

+                window.clearInterval(timer);

+                var ciphertext = "";

+                if (config.PASSWORD_ENCODE) {

+		    ciphertext = target.password();

+		} else {

+                    var kparam = service.getDeviceInfoLow();

+                    var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		    var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                    ciphertext = CryptoJS.AES.encrypt(target.password(), tkey, {

+                        iv: tiv,

+                        mode: CryptoJS.mode.CBC,

+                        padding: CryptoJS.pad.ZeroPadding

+                        }).toString();

+		}

+                service.login({

+                    password:ciphertext

+                }, function (info) {

+                    setTimeout(function () {

+                        timer = loginStatusCheckingTimer();

+                    }, 1300);

+                    if (info.result) {

+                        target.pageState(pageState.LOGGEDIN);

+                        if(config.LOGIN_SECURITY_SUPPORT){

+                            target.loginCount(0);

+                            target.uiLoginTimer(300);

+                            clearInterval(loginLockTimer);

+                        }

+                        $("#container").empty();

+                        window.location.hash = "#main";

+                        logout.init();

+                    } else {

+                        target.password("");

+                        if(config.LOGIN_SECURITY_SUPPORT){

+                            target.checkLoginData(function(){

+                                if (target.loginCount() == config.MAX_LOGIN_COUNT) {

+                                    showAlert("password_error_five_times", function () {

+                                        setFocus();

+                                    });

+                                    target.startLoginLockInterval();

+                                } else {

+                                    showAlert({msg: 'password_error_left', params: [config.MAX_LOGIN_COUNT - target.loginCount()]}, function () {

+                                        setFocus();

+                                    });

+                                }

+                            });

+                        }else {

+                            showAlert("password_error", function () {

+                                setFocus();

+                            });

+                        }

+                        target.pageState(pageState.LOGIN);

+                    }

+                });

+            };

+

+

+

+

+            // ��ȡ��¼������Ϣ          

+            target.checkLoginData = function(cb){

+                service.getLoginData({}, function(r){

+                    var failTimes = parseInt(r.psw_fail_num_str, 10);

+                    target.loginCount(config.MAX_LOGIN_COUNT - failTimes);

+                    target.leftSeconds(r.login_lock_time);

+                    target.uiLoginTimer(r.login_lock_time);

+                    if($.isFunction(cb)){

+                        cb();

+                    } else if (target.loginCount() == config.MAX_LOGIN_COUNT) {

+                        target.startLoginLockInterval();

+                    }

+                });

+            };

+

+            // ��������ʱ��ʱ����

+            target.startLoginLockInterval = function () {

+                loginLockTimer = setInterval(function () {

+                    service.getLoginData({}, function (data) {

+                        if (data.login_lock_time <= 0 || data.psw_fail_num_str == 5) {

+                            target.loginCount(0);

+                            clearInterval(loginLockTimer);

+                        }

+                        if(target.leftSeconds() != data.login_lock_time){

+                            target.leftSeconds(data.login_lock_time);

+                            target.uiLoginTimer(data.login_lock_time);

+                        } else {

+                            target.uiLoginTimer(target.uiLoginTimer() > 0 ? target.uiLoginTimer() - 1 : 0);

+                        }

+                    });

+                }, 1000);

+            };            

+

+            target.checkLoginData();

+

+

+

+            // ��֤����PIN�¼�����

+            target.enterPIN = function () {

+                target.pageState(pageState.LOADING);

+                var pin = target.PIN();

+                service.enterPIN({

+                    PinNumber:pin

+                }, function (data) {

+                    if (!data.result) {

+                        showAlert("pin_error", function () {

+                            refreshPage();

+                        });

+                        target.PIN('');

+                    } else {

+                        refreshPage();

+                    }

+                });

+            };

+

+            function setFocus(){

+                setTimeout(function () {

+                    var txtAdmin = $('#txtAdmin:visible');

+                    var txtPIN = $('#txtPIN:visible');

+                    var txtPUK = $('#txtPUK:visible');

+                    if (txtAdmin.length > 0) {

+                        txtAdmin.focus();

+                    } else if (txtPIN.length > 0) {

+                        txtPIN.focus();

+                    } else if (txtPUK.length > 0) {

+                        txtPUK.focus();

+                    }

+                }, 100);

+            }            

+

+

+            // ˢ��ҳ��״̬           

+            function refreshPage() {

+                var data = service.getLoginData();

+                var loginStatus = service.getLoginStatus();

+                var state = computePageState(loginStatus, data);

+                if (state == pageState.LOADING) {

+                    addTimeout(refreshPage, 500);

+                } else {

+                    target.pageState(state);

+                    target.pinNumber(data.pinnumber);

+                    target.pukNumber(data.puknumber);

+                }

+                setFocus();

+            }

+

+            // ����PUK������PIN�¼�����

+            target.enterPUK = function () {

+                target.pageState(pageState.LOADING);

+                var newPIN = target.newPIN();

+                var confirmPIN = target.confirmPIN();

+                var params = {};

+                params.PinNumber = newPIN;

+                params.PUKNumber = target.PUK();

+                service.enterPUK(params, function (data) {

+                    if (!data.result) {

+                        showAlert("puk_error", function () {

+                            refreshPage();

+                        });

+                        target.PUK('');

+                        target.newPIN('');

+                        target.confirmPIN('');

+                    } else {

+                        refreshPage();

+                    }

+                });

+            };            

+

+

+

+            // ���ݵ�¼״̬��SIM��״̬����ҳ��״̬

+            function checkPinAfterLogin(loginStatus, data) {

+                if (loginStatus.status == "loggedIn") {

+                    var currentState = data.modem_main_state; // cov_2

+                    if (currentState == "modem_waitpin") {

+                        return pageState.WAIT_PIN;

+                    } else if ((currentState == "modem_waitpuk" || data.pinnumber == 0) && (data.puknumber != 0)) {

+                        return pageState.WAIT_PUK;

+                    } else if ((data.puknumber == 0 || currentState == "modem_sim_destroy")

+                        && currentState != "modem_sim_undetected" && currentState != "modem_undetected") {

+                        return pageState.PUK_LOCKED;

+                    } else {

+                        return pageState.LOGGEDIN;

+                    }

+                } else {

+                    var currentState = data.modem_main_state;

+                    if ($.inArray(currentState, config.TEMPORARY_MODEM_MAIN_STATE) != -1) {

+                        return pageState.LOADING;

+                    } else {

+                        return pageState.LOGIN;

+                    }

+                }

+            }			

+

+            // ���ݵ�¼״̬��SIM��״̬����ҳ��״̬

+            function computePageState(loginStatus, data) {

+                //PX-880 �ȵ�¼�ٽ���PIN��֤������router����ԭ�򣬵�¼����PIN��֤���ڵ�¼ҳ�����У������ݿ�����֤����һ�¡�

+                if (config.LOGIN_THEN_CHECK_PIN) {

+                    return checkPinAfterLogin(loginStatus, data);

+                } else {

+                    return loginAfterCheckPin(loginStatus, data);

+                }

+            }

+

+            // ���ݵ�¼״̬��SIM��״̬����ҳ��״̬

+            function loginAfterCheckPin(loginStatus, data) {

+                if (loginStatus.status == "loggedIn") {

+                    return pageState.LOGGEDIN;

+                } else {

+                    var currentState = data.modem_main_state;

+						if ($.inArray(currentState, config.TEMPORARY_MODEM_MAIN_STATE) != -1) {

+							return pageState.LOADING;

+						} else if (currentState == "modem_waitpin") {

+							return pageState.WAIT_PIN;

+						} else if ((currentState == "modem_waitpuk" || parseInt(data.pinnumber) === 0) && (parseInt(data.puknumber) != 0)) {

+							return pageState.WAIT_PUK;

+						} else if ((parseInt(data.puknumber) === 0 || currentState == "modem_sim_destroy") && currentState != "modem_sim_undetected" && currentState != "modem_undetected") {

+							return pageState.PUK_LOCKED;

+						} else {

+							return pageState.LOGIN;

+					}                    

+                }

+            }

+        }

+

+

+        // ���鵱ǰwindow.location.hash���쳣����ת��index.html      

+        function gotoLogin() {

+            if (window.location.hash != config.defaultRoute && _.indexOf(config.GUEST_HASH, window.location.hash) == -1) {

+                if (!manualLogout && lastLoginStatus == "1") {

+                    manualLogout = false;

+                    lastLoginStatus = 'UNREAL';

+                    showAlert('need_login_again', function () {

+                        window.location = "index.html";

+                    });

+                } else if (lastLoginStatus == 'UNREAL') {

+                    //do nothing, only popup need_login_again alert one time

+                    return;

+                } else {

+                    window.location = "index.html";

+                }

+            }

+        }

+

+        // ��ʱ������¼״̬      

+        function loginStatusCheckingTimer() {

+            return setInterval(function () {

+                var info = service.getStatusInfo();

+                if (!info.isLoggedIn) {

+                    gotoLogin();

+                    return;

+                }

+                lastLoginStatus = service.getStatusInfo().isLoggedIn ? "1" : "0";

+            }, 1000);

+        }	

+

+        function init() {

+            var info = service.getStatusInfo();

+            if (info.isLoggedIn) {

+                window.location.hash = '#main';

+                return;

+            }

+

+            var container = $('#container')[0];

+            ko.cleanNode(container);

+            var fwVm = new loginViewModel();

+            ko.applyBindings(fwVm, container);

+

+            $('#frmLogin').validate({

+                submitHandler:function () {

+                    fwVm.login();

+                },

+                rules: {

+                    txtAdmin: 'login_password_length_check'

+                }

+            });

+            $('#frmPIN').validate({

+                submitHandler:function () {

+                    fwVm.enterPIN();

+                },

+                rules:{

+                    txtPIN:"pin_check"

+                }

+            });

+            $('#frmPUK').validate({

+                submitHandler:function () {

+                    fwVm.enterPUK();

+                },

+                rules:{

+                    txtNewPIN:"pin_check",

+                    txtConfirmPIN:{equalToPin:"#txtNewPIN"},

+                    txtPUK:"puk_check"

+                }

+            });

+        }

+

+

+        return {

+            init:init,

+            gotoLogin:gotoLogin

+        };

+    });

+

+

+// Logout �

+define("logout","set service knockout underscore jquery".split(" "),

+    function (config, service, ko, _, $) {

+

+    function logoutViewModel() {

+        var target = this;

+        // ��ȡ�Ƿ���¼

+        var loginFlag = function () {

+            var loginInfo = service.getLoginStatus();

+            return (loginInfo.status == "loggedIn");

+        }

+        ();

+        target.loggedIn = ko.observable(loginFlag);

+

+        // �˳�ϵͳ

+        target.logout = function () {

+            showConfirm("confirm_logout", function () {

+                manualLogout = true;

+                service.logout({}, setLocation());

+            });

+        };

+

+        // �Ƿ���ʾ�˳���ť

+        target.showLogout = function () {

+            if (config.HAS_LOGIN) {

+                return target.loggedIn();

+            } else {

+                return false;

+            }

+        };

+    }

+    function setLocation() {

+        window.location = 'index.html';

+    }

+    function initialize() {

+        var fwVm = new logoutViewModel();

+        bindContainer(fwVm);

+    }

+    function bindContainer(fwVm) {

+        var con = $('#logout')[0];

+        ko.cleanNode(con);

+        ko.applyBindings(fwVm, con);

+    }

+    return {

+        init: initialize

+    };

+});

+

+// operation mode �

+define("opmode","knockout service jquery set underscore".split(" "),

+

+    function (ko, service, $, config, _) {

+

+	function currentOperationModeViewMode(){

+		var target = this;

+		target.isLoggedIn = ko.observable(false);	

+		target.enableFlag = ko.observable(false);

+

+		target.showOpModeWindow = function () {

+			showSettingWindow("change_mode", "opmode_popup", "opmode_popup", 400, 300, function () {

+			});

+		};

+		target.currentOpMode = ko.observable("0");

+

+		service.getOpMode({}, function(info){

+			target.isLoggedIn(info.loginfo == "ok");

+			if (info.opms_wan_mode != "PPP" && info.rj45_state != "idle" && info.rj45_state != "dead") {

+				target.enableFlag(false);

+			} else if (info.opms_wan_mode == "PPP" && info.ppp_status != "ppp_disconnected") {

+				target.enableFlag(false);

+			} else if(info.opms_wan_mode == "DHCP"){

+				target.enableFlag(true);

+			} else {

+				target.enableFlag(true);

+			}

+

+			var opmsWanMode = (info.opms_wan_mode == "DHCP" || info.opms_wan_mode == "STATIC") ? "PPPOE" : info.opms_wan_mode;

+

+			var currentOperationMode = "";

+			switch(opmsWanMode){

+				case "BRIDGE":

+					currentOperationMode = "opmode_bridge";

+					break;

+				case "PPP":

+					currentOperationMode = "opmode_gateway";

+					break;					

+				case "PPPOE":

+					currentOperationMode = "opmode_cable";

+					break;

+				default:

+					break;

+			}

+			$("#opmode").attr("data-trans", currentOperationMode).text($.i18n.prop(currentOperationMode));

+		});

+        // ��ʱ��ѯ����ģʽ����״̬�����ý���״̬

+		setInterval(function(){

+			var object = service.getConnectionInfo();

+			if(object.opms_wan_mode == "DHCP") {

+				target.enableFlag(true);

+			} else if((object.opms_wan_mode == "PPP" && object.ppp_status != "ppp_disconnected") || (object.opms_wan_mode != "PPP" && object.rj45_state != "idle" && object.rj45_state != "dead")) {

+				target.enableFlag(false);

+			} else {

+				target.enableFlag(true);

+			}

+		}, 1000);

+	}

+

+	function init() {

+		var container = $('#currentOpMode')[0];

+        ko.cleanNode(container);

+        var fwVm = new currentOperationModeViewMode();

+        ko.applyBindings(fwVm, container);

+	}

+

+	return {

+		init:init

+	};

+});

+

+// operation mode popup�

+

+define("opmode_popup","knockout service jquery set underscore".split(" "),

+

+    function (ko, service, $, config, _) {

+

+    function operationModeViewMode() {

+		var target = this;

+		var currentSelectedOperationMode = "";

+		target.selectedMode = ko.observable("0");	

+

+	    // ��ʼ������ģʽ��ʾ	

+		service.getOpMode({}, function(info){

+			if(info.blc_wan_mode == "AUTO_PPP"){

+                currentSelectedOperationMode = "AUTO";

+            }else if(info.blc_wan_mode == "AUTO_PPPOE"){

+                currentSelectedOperationMode = "AUTO";

+            }else if(info.blc_wan_mode == "PPPOE"){

+                currentSelectedOperationMode = "PPPOE";

+            }else{

+                currentSelectedOperationMode = info.blc_wan_mode;

+            }

+			target.selectedMode(currentSelectedOperationMode);

+		});

+

+	    // ģʽ����/�л�	

+		target.changeOpMode = function(){

+			var userSelectedOperationMode = $('input:radio[name="opMode"]:checked').val();

+            var messageText = "";

+			if(userSelectedOperationMode == currentSelectedOperationMode) {

+				hidePopupSettingWindow();

+				return;

+			}

+            if(userSelectedOperationMode == "LTE_BRIDGE"){

+                messageText = "opmode_msg3";

+            }else{

+                messageText = "opmode_msg2";

+            }

+			showConfirm(messageText, function(){

+                showLoading();

+				service.SetOperationMode({

+					opMode: userSelectedOperationMode

+				},function(info){

+					if (info && info.result == "success") {

+						var currentOperationMode = "";

+						switch(userSelectedOperationMode){

+							case "AUTO":

+								currentOperationMode = "opmode_auto"

+								break;

+							case "PPP":

+								currentOperationMode = "opmode_gateway";

+								break;

+							case "PPPOE":

+								currentOperationMode = "opmode_cable";

+								break;								

+							default:

+								break;

+						}

+						$("#opmode").attr("data-trans", currentOperationMode).text($.i18n.prop(currentOperationMode));

+						successOverlay();						

+					} else {

+						errorOverlay();

+					}

+				});

+			});

+

+		}

+

+	}

+

+	function init() {

+		var fwVm = new operationModeViewMode();

+		ko.applyBindings(fwVm, $('#popupSettingWindow')[0]);

+

+		$("#opmode_form").validate({

+			submitHandler: function(){

+				fwVm.changeOpMode();

+			}

+		});

+	}

+

+	return {

+		init:init

+	};

+});

+

+define("router","underscore jquery menu set service".split(" "),

+    function (_, $, menu, config, service) {

+    var currentHash = '';

+    var container = $('#container');

+

+    //�뿪����ʱ�����Ƿ��������޸ģ�����������ʾ

+    checkFormContentModify = function (href) {

+        if (config.CONTENT_MODIFIED.modified && window.location.hash != href) {

+            if (config.CONTENT_MODIFIED.message == 'sms_to_save_draft') {

+                config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                config.resetContentModifyValue();

+                window.location.hash = href;

+            } else {

+                showConfirm(config.CONTENT_MODIFIED.message, {

+                    ok: function () {

+                        config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                        config.resetContentModifyValue();

+                        window.location.hash = href;

+                    },

+                    no: function () {

+                        var result = config.CONTENT_MODIFIED.callback.no(config.CONTENT_MODIFIED.data);

+                        if (!result) {

+                            window.location.hash = href;

+                            config.resetContentModifyValue();

+                        }

+                    }

+                });

+            }

+            return false;

+        } else {

+            return true;

+        }

+    };

+

+    //��ʱ�鿴SIM����״̬������ǰSIM��״̬��Ϊ����״̬��δ��ʾnosimcardҳ�棬����ʾnosimcardҳ��,�Ա��ⲻ�ر�webui�����²����豸�󣬲����ж�SIM��״̬������

+    function checkSimCardStatus() {

+        setInterval(function () {

+            var data = service.getStatusInfo();

+            var match = menu.findMenu();

+            if (match.length == 0) {

+                return false;

+            }

+            var requirePinHash = ["phonebook", "sms_list"];

+            var isRequirePin = ($.inArray(match[0].path, requirePinHash) != -1);

+            if (match[0].checkSIMStatus === true) {

+                var simstatus = data.simStatus == "modem_sim_undetected"

+                     || data.simStatus == "modem_sim_destroy" || data.simStatus == "modem_waitpin"

+                     || data.simStatus == "modem_waitpuk";

+                var netlockstatus = data.simStatus == "modem_imsi_waitnck";

+                if (data.isLoggedIn && (

+                        ($('#div-nosimcard')[0] == undefined && simstatus)

+                         || ($('#div-network-lock')[0] == undefined && netlockstatus)

+                         || (($('#div-nosimcard')[0] != undefined || $('#div-network-lock')[0] != undefined) && data.simStatus == "modem_init_complete"))) {

+                    fixedLoadResources(match[0], data.simStatus, isRequirePin);

+                }

+            }

+        }, 1000);

+    }

+

+    //������¼ҳ�汳��

+    function checkLoginPageBg() {

+        var h = window.location.hash;

+        if (h == '#entry' || _.indexOf(config.GUEST_HASH, h) != -1) {

+            $("#manageContainer").attr("style", "margin-top:-36px;");

+        } else {

+            $("#manageContainer").attr("style", "margin-top:0px;");

+        }

+

+        if (window.location.hash == '#entry') {

+            $("#mainContainer").addClass('loginBackgroundBlue');

+        } else {

+            var mainContainer = $("#mainContainer");

+            if (mainContainer.hasClass('loginBackgroundBlue')) {

+                $("#container").css({

+                    margin: 0

+                });

+                mainContainer.removeClass('loginBackgroundBlue').height('auto');

+            }

+        }

+    }

+

+    function fixedLoadResources(menuItem, simStatus, isRequirePin) {

+        var item = {};

+        $.extend(item, menuItem);

+        //û��SIM��ʱ������homeҳ�治��������

+        //���类��ʱ��homeҳ����ʾ����ҳ��

+        if (simStatus == "modem_sim_undetected" || simStatus == "modem_sim_destroy") {

+            if (!isRequirePin) {

+                item.path = "sim_abnormal";

+            }

+        } else if (simStatus == "modem_waitpin" || simStatus == "modem_waitpuk") {

+            item.path = "sim_abnormal";

+        } else if (simStatus == "modem_imsi_waitnck") {

+            item.path = "locknet";

+        }

+        //load tmpl and controller js

+        loadResources(item);

+    }

+

+    //���ݲ˵�����item���ض�Ӧ����Դ

+    function loadResources(item) {

+        var pId = item.path.replace(/\//g, '_');

+        var $body = $('body').removeClass();

+        if (pId != 'entry' && pId != 'main') {

+            $body.addClass('beautiful_bg page_' + pId);

+        } else {

+            $body.addClass('page_' + pId);

+        }

+        clearTimer();

+        hideLoading();

+        var tmplPath = 'text!tmpl/' + item.path + '.html';

+        //TODO: prevent first menu click cover the second menu content, need test with device

+        require([tmplPath, item.path], function (tmpl, viewModel) {

+            container.stop(true, true);

+            container.hide();

+            container.html(tmpl);

+            viewModel.init();

+            //support backward/forward

+            menu.refreshMenu();

+            $('#container').translate();

+            menu.activeSubMenu();

+

+            $("form").attr("autocomplete", "off");

+            container.fadeIn();

+        });

+    }

+    //�ȶ�hash״̬, �����仯�������µ�hashƥ���˵�����,ƥ�䲻��ʱ��ת��homeҳ��, ƥ����ʱ��¼hashֵ����̬���ض�Ӧ����Դ�ļ�

+    function hashCheck() {

+        if (window.location.hash != currentHash) {

+            //������½����������, ��½�û����ʷǵ�¼�û�ʱҳ�治��ת

+            var info = service.getStatusInfo();

+            if (window.location.hash == config.defaultRoute || _.indexOf(config.GUEST_HASH, window.location.hash) != -1) {

+                if (info.isLoggedIn) {

+                    window.location.hash = currentHash == "" ? "#main" : currentHash;

+                    return;

+                }

+            }

+

+            var match = menu.findMenu();

+

+            if (match.length == 0) {

+                window.location.hash = config.defaultRoute;

+            } else {

+                //��¼ʱ���鹤��ģʽ������ģʽ������������Ҫ����SIM��״̬�����¼���,����ģʽ�������治��Ҫ����SIM��״̬�����¼���

+                if (config.RJ45_SUPPORT && window.location.hash == "#main") {

+                    if ((match[0].checkSIMStatus && checkCableMode(info.blc_wan_mode)) || (!match[0].checkSIMStatus && !checkCableMode(info.blc_wan_mode))) {

+                        window.location.reload();

+                        return;

+                    }

+                }

+                //TODO: �����˵�����Ӧ�����˵���һ����л�ʱ�����¼�������, ��TODO: click the same menu ʵ�ַ�ʽ����

+                var oldMenu = menu.findMenu(currentHash);

+                currentHash = match[0].hash;

+                if (currentHash == "#entry") {

+                    $('#indexContainer').addClass('login-page-bg');

+                    menu.rebuild();

+                } else {

+                    $('#indexContainer').removeClass('login-page-bg');

+                }

+

+                if (oldMenu.length != 0 && match[0].path == oldMenu[0].path && match[0].level != oldMenu[0].level && match[0].level != '1' && oldMenu[0].level != '1') {

+                    return;

+                }

+

+                checkLoginPageBg();

+                var requirePinHash = ["phonebook", "sms_list"];

+                var isRequirePin = ($.inArray(match[0].path, requirePinHash) != -1);

+                if (match[0].checkSIMStatus === true || isRequirePin) {

+                    //simStatus is undefined when refreshing page

+                    if (info.simStatus == undefined) {

+                        showLoading('waiting');

+                        function checkSIM() {

+                            var data = service.getStatusInfo();

+                            if (data.simStatus == undefined || $.inArray(data.simStatus, config.TEMPORARY_MODEM_MAIN_STATE) != -1) {

+                                addTimeout(checkSIM, 500);

+                            } else {

+                                fixedLoadResources(match[0], data.simStatus, isRequirePin);

+                                hideLoading();

+                            }

+                        }

+                        checkSIM();

+                    } else {

+                        fixedLoadResources(match[0], info.simStatus, isRequirePin);

+                    }

+                } else {

+                    loadResources(match[0]);

+                }

+            }

+        }

+    }

+

+    //Ĭ������ҳ��Ϊ#main, ��ʱ����hash״̬

+    function init() {

+        checkSimCardStatus();

+        window.location.hash = window.location.hash || "#main";

+        //if support onhashchange then use. If ie8 in ie7 mode, it doesn't trigger onhashchange.

+        if (('onhashchange' in window) && ((typeof document.documentMode === 'undefined') || document.documentMode == 8)) {

+            window.onhashchange = hashCheck;

+            hashCheck();

+        } else {

+            setInterval(hashCheck, 200);

+        }

+

+        //�����޸���ҳ������, �뿪ʱ������ʾ

+        $("a[href^='#']").die('click').live('click', function () {

+            var $this = $(this);

+            config.CONTENT_MODIFIED.checkChangMethod();

+            return checkFormContentModify($this.attr('href'));

+        });

+    }

+

+    return {

+        init: init

+    };

+});

+

+// statusBar �

+

+define("statusBar", "knockout jquery underscore service set menu tooltip".split(" "), 

+

+    function (ko, $, _, service, config, menu, tooltip) {

+

+	var sv__hasCheckedSMSCapacity   = false;	

+    var sv__initSMSCompleted        = false;		

+    var sv_newSMSMessageInDealing   = false;		

+    var sv_fotaUpdateCancel         = null;

+	var sv_batteryCheckTimer        = 0;	

+    var sv_dbMessageIds             = [];	

+    var sv_fotaResultAlertPopuped   = false;

+    var sv_isFirstLoadNewMessage    = true;	

+    var isLoggedIn                  = true;		

+    var sv_messagePopStack          = {};

+    var sv_newMessagePopTemplate    = null;	

+    var sv_resetTrafficAlertPopuped = false;

+    var sv_simMessageListTemplate   = null;

+    var sv_smsListTemplate          = null;		

+    var sv_trafficAlertPopuped_100  = false;		

+    var sv_trafficAlertPopuped      = false;

+    var sv_timer                    = 0;

+

+    // ��ȡ״̬��Ϣ�������硢SIM��WIFI��

+    var getCurrentStatusInfo = function () {

+        return service.getStatusInfo();

+    };

+

+    function statusViewModel() {

+        var target         = this;

+        var info           = getCurrentStatusInfo();

+		var roamStatus   = info.roamingStatus ? true : false;

+		var $langLogoBar = $("#langLogoBar");

+

+

+        // �������������¼�����

+		function sf_connect() {

+            showLoading("connecting");

+            service.connect({}, function (data) {

+                if (data.result) {

+                    refreshWifiConnectStatus(target, data.status);

+                }

+                successOverlay();

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+        // �Ͽ������¼�����

+		function sf_disconnect() {

+            showLoading("disconnecting");

+            service.disconnect({}, function (data) {

+                if (data.result) {

+                    refreshWifiConnectStatus(target, data.status);

+                }

+                successOverlay();

+            }, function (data) {

+                errorOverlay();

+            });

+        }			

+

+        if(info.isLoggedIn){

+        	if(!$langLogoBar.hasClass("langborderBg")){

+                $langLogoBar.addClass("langborderBg");

+        	}

+        	$("#statusBar:hidden").show();

+        } else {

+        	if($langLogoBar.hasClass("langborderBg")){

+                $langLogoBar.removeClass("langborderBg");

+        	}

+        	$("#statusBar:visible").hide();

+        }	

+

+

+        //target.attachedDevices        = ko.observable(info.attachedDevices);

+        target.batteryLevel             = ko.observable(info.batteryLevel + '%');

+        target.batteryPers              = ko.observable(sf_getBatteryLevelImage(info.batteryPers, info.batteryStatus));		

+        target.batteryStatus            = ko.observable(info.batteryStatus);	

+        target.connectionCssClass       = ko.observable("");		

+        target.connectStatus            = ko.observable(info.connectStatus);

+        target.connectStatusText        = ko.observable();

+        target.connectStatusTrans       = ko.observable();

+        target.hasWifi                  = ko.observable(config.HAS_WIFI);

+        target.hasBattery               = ko.observable(config.HAS_BATTERY);		

+        target.isLoggedIn               = ko.observable(info.isLoggedIn);

+        target.isShowConnectionIcon     = ko.observable(false);

+		target.isShowFotaNewversionIcon = ko.observable(info.new_version_state && info.fota_package_already_download != "yes" && !config.isShowFotaIcon);		

+        target.isShowRj45ConnectionIcon = ko.observable(false);

+        target.networkOperator          = ko.observable(sf_getNetWorkProvider(info.spn_b1_flag,info.spn_name_data,info.spn_b2_flag,info.networkOperator,roamStatus));		

+        target.networkType              = ko.observable(getNetworkType(info.networkType));

+        target.pinStatus                = ko.observable(info.pinStatus);

+        target.pinStatusText            = ko.observable();	

+        target.rj45ConnectionCssClass   = ko.observable("");		

+        target.roamingStatus            = ko.observable(info.roamingStatus ? "R" : "");

+        target.showAttachedDevices      = ko.observable(info.wifiStatus);		

+        target.showSmsDeleteConfirm     = ko.observable(false);

+        target.smsUnreadCount           = ko.observable(0);

+        target.simStatus                = ko.observable(sf_convertSimStatusToImage(info.simStatus));

+        target.signalCssClass           = ko.observable(sf_getSignalCssClass(info.signalImg, info.networkType, info.simStatus));		

+        target.updateType               = ko.observable(service.getUpdateType().update_type);

+        target.wifiStatusCssClass       = ko.observable(sf_getWifiStatusCssClass(info.wifiStatus, info.wirelessDeviceNum));

+        target.wifiStatusImg            = ko.observable(sf_getWifiStatusImage(info.wifiStatus, info.wirelessDeviceNum));

+

+        sf_getConnectionCssClass(target, info.connectStatus, info.data_counter, info.connectWifiSSID, info.connectWifiStatus, info.rj45ConnectStatus);	

+

+        target.connect    = sf_connect;

+        target.disconnect = sf_disconnect;

+    }

+

+	function sf_gotoSmsList(){

+        var s_href = '#msg_main';

+        if(window.location.hash == '#msg_main'){

+            s_href = '#msg_list';

+        }

+		config.CONTENT_MODIFIED.checkChangMethod();

+        if(checkFormContentModify(s_href)){

+            window.location.hash = s_href;

+        }

+    }

+

+    gotoSmsList = sf_gotoSmsList;	

+

+    function sf_getNetWorkProvider(i_spnB1Flag, i_spnNameData, i_spnB2Flag, i_networkProvider, i_roamStatus) {

+        if (i_spnNameData == "") {

+            return i_networkProvider;

+        } else {

+            i_spnNameData = decodeMessage(i_spnNameData);

+            if (i_spnB1Flag == "0" && i_spnB2Flag == "0") {

+                if (i_roamStatus) {//����

+                    return i_spnNameData == i_networkProvider ? i_networkProvider : (i_spnNameData + '  ' + i_networkProvider);

+                } else {//������

+                    return i_spnNameData;

+                }

+            }else if (i_spnB1Flag == "1" && i_spnB2Flag == "1") {

+                if (i_roamStatus) {//����

+                    return i_networkProvider;

+                } else {//������

+                    return i_spnNameData == i_networkProvider ? i_networkProvider : (i_spnNameData + '  ' + i_networkProvider);

+                }

+            } else if (i_spnB1Flag == "1") {

+                return i_spnNameData == i_networkProvider ? i_networkProvider : (i_spnNameData + '  ' + i_networkProvider);

+            } else if (i_spnB2Flag == "1") {

+                if (i_roamStatus) {//����

+                    return i_networkProvider;

+                } else {//������

+                    return i_spnNameData;

+                }

+            } 

+            return "";

+        }

+    }

+

+    // �����¶���Ϣ��ʾ����������������

+    function sf_addNewMessage(i_message, i_isUpdate, i_type){

+    	config.smsMaxId = i_message.id;

+    	var now = $.now();

+    	sv_messagePopStack["m" + now] = now;

+    	var name = i_message.number;

+    	if(sv_isFirstLoadNewMessage && config.phonebook && config.phonebook.length == 0){

+    		sv_isFirstLoadNewMessage = false;

+    		if(config.HAS_PHONEBOOK){

+				sf_getPhoneBooks();

+			}else{

+				config.phonebook = [];

+			}

+    	}

+    	for(i in config.phonebook){

+    		if(getLastNumber(config.phonebook[i].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+    			name = config.phonebook[i].pbm_name;

+    			break;

+    		}

+    	}

+		var s_newMsg = {

+			mark : "m" + now,

+			name: name,

+			title: $.i18n.prop("sms"),

+			titleTrans: "sms",

+			tag: i_message.tag,

+			content : i_message.content,

+			datetime : i_message.time

+		};

+		if(sv_newMessagePopTemplate == null){

+			sv_newMessagePopTemplate = $.template("newMessagePopTmpl", $("#newMessagePopTmpl"));

+		}

+        $(".bubbleItem:not(.report)", "#buttom-bubble").remove();

+        $.tmpl("newMessagePopTmpl", s_newMsg).appendTo("#buttom-bubble");

+		if((window.location.hash == "#msg_main" || window.location.hash == "#msg_list") && i_type == "1"){

+            //sf_dealChosenNumber(s_newMsg.name, i_message.number);

+			var s_inChating = config.currentChatObject && config.currentChatObject == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH);

+			var s_itemId = getLastNumber(i_message.number, config.SMS_MATCH_LENGTH);

+			var item = $("#smslist-item-" + s_itemId);

+			if(item && item.length > 0){

+                // �Ѵ������ݣ��������ݵ���˳��

+				for(var i = 0; config.listMsgs && i < config.listMsgs.length; i++){

+					if(getLastNumber(config.listMsgs[i].number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+						config.listMsgs[i].id = i_message.id;

+						config.listMsgs[i].latestId = i_message.id;

+						config.listMsgs[i].latestSms = i_message.content;

+						config.listMsgs[i].latestTime = i_message.time;

+						if(!i_isUpdate){

+							config.listMsgs[i].newCount++;

+							config.listMsgs[i].totalCount++;

+						}

+						break;

+					}

+				}

+				item.find(".smslist-item-checkbox p.checkbox").attr("id", i_message.id);

+				item.find(".smslist-item-checkbox input:checkbox").val(i_message.id).attr("id", "checkbox" + i_message.id);

+				if(!i_isUpdate){

+					var s_itemCount = item.find(".smslist-item-total-count").text();

+					s_itemCount = Number(s_itemCount.substring(1, s_itemCount.length - 1));

+					item.find(".smslist-item-total-count").text("(" + (s_itemCount + 1) + ")");

+					if(!config.currentChatObject || config.currentChatObject != getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+						var s_newNum = item.find(".smslist-item-new-count").removeClass("hide");

+						if(s_newNum && s_newNum.text().length > 0){

+							s_newNum.text(Number(s_newNum.text()) + 1);

+						}else{

+							s_newNum.text(1);

+						}

+					}

+				}

+				if(item.find(".smslist-item-draft-flag").length > 0){

+					if (config.currentChatObject && config.currentChatObject == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)) {

+					    item.find(" td:nth-child(2)").removeClass("font-weight-bold");

+				    } else {

+					    item.find(" td:nth-child(2)").addClass("font-weight-bold");

+				    }

+				}else{

+					var msgContent = item.find(".smslist-item-msg").text(i_message.content);

+				    msgContent.closest('td').prop('title', i_message.content);

+				    item.find("span.clock-time").text(i_message.time);

+					if (config.currentChatObject && config.currentChatObject == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)) {

+					    msgContent.closest('tr').removeClass("font-weight-bold");

+				    } else {

+					    msgContent.closest('tr').addClass("font-weight-bold");

+				    }

+				}

+				item.find(".smslist-item-repeat span").die().click(function() {

+					forwardClickHandler(i_message.id);

+				});

+

+				var s_tmpItem = item;

+				item.hide().remove();

+				$("#smslist-table").prepend(s_tmpItem.show());

+			} else {

+                // ���������б��в�������Ӧ����ϵ�˶�Ϣ��Ӧ�ڶ����б�����������

+				var s_theName = "";

+				if(config.phonebook && config.phonebook.length > 0) {

+					for(i in config.phonebook){

+						if(getLastNumber(config.phonebook[i].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+							s_theName = config.phonebook[i].pbm_name;

+							break;

+						}

+					}

+				}

+				var s_theNewMessage = {

+					id : i_message.id,

+					name : s_theName,

+					number : i_message.number,

+					latestId :i_message.id,

+					totalCount : 1,

+					newCount : s_inChating ? 0 : 1,

+					latestSms : i_message.content,

+					latestTime : i_message.time,

+					checked : false,

+					hasDraft : false,

+					itemId : getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)

+				};

+				if(sv_smsListTemplate == null){

+					sv_smsListTemplate = $.template("smsTableTmpl", $("#smsTableTmpl"));

+				}

+				$.tmpl("smsTableTmpl", {data: [s_theNewMessage]}).prependTo("#smslist-table");

+            }

+            if(config.HAS_PHONEBOOK){

+                $(".sms-add-contact-icon").removeClass("hide");

+            }else{

+                $(".sms-add-contact-icon").addClass("hide");

+            }

+			if(s_inChating){

+				var talkItem = $("#talk-item-" + i_message.id, "#chatlist");

+				if (talkItem && talkItem.length > 0) {// ���¼�����������

+					$(".J_content pre", talkItem).html(dealContent(i_message.content));

+					$(".time .smslist-item-time", talkItem).text(i_message.time);

+					$(".smslist-item-repeat", talkItem).die().click(

+							function() {

+								forwardClickHandler(i_message.id);

+							});

+					$(".smslist-item-delete", talkItem).die().click(

+							function() {

+								deleteSingleItemClickHandler(i_message.id);

+							});

+				} else {// �����µĻظ�����

+					$("#smsOtherTmpl").tmpl(i_message).appendTo("#chatlist");

+					$(".clear-container", "#chatpanel").animate({

+						scrollTop : $("#chatlist").height()

+					});

+				}

+                if (!config.SMS_SET_READ_WHEN_COMPLETE) {

+                    service.setSmsRead({ids: [i_message.id]}, $.noop);

+                } else if (config.SMS_SET_READ_WHEN_COMPLETE && i_message.receivedAll) {

+                    service.setSmsRead({ids: [i_message.id]}, $.noop);

+                }

+			}

+            enableCheckbox($("#smslist-checkAll"));

+		}

+		if(window.location.hash == "#msg_sim" && i_type == "0"){

+			// ���������б��в�������Ӧ����ϵ�˶�Ϣ��Ӧ�ڶ����б�����������

+				var s_theName = "";

+				if(config.phonebook && config.phonebook.length > 0) {

+					for(i in config.phonebook){

+						if(getLastNumber(config.phonebook[i].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+							s_theName = config.phonebook[i].pbm_name;

+							break;

+						}

+					}

+				}

+				var s_theNewMessage = {

+					id : i_message.id,

+					name : s_theName,

+					number : i_message.number,

+					content : i_message.content,

+					time : i_message.time,

+					tag: i_message.tag,

+					checked : false,

+					itemId : getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)

+				};

+				if(i_isUpdate){

+					var s_item = $(".simMsgList-item-class-" + s_theNewMessage.id);

+				    s_item.hide().remove();				

+				}

+				if(sv_simMessageListTemplate == null){

+					sv_simMessageListTemplate = $.template("ssimMessageListTemplate", $("#simMessageListTemplate"));

+				}

+				$.tmpl("simMessageListTemplate", {data: [s_theNewMessage]}).prependTo("#simMsgList_container");

+		}

+	}

+

+ 	function sf_checkBatteryStatusForFota(){

+	  var s_state = service.getCurrentUpgradeState();

+	  if(s_state.current_upgrade_state == 'low_battery'){

+			showInfo('ota_low_battery');

+			clearInterval(sv_batteryCheckTimer);

+		}

+	} 

+

+    // ��SIM��״̬ת��Ϊ��Ӧ����������

+    function sf_convertSimStatusToImage(i_status) {

+        var s_image;

+        switch (i_status) {

+            case "modem_destroy":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_destroy");

+                break;

+            case "modem_imsi_waitnck":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_waitnck");

+                break;				

+            case "modem_init_complete":

+                s_image = "./pic/simcard_detected.png";//$.i18n.prop("sim_status_ready");

+                break;	

+            case "modem_sim_destroy":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_destroy");

+                break;				

+            case "modem_sim_undetected":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_undetected");

+                break;

+            case "modem_undetected":

+                s_image = "./pic/simcard_undetected.png";

+                break;				

+            case "modem_waitpin":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_waitpin");

+                break;

+            case "modem_waitpuk":

+                s_image = "./pic/simcard_undetected.png";//$.i18n.prop("sim_status_waitpuk");

+                break;

+

+            default:

+                s_image = "./pic/simcard_detected.png";//$.i18n.prop("sim_status_ready");

+                break;

+        }

+        return s_image;

+    }

+

+    function sf_dealChosenNumber(i_choosenName, i_choosenNum) {

+        setTimeout(function () {

+            var s_choosen  = $("#chosenUserSelect");

+            var s_options = $("option", s_choosen);

+            for (var index  = 0; index < s_options.length; index++) {

+                if (getLastNumber(i_choosenNum, config.SMS_MATCH_LENGTH) == s_options[index].value) {

+

+                    s_options[index].text  = i_choosenName + '/' + i_choosenNum;

+					s_options[index].value = i_choosenNum;

+

+                    break;

+                }

+            }

+            s_choosen.trigger("liszt:updated");

+        }, 0);

+    } 

+

+	// ˫�첽��ȡ�豸����sim�����ö���Ϣ���������ϲ�

+	function sf_dealPhoneBooksResult(i_books){

+		if($.isArray(i_books.pbm_data) && i_books.pbm_data.length > 0){

+			config.phonebook = i_books.pbm_data;

+		}

+	}	

+

+    // �������µ�5������Ϣ����δ���ӵ������б��еĵ�����ʾ

+    function sf_filterNewMessage(i_messages, i_type){

+    	if(!config.dbMsgs){

+    		config.dbMsgs = [];

+    	}

+    	if(sv_dbMessageIds.length == 0){

+    		$.each(config.dbMsgs, function(index_1, i_element){

+    			sv_dbMessageIds.push(i_element.id);

+    		});

+    	}

+    	$.each(i_messages, function(index_2, i_element){

+    		if($.inArray(i_element.id, sv_dbMessageIds) == -1){//�����¶���

+    			sv_dbMessageIds.push(i_element.id);

+    			config.dbMsgs.push(i_element);

+    			if(i_element.tag == '1'){

+    				sf_addNewMessage(i_element, false, i_type);

+    			}

+    		}else{

+    			for(var index = 0; index < config.dbMsgs.length; index++){//���¼�������

+    				if(config.dbMsgs[index].id == i_element.id && config.dbMsgs[index].content != i_element.content && i_element.tag == '1'){

+    					config.dbMsgs[index].content = i_element.content;

+    					sf_addNewMessage(i_element, true, i_type);

+    					break;

+    				}

+    			}

+    		}

+    	});

+    }

+

+    // ������ת��Ϊ��ӦͼƬ

+    function sf_getBatteryLevelImage(pers, i_status) {

+    	var s_Image = null;

+		if ("0" == i_status) {

+			if ("1" == pers) {

+				s_Image = "pic/power_one.png";

+			} else if ("2" == pers) {

+				s_Image = "pic/power_two.png";

+			} else if ("3" == pers) {

+				s_Image = "pic/power_three.png";

+			} else if ("4" == pers) {

+				s_Image = "pic/power_full.png";

+			} else { //"5" == pers || "0" == pers

+				s_Image = "pic/power_out.png";

+			}

+		} else {

+			s_Image = "pic/power_charging.gif";

+		}

+		return s_Image;

+    }

+

+    // ��ȡ����״̬��CSS��ʽ

+    function sf_getConnectionCssClass(i_fwVm, i_status, i_data_counter, i_wifiSSID, i_wifiStatus, i_rj45Status) {

+

+        var s_rj45ConnectionStatus = "icon_connection ";

+        var s_connectionStatus     = "icon_connection ";

+

+        if(i_rj45Status == "connect"){

+            s_rj45ConnectionStatus += "connecting";

+        }else if(i_rj45Status == "working"){

+            s_rj45ConnectionStatus += "rj45_connected";

+        }else{

+            s_rj45ConnectionStatus += "disconnect";			

+        }

+

+        if (i_status == "ppp_connecting" || i_status == "wifi_connecting") {

+            s_connectionStatus += "connecting";

+        } else if(i_status == "ppp_connected") {//CPE ppp_statusΪnone ready��ֵ

+            if (i_data_counter.uploadRate != '0' && i_data_counter.downloadRate != '0') {

+                s_connectionStatus += "connectionBoth";

+            } else if (i_data_counter.uploadRate != '0' && i_data_counter.downloadRate == '0') {

+                s_connectionStatus += "connectionUp";

+            } else if (i_data_counter.uploadRate == '0' && i_data_counter.downloadRate != '0') {

+                s_connectionStatus += "connectionDown";

+            } else {

+                s_connectionStatus += "connectionNone";

+            }

+        } else if (i_status == "ppp_disconnected") {

+            if (i_wifiSSID && i_wifiStatus == "connect") {

+                service.getHotspotList({}, function (data) {

+                    var s_cssName = "icon_connection ";

+                    var s_css = "connecting ";

+                    for (var i = 0, len = data.hotspotList.length; i < len; i++) {

+                        if (data.hotspotList[i].connectStatus == "1") {

+                            s_css = "wifi_connected";

+                            break;

+                        }

+                    }

+                    s_cssName += s_css;

+                    i_fwVm.connectionCssClass(s_cssName);

+                });

+                i_fwVm.rj45ConnectionCssClass(s_rj45ConnectionStatus);

+                return;

+            } else if (i_wifiSSID && (i_wifiStatus == "connecting" || i_wifiStatus =="dhcping")) {

+                s_connectionStatus += "connecting";

+            } else {

+                s_connectionStatus += "disconnect";

+            }

+        }  else {

+            s_connectionStatus += "disconnect";

+        }

+

+        i_fwVm.connectionCssClass(s_connectionStatus);

+        i_fwVm.rj45ConnectionCssClass(s_rj45ConnectionStatus);

+    }

+

+	// ��ȡ�绰����Ϣ

+	function sf_getPhoneBooks() {

+		var s_books = service.getPhoneBooks({

+            page : 0,

+            data_per_page : 2000,

+            orderBy : "id",

+            isAsc : false

+		});

+		sf_dealPhoneBooksResult(s_books);

+	}

+

+	// ��ȡ�ź�����CSS��ʽ

+    function sf_getSignalCssClass(siganl, networkType, simStatus) {

+    	networkType = networkType.toLowerCase();

+    	simStatus = simStatus ? simStatus.toLowerCase() : '';

+    	if(networkType == '' || networkType == 'limited_service' || networkType == 'no_service' || networkType == 'limited service' || networkType == 'no service'

+            || simStatus != 'modem_init_complete'){

+    		siganl = '_none';

+    	}

+        return "signal signal" + siganl;

+    }

+

+    function sf_getWifiStatusCssClass(i_status, i_deviceSize) {

+        if (i_status) {

+            if (i_deviceSize == 0) {

+                return "wifi_status0";

+            } else {

+                return "wifi_status" + i_deviceSize;

+            }

+        } else {

+            return "wifi_status_off";

+        }

+    }

+

+    // ����wifi״̬��ȡwifi��ͼƬ��Դ

+    function sf_getWifiStatusImage(i_status, i_deviceSize) {

+		if (i_status) {

+			if (i_deviceSize == 0) {

+				return "./pic/wlan0.png";

+			} else {

+				return "./pic/wlan" + i_deviceSize + ".png";

+			}

+		} else {

+			return "./pic/wlan_off.png";

+		}

+	}	

+

+    // ��ȡ��������������С���������ؽ���

+    function sf_refreshFotaDownloadProgress(){

+        service.getPackSizeInfo({}, function (data) {

+            var percents;

+            if (parseInt(data.fota_pkg_total_size) == 0) {

+                percents = 0;

+            } else {

+                percents = parseInt(parseInt(data.fota_dl_pkg_size) * 100 / parseInt(data.fota_pkg_total_size));

+            }

+            if (percents > 100) {

+                percents = 100;

+            }

+            if (percents >= 0) {

+                if (percents > 95) {

+                    showProgressBar("ota_update", "<br/>" + $.i18n.prop("ota_update_warning"));

+                }

+                setProgressBar(percents);

+            }

+        });

+    }		

+

+    // �������ŷ��ͱ���

+    function sf_responseSmsReport(){

+    	if(sv_isFirstLoadNewMessage && config.phonebook && config.phonebook.length == 0){

+

+    		sv_isFirstLoadNewMessage = false;

+

+    		if(config.HAS_PHONEBOOK){

+				sf_getPhoneBooks();

+			}else{

+				config.phonebook = [];

+			}

+    	}

+    	service.getSMSDeliveryReport({

+    		page: 0,

+    		smsCount: 10

+    	}, function(data){

+    		var s_messages = data.messages;

+    		var s_nums = [];

+    		$.each(s_messages, function(i, i_message){

+    			if($.inArray(i_message.number, s_nums) == -1){

+    				s_nums.push(i_message.number);

+                    window.setTimeout(function(){

+    					var s_now = $.now();

+    					sv_messagePopStack["m" + s_now] = s_now;

+    					i_message.name = i_message.number;

+    					for(i in config.phonebook){

+    						if(getLastNumber(config.phonebook[i].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(i_message.number, config.SMS_MATCH_LENGTH)){

+    							i_message.name = config.phonebook[i].pbm_name;

+    							break;

+    						}

+    					}

+    					var s_msgContent = $.i18n.prop("sms_delivery_report_" + i_message.content);

+

+    					var s_newMsg = {

+    							mark : "m" + s_now,

+    							name: i_message.name,

+    							title: $.i18n.prop("sms_report"),

+    							titleTrans: "sms_report",

+    							content : s_msgContent,

+    							datetime : i_message.time,

+    							report : 'report'

+    					};

+

+    					if(sv_newMessagePopTemplate == null){

+    						sv_newMessagePopTemplate = $.template("newMessagePopTmpl", $("#newMessagePopTmpl"));

+    					}

+

+                        $(".report", "#buttom-bubble").remove();

+    					$.tmpl("newMessagePopTmpl", s_newMsg).appendTo("#buttom-bubble");

+    				}, 100);

+    			}

+    		});

+    	}, function(){

+    		//No Deal

+    	});

+    }

+

+    function sf_simStatusInvalid(simStatus){

+        return simStatus == 'modem_sim_undetected' || simStatus == 'modem_undetected' || simStatus == 'modem_sim_destroy'

+            || simStatus == 'modem_waitpin' || simStatus == 'modem_waitpuk' || simStatus == 'modem_imsi_waitnck';

+    }	

+

+    // ��ʾFOTA������ǰ״̬

+    function sf_showFotaCurrentStatus() {

+        sv_fotaUpdateCancel = true;

+		var r = service.getNewVersionState();

+

+        function showProgress() {

+            var upgradingState = ["downloading"];

+            var info = service.getCurrentUpgradeState();

+            if(info.current_upgrade_state.toLowerCase() == "idle") {

+                addTimeout(showProgress, 1000);

+            } else if(($.inArray(info.current_upgrade_state, upgradingState) != -1)&&(r.fota_new_version_state != "already_has_pkg")) {

+                hideLoading();

+                sf_showFotaUpgradeStatus();

+            }

+        }

+        if (!($("#progress").is(":visible"))) {

+            showProgress();

+        }

+        var times = 0;

+        var getOTAUpgradeState = function () {

+            var data = null;

+            if (times <= 3) {

+                times = times + 1;

+                data = service.getCurrentUpgradeState();

+            } else {

+                data = getCurrentStatusInfo();

+            }

+            var state = data.current_upgrade_state;

+            if(sv_fotaUpdateCancel && isLoggedIn == true){

+

+				if(r.fota_new_version_state == "already_has_pkg"){

+					if(state == 'low_battery'){

+                        hideProgressBar();

+                        sv_fotaUpdateCancel = false;

+					    service.removeTimerThings('fota_current_upgrade_state',function(){});

+                        showInfo('ota_pkg_low_battery');

+                        window.clearTimeout(sv_timer);

+                        return;

+                    }else if(state == 'prepare_install'){

+                        hideProgressBar();

+                        sv_fotaUpdateCancel = false;

+                        service.removeTimerThings('fota_current_upgrade_state',function(){});

+                        showInfo('ota_pkg_download_success');

+                        window.clearTimeout(sv_timer);

+                        sv_batteryCheckTimer = setInterval(function () {

+                            sf_checkBatteryStatusForFota();

+                            }, 1000);

+                        return;

+				    } 

+				}else if(state == 'downloading') {

+                    sf_refreshFotaDownloadProgress();

+                }else if(state == 'download_failed') {

+                    hideProgressBar();

+                    sv_fotaUpdateCancel = false;

+                    showAlert('ota_download_failed');

+                    window.clearTimeout(sv_timer);

+                    return;

+                }else if(state == 'low_battery'){

+                    hideProgressBar();

+                    sv_fotaUpdateCancel = false;

+					service.removeTimerThings('fota_current_upgrade_state',function(){});

+                    showInfo('ota_low_battery');

+                    window.clearTimeout(sv_timer);

+                    return;

+                }else if(state == 'prepare_install'){

+                    hideProgressBar();

+                    sv_fotaUpdateCancel = false;

+                    service.removeTimerThings('fota_current_upgrade_state',function(){});

+                    showInfo('ota_download_success');

+                    window.clearTimeout(sv_timer);

+                    sv_batteryCheckTimer = setInterval(function () {

+                        sf_checkBatteryStatusForFota();

+                    }, 1000);

+                    return;

+                }else{

+                    sv_fotaUpdateCancel = false;

+                    hideProgressBar();

+                    window.clearTimeout(sv_timer);

+                    return;

+                }

+                sv_timer = window.setTimeout(getOTAUpgradeState , 1000);

+            }

+        };

+

+        if(sv_fotaUpdateCancel && isLoggedIn == true){

+            sv_timer = window.setTimeout(getOTAUpgradeState , 100);

+        }else{

+            window.clearTimeout(sv_timer);

+        }

+    }	

+

+    // ��ʾFota��������

+    function sf_showFotaUpdateResult(i_otaResult) {

+        if ((!($("#loading").is(":visible"))) && (!($("#confirm").is(":visible")))) {

+            var s_message = i_otaResult ? "ota_update_success" : "ota_update_failed";

+            sv_fotaResultAlertPopuped = true;

+            showAlert(s_message, function () {

+                sv_fotaResultAlertPopuped = false;

+                if (config.UPGRADE_TYPE == "OTA") {

+                    service.clearUpdateResult({}, $.noop());

+                }

+            });

+        } else {

+            window.setTimeout(function () {

+                sf_showFotaUpdateResult(i_otaResult)

+            }, 1000);

+        }

+    }	

+

+    // ��ʾ��ǰ����״̬

+    function sf_showFotaUpgradeStatus() {

+        var s_data        = service.getMandatory();

+        var s_isMandatory = s_data.is_mandatory;

+        var s_sizeInfo    =service.getPackSizeInfo();

+		var s_percents;

+

+        if (parseInt(s_sizeInfo.fota_pkg_total_size) == 0) {

+            s_percents = 0;

+        } else {

+            s_percents = parseInt(parseInt(s_sizeInfo.fota_dl_pkg_size) * 100 / parseInt(s_sizeInfo.fota_pkg_total_size));

+        }

+        if (s_percents > 100) {

+            s_percents = 100;

+        }

+

+        if (s_isMandatory) {

+            showProgressBar("ota_update", "<br/>" + $.i18n.prop("ota_update_warning"));

+        } else {

+            var cancelHtml = "";

+            if (config.UPGRADE_TYPE == "OTA") {

+                cancelHtml = "<br/><br/><button id='btnStopUpgrade' onclick='stopOTAUpgrade();' class='btn-1 btn-primary'>" + $.i18n.prop("cancel") + "</button>";

+            }

+            showProgressBar("ota_update", "<br/>" + $.i18n.prop("ota_update_warning") + cancelHtml);

+        }

+

+        //setProgressBar(0);

+       if (s_percents >= 0) {

+            setProgressBar(s_percents);       

+       }

+    }

+

+

+

+

+

+    function sf_startFotaUpgrade(){

+        service.setUpgradeSelectOp({selectOp:'1'},function(result){

+            if (result.result == "success"){

+                sf_showFotaCurrentStatus();

+            }});

+    }

+

+    function cancelFotaUpgrade(){

+        service.setUpgradeSelectOp({selectOp:'0'},function(result){ });

+    }

+

+

+    function refreshFotaStatusForUserSelector(choice){

+        var info = getCurrentStatusInfo();

+        if(choice){

+			var modeData = service.getOpMode();

+            if (!checkConnectedStatus(info.connectStatus, modeData.rj45_state, info.connectWifiStatus)) {

+                showAlert("ota_network_disconnected");

+                return;

+            }

+

+            if(info.fota_user_selector == 'none'){

+                sf_startFotaUpgrade();

+            }else if(info.fota_user_selector == 'accept'){

+                sf_showFotaCurrentStatus();

+            }else if(info.fota_user_selector == 'cancel'){

+                showAlert("ota_have_cancel");

+            }else if(info.fota_user_selector == 'downloading_cancel'){

+                showAlert("ota_have_cancel");

+            }

+        }else{

+            if(info.fota_user_selector == 'none'){

+                cancelFotaUpgrade();

+            }else if(info.fota_user_selector == 'accept'){

+                sf_showFotaCurrentStatus();

+            }else if(info.fota_user_selector == 'cancel'){

+                // todo: 

+            }else if(info.fota_user_selector == 'downloading_cancel'){

+                // todo: 

+            }

+        }

+    }

+

+

+    // ��ʾ���°汾�������ж��Ƿ�������ʾ

+    function showFotaStatusForUserToConfirm(upgradeState) {

+        var upgState = upgradeState.current_upgrade_state;

+        if (upgState == 'upgrade_pack_redownload') {

+            showConfirm("ota_interrupted", {ok: function () {

+                refreshFotaStatusForUserSelector(1);

+            }, no: function () {

+                refreshFotaStatusForUserSelector(0);

+            }});

+        } else {

+            var upgradingState = ["prepare_install", "low_battery",

+                "connecting_server", "connect_server_success", "downloading", "accept"];

+            if ($.inArray(upgState, upgradingState) != -1) {

+                sf_showFotaCurrentStatus();

+            } else {

+

+                showConfirm($.i18n.prop('ota_new_version'), {ok: function () {

+                    refreshFotaStatusForUserSelector(1);

+					config.ISNOW_NOTICE = false;

+                }, no: function () {

+                    refreshFotaStatusForUserSelector(0);

+					config.ISNOW_NOTICE = false;

+                }});

+            }

+        }

+    }

+

+    showOTAAlert = function () {

+		config.ISNOW_NOTICE = true;

+        var is_mandatory = service.getMandatory().is_mandatory;

+        if (is_mandatory) {

+            sf_showFotaCurrentStatus();

+        } else {

+            var upgradeState = {};

+            upgradeState = service.getCurrentUpgradeState();

+            showFotaStatusForUserToConfirm(upgradeState);

+        }

+    };

+

+    // ��ֹFota����

+    stopOTAUpgrade = function () {

+        service.setUpgradeSelectOp({selectOp:'2'},function(result){ });

+        sv_fotaUpdateCancel = false;

+        window.clearTimeout(sv_timer);

+        hideLoading();

+        showAlert('ota_cancel');

+    };

+

+    // �������������Ƿ����ѹ�

+    function setTrafficAlertPopuped(val){

+    	sv_trafficAlertPopuped = !!val;

+        sv_trafficAlertPopuped_100 = !!val;

+        if(!val){

+            sv_resetTrafficAlertPopuped = true;

+        }

+    }

+

+    function setTrafficAlert100Popuped(val){

+        sv_trafficAlertPopuped_100 = !!val;

+        if(!val){

+            sv_resetTrafficAlertPopuped = true;

+        }

+    }

+

+    // ���������ṹ

+    function getTrafficResult(info){

+        var s_trafficResult = {

+            showConfirm : false,

+            limitPercent : info.limitVolumePercent

+        };

+        if(info.limitVolumeType == '1'){

+            var monthlyTraffic = parseInt(info.data_counter.monthlySent, 10) + parseInt(info.data_counter.monthlyReceived, 10);

+            s_trafficResult.usedPercent = monthlyTraffic / info.limitVolumeSize * 100;

+            if(s_trafficResult.usedPercent > s_trafficResult.limitPercent){

+                s_trafficResult.showConfirm = true;

+                s_trafficResult.type = 'data';

+            }

+        }else{

+            s_trafficResult.usedPercent = info.data_counter.monthlyConnectedTime / info.limitVolumeSize * 100;

+            if(s_trafficResult.usedPercent > s_trafficResult.limitPercent){

+                s_trafficResult.showConfirm = true;

+                s_trafficResult.type = 'time';

+            }

+        }

+        return s_trafficResult;

+    }

+

+	// ��ʼ�� ViewModel����������ͼ����

+    function init() {

+        if(config.PRODUCT_TYPE == 'DATACARD') {

+            $('#statusBar').addClass('padding-right-90');

+            $('#language').addClass('data-card-language');

+        }

+        //preload img 

+        var imgAlert   = $('<img />').attr('src', 'pic/res_alert.png');

+        var imgConfirm = $('<img />').attr('src', 'pic/res_confirm.png');

+        var imgInfo    = $('<img />').attr('src', 'pic/res_info.png');

+

+        window.setTimeout(function () {

+

+            var fwVm = new statusViewModel();

+

+            ko.applyBindings(fwVm, $('#statusBar')[0]);

+

+            window.setInterval(function () {

+                var info          = getCurrentStatusInfo();

+				var s_roamStatus    = info.roamingStatus ? true : false;

+                var $langLogoBar  = $("#langLogoBar");

+                isLoggedIn        = info.isLoggedIn;

+

+

+                //fwVm.attachedDevices(info.attachedDevices);	

+                fwVm.batteryLevel(info.batteryLevel + '%');				

+                fwVm.batteryPers(sf_getBatteryLevelImage(info.batteryPers, info.batteryStatus));

+                fwVm.batteryStatus(info.batteryStatus);				

+				fwVm.isShowFotaNewversionIcon(info.new_version_state && info.fota_user_selector && info.fota_package_already_download != "yes" && config.ISNOW_NOTICE && fwVm.updateType() == 'mifi_fota');

+				fwVm.isShowRj45ConnectionIcon(config.RJ45_SUPPORT);

+                fwVm.networkOperator(sf_getNetWorkProvider(info.spn_b1_flag,info.spn_name_data,info.spn_b2_flag,info.networkOperator,s_roamStatus));

+                fwVm.networkType(getNetworkType(info.networkType));

+                fwVm.pinStatus(info.pinStatus);

+                fwVm.roamingStatus(info.roamingStatus ? "R" : "");

+                fwVm.showAttachedDevices(info.wifiStatus);

+                fwVm.simStatus(sf_convertSimStatusToImage(info.simStatus));				

+                fwVm.signalCssClass(sf_getSignalCssClass(info.signalImg, info.networkType, info.simStatus));				

+                fwVm.isLoggedIn(info.isLoggedIn);

+                fwVm.wifiStatusCssClass(sf_getWifiStatusCssClass(info.wifiStatus, info.wirelessDeviceNum));

+                fwVm.wifiStatusImg(sf_getWifiStatusImage(info.wifiStatus, info.wirelessDeviceNum));	

+

+				if(config.HAS_SMS ){

+					if(!sv__hasCheckedSMSCapacity && info.isLoggedIn){

+						checkSMSCapacity(info.smsUnreadCount);

+					} else {

+						fwVm.smsUnreadCount(info.smsUnreadCount);

+					}

+                }

+

+                sf_getConnectionCssClass(fwVm, info.connectStatus, info.data_counter, info.connectWifiSSID, info.connectWifiStatus, info.rj45ConnectStatus);

+                refreshWifiConnectStatus(fwVm, info.connectStatus,info.connectWifiSSID,info.connectWifiStatus);

+                checkTrafficLimitAlert(fwVm, info);

+                updateStatusBarTrans({simStatus: info.simStatus, wifiStatus: info.wifiStatus, deviceSize: info.wirelessDeviceNum, networkType: info.networkType});

+

+                if(info.isLoggedIn){

+                	$("#statusBar:hidden").show();

+                } else {

+                	$("#statusBar:visible").hide();

+                }

+            }, 500);

+

+            if(config.HAS_SMS){

+                window.setInterval(function(){

+                    if(fwVm.isLoggedIn()){

+                        checkSMSCapacity();

+                    }

+                }, 10000);

+                checkSmsModelReady();

+            }

+

+            window.setInterval(function() {

+                var data = getCurrentStatusInfo();

+				var upgradingState = ["prepare_install", "low_battery", "download_success","downloading"];

+

+                if (fwVm.isLoggedIn() == true && !($("#progress").is(":visible")) && data.defaultWanName != ""){                    

+					 	if ($.inArray(data.current_upgrade_state, upgradingState) != -1){

+                        if(null == sv_fotaUpdateCancel){

+                            if(!data.is_mandatory){

+                                $.modal.close();

+                            }

+                            sf_showFotaCurrentStatus();

+                        }else if(false == sv_fotaUpdateCancel){

+                            sv_fotaUpdateCancel = null;

+                        }

+                    }

+                }

+            }, 1000);

+

+            var checkFotaUpgradeResult = function () {

+                var info = service.getStatusInfo();

+                if (info.isLoggedIn) {

+                    service.getUpgradeResult({}, function (data) {

+                        if (data.upgrade_result == "success") {

+                            sf_showFotaUpdateResult(true);

+                        } else if (data.upgrade_result == "fail") {

+                            sf_showFotaUpdateResult(false);

+                        } else {

+                            window.setTimeout(checkFotaUpgradeResult, 1000);

+                        }

+                    }, function () {

+                        window.setTimeout(checkFotaUpgradeResult, 1000);

+                    });

+                } else {

+                    window.setTimeout(checkFotaUpgradeResult, 1000);

+                }

+            };

+            if(fwVm.updateType() == "mifi_fota"){

+                checkFotaUpgradeResult();

+                window.setInterval(function () {

+                    var info = getCurrentStatusInfo();

+                    if (info.isLoggedIn && info.defaultWanName != "") { 

+                        if(info.new_version_state && info.fota_package_already_download != "yes" && !config.ALREADY_NOTICE){

+                            service.getUpgradeResult({}, function (data) {

+                                if (data.upgrade_result == "success") {

+                                    sf_showFotaUpdateResult(true);

+                                } else if (data.upgrade_result == "fail") {

+                                    sf_showFotaUpdateResult(false);

+                                } else {

+                                    if(sv_fotaResultAlertPopuped == false){

+                                        config.ALREADY_NOTICE = true;

+                                        showOTAAlert();

+                                    }

+                                }

+                            });

+                        }

+                    }

+                }, 1000);

+            }

+			function checkSMSCapacity(unreadCount){

+				service.getSmsCapability({}, function(info){

+					var showSmsConfirm = false;

+					if(info.nvTotal != 0 && info.nvUsed >= info.nvTotal){

+						$("#sms_unread_count").attr("tipTitle", "sms_capacity_is_full");

+						showSmsConfirm = true;

+					} else if(info.nvTotal != 0 && info.nvUsed + 5 >= info.nvTotal) {

+						$("#sms_unread_count").attr("tipTitle", "sms_capacity_will_full");

+						showSmsConfirm = true;

+					} else {

+						$("#sms_unread_count").attr("tipTitle", "sms_unread_count");

+					}

+					fwVm.showSmsDeleteConfirm(showSmsConfirm);

+					if(typeof unreadCount != "undefined"){

+						fwVm.smsUnreadCount(unreadCount);

+					}

+					sv__hasCheckedSMSCapacity = true;

+				});

+			}

+        }, 1200);

+

+        tooltip.init();

+

+        // ������Ϣģ����ʼ��״̬

+        function checkSmsModelReady(){

+            var info = getCurrentStatusInfo();

+            if(info.isLoggedIn){

+                service.getSMSReady({}, function (data) {

+                    if (data.sms_cmd_status_result == "1") {

+                        window.setTimeout(function(){checkSmsModelReady();}, 1000);

+                    } else {

+                        sv__initSMSCompleted = true;

+                    }

+                });

+            } else {

+                window.setTimeout(function(){checkSmsModelReady();}, 1000);

+            }

+        }

+

+        // ������������״̬

+        checkTrafficLimitAlert = function(fwVm, info){

+	    if(window.location.hash == '#entry'){

+                return false;

+            }

+            var APStationEnabled = config.AP_STATION_SUPPORT ? service.getStatusInfo().ap_station_enable : 'undefined';

+			var trafficResult    = getTrafficResult(info);

+            var inShow           = $("#confirm-container:visible").length > 0;

+            var notPPP           = (config.PRODUCT_TYPE == 'CPE' && checkCableMode(info.blc_wan_mode)) ? true : false;

+

+            // ��ȡAp Stationʹ��״̬���������ѷ�ʽ

+            if (config.AP_STATION_SUPPORT && (typeof APStationEnabled == "undefined" || APStationEnabled === '')) {

+                service.refreshAPStationStatus({}, $.noop());

+                return false;

+            }

+            APStationEnabled = APStationEnabled == 1;

+

+            if (!info.isLoggedIn || inShow || (sv_trafficAlertPopuped && sv_trafficAlertPopuped_100) || !info.limitVolumeEnable || (!APStationEnabled && !(info.connectStatus == "ppp_connected")) || notPPP) {

+                return false;

+            }

+

+            if(sv_resetTrafficAlertPopuped){

+                window.setTimeout(function () {

+                    sv_resetTrafficAlertPopuped = false;

+                }, 2000);

+                return false;

+            }

+

+        	if(trafficResult.showConfirm){

+

+                var confirmMessage = null;

+

+                if(trafficResult.usedPercent > 100 && !sv_trafficAlertPopuped_100){

+

+                    sv_trafficAlertPopuped     = true;

+					sv_trafficAlertPopuped_100 = true;

+

+                    confirmMessage = {msg: APStationEnabled ? 'traffic_beyond_msg' : 'traffic_beyond_disconnect_msg'};

+

+                } else if (!sv_trafficAlertPopuped) {

+

+                    sv_trafficAlertPopuped     = true;

+                    sv_trafficAlertPopuped_100 = false;

+                    confirmMessage = {msg: APStationEnabled ? 'traffic_limit_msg' : 'traffic_limit_disconnect_msg',

+                        params: [trafficResult.limitPercent]};

+                }

+

+                if (confirmMessage != null) {

+                    if (APStationEnabled) {

+                        showAlert(confirmMessage);

+                    } else {

+                        showConfirm(confirmMessage, function () {

+                            showLoading("disconnecting");

+                            service.disconnect({}, function (data) {

+                                if (data.result) {

+                                    successOverlay();

+                                } else {

+                                    errorOverlay();

+                                }

+                            });

+                        });

+                    }

+                }

+            }

+            return true;

+        };

+

+        // ����״̬�е�tooltip

+        function updateStatusBarTrans(status){

+    		$("#statusItemSimStatus").attr("tipTitle", "sim_status_" + status.simStatus);

+    		if (status.wifiStatus) {

+				if (status.deviceSize == 0) {

+					$("#wifi_status").attr("tipTitle","wifi_status_on");

+				} else {

+					$("#wifi_status").attr("tipTitle","wifi_status" + status.deviceSize);

+				}

+			} else {

+				$("#wifi_status").attr("tipTitle","wifi_status_off");

+			}

+        }

+

+

+        // ˢ��wifi��������״̬

+        function refreshWifiConnectStatus(fwVm, status, wifiSSID, wifiStatus) {

+            fwVm.connectStatus(status);

+            if (status == "ppp_disconnecting") {

+                fwVm.connectStatusTrans("disconnecting");

+                fwVm.connectStatusText($.i18n.prop("disconnecting"));

+            } else if (status == "ppp_connecting") {

+                fwVm.connectStatusTrans("connecting");

+                fwVm.connectStatusText($.i18n.prop("connecting"));

+            } else if (status == "ppp_connected") {

+                fwVm.connectStatusTrans("connected");

+                fwVm.connectStatusText($.i18n.prop("connected"));

+            } else if(wifiSSID){

+                if(wifiStatus =="dhcping" || wifiStatus =="connecting"){

+                    fwVm.connectStatus("wifi_connecting");

+                    fwVm.connectStatusTrans("connecting");

+                    fwVm.connectStatusText($.i18n.prop("connecting"));

+                }else if(wifiStatus =="connect"){

+                    fwVm.connectStatus("wifi_connect");

+                    fwVm.connectStatusTrans("connected");

+                    fwVm.connectStatusText($.i18n.prop("connected"));

+                }else{

+                    fwVm.connectStatus("ppp_disconnected");

+                    fwVm.connectStatusTrans("disconnected");

+                    fwVm.connectStatusText($.i18n.prop("disconnected"));

+                }

+            }else{

+                fwVm.connectStatusTrans("disconnected");

+                fwVm.connectStatusText($.i18n.prop("disconnected"));

+            }

+        }

+

+        // ��ȡ��ǰ����״̬

+        getNetworkType = function(networkType) {

+			var networkTypeTmp = networkType.toLowerCase();

+			if (networkTypeTmp == '' || networkTypeTmp == 'limited service') {

+				networkTypeTmp = 'limited_service';

+			}

+			if(networkTypeTmp == 'no service') {

+				networkTypeTmp = 'no_service';

+			}

+			if (networkTypeTmp == 'limited_service' || networkTypeTmp == 'no_service') {

+				$("#networkType", "#statusBar").attr("data-trans", "network_type_" + networkTypeTmp);

+				return $.i18n.prop("network_type_" + networkTypeTmp);

+			} else {

+                $("#networkType", "#statusBar").removeAttr("data-trans");

+                return networkType;

+            }

+		};

+

+		if(config.HAS_SMS && menu.checkIsMenuExist("sms_list")){

+            window.setInterval(function () {

+                var info = getCurrentStatusInfo();

+        		if(window.location.hash == "#entry" || sf_simStatusInvalid(info.simStatus)){

+        			return;

+        		}

+        		for(key in sv_messagePopStack){

+        			var val = sv_messagePopStack[key];

+        			if($.now() - val > 5000){

+        				delete(sv_messagePopStack["m" + val]);

+        				var node = $(".bubbleItem#m" + val, "#buttom-bubble");

+        				node.fadeOut(1000, function(){

+        					$(this).remove();

+        				});

+        			}

+        		}

+        		if(info.isLoggedIn){

+        			if(info.newSmsReceived && !sv_newSMSMessageInDealing){

+                        sv_newSMSMessageInDealing = true;

+        				service.resetNewSmsReceivedVar();

+        				sf_checkNewMessages();

+        			}

+        			if(info.smsReportReceived){

+        				service.resetSmsReportReceivedVar();

+        				sf_responseSmsReport();

+        			}

+        		}

+			}, 1000);

+

+            if(config.SMS_DATABASE_SORT_SUPPORT){

+                window.setInterval(function(){

+                    if(menu.checkIsMenuExist("sms_list")){

+                        var info = getCurrentStatusInfo();

+                        if(info.isLoggedIn && sv__initSMSCompleted && !sv_newSMSMessageInDealing && !sf_simStatusInvalid(info.simStatus)){

+                            sv_newSMSMessageInDealing = true;

+                            sf_checkNewMessages();

+                        }

+                    }

+                }, 20001);

+            }

+		}

+

+    	function sf_checkNewMessages(){

+

+            var s_tags     = 1;		

+            var s_smsCount = 5;

+

+            if(!config.dbMsgs || config.dbMsgs.length == 0){

+                s_smsCount = 500;

+                s_tags     = 10;

+            }

+            service.getSMSMessages({

+                page : 0,

+                smsCount : s_smsCount,

+                nMessageStoreType : 0,

+                tags : s_tags,

+                orderBy : "order by id desc"

+            }, function(data){

+                if(data && data.messages){

+                    sf_filterNewMessage(data.messages, 0);

+                }

+                sv_newSMSMessageInDealing = false;

+            });	

+            service.getSMSMessages({

+                page : 0,

+                smsCount : s_smsCount,

+                nMessageStoreType : 1,

+                tags : s_tags,

+                orderBy : "order by id desc"

+            }, function(data){

+                if(data && data.messages){

+                    sf_filterNewMessage(data.messages, 1);

+                }

+                sv_newSMSMessageInDealing = false;

+            });

+    	}

+

+        if(config.HAS_SMS){

+            $(".bubbleItem", "#buttom-bubble").live("mouseover", function(){

+                var $this = $(this);

+                delete(sv_messagePopStack[$this.attr("id")]);

+            }).live("mouseout", function(){

+                    var $this = $(this);

+                    var now = $.now();

+                    sv_messagePopStack["m" + now] = now;

+                    $this.attr("id", "m" + now);

+                    $(".bubbleItem h3 a.bubbleCloseBtn", "#buttom-bubble").data("targetid", "m" + now);

+                });

+

+            $(".bubbleItem h3 a.bubbleCloseBtn", "#buttom-bubble").die().live("click", function(){

+                var id = $(this).data("targetid");

+                delete(sv_messagePopStack[id]);

+                var node = $(".bubbleItem#" + id, "#buttom-bubble");

+                node.fadeOut(1000, function(){

+                    $(this).remove();

+                });

+            });

+        }

+    }

+

+

+    return {

+        init:init,

+        setTrafficAlertPopuped: setTrafficAlertPopuped,

+        setTrafficAlert100Popuped: setTrafficAlert100Popuped,

+        getTrafficResult: getTrafficResult,

+        showOTAAlert:showOTAAlert

+    };

+});

+

+// ����ͳ������ģ��

+define("status_traffic_alert","jquery knockout service statusBar echarts".split(" "), 

+

+    function ($, ko, service, status, echarts) {

+

+    var sv_trafficGraph          = null;

+    var sv_sourceData     = null;

+    var sv_usedDataModified = false;

+    var sv_usedTimeModified = false;	

+

+    var sv_trafficStaticalInfo = {

+        // ����ͼ��ʼֵ

+        data: {

+            alarm: {          

+

+                itemStyle: {

+                    normal: {

+                        color: '#8CC916'

+                    }

+                },

+				name: '������',

+				value: 19.7

+            },

+            alert: {      

+

+                itemStyle: {

+                    normal: {

+                        color: '#FF5500'

+                    }

+                },

+				name: '����ֵ',

+				value: 1

+            },	

+            free: {             

+

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                },

+				name: 'δʹ��',

+				value: 50

+            },

+            full: {

+

+

+                itemStyle: {

+                    normal: {

+                        color: '#DF4313'

+                    }

+                },

+				name: '��������',

+				value: 30

+            },			

+            left1: {            

+

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                },

+				name: '����ֵ��δʹ��',

+				value: 50,

+            },			

+            start: {

+

+                itemStyle: {

+                    normal: {

+                        color: '#D8D8D8'

+                    }

+                },

+				name: '����ֵ��δʹ��',

+				value: 50

+            },

+            used: {

+

+                itemStyle: {

+                    normal: {

+                        color: '#8CC916'

+                    }

+                },

+				name: '��ʹ��',

+				value: 30

+            }

+        },	

+        cacheEle: {},

+        // Ԫ�ػ�ȡ

+        getEle: function (i_elementId) {

+            if (this.cacheEle.hasOwnProperty('id')) {

+                return this.cacheEle[i_elementId];

+            } else {

+                this.cacheEle[i_elementId] = $("#" + i_elementId);

+                return this.cacheEle[i_elementId];

+            }

+        },

+        // ��ȡ�����澯״ֵ̬

+        fetchTrafficAlertInfo: function(){

+            sv_sourceData = getTrafficAlertInfo();

+            return sv_sourceData;

+        },		

+        // ��ȡ����ֵ�Ͷ�Ӧ��λֵ

+        getTrafficStatisticalDatalnfo: function (i_valueInfo) {

+            return {

+                data: /\d+(.\d+)?/.exec(i_valueInfo)[0],

+                unit: /[A-Z]{1,2}/.exec(i_valueInfo)[0]

+            }

+        },

+

+        // ��ȡʱ��ʱ���֡���

+        getTrafficTimeHours: function (i_time) {

+            var s_timeArray = i_time.split(':');

+            return {

+                h: parseInt(s_timeArray[0], 10),

+                m: parseInt(s_timeArray[1], 10),

+                s: parseInt(s_timeArray[2], 10)

+            }

+        },

+        // ��ȡͳ��ʱ���Ͷ�Ӧ��λֵ

+        getTrafficTimeInfo: function (i_valueInfo) {

+            return {

+                data: /\d+(.\d+)?/.exec(i_valueInfo)[0],

+                unit: /[a-z]{4,6}/.exec(i_valueInfo)[0]

+            }

+        },

+        // ʱ�任����S

+        getTrafficTimeToSeconds: function (i_time) {

+            var s_FormattedTime = this.getTrafficTimeHours(i_time);

+            return s_FormattedTime.h * 3600 + s_FormattedTime.m * 60 + s_FormattedTime.s;

+        },			

+        // ͨ�����ƻ�ȡ������λ

+        getTrafficUnitByScale: function (i_scale) {

+            if (i_scale == '1024') {

+                return 'GB';

+            } else if (i_scale == '1048576') {

+                return 'TB';

+            } else {

+                return 'MB';

+            }

+        },			

+        // ��λ��Ӧֵ��ȡ

+        getTrafficValueByStatisticalUnit: function (i_unit) {

+            i_unit = i_unit.toLowerCase();

+            if(i_unit == 'minute'){

+				return '60';

+			} else if (i_unit == 'gb') {

+                return '1024';

+            } else if(i_unit == 'hour'){

+				return '3600';

+			} else if (i_unit == 'tb') {

+                return '1048576';

+            } else {

+                return '1';

+            }

+        },

+

+        // ���������Ƿ��ɱ༭

+        isFormEditable: function (fwVm) {

+            var s_dataPageEditState = fwVm.dataLimitTypeChecked() == '1' && (fwVm.viewEditUsedData() || fwVm.viewEditAlertData() || fwVm.viewEditTotalData());

+            var s_timePageEditState = fwVm.dataLimitTypeChecked() == '0' && (fwVm.viewEditUsedTime() || fwVm.viewEditAlertTime() || fwVm.viewEditTotalTime());

+            if (s_dataPageEditState || s_timePageEditState) {

+                $('.border-color-transition:visible').addClass('attention-focus');

+                addTimeout(function () {

+                    $('.border-color-transition:visible').removeClass('attention-focus');

+                }, 1500);

+                return true;

+            } else {

+                var s_result = false;

+                if (fwVm.dataLimitTypeChecked() == 1) {

+                    if (fwVm.alertDataReach() == '0') {

+                        fwVm.editAlertDataHandler();

+                        s_result = true;

+                    }

+                    if (fwVm.limitDataMonth() == '0') {

+                        fwVm.editTotalDataHandler();

+                        s_result = true;

+                    }

+                } else {

+					if (fwVm.alertTimeReach() == '0') {

+                        fwVm.editAlertTimeHandler();

+                        s_result = true;

+                    }

+                    if (fwVm.limitTimeMonth() == '0') {

+                        fwVm.editTotalTimeHandler();

+                        s_result = true;

+                    }

+                }

+

+                if (s_result) {

+                    $('.border-color-transition:visible').addClass('attention-focus');

+                    addTimeout(function () {

+                        $('.border-color-transition:visible').removeClass('attention-focus');

+                    }, 1500);

+                }

+                return s_result;

+            }

+        },

+

+        // ˢ������ͼ��Ϣ������������ֵ����ʾ����

+

+        refreshFlowDiagramInfo: function (fwVm) {

+            var s_alarm  = 0;

+            var s_left   = 0;

+            var s_left1  = 0;

+            var s_reach  = 0;	

+            var s_total  = 0;

+            var s_used   = 0;

+

+

+            var s_startName = $.i18n.prop("echarts_no");

+

+            if (sv_sourceData.dataLimitChecked == '1') { //if (fwVm.dataLimitChecked() == '1') { //����

+	        	s_startName = $.i18n.prop("echarts_used");

+	        	sv_trafficGraphOptions.series[0].data = [];    

+

+				if (fwVm.dataLimitTypeChecked() == '1') { // ����

+                    sv_trafficGraphOptions.title.text = "";

+                    sv_trafficGraphOptions.series[0].data = [];

+

+                    if (fwVm.limitDataMonth() == 0) {

+                        var s_usedData = sv_trafficStaticalInfo.data.used;

+                        s_usedData.value = 1;

+                        s_usedData.name = $.i18n.prop("echarts_used");

+                        s_usedData.selected = false;

+                        sv_trafficGraphOptions.series[0].data.push(s_usedData);

+                    } else {

+                        s_total = fwVm.limitDataMonth() * fwVm.selectedDataUnit() * 1048576;

+                        s_used  = parseInt(sv_sourceData.monthlySent, 10) + parseInt(sv_sourceData.monthlyReceived, 10);

+                        s_reach = s_total * fwVm.alertDataReach() / 100;

+

+                        if (s_used >= s_total) {

+                            var s_fullData    = sv_trafficStaticalInfo.data.full;

+                            s_fullData.value  = 100;

+                            s_fullData.name   = $.i18n.prop("echarts_full");

+                            sv_trafficGraphOptions.series[0].data.push(s_fullData);

+                            s_startName = $.i18n.prop("echarts_full");

+                        } else {

+                            if (s_reach > s_used) { 

+                                s_left1 = s_reach - s_used;

+                                s_left  = s_total - s_reach;

+                            } else { 

+                                s_alarm = s_used - s_reach;

+                                s_left  = s_total - s_used;

+                            }

+

+                            var s_usedData = sv_trafficStaticalInfo.data.used;

+                            if (s_reach - s_used > 0) {

+                                s_usedData.value = s_used;

+                            } else {

+                                s_usedData.value = s_reach;

+                            }

+                            s_usedData.name = $.i18n.prop("echarts_used");

+                            sv_trafficGraphOptions.series[0].data.push(s_usedData);

+

+                            if (s_left1 > 0) {

+                                var s_left1Data     = sv_trafficStaticalInfo.data.left1;

+                                s_left1Data.value   = s_left1;

+                                s_left1Data.name    = $.i18n.prop("echarts_left1");

+                                sv_trafficGraphOptions.series[0].data.push(s_left1Data);

+                            }

+

+                            var s_alertData         = sv_trafficStaticalInfo.data.alert;

+                            s_alertData.value       = s_total / 200;

+                            s_alertData.name        = $.i18n.prop("echarts_alert");

+                            sv_trafficGraphOptions.series[0].data.push(s_alertData);

+

+                            if (s_alarm > 0) {

+                                var s_alarmData     = sv_trafficStaticalInfo.data.alarm;

+                                s_alarmData.value   = s_alarm;

+                                s_alarmData.name    = $.i18n.prop("echarts_alarm");

+                                sv_trafficGraphOptions.series[0].data.push(s_alarmData);

+                            }

+

+                            var s_freeData          = sv_trafficStaticalInfo.data.free;

+                            s_freeData.value        = s_left;

+                            s_freeData.name         = $.i18n.prop("echarts_free");

+                            sv_trafficGraphOptions.series[0].data.push(s_freeData);

+                        }

+                    }	

+

+				}else{// ʱ��

+

+                    sv_trafficGraphOptions.series[0].data = [];

+

+                    if (fwVm.limitTimeMonth() == 0) {

+                        var s_usedData        = sv_trafficStaticalInfo.data.used;

+                        s_usedData.value      = 1;

+                        s_usedData.selected   = false;

+                        s_usedData.name       = $.i18n.prop("echarts_used");

+                        sv_trafficGraphOptions.series[0].data.push(s_usedData);

+                    } else {

+                        s_total  = fwVm.limitTimeMonth() * fwVm.selectedTimeUnit();

+                        s_used   = sv_sourceData.monthlyConnectedTime;

+                        s_reach  = s_total * fwVm.alertTimeReach() / 100;

+

+                        if (s_used >= s_total) {

+                            var fullTime   = sv_trafficStaticalInfo.data.full;

+                            fullTime.value = 100;

+                            fullTime.name  = $.i18n.prop("echarts_full");

+                            sv_trafficGraphOptions.series[0].data.push(fullTime);

+                            s_startName    = $.i18n.prop("echarts_full");

+                        } else {

+                            if (s_reach - s_used > 0) {

+                                s_left1 = s_reach - s_used;

+                                s_left  = s_total - s_reach;

+                            } else {

+                                s_alarm = s_used  - s_reach;

+                                s_left  = s_total - s_used;

+                            }

+

+                            var s_usedTime = sv_trafficStaticalInfo.data.used;

+                            if (s_reach - s_used > 0) {

+                                s_usedTime.value = s_used;

+                            } else {

+                                s_usedTime.value = s_reach;

+                            }

+                            s_usedTime.name = $.i18n.prop("echarts_used");

+                            sv_trafficGraphOptions.series[0].data.push(s_usedTime);

+

+                            if (s_left1 > 0) {

+                                var s_left1Time    = sv_trafficStaticalInfo.data.left1;

+                                s_left1Time.value  = s_left1;

+                                s_left1Time.name   = $.i18n.prop("echarts_left1");

+                                sv_trafficGraphOptions.series[0].data.push(s_left1Time);

+                            }

+

+                            var s_alertTime        = sv_trafficStaticalInfo.data.alert;

+                            s_alertTime.value      = s_total / 200;

+                            s_alertTime.name       = $.i18n.prop("echarts_alert");

+                            sv_trafficGraphOptions.series[0].data.push(s_alertTime);

+

+                            if (s_alarm > 0) {

+                                var s_alarmTime      = sv_trafficStaticalInfo.data.alarm;

+                                s_alarmTime.value    = s_alarm;

+                                s_alarmTime.name     = $.i18n.prop("echarts_alarm");

+                                sv_trafficGraphOptions.series[0].data.push(s_alarmTime);

+                            }

+

+                            var s_freeTime         = sv_trafficStaticalInfo.data.free;

+                            s_freeTime.value       = s_left;

+                            s_freeTime.name        = $.i18n.prop("echarts_free");

+                            sv_trafficGraphOptions.series[0].data.push(s_freeTime);

+                        }

+                    }		

+                } 

+            } else {

+                var s_usedData      = sv_trafficStaticalInfo.data.used;

+                s_usedData.value    = 1;

+                s_usedData.selected = false;

+                s_usedData.name     = $.i18n.prop("echarts_no");

+

+                sv_trafficGraphOptions.series[0].data = [s_usedData];

+                sv_trafficGraphOptions.title.text     = '';			

+            }

+            sv_trafficStaticalInfo.setFlowDiagramInfo(sv_trafficGraphOptions, s_startName);

+        },

+

+

+		// �ػ�����ͼ

+        setFlowDiagramInfo: function (i_options, i_startName) {

+            var s_startPart = sv_trafficStaticalInfo.data.start;

+

+            s_startPart.name     = i_startName;			

+            s_startPart.selected = false;

+            s_startPart.value    = 0;

+

+            var s_arr = [s_startPart].concat(i_options.series[0].data);

+            i_options.series[0].data = s_arr;

+            sv_trafficGraph.setOption(i_options, true);

+

+            addTimeout(function () {

+                sv_trafficGraph.resize();

+            }, 1000);

+        }

+    };

+

+

+    // ����ͼ��������

+    var sv_trafficGraphOptions = {

+        animation: false,

+        color: ['red', 'red', 'red', 'red', 'red'],

+        series: [

+            {

+                name: '��������',

+                radius: ['0', '75'],

+                selectedOffset: 3,				

+                type: 'pie',				

+                data: [

+

+                ],			

+                itemStyle: {

+                    normal: {

+                        labelLine: {

+                            show: false

+                        },

+                        label: {

+                            show: false

+                        }

+                    }

+                }				

+            }

+        ],		

+        title: {

+            itemGap: 0,

+			      text: '',

+            subtextStyle: {

+                color: '#FFF',

+                fontFamily: '΢���ź�',

+                fontSize: 16,

+                fontWeight: 'bolder'

+            },				  

+            textStyle: {

+                color: '#FFF',

+                fontFamily: '΢���ź�',

+                fontSize: 20,

+                fontWeight: 'bolder'

+            },

+            x: 'center',

+            y: 'center'			

+        },

+		tooltip: {

+            formatter: "{b}"

+        }      

+    };

+

+

+    // ��ȡ������������

+    function getTrafficAlertInfo() {

+        return service.getTrafficAlertInfo();

+    }

+

+

+

+    // ��������ViewModel

+

+    function trafficViewModel() {

+

+        var target         = this;

+

+        var info                    = sv_trafficStaticalInfo.fetchTrafficAlertInfo();	

+        var dataMonth               = info.limitDataMonth.split("_");

+

+        sv_usedDataModified         = false;

+        sv_usedTimeModified         = false;

+

+        target.alertDataReach               = ko.observable(info.alertDataReach || 0);		

+        target.alertTimeReach               = ko.observable(info.alertTimeReach || 0);

+        target.dataLimitChecked             = ko.observable(info.dataLimitChecked == '0' ? '0' : '1');

+        target.dataLimitTypeChecked         = ko.observable(info.dataLimitTypeChecked == '0' ? '0' : '1');

+        target.limitTimeMonth               = ko.observable(info.limitTimeMonth || 0);	

+

+

+        // ע��˳�� 

+        target.usedDataText                 = ko.observable(transUnit(parseInt(info.monthlySent, 10) + parseInt(info.monthlyReceived, 10), false));

+        var sv_staticalDataInfo             = sv_trafficStaticalInfo.getTrafficStatisticalDatalnfo(target.usedDataText());

+        var sv_staticalInfoData             = sv_staticalDataInfo.data;

+        target.dataUsed                     = ko.observable(sv_staticalInfoData);	

+        var sv_staticalInfoUnit             = sv_staticalDataInfo.unit;

+        target.selectedDataUsedUnit         = ko.observable(sv_trafficStaticalInfo.getTrafficValueByStatisticalUnit(sv_staticalInfoUnit));

+        target.usedDataTextDescData         = ko.observable("");

+

+        target.limitDataMonth               = ko.observable(dataMonth[0] || 0);		

+        target.selectedDataUnit             = ko.observable(dataMonth[1] || 1);		

+

+        var limitDataMonthTmp               = transUnit(target.limitDataMonth() * target.selectedDataUnit() * 1024 * 1024, false);

+        var limitDataMonthUnitTmp           = limitDataMonthTmp.substring(limitDataMonthTmp.length-2);

+        target.limitDataMonth(limitDataMonthTmp.substring(0, limitDataMonthTmp.length-2));

+        target.selectedDataUnit(sv_trafficStaticalInfo.getTrafficValueByStatisticalUnit(limitDataMonthUnitTmp));	

+

+        target.usedDataTextDesc             = ko.computed(sf_usedDataTextDesc);	

+        target.limitDataMonthDescData       = ko.observable("");

+        target.limitDataMonthDesc           = ko.computed(sf_limitDataMonthDesc);	

+        target.alertDataReachDescData       = ko.observable("");		

+        target.alertDataReachDesc           = ko.computed(sf_alertDataReachDesc);	

+        target.leftDataDescData             = ko.observable("");

+        target.leftDataDesc                 = ko.computed(sf_leftDataDesc);	

+        target.monthlyConnectedTime         = ko.observable(transSecond2Time(info.monthlyConnectedTime));

+

+		var sv_timeInfo1                    = sv_trafficStaticalInfo.getTrafficTimeInfo(transTimeUnit(info.monthlyConnectedTime));

+        target.usedTime                     = ko.observable(sv_timeInfo1.data);		

+		target.selectedTimeUsedUnit         = ko.observable(sv_trafficStaticalInfo.getTrafficValueByStatisticalUnit(sv_timeInfo1.unit));	

+

+        target.usedTimeTextDescData         = ko.observable("");

+        target.usedTimeTextDesc             = ko.computed(sf_usedTimeTextDesc);		

+

+		var  sv_timeInfoNew                 = sv_trafficStaticalInfo.getTrafficTimeInfo(transTimeUnit(parseFloat(target.limitTimeMonth()) * 3600));

+		target.selectedTimeUnit             = ko.observable(sv_trafficStaticalInfo.getTrafficValueByStatisticalUnit(sv_timeInfoNew.unit));

+		target.limitTimeMonth(sv_timeInfoNew.data);

+

+

+        target.limitTimeMonthDescData       = ko.observable("");

+		target.limitTimeMonthDescText       = ko.observable("traffic_limit_time_h");		        

+        target.limitTimeMonthDesc           = ko.computed(sf_limitTimeMonthDesc);

+        target.alertTimeReachDescData       = ko.observable("");       	

+        target.alertTimeReachDesc           = ko.computed(sf_alertTimeReachDesc);

+        target.leftTimeDescData             = ko.observable("");        

+        target.leftTimeDesc                 = ko.computed(sf_leftTimeDesc);

+        target.save                         = sf_save;		

+        target.viewEditUsedData             = ko.observable(false);

+        target.editUsedDataHandler          = sf_editUsedDataHandler;

+        target.editUsedDataSaveHandler      = sf_editUsedDataSaveHandler;		

+        target.saveUsedData                 = sf_saveUsedData;		

+        target.editUsedDataCancelHandler    = sf_editUsedDataCancelHandler;

+        target.viewEditTotalData            = ko.observable(false);

+		target.editTotalDataHandler         = sf_editTotalDataHandler;

+		target.editTotalDataSaveHandler     = sf_editTotalDataSaveHandler;

+        target.editTotalDataCancelHandler   = sf_editTotalDataCancelHandler;

+        target.viewEditAlertData            = ko.observable(false);

+		target.editAlertDataHandler         = sf_editAlertDataHandler;

+		target.editAlertDataSaveHandler     = sf_editAlertDataSaveHandler;

+		target.editAlertDataCancelHandler   = sf_editAlertDataCancelHandler;

+        target.viewEditUsedTime             = ko.observable(false);

+		target.editUsedTimeHandler          = sf_editUsedTimeHandler;	

+		target.saveUsedTime                 = sf_saveUsedTime;

+		target.editUsedTimeSaveHandler      = sf_editUsedTimeSaveHandler;

+		target.editUsedTimeCancelHandler    = sf_editUsedTimeCancelHandler;

+		target.viewEditTotalTime            = ko.observable(false);

+		target.editTotalTimeHandler         = sf_editTotalTimeHandler ;

+        target.editTotalTimeSaveHandler     = sf_editTotalTimeSaveHandler;	

+		target.editTotalTimeCancelHandler   = sf_editTotalTimeCancelHandler;

+		target.viewEditAlertTime            = ko.observable(false);

+        target.editAlertTimeHandler         = sf_editAlertTimeHandler;		

+        target.editAlertTimeSaveHandler     = sf_editAlertTimeSaveHandler;

+        target.editAlertTimeCancelHandler   = sf_editAlertTimeCancelHandler;

+        sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);		

+

+

+        // ��������������

+		function sf_alertDataReachDesc() {

+            if(isNaN(target.limitDataMonth() * target.selectedDataUnit() * target.alertDataReach())) {

+                target.alertDataReachDescData(target.alertDataReach() + ', ');

+                return $.i18n.prop('traffic_alert_reach_text', target.alertDataReach(), ' ');

+            }

+

+            var s_value = transUnit(target.limitDataMonth() * target.selectedDataUnit() * target.alertDataReach() * 1048576 / 100, false);

+            target.alertDataReachDescData(target.alertDataReach() + ',' + s_value);

+            return $.i18n.prop('traffic_alert_reach_text', target.alertDataReach(), s_value);

+        }

+		// ʱ������������

+        function sf_alertTimeReachDesc() {

+            if(isNaN(target.limitTimeMonth() * target.alertTimeReach())) {

+                target.alertTimeReachDescData(target.alertTimeReach() + ', ');

+                return $.i18n.prop('traffic_alert_reach_text', target.alertTimeReach(), ' ');

+            }

+            var s_value = transSecond2Time(target.limitTimeMonth() * target.selectedTimeUnit() * target.alertTimeReach() / 100);

+            target.alertTimeReachDescData(target.alertTimeReach() + ',' + s_value);

+            return $.i18n.prop('traffic_alert_reach_text', target.alertTimeReach(), s_value);

+        }	

+

+

+        // ��������ֵȡ���༭��ť�¼�

+		function sf_editAlertDataCancelHandler() {

+            target.alertDataReach(sv_trafficStaticalInfo.getEle('editAlertData').data('oldValue'));

+            target.viewEditAlertData(false);

+        }		

+

+        // ��������ֵ�༭��ť�¼�

+		function sf_editAlertDataHandler() {

+            sv_trafficStaticalInfo.getEle('editAlertData').data('oldValue', target.alertDataReach());

+            target.viewEditAlertData(true);

+        }

+

+        // ��������ֵ�����༭��ť�¼�

+		function sf_editAlertDataSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('alertDataReach').valid()) {

+                target.viewEditAlertData(false);

+            }

+        }

+

+        // ʱ������ֵȡ���༭��ť�¼�

+		function sf_editAlertTimeCancelHandler() {

+            target.alertTimeReach(sv_trafficStaticalInfo.getEle('editAlertTime').data('oldValue'));

+            target.viewEditAlertTime(false);

+        }	 

+        // ʱ������ֵ�༭��ť�¼�

+		function sf_editAlertTimeHandler() {

+            sv_trafficStaticalInfo.getEle('editAlertTime').data('oldValue', target.alertTimeReach());

+            target.viewEditAlertTime(true);

+        } 		

+        // ʱ������ֵ�����༭��ť�¼�

+		function sf_editAlertTimeSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('alertTimeReach').valid()) {

+                target.viewEditAlertTime(false);

+            }

+        }		

+

+        // �ײ������༭��ť�¼�

+		function sf_editTotalDataHandler() {

+            sv_trafficStaticalInfo.getEle('editTotalData').data('oldValue', target.limitDataMonth());

+            sv_trafficStaticalInfo.getEle('selectedDataUnit').data('oldValue', target.selectedDataUnit());

+            target.viewEditTotalData(true);

+        }

+

+        // �ײ����������༭��ť�¼�

+		function sf_editTotalDataSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('limitDataMonth').valid()) {

+                target.usedDataText(transUnit(target.limitDataMonth() * target.selectedDataUnit() * 1048576, false));

+                target.viewEditTotalData(false);

+            }

+        }

+

+        // �ײ�����ȡ���༭��ť�¼�

+		function sf_editTotalDataCancelHandler() {

+            target.limitDataMonth(sv_trafficStaticalInfo.getEle('editTotalData').data('oldValue'));

+            target.selectedDataUnit(sv_trafficStaticalInfo.getEle('selectedDataUnit').data('oldValue'));

+            target.viewEditTotalData(false);

+        }

+        // �ײ�ʱ��ȡ���༭��ť�¼�

+		function sf_editTotalTimeCancelHandler() {

+            target.limitTimeMonth(sv_trafficStaticalInfo.getEle('editTotalTime').data('oldValue'));

+            target.viewEditTotalTime(false);

+        }       

+        // �ײ�ʱ���༭��ť�¼�

+		function sf_editTotalTimeHandler() {

+            sv_trafficStaticalInfo.getEle('editTotalTime').data('oldValue', target.limitTimeMonth());

+            target.viewEditTotalTime(true);

+        }       

+        // �ײ�ʱ�䱣���༭��ť�¼�

+		function sf_editTotalTimeSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('limitTimeMonth').valid()) {

+                target.viewEditTotalTime(false);

+            }

+        }		

+

+        // ��������ȡ���༭��ť�¼�

+		function sf_editUsedDataCancelHandler() {

+            target.dataUsed(sv_trafficStaticalInfo.getEle('editUsedData').data('oldValue'));

+            target.selectedDataUsedUnit(sv_trafficStaticalInfo.getEle('selectedDataUsedUnit').data('oldValue'));

+            sv_trafficStaticalInfo.getEle('editUsedDataCancel').siblings('label.error').hide();

+            target.viewEditUsedData(false);

+        }	

+        // ���������༭��ť�¼�

+		function sf_editUsedDataHandler() {

+            sv_trafficStaticalInfo.getEle('editUsedData').data('oldValue', target.dataUsed());

+            sv_trafficStaticalInfo.getEle('selectedDataUsedUnit').data('oldValue', target.selectedDataUsedUnit());

+            target.dataUsed(target.dataUsed());

+            target.viewEditUsedData(true);

+        }	

+        // �����������水ť�¼�

+		function sf_editUsedDataSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('dataUsed').valid()) {

+                sv_usedDataModified = true;

+                target.viewEditUsedData(false);

+            }

+        }		

+        // ����ʱ��ȡ���༭��ť�¼�

+		function sf_editUsedTimeCancelHandler() {

+            target.usedTime(sv_trafficStaticalInfo.getEle('editUsedTime').data('oldValue'));

+            target.viewEditUsedTime(false);

+        }		

+        // ����ʱ���༭��ť�¼�

+		function sf_editUsedTimeHandler() {

+            sv_trafficStaticalInfo.getEle('editUsedTime').data('oldValue', target.usedTime());

+            target.viewEditUsedTime(true);

+        }

+

+        // ����ʱ�䱣���༭��ť�¼�

+		function sf_editUsedTimeSaveHandler() {

+            if (sv_trafficStaticalInfo.getEle('usedTime').valid()) {

+                target.monthlyConnectedTime(transSecond2Time(parseFloat(target.usedTime()) * target.selectedTimeUsedUnit()));

+                target.viewEditUsedTime(false);

+                sv_usedTimeModified = true;

+            }

+        }

+

+		// ʣ������������	

+        function sf_leftDataDesc() {

+            var s_left = (target.limitDataMonth() * target.selectedDataUnit() - target.dataUsed() * target.selectedDataUsedUnit()) * 1048576;

+            if(s_left < 0) {

+                s_left = 0;

+            }

+

+            if(isNaN(s_left)) {

+                target.leftDataDescData('');

+                return $.i18n.prop('traffic_data_left_text', ' ');

+            }

+

+            target.leftDataDescData(transUnit(s_left, false));

+            return $.i18n.prop('traffic_data_left_text', transUnit(s_left, false));

+        }	

+		//ʣ��ʱ��������

+		function sf_leftTimeDesc() {

+            var s_surplus = target.limitTimeMonth() * target.selectedTimeUnit() - sv_trafficStaticalInfo.getTrafficTimeToSeconds(target.monthlyConnectedTime());

+            if(s_surplus < 0) {

+                s_surplus = 0;

+            }

+

+            if(isNaN(s_surplus)) {

+                target.leftTimeDescData(' ');

+                return $.i18n.prop('traffic_data_left_text', ' ');

+            }

+            target.leftTimeDescData(transSecond2Time(s_surplus));

+            return $.i18n.prop('traffic_data_left_text', transSecond2Time(s_surplus));

+        }

+		// �ײ�����������

+		function sf_limitDataMonthDesc() {

+            if(isNaN(target.limitDataMonth())) {

+                target.limitDataMonthDescData("");

+                return $.i18n.prop('traffic_limit_data_text', ' ');

+            }else{

+			    // todo

+			}

+

+            target.limitDataMonthDescData(target.limitDataMonth() + sv_trafficStaticalInfo.getTrafficUnitByScale(target.selectedDataUnit()));

+            return $.i18n.prop('traffic_limit_data_text', target.limitDataMonth() + sv_trafficStaticalInfo.getTrafficUnitByScale(target.selectedDataUnit()));

+        }	

+		// �ײ�ʱ��������	

+		function sf_limitTimeMonthDesc() {

+            if(isNaN(target.limitTimeMonth())) {

+                target.limitTimeMonthDescData(' ');

+				target.limitTimeMonthDescText('traffic_limit_time_h');

+                return $.i18n.prop('traffic_limit_time_h', ' ');

+            }else{

+			    // todo:

+			}

+

+            target.limitTimeMonthDescData(target.limitTimeMonth());

+

+			if(target.selectedTimeUnit() == "60"){

+				target.limitTimeMonthDescText('traffic_limit_time_m');

+				return $.i18n.prop('traffic_limit_time_m', target.limitTimeMonth());

+			}else{

+				target.limitTimeMonthDescText('traffic_limit_time_h');

+				return $.i18n.prop('traffic_limit_time_h', target.limitTimeMonth());

+			}		

+        }

+

+        // Ӧ�ð�ť�¼�

+        function sf_save() {

+            if (sv_trafficStaticalInfo.isFormEditable(target) && target.dataLimitChecked() == '1') {

+                return false;

+            }

+

+            if (target.selectedDataUnit() == '1' && target.selectedDataUsedUnit() == '1048576' && target.dataLimitTypeChecked() == "1" && target.dataLimitChecked() == '1' && !(parseInt(target.dataUsed(), 10) < parseInt('4096', 10)) ) {

+                showAlert('traffic_over_note');

+				return false;

+            }

+

+            showLoading();

+            service.setTrafficAlertInfo({

+			    alertDataReach: parseInt(target.alertDataReach(), 10),

+				alertTimeReach: parseInt(target.alertTimeReach(), 10),

+                dataLimitChecked: target.dataLimitChecked(),

+                dataLimitTypeChecked: target.dataLimitTypeChecked(),

+                limitDataMonth: target.limitDataMonth() + "_" + target.selectedDataUnit(),             

+                limitTimeMonth: target.selectedTimeUnit() == "60" ? target.limitTimeMonth()/60 : target.limitTimeMonth()//save by hours               

+            }, function (data) {

+                if (data.result == 'success') {

+                    if(target.dataLimitTypeChecked() == "1" && sv_usedDataModified) {

+                        target.saveUsedData();

+                    } else if(target.dataLimitTypeChecked() == "0" && sv_usedTimeModified) {

+                        target.saveUsedTime();

+                    } else {

+                        sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                        sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                        status.setTrafficAlertPopuped(false);

+                        successOverlay();

+                    }

+                } else {

+                    errorOverlay();

+                }

+            }, function () {

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                errorOverlay();

+            });

+        }		

+

+        // ����������������	

+		function sf_saveUsedData() {

+            var val = target.dataUsed() * target.selectedDataUsedUnit();

+            service.trafficCalibration({

+                way: 'data',

+                value: val

+            }, function(){

+                sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                successOverlay();

+                target.viewEditUsedData(false);

+                status.setTrafficAlertPopuped(false);

+                sv_usedDataModified = false;

+            }, function(){

+                sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                errorOverlay();

+            });

+        }	

+

+

+

+		function sf_saveUsedTime() {

+            service.trafficCalibration({

+                way: 'time',

+                value: target.selectedTimeUsedUnit() == "60" ? parseFloat(target.usedTime())/60 : target.usedTime()

+            }, function(){

+                sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                successOverlay();

+                target.monthlyConnectedTime(transSecond2Time(parseFloat(target.usedTime()) * target.selectedTimeUsedUnit()));

+                target.viewEditUsedTime(false);

+                status.setTrafficAlertPopuped(false);

+                sv_usedTimeModified = false;

+            }, function(){

+                sv_trafficStaticalInfo.fetchTrafficAlertInfo();

+                sv_trafficStaticalInfo.refreshFlowDiagramInfo(target);

+                errorOverlay();

+            });

+        }	

+

+

+        // ��������������	

+		function sf_usedDataTextDesc() {

+            if(isNaN(target.dataUsed())) {

+                target.usedDataTextDescData("");

+                return $.i18n.prop('traffic_used_text', ' ');

+            }

+            target.usedDataTextDescData(target.dataUsed() + sv_trafficStaticalInfo.getTrafficUnitByScale(target.selectedDataUsedUnit()));

+            return $.i18n.prop('traffic_used_text', target.dataUsed() + sv_trafficStaticalInfo.getTrafficUnitByScale(target.selectedDataUsedUnit()));

+        }		

+        // ����ʱ��������

+        function sf_usedTimeTextDesc() {

+            target.usedTimeTextDescData(target.monthlyConnectedTime());

+            return $.i18n.prop('traffic_used_text', target.monthlyConnectedTime());

+        }			

+

+

+    }

+

+    function init() {

+        sv_trafficGraph = echarts.init($("#traffic_graphic")[0]);

+        window.onresize = sv_trafficGraph.resize;

+        var s_container = $('#container');

+        ko.cleanNode(s_container[0]);

+        var fwVm = new trafficViewModel();

+        ko.applyBindings(fwVm, s_container[0]);

+        $('#trafficAlertForm').validate({

+            submitHandler: function () {

+                fwVm.save();

+            },

+

+

+            errorPlacement: function (error, para) {

+                if (para.attr("name") == "alertDataReach") {

+                    error.insertAfter("#editAlertDataDiv");

+                } else if (para.attr("name") == "alertTimeReach") {

+                    error.insertAfter("#editAlertTimeDiv");

+                } else if (para.attr("name") == "dataUsed") {

+                    error.insertAfter("#editUsedDataDiv");

+                } else if (para.attr("name") == "limitDataMonth") {

+                    error.insertAfter("#editTotalDataDiv");

+                } else if (para.attr("name") == "limitTimeMonth") {

+                    error.insertAfter("#editTotalTimeDiv");

+                } else if (para.attr("name") == "usedTime") {

+                    error.insertAfter("#editUsedTimeDiv");

+                } else {

+                    error.insertAfter(para);

+                }

+            },

+

+            rules: {

+			    alertDataReach: {

+                    range: [ 1, 100 ],

+					digits: true

+                },

+                alertTimeReach: {

+                    range: [ 1, 100 ],

+                    digits: true

+                },

+                dataUsed: {

+					range : [ 0, 9999 ],

+					decimalRange : true

+                },

+                limitDataMonth: {

+					range : [ 1, 9999 ],

+					decimalRange : true

+                },

+                limitTimeMonth: {

+					range : [ 1, 9999 ],

+					decimalRange : true

+                },

+				usedTime: {

+					range : [ 0, 9999 ],

+					decimalRange : true

+                }  

+            }			

+

+        });

+

+		var sv_originalLan = window.language;

+		window.setInterval(function(){			

+			if(sv_originalLan != window.language){

+				sv_originalLan = window.language;

+				sv_trafficStaticalInfo.refreshFlowDiagramInfo(fwVm);

+			}

+        }, 1000);

+

+    }

+

+    return {

+        init: init

+    };

+});

+

+// ״̬����ʾ��ʵ��

+define("tooltip",[ "jquery" ], 

+

+	function($) {	

+

+

+			// ����Ԫ��λ����Ϣ

+			// @method calculatePositionInfo

+			// @param trigger Ԫ��

+			// @param tooltip ״̬��

+			// @param {JSON} config �����

+

+			function calculatePositionInfo(trigger, tooltip, config) {

+				var top      = trigger.offset().top; 

+				var left     = trigger.offset().left; 

+				var position = config.position[0];

+				var height   = tooltip.outerHeight() + trigger.outerHeight();

+				var width    = tooltip.outerWidth() + trigger.outerWidth();

+

+				top         -= tooltip.outerHeight() - config.offset[0];

+				left        += trigger.outerWidth()  + config.offset[1];

+

+				if (/iPad/i.test(navigator.userAgent)) {

+					top -= $(window).scrollTop();

+				}

+

+				if (position == 'center') {

+					top += height / 2;

+				}

+				if (position == 'bottom') {

+					top += height;

+				}

+				position = config.position[1];

+				if (position == 'center') {

+					left -= width / 2;

+				}else if (position == 'left') {

+					left -= width;

+				}

+

+				return {

+					top : top,

+					left : left

+				};

+			}	

+

+			// ״̬����ʼ��

+			function init() {

+

+				$(".statusItem", "#statusBar").each(function(i, n){

+					var $this = $(this);

+					$this.attr("tipTitle", $this.attr("title")).removeAttr("title");

+				}).hover(

+						function() {

+							var $this = $(this);

+							var title = $this.attr("tipTitle");

+							var tooltip = $("<div>").addClass("tooltip in").appendTo(document.body).hide()

+									.append($this.attr("i18n") ? $.i18n.prop(title) : title);

+							if ($this.attr("i18n")) {

+								tooltip.attr("data-trans", title).attr("id", "tooltip_" + $this.attr("id"));

+							}

+							var pos = calculatePositionInfo($this, tooltip, {

+								position : [ 'bottom', 'center' ],

+								offset : [ 0, 0 ]

+							});

+							tooltip.css({

+								position : 'absolute',

+								top : pos.top,

+								left : pos.left

+							}).show();

+						}, function() {

+							$(".tooltip").hide().remove();

+						});

+			}

+

+			return {

+				init : init

+			};

+		});

+

+define("menu","set service knockout underscore jquery".split(" "),

+    function (set, fnc, libko, libus, libjq) {

+    var displayMenuWhenLogout = false;

+    var vmMenu;

+    var menu = [];

+    var menuResource = "";

+

+    function menuExistCheck(path) {

+        for (var i = 0; i < menu.length; i++) {

+            if (menu[i].path == path) {

+                return true;

+            }

+        }

+        return false;

+    }

+

+    function getIsLoggedin() {

+        var loginStatus = fnc.getLoginStatus();

+        return (loginStatus.status == "loggedIn");

+    }

+

+    function buildNew() {

+        var loggedIn = getIsLoggedin();

+        var menuMain = libus.filter(menu, function (param) {

+            return (param.level == '1' && ((param.requireLogin && loggedIn) || !param.requireLogin) && param.hash != "#entry");

+        });

+        vmMenu.menuMain(menuMain);

+        vmMenu.loggedIn(loggedIn);

+

+        getMainWth(vmMenu.menuMain().length);

+        vmMenu.showMenu(loggedIn || displayMenuWhenLogout);

+        libjq("#nav").translate();

+    }

+

+    function getMainWth(len) {

+        var width = 100 / len;

+        libjq('ul#list-nav li').each(function () {

+            libjq(this).css('width', width + '%');

+        });

+    }

+

+    function menuRefresh() {

+        var currentHash = window.location.hash;

+        var itmRoot = libus.find(menu, function (param) {

+            return param.hash == currentHash;

+        });

+        while (itmRoot.parent) {

+            itmRoot = libus.find(menu, function (param) {

+                return param.hash == itmRoot.parent;

+            });

+        }

+        if (!itmRoot.parent) {

+            libjq("#list-nav li").removeClass("active");

+            var mid = itmRoot.hash.substring(1, itmRoot.hash.length);

+            libjq("#list-nav li[mid=" + mid + "]").addClass("active");

+        }

+        vmMenu.changeMenu(itmRoot);

+    }

+

+    function menuSearch(hashVal) {

+        hashVal = hashVal || window.location.hash;

+        var loggedIn = getIsLoggedin();

+        return libus.filter(menu, function (param) {

+            return (hashVal == param.hash && ((param.requireLogin && loggedIn) || !param.requireLogin));

+        });

+    }

+

+    function menuRenderSub(level, baseItem) {

+        var levelItem = libus.find(menu, function (param) {

+            return param.parent == baseItem.hash && param.path == baseItem.path;

+        });

+        libjq(".menu-" + level + "-level").removeClass("active");

+        if (levelItem) {

+            if (level == "two") {

+                menuRenderSub("three", levelItem);

+                //forward/backward support

+                clickMenuTrig(levelItem.hash, level);

+            }

+            libjq(".menu-" + level + "-level." + levelItem.hash.substring(1)).addClass("active");

+        }

+    }

+

+    function menuActSub() {

+        var currentHash = window.location.hash;

+        var itmRoot = libus.find(menu, function (param) {

+            return param.hash == currentHash;

+        });

+        if (itmRoot.level == 1) {

+            menuRenderSub("two", itmRoot);

+        }

+        if (itmRoot.level == 2) {

+            menuRenderSub("three", itmRoot);

+            //forward/backward support

+            clickMenuTrig(itmRoot.hash, itmRoot.level);

+        }

+        if (itmRoot.level == 3) {

+            //forward/backward support

+            clickMenuTrig(itmRoot.parent, itmRoot.level);

+            libjq(".menu-three-level").removeClass("active");

+            libjq(".menu-three-level." + itmRoot.hash.substring(1)).addClass("active");

+        }

+    }

+

+    function clickMenuTrig(hash, level) {

+        libjqobj = libjq(".menu-two-level." + hash.substring(1));

+        var levelArr = ['3', 'three', '2', 'two'];

+        if (libus.indexOf(levelArr, level) != -1 && libjqobj.hasClass('active')) {

+            return;

+        }

+

+        libjqobj.siblings().removeClass('active');

+        libjqobj.addClass('active');

+

+        libjqobj.siblings().not('.menu-two-level').slideUp();

+        libjqobj.next().has('ul li').slideDown();

+    }

+

+    set.blc_wan_mode = fnc.getOpMode().blc_wan_mode;

+    if (!set.RJ45_SUPPORT) {

+        menuResource = "menu";

+    } else {

+        switch (set.blc_wan_mode) {

+        case "PPPOE":

+        case "AUTO_PPPOE":

+            menuResource = "menu_pppoe";

+            break;

+        default:

+            menuResource = "menu";

+            break;

+        }

+    }

+

+    require([set.DEVICE + '/' + menuResource], function (otherMenu) {

+        menu = otherMenu;

+        if (set.SD_CARD_SUPPORT) {

+            menu = menu.concat([{ hash: '#httpshare_guest', path: 'sd_httpshare', level: '', requireLogin: false, checkSIMStatus: false}, 

+						{ hash: '#sdcard', path: 'sd', level: '', requireLogin: true, checkSIMStatus: false}, 

+						{ hash: '#httpshare', path: 'sd_httpshare', level: '', requireLogin: true, checkSIMStatus: false}]);

+        }

+    });

+

+    function initialize() {

+        vmMenu = new Menu_vm();

+    }

+

+    function Menu_vm() {

+        var loginState = getIsLoggedin();

+		var target = this;

+        target.loggedIn = libko.observable(loginState);

+

+        target.showMenu = libko.observable(loginState || displayMenuWhenLogout);

+

+        var menuMain = libus.filter(menu, function (param) {

+            return (param.level == '1' && ((param.requireLogin && target.loggedIn()) || !param.requireLogin) && param.hash != "#entry");

+        });

+

+        target.menuMain = libko.observableArray(menuMain);

+        target.secondMenu = libko.observableArray([]);

+        //target.curThirdMenu; cov_2

+        target.changeMenu = function (data) {

+            var secondMenu = getSubMenu(data);

+            if (secondMenu.length == 0) {

+                libjq("#container").addClass("fixContainerWidth");

+            } else {

+                libjq("#container").removeClass("fixContainerWidth");

+            }

+

+            target.secondMenu(secondMenu);

+            return true;

+        };

+        target.thirdMenu = function () {

+            return target.curThirdMenu;

+        };

+        target.getThirdMenu = function (data) {

+            target.curThirdMenu = getSubMenu(data);

+        };

+        function getSubMenu(data) {

+            return libus.filter(menu, function (param) {

+                return ((param.parent && param.parent == data.hash) && ((param.requireLogin && target.loggedIn()) || !param.requireLogin));

+            });

+        }

+    }

+

+    return {

+        activeSubMenu: menuActSub,

+        checkIsMenuExist: menuExistCheck,

+        findMenu: menuSearch,

+        rebuild: buildNew,

+        refreshMenu: menuRefresh,

+		init: initialize

+    };

+});

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/ext/menu.js b/lynq/MD310EU/ap/app/zte_webui/js/ext/menu.js
new file mode 100755
index 0000000..dc3a4e4
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/ext/menu.js
@@ -0,0 +1,313 @@
+define(function () {

+    var needLogin = true;

+    var menu = [{

+            hash: '#more',

+            path: 'adm_others',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_url',

+            path: 'firewall_url_filter',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin

+        }, {

+            hash: '#demilitarized_zone',

+            path: 'firewall_dmz_set',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#universal_plug_and_play',

+            path: 'firewall_upnp_set',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#map_port',

+            path: 'firewall_port_map',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#foward_port',

+            path: 'firewall_port_forward',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin

+        }, {

+            hash: '#filter_port',

+            path: 'firewall_port_filter',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_sleep',

+            path: 'wifi_sleep_mode',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pin_mode',

+            path: 'adm_pin',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#pwd_mode',

+            path: 'adm_management',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_mac',

+            path: 'wifi_mac_filter',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_wps',

+            path: 'wifi_wps',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_adv',

+            path: 'wifi_advance',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#conn_device',

+            path: 'wifi_station_info',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_guset',

+            path: 'wifi_guest',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_main',

+            path: 'wifi_main',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#fota',

+            path: 'ota_update',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#dynamic_dns',

+            path: 'ddns',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#cgdcont_set',

+            path: 'network_apn_set',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#network_choose',

+            path: 'network_net_select',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#conn_set',

+            path: 'network_dial_set',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#net_status',

+            path: 'network_info',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#wlan_station',

+            path: 'wifi_ap_station',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#msg_set',

+            path: 'sms_set',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#msg_sim',

+            path: 'sms_sim_messages',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#msg_list',

+            path: 'sms_list',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#flow_ctl',

+            path: 'status_traffic_alert',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_work_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_friend_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_family_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_com_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_all_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#usat',

+            path: 'ussd',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#route_set',

+            path: 'adm_lan',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_main',

+            path: 'firewall',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#local_set',

+            path: 'adm_management',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_basic',

+            path: 'wifi_basic',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#network_set',

+            path: 'network_dial_set_cpe',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#fast_set',

+            path: 'adm_quick_set',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        },

+        {

+            hash: '#child_ctl',

+            path: 'firewall_parental_control',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#normal_set',

+            path: 'adm_quick_set',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#pb_main',

+            path: 'phonebook',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#msg_main',

+            path: 'sms_list',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#main',

+            path: 'main',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#entry',

+            path: 'entry',

+            level: '1',

+            requireLogin: false,

+            checkSIMStatus: false

+        },

+    ];

+

+    return menu;

+});

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/ext/menu_pppoe.js b/lynq/MD310EU/ap/app/zte_webui/js/ext/menu_pppoe.js
new file mode 100755
index 0000000..52fddf8
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/ext/menu_pppoe.js
@@ -0,0 +1,313 @@
+define(function () {

+    var needLogin = true;

+    var menu = [{

+            hash: '#more',

+            path: 'adm_others',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_url',

+            path: 'firewall_url_filter',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin

+        }, {

+            hash: '#demilitarized_zone',

+            path: 'firewall_dmz_set',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#universal_plug_and_play',

+            path: 'firewall_upnp_set',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#map_port',

+            path: 'firewall_port_map',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#foward_port',

+            path: 'firewall_port_forward',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin

+        }, {

+            hash: '#filter_port',

+            path: 'firewall_port_filter',

+            level: '3',

+            parent: '#filter_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_sleep',

+            path: 'wifi_sleep_mode',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pin_mode',

+            path: 'adm_pin',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#pwd_mode',

+            path: 'adm_management',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_mac',

+            path: 'wifi_mac_filter',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_wps',

+            path: 'wifi_wps',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_adv',

+            path: 'wifi_advance',

+            level: '3',

+            parent: '#wlan_basic',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#conn_device',

+            path: 'wifi_station_info',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_guset',

+            path: 'wifi_guest',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_main',

+            path: 'wifi_main',

+            level: '3',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#fota',

+            path: 'ota_update',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#dynamic_dns',

+            path: 'ddns',

+            level: '3',

+            parent: '#local_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#cgdcont_set',

+            path: 'network_apn_set',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#network_choose',

+            path: 'network_net_select',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#conn_set',

+            path: 'network_dial_set',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#net_status',

+            path: 'network_info',

+            level: '3',

+            parent: '#network_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#wlan_station',

+            path: 'wifi_ap_station',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#msg_set',

+            path: 'sms_set',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#msg_sim',

+            path: 'sms_sim_messages',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#msg_list',

+            path: 'sms_list',

+            level: '2',

+            parent: '#msg_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#flow_ctl',

+            path: 'status_traffic_alert',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_work_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_friend_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_family_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_com_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#pb_all_grp',

+            path: 'phonebook',

+            level: '2',

+            parent: '#pb_main',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#usat',

+            path: 'ussd',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#route_set',

+            path: 'adm_lan',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#filter_main',

+            path: 'firewall',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#local_set',

+            path: 'adm_management',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#wlan_basic',

+            path: 'wifi_basic',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#network_set',

+            path: 'network_dial_set_cpe',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#fast_set',

+            path: 'adm_quick_set',

+            level: '2',

+            parent: '#normal_set',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        },

+        {

+            hash: '#child_ctl',

+            path: 'firewall_parental_control',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#normal_set',

+            path: 'adm_quick_set',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: true

+        }, {

+            hash: '#pb_main',

+            path: 'phonebook',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#msg_main',

+            path: 'sms_list',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#main',

+            path: 'main',

+            level: '1',

+            requireLogin: needLogin,

+            checkSIMStatus: false

+        }, {

+            hash: '#entry',

+            path: 'entry',

+            level: '1',

+            requireLogin: false,

+            checkSIMStatus: false

+        },

+    ];

+

+    return menu;

+});

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/ext/set_aic8800.js b/lynq/MD310EU/ap/app/zte_webui/js/ext/set_aic8800.js
new file mode 100755
index 0000000..f26d6c2
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/ext/set_aic8800.js
@@ -0,0 +1,68 @@
+define(function () {

+    var config = {

+        WEBUI_TITLE: '4G MiFi',

+        PRODUCT_TYPE: 'CPE', // ²úÆ·ÀàÐÍUFI¡¢CPE

+        HAS_BLACK_AND_WHITE_FILTER: true, //ÊÇ·ñÖ§³ÖºÚ°×Ãûµ¥

+        AP_STATION_SUPPORT: false,

+        MAX_STATION_NUMBER: 8,

+        STATION_BLOCK_SUPPORT: true, // ÒÑÁ¬½ÓÉ豸ÊÇ·ñÖ§³ÖBlock¹¦ÄÜ

+        HAS_MULTI_SSID: false, //¶àssid¹¦ÄÜ

+        WIFI_BANDWIDTH_SUPPORT_40MHZ: true, //Ƶ´ø¿í¶ÈÊÇ·ñÖ§³Ö40MHZ,reltekоƬ֧³Ö

+        WIFI_BANDWIDTH_SUPPORT: true,

+        WIFI_BAND_SUPPORT: true,

+        SD_CARD_SUPPORT: false, //ÊÇ·ñÖ§³ÖSD¿¨

+        DDNS_SUPPORT: false, //DDNS

+        NETWORK_UNLOCK_SUPPORT: true,

+        NETWORK_MODES : [ {

+            name : '802.11 b/g/n/ax',

+            value : '6'

+        } ],

+        WIFI_SUPPORT_QR_CODE: true,

+        HAS_PHONEBOOK: false,

+        HAS_BATTERY: true, //ÊÇ·ñÓÐµç³Ø

+		FAST_BOOT_SUPPORT: false, //ÊÇ·ñÖ§³Ö¿ìËÙ¿ª»ú

+        TURN_OFF_SUPPORT: true, //ÊÇ·ñÖ§³Ö¹Ø»ú

+		WIFI_SLEEP_SUPPORT: true, // ÊÇ·ñÖ§³ÖwifiÐÝÃß

+        HAS_USSD: false, // ÊÇ·ñÖ§³ÖUSSD

+		HAS_URL: true, // 是否支持URL过滤

+        //station¼ÓÃÜģʽ

+        AUTH_MODES_ALL: [{

+                name: 'NO ENCRYPTION',

+                value: 'OPEN'

+            }, {

+                name: 'SHARED',

+                value: 'SHARED'

+            }, {

+                name: 'WPA-PSK',

+                value: 'WPAPSK'

+            }, {

+                name: 'WPA2-PSK',

+                value: 'WPA2PSK'

+            }, {

+                name: 'WPA-PSK/WPA2-PSK',

+                value: 'WPAPSKWPA2PSK'

+            }, {

+                name: 'WPA3-Personal',

+                value: 'WPA3Personal'

+            }, {

+                name: 'WPA2(AES)/WPA3-Personal',

+                value: 'WPA2WPA3'

+            }

+        ],

+        AUTO_MODES: [{

+                name: 'Automatic',

+                value: 'NETWORK_auto'

+            }, {

+                name: '4G Only',

+                value: 'Only_LTE'

+            }

+        ],

+        WIFI_SLEEP_MODES: [{

+                name: 'turn off',

+                value: '1'

+            }

+        ]

+    };

+

+    return config;

+});

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/main.js b/lynq/MD310EU/ap/app/zte_webui/js/main.js
new file mode 100755
index 0000000..fa447ca
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/main.js
@@ -0,0 +1,122 @@
+require.config({

+    shim: {

+        knockoutbase: ['jq_tmpl'],

+        jq_additional: ['jq_validate'],

+        jq_simplemodal: ['3rd/twbs.bootstrap'],

+        jq_translate: ['jq_i18n'],

+    },

+    paths: {

+        base64: '3rd/webtoolkit.base64',

+        echarts: '3rd/apache.echarts',

+        knockout: '3rd/knockout',

+        knockoutbase: '3rd/knockout.base',

+        jq_additional: '3rd/jquery.additional-methods',

+        jq_chosen: '3rd/jquery.chosen',

+        jq_fileinput: '3rd/jquery.fileinput',

+        jq_i18n: '3rd/jquery.i18n',

+        jq_simplemodal: '3rd/jquery.simplemodal',

+        jq_tmpl: '3rd/jquery.tmpl',

+        jq_translate: '3rd/jquery.translate',

+        jq_validate: '3rd/jquery.validate',

+        jquery: '3rd/require-jquery',

+        jqui: '3rd/jqui',

+        text: '3rd/require-text',

+        tmpl: '../subpg',

+        underscore: '3rd/underscore',

+        service: 'com',

+

+        CryptoJS: '3rd/crypto-js',

+

+        menu: 'com',

+        adm_lan: 'com',

+        adm_others: 'com',

+        adm_management: 'com',

+        adm_pin: 'com',

+        adm_quick_set: 'com',

+        main: 'com',

+        language: 'com',

+        entry: 'com',

+        logout: 'com',

+        opmode: 'com',

+        opmode_popup: 'com',

+        router: 'com',

+        statusBar: 'com',

+        status_traffic_alert: 'com',

+        tooltip: 'com',

+

+        phonebook: 'sim_device',

+        sim_abnormal: 'sim_device',

+        ota_update: 'sim_device',

+        sd: 'sim_device',

+        sd_httpshare: 'sim_device',

+        sms_set: 'sim_device',

+        sms_sim_messages: 'sim_device',

+        sms_list: 'sim_device',

+        ussd: 'sim_device',

+        network_apn_set: 'net',

+        network_dial_set: 'net',

+        network_dial_set_cpe: 'net',

+		network_info: 'net',

+        locknet: 'net',

+        network_net_select: 'net',

+        ddns: 'net',

+        firewall: 'net',

+        firewall_dmz_set: 'net',

+        firewall_parental_control: 'net',

+        firewall_port_filter: 'net',

+        firewall_port_forward: 'net',

+        firewall_port_map: 'net',

+        firewall_upnp_set: 'net',

+        firewall_url_filter: 'net',

+        wifi_advance: 'wifi',

+        wifi_ap_station: 'wifi',

+        wifi_guest: 'wifi',

+        wifi_mac_filter: 'wifi',

+        wifi_main: 'wifi',

+        wifi_sleep_mode: 'wifi',

+        wifi_station_info: 'wifi',

+        wifi_wps: 'wifi',

+    },

+

+});

+

+require("set service lib".split(" "),

+    function (set, fnc, util) {

+    function initAndLoad(cfg) {

+        require([cfg.menu, cfg.set], function (params) {

+            require("menu language logout statusBar router entry jq_additional jq_translate jq_simplemodal base64".split(" "),

+                function (menu, language, logout, statusBar, router, entry) {

+                menu.init();

+                language.init();

+                router.init();

+                logout.init();

+                statusBar.init();

+            });

+        });

+    }

+    if (!set.RJ45_SUPPORT) {

+        initAndLoad({

+            set: set.DEVICE + '/set',

+            menu: set.DEVICE + '/menu'

+        });

+    } else {

+        var tmp = "menu";

+        fnc.getOpMode({}, function (mod) {

+            set.blc_wan_mode = mod.blc_wan_mode;

+            switch (mod.blc_wan_mode) {

+            case "AUTO_PPPOE":

+            case "PPPOE":

+                tmp = "menu_pppoe";

+                break;

+            default:

+                tmp = "menu";

+                break;

+            }

+            initAndLoad({

+                set: set.DEVICE + '/set',

+                menu: set.DEVICE + '/' + tmp

+            });

+        });

+    }

+

+});

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/net.js b/lynq/MD310EU/ap/app/zte_webui/js/net.js
new file mode 100755
index 0000000..650aeb5
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/net.js
@@ -0,0 +1,4262 @@
+

+define("firewall_url_filter","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //system url filter setting VM

+

+    function UrlFilterSettingVM() {

+        var target = this;

+        var urlFltInfo = service.getUrlFilterList();

+        var columnsTmpl = [{

+                columnType: "checkbox",

+                rowText: "index",

+                width: "30%"

+            }, {

+                headerTextTrans: "url",

+                rowText: "url",

+                width: "70%"

+            }

+        ];

+        target.rules = ko.observableArray(urlFltInfo.urlFilterRules);

+

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            data: target.rules(),

+            idName: "index",

+            columns: columnsTmpl,

+            tmplType: 'list',

+            pageSize: 10

+        });

+

+        target.clear = clearFunc;

+

+        target.callback = callbackFunc;

+		//删除规则

+

+        target.deleteRule = deleteRuleFunc;

+

+        //添加规则

+

+        target.addRule = addRuleFunc;

+		function callbackFunc(elem) {

+            if (elem.result != "success") {

+                errorOverlay();                

+            } else {

+				target.clear();

+                initialize(target);

+                successOverlay();

+                $("#urlFilters").translate();

+            }

+		}

+

+		//添加规则

+		function addRuleFunc() {

+            if (target.rules().length >= config.urlFilterMax) {

+                showAlert({

+                    msg: "url_filter_max",

+                    params: config.urlFilterMax

+                });

+                return false;

+            }

+            var tmpArr = [];

+            for (var idx = 0; idx < target.rules().length; idx++) {

+                tmpArr.push(target.rules()[idx].url);

+            }

+            if ($.inArray($("#addURLFilter").val(), tmpArr) != -1) {

+                showAlert("url_repeated");

+                return false;

+            }

+

+            showLoading();

+            var urlFltParams = {

+                goformId: "URL_FILTER_ADD",

+                addURLFilter: $("#addURLFilter").val()

+            };

+            service.addUrlFilterRule(urlFltParams, target.callback);

+        }

+		//删除规则

+		function deleteRuleFunc() {

+            showConfirm('confirm_data_delete', function () {

+                showLoading();

+                var urlFltParams = {

+                    goformId: "URL_FILTER_DELETE",

+                    url_filter_delete_id: target.gridTemplate.selectedIds().join(";") + ";"

+                };

+                service.deleteSelectedRules(urlFltParams, target.callback);

+            });

+        }

+

+    }

+

+		function clearFunc() {

+            $("#addURLFilter").val("");

+        }

+

+    //页面初始化

+

+    function initialize() {

+

+        var vm = new UrlFilterSettingVM();

+		bindContainer(vm);

+    }

+	function bindContainer(vm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+        $('#urlFilterForm').validate({

+            submitHandler: function () {

+                vm.addRule();

+            },

+            rules: {

+                addURLFilter: 'url_filter_check'

+            }

+        });

+

+        $("#urlFilterListForm").validate({

+            submitHandler: function () {

+                vm.deleteRule();

+            }

+        });

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall_upnp_set","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //system upnp setting VM

+

+    function UpnpSettingVM() {

+        var target = this;

+        var upnpInfo = getUpnpSetting();

+

+        target.upnpSetting = ko.observable(upnpInfo.upnpSetting);

+

+        target.save = saveFunc;

+		function saveFunc() {

+            showLoading();

+            var upnpParams = {};

+            upnpParams.upnpSetting = target.upnpSetting();

+            service.setUpnpSetting(upnpParams, function (rlt) {

+                if (rlt.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+

+        }

+    }

+

+

+    //获取upnp 信息

+

+    function getUpnpSetting() {

+        return service.getUpnpSetting();

+    }

+

+    //初始化UpnpSettingVM model

+

+    function initialize() {

+

+        var vm = new UpnpSettingVM();

+		bindContainer(vm);

+

+    }

+	function bindContainer(vm) {

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+        $('#upnpSettingForm').validate({

+            submitHandler: function () {

+                vm.save();

+            }

+        });

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall_upnp_set","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //system upnp setting VM

+

+    function UpnpSettingVM() {

+        var target = this;

+        var upnpInfo = getUpnpSetting();

+

+        target.upnpSetting = ko.observable(upnpInfo.upnpSetting);

+

+        target.save = saveFunc;

+		function saveFunc() {

+            showLoading();

+            var upnpParams = {};

+            upnpParams.upnpSetting = target.upnpSetting();

+            service.setUpnpSetting(upnpParams, function (rlt) {

+                if (rlt.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+

+        }

+    }

+

+

+    //获取upnp 信息

+

+    function getUpnpSetting() {

+        return service.getUpnpSetting();

+    }

+

+    //初始化UpnpSettingVM model

+

+    function initialize() {

+

+        var vm = new UpnpSettingVM();

+		bindContainer(vm);

+

+    }

+	function bindContainer(vm) {

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+        $('#upnpSettingForm').validate({

+            submitHandler: function () {

+                vm.save();

+            }

+        });

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+//端口映射

+

+define("firewall_port_map","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var protocolModes = _.map(config.MAP_PROTOCOL_MODES, function (ele) {

+        return new Option(ele.name, ele.value);

+    });

+

+    var columnsTmpl = [{

+            columnType: "checkbox",

+            rowText: "index",

+            width: "8%"

+        }, {

+            headerTextTrans: "source_port",

+            rowText: "sourcePort",

+            width: "20%"

+        }, {

+            headerTextTrans: "dest_ip_address",

+            rowText: "destIpAddress",

+            width: "20%"

+        }, {

+            headerTextTrans: "dest_port",

+            rowText: "destPort",

+            width: "20%"

+        }, {

+            headerTextTrans: "protocol",

+            rowText: "protocol",

+            width: "12%"

+        }, {

+            headerTextTrans: "comment",

+            rowText: "comment",

+            width: "20%"

+        }

+    ];

+

+    //prot_map VM

+

+    function PortMapVM() {

+        var target = this;

+        var mapInfo = getPortMap();

+

+        target.oriPortMapEnable = ko.observable(mapInfo.portMapEnable);

+        target.rules = ko.observableArray(mapInfo.portMapRules);

+        target.portMapEnable = ko.observable(mapInfo.portMapEnable);

+

+

+        target.comment = ko.observable('');

+        target.selectedMode = ko.observable('TCP&UDP');

+        target.modes = ko.observableArray(protocolModes);

+

+        target.destPort = ko.observable('');

+        target.destIpAddress = ko.observable('');

+        target.sourcePort = ko.observable('');

+

+

+

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            data: target.rules(),

+            idName: "index",

+            columns: columnsTmpl,

+            tmplType: 'list',

+            pageSize: 10

+        });

+

+        //设定,新增,删除回调函数

+

+        target.callback = callbackFunc;

+

+		//删除规则

+

+        target.deleteMapRules = deleteMapRulesFunc;

+

+		//检查新增规则是否已经存在

+

+        target.checkExist = checkExistFunc;

+

+        //设定端口映射

+

+        target.enablePortMap = enablePortMapFunc;

+

+        //保存规则

+

+        target.save = saveFunc;

+

+		//保存规则

+		function saveFunc() {

+            if (target.rules().length >= config.portForwardMax) {

+                showAlert({

+                    msg: "rules_max",

+                    params: config.portForwardMax

+                });

+                return;

+            }

+

+            if (target.checkExist()) {

+                showAlert("rule_exist");

+                return;

+            }

+

+            showLoading();

+            var mapParams = {};

+            mapParams.portMapEnable = target.portMapEnable();

+            mapParams.sourcePort = target.sourcePort();

+            mapParams.destIpAddress = target.destIpAddress();

+            mapParams.destPort = target.destPort();

+            mapParams.protocol = target.selectedMode();

+            mapParams.comment = target.comment();

+            service.setPortMap(mapParams, target.callback);

+        }

+

+		//检查新增规则是否已经存在

+		function checkExistFunc() {

+            var newMapRule = {

+                sourcePort: target.sourcePort(),

+                destIpAddress: target.destIpAddress(),

+                destPort: target.destPort(),

+                protocol: transProtocolValue(target.selectedMode())

+            };

+

+            var oldMapRule;

+            var mapRules = target.rules();

+            for (var idx = 0; idx < mapRules.length; idx++) {

+                oldMapRule = {

+                    sourcePort: mapRules[idx].sourcePort,

+                    destIpAddress: mapRules[idx].destIpAddress,

+                    destPort: mapRules[idx].destPort,

+                    protocol: mapRules[idx].protocol

+                };

+

+                if (_.isEqual(newMapRule, oldMapRule)) {

+                    return true;

+                }

+            }

+            return false;

+        }

+

+		//设定端口映射

+		function enablePortMapFunc() {

+            showLoading();

+            var mapParams = {};

+            mapParams.portMapEnable = target.portMapEnable();

+            service.enablePortMap(mapParams, target.callback);

+        }

+

+		//删除规则

+		function deleteMapRulesFunc() {

+            var ids = target.gridTemplate.selectedIds();

+            if (ids.length == 0) {

+                showAlert("no_data_selected");

+                return;

+            }

+

+            showConfirm("confirm_data_delete", function () {

+                showLoading();

+                var mapParams = {};

+                mapParams.indexs = ids;

+                service.deleteMapRules(mapParams, target.callback);

+            });

+        }

+

+		//设定,新增,删除回调函数

+		function callbackFunc(ret) {

+            if (ret.result == "success") {

+                clear();

+                initialize(target);

+                successOverlay();

+            } else {

+                errorOverlay();

+            }

+        }

+

+        //情况添加规则输入

+

+        function clear() {

+            target.sourcePort('');

+            target.destIpAddress('');

+            target.destPort('');

+            target.selectedMode('TCP&UDP');

+            target.comment('');

+        }

+    }

+

+    //获取port map信息

+

+    function getPortMap() {

+        return service.getPortMap();

+    }

+

+	function bindingContainer(vm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+

+	}

+    //初始化port map view model

+

+    function initialize(viewModel) {

+        var vm;

+        if (viewModel) {

+            vm = viewModel;

+            var mapInfo = getPortMap();

+            vm.portMapEnable(mapInfo.portMapEnable);

+            vm.oriPortMapEnable(mapInfo.portMapEnable);

+            vm.rules(mapInfo.portMapRules);

+            vm.gridTemplate.clearAllChecked();

+            vm.gridTemplate.data(mapInfo.portMapRules);

+            refreshTableHeight();

+            renderCheckbox();

+            return;

+        }

+

+        vm = new PortMapVM();

+        bindingContainer(vm);

+        fixTableHeight();

+

+        $('#mapBasicForm').validate({

+            submitHandler: function () {

+                vm.enablePortMap();

+            }

+        });

+

+        $('#portMapListForm').validate({

+            submitHandler: function () {

+                vm.deleteMapRules();

+            }

+        });

+

+        $('#portMapForm').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtDestIpAddress: {

+                    ip_check: true

+                },

+                txtSourcePort: {

+                    digits: true,

+                    range_except: [1, 65000]

+                },

+                txtDestPort: {

+                    digits: true,

+                    range_except: [1, 65000]

+                },

+                txtComment: {

+                    comment_check: true

+                }

+            },

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "txtDestIpAddress") {

+                    error.appendTo("#txtDestIpAddressErrorDiv");

+                } else if (element.attr("name") == "txtSourcePort") {

+                    error.appendTo("#txtSourcePortErrorDiv");

+                } else if (element.attr("name") == "txtDestPort") {

+                    error.appendTo("#txtDestPortErrorDiv");

+                } else

+                    error.insertAfter(element);

+            }

+        });

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+//端口转发

+

+define("firewall_port_forward","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var protocolModes = _.map(config.FORWARD_PROTOCOL_MODES, function (ele) {

+        return new Option(ele.name, ele.value);

+    });

+    //列表模板的columns项

+

+    var columnsTmpl = [{

+            columnType: "checkbox",

+            rowText: "index",

+            width: "8%"

+        }, {

+            headerTextTrans: "ip_address",

+            rowText: "ipAddress",

+            width: "23%"

+        }, {

+            headerTextTrans: "port_range",

+            rowText: "portRange",

+            width: "23%"

+        }, {

+            headerTextTrans: "protocol",

+            rowText: "protocol",

+            width: "23%"

+        }, {

+            headerTextTrans: "comment",

+            rowText: "comment",

+            width: "23%"

+        }

+    ];

+

+    //prot_forward VM

+

+    function PortForwardVM() {

+        var target = this;

+        var fwdinfo = getPortForward();

+

+        target.portForwardEnable = ko.observable(fwdinfo.portForwardEnable);

+        target.oriPortForwardEnable = ko.observable(fwdinfo.portForwardEnable);

+

+        target.portEnd = ko.observable('');

+        target.portStart = ko.observable('');

+        target.ipAddress = ko.observable('');

+

+        target.comment = ko.observable('');

+        target.selectedMode = ko.observable('3');

+        target.modes = ko.observableArray(protocolModes);

+

+        target.rules = ko.observableArray(fwdinfo.portForwardRules);

+

+		//设定,新增,删除回调函数

+

+        target.callback = callbackFunc;

+

+        //创建列表模板

+

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            data: target.rules(),

+            idName: "index",

+            columns: columnsTmpl,

+            tmplType: 'list',

+            pageSize: 10

+        });

+

+        //检查新增规则是否已经存在

+

+        target.checkExist = checkExistFunc;

+

+		//保存规则

+

+        target.save = saveFunc;

+

+		//删除规则

+

+        target.deleteForwardRules = deleteForwardRulesFunc;

+

+        //设定虚拟服务器

+

+        target.enableVirtualServer = enableVirtualServerFunc;

+

+		//设定虚拟服务器

+		function enableVirtualServerFunc() {

+            showLoading();

+            var fwdParams = {};

+            fwdParams.portForwardEnable = target.portForwardEnable();

+            service.enableVirtualServer(fwdParams, target.callback);

+        }

+

+		//删除规则

+		function deleteForwardRulesFunc() {

+            var ids = target.gridTemplate.selectedIds();

+            if (ids.length == 0) {

+                showAlert("no_data_selected");

+                return;

+            }

+

+            showConfirm("confirm_data_delete", function () {

+                showLoading('deleting');

+                var fwdParams = {};

+                fwdParams.indexs = ids;

+                service.deleteForwardRules(fwdParams, target.callback);

+            });

+        }

+

+		//保存规则

+		function saveFunc() {

+            if (target.rules().length >= config.portForwardMax) {

+                showAlert({

+                    msg: "rules_max",

+                    params: config.portForwardMax

+                });

+                return;

+            }

+

+            if (target.checkExist()) {

+                showAlert("rule_exist");

+                return;

+            }

+

+            showLoading();

+            var fwdParams = {};

+            fwdParams.comment = target.comment();

+            fwdParams.protocol = target.selectedMode();

+            fwdParams.portEnd = target.portEnd();

+            fwdParams.portStart = target.portStart();

+            fwdParams.ipAddress = target.ipAddress();

+            service.setPortForward(fwdParams, target.callback);

+        }

+         //情况添加规则输入

+        function clear() {

+            target.ipAddress('');

+            target.portStart('');

+            target.portEnd('');

+            target.selectedMode('TCP&UDP');

+            target.comment('');

+        }

+

+		//设定,新增,删除回调函数

+		function callbackFunc(ret) {

+            if (ret.result == "success") {

+                clear();

+                initialize(target);

+                successOverlay();

+            } else {

+                errorOverlay();

+            }

+        }

+

+		//检查新增规则是否已经存在

+		function checkExistFunc() {

+            var newRule = {

+                ipAddress: target.ipAddress(),

+                portRange: target.portStart() + ' - ' + target.portEnd(),

+                protocol: transProtocolValue(target.selectedMode())

+            };

+

+            var oldRule;

+            var fwdrules = target.rules();

+            for (var ki = 0; ki < fwdrules.length; ki++) {

+                oldRule = {

+                    ipAddress: fwdrules[ki].ipAddress,

+                    portRange: fwdrules[ki].portRange,

+                    protocol: fwdrules[ki].protocol

+                };

+

+                if (_.isEqual(newRule, oldRule)) {

+                    return true;

+                }

+            }

+            return false;

+        }

+    }

+

+    //获取port forward信息

+

+    function getPortForward() {

+        return service.getPortForward();

+    }

+

+    //初始化port forward view model

+

+    function initialize(viewModel) {

+        var vm;

+        if (viewModel) {

+            vm = viewModel;

+            var fwdinfo = getPortForward();

+            vm.gridTemplate.clearAllChecked();

+            vm.gridTemplate.data(fwdinfo.portForwardRules);

+            vm.rules(fwdinfo.portForwardRules);

+            vm.portForwardEnable(fwdinfo.portForwardEnable);

+            vm.oriPortForwardEnable(fwdinfo.portForwardEnable);

+            refreshTableHeight();

+            return;

+        }

+

+        vm = new PortForwardVM();

+        bindContainer(vm);

+

+        fixTableHeight();

+        renderCheckbox();

+

+        $('#virtualServerForm').validate({

+            submitHandler: function () {

+                vm.enableVirtualServer();

+            }

+        });

+

+        $('#portForwardListForm').validate({

+            submitHandler: function () {

+                vm.deleteForwardRules();

+            }

+        });

+

+        $('#portForwardForm').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtIpAddress: {

+                    ip_check: true

+                },

+                txtPortStart: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtPortEnd"

+                },

+                txtPortEnd: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtPortStart"

+                },

+                txtComment: {

+                    comment_check: true

+                }

+            },

+            groups: {

+                range: "txtPortStart txtPortEnd"

+            },

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "txtIpAddress") {

+                    error.appendTo("#ipErrorDiv");

+                } else if (element.attr("name") == "txtPortStart" || element.attr("name") == "txtPortEnd") {

+                    error.appendTo("#portRangeErrorDiv");

+                } else

+                    error.insertAfter(element);

+            }

+        });

+    }

+

+	function bindContainer(vm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+

+	}

+

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall_port_filter","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var PROTOCOLS = {

+        ICMP: 'ICMP',

+        NONE: 'None'

+    };

+

+    var columnsTmpl = [{

+            columnType: "checkbox",

+            rowText: "index",

+            width: "4%"

+        }, {

+            headerTextTrans: "mac_address",

+            rowText: "macAddress",

+            width: "12%"

+        }, {

+            headerTextTrans: "ip_type",

+            rowText: "ipType",

+            width: "5%",

+            display: config.IPV6_SUPPORT

+        }, {

+            headerTextTrans: "source_ip_address",

+            rowText: "sourceIpAddress",

+            width: "12%"

+        }, {

+            headerTextTrans: "dest_ip_address",

+            rowText: "destIpAddress",

+            width: "12%"

+        }, {

+            headerTextTrans: "protocol",

+            rowText: "protocol",

+            width: "12%",

+            needTrans: true

+        }, {

+            headerTextTrans: "source_port_range",

+            rowText: "sourcePortRange",

+            width: "12%"

+        }, {

+            headerTextTrans: "dest_port_range",

+            rowText: "destPortRange",

+            width: "12%"

+        }, {

+            headerTextTrans: "port_filter_action",

+            rowText: "action",

+            width: "12%",

+            needTrans: true

+        }, {

+            headerTextTrans: "comment",

+            rowText: "comment",

+            width: "12%"

+        }

+    ];

+

+    var protocolModes = _.map(config.FILTER_PROTOCOL_MODES, function (elem) {

+        return new Option(elem.name, elem.value);

+    });

+    //prot_filter VM

+

+    function PortFilterVM() {

+        var target = this;

+        var info = getPortFilter();

+

+        target.oriDefaultPolicy = ko.observable(info.defaultPolicy);

+        target.defaultPolicy = ko.observable(info.defaultPolicy);

+        target.oriPortFilterEnable = ko.observable(info.portFilterEnable);

+        target.portFilterEnable = ko.observable(info.portFilterEnable);

+        target.rules = ko.observableArray(info.portFilterRules);

+

+        target.ipv6Support = ko.observable(config.IPV6_SUPPORT);

+        target.comment = ko.observable('');

+        target.selectedMode = ko.observable('5');

+        target.modes = ko.observableArray(protocolModes);

+        target.sourcePortEnd = ko.observable('');

+        target.sourcePortStart = ko.observable('');

+        target.destPortEnd = ko.observable('');

+        target.destPortStart = ko.observable('');

+        target.destIpv6Address = ko.observable('');

+        target.sourceIpv6Address = ko.observable('');

+        target.sourceIpAddress = ko.observable('');

+        target.destIpAddress = ko.observable('');

+        target.macAddress = ko.observable('');

+        target.portFilterAction = ko.observable('');

+

+        target.ipType = ko.observable('ipv4');

+

+        //设定,新增,删除回调函数

+

+        target.callback = callbackFunc;

+

+        //创建列表模板

+

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            data: target.rules(),

+            idName: "index",

+            columns: columnsTmpl,

+            tmplType: 'list',

+            pageSize: 20

+        });

+        //default policy change handler

+

+        target.policyChangeHandler = policyChangeHandlerFunc;

+

+        //保存规则

+

+        target.save = saveFunc;

+

+        //设定过滤基本信息

+

+        target.setPortFilterBasic = setPortFilterBasicFunc;

+

+		//清空添加规则输入

+

+        target.clear = clearFunc;

+

+        //检查新增规则是否已经存在

+

+        target.checkExist = checkExistFunc;

+

+		//ip类型变化事件监听

+

+        target.ipTypeChangeHandler = ipTypeChangeHandlerFunc;

+

+        //协议变化事件监听

+

+        target.protocolChangeHandler = protocolChangeHandlerFunc;

+

+        //删除规则

+

+        target.deleteFilterRules = deleteFilterRulesFunc;

+

+        //init to call

+        target.policyChangeHandler();

+

+		//设定,新增,删除回调函数

+		function callbackFunc(ret) {

+            if (ret.result != "success") {

+                errorOverlay();

+            } else {

+                target.clear();

+                initialize(target);

+                successOverlay();

+            }

+        }

+		//default policy change handler

+		function policyChangeHandlerFunc() {

+            var action = target.defaultPolicy() != "1" ? "Drop" : "Accept";

+            target.portFilterAction(action);

+            return true;

+        }

+

+		//保存规则

+		function saveFunc() {

+            target.sourceIpAddress(target.sourceIpAddress().replace(/\s+/g, ''));

+            target.destIpAddress(target.destIpAddress().replace(/\s+/g, ''));

+            target.sourceIpv6Address(target.sourceIpv6Address().replace(/\s+/g, ''));

+            target.destIpv6Address(target.destIpv6Address().replace(/\s+/g, ''));

+            target.macAddress(target.macAddress().replace(/\s+/g, ''));

+            if (target.ipv6Support() == false) {

+                if (target.rules().length >= config.portForwardMax) {

+                    showAlert({

+                        msg: "rules_max",

+                        params: config.portForwardMax

+                    });

+                    return;

+                }

+

+                if (target.checkExist()) {

+                    showAlert("rule_exist");

+                    return;

+                }

+

+            } else {

+				var type = target.ipType() == "ipv4" ? "IPv4" : "IPv6";

+                var oldRules = _.filter(target.rules(), function (item) {

+                    return item.ipType == type;

+                });

+

+                if (oldRules.length >= config.portForwardMax) {

+                    showAlert({

+                        msg: "rules_max_v4v6",

+                        params: [type, config.portForwardMax]

+                    });

+                    return;

+                }

+

+                if (target.checkExist()) {

+                    showAlert({

+                        msg: "rule_exist_v4v6",

+                        params: type

+                    });

+                    return;

+                }

+            }

+            showConfirm("confirm_data_effect", function () {

+                showLoading();

+                var fltParams = {};

+                fltParams.macAddress = target.macAddress();

+

+                if (target.ipv6Support() && target.ipType() != 'ipv6') {

+                    fltParams.destIpAddress = target.destIpAddress();

+                    fltParams.sourceIpAddress = target.sourceIpAddress();

+                } else {

+                    fltParams.destIpAddress = target.destIpv6Address();

+                    fltParams.sourceIpAddress = target.sourceIpv6Address();

+                }

+

+                fltParams.ipType = target.ipType();

+                fltParams.comment = target.comment();

+                fltParams.protocol = target.selectedMode();

+                fltParams.action = target.portFilterAction();

+                fltParams.sourcePortEnd = target.sourcePortEnd();

+                fltParams.sourcePortStart = target.sourcePortStart();

+                fltParams.destPortEnd = target.destPortEnd();

+                fltParams.destPortStart = target.destPortStart();

+                service.setPortFilter(fltParams, target.callback);

+            });

+        }

+

+		//设定过滤基本信息

+		function setPortFilterBasicFunc() {

+            showLoading();

+            var elems = {};

+            elems.defaultPolicy = target.defaultPolicy();

+            elems.portFilterEnable = target.portFilterEnable();

+            service.setPortFilterBasic(elems, target.callback);

+        }

+		//清空添加规则输入

+		function clearFunc() {

+            target.comment('');

+            target.selectedMode('None');

+            target.sourcePortEnd('0');

+            target.sourcePortStart('0');

+            target.destPortEnd('0');

+            target.destPortStart('0');

+            target.sourceIpv6Address('');

+            target.sourceIpAddress('');

+            target.destIpv6Address('');

+            target.destIpAddress('');

+            target.macAddress('');

+            clearValidateMsg();

+        }

+

+		//检查新增规则是否已经存在

+		function checkExistFunc() {

+            target.macAddress(target.macAddress().toUpperCase());

+            var currIpType = target.ipType().toUpperCase();

+            var newRule = {

+                macAddress: target.macAddress(),

+                destIpAddress: currIpType == "IPV4" ? target.destIpAddress() : target.destIpv6Address(),

+                sourceIpAddress: currIpType == "IPV4" ? target.sourceIpAddress() : target.sourceIpv6Address(),

+                destPortRange: target.destPortStart() == '0' ? '' : target.destPortStart() + ' - ' + target.destPortEnd(),

+                sourcePortRange: target.sourcePortStart() == '0' ? '' : target.sourcePortStart() + ' - ' + target.sourcePortEnd(),

+                action: target.portFilterAction() == "Drop" ? "filter_drop" : "filter_accept",

+                protocol: transProtocolValue(target.selectedMode()),

+                ipType: currIpType

+            };

+

+            var oldRule;

+            var rules = target.rules();

+            for (var ki = 0; ki < rules.length; ki++) {

+                oldRule = {

+                    macAddress: rules[ki].macAddress,

+                    destIpAddress: rules[ki].destIpAddress,

+                    sourceIpAddress: rules[ki].sourceIpAddress,

+                    destPortRange: rules[ki].destPortRange,

+                    sourcePortRange: rules[ki].sourcePortRange,

+                    action: rules[ki].action,

+                    protocol: rules[ki].protocol,

+                    ipType: rules[ki].ipType.toUpperCase()

+                };

+

+                if (_.isEqual(newRule, oldRule)) {

+                    return true;

+                }

+            }

+            return false;

+        }

+

+		//协议变化事件监听

+		function protocolChangeHandlerFunc() {

+            if (target.selectedMode() == PROTOCOLS.ICMP || target.selectedMode() == PROTOCOLS.NONE) {

+                target.sourcePortEnd('0');

+                target.sourcePortStart('0');

+                target.destPortEnd('0');

+                target.destPortStart('0');

+                clearValidateMsg('#portRangeArea');

+            } else {

+                target.sourcePortEnd('65535');

+                target.sourcePortStart('1');

+                target.destPortEnd('65535');

+                target.destPortStart('1');

+            }

+            return true;

+        }

+

+		//删除规则

+		function deleteFilterRulesFunc() {

+            var ids = target.gridTemplate.selectedIds();

+            if (ids.length == 0) {

+                showAlert("no_data_selected");

+                return;

+            }

+

+            showConfirm("confirm_data_effect", function () {

+                showLoading('deleting');

+                var rules = {};

+                rules.indexs = ids;

+                service.deleteFilterRules(rules, target.callback);

+            });

+        }

+

+    }

+

+    //获取port filter信息

+

+    function getPortFilter() {

+        return service.getPortFilter();

+    }

+

+	//ip类型变化事件监听

+	function ipTypeChangeHandlerFunc() {

+        clearValidateMsg();

+        return true;

+    }

+

+    //初始化port filter view model

+

+    function initialize(viewModel) {

+        var vm;

+        if (viewModel) {

+            vm = viewModel;

+            var fltinfo = getPortFilter();

+            vm.gridTemplate.clearAllChecked();

+            vm.gridTemplate.data(fltinfo.portFilterRules);

+			vm.defaultPolicy(fltinfo.defaultPolicy);

+            vm.oriDefaultPolicy(fltinfo.defaultPolicy);

+            vm.portFilterEnable(fltinfo.portFilterEnable);

+            vm.oriPortFilterEnable(fltinfo.portFilterEnable);

+            vm.rules(fltinfo.portFilterRules);

+            refreshTableHeight();

+            $('#portFilters').find('tbody').translate();

+            renderCheckbox();

+            $('.notes-content').translate();

+            return;

+        }

+

+        vm = new PortFilterVM();

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+

+        fixTableHeight();

+

+        $('#filterBasicForm').validate({

+            submitHandler: function () {

+                showConfirm("confirm_data_effect", function () {

+                    vm.setPortFilterBasic();

+                });

+            }

+        });

+

+        $('#portFilterListForm').validate({

+            submitHandler: function () {

+                vm.deleteFilterRules();

+            }

+        });

+

+        $('#portFilterForm').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtMacAddress: {

+                    filter_optional: true,

+                    mac_check: true

+                },

+                txtDestIpAddress: {

+                    ip_check: true

+                },

+                txtSourceIpAddress: {

+                    ip_check: true

+                },

+                txtSourceIpv6Address: {

+                    ipv6: true

+                },

+                txtDestIpv6Address: {

+                    ipv6: true

+                },

+                txtDestPortStart: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtDestPortEnd"

+                },

+                txtDestPortEnd: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtDestPortStart"

+                },

+                txtSourcePortStart: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtSourcePortEnd"

+                },

+                txtSourcePortEnd: {

+                    digits: true,

+                    range: [1, 65535],

+                    portCompare: "#txtSourcePortStart"

+                },

+

+                txtComment: {

+                    comment_check: true

+                }

+            },

+            groups: {

+                destPort: "txtDestPortStart txtDestPortEnd",

+                sourcePort: "txtSourcePortStart txtSourcePortEnd"

+            },

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "txtMacAddress") {

+                    error.appendTo("#macErrorDiv");

+                } else if (element.attr("name") == "txtDestPortStart" || element.attr("name") == "txtDestPortEnd") {

+                    error.appendTo("#destPortErrorDiv");

+                } else if (element.attr("name") == "txtSourcePortStart" || element.attr("name") == "txtSourcePortEnd") {

+                    error.appendTo("#sourcePortErrorDiv");

+                } else

+                    error.insertAfter(element);

+            }

+        });

+    }

+

+    $.validator.addMethod("filter_optional", function (value, element, param) {

+        var result = _.any(['#txtMacAddress', '#txtDestIpAddress', '#txtSourceIpAddress', '#txtSourceIpv6Address', '#txtDestIpv6Address'],

+                function (item) {

+            var tmp = $(item).val().replace(/\s+/g, '');

+            return $(item + ':visible').length > 0 && tmp != '';

+        });

+

+        var portResult = _.any(['#txtDestPortStart', '#txtDestPortEnd', '#txtSourcePortStart', '#txtSourcePortEnd'],

+                function (item) {

+            return $(item).val() != '0';

+        });

+

+        return result || portResult;

+    });

+

+    return {

+        init: initialize

+    };

+});

+

+//家长控制

+

+define("firewall_parental_control","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var maxItem = 10;

+    var pcVm = null;

+    var PAGES = {

+        MAIN: 0,

+        MANAGE: 1,

+        RULE: 2

+    };

+

+

+    function ParentalControlVM() {

+        var target = this;

+        var hostNameList = service.getHostNameList({}).devices;

+        target.currentPage = ko.observable(PAGES.MAIN);

+        target.pages = PAGES;

+

+

+        target.childGroupList = ko.observable([]);

+        target.childGroupMac = ko.computed(function () {

+            return _.map(target.childGroupList(), function (data) {

+                return data.mac;

+            });

+        });

+

+        target.currentUserInChildGroup = ko.observable(true);

+        //获取儿童组设备列表

+

+        target.fetchChildGroupList = fetchChildGroupListFunc;

+

+        target.fetchChildGroupList();

+

+        target.manageHandler = manageHandlerFunc;

+		function manageHandlerFunc() {

+            target.currentPage(PAGES.MANAGE);

+            target.fetchAttachedDevices();

+        }

+        target.attachedDevices = ko.observable([]);

+        //获取已连接设备列表

+

+        target.fetchAttachedDevices = fetchAttachedDevicesFunc;

+

+

+		//儿童组设备 标签按钮事件

+

+        target.backToMainHandler = backToMainHandlerFunc;

+

+

+        ko.computed(function () {

+            target.attachedDevices();

+            target.childGroupList();

+            $("#pc_children_group_form").translate();

+        }).extend({

+            notify: 'always',

+            throttle: 300

+        });

+

+        //添加至儿童组

+

+        function addChildGroupFun(flag, eleData) {

+            showLoading();

+            service.addChildGroup(eleData, function (data) {

+                target.fetchChildGroupList(function () {

+                    target.fetchAttachedDevices(function () {

+                        hideLoading();

+                        if (flag) {

+                            service.logout({}, function () {

+                                window.location = 'index.html';

+                            });

+                        }

+                    });

+                });

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+

+        //移除按钮事件

+

+        target.removeChildGroupHandler = removeChildGroupHandlerFunc;

+

+

+        //添加按钮事件

+

+        target.addChildGroupHandler = addChildGroupHandlerFunc;

+

+

+        target.dealElement = dealElementFunc;

+

+

+

+        //取消编辑主机名按钮事件

+

+        target.cancelEditHostNameHandler = cancelEditHostNameHandlerFunc;

+

+        //主机名编辑保存按钮事件

+

+        target.saveHostNameHandler = saveHostNameHandlerFunc;

+

+        //主机名编辑按钮事件

+

+        target.editHostNameHandler = editHostNameHandlerFunc;

+

+

+        target.selectedIds = ko.observableArray([]);

+        target.siteList = ko.observable([]);

+        /////////////////////////////////////////////////////////////////

+        target.disableAdd = ko.computed(function () {

+            return target.siteList().length == maxItem;

+        });

+

+        ko.computed(function () {

+            target.siteList();

+            target.selectedIds();

+            setTimeout(function () {

+                renderCheckbox();

+            }, 100);

+            $("#pc_site_white_list_form").translate();

+        });

+

+        //网站白名单添加按钮事件

+

+        target.openAddSitePopoverHandler = openAddSitePopoverHandlerFunc;

+

+        //网站白名单列表选择框点击事件

+

+        target.checkboxClickHandler = checkboxClickHandlerFunc;

+

+		//获取网站白名单列表

+

+        target.fetchSiteWhiteList = fetchSiteWhiteListFunc;

+

+		//网站白名单删除函数

+

+        function removeSiteWhiteItem(ids) {

+            showConfirm('confirm_data_delete', function () {

+                showLoading();

+                service.removeSiteWhite({

+                    ids: ids

+                }, function (data) {

+                    target.fetchSiteWhiteList(function () {

+                        successOverlay();

+                    });

+                }, function (data) {

+                    target.fetchSiteWhiteList(function () {

+                        errorOverlay();

+                    });

+                });

+            });

+        }

+		//网站白名单删除所有按钮事件

+

+        target.removeAllWhiteSite = removeAllWhiteSiteFunc;

+

+        //网站白名单删除按钮事件

+

+        target.removeSelectedWhiteSite = removeSelectedWhiteSiteFunc;

+

+        //网站白名单移除按钮事件

+

+        target.removeWhiteSite = removeWhiteSiteFunc;

+

+

+

+        //网站白名单添加框保存按钮事件

+

+        target.saveSiteWhite = saveSiteWhiteFunc;

+

+        //////////////////////////////////////////////////////////////////

+        target.notSave = ko.observable(false);

+        //获取时间限制信息

+

+        target.fetchTimeLimited = fetchTimeLimitedFunc;

+

+

+        //上网时间设置时间表格事件绑定

+

+        target.bindEvent = bindEventFunc;

+

+		//上网时间设置保存按钮事件

+

+        target.saveTimeLimitedHandler = saveTimeLimitedHandlerFunc;

+

+        //////////////////////////////////////////////////////////////////

+        var isBinded = false;

+        //上网规则标签点击事件

+

+        target.openRulePage = openRulePageFunc;

+		function openRulePageFunc() {

+            if (target.currentPage() == PAGES.RULE) {

+                return;

+            }

+            target.currentPage(PAGES.RULE);

+            target.currentUserInChildGroup(service.checkCurrentUserInChildGroup().result);

+            initTableData();

+            if (!isBinded) {

+                if (!target.currentUserInChildGroup()) {

+                    target.bindEvent();

+                }

+                isBinded = true;

+            }

+            showLoading();

+            target.fetchTimeLimited();

+            target.fetchSiteWhiteList(function () {

+                hideLoading();

+            });

+        }

+

+		//获取儿童组设备列表

+		function fetchChildGroupListFunc(cb) {

+            service.childGroupList({}, function (data) {

+                target.currentUserInChildGroup(service.checkCurrentUserInChildGroup(data.devices).result);

+                target.childGroupList([]);

+                _.map(data.devices, function (elem, idx) {

+                    elem.idx = idx;

+                    elem.hostname = pcUtil.getHostName(elem.hostname, elem.mac, hostNameList);

+                });

+                target.childGroupList(data.devices);

+                if (_.isFunction(cb)) {

+                    cb.apply(this);

+                }

+            });

+		}

+

+		//获取已连接设备列表

+		function fetchAttachedDevicesFunc(cb) {

+            target.attachedDevices([]);

+            var counter = 0;

+            var currDevices = [];

+            //RJ45 已连接设备

+            service.getAttachedCableDevices({}, function (data) {

+                counter++;

+                var devs = _.map(data.attachedDevices, function (elem) {

+                    elem.idx = _.uniqueId('wireless_');

+                    elem.hostName = pcUtil.getHostName(elem.hostName, elem.macAddress, hostNameList);

+                    elem.inChildGroup = _.contains(target.childGroupMac(), elem.macAddress);

+                    return elem;

+                });

+                if (counter != 1) {

+                    target.attachedDevices(_.flatten([currDevices, devs]));

+                    if (_.isFunction(cb)) {

+                        cb.apply(this);

+                    }

+                } else {

+                    currDevices = devs;

+                }

+            });

+

+            //wifi 已连接设备

+            service.getCurrentlyAttachedDevicesInfo({}, function (data) {

+                counter++;

+                var devs = _.map(data.attachedDevices, function (elem) {

+                    elem.idx = _.uniqueId('wireless_');

+                    elem.hostName = pcUtil.getHostName(elem.hostName, elem.macAddress, hostNameList);

+                    elem.inChildGroup = _.contains(target.childGroupMac(), elem.macAddress);

+                    return elem;

+                });

+                if (counter != 1) {

+                    target.attachedDevices(_.flatten([currDevices, devs]));

+                    if (_.isFunction(cb)) {

+                        cb.apply(this);

+                    }

+                } else {

+                    currDevices = devs;

+                }

+            });

+		}

+		//儿童组设备 标签按钮事件

+		function backToMainHandlerFunc() {

+			target.currentPage(PAGES.MAIN);

+		}

+

+		//移除按钮事件

+		function removeChildGroupHandlerFunc(ele) {

+            showLoading();

+            service.removeChildGroup(ele, function (data) {

+                target.fetchChildGroupList(function () {

+                    target.fetchAttachedDevices(function () {

+                        hideLoading();

+                    });

+                });

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+

+		//添加按钮事件

+		function addChildGroupHandlerFunc(data) {

+            var uMacAddr = service.getCurretnMAC();

+            if (uMacAddr != data.macAddress) {

+                addChildGroupFun(false, data);

+            } else {

+                showConfirm("parental_add_self", function () {

+                    addChildGroupFun(true, data);

+                })

+            }

+        }

+

+		//取消编辑主机名按钮事件

+		function cancelEditHostNameHandlerFunc(eleData) {

+            target.dealElement(false, eleData.idx);

+        }

+

+		//主机名编辑保存按钮事件

+		function saveHostNameHandlerFunc(ele) {

+            var $hostInput = $("#hostname_input_" + ele.idx);

+            var hostname = $.trim($hostInput.val());

+			if (hostname.indexOf(" ") == 0 || hostname.lastIndexOf(" ") == (hostname.length - 1) || /[\*\+\$\[&:,;<>'"\\`\]¥]{1,32}/.test(hostname)) {

+                showAlert('modify_hostname_invalid');

+                return false;

+            }else if (hostname == '') {

+                $(".promptErrorLabel", "#confirm-message-container").text($.i18n.prop("required"));

+                var $closestTD = $hostInput.closest('td').addClass('has-error');

+                addTimeout(function () {

+                    $closestTD.removeClass('has-error');

+                }, 5000);

+                showAlert('required');

+                return false;

+            }  

+            showLoading();

+            ele.hostname = hostname;

+            service.editHostName(ele, function () {

+                service.getHostNameList({}, function (hostNameData) {

+                    hostNameList = hostNameData.devices;

+                    target.fetchChildGroupList(function () {

+                        hideLoading();

+                    });

+                    target.fetchAttachedDevices();

+                });

+            }, function () {

+                errorOverlay();

+            });

+        }

+

+		//主机名编辑按钮事件

+		function editHostNameHandlerFunc(ele) {

+            $("#hostname_input_" + ele.idx).val(ele.hostname);

+            target.dealElement(true, ele.idx);

+            return false;

+        }

+		//网站白名单添加按钮事件

+		function openAddSitePopoverHandlerFunc() {

+            var addNewSiteTmpl = $("#addNewSiteTmpl").html();

+            popover.open({

+                target: $("#openAddSiteBtn"),

+                html: addNewSiteTmpl,

+                width: "300px",

+                validation: addValidation

+            });

+        }

+

+		//网站白名单列表选择框点击事件

+		function checkboxClickHandlerFunc(eleData, evt) {

+            addTimeout(function () {

+                target.selectedIds(getSelectedValues());

+            }, 100);

+        }

+		//获取网站白名单列表

+		function fetchSiteWhiteListFunc(cb) {

+            service.getSiteWhiteList({}, function (eledata) {

+                target.selectedIds([]);

+                target.siteList(eledata.siteList);

+                _.isFunction(cb) && cb.apply(this);

+            }, function () {

+                target.siteList([]);

+                _.isFunction(cb) && cb.apply(this);

+            });

+        }

+

+		//网站白名单删除所有按钮事件

+		function removeAllWhiteSiteFunc() {

+            removeSiteWhiteItem(getAllCheckboxValues());

+        }

+		//网站白名单删除按钮事件

+		function removeSelectedWhiteSiteFunc() {

+            removeSiteWhiteItem(getSelectedValues());

+        }

+		//网站白名单移除按钮事件

+		function removeWhiteSiteFunc(ele, evt) {

+            removeSiteWhiteItem([ele.id]);

+        }

+

+		//网站白名单添加框保存按钮事件

+		function saveSiteWhiteFunc(name, site) {

+            popover.hide();

+            var matched = _.find(target.siteList(), function (one) {

+                return one.site == site;

+            });

+            if (matched) {

+                showAlert("pc_link_exist", function () {

+                    setTimeout(function () {

+                        popover.show();

+                    }, 200);

+                });

+                return false;

+            }

+

+            showLoading();

+            service.saveSiteWhite({

+                name: name,

+                site: site

+            }, function () {

+                target.fetchSiteWhiteList(function () {

+                    popover.close();

+                    successOverlay();

+                });

+            }, function () {

+                target.fetchSiteWhiteList(function () {

+                    errorOverlay();

+                    popover.show();

+                });

+            });

+        }

+

+		//上网时间设置时间表格事件绑定

+		function bindEventFunc() {

+            $("td:not('.col-head')", "#pc_time_limited_tbody").addClass('cursorhand').die().click(function () {

+                target.notSave(true);

+                $(this).toggleClass('active');

+            }).hover(function () {

+                var $this = $(this);

+                var w = $this.data('week');

+                var h = $this.data('hour');

+                $("tr:nth-child(" + (w + 1) + ") td:first-child", "#pc_time_limited_tbody").addClass('time_td_hover');

+                $("#col_" + h).addClass('time_td_hover');

+                if ($this.not('.active')) {

+                    $this.addClass('time_td_hover');

+                }

+            }, function () {

+                var $this = $(this);

+                var w = $this.data('week');

+                var h = $this.data('hour');

+                $("tr:nth-child(" + (w + 1) + ") td:first-child", "#pc_time_limited_tbody").removeClass('time_td_hover');

+                $("#col_" + h).removeClass('time_td_hover');

+                $this.removeClass('time_td_hover');

+            });

+        }

+

+		//上网时间设置保存按钮事件

+		function saveTimeLimitedHandlerFunc() {

+            showLoading();

+            var tds = getSelectedTds();

+            var timeStr = getSavedData(tds);

+            service.saveTimeLimited({

+                time: timeStr

+            }, function () {

+                target.notSave(false);

+                successOverlay();

+            }, function () {

+                errorOverlay();

+            });

+        }

+

+    }

+

+		function dealElementFunc(flag, idx) {

+            if (flag == false) {

+                $("#edit_btn_" + idx + ",#hostname_txt_" + idx).show();

+                $("#save_btn_" + idx + ",#cancel_btn_" + idx + ",#hostname_input_" + idx).hide();

+            } else {

+                $("#edit_btn_" + idx + ",#hostname_txt_" + idx).hide();

+                $("#save_btn_" + idx + ",#cancel_btn_" + idx + ",#hostname_input_" + idx).show();

+            }

+        }

+

+		//获取时间限制信息

+		function fetchTimeLimitedFunc() {

+            service.getTimeLimited({}, function (ele) {

+                for (var ki in ele) {

+                    for (var idx = 0; idx < ele[ki].length; idx++) {

+                        var id = 'td_' + ki + '_' + ele[ki][idx];

+                        $("#" + id).addClass('active');

+                    }

+                }

+            }, function () {});

+        }

+

+    var pcUtil = {

+        getHostName: function (hostName, mac, hostNameList) {

+            var ele = _.find(hostNameList, function (ele) {

+                return ele.mac == mac;

+            });

+            return ele ? ele.hostname : hostName;

+        }

+    };

+	function getCheckboxValues(flag) {

+        var selectedValues = [];

+        $(":checkbox" + (flag ? ":checked" : ""), "#pb_white_list").each(function (i, n) {

+            selectedValues.push(n.value)

+        });

+        return selectedValues;

+    }

+    //获取列表中被选中项的value值

+

+    function getSelectedValues() {

+        return getCheckboxValues(true);

+    }

+    function getAllCheckboxValues() {

+        return getCheckboxValues(false);

+    }

+

+    //增加网站白名单表单提交函数绑定和校验规则设置

+

+    function addValidation() {

+        $('#whiteSiteAddForm').validate({

+            submitHandler: function () {

+                var name = $("#siteName").val();

+                var site = $("#siteLink").val();

+                pcVm.saveSiteWhite(name, site);

+            },

+            rules: {

+                siteName: 'siteName_check',

+                siteLink: 'siteLink_check'

+            }

+        });

+    }

+

+    function getSavedData(timeDatas) {

+        var ret = '';

+        for (var ki in timeDatas) {

+            var hours = _.sortBy(timeDatas[ki], function (n) {

+                return n;

+            });

+            if (timeDatas[ki].length) {

+                ret += ki + '+';

+                ret += hours.join(',');

+                ret += ';'

+            }

+        }

+        return ret.substring(0, ret.length - 1);

+    }

+    //获取时间表格选中的时间

+

+    function getSelectedTds() {

+        var defaultValue = {

+            '0': [],

+            '1': [],

+            '2': [],

+            '3': [],

+            '4': [],

+            '5': [],

+            '6': []

+        };

+        $("td.active", "#pc_time_limited_tbody").each(function (i, n) {

+            var $this = $(n);

+            var week = $this.data('week');

+            var hour = $this.data('hour');

+            defaultValue[week].push(hour);

+        });

+        return defaultValue;

+    }

+

+	function convertHour(hour) {

+        if (hour <= 16) {

+            return hour + 7;

+        } else {

+            return hour - 17;

+        }

+    }

+    //初始化时间表格

+

+    function initTableData() {

+        $("tr", "#pc_time_limited_tbody").each(function (idx, n) {

+            var $tr = $(n);

+            $("td:not(:first)", $tr).each(function (j, m) {

+                var $td = $(m);

+                var hour = convertHour(j);

+                $td.attr({

+                    id: 'td_' + idx + '_' + hour

+                }).data({

+                    week: idx,

+                    hour: hour

+                });

+            });

+        });

+        $("td.active", "#pc_time_limited_tbody").removeClass("active");

+        $("thead td:not(:first)", "#pc_time_limited_form").each(function (idx, n) {

+            var hour = convertHour(idx);

+            $(n).attr({

+                id: 'col_' + hour

+            });

+        });

+        pcVm.notSave(false);

+    }

+

+

+    //页面初始化

+

+    function initialize() {

+

+        pcVm = new ParentalControlVM();

+		bindContainer(pcVm);

+    }

+	function bindContainer(pcVm)

+	{

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(pcVm, container[0]);

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall_dmz_set","underscore jquery knockout set service".split(" "),

+    function ( _, $, ko, config, service) {

+

+    //system dmz setting VM

+

+    function DmzSettingVM() {

+        var target = this;

+        var dmzInfo = getDmzSetting();

+        target.dmzSetting = ko.observable(dmzInfo.dmzSetting);

+        target.ipAddress = ko.observable(dmzInfo.ipAddress);

+        target.isDataCard = config.PRODUCT_TYPE == 'DATACARD';

+

+        target.clear = clearFunc;

+        //应用按钮事件

+

+        target.save = saveFunc;

+

+		function saveFunc() {

+			showLoading();

+			var params = {};

+			params.dmzSetting = target.dmzSetting();

+			params.ipAddress = target.ipAddress();

+			service.setDmzSetting(params, function (result) {

+				if (result.result != "success") {

+					errorOverlay();

+				} else {

+					target.clear();

+					successOverlay();

+				}

+			});

+		}

+

+    }

+

+	function clearFunc() {

+		initialize();

+    }

+

+

+    //获取dmz 信息

+

+    function getDmzSetting() {

+        return service.getDmzSetting();

+    }

+

+    //初始化DmzSettingVM model

+

+    function initialize() {

+

+        var dmzVm = new DmzSettingVM();

+        bindContainer(dmzVm);

+    }

+	function bindContainer(dmzVm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+		ko.applyBindings(dmzVm, container[0]);

+        $('#dmzSettingForm').validate({

+            submitHandler: function () {

+                dmzVm.save();

+            },

+            rules: {

+                txtIpAddress: 'dmz_ip_check'

+            }

+        });

+	}

+

+    return {

+        init: initialize

+    };

+});

+

+define("firewall","underscore jquery knockout set service".split(" "),

+

+function(_, $, ko, config, service) {

+

+    function FirewallVM() {

+        var target = this;

+		target.hasDdns = config.DDNS_SUPPORT;

+		target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+		target.hasUrlFilter = config.HAS_URL;

+		target.hasUssd = config.HAS_USSD;

+		target.hasUpnp = config.HAS_UPNP;

+    }

+

+	function initialize() {        

+        var fwVm = new FirewallVM();

+		bindingContainer(fwVm);

+    }

+	function bindingContainer(fwVm)

+	{

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(fwVm, container[0]);

+	}

+	return {

+		init : initialize

+	};

+});

+

+define("ddns","underscore jquery knockout set service".split(" "), function (_, $, ko, config, service) {

+    var ddnsSetModes = _.map(config.DDNSSetMode, newOption);

+    var ddnsProviderList = _.map(config.DDNSDDP, newOption);

+    var ddns_mode_select = _.map(config.ddns_Modeselect, newOption);

+    function newOption(optItem) {

+        return new Option(optItem.name, optItem.value);

+    }

+    function DdnsViewModel() {

+        var target = this;

+        target.hasUssd = config.HAS_USSD;

+        target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+        var data = service.getDdnsParams();

+        target.ddnsSetModes = ko.observableArray(ddnsSetModes);

+        target.ddnsProviderList = ko.observableArray(ddnsProviderList);

+        target.ddns_mode_select = ko.observableArray(ddns_mode_select);

+        target.currentMode = ko.observable(data.DDNS_Enable);

+        target.currentModeselect = ko.observable(data.DDNS_Mode);

+        target.currentProviderList = ko.observable("dyndns.org");

+        $.each(config.DDNSDDP, function (i, n) {

+            if (data.DDNSProvider == n.value) {

+                target.currentProviderList(data.DDNSProvider);

+            }

+        });

+        target.DDNSaccount = ko.observable(data.DDNSAccount);

+        target.DDNSpasswd = ko.observable(data.DDNSPassword);

+        target.DDNSname = ko.observable(data.DDNS);

+        target.DDNS_HashValue = ko.observable(data.DDNS_Hash_Value);

+        target.isddnsStatusTrans = ko.observable();

+        target.isEnableSet = ko.observable();

+        target.isHashValue = ko.observable();

+        target.isddnsaccount = ko.observable();

+        target.isddnspasswd = ko.observable();

+        target.isDDNSStatus = ko.observable();

+        target.isddnsdomainName = ko.observable();

+        target.isNone = ko.observable();

+        target.onStates = ko.observable();

+        target.showPassword_ddns = ko.observable(false);

+        target.showPasswordHandler_ddns = showPasswordHandler_ddns;

+        changeddnsProviderList();

+        target.changeDdnsProvider = changeDdnsProviderFunc;

+        changeSetDdnsMode();

+        target.changeSetDdnsMode = changeSetDdnsModeFunc;

+        updateScanDdnsStatus();

+        target.apply = applyFunc;

+        function updateScanDdnsStatus() {

+            var trans = "";

+            $.getJSON("/reqproc/proc_get", {

+                cmd: "getddns_status",

+                "_": new Date().getTime()

+            }, function (data) {

+                if (data.getddns_status == "0") {

+                    trans = "register successful";

+                    target.onStates(true);

+                } else if (data.getddns_status == "1") {

+                    trans = "login error";

+                    target.onStates(true);

+                } else if (data.getddns_status == "2") {

+                    trans = "network error";

+                    target.onStates(true);

+                } else if (data.getddns_status == "3") {

+                    trans = "registering";

+                    target.onStates(true);

+                } else if (data.getddns_status == "4") {

+                    trans = "not registered";

+                    target.onStates(true);

+                } else if (data.getddns_status == "5") {

+                    trans = "error registering";

+                    target.onStates(true);

+                } else if (data.getddns_status == "-1") {

+                    trans = "";

+                    target.onStates(true);

+                }

+                target.isddnsStatusTrans($.i18n.prop(trans));

+                addTimeout(updateScanDdnsStatus, 2000);

+            });

+        }

+        function changeSetDdnsMode() {

+            if (target.currentMode() != "1") {

+                target.isEnableSet(false);

+            } else {

+                target.isEnableSet(true);

+            }

+            return true;

+        }

+        function changeSetDdnsModeFunc() {

+            changeSetDdnsMode();

+        }

+        function showPasswordHandler_ddns() {

+            $("#ddns_secretcode_input").parent().find(".error").hide();

+            var checkbox = $("#showPassword_ddns:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword_ddns(true);

+            } else {

+                target.showPassword_ddns(false);

+            }

+        }

+        function changeDdnsProviderFunc() {

+            if (data.DDNSProvider != target.currentProviderList()) {

+                target.DDNSaccount("");

+                target.DDNSpasswd("");

+                target.DDNSname("");

+            } else {

+                target.DDNSaccount(data.DDNSAccount);

+                target.DDNSpasswd(data.DDNSPassword);

+                target.DDNSname(data.DDNS);

+            }

+            changeddnsProviderList();

+        }

+        function changeddnsProviderList() {

+            if (target.currentProviderList() != "none") {

+                target.isddnsaccount(true);

+                target.isddnspasswd(true);

+                target.isddnsdomainName(true);

+                target.isHashValue(true);

+                target.isDDNSStatus(true);

+            } else {

+                target.isddnsaccount(false);

+                target.isddnspasswd(false);

+                target.isddnsdomainName(false);

+                target.isHashValue(false);

+                target.isDDNSStatus(false);

+            }

+            if (target.currentProviderList() != "freedns.afraid.org") {

+                target.isHashValue(false);

+            } else {

+                target.isHashValue(true);

+            }

+            return true;

+        }

+        function applyFunc() {

+            showLoading();

+            var params = {};

+            params.goformId = "DDNS";

+            params.DDNS_Enable = target.currentMode();

+            if (target.currentMode() == "1") {

+                params.DDNS_Mode = target.currentModeselect();

+                params.DDNSProvider = target.currentProviderList();

+                if (target.currentProviderList() != "none") {

+                    params.DDNS = target.DDNSname();

+                    params.DDNSPassword = target.DDNSpasswd();

+                    params.DDNSAccount = target.DDNSaccount();

+                }

+                if (target.currentProviderList() == "freedns.afraid.org") {

+                    params.DDNS_Hash_Value = target.DDNS_HashValue();

+                }

+            }

+            service.setDDNSForward(params, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                    data = service.getDdnsParams();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+    }

+    function initialize() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new DdnsViewModel();

+        ko.applyBindings(vm, container[0]);

+        $("#ddnsForm").validate({

+            submitHandler: function () {

+                vm.apply();

+            },

+            rules: {

+                ddns_secretcode_input: "secretcode_check",

+                DDNS_Hash_Value: "ddns_hashvalue_check",

+                ddns_secretcode_inputshow: "secretcode_check"

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "ddns_secretcode_input" || id == "ddns_secretcode_inputshow") {

+                    error.insertAfter("#lblShowPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+    }

+    return {

+        init: initialize

+    };

+});

+

+

+//选网模块

+

+define("network_net_select","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var selectModes = _.map(config.AUTO_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    //选网功能view model

+

+    function NetSelectVM() {

+        var target = this;

+

+        target.networkList = ko.observableArray([]);

+        target.selectNetwork = ko.observable('');

+        target.enableFlag = ko.observable(true);

+        target.types = ko.observableArray(selectModes);

+        target.selectedType = ko.observable();

+        target.selectMode = ko.observable();

+

+		target.networkText = networkTextFunc;

+

+		target.networkStatusId = networkStatusIdFunc;

+

+        target.networkStatus = networkStatusFunc;

+

+        target.subnetworkType = subnetworkTypeFunc;

+

+		target.networkType = networkTypeFunc;

+

+        target.operatorName = operatorNameFunc;

+

+        target.networkValue = networkValueFunc;

+

+        target.networkTypeId = networkTypeIdFunc;

+

+        target.subnetTypeId = subnetTypeIdFunc;

+       //手动搜网.

+

+        target.search = searchFunc;

+

+        //自动选网时设置网络模式.

+

+        target.save = saveFunc;

+

+        target.checkEnable = checkEnableFunc;

+

+        //注册选择的网络.

+

+        target.register = registerFunc;

+

+        //init data

+        target.checkEnable();

+        var info = getNetSelectInfo();

+        if ("manual_select" == info.net_select_mode || "manual_select" == info.m_netselect_save) {

+            target.selectMode("manual_select");

+        } else {

+            target.selectMode("auto_select");

+        }

+

+        target.selectedType(info.net_select);

+

+		//注册选择的网络.

+		function registerFunc() {

+            showLoading('registering_net');

+            var networkToSet = target.selectNetwork().split(',');

+            service.setNetwork(networkToSet[0], parseInt(networkToSet[1]), parseInt(networkToSet[2]), function (result) {

+                if (result) {

+                    target.networkList([]);

+                    var autoType = getNetSelectInfo();

+                    target.selectedType(autoType.net_select);

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+

+		function checkEnableFunc() {

+            var status = service.getStatusInfo();

+            if (status.connectStatus == "ppp_connected" || status.connectStatus == "ppp_connecting") {

+                target.enableFlag(false);

+            } else {

+                target.enableFlag(true);

+            }

+        }

+

+		//自动选网时设置网络模式.

+		function saveFunc() {

+            showLoading();

+

+            //AutoSelect call SetBearerPreference

+            var params = {};

+            params.strBearerPreference = target.selectedType();

+            service.setBearerPreference(params, function (result) {

+                if (result.result == "success") {

+                    target.networkList([]);

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+

+		//手动搜网.

+		function searchFunc() {

+            showLoading('searching_net');

+            service.scanForNetwork(function (result, networkList) {

+                hideLoading();

+                if (result) {

+                    target.networkList(networkList);

+                    for (var i = 0; i < networkList.length; i++) {

+                        var n = networkList[i];

+                        if (n.nState == '2') {

+                            target.selectNetwork(n.strNumeric + ',' + n.nRat + ',' + n.SubAct);

+                            return;

+                        }

+                    }

+                } else {

+                    errorOverlay();

+                    target.networkList([]);

+                }

+            });

+        }

+

+		function subnetTypeIdFunc(data) {

+            return getSubNetworkTypeTog(data.nRat, data.SubAct);

+        }

+

+		function networkTypeIdFunc(data) {

+            return getNetworkType(data.nRat);

+        }

+

+		function networkValueFunc(data) {

+            var result = [];

+            result.push(data.strNumeric); //strNumeric

+            result.push(data.nRat); //nRat

+            result.push(data.SubAct);

+            return result.join(',');

+        }

+

+		function operatorNameFunc(data) {

+            return data.strShortName;

+        }

+

+		function networkTypeFunc(data) {

+            var result = getNetworkType(data.nRat);

+            if (result == "auto")

+                result = $.i18n.prop("auto");

+            return result;

+        }

+

+		function subnetworkTypeFunc(data) {

+            var result = getSubNetworkTypeTog(data.nRat, data.SubAct);

+            return result;

+        }

+

+		function networkStatusFunc(data) {

+            return $.i18n.prop(getNetworkStatusTog(data.nState));

+        }

+

+		function networkStatusIdFunc(data) {

+            return getNetworkStatusTog(data.nState);

+        }

+

+		function networkTextFunc(data) {

+            return data.strNumeric;

+        }

+

+    }

+

+    //获取网络选择信息.

+

+    function getNetSelectInfo() {

+        return service.getNetSelectInfo();

+    }

+

+    //搜网结果中的状态转换为对应的语言项.

+

+    function getNetworkStatusTog(status) {

+        if ("3" == status) {

+            return "forbidden";

+        } else if ("2" == status) {

+            return "current";

+        } else if ("1" == status) {

+            return "available";

+        }else if ("0" == status) {

+            return "unknown";

+        }

+    }

+	//子网络类型转换.

+

+    function getSubNetworkTypeTog(type, subtype) {

+        var type_3g = [2, 4, 5, 6, 8];

+        if ("1" == subtype) {

+            if ("7" == type) {

+                subtype = "FDD-LTE";

+            } else if ($.inArray(type, type_3g) != -1) {

+                subtype = "WCDMA";

+            }else {

+                subtype = "GSM";

+            }

+        } else if ("0" == subtype) {

+            if ("7" == type) {

+                subtype = "TD-LTE";

+            } else if ($.inArray(type, type_3g) != -1) {

+                subtype = "TD-SCDMA";

+            } else {

+                subtype = "GSM";

+            }

+        } else {

+            subtype = "";

+        }

+        return subtype;

+    }

+    //网络类型转换.

+

+    function getNetworkType(type) {

+        if ("7" == type) {

+            return "4G";

+        } else if ("2" == type) {

+            return "3G";

+        } else if ("0" == type) {

+            return "2G";

+        } else {

+            return "auto";

+        }

+    }

+

+    function bindContainer(vm){

+

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+	}

+

+    //初始化选网功能view model.

+

+    function initialize() {

+        var vm = new NetSelectVM();

+		bindContainer(vm);

+        addInterval(vm.checkEnable, 1000);

+    }

+

+    return {

+        init: initialize

+    };

+});

+define("locknet","jquery knockout service jquery set main".split(" "),

+    function ($, ko, service, config, home) {

+

+    function initialize() {

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        var vm = new locknetViewMode();

+        ko.applyBindings(vm, container);

+

+        $("#frmNetworkLock").validate({

+            submitHandler: function () {

+                vm.unlock();

+            },

+            rules: {

+                txtLockNumber: "unlock_code_check"

+            }

+        });

+    }

+

+    function locknetViewMode() {

+        var target = this;

+        var curCableMode = false;

+        target.isCPE = config.PRODUCT_TYPE == 'CPE';

+        target.hasRj45 = config.RJ45_SUPPORT;

+        target.hasSms = config.HAS_SMS;

+        target.hasPhonebook = config.HAS_PHONEBOOK;

+        target.isSupportSD = config.SD_CARD_SUPPORT;

+        target.hasUssd = config.HAS_USSD;

+        if (config.WIFI_SUPPORT_QR_SWITCH == false) {

+            target.showQRCode = config.WIFI_SUPPORT_QR_CODE;

+        } else {

+            var wifiInfo = service.getWifiBasic();

+            target.showQRCode = config.WIFI_SUPPORT_QR_CODE && wifiInfo.show_qrcode_flag;

+        }

+        if(config.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_ssid_wifikey.png?_=' + $.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        target.hasParentalControl = ko.observable(config.HAS_PARENTAL_CONTROL && curCableMode);

+        target.deviceInfo = ko.observable([]);

+        target.isHomePage = ko.observable(false);

+        if (window.location.hash == "#main") {

+            target.isHomePage(true);

+        }

+

+        target.supportUnlock = config.NETWORK_UNLOCK_SUPPORT;

+        target.unlockCode = ko.observable();

+

+        var info = service.getNetworkUnlockTimes();

+        target.times = ko.observable(info.unlock_nck_time);

+

+        //显示工作模式设置窗口

+        target.showOpModeWindow = showOpModeWindowFunc;

+

+        target.isLoggedIn = ko.observable(false);

+        target.enableFlag = ko.observable(false);

+        //解锁

+        target.unlock = unlockFunc;

+

+        //更新工作模式状态

+        target.refreshOpmodeInfo = refreshOpmodeInfoFunc;

+

+        //定时检查工作模式状态

+        if (target.hasRj45) {

+            target.refreshOpmodeInfo();

+            addInterval(function () {

+                target.refreshOpmodeInfo();

+            }, 1000);

+        }

+

+		//更新工作模式状态

+		function refreshOpmodeInfoFunc() {

+            var obj = service.getStatusInfo();

+            target.isLoggedIn(obj.isLoggedIn);

+

+            if (!curCableMode && checkCableMode(obj.blc_wan_mode)) { //如果有线,则重新加载

+                window.location.reload();

+                return;

+            }

+

+            curCableMode = checkCableMode(obj.blc_wan_mode);

+            target.hasParentalControl(config.HAS_PARENTAL_CONTROL && curCableMode);

+            if (curCableMode && obj.ethWanMode.toUpperCase() == "DHCP") {

+                target.enableFlag(true);

+            } else if ((!curCableMode && obj.connectStatus != "ppp_disconnected") || (curCableMode && obj.rj45ConnectStatus != "idle" && obj.rj45ConnectStatus != "dead")) {

+                target.enableFlag(false);

+            } else {

+                target.enableFlag(true);

+            }

+            var getMode = (obj.blc_wan_mode == "AUTO_PPP" || obj.blc_wan_mode == "AUTO_PPPOE") ? "AUTO" : obj.blc_wan_mode;

+            var currMode = "";

+            switch (getMode) {

+			case "PPP":

+                currMode = "opmode_gateway";

+                break;

+			case "PPPOE":

+                currMode = "opmode_cable";

+                break;

+            case "AUTO":

+                currMode = "opmode_auto";

+                break;

+            default:

+                break;

+            }

+            $("#opmode").attr("data-trans", currMode).text($.i18n.prop(currMode));

+        }

+

+		//解锁

+		function unlockFunc() {

+            showLoading();

+            service.unlockNetwork({

+                unlock_network_code: target.unlockCode()

+            }, function (data) {

+                target.unlockCode("");

+                if (data && data.result == "success") {

+                    successOverlay();

+                    if (window.location.hash == "#main") {

+                        setTimeout(function () {

+                            window.location.reload();

+                        }, 500);

+                    } else {

+                        window.location.hash = "#main";

+                    }

+                } else {

+                    var info = service.getNetworkUnlockTimes();

+                    target.times(info.unlock_nck_time);

+                    errorOverlay();

+                }

+            })

+        }

+

+		//显示工作模式设置窗口

+		function showOpModeWindowFunc() {

+            showSettingWindow("change_mode", "opmode_popup", "opmode_popup", 400, 300, function () {});

+        }

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+// RJ45联网设置模块

+

+define("network_dial_set_cpe","underscore jquery knockout set service".split(" "),

+function(_, $, ko, config, service) {

+	var dialActions = _.map(config.dialActions, function(elem){

+		return new Option(elem.name, elem.value);

+	});

+

+	var dialModes = _.map(config.pppoeModes, function(elem) {

+		return new Option(elem.name, elem.value);

+	});

+

+    var checkStatusTimer = 0;

+    var checkConCounter = 0;

+    var timeoutTipShowed = false;

+

+    // 联网设置view model.

+

+	function PPPoEViewModel() {

+		var pppObj = service.getPppoeParams();

+        var ethParams = pppObj;

+		var target = this;

+

+		target.staticNoticeShow = ko.observable();

+		target.dhcpNoticeShow = ko.observable();

+		target.pppoeNoticeShow = ko.observable();

+		target.autoNoticeShow = ko.observable();

+		target.staticNotice = ko.observable();

+		target.dhcpNotice = ko.observable();

+		target.pppoeNotice = ko.observable();

+		target.autoNotice = ko.observable();

+		target.dhcpNoticeText = ko.observable();

+		target.staticNoticeText = ko.observable();

+		target.pppoeNoticeText = ko.observable();

+        target.autoNoticeText = ko.observable();		

+		target.currentMode = ko.observable(pppObj.ethwan_mode);//auto dhcp pppoe static

+		target.showPassword = ko.observable(false);

+		target.modes = ko.observableArray(dialModes);

+		target.isPppoeMode = ko.observable(false);

+		target.isStaticMode = ko.observable(false);

+		target.isAutoMode = ko.observable(false);

+		target.action = ko.observable();

+		target.btnTrans = ko.observable();

+		target.enableFlag = ko.observable();

+		target.isShowDisbtn = ko.observable();

+		target.isShowCancelbtn = ko.observable();

+

+		if(pppObj.rj45_state == "dead"){

+			checkRj45DeadTip();

+		} else if(pppObj.rj45_state == "connect"){

+			timeoutTipShowed = true;

+			setRj45CheckTimer("connect");

+		} else if(pppObj.rj45_state == "working"){

+			setRj45WorkingTip();

+		}

+

+		target.user = ko.observable(pppObj.pppoe_username);

+		target.password = ko.observable(pppObj.pppoe_cc);

+		target.autoUser = ko.observable(pppObj.pppoe_username);

+		target.autoPassword = ko.observable(pppObj.pppoe_cc);

+		target.pppMode = ko.observable(pppObj.ethwan_dialmode);

+		initContronler();

+

+

+		//下拉框选择改变下面DIV模块

+		target.changeModeDiv = changeModeDivFunc;

+

+		target.radioHandler = radioHandlerFunc;

+

+		target.primaryDNS = ko.observable(pppObj.static_wan_primary_dns);

+		target.secondaryDNS = ko.observable(pppObj.static_wan_secondary_dns);

+		target.ipAddress = ko.observable(pppObj.static_wan_ipaddr);

+		target.subnetMask = ko.observable(pppObj.static_wan_netmask);

+		target.defaultGateway = ko.observable(pppObj.static_wan_gateway);

+

+		addInterval(function(){

+			ethParams = service.getPppoeParams();

+			pppObj.rj45_state = ethParams.rj45_state;

+			initContronler();

+		}, 1000);

+

+        // 取消连接按钮事件.

+

+		target.cancelConnect = cancelConnectFunc;

+

+        // 应用按钮事件.

+

+		target.save = saveFunc;

+

+		 //密码显示事件

+        target.showPasswordHandler = function () {

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+

+        // 更新当前界面状态、按钮、提示语等.

+

+		function initContronler() {	

+            checkRj45DeadTip();		

+			if(target.currentMode() == "PPPOE"){

+				target.isPppoeMode(true);

+				target.isStaticMode(false);

+				target.isAutoMode(false);

+				target.staticNoticeShow(false);

+				target.dhcpNoticeShow(false);	

+				target.autoNoticeShow(false);	

+			} else if(target.currentMode() == "AUTO"){

+				target.isStaticMode(false);

+				target.isPppoeMode(false);

+				target.isAutoMode(true);

+				target.dhcpNoticeShow(false);

+				target.pppoeNoticeShow(false);

+				target.staticNoticeShow(false);

+			} else if(target.currentMode() == "STATIC"){

+				target.isStaticMode(true);

+				target.isPppoeMode(false);

+				target.isAutoMode(false);

+				target.dhcpNoticeShow(false);

+				target.pppoeNoticeShow(false);

+				target.autoNoticeShow(false);

+			} else{

+				target.isStaticMode(false);

+				target.isPppoeMode(false);

+				target.isAutoMode(false);

+				target.staticNoticeShow(false);

+				target.pppoeNoticeShow(false);

+                target.autoNoticeShow(false);					

+			}

+			if(ethParams.ethwan_dialmode != "auto_dial" && (pppObj.rj45_state == "working" || pppObj.rj45_state =="connect") ){

+				target.enableFlag(false);

+			} else {

+				target.enableFlag(true);

+			}

+			if(pppObj.rj45_state == "connect"){

+				if(target.pppMode() == "auto_dial"){

+					target.action("connect");

+				}else{

+					target.action("disconnect");

+				}					

+			} else if(pppObj.rj45_state == "working"){

+				target.action("disconnect");

+			}else{

+				target.action("connect");

+			}

+			//应用/连接按钮

+			if(target.pppMode() != "auto_dial" && target.currentMode() == ethParams.ethwan_mode){

+				target.btnTrans("connect");

+			} else{

+				target.btnTrans("apply");

+			}

+			if(pppObj.rj45_state != "idle"){

+				$("#pppoeApply").attr("disabled", true);

+		    }else {

+				$("#pppoeApply").attr("disabled", false);

+            }

+

+			//取消/断开按钮

+			target.isShowDisbtn(target.pppMode() != "auto_dial" && pppObj.rj45_state == "working");

+			target.isShowCancelbtn(target.pppMode() != "auto_dial" && pppObj.rj45_state == "connect");

+

+			$("#pppoeApply").translate();

+		}

+        // 设置后通过定时检查rj45_state状态,判断连接或断开操作结果.

+

+	    function setRj45CheckTimer(action){

+            checkStatusTimer && window.clearInterval(checkStatusTimer);

+            if("connect" != action){				

+                checkStatusTimer = addInterval(function () {

+                    checkDisconnectStatus();

+                }, 2000);

+            }else{

+                if(target.currentMode() == "PPPOE"){

+                    target.pppoeNoticeShow(true);

+                    target.pppoeNotice("pppoe_processing");

+                    target.pppoeNoticeText($.i18n.prop("pppoe_processing"));

+                } else if(target.currentMode() == "STATIC"){

+                    target.staticNoticeShow(true);

+                    target.staticNotice("static_processing");

+                    target.staticNoticeText($.i18n.prop("static_processing"));

+                } else if(target.currentMode() == "DHCP"){

+                    target.dhcpNoticeShow(true);

+                    target.dhcpNotice("dyn_processing");

+                    target.dhcpNoticeText($.i18n.prop("dyn_processing"));

+                }else{

+                    target.autoNoticeShow(true);

+                    target.autoNotice("auto_processing");

+                    target.autoNoticeText($.i18n.prop("auto_processing"));

+                }

+                checkStatusTimer = addInterval(function () {

+                    checkConnectionStatus();

+                }, 2000);

+            }			

+        }

+        // 设置后通过定时检查rj45_state状态,判断连接操作结果.

+

+        function checkConnectionStatus(){

+            if(checkConCounter < 1){

+				checkConCounter++;

+				return;

+            }

+            if(pppObj.rj45_state == "connect"){

+                if(target.currentMode() != ethParams.ethwan_mode){

+                    if(target.currentMode() == "AUTO"){

+                        target.autoNoticeShow(true);

+                    }else if(target.currentMode() == "PPPOE"){

+                        target.pppoeNoticeShow(true);

+                    }else if(target.currentMode() == "STATIC"){

+                        target.staticNoticeShow(true);

+                    }else if(target.currentMode() == "DHCP"){

+                        target.dhcpNoticeShow(true);

+                    }

+                }

+                if(checkConCounter > 6){

+                    if(timeoutTipShowed == false){

+                        timeoutTipShowed = true;

+                        showAlert("ussd_operation_timeout");

+                    }

+                }

+                checkConCounter++;

+            } else if (pppObj.rj45_state == "working") {

+                hideLoading();

+                setRj45WorkingTip();

+                window.clearInterval(checkStatusTimer);						

+            } else if (pppObj.rj45_state == "dead") {

+				hideLoading();

+				checkRj45DeadTip();

+                window.clearInterval(checkStatusTimer);

+            } else if(pppObj.rj45_state == "idle"){

+                hideLoading();

+                if(target.currentMode() == "DHCP" && ethParams.ethwan_mode == "DHCP") {

+                    timeoutTipShowed == false && target.dhcpNoticeShow(true);

+                    target.dhcpNotice("dyn_fail");

+                    target.dhcpNoticeText($.i18n.prop("dyn_fail"));

+                }

+                if(target.currentMode() == "STATIC" && ethParams.ethwan_mode == "STATIC") {

+                    timeoutTipShowed == false && target.staticNoticeShow(true);

+                    target.staticNotice("static_fail");

+                    target.staticNoticeText($.i18n.prop("static_fail"));

+                }

+                if(target.currentMode() == "PPPOE" && ethParams.ethwan_mode == "PPPOE") {

+                    timeoutTipShowed == false && target.pppoeNoticeShow(true);

+                    target.pppoeNotice("pppoe_fail");

+                    target.pppoeNoticeText($.i18n.prop("pppoe_fail"));

+                }

+                if(target.currentMode() == "AUTO" && ethParams.ethwan_mode == "AUTO") {

+                    timeoutTipShowed == false && target.autoNoticeShow(true);

+                    target.autoNotice("auto_fail");

+                    target.autoNoticeText($.i18n.prop("auto_fail"));

+                }

+                window.clearInterval(checkStatusTimer);

+            }   else{

+                hideLoading();

+				window.clearInterval(checkStatusTimer);

+			}

+        }

+		// 设置连接成功时提示语状态.

+

+        function setRj45WorkingTip(){

+            if(target.currentMode() == ethParams.ethwan_mode){

+                if(target.currentMode() == "AUTO") {

+                    target.autoNoticeShow(true);

+                    target.autoNotice("auto_success");

+                    target.autoNoticeText($.i18n.prop("auto_success"));

+                }else if(target.currentMode() == "PPPOE") {

+                    target.pppoeNoticeShow(true);

+                    target.pppoeNotice("pppoe_success");

+                    target.pppoeNoticeText($.i18n.prop("pppoe_success"));

+                }else if(target.currentMode() == "STATIC") {

+                    target.staticNoticeShow(true);

+                    target.staticNotice("static_success");

+                    target.staticNoticeText($.i18n.prop("static_success"));

+                }else if(target.currentMode() == "DHCP" ) {

+                    target.dhcpNoticeShow(true);

+                    target.dhcpNotice("dyn_success");

+                    target.dhcpNoticeText($.i18n.prop("dyn_success"));

+                }

+            }

+        }

+

+		// 设置网线断开提示语状态.

+

+        function checkRj45DeadTip(){

+            if(pppObj.rj45_state != "dead"){

+                if(target.currentMode() == "AUTO"  && target.autoNotice() == "pppoe_msg") {

+                    target.autoNoticeShow(false);

+                }else if(target.currentMode() == "PPPOE"  && target.pppoeNotice() == "pppoe_msg") {

+                    target.pppoeNoticeShow(false);

+                }else if(target.currentMode() == "STATIC"  && target.staticNotice() == "pppoe_msg") {

+                    target.staticNoticeShow(false);

+                }else if(target.currentMode() == "DHCP" && target.dhcpNotice() == "pppoe_msg") {

+                    target.dhcpNoticeShow(false);

+                }				

+

+            } else{

+				target.dhcpNotice("pppoe_msg");

+                target.dhcpNoticeText($.i18n.prop("pppoe_msg"));

+                target.staticNotice("pppoe_msg");

+                target.staticNoticeText($.i18n.prop("pppoe_msg"));

+                target.pppoeNotice("pppoe_msg");

+                target.pppoeNoticeText($.i18n.prop("pppoe_msg"));

+                target.autoNotice("pppoe_msg");

+                target.autoNoticeText($.i18n.prop("pppoe_msg"));

+                if(target.currentMode() == "AUTO") {

+                    target.autoNoticeShow(true);

+                }else if(target.currentMode() == "PPPOE") {

+                    target.pppoeNoticeShow(true);

+                }else if(target.currentMode() == "STATIC") {

+                    target.staticNoticeShow(true);

+                }else if(target.currentMode() == "DHCP") {

+                    target.dhcpNoticeShow(true);

+                }

+            }            

+		}

+        // 设置后通过定时检查rj45_state状态,判断断开操作结果.

+

+        function checkDisconnectStatus(){

+            if(checkConCounter < 1){

+                checkConCounter++;

+            } else if (pppObj.rj45_state != "working" && pppObj.rj45_state != "connect") {

+                target.dhcpNoticeShow(false);

+                target.staticNoticeShow(false);

+                target.pppoeNoticeShow(false);

+                target.autoNoticeShow(false);

+                window.clearInterval(checkStatusTimer);

+                successOverlay();

+            } else if(checkConCounter > 6){

+                if(timeoutTipShowed == false){

+                    timeoutTipShowed = true;

+                    showAlert("ussd_operation_timeout");

+                }

+                window.clearInterval(checkStatusTimer);

+            } else if(checkConCounter < 7) {

+                checkConCounter++;

+            } else {

+                hideLoading();

+                window.clearInterval(checkStatusTimer);

+            }				

+        }

+

+		//应用按钮事件.

+		function saveFunc(){

+			target.dhcpNoticeShow(false);

+			target.staticNoticeShow(false);

+			target.pppoeNoticeShow(false);

+			target.autoNoticeShow(false);

+			if(pppObj.rj45_state == "dead"){

+				showAlert("pppoe_msg");

+				return;

+			}

+			var requestParams = {};

+			if($("#pppoe_mode").val() == "PPPOE") {

+				requestParams = $.extend({}, {

+					goformId: "WAN_GATEWAYMODE_PPPOE",

+					pppoe_username: target.user(),

+					pppoe_cc: target.password()

+				});

+			} else if($("#pppoe_mode").val() == "AUTO") {

+				requestParams = $.extend({}, {

+					goformId: "WAN_GATEWAYMODE_AUTO",

+					pppoe_username: target.autoUser(),

+					pppoe_cc: target.autoPassword()

+				});

+			} else if($("#pppoe_mode").val() == "STATIC") {

+				if(target.ipAddress() == target.defaultGateway()){

+					showAlert("ip_gate_not_same");

+					return;

+				}

+				if(isStaticIPValid(target.ipAddress(), pppObj.lan_ipaddr, pppObj.lan_netmask)){

+					showAlert("ip_innergate_not_same");

+					return;

+				}

+				requestParams = $.extend({}, {

+					goformId: "WAN_GATEWAYMODE_STATIC",

+					static_wan_ipaddr: target.ipAddress(),

+					static_wan_netmask: target.subnetMask(),

+					static_wan_gateway: target.defaultGateway(),

+					static_wan_primary_dns: target.primaryDNS(),

+					static_wan_secondary_dns: target.secondaryDNS(),

+					WAN_MODE: "STATIC"

+				});

+			} else {

+				requestParams = $.extend({}, {

+					goformId: "WAN_GATEWAYMODE_DHCP"

+				});

+			}

+			requestParams.action_link = "connect";

+			requestParams.dial_mode = target.pppMode();

+			showLoading("waiting");

+

+			service.setPppoeDialMode(requestParams, function(data){

+				if(data.result){

+					target.currentMode($("#pppoe_mode").val());

+					pppObj = service.getPppoeParams();

+					checkConCounter = 0;

+					timeoutTipShowed = false;

+					setRj45CheckTimer("connect");					

+					$("#pppoeApply").translate();

+                } else {

+					errorOverlay("pppoe_message_send_fail");

+                }

+			});

+

+		}

+

+		//取消连接按钮事件.

+		function cancelConnectFunc(){

+			target.dhcpNoticeShow(false);

+			target.staticNoticeShow(false);

+			target.pppoeNoticeShow(false);

+			target.autoNoticeShow(false);

+			if(pppObj.rj45_state == "dead"){

+				showAlert("pppoe_msg");

+				return;

+			}

+			var requestParams = {

+				dial_mode: target.pppMode(),

+				action_link: "disconnect"

+			};

+			if(pppObj.ethwan_mode == "PPPOE") {

+				requestParams = $.extend(requestParams, {

+					goformId: "WAN_GATEWAYMODE_PPPOE",

+					pppoe_username: pppObj.pppoe_username,

+					pppoe_cc: pppObj.pppoe_cc					

+				});

+			}else if(pppObj.ethwan_mode == "AUTO") {

+				requestParams = $.extend(requestParams, {

+					goformId: "WAN_GATEWAYMODE_AUTO",

+					pppoe_username: pppObj.pppoe_username,

+					pppoe_cc: pppObj.pppoe_cc					

+				});

+			}else if(pppObj.ethwan_mode == "STATIC") {

+				requestParams = $.extend(requestParams, {

+					goformId: "WAN_GATEWAYMODE_STATIC",

+					static_wan_ipaddr: pppObj.static_wan_ipaddr,

+					static_wan_netmask: pppObj.static_wan_netmask,

+					static_wan_gateway: pppObj.static_wan_gateway,

+					static_wan_primary_dns: pppObj.static_wan_primary_dns,

+					static_wan_secondary_dns: pppObj.static_wan_secondary_dns,

+					WAN_MODE: "STATIC"

+				});

+			}else {

+				requestParams = $.extend(requestParams, {

+					goformId: "WAN_GATEWAYMODE_DHCP"

+				});

+			}

+			showLoading("waiting");

+			service.setPppoeDialMode(requestParams, function(data){

+				if(data.result){

+                    checkConCounter = 0;

+					timeoutTipShowed = false;

+					setRj45CheckTimer("disconnect");

+					$("#pppoeApply").translate();

+                } else {

+					errorOverlay("pppoe_message_send_fail");

+                }

+			});

+

+		}

+

+		function radioHandlerFunc(){

+			initContronler();

+			return true;

+		}

+

+		function changeModeDivFunc(){

+			initContronler();

+		}

+

+    }

+

+	function bindContainer(vm){

+		var container = $('#container');

+		ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+

+	}

+    // 联网设置初始化.

+

+	function initialize() {

+		var vm = new PPPoEViewModel();

+		bindContainer(vm);

+

+		$("#pppoeApply").translate();

+

+		$('#pppoeForm').validate({

+			submitHandler : function() {

+				vm.save();

+			},

+            rules: {

+                txtPin: "wps_pin_check",

+				txtIpAddress: "dmz_ip_check",

+				txtSubnetMask: {

+					ipv4: true,

+                    subnetmask_check: true

+				},

+				txtDefaultGateway: {

+					ipv4: true,

+					gateway_check: true

+				},

+				txtPrimaryDNS: {

+					ipv4: true,

+					dns_check:true

+				},

+				txtSecondaryDNS: {

+					ipv4: true,

+					dns_check:true

+				}

+            }

+		});

+	}

+

+

+//from 4.0

+    // 有效DNS检查.

+

+function validateDns(dns){

+	if ( "0.0.0.0" == dns || "255.255.255.255" == dns) {

+		return false;

+	}

+	return true;

+}

+    // 联网设置初始化.

+

+function isStaticIPValid(ip, lanip, lanmask){

+	if(!ip || !lanip || !lanmask){//各参数不能为空

+        return false;

+    }

+	if(ip == lanip){// 与内网IP相等

+		return true;

+	}

+    var  res1 = [], res2 = [], mask = [];

+    addr1 = ip.split(".");

+    addr2 = lanip.split(".");

+    mask  = lanmask.split(".");

+    for(var i = 0; i < addr1.length; i += 1){

+        res1.push(parseInt(addr1[i]) & parseInt(mask[i]));

+        res2.push(parseInt(addr2[i]) & parseInt(mask[i]));

+    }

+    if(res1.join(".") == res2.join(".")){//在同一个网段

+        return true;

+    }else{//不在同一个网段

+        return false;

+    }

+}

+

+// 有效子网掩码验证.

+

+function isNetmaskIPValid(ip) {

+	if (ip == 255 || ip == 254 || ip == 252 || ip == 248

+		|| ip == 240 || ip == 224 || ip == 192 || ip == 128 || ip == 0)

+	{

+		return true;

+	}

+	else

+	{

+		return false;

+	}

+}

+    // 有效子网掩码检查.

+

+function validateNetmask(netmask) {

+	var array = new Array();

+	array = netmask.split(".");

+

+	if (array.length != 4) {

+		return false;

+	}

+

+	array[0] = parseInt(array[0]);

+	array[1] = parseInt(array[1]);

+	array[2] = parseInt(array[2]);

+	array[3] = parseInt(array[3]);

+

+	if (array[3] != 0) {

+		if (array[2] != 255 || array[1] != 255 || array[0] != 255) {

+			return false;

+		} else {

+			if (!isNetmaskIPValid(array[3])) {

+				return false;

+			}

+		}

+	}

+

+	if (array[2] != 0) {

+		if (array[1] != 255 || array[0] != 255) {

+			return false;

+		} else {

+			if (!isNetmaskIPValid(array[2])) {

+				return false;

+			}

+		}

+	}

+

+	if (array[1] != 0) {

+		if (array[0] != 255) {

+			return false;

+		} else{

+			if (!isNetmaskIPValid(array[1])) {

+				return false;

+			}

+		}

+	}

+	if(array[0]!=255) {

+		return false;

+	}

+	if ( "0.0.0.0" == netmask || "255.255.255.255" == netmask) {

+		return false;

+	}

+	return true;

+}

+

+    // subnetmask_check校验规则

+

+jQuery.validator.addMethod("subnetmask_check", function (value, element, param) {

+	var result = validateNetmask(value);

+    return this.optional(element) || result;

+});

+    // dns_check校验规则

+

+jQuery.validator.addMethod("dns_check", function (value, element, param) {

+	var result = validateDns(value);

+    return this.optional(element) || result;

+});

+    // 有效网关检查.

+

+function validateGateway(wanIp, netmaskIp, gatewayIp) {

+	if(myConcat(wanIp,netmaskIp) == myConcat(netmaskIp, gatewayIp)) {

+		return true;

+	} else {

+		return false;

+	}

+}

+    // IP和子网掩码转换成数组形式并相与,返回相与后的IP.

+

+function myConcat(ip1,ip2){

+	var result = [];

+	var iplArr = ip1.split(".");

+	var ip2Arr = ip2.split(".");

+	for(var i = 0; i < iplArr.length;i++){

+		result[i] = (iplArr[i] & ip2Arr[i]);

+	}

+	return result.join(".");

+}

+    // gateway_check校验规则

+

+jQuery.validator.addMethod("gateway_check", function (value, element, param) {

+	var result = validateGateway($('#txtIpAddress').val(), $('#txtSubnetMask').val(), $("#txtDefaultGateway").val());

+    return this.optional(element) || result;

+});

+

+	return {

+		init: initialize

+	};

+});

+//联网设置模块

+define("network_dial_set","underscore jquery knockout set service".split(" "),

+function(_, $, ko, config, service) {

+

+    //联网设置view model

+	function DialVM() {

+		var dialMode = service.getConnectionMode();

+		var target = this;

+

+		target.selectMode = ko.observable(dialMode.connectionMode);

+        target.enableFlag = ko.observable(true);

+        target.isAllowedRoaming = ko.observable(dialMode.isAllowedRoaming);

+        var originalRoaming = dialMode.isAllowedRoaming;

+

+        target.setAllowedRoaming = setAllowedRoamingFunc;

+

+		var checkboxFlag = $(".checkboxToggle");

+        target.checkEnable = checkEnableFunc;

+

+        //修改联网模式

+        target.save = saveFunc;

+

+		function saveFunc() {

+            showLoading();

+            var connMode = target.selectMode();

+            //当选择自动时,下发原先的勾选状态

+            if (connMode == 'auto_dial') {

+                originalRoaming = target.isAllowedRoaming();

+            } else {

+                target.isAllowedRoaming(originalRoaming);

+            }

+            service.setConnectionMode({

+                connectionMode: connMode,

+                isAllowedRoaming: target.isAllowedRoaming()

+            }, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+

+		function setAllowedRoamingFunc() {

+            if(!$("#roamBtn").hasClass("disable")){

+                var checkbox = $("#isAllowedRoaming:checked");

+                if(checkbox && checkbox.length == 0 ){

+                    target.isAllowedRoaming("on");

+                }else{

+                    target.isAllowedRoaming("off");

+                }

+            }

+        }

+

+		function checkEnableFunc() {

+            var status = service.getStatusInfo();

+

+            if (status.connectStatus == "ppp_connected" || status.connectStatus == "ppp_connecting") {

+                target.enableFlag(false);

+                disableCheckbox(checkboxFlag);

+            }

+            else {

+                target.enableFlag(true);

+                enableCheckbox(checkboxFlag);

+            }

+        }

+

+	}

+

+    //联网设置初始化.

+	function initialize() {

+		var vm = new DialVM();

+		bindContainer(vm);

+

+        vm.checkEnable();

+        addInterval( vm.checkEnable, 1000);

+	}

+

+	function bindContainer(vm){

+		var container = $('#container');

+		ko.cleanNode(container[0]);

+		ko.applyBindings(vm, container[0]);

+

+	}

+

+	return {

+		init: initialize

+	};

+});

+// APN Setting 模块

+define("network_apn_set","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //获取鉴权方式

+

+    function getAuthModes() {

+        return _.map(config.APN_AUTH_MODES, function (item) {

+            return new Option(item.name, item.value);

+        });

+    }

+

+    function getApnPdpTypes() {

+        var pdpTypesArray = [new Option('IPv4', 'IP')];

+        if (config.IPV6_SUPPORT) {

+            pdpTypesArray.push(new Option('IPv6', 'IPv6'));

+            if (config.IPV4V6_SUPPORT) {

+                pdpTypesArray.push(new Option('IPv4v6', 'IPv4v6'));

+            }

+            if (config.IPV4_AND_V6_SUPPORT) {

+                pdpTypesArray.push(new Option('IPv4 & IPv6', 'IPv4v6'));

+            }

+        }

+        return pdpTypesArray;

+    }

+

+    //获取apn相关信息

+

+    function getApnSet() {

+        var apnInfo = service.getApnSettings();

+        apnInfo.ipv6ApnConfigs = getApnConfigs(apnInfo.ipv6APNs, true);

+        apnInfo.apnConfigs = getApnConfigs(apnInfo.APNs, false);

+        apnInfo.autoApnConfigs = getAutoApnsConfig(apnInfo.autoApns, apnInfo.autoApnsV6);

+        return apnInfo;

+    }

+    var apnConfigs = {};

+    var ipv6ApnConfigs = {};

+    var autoApnConfigs = {};

+

+    //解析自动apn信息

+

+    function getAutoApnsConfig(autoApnV4, autoApnV6) {

+        var autoApnsV4 = [];

+        var autoApnsV6 = [];

+

+        if (autoApnV4 && autoApnV4.length > 5) {

+            var apnArr = autoApnV4.split("||");

+            for (var ki = 0; ki < apnArr.length; ki++) {

+                if (apnArr[ki] != "") {

+                    var apnItem = parseApnItem(apnArr[ki], false);

+                    autoApnsV4.push(apnItem);

+                }

+            }

+        }

+        if (autoApnV6 && autoApnV6.length > 5) {

+            var apnArr = autoApnV6.split("||");

+            for (var ki = 0; ki < apnArr.length; ki++) {

+                if (apnArr[ki] != "") {

+                    var apnItem = parseApnItem(apnArr[ki], false);

+                    autoApnsV6.push(apnItem);

+                }

+            }

+        }

+        return dealAutoApnsV4V6(autoApnsV4, autoApnsV6);

+    }

+    //解析apn信息

+

+    function getApnConfigs(apnsStr, isIpv6) {

+        var apnCfgs = [];

+        var theApnConfigs = {};

+        if (apnsStr && apnsStr.length > 10) {

+            var apnArr = apnsStr.split("||");

+            for (var ki = 0; ki < apnArr.length; ki++) {

+                if (apnArr[ki] != "") {

+                    var apnItem = parseApnItem(apnArr[ki], isIpv6);

+                    apnCfgs.push(apnItem);

+                    theApnConfigs[apnItem.profileName] = apnItem;

+                }

+            }

+        }

+        if (isIpv6 == false) {

+            apnConfigs = theApnConfigs;

+        } else {

+            ipv6ApnConfigs = theApnConfigs;

+        }

+        return apnCfgs;

+    }

+

+	//解析单条apn信息

+

+    function parseApnItem(apnStr, isIpv6) {

+        var apnItem = {};

+        var items = apnStr.split("($)");

+        for (var ki = 0; ki < items.length; ki++) {

+            apnItem.profileName = items[0];

+            apnItem.pdpType = items[7];

+            if (isIpv6 == false) {	

+                apnItem.dnsMode = items[10];

+                apnItem.dns1 = items[11];

+                apnItem.dns2 = items[12];

+                apnItem.wanApn = items[1];

+                apnItem.authMode = items[4].toLowerCase();

+                apnItem.username = items[5];

+                apnItem.password = items[6];

+            } else {		

+                apnItem.dnsModeV6 = items[10];

+                apnItem.dns1V6 = items[11];

+                apnItem.dns2V6 = items[12];

+                apnItem.wanApnV6 = items[1];

+                apnItem.authModeV6 = items[4].toLowerCase();

+                apnItem.usernameV6 = items[5];

+                apnItem.passwordV6 = items[6];

+            }

+        }

+        return apnItem;

+    }

+    //合并V4\V6自动apn信息

+

+    function dealAutoApnsV4V6(v4, v6) {

+        autoApnConfigs = {};

+        var autoApns = [];

+        for (var ki = 0; ki < v4.length; ki++) {

+            var apnElem = v4[ki];

+            var itemsV6 = v6[ki];

+            if (itemsV6 && (itemsV6.pdpType == 'IPv6' || itemsV6.pdpType == 'IPv4v6')) {

+                apnElem.usernameV6 = itemsV6.username;

+                apnElem.passwordV6 = itemsV6.password;

+                apnElem.dns1V6 = itemsV6.dns1;

+                apnElem.dns2V6 = itemsV6.dns2;

+                apnElem.wanApnV6 = itemsV6.wanApn;

+                apnElem.authModeV6 = itemsV6.authMode;

+                apnElem.dnsModeV6 = itemsV6.dnsMode;

+            }

+            autoApns.push(apnElem);

+            autoApnConfigs[apnElem.profileName] = apnElem;

+        }

+        return autoApns;

+    }

+

+    function getProfileOptions(apns) {

+        return _.map(apns, function (item) {

+            return new Option(item.profileName, item.profileName);

+        });

+    }

+

+    //APNViewModel

+

+    function APNViewModel() {

+        var target = this;

+        var apnSettings = getApnSet();

+        if (apnSettings.apnNumPreset) {

+            config.maxApnNumber = apnSettings.apnNumPreset;

+        }

+

+        target.defApn = ko.observable(apnSettings.profileName); //当前默认APN

+        target.apnMode = ko.observable(apnSettings.apnMode);

+        target.autoProfiles = ko.observableArray(getProfileOptions(apnSettings.autoApnConfigs));

+        target.profiles = ko.observableArray(getProfileOptions(apnSettings.apnConfigs));

+        target.wanDial = ko.observable(apnSettings.wanDial);

+

+        target.showApnDns = ko.observable(config.SHOW_APN_DNS);

+        target.index = ko.observable(apnSettings.currIndex);

+        target.supportIPv6 = ko.observable(config.IPV6_SUPPORT);

+        target.supportIpv4AndIpv6 = ko.observable(config.IPV4_AND_V6_SUPPORT);

+

+        target.apn = ko.observable(apnSettings.wanApn);

+        target.dnsMode = ko.observable(apnSettings.dnsMode == 'manual' ? 'manual' : 'auto');

+        target.dns1 = ko.observable(apnSettings.dns1);

+        target.dns2 = ko.observable(apnSettings.dns2);

+        target.authModes = ko.observableArray(getAuthModes());

+        target.username = ko.observable(apnSettings.username);

+        target.password = ko.observable(apnSettings.password);

+

+        target.pdpTypes = ko.observableArray(getApnPdpTypes());

+        target.selectedPdpType = ko.observable(apnSettings.pdpType);

+        target.selectedPdpTypeTmp = ko.observable(apnSettings.pdpType); //the PdpType select's value before chang

+        target.profileName = ko.observable(apnSettings.profileName); //当前编辑框中的

+        target.selectedProfile = ko.observable(apnSettings.profileName); //当前下拉框选择的APN

+

+        target.showPassword = ko.observable(false);

+

+        target.apnV6 = ko.observable(apnSettings.wanApnV6);

+        target.dnsModeV6 = ko.observable(apnSettings.dnsModeV6 == 'manual' ? 'manual' : 'auto');

+        target.dns1V6 = ko.observable(apnSettings.dns1V6);

+        target.dns2V6 = ko.observable(apnSettings.dns2V6);

+        target.authModesV6 = ko.observableArray(getAuthModes());

+        target.usernameV6 = ko.observable(apnSettings.usernameV6);

+        target.passwordV6 = ko.observable(apnSettings.passwordV6);

+        target.pdpTypeNote = ko.observable(true);

+        if (apnSettings.autoApnConfigs && apnSettings.autoApnConfigs.length > 0) {

+            target.selectedAutoProfile = ko.observable(apnSettings.autoApnConfigs[0].profileName);

+        } else {

+            target.selectedAutoProfile = ko.observable();

+        }

+

+        if (config.EMPTY_APN_SUPPORT == false) {

+            $("#apn_ipv4_apn").addClass("required");

+            $("#apn_ipv6_apn").addClass("required");

+        } else {

+            $("#apn_ipv4_apn").removeClass("required");

+            $("#apn_ipv6_apn").removeClass("required");

+        }

+

+        target.disableProfile = ko.observable(false); //表示处于新增页面

+        target.addApnHide = ko.observable(true);

+        target.defaultCfg = ko.observable(true); //当前选中的是默认APN

+        target.predeterminedCfg = ko.observable(true); //当前选中的是预置的APN

+

+        target.selectedAuthentication = ko.observable(apnSettings.authMode);

+        target.selectedAuthenticationV6 = ko.observable(apnSettings.authModeV6);

+

+

+        target.transApnV6 = ko.observable('apn');

+        target.transDnsModeV6 = ko.observable('apn_dns_mode');

+        target.transDns1V6 = ko.observable('apn_dns1');

+        target.transDns2V6 = ko.observable('apn_dns2');

+        target.transAuthV6 = ko.observable('apn_authentication');

+        target.transUserNameV6 = ko.observable('apn_user_name');

+        target.transPasswordV6 = ko.observable('apn_password');

+

+        target.transApn = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_ipv4_apn' : 'apn');

+        target.transDnsMode = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_dns_mode_ipv4' : 'apn_dns_mode');

+        target.transDns1 = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_dns1_ipv4' : 'apn_dns1');

+        target.transDns2 = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_dns2_ipv4' : 'apn_dns2');

+        target.transAuth = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_authentication_ipv4' : 'apn_authentication');

+        target.transUserName = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_user_name_ipv4' : 'apn_user_name');

+        target.transPassword = ko.observable(config.IPV4_AND_V6_SUPPORT ? 'apn_password_ipv4' : 'apn_password');

+

+        target.setDefaultVisible = ko.observable(!isConnectedNetWork());

+

+        target.tmp1 = ko.computed(function () {

+             if (target.selectedPdpType() == "IPv6") {

+                target.transApnV6('apn');

+                target.transDnsModeV6('apn_dns_mode');

+                target.transDns1V6('apn_dns1');

+                target.transDns2V6('apn_dns2');

+                target.transAuthV6('apn_authentication');

+                target.transUserNameV6('apn_user_name');

+                target.transPasswordV6('apn_password');

+            } else if (config.IPV4_AND_V6_SUPPORT && target.selectedPdpType() == 'IPv4v6') {

+                target.transApn('apn_ipv4_apn');

+                target.transDnsMode('apn_dns_mode_ipv4');

+                target.transDns1('apn_dns1_ipv4');

+                target.transDns2('apn_dns2_ipv4');

+                target.transAuth('apn_authentication_ipv4');

+                target.transUserName('apn_user_name_ipv4');

+                target.transPassword('apn_password_ipv4');

+

+                target.transApnV6('apn_ipv6_apn');

+                target.transDnsModeV6('apn_dns_mode_ipv6');

+                target.transDns1V6('apn_dns1_ipv6');

+                target.transDns2V6('apn_dns2_ipv6');

+                target.transAuthV6('apn_authentication_ipv6');

+                target.transUserNameV6('apn_user_name_ipv6');

+                target.transPasswordV6('apn_password_ipv6');

+            } else if (target.selectedPdpType() == "IP" || target.selectedPdpType() == "IPv4") {

+                target.transApn('apn');

+                target.transDnsMode('apn_dns_mode');

+                target.transDns1('apn_dns1');

+                target.transDns2('apn_dns2');

+                target.transAuth('apn_authentication');

+                target.transUserName('apn_user_name');

+                target.transPassword('apn_password');

+            } else { //config.IPV4V6_SUPPORT && target.selectedPdpType() == 'IPv4v6'

+                target.transApn('apn');

+                target.transDnsMode('apn_dns_mode');

+                target.transDns1('apn_dns1');

+                target.transDns2('apn_dns2');

+                target.transAuth('apn_authentication');

+                target.transUserName('apn_user_name');

+                target.transPassword('apn_password');

+            }

+            $("#apn_setting_form").translate();

+        });

+

+        target.autoApnChecked = ko.computed(function () {

+            return target.apnMode() == "auto";

+        });

+

+        target.hasCapacity = ko.computed(function () {

+            if (target.profiles().length < config.maxApnNumber) {

+                return true;

+            } else {

+                return false;

+            }

+        });

+

+        target.showDnsV6 = ko.computed(function () {

+            return target.dnsModeV6() == "manual";

+        });

+

+        target.showDns = ko.computed(function () {

+            return target.dnsMode() == "manual";

+        });

+

+

+        checkDefaultProfileStatus();

+        target.checkInputDisable = ko.computed(function () {

+            if (target.apnMode() != "auto"  && (target.predeterminedCfg() == false && target.defaultCfg() == true) && !isConnectedNetWork()) {

+                return false;

+            }

+            if (((target.apnMode() != "auto" && (target.predeterminedCfg() || target.defaultCfg()) && !target.disableProfile())) || target.apnMode() == "auto") {

+                return true;

+            }

+            if ((!target.disableProfile() || !(target.predeterminedCfg() || target.defaultCfg())) && target.apnMode() != "auto") {

+                return false;

+            }

+            return false;

+        });

+

+        var data = service.getDeviceInfo();

+        target.pdpTypeChangeAlert = pdpTypeChangeAlertFunc;

+

+

+        target.showAutoApnDetail = ko.computed(function () {

+            if (target.apnMode() != "auto") {

+                return true;

+            } else {

+                return target.autoProfiles().length > 0;

+            }

+        });

+		//密码显示事件

+        target.showPasswordHandler = function () {

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+		//auto apn profile change 事件处理

+

+        target.autoProfileChangeHandler = autoProfileChangeHandlerFunc;

+

+

+        //profile change 事件处理

+

+        target.profileChangeHandler = profileChangeHandlerFunc;

+

+

+        //切换profile时重置下面的显示项

+        target.setUIData = setUIDataFunc;

+

+

+        //设置默认apn状态

+

+        function checkDefaultProfileStatus() {

+            var index = getApnIndex();

+            //默认apn不允许编辑

+            if (target.apnMode() != "auto") { //当前选中与实际不一致的话

+                if (target.selectedProfile() != target.defApn()) {

+                    target.defaultCfg(false);

+                } else {

+                    target.defaultCfg(true); //默认APN

+                }

+            } else {

+                if (target.selectedAutoProfile() != target.defApn()) {

+                    target.defaultCfg(false);

+                } else {

+                    target.defaultCfg(true); //默认APN

+                }

+            }

+

+            if (index >= config.defaultApnSize) {

+                target.predeterminedCfg(false);

+            } else {

+                target.predeterminedCfg(true); //预置APN

+            }

+        }

+

+

+        //设置为默认apn

+

+        target.setDefaultAct = setDefaultActFunc;

+

+

+

+        //APN mode change 事件处理

+

+        target.apnModeChangeHandler = apnModeChangeHandlerFunc;

+

+

+        function doSetDefaultAct() {

+            var index = 0;

+            if (target.apnMode() != 'auto') {

+                index = getApnIndex();

+                target.selectedProfile($("#profile").val());

+            } else {

+                index = getAutoApnIndex();

+                target.selectedAutoProfile($("#autoProfile").val());

+            }

+            var selectedProfileDetail = target.getSelectedManualProfile();

+            service.setDefaultApn({

+                index: index,

+                apnMode: target.apnMode(),

+                pdpType: selectedProfileDetail.pdpType,

+

+                profileName: selectedProfileDetail.profileName,

+                wanApn: selectedProfileDetail.wanApn,

+                authMode: selectedProfileDetail.authMode,

+                username: selectedProfileDetail.username,

+                password: selectedProfileDetail.password,

+                dnsMode: config.SHOW_APN_DNS ? selectedProfileDetail.dnsMode : 'auto',

+                dns1: config.SHOW_APN_DNS ? selectedProfileDetail.dns1 : '',

+                dns2: config.SHOW_APN_DNS ? selectedProfileDetail.dns2 : ''

+            }, function (data) {

+                if (data.result) {

+                    //showLoading("apn_alert_restart");

+                    //restartDevice(service);

+                    addTimeout(function () {

+                        initialize(true);

+                        target.apnModeChangeHandler();

+                        successOverlay();

+                    }, 500);

+                } else {

+                    errorOverlay();

+                }

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+

+        target.getSelectedManualProfile = getSelectedManualProfileFunc;

+

+

+        //获取自动apn索引

+

+        function getAutoApnIndex() {

+            var configs = $("#autoProfile option");

+            for (var ki = 0; ki < configs.length; ki++) {

+                if (configs[ki].value == target.selectedAutoProfile()) {

+                    return ki;

+                }

+            }

+            return configs.length - 1;

+        }

+

+		//获取apn索引

+

+        function getApnIndex() {

+            var configs = $("#profile option");

+            if (configs.length == 0) {

+                configs = target.profiles();

+            }

+            var ki = 0;

+            for (; ki < configs.length; ki++) {

+                if (configs[ki].value == target.selectedProfile()) {

+                    break;

+                }

+            }

+            return ki;

+        }

+

+        //保存APN设置信息

+

+        target.saveAct = saveActFunc;

+

+		//编辑APN信息

+

+        function editApnSetting(preAct) { //默认设置按钮触发为TRUE

+            showLoading();

+            var apnIndex = getApnIndex();

+            var sameInfo = false;

+            if (config.IPV4V6_SUPPORT && target.selectedPdpType() == 'IPv4v6') {

+                sameInfo = true;

+            }

+            var needDoDefault = false;

+            if (preAct || (target.predeterminedCfg() || target.defaultCfg())) {

+                needDoDefault = true;

+            }

+            service.addOrEditApn({

+                profileName: target.profileName(),

+                pdpType: target.selectedPdpType(),

+                index: apnIndex,

+

+                wanApn: target.apn(),

+                authMode: target.selectedAuthentication(),

+                username: target.username(),

+                password: target.password(),

+                dnsMode: config.SHOW_APN_DNS ? target.dnsMode() : 'auto',

+                dns1: config.SHOW_APN_DNS ? target.dns1() : '',

+                dns2: config.SHOW_APN_DNS ? target.dns2() : '',

+

+                wanApnV6: sameInfo ? target.apn() : target.apnV6(),

+                authModeV6: sameInfo ? target.selectedAuthentication() : target.selectedAuthenticationV6(),

+                usernameV6: sameInfo ? target.username() : target.usernameV6(),

+                passwordV6: sameInfo ? target.password() : target.passwordV6(),

+                dnsModeV6: config.SHOW_APN_DNS ? (sameInfo ? target.dnsMode() : target.dnsModeV6()) : 'auto',

+                dns1V6: config.SHOW_APN_DNS ? (sameInfo ? target.dns1() : target.dns1V6()) : '',

+                dns2V6: config.SHOW_APN_DNS ? (sameInfo ? target.dns2() : target.dns2V6()) : ''

+            }, function (data) {

+                if (data.result) {

+                    apnSettings = getApnSet();

+                    if (target.profileName() != target.selectedProfile()) {

+                        var newProfileName = target.profileName();

+                        target.profiles(getProfileOptions(apnSettings.apnConfigs));

+                        $('#profile').val(newProfileName).trigger('change');

+                    }

+                    if (needDoDefault == false) {

+                        successOverlay();

+                    } else {

+                        doSetDefaultAct();

+                    }

+                } else {

+                    errorOverlay();

+                }

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+

+        //新增APN信息

+

+        function addNewApnSetting() {

+            showLoading("waiting");

+            var optionLen = $("option", "#profile").length;

+            if (optionLen < config.defaultApnSize) {

+                errorOverlay();

+                return;

+            }

+            // 支持IPv4v6,并且选择IPv4v6时,IPv4 与 IPv6下发相同的信息

+            // 支持IPv4 & v6,并且选择IPv4v6时,IPv4 与 IPv6下发各自的信息

+            var sameInfo = false;

+            if (config.IPV4V6_SUPPORT && target.selectedPdpType() == 'IPv4v6') {

+                sameInfo = true;

+            }

+

+            service.addOrEditApn({

+                profileName: target.profileName(),

+                pdpType: target.selectedPdpType(),

+                index: optionLen,

+

+                wanApn: target.apn(),

+                authMode: target.selectedAuthentication(),

+                username: target.username(),

+                password: target.password(),

+                dnsMode: config.SHOW_APN_DNS ? target.dnsMode() : 'auto',

+                dns1: config.SHOW_APN_DNS ? target.dns1() : '',

+                dns2: config.SHOW_APN_DNS ? target.dns2() : '',

+

+                wanApnV6: sameInfo ? target.apn() : target.apnV6(),

+                authModeV6: sameInfo ? target.selectedAuthentication() : target.selectedAuthenticationV6(),

+                usernameV6: sameInfo ? target.username() : target.usernameV6(),

+                passwordV6: sameInfo ? target.password() : target.passwordV6(),

+                dnsModeV6: config.SHOW_APN_DNS ? (sameInfo ? target.dnsMode() : target.dnsModeV6()) : 'auto',

+                dns1V6: config.SHOW_APN_DNS ? (sameInfo ? target.dns1() : target.dns1V6()) : '',

+                dns2V6: config.SHOW_APN_DNS ? (sameInfo ? target.dns2() : target.dns2V6()) : ''

+            }, function (data) {

+                if (data.result) {

+                    apnSettings = getApnSet();

+                    if (target.profileName() != target.selectedProfile()) {

+                        var newProfileName = target.profileName();

+                        target.profiles(getProfileOptions(apnSettings.apnConfigs));

+                        $('#profile').val(newProfileName).trigger('change');

+                    }

+                    doSetDefaultAct();

+                } else {

+                    errorOverlay();

+                }

+            }, function (data) {

+                errorOverlay();

+            });

+        }

+

+

+

+        var tempApn = {};

+		//删除APN

+

+        target.deleteAct = deleteActFunc;

+

+		//取消新增APN

+

+        target.cancelAddAct = cancelAddActFunc;

+

+        //进入新增APN页面

+

+        target.addAct = addActFunc;

+		//进入新增APN页面

+		function addActFunc() {

+            clearValidateMsg('#apn_setting_form');

+            target.pdpTypeNote(true);

+            target.disableProfile(true);

+            target.addApnHide(true);

+            tempApn = {

+                profileName: target.profileName(),

+                selectedPdpType: target.selectedPdpType(),

+

+                wanApnV6: target.apnV6(),

+                dnsModeV6: config.SHOW_APN_DNS ? target.dnsModeV6() : 'auto',

+                dns1V6: config.SHOW_APN_DNS ? target.dns1V6() : '',

+                dns2V6: config.SHOW_APN_DNS ? target.dns2V6() : '',

+                authModeV6: target.selectedAuthenticationV6(),

+                usernameV6: target.usernameV6(),

+                passwordV6: target.passwordV6(),

+

+                wanApn: target.apn(),

+                dnsMode: config.SHOW_APN_DNS ? target.dnsMode() : 'auto',

+                dns1: config.SHOW_APN_DNS ? target.dns1() : '',

+                dns2: config.SHOW_APN_DNS ? target.dns2() : '',

+                authMode: target.selectedAuthentication(),

+                username: target.username(),

+                password: target.password(),

+

+            };

+            target.profileName("");

+            target.selectedPdpType("IP");

+            target.selectedPdpTypeTmp("IP");

+

+            target.apnV6("");

+            target.dnsModeV6("auto");

+            target.dns1V6("");

+            target.dns2V6("");

+            target.selectedAuthenticationV6("none");

+            target.usernameV6("");

+            target.passwordV6("");

+

+            target.apn("");

+            target.dnsMode("auto");

+            target.dns1("");

+            target.dns2("");

+            target.selectedAuthentication("none");

+            target.username("");

+            target.password("");

+

+        }

+

+		//取消新增APN

+		function cancelAddActFunc() {

+            clearValidateMsg('#apn_setting_form');

+            target.pdpTypeNote(false);

+            target.disableProfile(false);

+            target.addApnHide(false);

+            target.profileName(tempApn.profileName);

+            target.selectedPdpType(tempApn.selectedPdpType);

+            target.selectedPdpTypeTmp(tempApn.selectedPdpType);

+

+            target.apnV6(tempApn.wanApnV6);

+            target.dnsModeV6(tempApn.dnsModeV6);

+            target.dns1V6(tempApn.dns1V6);

+            target.dns2V6(tempApn.dns2V6);

+            target.selectedAuthenticationV6(tempApn.authModeV6);

+            target.usernameV6(tempApn.usernameV6);

+            target.passwordV6(tempApn.passwordV6);

+

+            target.apn(tempApn.wanApn);

+            target.dnsMode(tempApn.dnsMode);

+            target.dns1(tempApn.dns1);

+            target.dns2(tempApn.dns2);

+            target.selectedAuthentication(tempApn.authMode);

+            target.username(tempApn.username);

+            target.password(tempApn.password);

+

+        }

+

+		//删除APN

+		function deleteActFunc() {

+            if (!target.selectedProfile()) {

+                showAlert("apn_no_select_alert");

+                return false;

+            }

+            if (target.predeterminedCfg()) { //预置的apn不允许删除

+                errorOverlay("apn_delete_cant_delete_default");

+                return false;

+            }

+            if (getApnSet().profileName == target.profileName()) {

+                errorOverlay("apn_cant_delete_current");

+                return false;

+            }

+

+            showConfirm("apn_delete_confirm", function () {

+                showLoading('deleting');

+                service.deleteApn({

+                    index: getApnIndex()

+                }, function (data) {

+                    if (data.result) {

+                        target.profiles(getProfileOptions(getApnSet().apnConfigs));

+                        target.selectedProfile(target.defApn());

+                        target.profileChangeHandler();

+                        successOverlay();

+                    } else {

+                        errorOverlay();

+                    }

+                }, function (data) {

+                    errorOverlay();

+                });

+            });

+        }

+

+		//保存APN设置信息

+		function saveActFunc() {

+            if (!$('#apn_setting_form').valid()) {

+                return false;

+            }

+            if (!target.selectedProfile() && !target.disableProfile()) { //不是增加时的设置需要判断是否选择了Profile

+                showAlert("apn_no_select_alert");

+                return false;

+            }

+            var exist = false;

+            $.each(target.profiles(), function (i, e) {

+                if (e.value == target.profileName()) {

+                    exist = true;

+                }

+            });

+

+            if (target.disableProfile() == false) {

+                if (exist && target.selectedProfile() != target.profileName()) {

+                    showInfo("apn_save_profile_exist");

+                    return false;

+                }

+                if (target.predeterminedCfg()) { //预置的APN不可以修改

+                    errorOverlay();

+                    return false;

+                }

+                if (target.predeterminedCfg() || target.defaultCfg()) {

+                    //showConfirm("apn_alert", function () {

+                    editApnSetting(false);

+                    //});

+                } else {

+                    editApnSetting(false);

+                }

+            } else {

+

+                if ($("#profile option").length >= config.maxApnNumber) {

+                    showInfo({

+                        msg: "apn_profile_full",

+                        params: [config.maxApnNumber]

+                    });

+                    return false;

+                }

+                if (exist) {

+                    showInfo("apn_save_profile_exist");

+                    return false;

+                }

+                var info = service.getStatusInfo();

+                if (info.connectStatus != "ppp_connected") {

+                    //showConfirm("apn_alert", function () {

+                    addNewApnSetting();

+                    //});

+

+                } else {

+					showConfirm("apn_diconneted_network_confirm", function () {

+                        showLoading('disconnecting');

+                        service.disconnect({}, function (data) {

+                            if (data.result) {

+                                config.connect_flag = true;

+                                addNewApnSetting();

+                            } else {

+                                errorOverlay();

+                            }

+                        });

+                    });

+                }

+            }

+        }

+

+		function getSelectedManualProfileFunc() {

+            var cfg = {};

+            var profileVal = $("#profile").val();

+            if (typeof target.selectedProfile() == 'undefined') {

+                target.selectedProfile(profileVal);

+            }

+            var cfgV4 = apnConfigs[profileVal];

+            var cfgV6 = ipv6ApnConfigs[profileVal];

+            if (cfgV4 && !cfgV6) {

+                $.extend(cfg, cfgV4);

+            } else if (cfgV4 && cfgV6) {

+                if (!!cfgV4.pdpType) {

+                    $.extend(cfg, cfgV6);

+                    $.extend(cfg, cfgV4);

+                } else {

+                    $.extend(cfg, cfgV4);

+                    $.extend(cfg, cfgV6);

+                }

+            }

+            return cfg;

+        }

+

+		//APN mode change 事件处理

+		function apnModeChangeHandlerFunc(data, event) {

+            if (target.apnMode() != 'auto') {

+                target.profileChangeHandler();

+            } else {

+                if (target.showAutoApnDetail()) {

+                    target.autoProfileChangeHandler();

+                }

+            }

+            return true;

+        }

+

+		//设置为默认apn

+		function setDefaultActFunc() {

+            if (!target.selectedProfile()) {

+                showAlert("apn_no_select_alert");

+                return false;

+            }

+            var connectStatus = service.getConnectionInfo().connectStatus;

+             if (connectStatus == "ppp_connecting") {

+                showAlert({

+                    msg: "apn_cant_modify_status",

+                    params: [$.i18n.prop("connecting").toLowerCase()]

+                });

+                return false;

+            } else if (connectStatus == "ppp_disconnecting") {

+                showAlert({

+                    msg: "apn_cant_modify_status",

+                    params: [$.i18n.prop("disconnecting").toLowerCase()]

+                });

+                return false;

+            } else if (connectStatus == "ppp_connected") {

+                showAlert({

+                    msg: "apn_cant_modify_status",

+                    params: [$.i18n.prop("connected").toLowerCase()]

+                });

+                return false;

+            }

+            if (target.apnMode() == 'auto' || target.predeterminedCfg()) {

+                //showConfirm("apn_alert", function () {

+                showLoading("waiting");

+                doSetDefaultAct();

+                //});

+            } else {

+                if ($('#apn_setting_form').valid() == false) {

+                    $(".error:first", "#apn_setting_form").focus();                    

+                } else {

+					var exist = false;

+                    $.each(target.profiles(), function (i, e) {

+                        if (e.value == target.profileName()) {

+                            exist = true;

+                        }

+                    });

+                    if (exist && target.selectedProfile() != target.profileName()) {

+                        showInfo("apn_save_profile_exist");

+                        return false;

+                    }

+                    //showLoading("waiting");

+                    //showConfirm("apn_alert", function () {

+                    editApnSetting(true);

+                    //});

+                }

+            }

+        }

+

+		//切换profile时重置下面的显示项

+		function setUIDataFunc(data) {

+            clearValidateMsg('#apn_setting_form');

+            if (!data) {

+                return;

+            }

+            target.selectedPdpType(data.pdpType || 'IP');

+            target.selectedPdpTypeTmp(data.pdpType || 'IP');

+            target.profileName(data.profileName);

+

+            target.apn(data.wanApn);

+            target.dnsMode(data.dnsMode != 'manual' ? 'auto' : 'manual');

+            target.dns1(data.dns1);

+            target.dns2(data.dns2);

+            target.username(data.username);

+            target.password(data.password);

+            target.selectedAuthentication(data.authMode || 'none');

+

+            target.apnV6(data.wanApnV6);

+            target.dnsModeV6(data.dnsModeV6 != 'manual' ? 'auto' : 'manual');

+            target.dns1V6(data.dns1V6);

+            target.dns2V6(data.dns2V6);

+            target.usernameV6(data.usernameV6);

+            target.passwordV6(data.passwordV6);

+            target.selectedAuthenticationV6(data.authModeV6 || 'none');

+        }

+

+		//profile change 事件处理

+		function profileChangeHandlerFunc(data, event) {

+            target.pdpTypeNote(true);

+            if (target.apnMode() != 'manual') {

+                return true;

+            }

+            var cfg = target.getSelectedManualProfile();

+            target.setUIData(cfg);

+            checkDefaultProfileStatus();

+            return true;

+        }

+

+		//auto apn profile change 事件处理

+		function autoProfileChangeHandlerFunc(data, event) {

+            if (target.apnMode() != 'auto') {

+                return true;

+            }

+            var cfg = autoApnConfigs[target.selectedAutoProfile()];

+            target.setUIData(cfg);

+            checkDefaultProfileStatus();

+            return true;

+        }

+

+		function pdpTypeChangeAlertFunc() {

+            if (target.pdpTypeNote()) {

+                showAlert({

+                    msg: "apn_pdptype_change_note",

+                    params: [data.lanDomain, data.ipAddress]

+                });

+            }

+            if (target.apnMode() != "auto" && !target.disableProfile()) { //如果是手动非ADD状态,切换PDP类型时,不改变界面显示的各项值

+                if ((config.IPV4_AND_V6_SUPPORT && target.selectedPdpTypeTmp() != 'IPv4v6' && target.selectedPdpType() != 'IPv4v6') || !config.IPV4_AND_V6_SUPPORT) { //

+                    if (target.selectedPdpTypeTmp() == 'IPv6') { //V6 -> V4 / V4V6

+                        target.apn(target.apnV6());

+                        target.dnsMode(target.dnsModeV6());

+                        target.dns1(target.dns1V6());

+                        target.dns2(target.dns2V6());

+                        target.username(target.usernameV6());

+                        target.password(target.passwordV6());

+                        target.selectedAuthentication(target.selectedAuthenticationV6());

+                    } else if (target.selectedPdpType() == 'IPv6') { //V4 / V4V6 -> V6

+                        target.apnV6(target.apn());

+                        target.dnsModeV6(target.dnsMode());

+                        target.dns1V6(target.dns1());

+                        target.dns2V6(target.dns2());

+                        target.usernameV6(target.username());

+                        target.passwordV6(target.password());

+                        target.selectedAuthenticationV6(target.selectedAuthentication());

+                    }

+                }

+            }

+            target.selectedPdpTypeTmp(target.selectedPdpType());

+        }

+

+

+    }

+

+    //是否已联网

+

+    function isConnectedNetWork() {

+        var info = service.getConnectionInfo();

+        return info.connectStatus == "ppp_connected";

+    }

+

+    function initVar() {

+        apnConfigs = {};

+        ipv6ApnConfigs = {};

+        autoApnConfigs = {};

+    }

+	function bindContainer(vm){

+		var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(vm, container[0]);

+	}

+    //初始化ViewModel

+

+    function initialize(formInit) {

+        initVar();

+

+        var vm = new APNViewModel();

+		bindContainer(vm);

+

+        if (!formInit) {

+            addInterval(function () {

+                vm.setDefaultVisible(!isConnectedNetWork());

+            }, 1000);

+        }

+        $('#apn_setting_form').validate({

+            submitHandler: function () {

+                vm.saveAct();

+            },

+            rules: {

+                profile_name: 'apn_profile_name_check',

+                apn_ipv4_apn: 'apn_check',

+                apn_dns1_ipv4: "ipv4",

+                apn_dns2_ipv4: "ipv4",

+                apn_ipv6_apn: 'apn_check',

+                apn_dns1_ipv6: "ipv6",

+                apn_dns2_ipv6: "ipv6",

+                apn_user_name_ipv4: 'ppp_username_check',

+                apn_secretcode_ipv4: 'ppp_secretcode_check',

+                apn_user_name_ipv6: 'ppp_username_check',

+                apn_secretcode_ipv6: 'ppp_secretcode_check'

+            }

+        });

+    }

+

+    return {

+        init: initialize

+    };

+});

+define("network_info","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+        function NetInfoVM() {

+            var target = this;

+            var network_status = service.getNetworkStatus();

+

+            target.pci = ko.observable(network_status.pci);

+            target.sinr = ko.observable(network_status.sinr);

+            target.rsrp = ko.observable(network_status.rsrp);

+            target.rsrq = ko.observable(network_status.rsrq);

+            target.plmn = ko.observable(network_status.plmn);

+            target.cellid = ko.observable(network_status.cellid);

+            target.band = ko.observable(network_status.band);

+        }

+

+        function initialize() {

+            var container = $('#container');

+            ko.cleanNode(container[0]);

+            var imVm = new NetInfoVM();

+            ko.applyBindings(imVm, container[0]);

+        }

+

+        return {

+            init: initialize

+        };

+});

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/set.js b/lynq/MD310EU/ap/app/zte_webui/js/set.js
new file mode 100755
index 0000000..f2dc0cc
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/set.js
@@ -0,0 +1,959 @@
+define(function () {

+    var config = {

+        WEBUI_TITLE: '4G Hostless Modem', //title配置, 具体参考各设备下的配置

+        ALREADY_NOTICE: false, //是否已经提醒,有在线升级信息

+        ALREADY_OTA_NOTICE: false, //是否OTA升级提醒过

+        dbMsgs: [], //数据库中全部的短消息

+        listMsgs: [], //经解析关联后的所有短消息

+        currentChatObject: null, //当前聊天对象的手机号

+        smsMaxId: 0, //短消息最大编号

+        phonebook: [], //电话本记录

+        smsIsReady: false, //缓存短信初始化状态

+        portForwardMax: 10, //端口转发最大规则数

+        urlFilterMax: 10, //URL filter最大规则数

+        defaultApnSize: 1, //出厂设置默认APN的个数

+        maxApnNumber: 10, //最大APN个数

+        RJ45_SUPPORT: false, //是否支持rj45

+        TSW_SUPPORT: false, // 是否支持定时休眠唤醒

+        WIFI_SLEEP_SUPPORT: true, // 是否支持wifi休眠

+        HAS_BATTERY: true, //是否有电池

+        FAST_BOOT_SUPPORT: true, //是否支持快速开机

+        TURN_OFF_SUPPORT: true, //是否支持关机

+        PRODUCT_TYPE: 'UFI', // 产品类型UFI、CPE

+        IS_TEST: false, //配置是否是模拟数据

+        NATIVE_UPDATE_FILE_SIZE: 64, //支持的本地升级文件大小上限,单位为M

+        DDNS_SUPPORT: false, //DDNS

+        MAX_LOGIN_COUNT: 5, //最大登录次数,密码输入错误次数到了以后会账户冻结一定时间

+        LOGIN_SECURITY_SUPPORT: true, //是否支持登录安全

+        LOGIN_THEN_CHECK_PIN: true, //是否先登录后验证PIN,PUK

+        GUEST_HASH: ['#httpshare_guest'],

+        DEVICE: 'ext', //各个型号机配置文件路径

+        connect_flag: false,

+        defaultRoute: '#entry',

+        IPV4_AND_V6_SUPPORT: false, //是否支持IPv4 & v6。 双PDP双栈

+        IPV4V6_SUPPORT: true, //是否支持ipv4v6。 IPV4V6_SUPPORT和IPV4_AND_V6_SUPPORT不可同时为true.单PDP双栈

+        IPV6_SUPPORT: true, //是否支持ipv6

+        EMPTY_APN_SUPPORT: false, //是否支持空apn

+        SHOW_APN_DNS: false, //APN设置页面是否显示DNS,不显示则dnsMode默认设置为auto

+        TRAFFIC_SUPPORT: true, //是否支持流量功能

+        CLEAR_DATA_SUPPORT: false, //是否支持流量和时间清空功能

+        NETWORK_UNLOCK_SUPPORT: false, //是否支持解锁

+        SHOW_MAC_ADDRESS: false, //是否显示mac地址

+        PASSWORD_ENCODE: true, //登录密码和WIFI密码是否加密

+        AP_STATION_SUPPORT: false, //是否支持AP Station功能

+        AP_STATION_LIST_LENGTH: 10,

+        WIFI_WEP_SUPPORT: false, //是否支持wifi WEP加密

+        WIFI_WAP3_SUPPORT: true, //是否支持wifi WAP3加密

+        WIFI_WPA2_WAP3_SUPPORT: true, //是否支持wifi WPA2/WAP3兼容模式

+        WIFI_HAS_5G: false,

+        WIFI_BAND_SUPPORT: false, //是否支持wifi频段设置

+        WIFI_BANDWIDTH_SUPPORT: false, //是否支持频带宽度

+        WIFI_BANDWIDTH_SUPPORT_40MHZ: false, //频带宽度是否支持40MHZ,reltek芯片支持

+        WIFI_SUPPORT_QR_CODE: true, //是否支持wifi二维码显示

+        WIFI_SUPPORT_QR_SWITCH: false, //是否支持wifi二维码显示控制

+        WIFI_SWITCH_SUPPORT: true, //是否支持wifi开关

+        MAX_STATION_NUMBER: 32, //CPE WIFI最大连接数为32

+        SHOW_WIFI_AP_ISOLATED: false, // 是否显示AP隔离

+        STATION_BLOCK_SUPPORT: false, // 已连接设备是否支持Block功能

+        UPGRADE_TYPE: "FOTA", //取值有"NONE","OTA","FOTA","TWO_PORTION"

+        SMS_UNREAD_NUM_INCLUDE_SIM: false, //未读短息数量是否包含SIM侧

+        SMS_DATABASE_SORT_SUPPORT: true, //短信是否支持DB排序

+        SMS_MATCH_LENGTH: 11, //短信联系人号码匹配位数,11国内项目,8国际项目

+        SHOW_UN_COMPLETE_CONCAT_SMS: true, //级联短信未接收完是否显示相关级联短信

+        SMS_SET_READ_WHEN_COMPLETE: false, //聊天过程中,级联短信只有接受完成后才能自动设置为已读

+        SD_CARD_SUPPORT: false, //是否支持SD卡

+        SD_BASE_PATH: '/mmc2', //SD 卡根目录

+        //modem_main_state的临时状态,一般需要界面轮询等待

+        TEMPORARY_MODEM_MAIN_STATE: ["modem_undetected", "modem_detected", "modem_sim_state", "modem_handover", "modem_imsi_lock", "modem_online", "modem_offline"],

+        ISNOW_NOTICE: false, //FOTA是否正在提示有新版本

+        INCLUDE_MOBILE: true,

+        HAS_USSD: false, // 是否支持USSD功能,

+        HAS_URL: false, // 是否支持URL过滤,

+        HAS_CASCADE_SMS: true, //是否支持级联短信

+        HAS_FOTA: true, //是否支持FOTA

+        HAS_UPDATE_CHECK: true, //是否支持升级检测设置

+        HAS_PHONEBOOK: true, //是否有电话本功能

+        HAS_SMS: true, //是否有短信功能

+        HAS_PARENTAL_CONTROL: false, // 是否支持家长控制功能

+        HAS_MULTI_SSID: false, //多ssid功能

+        HAS_WIFI: true, //是否包含wifi功能

+        HAS_QUICK_SETTING: true, //是否支持快速设置

+        HAS_SNTP: true, //是否支持时间管理

+        HAS_BLACK_AND_WHITE_FILTER: false, //是否支持黑白名单

+        HAS_LOGIN: true, //是否有登录页面

+        HAS_UPNP: true, //是否支持UPNP

+        BAUD_RATES: [{

+                name: '9600',

+                value: '9600'

+            }, {

+                name: '19200',

+                value: '19200'

+            }, {

+                name: '38400',

+                value: '38400'

+            }, {

+                name: '57600',

+                value: '57600'

+            }, {

+                name: '115200',

+                value: '115200'

+            }, {

+                name: '230400',

+                value: '230400'

+            }, {

+                name: '460800',

+                value: '460800'

+            }, {

+                name: '921600',

+                value: '921600'

+            }

+        ],

+        FORWARDING_MODES: [{

+                name: 'Unconditional forwarding',

+                value: '1'

+            }, {

+                name: 'When busy',

+                value: '2'

+            }, {

+                name: 'When no answer',

+                value: '3'

+            }, {

+                name: 'Cancel all forwarding',

+                value: '0'

+            }

+        ],

+        wdsModes: [{

+                name: "Disable",

+                value: "0"

+            }, {

+                name: "RootAP Mode",

+                value: "1"

+            }, {

+                name: "Bridge Mode",

+                value: "2"

+            }, {

+                name: "Repeater Mode",

+                value: "3"

+            }

+        ],

+        daylightSave: [{

+                name: "Disable",

+                value: "0"

+            }, {

+                name: "Enable",

+                value: "1"

+            }

+        ],

+        sntpTimeSetMode: [{

+                name: 'manual',

+                value: 'manual'

+            }, {

+                name: 'auto',

+                value: 'auto'

+            }

+        ],

+        //时区

+        timeZone: [{

+                name: "(GMT-12:00) Dateline West",

+                value: "<-12>12_0"

+            }, {

+                name: "(GMT-11:00) Midway Islands, Samoa",

+                value: "SST11_0"

+            }, {

+                name: "(GMT-10:00) Hawaii",

+                value: "<-10>10_0"

+            }, {

+                name: "(GMT-09:00) Alaska",

+                value: "<-09>9_0"

+            }, {

+                name: "(GMT-08:00) Pacific time (USA and Canada), Tijuana",

+                value: "PST8PDT,M3.2.0,M11.1.0_0"

+            }, {

+                name: "(GMT-07:00) Mountain time (USA and Canada)",

+                value: "<-07>7_0"

+            }, {

+                name: "(GMT-07:00) Arizona",

+                value: "<-07>7_1"

+            }, {

+                name: "(GMT-07:00) Chihuahua, La Paz, Mazza Tran",

+                value: "MST7MDT,M4.1.0,M10.5.0_2"

+            }, {

+                name: "(GMT-06:00) Saskatchewan",

+                value: "<-06>6_0"

+            }, {

+                name: "(GMT-06:00) Central time (USA and Canada)",

+                value: "<-06>6_1"

+            }, {

+                name: "(GMT-06:00) Central America",

+                value: "<-06>6_2"

+            }, {

+                name: "(GMT-06:00) Guadalajara City, Mexico City, Monterey",

+                value: "<-06>6_3"

+            }, {

+                name: "(GMT-05:00) Bogota, Lima, Quito",

+                value: "<-05>5_0"

+            }, {

+                name: "(GMT-05:00) Eastern time (USA and Canada)",

+                value: "<-05>5_1"

+            }, {

+                name: "(GMT-05:00) Indiana (East)",

+                value: "EST5EDT,M3.2.0,M11.1.0_2"

+            }, {

+                name: "(GMT-04:00) Atlantic time (Canada)",

+                value: "AST4ADT,M3.2.0,M11.1.0_0"

+            }, {

+                name: "(GMT-04:00) Caracas, La Paz",

+                value: "<-04>4_1"

+            }, {

+                name: "(GMT-04:00) Santiago",

+                value: "<-04>4<-03>,M8.2.6/24,M5.2.6/24_2"

+            }, {

+                name: "(GMT-03:30) Newfoundland",

+                value: "NST3:30NDT,M3.2.0,M11.1.0_0"

+            }, {

+                name: "(GMT-03:00) Brasilia",

+                value: "<-03>3_0"

+            }, {

+                name: "(GMT-03:00) Buenos Aires, Georgetown",

+                value: "<-03>3_1"

+            }, {

+                name: "(GMT-03:00) Greenland",

+                value: "<-03>3_2"

+            }, {

+                name: "(GMT-02:00) Mid-Atlantic",

+                value: "<-02>2_0"

+            }, {

+                name: "(GMT-01:00) Cape Verde Islands",

+                value: "<-01>1_0"

+            }, {

+                name: "(GMT-01:00) Azores",

+                value: "<-01>1<+00>,M3.5.0/0,M10.5.0/1_1"

+            }, {

+                name: "(GMT) GMT: Dublin, Edinburgh, London, Lisbon",

+                value: "GMT0IST,M3.5.0/1,M10.5.0_0"

+            }, {

+                name: "(GMT) Casablanca, Monrovia",

+                value: "WET0WEST,M3.5.0,M10.5.0/3_1"

+            }, {

+                name: "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",

+                value: "CET-1CEST,M3.5.0,M10.5.0/3_0"

+            }, {

+                name: "(GMT+01:00) Belgrad, Bratislava, Budapest, Ljubljana, Prague",

+                value: "CET-1CEST,M3.5.0,M10.5.0/3_1"

+            }, {

+                name: "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris",

+                value: "CET-1CEST,M3.5.0,M10.5.0/3_2"

+            }, {

+                name: "(GMT+01:00) Sarajevo, Skopje,Warsaw, Zagreb",

+                value: "CET-1CEST,M3.5.0,M10.5.0/3_3"

+            }, {

+                name: "(GMT+01:00) Western Central African",

+                value: "<+01>-1_4"

+            }, {

+                name: "(GMT+02:00) Bucharest",

+                value: "EET-2EEST,M3.5.0/3,M10.5.0/4_0"

+            }, {

+                name: "(GMT+02:00) Pretoria, Harare",

+                value: "CAT-2_1"

+            }, {

+                name: "(GMT+02:00) Helsinki, Kiev, Riga, Sofia, Tallinn, Vilnius",

+                value: "EET-2EEST,M3.5.0/3,M10.5.0/4_2"

+            }, {

+                name: "(GMT+02:00) Cairo",

+                value: "EET-2_3"

+            }, {

+                name: "(GMT+02:00) Athens, Beirut, Istanbul, Minsk",

+                value: "EET-2EEST,M3.5.0/3,M10.5.0/4_4"

+            }, {

+                name: "(GMT+02:00) Jerusalem",

+                value: "IST-2IDT,M3.4.5/02:00:00,M10.5.0/02:00:00_5"

+            }, {

+                name: "(GMT+03:00) Baghdad",

+                value: "<+03>-3_0"

+            }, {

+                name: "(GMT+03:00) Riyadh, Kuwait",

+                value: "<+03>-3_1"

+            }, {

+                name: "(GMT+03:00) Moscow, St Petersburg, Volgograd",

+                value: "<+03>-3_2"

+            }, {

+                name: "(GMT+03:00) Nairobi",

+                value: "EAT-3_3"

+            }, {

+                name: "(GMT+03:30) Teheran",

+                value: "<+0330>-3:30<+0430>,J80/0,J264/0_0"

+            }, {

+                name: "(GMT+04:00) Abu Zabi, Muscat",

+                value: "<+04>-4_0"

+            }, {

+                name: "(GMT+04:00) Baku, Tbilisi, Yerevan",

+                value: "<+04>-4_1"

+            }, {

+                name: "(GMT+04:30) Kabul",

+                value: "<+0430>-4:30_0"

+            }, {

+                name: "(GMT+05:00) Yekaterinburg",

+                value: "<+05>-5_0"

+            }, {

+                name: "(GMT+05:00) Islamabad, Karachi, Tashkent",

+                value: "PKT-5_1"

+            }, {

+                name: "(GMT+05:30) Madras, Calcutta, Mumbai, New Delhi",

+                value: "<+0530>-5:30_0"

+            }, {

+                name: "(GMT+05:45) Kathmandu",

+                value: "<+0545>-5:45_0"

+            }, {

+                name: "(GMT+06:00) Ala Mutu, Novosibirsk",

+                value: "<+06>-6_0"

+            }, {

+                name: "(GMT+06:00) Dhaka, Astana",

+                value: "<+06>-6_1"

+            }, {

+                name: "(GMT+06:00) Sri Haya Ed Denny Pla",

+                value: "<+06>-6_2"

+            }, {

+                name: "(GMT+06:30) Yangon",

+                value: "<+0630>-6:30_0"

+            }, {

+                name: "(GMT+07:00) Krasnoyarsk",

+                value: "<+07>-7_0"

+            }, {

+                name: "(GMT+07:00) Bangkok, Hanoi, Jakarta",

+                value: "<+07>-7_1"

+            }, {

+                name: "(GMT+08:00) Beijing, Chongqing, Hongkong Special Administrative Region, Urumqi",

+                value: "CST-8_0"

+            }, {

+                name: "(GMT+08:00) Kuala Lumpur, Singapore",

+                value: "<+08>-8_1"

+            }, {

+                name: "(GMT+08:00) Perth",

+                value: "AWST-8_2"

+            }, {

+                name: "(GMT+08:00) Taipei",

+                value: "CST-8_3"

+            }, {

+                name: "(GMT+08:00) Irkutsk, Ulam Batu",

+                value: "<+08>-8_4"

+            }, {

+                name: "(GMT+09:00) Osaka, Sapporo, Tokyo",

+                value: "JST-9_0"

+            }, {

+                name: "(GMT+09:00) Seoul",

+                value: "KST-9_1"

+            }, {

+                name: "(GMT+09:00) Yakutsk",

+                value: "<+09>-9_2"

+            }, {

+                name: "(GMT+09:30) Adelaide",

+                value: "ACST-9:30ACDT,M10.1.0,M4.1.0/3_0"

+            }, {

+                name: "(GMT+09:30) Darwin",

+                value: "ACST-9:30_1"

+            }, {

+                name: "(GMT+10:00) Brisbane",

+                value: "AEST-10_0"

+            }, {

+                name: "(GMT+10:00) Vladivostok",

+                value: "<+10>-10_1"

+            }, {

+                name: "(GMT+10:00) Guam, Port Moresby",

+                value: "<+10>-10_2"

+            }, {

+                name: "(GMT+10:00) Hobart",

+                value: "AEST-10AEDT,M10.1.0,M4.1.0/3_3"

+            }, {

+                name: "(GMT+10:00) Canberra, Melbourne, Sydney",

+                value: "AEST-10AEDT,M10.1.0,M4.1.0/3_4"

+            }, {

+                name: "(GMT+11:00) Magadan, Solomon islands, New Caledonia",

+                value: "<+11>-11_0"

+            }, {

+                name: "(GMT+12:00) Wellington, Oakland",

+                value: "<+12>-12_0"

+            }, {

+                name: "(GMT+12:00) Fiji, Kamchatka, Marshall Islands",

+                value: "<+12>-12_1"

+            }, {

+                name: "(GMT+13:00) Nukualofa",

+                value: "<+13>-13_0"

+            }

+        ],

+

+        //短信保存时间

+        SMS_VALIDITY: [{

+                name: '12 hours',

+                value: 'twelve_hours'

+            }, {

+                name: 'A day',

+                value: 'one_day'

+            }, {

+                name: 'A week',

+                value: 'one_week'

+            }, {

+                name: 'The longest period',

+                value: 'largest'

+            }

+        ],

+        MAP_PROTOCOL_MODES: [{

+                name: "TCP+UDP",

+                value: "TCP&UDP"

+            }, {

+                name: "TCP",

+                value: "TCP"

+            }, {

+                name: "UDP",

+                value: "UDP"

+            }

+        ],

+        //端口转发协议

+        FORWARD_PROTOCOL_MODES: [{

+                name: "TCP+UDP",

+                value: "TCP&UDP"

+            }, {

+                name: "TCP",

+                value: "TCP"

+            }, {

+                name: "UDP",

+                value: "UDP"

+            }

+        ],

+        FILTER_PROTOCOL_MODES: [{

+                name: "NONE",

+                value: "None"

+            }, {

+                name: "TCP",

+                value: "TCP"

+            }, {

+                name: "UDP",

+                value: "UDP"

+            }, {

+                name: "ICMP",

+                value: "ICMP"

+            }

+        ],

+

+        //HTTPSHARE模式

+        SD_SHARE_ENABLE: [{

+                name: "Enable",

+                value: "1"

+            }, {

+                name: "Disable",

+                value: "0"

+            }

+        ],

+

+        SD_ACCESS_TYPE: [{

+                name: "entire_sd_card",

+                value: "1"

+            }, {

+                name: "custom_setting",

+                value: "0"

+            }

+        ],

+

+        SD_FILE_TO_SHARE: [{

+                name: "entire_sd_card",

+                value: "1"

+            }, {

+                name: "custom_setting",

+                value: "0"

+            }

+        ],

+

+        //国家码所述类型

+        countryCodeType: {

+            world: 3,

+            mkkc: 3,

+            apld: 7,

+            etsic: 3,

+            fcca: 1

+        },

+

+        countries_5g: {

+            NONE: "NONE",

+            AR: "ARGENTIA",

+            AM: "ՀԱՅԱՍՏԱՆ",

+            AU: "AUSTRILIA",

+            AT: "ÖSTERREICH",

+            AZ: "AZƏRBAYCAN",

+            BH: "البحرين",

+            BY: "БЕЛАРУСЬ",

+            BE: "BELGIË",

+            BA: "БОСНА И ХЕРЦЕГОВИНА",

+            BR: "BRASIL",

+            BN: "BRUNEI DARUSSALAM",

+            BG: "БЪЛГАРИЯ",

+            CL: "CHILE",

+            CN: "中国",

+            CR: "COSTA RICA",

+            HR: "HRVATSKA",

+            CY: "ΚΎΠΡΟΣ",

+            CZ: "ČESKÁ REPUBLIKA",

+            DK: "DANMARK",

+            EC: "ECUADOR",

+            EG: "مصر",

+            SV: "EL SALVADOR",

+            EE: "EESTI",

+            FI: "SUOMI",

+            FR: "FRANCE",

+            GE: "საქართველო",

+            DE: "DEUTSCHLAND",

+            GR: "ΕΛΛΆΔΑ",

+            HK: "香港",

+            HU: "MAGYARORSZÁG",

+            IS: "ÍSLAND",

+            IN: "INDIA",

+            ID: "INDONESIA",

+            IR: "ایران",

+            IE: "ÉIRE",

+            IL: "إسرائيل",

+            IT: "ITALIA",

+            JM: "JAMAICA",

+            JO: "الأردن",

+            KP: "조선민주주의인민공화국",

+            KR: "한국 ROK",

+            LV: "LATVIJA",

+            LI: "LIECHTENSTEIN",

+            LT: "LIETUVA",

+            LU: "LUXEMBOURG",

+            MO: "澳門",

+            MY: "MALAYSIA",

+            MT: "MALTA",

+            MC: "MONACO",

+            NL: "NEDERLAND",

+            AN: "Netherlands Antilles",

+            NO: "NORGE",

+            OM: "سلطنة عمان",

+            PE: "PERÚ",

+            PH: "PHILIPPINES",

+            PL: "POLSKA",

+            PT: "PORTUGAL",

+            SA: "السعودية",

+            SG: "SINGAPORE",

+            SK: "SLOVENSKÁ REPUBLIKA",

+            SI: "SLOVENIJA",

+            ZA: "SOUTH AFRICA",

+            ES: "ESPAÑA",

+            LK: "SRILANKA",

+            SE: "SVERIGE",

+            CH: "SCHWEIZ",

+            TT: "TRINIDAD AND TOBAGO",

+            TN: "تونس",

+            TR: "TÜRKİYE",

+            GB: "UNITED KINGDOM",

+            UY: "URUGUAY",

+            JP: "日本",

+            BZ: "BELIZE",

+            BO: "BOLIVIA",

+            NZ: "NEW ZEALAND",

+            VE: "VENEZUELA",

+            CA: "CANADA",

+            CO: "COLOMBIA",

+            DO: "REPÚBLICA DOMINICANA",

+            GT: "GUATEMALA",

+            MX: "MEXICO",

+            PA: "PANAMÁ",

+            PR: "PUERTO RICO",

+            TW: "台灣",

+            US: "UNITED STATES",

+            UZ: "O’zbekiston"

+        },

+

+        //国家码与语言匹配表

+        countries: {

+            NONE: "NONE",

+            AL: "SHQIPERI",

+            DZ: "الجزائر",

+            AR: "ARGENTIA",

+            AM: "ՀԱՅԱՍՏԱՆ",

+            AU: "AUSTRALIA",

+            AT: "ÖSTERREICH",

+            AZ: "AZƏRBAYCAN",

+            BD: "বাংলাদেশ",

+            BH: "البحرين",

+            BY: "БЕЛАРУСЬ",

+            BE: "BELGIË",

+            BA: "БОСНА И ХЕРЦЕГОВИНА",

+            BR: "BRASIL",

+            BN: "BRUNEI DARUSSALAM",

+            BG: "БЪЛГАРИЯ",

+            CL: "CHILE",

+            CN: "中国",

+            CR: "COSTA RICA",

+            HR: "HRVATSKA",

+            CY: "ΚΎΠΡΟΣ",

+            CZ: "ČESKÁ REPUBLIKA",

+            DK: "DANMARK",

+            EC: "ECUADOR",

+            EG: "مصر",

+            SV: "EL SALVADOR",

+            EE: "EESTI",

+            FI: "SUOMI",

+            FR: "FRANCE",

+            GE: "საქართველო",

+            DE: "DEUTSCHLAND",

+            GR: "ΕΛΛΆΔΑ",

+            HN: "HONDURAS",

+            HK: "香港",

+            HU: "MAGYARORSZÁG",

+            IS: "ÍSLAND",

+            IN: "INDIA",

+            ID: "INDONESIA",

+            IR: "ایران، جمهوری اسلامی",

+            IE: "ÉIRE",

+            IL: "إسرائيل",

+            IT: "ITALIA",

+            JM: "JAMAICA",

+            JO: "الأردن",

+            KZ: "КАЗАХСТАН",

+            KE: "KENYA",

+            KP: "조선민주주의인민공화국",

+            KR: "한국 ROK",

+            KW: "الكويت",

+            LV: "LATVIJA",

+            LB: "لبنان",

+            LI: "LIECHTENSTEIN",

+            LT: "LIETUVA",

+            LU: "LUXEMBOURG",

+            MO: "澳門",

+            MK: "МАКЕДОНИЈА",

+            MY: "MALAYSIA",

+            MT: "MALTA",

+            MC: "MONACO",

+            MA: "المغرب",

+            NL: "NEDERLAND",

+            AN: "NETHERLANDS ANTILLES",

+            NO: "NORGE",

+            OM: "سلطنة عمان",

+            PK: "PAKISTAN",

+            PE: "PERÚ",

+            PH: "PHILIPPINES",

+            PL: "POLSKA",

+            PT: "PORTUGAL",

+            QA: "قطر",

+            RO: "ROMÂNIA",

+            RU: "Российская Федерация",

+            SA: "السعودية",

+            SG: "SINGAPORE",

+            SK: "SLOVENSKÁ REPUBLIKA",

+            SI: "SLOVENIJA",

+            ZA: "SOUTH AFRICA",

+            ES: "ESPAÑA",

+            LK: "SRILANKA",

+            SE: "SVERIGE",

+            CH: "SCHWEIZ",

+            SY: "الجمهورية العربية السورية",

+            TH: "ประเทศไทย",

+            TT: "TRINIDAD AND TOBAGO",

+            TN: "تونس",

+            TR: "TÜRKİYE",

+            UA: "Україна",

+            AE: "الإمارات العربية المتحدة",

+            GB: "UNITED KINGDOM",

+            UY: "URUGUAY",

+            VN: "VIỆT NAM",

+            YE: "اليمن",

+            ZW: "ZIMBABWE",

+            JP: "日本",

+            BZ: "BELIZE",

+            BO: "BOLIVIA",

+            NZ: "NEW ZEALAND",

+            VE: "REPÚBLICA BOLIVARIANA DE VENEZUELA",

+            CA: "CANADA",

+            CO: "COLOMBIA",

+            DO: "REPÚBLICA DOMINICANA",

+            GT: "GUATEMALA",

+            MX: "MEXICO",

+            PA: "PANAMÁ",

+            PR: "PUERTO RICO",

+            TW: "台灣",

+            US: "UNITED STATES",

+            UZ: "O’zbekiston"

+        },

+        //国家码与类型匹配表

+        countryCode_5g: {

+            //88 countries of world【36 40 44 48】

+            one: {

+                codes: ["AL", "AI", "AW", "AT", "BY", "BM", "BA", "BW", "IO", "BG",

+                    "CV", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "GF", "PF",

+                    "TF", "GI", "DE", "GR", "GP", "GG", "HU", "IS", "IE", "IT",

+                    "KE", "LA", "LV", "LS", "LI", "LT", "LU", "MK", "MT", "IM",

+                    "MQ", "MR", "MU", "YT", "MC", "MS", "NL", "AN", "NO",

+                    "OM", "PL", "PT", "RE", "RO", "SM", "SN", "RS", "SK", "SI",

+                    "ZA", "ES", "SE", "CH", "TC", "UG", "GB", "VG", "WF", "ZM",

+                    "AF", "JO", "MA", "EH", "EU", "DZ", "IL", "MX", "PM", "TN",

+                    "TR", "JP"],

+                channels: [36, 40, 44, 48]

+            },

+            //60 countrys of world【36 40 44 48 149 153 157 161 165】

+            two: {

+                codes: ["AS", "AG", "AZ", "BR", "KH", "KY", "CO", "CR", "DM", "DO",

+                    "EC", "GH", "GD", "HK", "KZ", "KI", "FM", "MZ", "NA", "NZ",

+                    "NI", "NE", "PW", "PE", "PH", "PR", "VC", "TH", "TT", "UY",

+                    "ZW", "AU", "BH", "BB", "CA", "CL", "CX", "EG", "SV", "GT",

+                    "HT", "IN", "MY", "NF", "PA", "PG", "SG", "US", "VN"],

+                channels: [36, 40, 44, 48, 149, 153, 157, 161, 165]

+            },

+            //9 countrys of world【149 153 157 161】

+            three: {

+                codes: ["CU", "IR", "KR", "SY", "LB", "MW", "MO", "QA"],

+                channels: [149, 153, 157, 161]

+            },

+            //12 countrys of world【149 153 157 161 165】

+            four: {

+                codes: ["BD", "BF", "CN", "HN", "JM", "PK", "PY", "KN", "AR", "TW", "NG"],

+                channels: [149, 153, 157, 161, 165]

+            },

+            //1 country of world【36 40 44 48 149 153 157 161】

+            five: {

+                codes: ["SA"],

+                channels: [36, 40, 44, 48, 149, 153, 157, 161]

+            }

+        },

+        countryCode: {

+            world: ["AL", "DZ", "AR", "AM", "AU", "AT", "AZ", "BH", "BY",

+                "BE", "BA", "BR", "BN", "BG", "CL", "CN", "CR", "HR", "CY",

+                "CZ", "DK", "EC", "EG", "SV", "EE", "FI", "FR", "GE",

+                "DE", "GR", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IE",

+                "IL", "IT", "JM", "JO", "KZ", "KE", "KP", "KR", "KW", "LV",

+                "LB", "LI", "LT", "LU", "MO", "MK", "MY", "MT", "MC", "MA",

+                "NL", "AN", "NO", "OM", "PK", "PE", "PH", "PL", "PT", "QA",

+                "RO", "RU", "SA", "SG", "SK", "SI", "ZA", "ES", "LK",

+                "SE", "CH", "SY", "TH", "TT", "TN", "TR", "UA", "AE", "GB",

+                "UY", "VN", "YE", "ZW", "BD"],

+            mkkc: ["JP"],

+            apld: [],

+            etsic: ["BZ", "BO", "NZ", "VE"],

+            fcca: ["CA", "CO", "DO", "GT", "MX", "PA", "PR", "TW", "US", "UZ"]

+        },

+        //休眠时间

+        SLEEP_MODES: [{

+                name: "Always on",

+                value: "-1"

+            }, {

+                name: "5 minutes",

+                value: "5"

+            }, {

+                name: "10 minutes",

+                value: "10"

+            }, {

+                name: "20 minutes",

+                value: "20"

+            }, {

+                name: "30 minutes",

+                value: "30"

+            }, {

+                name: "1 hour",

+                value: "60"

+            }, {

+                name: "2 hours",

+                value: "120"

+            }

+        ],

+        DDNSSetMode: [{

+                name: 'Enable',

+                value: '1'

+            }, {

+                name: 'Disable',

+                value: '0'

+            }

+        ],

+        ddns_Modeselect: [{

+                name: 'manual',

+                value: 'manual'

+            }, {

+                name: 'auto',

+                value: 'auto'

+            }

+        ],

+        DDNSDDP: [{

+                name: 'dyndns.org',

+                value: 'dyndns.org'

+            }, {

+                name: 'freedns.afraid.org',

+                value: 'freedns.afraid.org'

+            }, {

+                name: 'zoneedit.com',

+                value: 'zoneedit.com'

+            }, {

+                name: 'no-ip.com',

+                value: 'no-ip.com'

+            }, {

+                name: 'None',

+                value: 'none'

+            }

+        ],

+        //RJ45连接模式

+        pppoeModes: [{

+                name: "PPPoE",

+                value: "PPPOE"

+            }, {

+                name: "Static",

+                value: "STATIC"

+            }, {

+                name: "DHCP",

+                value: "DHCP"

+            }, {

+                name: "AUTO",

+                value: "AUTO"

+            }

+        ],

+        //联网模式

+        AUTO_MODES: [{

+                name: 'Automatic',

+                value: 'NETWORK_auto'

+            }, {

+                name: '4G Only',

+                value: 'Only_LTE'

+            }, {

+                name: '3G Only',

+                value: 'Only_WCDMA'

+            }, {

+                name: '2G Only',

+                value: 'Only_GSM'

+            }

+        ],

+        //APN鉴权模式

+        APN_AUTH_MODES: [{

+                name: "NONE",

+                value: "none"

+            }, {

+                name: "CHAP",

+                value: "chap"

+            }, {

+                name: "PAP",

+                value: "pap"

+            }

+        ],

+        //语言

+        LANGUAGES: [{

+                name: 'English',

+                value: 'en'

+            }, {

+                name: '中文',

+                value: 'zh-cn'

+            }

+        ],

+        //wifi加密模式

+        AUTH_MODES: [{

+                name: 'NO ENCRYPTION',

+                value: 'OPEN'

+            }, {

+                name: 'WPA2(AES)-PSK',

+                value: 'WPA2PSK'

+            }, {

+                name: 'WPA-PSK/WPA2-PSK',

+                value: 'WPAPSKWPA2PSK'

+            }, {

+                name: 'WPA3-Personal',

+                value: 'WPA3Personal'

+            }, {

+                name: 'WPA2(AES)/WPA3-Personal',

+                value: 'WPA2WPA3'

+            }

+        ],

+        AUTH_MODES_WEP: [{

+                name: 'NO ENCRYPTION',

+                value: 'OPEN'

+            }, {

+                name: 'SHARED',

+                value: 'SHARED'

+            }, {

+                name: 'WPA2(AES)-PSK',

+                value: 'WPA2PSK'

+            }, {

+                name: 'WPA-PSK/WPA2-PSK',

+                value: 'WPAPSKWPA2PSK'

+            }, {

+                name: 'WPA3-Personal',

+                value: 'WPA3Personal'

+            }, {

+                name: 'WPA2(AES)/WPA3-Personal',

+                value: 'WPA2WPA3'

+            }

+        ],

+        AUTH_MODES_ALL: [{

+                name: 'NO ENCRYPTION',

+                value: 'OPEN'

+            }, {

+                name: 'SHARED',

+                value: 'SHARED'

+            }, {

+                name: 'WPA-PSK',

+                value: 'WPAPSK'

+            }, {

+                name: 'WPA2-PSK',

+                value: 'WPA2PSK'

+            }, {

+                name: 'WPA-PSK/WPA2-PSK',

+                value: 'WPAPSKWPA2PSK'

+            }, /*{

+                name: 'WPA3-Personal',

+                value: 'WPA3Personal'

+            }, {

+                name: 'WPA2(AES)/WPA3-Personal',

+                value: 'WPA2WPA3'

+            }, */{

+                name: 'EAP-SIM/AKA',

+                value: 'EAP-SIM/AKA'

+            }

+        ],

+

+        NETWORK_MODES: [{

+                name: '802.11 b/g/n',

+                value: '4'

+            }, {

+                name: '802.11 n only',

+                value: '2'

+            }

+        ],

+        NETWORK_MODES_BAND: [{

+                name: '802.11 a only',

+                value: '5'

+            }, {

+                name: '802.11 n only',

+                value: '2'

+            }, {

+                name: '802.11 a/n',

+                value: '4'

+            }

+        ],

+        resetContentModifyValue: function () {

+            this.CONTENT_MODIFIED.checkChangMethod = function () {

+                return false;

+            };

+            this.CONTENT_MODIFIED.modified = false;

+            this.CONTENT_MODIFIED.message = 'leave_page_info';

+            this.CONTENT_MODIFIED.callback = {

+                ok: $.noop,

+                no: function () {

+                    return true;

+                }

+            }; //如果no返回true,页面则保持原状

+            this.CONTENT_MODIFIED.data = {};

+        },

+        CONTENT_MODIFIED: {

+            modified: false,

+            message: 'leave_page_info',

+            data: {},

+            checkChangMethod: function () {

+                return false;

+            },

+            callback: {

+                ok: $.noop,

+                no: function () {

+                    return true;

+                }

+            } //如果no返回true,页面则保持原状

+        }, //当前页面内容是否已经修改

+

+    };

+

+    require([config.DEVICE + '/set'], function (otherConf) {

+        $.extend(config, otherConf);

+    });

+

+    return config;

+});

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/sim_device.js b/lynq/MD310EU/ap/app/zte_webui/js/sim_device.js
new file mode 100755
index 0000000..409b978
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/sim_device.js
@@ -0,0 +1,5063 @@
+define("sim_abnormal","jquery knockout service set main opmode".split(" "),

+    function ($, ko, service, config, home, opmode) {

+

+    function init() {

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        var vm = new simViewMode();

+        ko.applyBindings(vm, container);

+

+        $('#frmPUK').validate({

+            submitHandler: function () {

+                vm.enterPUK();

+            },

+            rules: {

+                txtNewPIN: "pin_check",

+                txtConfirmPIN: {

+                    equalToPin: "#txtNewPIN"

+                },

+                txtPUK: "puk_check"

+            }

+        });

+

+        $('#frmPIN').validate({

+            submitHandler: function () {

+                vm.enterPIN();

+            },

+            rules: {

+                txtPIN: "pin_check"

+            }

+        });

+    }

+

+    function simViewMode() {

+        var target = this;

+        var staInfo = service.getStatusInfo();

+        var curCableMode = "PPPOE" == staInfo.blc_wan_mode || "AUTO_PPPOE" == staInfo.blc_wan_mode;

+        target.hasRj45 = config.RJ45_SUPPORT;

+        target.hasSms = config.HAS_SMS;

+        target.hasPhonebook = config.HAS_PHONEBOOK;

+        target.isSupportSD = config.SD_CARD_SUPPORT;

+        target.hasUssd = config.HAS_USSD;

+        if (config.WIFI_SUPPORT_QR_SWITCH) {

+            var wifiInfo = service.getWifiBasic();

+            target.showQRCode = config.WIFI_SUPPORT_QR_CODE && wifiInfo.show_qrcode_flag;

+        } else {

+            target.showQRCode = config.WIFI_SUPPORT_QR_CODE;

+        }

+        if(config.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_ssid_wifikey.png?_=' + $.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        target.hasParentalControl = ko.observable(config.HAS_PARENTAL_CONTROL && curCableMode);

+        target.pageState = {

+            NO_SIM: 0,

+            WAIT_PIN: 1,

+            WAIT_PUK: 2,

+            PUK_LOCKED: 3,

+            LOADING: 4

+        };

+        target.isHomePage = ko.observable(false);

+        if (window.location.hash == "#main") {

+            target.isHomePage(true);

+        }

+

+        var info = service.getLoginData();

+        target.PIN = ko.observable();

+        target.newPIN = ko.observable();

+        target.confirmPIN = ko.observable();

+        target.PUK = ko.observable();

+        target.pinNumber = ko.observable(info.pinnumber);

+        target.pukNumber = ko.observable(info.puknumber);

+

+        var state = computePageState(info);

+        target.page = ko.observable(state);

+        if (state == target.pageState.LOADING) {

+            addTimeout(refreshPage, 500);

+        }

+        target.showOpModeWindow = function () {

+            showSettingWindow("change_mode", "opmode_popup", "opmode_popup", 400, 300, function () {});

+        };

+        target.isLoggedIn = ko.observable(false);

+        target.enableFlag = ko.observable(false);

+        //更新当前工作模式状态信息

+        target.refreshOpmodeInfo = function () {

+            var staInfo = service.getStatusInfo();

+            target.isLoggedIn(staInfo.isLoggedIn);

+

+            if (!curCableMode && checkCableMode(staInfo.blc_wan_mode)) { //如果有线,则重新加载

+                if (target.page() == target.pageState.NO_SIM || target.page() == target.pageState.WAIT_PIN || target.page() == target.pageState.WAIT_PUK || target.page() == target.pageState.PUK_LOCKED) {

+                    window.location.reload();

+                }

+            }

+

+            curCableMode = checkCableMode(staInfo.blc_wan_mode);

+            target.hasParentalControl(config.HAS_PARENTAL_CONTROL && curCableMode);

+            if (curCableMode && staInfo.ethWanMode.toUpperCase() == "DHCP") {

+                target.enableFlag(true);

+            } else if ((!curCableMode && staInfo.connectStatus != "ppp_disconnected") || (curCableMode && staInfo.rj45ConnectStatus != "idle" && staInfo.rj45ConnectStatus != "dead")) {

+                target.enableFlag(false);

+            } else {

+                target.enableFlag(true);

+            }

+            var mode = (staInfo.blc_wan_mode == "AUTO_PPP" || staInfo.blc_wan_mode == "AUTO_PPPOE") ? "AUTO" : staInfo.blc_wan_mode;

+            var currentOpMode = "";

+            switch (mode) {

+            case "PPP":

+                currentOpMode = "opmode_gateway";

+                break;

+            case "PPPOE":

+                currentOpMode = "opmode_cable";

+                break;

+            case "AUTO":

+                currentOpMode = "opmode_auto";

+                break;

+            default:

+                break;

+            }

+            $("#opmode").attr("data-trans", currentOpMode).text($.i18n.prop(currentOpMode));

+        }

+        //刷新页面状态

+        function refreshPage() {

+            var data = service.getLoginData();

+            var state = computePageState(data);

+            if (state == target.pageState.LOADING) {

+                addTimeout(refreshPage, 500);

+            } else {

+                target.page(state);

+                target.pinNumber(data.pinnumber);

+                target.pukNumber(data.puknumber);

+            }

+        }

+        //输入PUK设置新PIN事件处理

+        target.enterPUK = function () {

+            showLoading();

+            target.page(target.pageState.LOADING);

+            var newPIN = target.newPIN();

+            var confirmPIN = target.confirmPIN();

+            var params = {};

+            params.PinNumber = newPIN;

+            params.PUKNumber = target.PUK();

+            service.enterPUK(params, function (data) {

+                if (!data.result) {

+                    hideLoading();

+                    if (target.pukNumber() == 2) {

+                        showAlert("last_enter_puk", function () {

+                            refreshPage();

+                        });

+                    } else {

+                        showAlert("puk_error", function () {

+                            refreshPage();

+                            if (target.page() == target.pageState.PUK_LOCKED) {

+                                hideLoading();

+                            }

+                        });

+                    }

+                    target.PUK('');

+                    target.newPIN('');

+                    target.confirmPIN('');

+                } else {

+                    refreshPage();

+                    if (target.page() == target.pageState.PUK_LOCKED) {

+                        hideLoading();

+                    }

+                }

+            });

+        };

+        //验证输入PIN事件处理

+        target.enterPIN = function () {

+            showLoading();

+            target.page(target.pageState.LOADING);

+            var pin = target.PIN();

+            service.enterPIN({

+                PinNumber: pin

+            }, function (data) {

+                if (!data.result) {

+                    hideLoading();

+                    if (target.pinNumber() == 2) {

+                        showAlert("last_enter_pin", function () {

+                            refreshPage();

+                        });

+                    } else {

+                        showAlert("pin_error", function () {

+                            refreshPage();

+                        });

+                    }

+                    target.PIN('');

+                }

+                refreshPage();

+                if (target.page() == target.pageState.WAIT_PUK) {

+                    hideLoading();

+                }

+            });

+        };

+

+        if (target.hasRj45) {

+            target.refreshOpmodeInfo();

+            addInterval(function () {

+                target.refreshOpmodeInfo();

+            }, 1000);

+        }

+        //根据登录状态和SIM卡状态设置页面状态

+        function computePageState(data) {

+            var state = data.modem_main_state;

+            if (state == "modem_undetected" || state == "modem_sim_undetected" || state == "modem_sim_destroy") {

+                return target.pageState.NO_SIM;

+            } else if (state == "modem_waitpin") {

+                return target.pageState.WAIT_PIN;

+            } else if ((state == "modem_waitpuk" || data.pinnumber == 0) && (data.puknumber != 0)) {

+                return target.pageState.WAIT_PUK;

+            } else if ((data.puknumber == 0 || state == "modem_sim_destroy") && state != "modem_sim_undetected" && state != "modem_undetected") {

+                return target.pageState.PUK_LOCKED;

+            } else if ($.inArray(state, config.TEMPORARY_MODEM_MAIN_STATE) != -1) {

+                return target.pageState.LOADING;

+            } else {

+                location.reload();

+            }

+        }

+

+    }

+

+    return {

+        init: init

+    };

+});

+

+define("ota_update", "jquery jq_fileinput service knockout set statusBar".split(" "), 

+

+    function ($, fileinput, service, ko, config, status) {

+

+    function FotaUpdateViewModel() {

+        var target    = this;

+        var setting = service.getOTAUpdateSetting();		

+        var upgUrl = service.getManualOTAUpdateSetting();

+

+        target.allowRoamingUpdate = ko.observable(setting.allowRoamingUpdate);		

+		target.hasDdns            = config.DDNS_SUPPORT;

+		target.hasUpdateCheck     = config.HAS_UPDATE_CHECK;	

+		target.hasUssd            = config.HAS_USSD;		

+        target.isDataCard         = config.PRODUCT_TYPE == 'DATACARD';

+        target.lastCheckTime      = ko.observable('');	

+        target.updateIntervalDay  = ko.observable(setting.updateIntervalDay);		

+        target.updateMode         = ko.observable(setting.updateMode);

+		target.updateType         = ko.observable(service.getUpdateType().update_type);

+        target.updateURL          = ko.observable(upgUrl.updateURL);

+

+        // 手动ota升级事件

+        target.ota_upgrade_apply = function () {

+            var otaUpdateURLInfo = {

+                updateURL: target.updateURL()

+            };

+            showLoading();

+            service.setManualOTAUpdateSetting(otaUpdateURLInfo, function (settingInfo) {

+                if (settingInfo && settingInfo.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+        // fota升级

+        target.ota_upgrade_check = function () {

+            var wefotaInfo = service.wefotagetNewVersionState();

+            var checkingState = ["checking"];

+            if ($.inArray(wefotaInfo.wefota_current_upgrade_state, checkingState) != -1) {

+                showAlert("ota_update_running");

+                return;

+            }

+            showLoading("ota_new_version_checking");

+            service.setWefotaOTAUpdateSetting(wefotaInfo, function (settingInfo) {

+                if (settingInfo && settingInfo.result == "success") {

+                    wefotaInfo = service.wefotagetNewVersionState();

+                    if(wefotaInfo.wefota_new_version_state == "has_new_version"){

+                        showAlert("fota_package_downloading");

+                        return;

+                    }

+                    else if(wefotaInfo.wefota_new_version_state == "bad_network") {

+                        errorOverlay("ota_connect_server_failed");

+                        return;

+                    }

+                    else if(wefotaInfo.wefota_new_version_state == "no_new_version") {

+                        showAlert("fota_package_no_new_version");

+                        return;

+                    }

+                    else {

+                        showAlert("ota_check_fail");

+                        return;

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+

+        // 自动检测设置按钮事件

+        target.apply = function () {

+            var updateSettingInfo = {

+                updateMode: target.updateMode(),

+                updateIntervalDay: target.updateIntervalDay(),

+                allowRoamingUpdate: target.allowRoamingUpdate()

+            };

+            showLoading();

+            service.setOTAUpdateSetting(updateSettingInfo, function (settingInfo) {

+                if (settingInfo && settingInfo.result == "success") {

+                    setting.allowRoamingUpdate = target.allowRoamingUpdate();

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+

+        // 按钮【检测】点击事件处理接口

+        target.checkNewVersion = function () {

+            var newVersionState = service.getNewVersionState();

+			if(newVersionState.fota_package_already_download == "yes"){

+				showAlert("fota_package_already_download");

+				return;

+			}

+

+            if(config.UPGRADE_TYPE=="FOTA"){

+                var checkingState = ["checking"];

+                if ($.inArray(newVersionState.fota_current_upgrade_state, checkingState) != -1) {

+                    showAlert("ota_update_running");

+                    return;

+                }

+            }

+

+			// FOTA开始下载前,判断当前是否已经在下载过程中,防止错误清空fota_new_version_state状态

+            var statusInfo = service.getStatusInfo();

+            if (newVersionState.fota_current_upgrade_state == "prepare_install") {

+                showInfo('ota_download_success');

+                return;

+            }

+

+            var upgradingState = ["downloading", "confirm_dowmload"];

+            if ($.inArray(newVersionState.fota_current_upgrade_state, upgradingState) != -1) {

+                status.showOTAAlert();

+                return;

+            }

+

+            if (statusInfo.roamingStatus) {

+                showConfirm("ota_check_roaming_confirm", function () {

+                    checkNewVersion();

+                });

+            } else {

+                checkNewVersion();

+            }

+            // 检测是否有新版本

+            function checkNewVersion() {

+                showLoading("ota_new_version_checking");

+                function checkNewVersionResult() {

+                    var result = service.getNewVersionState();

+                    if (result.hasNewVersion) {

+						if(result.fota_new_version_state == "already_has_pkg"&&result.fota_current_upgrade_state !="prepare_install"&&result.fota_current_upgrade_state !="low_battery")

+						{

+							addTimeout(checkNewVersionResult, 1000);

+						}

+						else

+						{

+							status.showOTAAlert();

+						}

+                    } else if (result.fota_new_version_state == "no_new_version") {

+                        showAlert("ota_no_new_version");

+                    }else if (result.fota_new_version_state == "check_failed" ) {

+                        errorOverlay("ota_check_fail");

+                    } else if ( result.fota_new_version_state == "bad_network"){

+                     	errorOverlay("ota_connect_server_failed");

+                    }else {

+                        addTimeout(checkNewVersionResult, 1000);

+                    }

+                }

+

+                service.setUpgradeSelectOp({selectOp: 'check'}, function (result) {

+                    if (result.result == "success") {

+                        checkNewVersionResult();

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            }

+        };

+

+

+

+        // 确认按钮状态:可用/灰化

+        target.fixPageEnable = function () {

+            var connectStatusInfo = service.getStatusInfo();

+			var opModeData = service.getOpMode();

+            if (checkConnectedStatus(connectStatusInfo.connectStatus, opModeData.rj45_state, connectStatusInfo.connectWifiStatus)) {

+                enableBtn($("#btnCheckNewVersion"));

+            } else {

+                disableBtn($("#btnCheckNewVersion"));

+            }

+        };

+

+        target.clickAllowRoamingUpdate = function () {

+            var checkedbox = $("#chkUpdateRoamPermission:checked");

+            if (checkedbox && checkedbox.length == 0) {

+                target.allowRoamingUpdate("1");

+            } else {

+                target.allowRoamingUpdate("0");

+            }

+        };

+

+        service.getOTAlastCheckTime({}, function(info){

+            target.lastCheckTime(info.dm_last_check_time);

+        });

+

+	}

+    // 获取升级文件大小

+	function getFileSize(object){

+		var fileLenth = 0;

+		var isIE = /msie/i.test(navigator.userAgent) && !window.opera; 

+		if (isIE) {  //如果是ie

+			var objectValue = object.value;

+			try {  

+				var fso = new ActiveXObject("Scripting.FileSystemObject");  

+				fileLenth = parseInt(fso.GetFile(objectValue).size);

+				} catch (e) {  

+				fileLenth = 1;					

+			} 

+		}else{  //对于非IE获得要上传文件的大小			

+			try{			

+				fileLenth = parseInt(object.files[0].size);

+			}catch (e) {

+				fileLenth = 1;  //获取不到取-1

+			}

+		}

+		return fileLenth/1024/1024;

+	} 

+

+    function init() {

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        var fwVm = new FotaUpdateViewModel();

+        ko.applyBindings(fwVm, container);		

+

+        if(fwVm.updateType() == "mifi_fota"){

+            fwVm.fixPageEnable();

+            addInterval(function () {            

+                fwVm.fixPageEnable();          

+            }, 1000);

+		}else{			

+	        if ($(".customfile").length == 0) {

+			    $("#fileField").customFileInput();

+		    }

+		}

+

+        $('#frmOTAUpdate').validate({

+            submitHandler: function () {

+                fwVm.apply();

+            }

+        });

+    }

+

+    return {

+        init: init

+    };

+});

+

+// SD卡 模块

+

+define("sd", "jquery set service knockout".split(" ") , function($, config, service, ko) {

+

+	// 基目录。感觉此根目录不显示给用户会更友好

+	var basePath = config.SD_BASE_PATH;

+

+	function SDCardViewModel() {

+		var target = this;

+		var SDConfiguration      = service.getSDConfiguration();

+

+        target.selectedMode        = ko.observable(SDConfiguration.sd_mode);

+        target.orignalMode         = ko.observable(SDConfiguration.sd_mode);

+        target.sdStatus            = ko.observable(SDConfiguration.sd_status);

+		target.orignalSdStatus     = ko.observable(SDConfiguration.sd_status);

+        target.sdStatusInfo        = ko.observable("sd_card_status_info_" + SDConfiguration.sd_status);

+        target.selectedShareEnable = ko.observable(SDConfiguration.share_status);

+        target.selectedFileToShare = ko.observable(SDConfiguration.file_to_share);

+        target.selectedAccessType  = ko.observable(SDConfiguration.share_auth);

+

+		var path = SDConfiguration.share_file.substring(basePath.length);

+

+        target.pathToShare         = ko.observable(path);

+        target.isInvalidPath       = ko.observable(false);

+		target.checkEnable         = ko.observable(true);

+

+

+	    addInterval(function(){

+			target.refreshSimStatus();

+		}, 3000);

+

+        // 检查共享路径是否有效

+        target.checkPathIsValid = ko.computed(function () {

+            if (target.orignalMode() == 0 && target.selectedShareEnable() == '1' && target.selectedFileToShare() == '0'

+                && target.pathToShare() != '' && target.pathToShare() != '/') {

+                service.checkFileExists({

+                    "path": basePath + target.pathToShare()

+                }, function (info) {

+                    if (info.status != "exist") {

+                        target.isInvalidPath(true);

+                    } else {

+                        target.isInvalidPath(false);

+                    }

+                });

+            } else {

+                target.isInvalidPath(false);

+            }

+        });	

+

+

+        target.disableApplyBtn = ko.computed(function(){

+            return target.selectedMode() == target.orignalMode() && target.selectedMode() == '1';

+        });

+

+		// 文件共享方式radio点击事件

+		target.fileToShareClickHandle = function(){

+			if(target.selectedFileToShare() == "1"){

+				target.pathToShare("/");

+			}

+			return true;

+		};		

+

+		// T卡热插拔时状态监控,拔插卡重刷界面

+		target.refreshSimStatus = function(){

+			if(target.checkEnable()){

+				var SDConfiguration = service.getSDConfiguration();

+			    if(SDConfiguration.sd_status && (SDConfiguration.sd_status != target.orignalSdStatus())){

+				    if(SDConfiguration.sd_status != '1'){

+						target.sdStatusInfo("sd_card_status_info_" + SDConfiguration.sd_status);

+						target.sdStatus(SDConfiguration.sd_status);

+		                target.orignalSdStatus(SDConfiguration.sd_status);

+						$("#sd_card_status_info").translate();

+					}else{

+						clearTimer();

+					    clearValidateMsg();

+					    init();

+					}

+			    }

+			}			

+		}

+

+

+

+

+

+		// 表单submit事件处理

+		target.save = function(){

+			showLoading('waiting');

+			target.checkEnable(false);

+			if(target.orignalMode() == target.selectedMode()){

+				showAlert("setting_no_change");

+			} else {

+				service.setSdCardMode({

+					mode : target.selectedMode()

+				}, function(info) {

+					if(info.result){

+                        target.orignalMode(target.selectedMode());

+						if(info.result == "processing"){

+							errorOverlay("sd_usb_forbidden");

+						}else{								

+						    successOverlay();

+						}

+					} else {

+						if (target.selectedMode() == "0") {

+							errorOverlay("sd_not_support");

+						} else {

+						    errorOverlay();

+						}

+					}

+				}, function(error) {

+					if (target.selectedMode() == "0") {

+						errorOverlay("sd_not_support");

+					} else {

+					    errorOverlay();

+					}

+				});

+			}

+			target.checkEnable(true);

+			return true;

+		};

+

+

+

+		// 保存详细配置信息

+        target.saveShareDetailConfig = function() {

+            showLoading('waiting');

+            target.checkEnable(false);			

+            var param = {

+                share_status : target.selectedShareEnable(),

+                share_auth : target.selectedAccessType(),

+                share_file : basePath + target.pathToShare()

+            };

+

+            if (target.selectedShareEnable() == "0") {

+                setSdCardSharing(param);

+            } else {

+                service.checkFileExists({

+                    "path" : param.share_file

+                }, function(info) {

+                    if (info.status != "exist" && info.status != "processing") {

+                        errorOverlay("sd_card_share_setting_" + info.status);

+                    } else {

+                        setSdCardSharing(param);

+                    }

+                }, function(){

+                    errorOverlay();

+                });

+            }

+

+            target.checkEnable(true);

+            return true;

+		}

+

+		// 设置SD卡共享信息

+        function setSdCardSharing(param){

+			service.setSdCardSharing(param, function(result) {

+				if (isErrorObject(result)) {

+					if (result.errorType == "no_sdcard") {

+						errorOverlay("sd_card_share_setting_no_sdcard");

+					} else {

+						errorOverlay();

+					}

+				} else {

+					successOverlay();

+				}

+			});

+		}

+	}

+

+	// 将配置的option项转换成Option数组

+	// {Array} configItem [{name: "name1", value: "val1"},{name: "name2", value: "val2"}]

+	function getOptionArray(configItem) {

+		var arr = [];

+		for ( var i = 0; i < configItem.length; i++) {

+			arr.push(new Option(configItem.name, configItem.value));

+		}

+		return arr;

+	}

+

+	function init() {

+		var container = $('#container')[0];

+		ko.cleanNode(container);

+		var fwVm = new SDCardViewModel();

+		ko.applyBindings(fwVm, container);

+		$("#sd_card_status_info").translate();

+		$('#sdmode_form').validate({

+			submitHandler : function() {

+				fwVm.save();

+			}

+		});

+		$('#httpshare_form').validate({

+			submitHandler : function() {

+				fwVm.saveShareDetailConfig();

+			},

+			rules : {

+				path_to_share : "check_file_path"

+			}

+		});

+	}

+

+	return {

+		init : init

+	};

+});

+

+// SD卡 HttpShare模块

+

+define("sd_httpshare","jquery underscore jq_fileinput set service knockout".split(" ") , 

+

+	function($, _, fileinput, config, service, ko) {

+

+	// 每页记录条数

+	// 不能够设置每页数据个数,默认:10

+	// 默认值不可修改

+	var perPage = 10;

+

+	// 当前页

+	var activePage = 1;

+

+	// 当前目录,默认根目录""

+	var currentPath = "";

+

+	// 基目录。是否需要显示给用户?用户友好度

+	var basePath = config.SD_BASE_PATH;

+

+	// 前置路径,发现有的设备会将sd卡数据显示在web目录

+	// prePath = "/usr/conf/web";

+	var prePath = "";

+

+	// 是否隐藏重命名按钮

+	var readwrite = true;

+

+	// 文件列表模板

+	var sdFileItemTmpl = null;

+

+	// 分页模板

+	var pagerTmpl = null;

+    // 配置信息原始状态

+    var originalStatus = null;

+

+    var zoneOffsetSeconds = new Date().getTimezoneOffset() * 60;

+

+    var shareFilePath = '';

+

+	var sdIsUploading = false;//SD卡是否正在上传文件

+

+	// 生成分页数据数组

+	// @method generatePager

+	// @param {Integer} totalSize 总记录数

+	// @param {Integer} perPageNum 每页记录条数

+	// @param {Integer} currentPage 当前页

+	// @return {Array} 分页数据数组

+	function generatePager(totalSize, perPageNum, currentPage) {

+        if (totalSize == 0) {

+            return [];

+        }

+        var pagersArr = [];

+        var totalPages = getTotalPages(totalSize, perPageNum);

+        pagersArr.push({

+            pageNum: currentPage - 1,

+            isActive: false,

+            isPrev: true,

+            isNext: false,

+            isDot: false

+        });

+        if (currentPage == 6) {

+            pagersArr.push({

+                pageNum: 1,

+                isActive: false,

+                isPrev: false,

+                isNext: false,

+                isDot: false

+            });

+        } else if (currentPage > 5) {

+            pagersArr.push({

+                pageNum: 1,

+                isActive: false,

+                isPrev: false,

+                isNext: false,

+                isDot: false

+            });

+            pagersArr.push({

+                pageNum: 0,

+                isPrev: false,

+                isNext: false,

+                isActive: false,

+                isDot: true

+            });

+        }

+        var i;

+        var startPage = currentPage - 4 > 0 ? currentPage - 4 : 1;

+        var endPage = currentPage + 4;

+        for (i = startPage; i <= endPage && i <= totalPages; i++) {

+            pagersArr.push({

+                pageNum: i,

+                isActive: i == currentPage,

+                isPrev: false,

+                isNext: false,

+                isDot: false

+            });

+        }

+        if (currentPage + 5 == totalPages) {

+            pagersArr.push({

+                pageNum: totalPages,

+                isPrev: false,

+                isNext: false,

+                isActive: false,

+                isDot: false

+            });

+        } else if (currentPage + 3 <= totalPages && i - 1 != totalPages) {

+            pagersArr.push({

+                pageNum: 0,

+                isPrev: false,

+                isNext: false,

+                isActive: false,

+                isDot: true

+            });

+            pagersArr.push({

+                pageNum: totalPages,

+                isPrev: false,

+                isNext: false,

+                isActive: false,

+                isDot: false

+            });

+        }

+        pagersArr.push({

+            pageNum: parseInt(currentPage, 10) + 1,

+            isPrev: false,

+            isNext: true,

+            isActive: false,

+            isDot: false

+        });

+        return pagersArr;

+	}

+

+	function getTotalPages(total, perPage){

+		var totalPages = Math.floor(total / perPage);

+		if (total % perPage != 0) {

+			totalPages++;

+		}

+		return totalPages;

+	}

+

+	// 整理文件列表数据,并用模板显示

+	function showFileSet(files) {

+		var i = 0;

+		var shownFiles = $.map(files, function(n) {

+			var obj = {

+				fileName : HTMLEncode(n.fileName),

+				fileType : n.attribute == 'document' ? 'folder' : getFileType(n.fileName),

+				fileSize : getDisplayVolume(n.size, false),

+				filePath : basePath + getCurrentPath() + "/" + n.fileName,

+                lastUpdateTime : transUnixTime((parseInt(n.lastUpdateTime, 10) + zoneOffsetSeconds) * 1000),

+				trClass : i % 2 == 0 ? "even" : "",

+				readwrite : readwrite

+			};

+			i++;

+			return obj;

+		});

+

+		if(sdFileItemTmpl == null){

+			sdFileItemTmpl = $.template("sdFileItemTmpl", $("#sdFileItemTmpl"));

+		}

+		$("#fileList_container").html($.tmpl("sdFileItemTmpl", {data: shownFiles}));

+	}

+

+	// HttpShareViewModel

+	function HttpShareViewModel() {

+		var isGuest = false;

+		if(window.location.hash == "#httpshare_guest"){

+			isGuest = true;

+		}

+		readwrite = true;

+		activePage = 1;

+        setCurrentPath('');

+		basePath = config.SD_BASE_PATH;

+		showLoading('waiting');

+		service.getSDConfiguration({}, function(data){

+            originalStatus = data;

+            shareFilePath = data.share_file;

+            if(shareFilePath.charAt(shareFilePath.length - 1) == '/'){//如果路径中有/,则去掉

+            	shareFilePath = shareFilePath.substring(0, shareFilePath.length - 1);

+            }

+

+			if(data.sd_status == '1' && data.sd_mode == '0'){ //共享

+				if(isGuest && data.share_status == '1'){// guest and share

+					basePath = shareFilePath;

+					if(data.share_auth == '0'){ // readonly

+						readwrite = false;

+						$("#uploadSection, #delete_file_button, .sd_guest_hide_th", "#httpshare_form").hide();

+					}else{

+                        $("#uploadSection, #delete_file_button, .sd_guest_hide_th", "#httpshare_form").show();

+                    }

+					$("#go_to_login_button").removeClass("hide");

+					$('#sd_menu').hide();

+					$('.form-note').hide();

+					if ($(".customfile").length == 0) {

+						$("#fileField").customFileInput();

+					}

+					pagerItemClickHandler(1);

+				} else if(isGuest && data.share_status == '0'){ // guest not share

+					$(".form-body .content", "#httpshare_form").hide().remove();

+					$(".form-title", "#httpshare_form").attr("data-trans", "httpshare").html($.i18n.prop("httpshare"));

+					$(".form-note", "#httpshare_form").attr("data-trans", "note_http_share_cannot_access").html($.i18n.prop("note_http_share_cannot_access"));

+                    hideLoading();

+				} else {

+					if ($(".customfile").length == 0) {

+						$("#fileField").customFileInput();

+					}

+					pagerItemClickHandler(1);

+				}

+			} else { // usb

+				$(".form-body .content", "#httpshare_form").hide().remove();

+				$(".form-title", "#httpshare_form").attr("data-trans", "httpshare").html($.i18n.prop("httpshare"));

+				$(".form-note", "#httpshare_form").attr("data-trans", "note_http_share_usb_access").html($.i18n.prop("note_http_share_usb_access"));

+                $(".form-note", "#httpshare_form").addClass("margintop10");

+				hideLoading();

+			}

+		}, function(){

+            errorOverlay();

+            $(".form-body .content", "#httpshare_form").hide().remove();

+            $(".form-title", "#httpshare_form").attr("data-trans", "httpshare").html($.i18n.prop("httpshare"));

+            $(".form-note", "#httpshare_form").attr("data-trans", "note_http_share_cannot_access").html($.i18n.prop("note_http_share_cannot_access"));

+        });

+

+		addInterval(function(){

+			!sdIsUploading && self.checkSdStatus();

+		}, 3000);

+

+		// T卡热插拔时状态监控,拔插卡重刷界面

+		self.checkSdStatus = function(){			

+			var data = service.getSDConfiguration();

+			if(data.sd_status && (data.sd_status != originalStatus.sd_status)){

+				if(data.sd_status == '1'){

+					window.location.reload();

+				}else{

+					clearTimer();

+					clearValidateMsg();

+					init();

+				}

+			}			

+		}

+	}

+

+	// 页码点击事件处理

+	pagerItemClickHandler = function(num) {

+		activePage = num;

+		refreshFileList(getCurrentPath(), activePage);

+	};

+

+    function checkConfiguration(){

+        var data = service.getSDConfiguration();

+        if(!_.isEqual(originalStatus, data)){

+            showAlert('sd_config_changed_reload', function(){

+                init();

+            });

+            return false;

+        }

+        return true;

+    }

+

+    //检查操作路径是否为共享路径,如果是共享路径,给用户提示

+    function inSharePath(path, wording) {

+        var tmpShareFilePath = shareFilePath + '/';

+        var tmpPath = path + '/';

+        if (originalStatus.share_status == '1' && shareFilePath != '' && shareFilePath != '/' && tmpShareFilePath.indexOf(tmpPath) != -1) {

+            showAlert(wording);

+            return true;

+        }

+        return false;

+    }

+

+	// 进入文件夹

+	enterFolder = function(name) {

+        if(!checkConfiguration()){

+            return false;

+        }

+		var path;

+		if (name == "") {

+			path = "";

+		} else {

+			path = getCurrentPath() + '/' + name;

+		}

+		refreshFileList(path, 1);

+        return true;

+	};

+

+	// 回到上一级目录

+	backFolder = function() {

+        if(!checkConfiguration()){

+            return false;

+        }

+		var path = getCurrentPath().substring(0, getCurrentPath().lastIndexOf("/"));

+		refreshFileList(path, 1);

+        return true;

+	};

+

+	// 更新按钮状态

+	refreshBtnsStatus = function() {

+		if (getCurrentPath() == "") {

+			$("#rootBtnLi, #backBtnLi").hide();

+		} else {

+			$("#rootBtnLi, #backBtnLi").show();

+		}

+		if (readwrite) {

+            $("#createNewFolderLi").hide();

+            $("#createNewFolderLi").find(".error").hide();

+            $("#newFolderBtnLi").show();

+            $("#newFolderName").val('');

+            $("#createNewFolderErrorLabel").removeAttr('data-trans').text('');

+		} else {

+            $("#newFolderBtnLi, #createNewFolderLi").hide().remove();

+		}

+        checkDeleteBtnStatus();

+	};

+

+

+	// 刷新文件列表

+	refreshFileList = function(path, index, alertShown) {

+		if(!alertShown){

+            showLoading('waiting');

+        }

+		service.getFileList({

+			path : prePath + basePath + path,

+			index : index

+		}, function(data) {

+			if (isErrorObject(data)) {

+				showAlert(data.errorType);

+				return;

+            }

+            setCurrentPath(path);

+			$("#sd_path").val(path);

+			activePage = index;

+			totalSize = data.totalRecord;

+			showFileSet(data.details);

+			pagination(totalSize); //测试分页时可以将此处totalSize调大

+			refreshBtnsStatus();

+			updateSdMemorySizes();

+            if(!alertShown){

+			    hideLoading();

+            }

+		});

+	};

+

+

+	// 显示新建文件夹按钮点击事件

+	openCreateNewFolderClickHandler = function() {

+		$("#newFolderBtnLi").hide();

+		$("#newFolderName").show();

+		$("#createNewFolderLi").show();

+	};

+

+	// 取消显示新建文件夹按钮点击事件

+	cancelCreateNewFolderClickHandler = function() {

+		$("#createNewFolderLi").hide();

+        $("#newFolderName").val('');

+		$("#newFolderBtnLi").show();

+		$("#createNewFolderLi").find(".error").hide();

+	};

+

+	// 新建文件夹按钮点击事件

+	createNewFolderClickHandler = function() {

+        if(!checkConfiguration()){

+            return false;

+        }

+		var newFolderName = $.trim($("#newFolderName").val());

+		var newPath = prePath + basePath + getCurrentPath() + "/" + newFolderName;

+        showLoading('creating');

+		service.checkFileExists({

+			path : newPath

+		}, function(data1) {

+			if (data1.status == "noexist" || data1.status == "processing") {

+				service.createFolder({

+					path : newPath

+				}, function(data) {

+					if (isErrorObject(data)) {

+						showAlert(data.errorType);

+						return false;

+					} else {

+                        successOverlay();

+                        refreshFileList(getCurrentPath(), 1);

+                    }

+				});

+			} else if (data1.status == "no_sdcard") {

+                showAlert("no_sdcard", function(){

+                    window.location.reload();

+                });

+			} else if (data1.status == "exist") {

+				$("#createNewFolderErrorLabel").attr('data-trans', 'sd_card_share_setting_exist').text($.i18n.prop("sd_card_share_setting_exist"));

+				hideLoading();

+			}

+		}, function(){

+            errorOverlay();

+        });

+        return true;

+	};

+

+	// 重命名按钮点击事件

+	renameBtnClickHandler = function(oldName) {

+        var oldPath = prePath + basePath + getCurrentPath() + "/" + oldName;

+        if(inSharePath(oldPath, 'sd_share_path_cant_rename')){

+            return false;

+        }

+		showPrompt("sd_card_folder_name_is_null", function() {

+            renamePromptCallback(oldName);

+        }, 160, oldName, checkPromptInput);

+    };

+

+    function renamePromptCallback(oldName){

+        if(!checkConfiguration()){

+            return false;

+        }

+        var promptInput = $("div#confirm div.promptDiv input#promptInput");

+        var newFolderName = $.trim(promptInput.val());

+        var newPath = prePath + basePath + getCurrentPath() + "/" + newFolderName;

+        service.checkFileExists({

+                path : newPath

+            }, function(data1) {

+				if (data1.status == "noexist" || data1.status == "processing") {

+					hideLoadingButtons();

+					var oldPath = prePath + basePath + getCurrentPath() + "/" + oldName;

+					service.fileRename({

+						oldPath : oldPath,

+						newPath : newPath,

+						path : prePath + basePath + getCurrentPath()

+					}, function(data) {

+						if (isErrorObject(data)) {							

+							showAlert($.i18n.prop(data.errorType));

+							if(data.errorType == "no_exist"){

+								var alertShown = true;

+								refreshFileList(getCurrentPath(), 1, alertShown);

+							} else if(data.errorType == "processing"){

+								//

+							}							

+						} else {

+                            refreshFileList(getCurrentPath(), 1);

+                            successOverlay();

+                        }

+                        showLoadingButtons();

+						return true;

+					});

+				} else if (data1.status == "no_sdcard") {

+					showAlert("no_sdcard", function(){

+                        window.location.reload();

+                    });

+					return false;

+				} else if (data1.status == "exist") {

+					$(".promptErrorLabel").text($.i18n.prop("sd_card_share_setting_exist"));

+					return false;

+				}

+                return true;

+            }, function(){

+                errorOverlay();

+        });

+        return false;

+    }

+

+    // Prompt弹出框INPUT校验函数

+    function checkPromptInput(){

+        var promptInput = $("div#confirm div.promptDiv input#promptInput");

+        var newFileName = $.trim(promptInput.val());

+        var newPath = (prePath + basePath + getCurrentPath() + "/" + newFileName).replace("//", "/");

+        var checkResult = checkFileNameAndPath(newFileName, newPath);

+        if (1 == checkResult) {

+            $(".promptErrorLabel").text($.i18n.prop("sd_upload_rename_null"));//tip filena is null

+            return false;

+        }else if (2 == checkResult) {

+            $(".promptErrorLabel").text($.i18n.prop("sd_card_path_too_long"));

+            return false;

+        }else if (3 == checkResult) {

+            $(".promptErrorLabel").text($.i18n.prop("check_file_path"));

+            return false;

+        }else{

+            $(".promptErrorLabel").text("");

+            return true;

+        }

+        return true;;

+    }

+

+    hideLoadingButtons = function () {

+        $(".buttons", "#confirm").hide();

+    };

+

+    showLoadingButtons = function () {

+        $(".buttons", "#confirm").show();

+    };

+

+	// 删除按钮点击事件

+	deleteBtnClickHandler = function() {

+        if(!checkConfiguration()){

+            return false;

+        }

+		var files = $("input:checkbox:checked", "#fileList_container");

+		var fileNames = "";

+		if (!files || files.length == 0) {

+			return false;

+		}

+        var hasSharePath = false;

+        $.each(files, function (i, n) {

+            var theFile = $(n).val();

+            if (inSharePath(prePath + basePath + getCurrentPath() + "/" + theFile, {msg: 'sd_share_path_cant_delete', params: [theFile]})) {

+                hasSharePath = true;

+                return false;

+            }

+            return true;

+        });

+        if (hasSharePath) {

+            return false;

+        }

+		showConfirm("confirm_data_delete", function(){

+			$.each(files, function(i, n) {

+				fileNames += $(n).val() + "*";

+			});

+			var thePath = prePath + basePath + getCurrentPath();

+			service.deleteFilesAndFolders({

+				path : thePath,

+				names : fileNames

+			}, function(data) {

+				if (data.status == "failure") {

+					showAlert("delete_folder_failure");

+				}

+				else if(data.status == "no_sdcard"){

+					showAlert("no_sdcard");

+				}

+				else if(data.status == "processing"){

+					showAlert("sd_file_processing_cant_delete");

+				}

+				else if(data.status == "success"){

+					successOverlay();

+				}

+				refreshFileList(getCurrentPath(), 1);

+			}, function(){

+                errorOverlay();

+            });

+		});

+        return true;

+	};

+

+    // 文件上传按钮点击事件

+    fileUploadSubmitClickHandler = function(ifReName) {        

+        if(ifReName){

+            var fileName = $.trim($("div#confirm div.promptDiv input#promptInput").val());

+        }else{

+            var fileName = $(".customfile").attr('title');

+        }

+        var newPath = (basePath + getCurrentPath() + "/" + fileName).replace("//", "/");

+        var fileSize = getFileSize($("#fileField")[0]);

+        if(!checkuploadFileNameAndPath(fileName, newPath, fileSize)){

+            return false;

+        }		

+        doCheckAndUpload(fileName, newPath, fileSize);

+    };

+

+    function doCheckAndUpload(fileName, newPath, fileSize){

+        service.getSdMemorySizes({}, function(data) {

+			if (isErrorObject(data)) {

+				showAlert(data.errorType);

+				return false;

+			}

+			if (data.availableMemorySize < fileSize) {

+				showAlert("sd_upload_space_not_enough");

+				return false;

+			}

+			$.modal.close();

+			showLoading('uploading', '<span data-trans="note_uploading_not_refresh">' + $.i18n.prop('note_uploading_not_refresh') + '</span>');

+			service.checkFileExists({

+				path : newPath

+			}, function(data1) {

+				if (data1.status == "noexist") {

+					$("#fileUploadForm").attr("action", "/cgi-bin/httpshare/" + URLEncodeComponent(fileName));

+					var currentTime = new Date().getTime();

+					$("#path_SD_CARD_time").val(transUnixTime(currentTime));

+					$("#path_SD_CARD_time_unix").val(Math.round((currentTime - zoneOffsetSeconds * 1000) / 1e3));

+					if(!iframeLoadBinded){

+						bindIframeLoad();

+					}

+					sdIsUploading = true;

+					$("#fileUploadForm").submit();

+				} else if (data1.status == "no_sdcard") {

+					showAlert("no_sdcard", function(){

+						window.location.reload();

+					});

+				} else if (data1.status == "processing") {

+					showAlert("sd_upload_file_is_downloading");//("system is downloading,try later!");

+				}else if (data1.status == "exist") {

+					showPrompt("sd_upload_rename",function(){

+						fileUploadSubmitClickHandler(true);

+					},160, fileName, checkPromptInput, clearUploadInput);

+				}

+			}, function(){

+				errorOverlay();

+			});

+        		return true;

+		});

+	}

+

+    var iframeLoadBinded = false;

+    function bindIframeLoad(){

+        iframeLoadBinded = true;

+        $('#fileUploadIframe').load(function() {

+			sdIsUploading = false;

+            var txt = $('#fileUploadIframe').contents().find("body").html().toLowerCase();

+            var alertShown = false;

+            if (txt.indexOf('success') != -1) {

+                successOverlay();

+            } else if (txt.indexOf('space_not_enough') != -1) {

+                alertShown = true;

+                showAlert('sd_upload_space_not_enough');

+            } else if (txt.indexOf('data_lost') != -1) {

+                alertShown = true;

+                showAlert('sd_upload_data_lost');

+            } else {

+                errorOverlay();

+            }

+

+            clearUploadInput();

+            refreshFileList(getCurrentPath(), 1, alertShown);

+        });

+    }

+

+	// 更新SD卡容量显示数据

+	updateSdMemorySizes = function() {

+		service.getSdMemorySizes({}, function(data) {

+			if (isErrorObject(data)) {

+				showAlert(data.errorType);

+				return false;

+			}

+			var total = getDisplayVolume(data.totalMemorySize, false);

+			var used = getDisplayVolume(data.totalMemorySize - data.availableMemorySize, false);

+			$("#sd_volumn_used").text(used);

+			$("#sd_volumn_total").text(total);

+            return true;

+		});

+	};

+

+	// 翻页

+	pagination = function(fileTotalSize) {

+		var pagers = generatePager(fileTotalSize, perPage, parseInt(activePage, 10));

+		if(pagerTmpl == null){

+			pagerTmpl = $.template("pagerTmpl", $("#pagerTmpl"));

+		}

+		$(".pager", "#fileListButtonSection").html($.tmpl("pagerTmpl", {data: {pagers : pagers, total : getTotalPages(fileTotalSize, perPage)}}));

+		renderCheckbox();

+		$(".content", "#httpshare_form").translate();

+	};

+

+	// 下载文件是检查文件路径是否包含特殊字符

+	checkFilePathForDownload = function(path){

+        if(!checkConfiguration()){

+            return false;

+        }

+		var idx = path.lastIndexOf('/');

+		var prePath = path.substring(0, idx+1);

+		var name = path.substring(idx+1, path.length);

+		if(checkFileNameChars(prePath, true) && checkFileNameChars(name, false)){

+			return true;

+		}

+		showAlert('sd_card_invalid_chars_cant_download');

+		return false;

+	};

+

+	gotoLogin = function(){

+		window.location.href="#entry";

+	};

+

+	// 事件绑定

+    function bindEvent(){

+		$('#createNewFolderForm').validate({

+			submitHandler : function() {

+				createNewFolderClickHandler();

+			},

+			rules : {

+				newFolderName : {sd_card_path_too_long:true,check_filefold_name: true}

+			}

+		});

+        $("p.checkbox", "#httpshare_form").die().live('click', function () {

+            addTimeout(function () {

+                checkDeleteBtnStatus();

+            }, 100);

+        });

+        $(".icon-download", "#httpshare_form").die().live("click", function () {

+            return checkFilePathForDownload($(this).attr("filelocal"));

+        });

+        $(".folderTd", "#httpshare_form").die().live("click", function () {

+            return enterFolder($(this).attr("filename"));

+        });

+        $(".fileRename", "#httpshare_form").die().live("click", function () {

+            return renameBtnClickHandler($(this).attr("filename"));

+        });

+        iframeLoadBinded = false;

+    }

+

+

+	// 刷新删除按钮状态

+    function checkDeleteBtnStatus(){

+        var checkedItem = $("p.checkbox.checkbox_selected", '#fileListSection');

+        if(checkedItem.length > 0){

+            enableBtn($('#delete_file_button'));

+        } else {

+            disableBtn($('#delete_file_button'));

+        }

+    }

+

+

+    // 文件名和路径检查

+    function checkFileNameAndPath(filename, path) {

+        if (filename == "" || filename.length > 25) {

+            return 1;

+        }

+        if (path.length >= 200) {

+            return 2;

+        }

+        if (!checkFileNameChars(filename, false)) {

+            return 3;

+        }

+    }

+

+	// 文件名特殊字符检查

+	function checkFileNameChars(filename, isIncludePath) {

+		var ASCStringInvalid = '+/:*?<>\"\'\\|#&`~';

+		if(isIncludePath){

+			ASCStringInvalid = '+:*?<>\"\'\\|#&`~';

+		}

+		var flag = false;

+		var dotFlag = false;

+		var reg = /^\.+$/;

+		for ( var filenamelen = 0; filenamelen < filename.length; filenamelen++) {

+			for ( var ACSlen = 0; ACSlen < ASCStringInvalid.length; ACSlen++) {

+				if (filename.charAt(filenamelen) == ASCStringInvalid.charAt(ACSlen)) {

+					flag = true;

+					break;

+				}

+			}

+			if (reg.test(filename)) {

+				dotFlag = true;

+			}

+			if (flag || dotFlag) {

+				return false;

+			}

+		}

+		return true;

+	}

+

+

+    function checkuploadFileNameAndPath(fileName, newPath, fileSize){

+        if(!checkConfiguration()){

+            return false;

+        }

+

+		if (typeof fileName == "undefined" || fileName == '' || fileName == $.i18n.prop("no_file_selected")) {

+            showAlert("sd_no_file_selected");

+			return false;

+		}

+		if (newPath.length >= 200) {

+			showAlert("sd_card_path_too_long");

+			return false;

+		}

+

+		if (fileSize/1024/1024/1024 > 2){  //no more than 2G

+			showAlert("sd_file_size_too_big");

+			return false;

+		}		

+

+		if (fileName.indexOf('*') >= 0){  //no *

+			showAlert("sd_file_name_invalid");

+			return false;

+		}

+		return true;

+	}

+

+

+	//清空上传控件

+    function clearUploadInput(){

+        $("#fileField").closest('.customfile').before('<input id="fileField" name="filename" maxlength="200" type="file" dir="ltr"/>').remove();

+        addTimeout(function(){

+            $("#fileField").customFileInput();

+        }, 0);

+        $("#uploadBtn", "#uploadSection").attr("data-trans", "browse_btn").html($.i18n.prop('browse_btn'));

+        $(".customfile", "#uploadSection").removeAttr("title");

+        $(".customfile span.customfile-feedback", "#uploadSection")

+            .html('<span data-trans="no_file_selected">'+$.i18n.prop('no_file_selected')+'</span>')

+            .attr('class', 'customfile-feedback');

+    }

+

+

+    function getCurrentPath(){

+        return currentPath;

+    }

+

+    function setCurrentPath(path){

+        if(path.lastIndexOf("/") == path.length - 1){

+            currentPath = path.substring(0, path.length - 1);

+        } else {

+            currentPath = path;

+        }

+    }

+

+

+    function getFileSize(object){

+        var isIE = /msie/i.test(navigator.userAgent) && !window.opera; 

+        if (isIE) {  //如果是ie

+            var objValue = object.value;

+            try {  

+                var fileSysObj = new ActiveXObject("Scripting.FileSystemObject");  

+                fileLenth = parseInt(fileSysObj.GetFile(objValue).size);

+                } catch (e) {  //('IE内核取不到长度'); 

+                fileLenth	= 1;					

+            } 

+        }else{  //其他

+            try{//对于非IE获得要上传文件的大小

+                fileLenth = parseInt(object.files[0].size);

+                }catch (e) {

+                fileLenth=1;  //获取不到取-1

+            }

+        }

+        return fileLenth;

+    } 

+

+	function init() {

+		var container = $('#container')[0];

+		ko.cleanNode(container);

+		var fwVm = new HttpShareViewModel();

+		ko.applyBindings(fwVm, container);

+        bindEvent();

+	}

+

+

+    jQuery.validator.addMethod("check_filefold_name", function(value, element, param) {

+        var result = checkFileNameChars(value, false);

+        return this.optional(element) || result;

+    });

+

+    jQuery.validator.addMethod("sd_card_path_too_long", function(value, element, param) {

+        var newFolderName = $.trim($("#newFolderName").val());

+        var newPath = prePath + basePath + getCurrentPath() + "/" + newFolderName;

+        var result = true;

+        if (newPath.length >= 200) {

+            result = false;

+        }

+        return this.optional(element) || result;

+    });

+

+	return {

+		init : init

+	};

+});

+

+define("ussd","set service knockout jquery".split(" "), function (set, fnc, libko, libjq) {

+    var time_interval = 0;

+    var initFlg = true;

+    var numTimeout = 0;

+    var replyFlg = false;

+    var ussd_action = 1;

+

+    function init() {

+        var container = libjq('#container')[0];

+        libko.cleanNode(container);

+        var vm = new vmUSSD();

+        libko.applyBindings(vm, container);

+

+    }

+    var USSDLocation = {

+        SEND: 0,

+        REPLY: 1

+    };

+    function vmUSSD() {

+        var target = this;

+

+        target.hasUpdateCheck = set.HAS_UPDATE_CHECK;

+        target.ussd_action = libko.observable(ussd_action);

+        target.USSDLocation = libko.observable(USSDLocation.SEND);

+        target.USSDReply = libko.observable("");

+        target.USSDSend = libko.observable("");

+        target.hasDdns = set.DDNS_SUPPORT;

+

+        function checkTimeout() {

+            if (replyFlg) {

+                replyFlg = true;

+                window.clearInterval(time_interval);

+                numTimeout = 0;

+            } else {

+                if (numTimeout > 28) {

+                    replyFlg = true;

+                    window.clearInterval(time_interval);

+                    showAlert("ussd_operation_timeout");

+                    target.USSDReply("");

+                    target.USSDSend("");

+                    target.USSDLocation(USSDLocation.SEND);

+                    numTimeout = 0;

+

+                } else {

+                    numTimeout++;

+                }

+

+            }

+        };

+

+        target.sendToNet = function () {

+            numTimeout = 0;

+            window.clearInterval(time_interval);

+            var command = target.USSDSend();

+

+            var idx_t = 0;

+            var indexChar;

+            for (idx_t = 0; idx_t < command.length; ) { //corem0418, delte left blanks and right blanks

+                indexChar = command.charAt(idx_t);

+                if (indexChar == ' ') {

+                    if (command.length > 1) {

+                        command = command.substr(idx_t + 1);

+                    } else {

+                        command = ''; // string is filled with blank

+                        break;

+                    }

+                } else {

+                    break;

+                }

+            }

+

+            for (idx_t = command.length - 1; idx_t >= 0 && command.length > 0; --idx_t) {

+                indexChar = command.charAt(idx_t);

+                if (indexChar == ' ') {

+                    if (command.length > 1) {

+                        command = command.substr(0, idx_t);

+                    } else {

+                        command = ''; // string is filled with blank

+                        break;

+                    }

+                } else {

+                    break;

+                }

+            }

+

+            if (('string' != typeof(command)) || ('' == command)) {

+                showAlert("ussd_error_input");

+                return;

+            }

+

+            showLoading('waiting');

+

+            var tmp = {};

+            tmp.operator = "ussd_send";

+            tmp.strUSSDCommand = command;

+            tmp.sendOrReply = "send";

+

+            fnc.getUSSDResponse(tmp, function (result, content) {

+                hideLoading();

+                if (result) {

+                    USSD_reset();

+                    target.USSDLocation(USSDLocation.REPLY);

+                    target.ussd_action(content.ussd_action);

+                    libjq("#USSD_Content").val(decodeMessage(content.data, true));

+                    replyFlg = false;

+                    numTimeout = 0;

+                } else {

+                    showAlert(content);

+                }

+            });

+        };

+

+        target.replyToNet = function () {

+            numTimeout = 0;

+            window.clearInterval(time_interval);

+            var command = target.USSDReply();

+

+            var idx_t = 0;

+            var indexChar;

+            for (idx_t = 0; idx_t < command.length; ) { //corem0418, delte left blanks and right blanks

+                indexChar = command.charAt(idx_t);

+                if (indexChar == ' ') {

+                    if (command.length > 1) {

+                        command = command.substr(idx_t + 1);

+                    } else {

+                        command = ''; // string is filled with blank

+                        break;

+                    }

+                } else {

+                    break;

+                }

+            }

+

+            for (idx_t = command.length - 1; idx_t >= 0 && command.length > 0; --idx_t) {

+                indexChar = command.charAt(idx_t);

+                if (indexChar == ' ') {

+                    if (command.length > 1) {

+                        command = command.substr(0, idx_t);

+                    } else {

+                        command = ''; // string is filled with blank

+                        break;

+                    }

+                } else {

+                    break;

+                }

+            }

+

+            if (('string' != typeof(command)) || ('' == command)) {

+                showAlert("ussd_error_input");

+                return;

+            }

+

+            showLoading('waiting');

+

+            var tmp = {};

+            tmp.operator = "ussd_reply";

+            tmp.strUSSDCommand = command;

+            tmp.sendOrReply = "reply";

+

+            fnc.getUSSDResponse(tmp, function (result, content) {

+                hideLoading();

+                if (result) {

+                    target.ussd_action(content.ussd_action);

+                    libjq("#USSD_Content").val(decodeMessage(content.data, true));

+                    replyFlg = false;

+                    USSD_reset();

+                    numTimeout = 0;

+                } else {

+                    showAlert(content);

+                }

+            });

+        };

+

+        USSD_reset = function () {

+            target.USSDReply("");

+            target.USSDSend("");

+        };

+        USSD_cancel = function () {

+            fnc.USSDReplyCancel(function (result) {});

+        };

+

+        target.noReplyCancel = function () {

+            numTimeout = 0;

+            replyFlg = true;

+            window.clearInterval(time_interval);

+            fnc.USSDReplyCancel(function (result) {

+                if (result) {

+                    USSD_reset();

+                    target.USSDLocation(USSDLocation.SEND);

+                } else {

+                    showAlert("ussd_fail");

+                }

+            });

+        };

+

+        //如果首次进入USSD菜单,先发送USSD取消命令,进行初始化

+        if (initFlg) {

+            USSD_cancel();

+            initFlg = false;

+        }

+    }

+

+    return {

+        init: init

+    };

+});

+

+

+define("phonebook","underscore jquery knockout set service jq_chosen".split(" "),

+

+    function (_, $, ko, config, service, chosen) {

+

+    var locationValue = {

+        SIM: "0",

+        DEVICE: "1"

+    };

+    var pageState = {

+        LIST: 0,

+        NEW: 1,

+        EDIT: 2,

+        VIEW: 3,

+        SEND_MSM: 4

+    };

+    //存储位置选项

+    var saveLocationOpts = function (hasSIMCard) {

+        var opts = [];

+        opts.push(new Option($.i18n.prop("device_book"), locationValue.DEVICE));

+        if (hasSIMCard) {

+            opts.push(new Option($.i18n.prop("sim_book"), locationValue.SIM));

+        }

+        return opts;

+    };

+

+    function getCurrentGroup() {

+        return $("#selectedFilterGroup").val();

+    }

+    //列表模板对应的Columns

+    var templateColumns = {

+        cardColumns: [{

+                rowText: "index",

+                display: false

+            }, {

+                rowText: "name"

+            }, {

+                rowText: "mobile_phone_number"

+            }, {

+                rowText: "home_phone_number"

+            }

+        ],

+        listColumns: [{

+                columnType: "checkbox",

+                headerTextTrans: "number",

+                rowText: "index",

+                width: "10%"

+            }, {

+                headerTextTrans: "name",

+                rowText: "name",

+                width: "25%",

+                sortable: true

+            }, {

+                columnType: "image",

+                headerTextTrans: "save_location",

+                rowText: "imgLocation",

+                width: "20%",

+                sortable: true

+            }, {

+                headerTextTrans: "mobile_phone_number",

+                rowText: "mobile_phone_number",

+                width: "30%",

+                sortable: true

+            }, {

+                headerTextTrans: "group",

+                rowText: "transGroup",

+                width: "15%",

+                sortable: true,

+                needTrans: true

+            }

+        ]

+    };

+    //分组选项

+    var groupOpts = function () {

+        var opts = [];

+        opts.push(new Option($.i18n.prop("common"), "common"));

+        opts.push(new Option($.i18n.prop("family"), "family"));

+        opts.push(new Option($.i18n.prop("friend"), "friend"));

+        opts.push(new Option($.i18n.prop("colleague"), "colleague"));

+        return opts;

+    };

+

+    var _phoneBookStopSMSSending = false;

+

+    function pbViewMode() {

+        var target = this;

+

+        //property for common

+        target.pageState = ko.observable(pageState.LIST);

+        target.initFail = ko.observable(true);

+        target.hasSms = ko.observable(config.HAS_SMS);

+

+        var smsHasCapability = true;

+        var smsLeftCount = 0;

+

+        //property for list

+        var capacity = {

+            simMaxNameLen: 0,

+            simMaxNumberLen: 0,

+            IsSimCardFull: true,

+            IsDeviceFull: true,

+            Used: 0,

+            Capacity: 0,

+            Ratio: "(0/0)"

+        };

+        target.capacity = ko.observable(capacity);

+        target.phoneBookCapacity = ko.observable(capacity.Ratio);

+        target.books = ko.observableArray();

+        //列表模板创建

+        target.gridTemplate = new ko.simpleGrid.viewModel({

+            tableClass: "table-fixed",

+            data: target.books(),

+            idName: "index",

+            columns: templateColumns.listColumns,

+            defaultSortField: "name",

+            defaultSortDirection: "ASC",

+            pageSize: 10,

+            tmplType: 'list',

+            searchColumns: ["name", "mobile_phone_number"],

+            primaryColumn: "mobile_phone_number",

+            showPager: true,

+            rowClickHandler: function (dataId) {

+                target.editBooks(dataId, 'view');

+            },

+            deleteHandler: function (dataId) {

+                target.deleteOneBook(dataId);

+            },

+            changeTemplateHandler: function () {

+                target.changeTemplate();

+            }

+        });

+

+        //property for edit or new

+        target.locations = ko.observableArray();

+        target.originLocation = "";

+        target.selectedLocation = ko.observable(locationValue.DEVICE);

+        target.locationTrans = ko.observable();

+        target.locationTransText = ko.observable();

+        target.index = ko.observable(-1);

+        target.name = ko.observable("");

+        target.nameMaxLength = ko.computed(function () {

+            var max = getNameMaxLength();

+            var name = target.name().substring(0, max);

+            target.name(name);

+            return getNameMaxLength();

+        });

+        function getNameMaxLength() {

+            var max = 22;

+            if (target.selectedLocation() == locationValue.DEVICE) {

+                var encodeType = getEncodeType(target.name());

+                if ("UNICODE" == encodeType.encodeType || encodeType.extendLen > 0) {

+                    max = 11;

+                } else {

+                    max = 22;

+                }

+                //max = 22;

+            } else {

+                //对"^"需要按照2个字符处理

+                var encodeType = getEncodeType(target.name());

+                if ("UNICODE" == encodeType.encodeType || encodeType.extendLen > 0) {

+                    max = (target.capacity().simMaxNameLen / 2) - 1;

+                } else {

+                    max = target.capacity().simMaxNameLen;

+                }

+            }

+            return max;

+        }

+

+        target.mobile_phone_number = ko.observable("");

+        target.mobileMaxLength = ko.computed(function () {

+            var max = getMobileMaxLength();

+            var mobileNumber = target.mobile_phone_number().substring(0, max);

+            target.mobile_phone_number(mobileNumber);

+            return getMobileMaxLength();

+        });

+        function getMobileMaxLength() {

+            var max = 40;

+            if (target.selectedLocation() == locationValue.DEVICE) {

+                max = 40;

+            } else {

+                max = target.capacity().simMaxNumberLen;

+            }

+            return max;

+        }

+

+        target.home_phone_number = ko.observable("");

+        target.office_phone_number = ko.observable("");

+        target.mail = ko.observable("");

+        target.transEditAreaTitle = ko.dependentObservable(function () {

+            var state = target.pageState();

+            if (state == pageState.EDIT) {

+                return "edit";

+            } else if (state == pageState.NEW) {

+                return "new";

+            } else if (state == pageState.VIEW) {

+                return "view";

+            }

+        });

+        var groups = groupOpts();

+        target.groups = ko.observableArray(groups);

+        target.selectedGroup = ko.observable();

+        target.groupTrans = ko.observable();

+        target.groupTransText = ko.observable();

+

+        target.selectedFilterGroup = ko.observable('all');

+        target.selectedFilterGroupChangeHandler = function () {

+            target.selectedFilterGroup($("#selectedFilterGroup").val());

+            getPhoneBookReady();

+        };

+

+        //property for sendMessage

+        target.showErrorInfo = ko.observable(false);

+        target.messageContent = ko.observable("");

+        target.messageCount = ko.computed(function () {

+            var msgInput = $("#txtSmsContent", "#sendMessage");

+            var msgInputDom = msgInput[0];

+            target.messageContent();

+            var strValue = msgInput.val();

+            var encodeType = getEncodeType(strValue);

+            var maxLength = encodeType.encodeType == 'UNICODE' ? 335 : 765;

+            if (strValue.length + encodeType.extendLen > maxLength) {

+                var scrollTop = msgInputDom.scrollTop;

+                var insertPos = getInsertPos(msgInputDom);

+                var moreLen = strValue.length + encodeType.extendLen - maxLength;

+                var insertPart = strValue.substr(insertPos - moreLen > 0 ? insertPos - moreLen : 0, moreLen);

+                var reversed = insertPart.split('').reverse();

+                var checkMore = 0;

+                var cutNum = 0;

+                for (var i = 0; i < reversed.length; i++) {

+                    if (getEncodeType(reversed[i]).extendLen > 0) {

+                        checkMore += 2;

+                    } else {

+                        checkMore++;

+                    }

+                    if (checkMore >= moreLen) {

+                        cutNum = i + 1;

+                        break;

+                    }

+                }

+                var iInsertToStartLength = insertPos - cutNum;

+

+                target.messageContent(strValue.substr(0, iInsertToStartLength) + strValue.substr(insertPos));

+                if (target.messageContent().length > maxLength) {

+                    target.messageContent(target.messageContent().substr(0, maxLength));

+                }

+                setInsertPos(msgInputDom, iInsertToStartLength);

+                msgInputDom.scrollTop = scrollTop;

+            }

+            pbDraftListener();

+            var newValue = $(msgInputDom).val();

+            var newEncodeType = getEncodeType(newValue);

+            var newMaxLength = newEncodeType.encodeType == 'UNICODE' ? 335 : 765;

+            if (newValue.length + newEncodeType.extendLen >= newMaxLength) {

+                $("#msgCount").addClass("colorRed");

+            } else {

+                $("#msgCount").removeClass("colorRed");

+            }

+            return "(" + (newValue.length + newEncodeType.extendLen) + "/" + newMaxLength + ")" + "(" + getSmsCount(newValue) + "/5)";

+        });

+

+        target.clear = function (isNeedInit) {

+            if (target.pageState() == pageState.SEND_MSM) {

+                smsPageCheckDraft(clearPhonebookForm, isNeedInit);

+            } else {

+                clearPhonebookForm(isNeedInit);

+            }

+            config.resetContentModifyValue();

+        };

+

+        //通过按钮返回列表状态事件处理

+        target.btnClear = function (isNeedInit) {

+            if (target.pageState() == pageState.SEND_MSM) {

+                smsPageCheckDraft(clearPhonebookForm, isNeedInit);

+                config.resetContentModifyValue();

+            } else if ((target.pageState() == pageState.NEW || target.pageState() == pageState.EDIT) && (target.preContent.location != target.selectedLocation()

+                     || target.preContent.name != target.name()

+                     || target.preContent.mobile_phone_number != target.mobile_phone_number()

+                     || target.preContent.home_phone_number != target.home_phone_number()

+                     || target.preContent.office_phone_number != target.office_phone_number()

+                     || target.preContent.mail != target.mail()

+                     || target.preContent.group != target.selectedGroup())) {

+                showConfirm("leave_page_info", {

+                    ok: function () {

+                        clearPhonebookForm(isNeedInit);

+                        config.resetContentModifyValue();

+                    },

+                    no: function () {

+                        return false;

+                    }

+                });

+            } else {

+                clearPhonebookForm(isNeedInit);

+                config.resetContentModifyValue();

+            }

+        };

+

+        function clearPhonebookForm(isNeedInit) {

+            $("#frmPhoneBook").hide();

+            target.pageState(pageState.LIST);

+            target.index(-1);

+            target.name("");

+            target.mobile_phone_number("");

+            target.home_phone_number("");

+            target.office_phone_number("");

+            target.mail("");

+            target.messageContent("");

+            if (true == isNeedInit) {

+                refreshPage();

+            }

+            target.gridTemplate.clearAllChecked();

+            clearValidateMsg();

+            $("#books ").translate();

+            $("#frmPhoneBook").show();

+        }

+

+        //检查SIM卡状态

+        target.checkHasSIMCard = function (showMsg) {

+            var status = service.getStatusInfo();

+            if (status.simStatus != "modem_init_complete") {

+                if (showMsg) {

+                    showAlert("sim_removed", function () {

+                        target.pageState(pageState.LIST);

+                        target.clear(true);

+                    });

+                }

+                return false;

+            }

+            return true;

+        };

+

+        //保存电话本事件

+        target.save = function () {

+            var saveBook = function (index) {

+                var isSaveInSIM = (location == locationValue.SIM);

+                if (isSaveInSIM) {

+                    if (!target.checkHasSIMCard(true)) {

+                        return;

+                    }

+                }

+                if (target.pageState() == pageState.NEW || (target.pageState() == pageState.EDIT && location != target.originLocation)) {

+                    if (isSaveInSIM) {

+                        if (target.capacity().IsSimCardFull) {

+                            showAlert("sim_full");

+                            return;

+                        }

+                    } else {

+                        if (target.capacity().IsDeviceFull) {

+                            showAlert("device_full");

+                            return;

+                        }

+                    }

+                }

+                var name = target.name();

+                var mobile_phone_number = target.mobile_phone_number();

+                if ($.trim(name) == "" || $.trim(mobile_phone_number) == "") {

+                    return;

+                }

+                showLoading('saving');

+                var params = {};

+                params.location = location;

+                params.index = index;

+                params.name = name;

+                params.mobile_phone_number = mobile_phone_number;

+                if (!isSaveInSIM) {

+                    params.home_phone_number = target.home_phone_number();

+                    params.office_phone_number = target.office_phone_number();

+                    params.mail = target.mail();

+                    params.group = target.selectedGroup();

+                }

+                if (target.selectedLocation() != target.originLocation) {

+                    params.delId = target.index();

+                }

+                service.savePhoneBook(params, target.callback);

+            }

+            var location = target.selectedLocation();

+            var editIndex = (location == target.originLocation) ? target.index() : -1;

+            if (location == locationValue.SIM && target.originLocation == locationValue.DEVICE) {

+                showConfirm("change_device_to_sim_confirm", function () {

+                    saveBook(editIndex);

+                });

+            } else {

+                saveBook(editIndex);

+            }

+        };

+        //打开添加电话本记录页面事件

+        target.openNewPage = function () {

+            if (target.pageState() == pageState.SEND_MSM) {

+                pbDraftListener();

+                smsPageCheckDraft(openNewPageAct, false);

+            } else if (target.pageState() == pageState.EDIT && (target.preContent.location != target.selectedLocation()

+                     || target.preContent.name != target.name()

+                     || target.preContent.mobile_phone_number != target.mobile_phone_number()

+                     || target.preContent.home_phone_number != target.home_phone_number()

+                     || target.preContent.office_phone_number != target.office_phone_number()

+                     || target.preContent.mail != target.mail()

+                     || target.preContent.group != target.selectedGroup())) {

+                showConfirm("leave_page_info", {

+                    ok: function () {

+                        openNewPageAct(false);

+                    },

+                    no: function () {

+                        return false;

+                    }

+                });

+            } else {

+                openNewPageAct(false);

+            }

+        };

+        function openNewPageAct(isNeedInit) {

+            target.pageState(pageState.NEW);

+            target.selectedLocation(locationValue.DEVICE);

+            target.originLocation = "";

+            if (target.checkHasSIMCard(false)) {

+                target.locations(saveLocationOpts(true));

+            } else {

+                target.locations(saveLocationOpts(false));

+            }

+            var group = getCurrentGroup();

+            if (group != "all") {

+                target.selectedGroup(group);

+            } else {

+                target.selectedGroup("common");

+            }

+            target.name("");

+            target.mobile_phone_number("");

+            target.home_phone_number("");

+            target.office_phone_number("");

+            target.mail("");

+            target.index(-1);

+            target.dynamicTranslate();

+            preOpenEditPage();

+        }

+        //打开添加电话本记录编辑页面事件

+        target.openPage = function (option) {

+            var index;

+            if (target.pageState() == pageState.LIST) {

+                var result = target.checkSelect(option);

+                if (!result.isCorrectData)

+                    return;

+                index = result.selectedIds[0];

+            } else {

+                index = target.index();

+            }

+            target.editBooks(index, option);

+        };

+        //打开添加电话本记录查看页面事件

+        target.openViewPage = function () {

+            target.openPage("view");

+        };

+        //打开添加电话本记录查看页面事件

+        target.openEditPage = function () {

+            target.openPage("edit");

+            if ($.browser.mozilla) {

+                $("#txtName, #txtMobile").removeAttr('maxlength');

+            }

+            preOpenEditPage();

+        };

+        //编辑电话本事件处理

+        target.editBooks = function (selectedId, option) {

+            if (!selectedId)

+                return;

+

+            if (target.checkHasSIMCard(false)) {

+                target.locations(saveLocationOpts(true));

+            } else {

+                target.locations(saveLocationOpts(false));

+            }

+            var data = target.books();

+            for (var i = 0; i < data.length; i++) {

+                var n = data[i];

+                if (n.index == selectedId) {

+                    target.index(n.index);

+                    target.selectedLocation(n.location);

+                    target.originLocation = n.location;

+                    var trans = (n.location == locationValue.DEVICE) ? "device" : "sim";

+                    target.locationTrans(trans);

+                    var transText = $.i18n.prop("trans");

+                    target.locationTransText(transText);

+                    target.name(n.name);

+                    target.mobile_phone_number(n.mobile_phone_number);

+                    target.home_phone_number(n.home_phone_number);

+                    target.office_phone_number(n.office_phone_number);

+                    target.mail(n.mail);

+                    target.selectedGroup(n.group);

+                    target.groupTrans("group_" + n.group);

+                    target.groupTransText($.i18n.prop(target.groupTrans()));

+                    if (option == "edit") {

+                        target.pageState(pageState.EDIT);

+                    } else {

+                        target.pageState(pageState.VIEW);

+                    }

+                    break;

+                }

+            }

+            target.dynamicTranslate();

+

+            if (target.selectedLocation() == locationValue.SIM) {

+                target.checkHasSIMCard(true)

+            }

+        };

+        //翻译编辑区域

+        target.dynamicTranslate = function () {

+            $("#container").translate();

+        };

+        //删除一条电话本事件处理(card模式使用)

+        target.deleteOneBook = function (index) {

+            showConfirm("confirm_pb_delete", function () {

+                showLoading('deleting');

+                var params = {};

+                params.indexs = [String(index)];

+                service.deletePhoneBooks(params, target.callback);

+            });

+            return false;

+        };

+        //删除一条电话本事件处理

+        target.deleteBook = function () {

+            target.deleteOneBook(target.index());

+        };

+        //删除一条或多条电话本事件处理

+        target.deleteBooks = function () {

+            var result = target.checkSelect("delete");

+            if (!result.isCorrectData)

+                return;

+            showConfirm("confirm_pb_delete", function () {

+                showLoading('deleting');

+                var params = {};

+                params.indexs = result.selectedIds;

+                service.deletePhoneBooks(params, target.callback);

+            });

+        };

+        //判断电话本选中

+        target.checkSelect = function (pState) {

+            var ids;

+            if ("send" == pState) {

+                ids = target.gridTemplate.selectedPrimaryValue();

+            } else {

+                ids = target.gridTemplate.selectedIds();

+            }

+

+            var isCorrectData = true;

+            if (ids.length == 0) {

+                showAlert("no_data_selected");

+                isCorrectData = false;

+            } else if ("edit" == pState || "view" == pState) {

+                if (ids.length > 1) {

+                    showAlert("too_many_data_selected");

+                    isCorrectData = false;

+                }

+            } else if ("send" == pState) {

+                if (ids.length > 5) {

+                    showAlert("max_send_number");

+                    isCorrectData = false;

+                }

+            }

+            return {

+                selectedIds: ids,

+                isCorrectData: isCorrectData

+            };

+        };

+        //全部删除电话本事件处理

+        target.deleteAllBooks = function () {

+            showConfirm("confirm_data_delete", function () {

+                showLoading('deleting');

+                var group = getCurrentGroup();

+                var params = {};

+                if (group == "all") {

+                    params.location = 2;

+                    service.deleteAllPhoneBooks(params, target.callback);

+                } else {

+                    params.location = 3;

+                    params.group = group;

+                    service.deleteAllPhoneBooksByGroup(params, target.callback);

+                }

+            });

+        };

+

+        target.callback = function (data) {

+            if (data && data.result == "success") {

+                target.clear(true);

+                $("#books ").translate();

+                renderCheckbox();

+                successOverlay(null, true);

+            } else {

+                errorOverlay();

+            }

+        };

+        //变换显示方式事件处理

+        target.changeTemplate = function () {

+            if (target.gridTemplate.tmplType == "card") {

+                target.gridTemplate.tmplType = "list";

+                target.gridTemplate.pageSize = 10;

+                target.gridTemplate.columns = templateColumns.listColumns;

+            } else {

+                target.gridTemplate.tmplType = "card";

+                target.gridTemplate.pageSize = 10;

+                target.gridTemplate.columns = templateColumns.cardColumns;

+            }

+            refreshPage();

+            $("#books ").translate();

+        };

+        //显示发送短信页面

+        target.openSendMessagePage = function () {

+            if (pageState.SEND_MSM == target.pageState()) {

+                return;

+            }

+            if ((target.pageState() == pageState.EDIT || pageState.NEW == target.pageState()) && (target.preContent.location != target.selectedLocation()

+                     || target.preContent.name != target.name()

+                     || target.preContent.mobile_phone_number != target.mobile_phone_number()

+                     || target.preContent.home_phone_number != target.home_phone_number()

+                     || target.preContent.office_phone_number != target.office_phone_number()

+                     || target.preContent.mail != target.mail()

+                     || target.preContent.group != target.selectedGroup())) {

+                showConfirm("leave_page_info", {

+                    ok: function () {

+                        openSendMessagePageAct();

+                    },

+                    no: function () {

+                        return false;

+                    }

+                });

+            } else {

+                openSendMessagePageAct();

+            }

+        };

+

+        function openSendMessagePageAct() {

+            if (pageState.NEW == target.pageState()) {

+                target.pageState(pageState.SEND_MSM);

+                showAlert("no_data_selected");

+                target.clear();

+                return;

+            }

+            var selectedNumber = null;

+            if (pageState.LIST == target.pageState()) {

+                var result = target.checkSelect("send");

+                if (!result.isCorrectData)

+                    return;

+                selectedNumber = result.selectedIds;

+            } else {

+                selectedNumber = target.mobile_phone_number();

+            }

+

+            var select = $("#chosenUserList .chosen-select-deselect");

+            select.empty();

+            var options = [];

+            var tmp = [];

+            for (var j = 0; j < config.phonebook.length; j++) {

+                var book = config.phonebook[j];

+                if ($.inArray(book.pbm_number, tmp) == -1) {

+                    options.push(new Option(book.pbm_name + "/" + book.pbm_number, book.pbm_number, false, true));

+                    tmp.push(book.pbm_number);

+                } else {

+                    for (var i = 0; i < options.length; i++) {

+                        if (options[i].value == book.pbm_number) {

+                            options[i].text = book.pbm_name + "/" + book.pbm_number;

+                            break;

+                        }

+                    }

+                }

+            }

+            var opts = "";

+            $.each(options, function (i, e) {

+                opts += "<option value='" + HTMLEncode(e.value) + "'>" + HTMLEncode(e.text) + "</option>";

+            });

+            select.append(opts);

+            select.chosen({

+                max_selected_options: 5,

+                search_contains: true,

+                width: '545px'

+            });

+            $("#chosenUserSelect").val(selectedNumber);

+            $("#chosenUserSelect").trigger("chosen:updated.chosen");

+            config.resetContentModifyValue();

+            pbDraftListener();

+            target.pageState(pageState.SEND_MSM);

+        }

+

+        //发送短信

+        target.sendMessage = function () {

+            service.getSmsCapability({}, function (capability) {

+                var hasCapability = capability.nvUsed < capability.nvTotal;

+                if (!hasCapability) {

+                    showAlert("sms_capacity_is_full_for_send");

+                    return false;

+                }

+                var numbers = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+                if (numbers.length + capability.nvUsed > capability.nvTotal) {

+                    showAlert({

+                        msg: "sms_capacity_will_full_just",

+                        params: [capability.nvTotal - capability.nvUsed]

+                    });

+                    return false;

+                }

+                target.sendMessageAction();

+                return true;

+            });

+        };

+

+        target.sendMessageAction = function () {

+            var numbers = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+

+            if (!numbers || numbers.length == 0) {

+                target.showErrorInfo(true);

+                var timer = addTimeout(function () {

+                    target.showErrorInfo(false);

+                    window.clearTimeout(timer);

+                }, 5000);

+                return;

+            }

+            var content = target.messageContent();

+            var sentCount = 0;

+            var failCount = 0;

+            if (numbers.length > 1) {

+                showLoading("sending", "<button id='btnStopSending' onclick='phoneBookStopSMSSending();' class='btn btn-primary'>"

+                     + $.i18n.prop("sms_stop_sending")

+                     + "</button>");

+            } else {

+                showLoading('sending');

+            }

+            var callback = function (data) {

+                sentCount++;

+                if (sentCount == numbers.length) {

+                    $("#chosenUserSelect").val("");

+                    target.messageContent("");

+                    config.CONTENT_MODIFIED.modified = false;

+                    if (failCount == 0) {

+                        successOverlay();

+                        location.hash = "#msg_list";

+                    } else {

+                        var msg = $.i18n.prop("success_info") + $.i18n.prop("colon") + (sentCount - failCount)

+                             + "<br/>" + $.i18n.prop("error_info") + $.i18n.prop("colon") + (failCount);

+                        showAlert(msg, function () {

+                            location.hash = "#msg_list";

+                        });

+                    }

+

+                } else {

+                    sendSMS();

+                }

+            }

+            _phoneBookStopSMSSending = false;

+            var sendSMS = function () {

+                if (_phoneBookStopSMSSending) {

+                    hideLoading();

+                    return;

+                }

+                if ((sentCount + 1) == numbers.length) {

+                    $("#loading #loading_container").html("");

+                }

+                service.sendSMS({

+                    number: numbers[sentCount],

+                    message: content,

+                    id: -1

+                }, function (data) {

+                    callback(data);

+                }, function (data) {

+                    failCount++;

+                    callback(data);

+                });

+            };

+            sendSMS();

+        };

+        //清除搜索关键字事件

+        target.clearSearchKey = function () {

+            target.gridTemplate.searchInitStatus(true);

+            target.gridTemplate.searchKey($.i18n.prop("search"));

+            $("#ko_grid_search_txt").addClass("ko-grid-search-txt-default").attr("data-trans", "search");

+        };

+        //点击搜索输入框事件

+        target.searchTextClick = function () {

+            var searchText = $("#ko_grid_search_txt");

+            if (searchText.hasClass("ko-grid-search-txt-default")) {

+                target.gridTemplate.searchKey("");

+                target.gridTemplate.searchInitStatus(false);

+                searchText.removeClass("ko-grid-search-txt-default").removeAttr("data-trans");

+            }

+        };

+        //离开搜索输入框事件

+        target.searchTextBlur = function () {

+            var txt = $.trim(target.gridTemplate.searchKey()).toLowerCase();

+            if (txt == "") {

+                target.clearSearchKey();

+            }

+        };

+        //当前表格是否有数据

+        target.hasData = ko.computed(function () {

+            return target.gridTemplate.afterSearchData().length > 0;

+        });

+        //当前表格是否有选中的数据

+        target.hasChecked = ko.computed(function () {

+            return target.gridTemplate.checkedCount() > 0;

+        });

+        //是否可以点击发送按钮

+        target.canSend = ko.computed(function () {

+            var checked = target.gridTemplate.checkedCount();

+            if (!target.checkHasSIMCard(false)) {

+                return false;

+            }

+            return (checked > 0 && checked <= 5);

+        });

+

+        //发送短信时,选择用户变化的监控事件

+        target.draftListenerEvent = function () {

+            pbDraftListener();

+        };

+        //文档内容监听,判断是否修改过

+        function pbDraftListener() {

+            var smsHasCapability = true;

+            if (smsHasCapability) {

+                var content = target.messageContent();

+                var hasContent = false;

+                var numbers = getSelectValFromChosen($('.search-choice', '#chosenUserSelect_chosen'));

+                var noContactSelected = !(numbers && numbers.length > 0);

+                if (typeof content == "undefined" || content == '') {

+                    config.resetContentModifyValue();

+                    return false;

+                } else {

+                    hasContent = true;

+                }

+                if (hasContent && !noContactSelected) {

+                    config.CONTENT_MODIFIED.modified = true;

+                    config.CONTENT_MODIFIED.message = 'sms_to_save_draft';

+                    config.CONTENT_MODIFIED.callback.ok = saveDraftAction;

+                    config.CONTENT_MODIFIED.callback.no = $.noop;

+                    config.CONTENT_MODIFIED.data = {

+                        content: content,

+                        numbers: numbers

+                    };

+                    return false;

+                }

+                if (hasContent && noContactSelected) {

+                    config.CONTENT_MODIFIED.modified = true;

+                    config.CONTENT_MODIFIED.message = 'sms_no_recipient';

+                    config.CONTENT_MODIFIED.callback.ok = $.noop;

+                    config.CONTENT_MODIFIED.callback.no = function () {

+                        // 返回true,页面保持原状

+                        return true;

+                    };

+                    return false;

+                }

+            }

+            /*else { cov_2

+            config.resetContentModifyValue();

+            }*/

+        }

+

+        function saveDraftAction(data) {

+            var datetime = new Date();

+            var params = {

+                index: -1,

+                currentTimeString: getCurrentTimeString(datetime),

+                groupId: data.numbers.length > 1 ? datetime.getTime() : '',

+                message: data.content,

+                numbers: data.numbers

+            };

+            service.saveSMS(params, function () {

+                successOverlay('sms_save_draft_success');

+            }, function () {

+                errorOverlay("sms_save_draft_failed")

+            });

+        }

+        function smsPageCheckDraft(clearCallback, isNeedInit) {

+            if (config.CONTENT_MODIFIED.message != 'sms_to_save_draft') {

+                if (config.CONTENT_MODIFIED.modified) {

+                    showConfirm(config.CONTENT_MODIFIED.message, {

+                        ok: function () {

+                            config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                            clearCallback(isNeedInit);

+                        },

+                        no: function () {

+                            if (config.CONTENT_MODIFIED.message == 'sms_to_save_draft') {

+                                clearCallback(isNeedInit);

+                            }

+                            return false;

+                        }

+                    });

+                    return false;

+                } else {

+                    clearCallback(isNeedInit);

+                }

+            } else {

+                config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                clearCallback(isNeedInit);

+            }

+        }

+

+        //重新获取页面数据并显示

+        function getPhoneBookReady() {

+            service.getPhoneBookReady({}, function (data) {

+                if (data.pbm_init_flag == "6") {

+                    target.initFail(true);

+                    hideLoading();

+                    showAlert("phonebook_init_fail");

+                } else if (data.pbm_init_flag != "0") {

+                    addTimeout(getPhoneBookReady, 1000);

+                } else {

+                    target.initFail(false);

+                    var capacity = getCapacity();

+                    target.capacity(capacity);

+                    target.phoneBookCapacity(capacity.Ratio);

+                    var phoneBooks = getBooks(capacity.Used);

+                    target.books(phoneBooks);

+                    target.gridTemplate.data(phoneBooks);

+                    $('#books').find('tbody').translate();

+                    hideLoading();

+                }

+            });

+        }

+

+        showLoading('waiting');

+        addTimeout(getPhoneBookReady, 200);

+

+        //重新获取页面数据并显示

+        function refreshPage() {

+            showLoading();

+            var capacity = getCapacity();

+            target.phoneBookCapacity(capacity.Ratio);

+            target.capacity(capacity);

+            var books = getBooks(capacity.Used);

+            target.books(books);

+            target.gridTemplate.data(books);

+            hideLoading();

+        }

+

+        target.preContent = {};

+        //保存编辑前的内容

+        function setPreContent() {

+            target.preContent.location = target.selectedLocation();

+            target.preContent.name = target.name();

+            target.preContent.mobile_phone_number = target.mobile_phone_number();

+            target.preContent.home_phone_number = target.home_phone_number();

+            target.preContent.office_phone_number = target.office_phone_number();

+            target.preContent.mail = target.mail();

+            target.preContent.group = target.selectedGroup();

+        }

+

+        //检测数据是否改变

+        function checkContentChang() {

+            var changed = (target.preContent.location != target.selectedLocation()

+                 || target.preContent.name != target.name()

+                 || target.preContent.mobile_phone_number != target.mobile_phone_number()

+                 || target.preContent.home_phone_number != target.home_phone_number()

+                 || target.preContent.office_phone_number != target.office_phone_number()

+                 || target.preContent.mail != target.mail()

+                 || target.preContent.group != target.selectedGroup());

+            config.CONTENT_MODIFIED.modified = changed;

+        }

+

+        function preOpenEditPage() {

+            config.resetContentModifyValue();

+            setPreContent();

+            config.CONTENT_MODIFIED.checkChangMethod = checkContentChang;

+        }

+    }

+

+    //设置停止发送标志为true

+    phoneBookStopSMSSending = function () {

+        _phoneBookStopSMSSending = true;

+        $("#loading #loading_container").html($.i18n.prop("sms_cancel_sending"));

+    }

+

+    //获取电话本

+    function getBooks(capacity) {

+        var para = {};

+        para.page = 0;

+        para.data_per_page = capacity;

+        para.orderBy = "name";

+        para.isAsc = true;

+        var books = [];

+        var group = getCurrentGroup();

+        if (config.HAS_SMS) {

+            books = service.getPhoneBooks(para);

+            config.phonebook = books.pbm_data;

+            if (group != "all") {

+                books = {

+                    "pbm_data": _.filter(books.pbm_data, function (item) {

+                        return item.pbm_group == group;

+                    })

+                };

+            }

+        } else {

+            if (group != "all") {

+                para.group = group;

+                books = service.getPhoneBooksByGroup(para);

+            } else {

+                books = service.getPhoneBooks(para);

+            }

+        }

+        return translateData(books.pbm_data);

+    }

+

+    //获取电话本容量信息

+    function getCapacity() {

+        var sim = service.getSIMPhoneBookCapacity();

+        var device = service.getDevicePhoneBookCapacity();

+        return {

+            simUsed: sim.simPbmUsedCapacity,

+            deviceUsed: device.pcPbmUsedCapacity,

+            simCapacity: sim.simPbmTotalCapacity,

+            deviceCapacity: device.pcPbmTotalCapacity,

+            simMaxNameLen: sim.maxNameLen,

+            simMaxNumberLen: sim.maxNumberLen,

+            IsSimCardFull: (sim.simPbmUsedCapacity == sim.simPbmTotalCapacity),

+            IsDeviceFull: (device.pcPbmUsedCapacity == device.pcPbmTotalCapacity),

+            Used: sim.simPbmUsedCapacity + device.pcPbmUsedCapacity,

+            Capacity: sim.simPbmTotalCapacity + device.pcPbmTotalCapacity,

+            Ratio: "(" + (sim.simPbmUsedCapacity + device.pcPbmUsedCapacity) + "/" + (sim.simPbmTotalCapacity + device.pcPbmTotalCapacity) + ")"

+        };

+    }

+

+    function translateData(books) {

+        var ret = [];

+        var group = getCurrentGroup();

+        var hasFilter = (group != "all");

+        if (books) {

+            for (var i = 0; i < books.length; i++) {

+                if (hasFilter) {

+                    var currentGroup = books[i].pbm_group;

+                    if (books[i].pbm_location == locationValue.SIM || currentGroup != group) {

+                        continue;

+                    }

+                }

+                var temp = {

+                    index: books[i].pbm_id,

+                    location: books[i].pbm_location,

+                    imgLocation: books[i].pbm_location == locationValue.SIM ? "pic/simcard.png" : "pic/res_device.png",

+                    name: books[i].pbm_name,

+                    mobile_phone_number: books[i].pbm_number,

+                    home_phone_number: books[i].pbm_anr,

+                    office_phone_number: books[i].pbm_anr1,

+                    mail: books[i].pbm_email,

+                    group: books[i].pbm_group,

+                    transGroup: (!books[i].pbm_group) ? "group_null" : "group_" + books[i].pbm_group

+                };

+                ret.push(temp);

+            }

+        }

+        return ret;

+    }

+    //初始化ViewModel并进行绑定

+    function init() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new pbViewMode();

+        ko.applyBindings(vm, container[0]);

+        $("#txtSmsContent").die().live("contextmenu", function () {

+            return false;

+        });

+        $('#frmPhoneBook').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtMail: "email_check",

+                txtName: "name_check",

+                txtMobile: "phonenumber_check",

+                txtHomeNumber: "phonenumber_check",

+                txtOfficeNumber: "phonenumber_check"

+            }

+        });

+

+    }

+

+    return {

+        init: init

+    };

+});

+

+define("sms_list","underscore jquery knockout set service jq_chosen".split(" "),

+    function (_, $, ko, config, service, chosen) {

+

+    var currentPage = 1;

+    //数据是否加载完成

+    var ready = false,

+    //聊天室信息正在加载中

+    chatRoomInLoading = false;

+    //快速添加联系人模板

+    var addPhonebookTmpl = null,

+    //短消息模板

+    smsTableTmpl = null,

+    //接收短消息模板

+    smsOtherTmpl = null,

+    //发送短消息模板

+    smsMeTmpl = null,

+    //群聊草稿

+    groupDrafts = [],

+    //短消息列表显示群聊草稿

+    groupDraftItems = [],

+    //短消息列表显示群聊草稿及其草稿群聊细节

+    groupedDraftsObject = {},

+    //短消息容量信息

+    smsCapability = {},

+    //短消息是否还有存储空间

+    hasCapability = true;

+    //获取全部短消息,并将短信通过回调函数getPhoneBooks,与电话本进行关联

+    function getSMSMessages(callback) {

+        return service.getSMSMessages({

+            page: 0,

+            smsCount: 500,

+            nMessageStoreType: 1,

+            tags: 10,

+            orderBy: "order by id desc"

+        }, function (data) {

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), data.messages.length);

+            config.dbMsgs = data.messages;

+            config.listMsgs = groupSms(config.dbMsgs);

+            callback();

+        }, function () {

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), 0);

+            config.dbMsgs = [];

+            config.listMsgs = [];

+            cleanSmsList();

+        });

+    }

+

+    //清楚短消息列表内容

+    cleanSmsList = function () {

+        $("#smslist-table").empty();

+    };

+

+    //关联后的短消息根据电话号码进行分组

+    function groupSms(messages) {

+        var peoples = {},

+        theSortedPeoples = [];

+        config.listMsgs = [];

+        groupDrafts = [];

+        $.each(messages, function (i, e) {

+            if (e.tag == '4' && e.groupId != '') { // 群聊草稿

+                groupDrafts.push(e);

+                return;

+            }

+            e.target = e.number;

+            if (parseInt(e.id, 10) > config.smsMaxId) {

+                config.smsMaxId = e.id;

+            }

+            var last8 = getLastNumber(e.number, config.SMS_MATCH_LENGTH);

+            if (last8 in peoples) {

+                peoples[last8].push(e);

+            } else {

+                peoples[last8] = [e];

+                theSortedPeoples.push(e);

+            }

+        });

+        theSortedPeoples = _.sortBy(theSortedPeoples, function (ele) {

+            return 0 - parseInt(ele.id + "", 10);

+        });

+        $.each(theSortedPeoples, function (s_i, sp) {

+            var people = getLastNumber(sp.number, config.SMS_MATCH_LENGTH);

+            var newCount = 0;

+            var hasDraft = false;

+            for (var i = 0; i < peoples[people].length; i++) {

+                if (peoples[people][i].isNew) {

+                    newCount++;

+                }

+                if (peoples[people][i].tag == '4' && peoples[people][i].groupId == '') { // 单条草稿

+                    hasDraft = true;

+                }

+            }

+            config.listMsgs.push({

+                id: peoples[people][0].id,

+                name: "",

+                number: peoples[people][0].number,

+                latestId: peoples[people][0].id,

+                totalCount: peoples[people].length,

+                newCount: newCount,

+                latestSms: peoples[people][0].content,

+                latestTime: peoples[people][0].time,

+                checked: false,

+                itemId: getLastNumber(people, config.SMS_MATCH_LENGTH),

+                groupId: peoples[people][0].groupId,

+                hasDraft: hasDraft

+            });

+        });

+        return config.listMsgs;

+    }

+

+    //获取电话本信息,并与短消息关联

+    function getPhoneBooks() {

+        var books = service.getPhoneBooks({

+            page: 0,

+            data_per_page: 2000,

+            orderBy: "name",

+            isAsc: true

+        });

+        if ($.isArray(books.pbm_data) && books.pbm_data.length > 0) {

+            config.phonebook = books.pbm_data;

+        }

+        dealPhoneBooks();

+    }

+

+    //双异步获取设备侧和sim卡侧的短信息,并将其合并

+    function dealPhoneBooks() {

+        var select = $("#chosenUserList .chosen-select-deselect");

+        select.empty();

+        var options = [];

+        var tmp = [];

+        var pbTmp = [];

+        for (var j = 0; j < config.phonebook.length; j++) {

+            var book = config.phonebook[j];

+            var last8Num = getLastNumber(book.pbm_number, config.SMS_MATCH_LENGTH);

+            if (last8Num && $.inArray(last8Num, pbTmp) == -1) {

+                options.push(new Option(book.pbm_name + "/" + book.pbm_number, last8Num, false, true));

+                if ($.inArray(last8Num, tmp) == -1) {

+                    tmp.push(last8Num);

+                }

+                pbTmp.push(last8Num);

+            } else {

+                for (var i = 0; i < options.length; i++) {

+                    if (options[i].value == last8Num) {

+                        options[i].text = book.pbm_name + "/" + book.pbm_number;

+                        break;

+                    }

+                }

+            }

+        }

+        var groupIds = [];

+        for (var k = 0; k < groupDrafts.length; k++) { // 将草稿做对象Map封装,供草稿组点击后的草稿分解

+            if ($.inArray(groupDrafts[k].groupId, groupIds) == -1) {

+                groupIds.push(groupDrafts[k].groupId);

+                var draft = groupDrafts[k];

+                groupedDraftsObject[groupDrafts[k].groupId] = [draft];

+            } else {

+                var draft = groupDrafts[k];

+                groupedDraftsObject[groupDrafts[k].groupId].push(draft);

+            }

+            var itemId = getLastNumber(groupDrafts[k].number, config.SMS_MATCH_LENGTH);

+            if ($.inArray(itemId, tmp) == -1) {

+                options.push(new Option(groupDrafts[k].number, itemId));

+                tmp.push(itemId);

+            }

+        }

+        for (var g in groupedDraftsObject) { // 处理列表显示的草稿信息

+            var drafts = groupedDraftsObject[g];

+            var draftItem = drafts[drafts.length - 1];

+            draftItem.draftShowName = '';

+            draftItem.draftShowNameTitle = '';

+            $.each(drafts, function (i, n) {

+                var showName = getShowNameByNumber(n.number);

+                draftItem.draftShowName += (i == 0 ? '' : ';') + showName;

+                draftItem.draftShowNameTitle += (i == 0 ? '' : ';') + showName;

+            });

+

+            var len = 10;

+            if (getEncodeType(draftItem.draftShowName).encodeType == "UNICODE") {

+                len = 10;

+            }

+            draftItem.draftShowName = draftItem.draftShowName.length > len ? draftItem.draftShowName.substring(0, len) + "..." : draftItem.draftShowName;

+            draftItem.totalCount = drafts.length;

+            draftItem.hasDraft = true;

+            draftItem.latestTime = draftItem.time;

+            groupDraftItems.push(draftItem);

+        }

+        for (var i = 0; i < config.listMsgs.length; i++) {

+            var smsItem = config.listMsgs[i];

+            for (var j = config.phonebook.length; j > 0; j--) {

+                var book = config.phonebook[j - 1];

+                var last8Num = getLastNumber(book.pbm_number, config.SMS_MATCH_LENGTH);

+                if (smsItem.itemId == last8Num) {

+                    smsItem.name = book.pbm_name;

+                    for (var k = 0; k < options.length; k++) {

+                        if (last8Num == options[k].value) {

+                            options[k].value = getLastNumber(smsItem.number, config.SMS_MATCH_LENGTH);

+                            options[k].text = book.pbm_name + '/' + smsItem.number;

+                            break;

+                        }

+                    }

+                    break;

+                }

+            }

+            if ($.inArray(smsItem.itemId, tmp) == -1) {

+                options.push(new Option(smsItem.number, getLastNumber(smsItem.number, config.SMS_MATCH_LENGTH)));

+                tmp.push(smsItem.itemId);

+            }

+        }

+

+        var opts = "";

+        $.each(options, function (i, e) {

+            opts += "<option value='" + HTMLEncode(e.value) + "'>" + HTMLEncode(e.text) + "</option>";

+        });

+        select.append(opts);

+        select.chosen({

+            max_selected_options: 5,

+            search_contains: true,

+            width: '740px'

+        });

+        showSmsListData();

+        showMultiDraftListData();

+        //changeShownMsgs();

+        ready = true;

+    }

+

+    function showSmsListData() {

+        if (smsTableTmpl == null) {

+            smsTableTmpl = $.template("smsTableTmpl", $("#smsTableTmpl"));

+        }

+        cleanSmsList();

+        $.tmpl("smsTableTmpl", {

+            data: config.listMsgs

+        }).translate().appendTo("#smslist-table");

+

+        if (config.HAS_PHONEBOOK) {

+            $(".sms-add-contact-icon").removeClass("hide");

+        } else {

+            $(".sms-add-contact-icon").addClass("hide");

+        }

+    }

+    //群组草稿列表显示

+    function showMultiDraftListData() {

+        if (groupDraftItems.length == 0) {

+            return false;

+        }

+        if (smsTableTmpl == null) {

+            smsTableTmpl = $.template("smsTableTmpl", $("#smsTableTmpl"));

+        }

+        $.tmpl("smsTableTmpl", {

+            data: groupDraftItems

+        }).translate().prependTo("#smslist-table");

+    }

+

+    // 页面发生滚动后,改变页面显示的短消息

+    function changeShownMsgs() {

+        var shownMsgsTmp = [];

+        var range = _.range((currentPage - 1) * 5, currentPage * 5);

+        $.each(range, function (i, e) {

+            if (config.listMsgs[e]) {

+                shownMsgsTmp.push(config.listMsgs[e]);

+            }

+        });

+        //shownMsgsTmp = config.listMsgs;

+        currentPage++;

+

+        if (smsTableTmpl == null) {

+            smsTableTmpl = $.template("smsTableTmpl", $("#smsTableTmpl"));

+        }

+        $.tmpl("smsTableTmpl", {

+            data: shownMsgsTmp

+        }).translate().appendTo("#smslist-table");

+

+        renderCheckbox();

+        if (shownMsgsTmp.length == 0) {

+            disableBtn($("#smslist-delete-all"));

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), 0);

+        } else {

+            enableBtn($("#smslist-delete-all"));

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), 1);

+        }

+        if (currentPage == 2 && window.innerHeight == $("body").height()) {

+            changeShownMsgs();

+        }

+        return shownMsgsTmp;

+    }

+

+    //将被checked的条目添加到self.checkedItem中,用于在滚动还原checkbox

+    checkboxClickHandler = function (id) {

+        checkDeleteBtnStatus();

+    };

+

+    //获取已选择的条目

+    getSelectedItem = function () {

+        var selected = [];

+        var checkedItem = $("#smslist-table input:checkbox:checked");

+        checkedItem.each(function (i, e) {

+            selected.push($(e).val());

+        });

+        return selected;

+    };

+

+    //删除按钮是否禁用

+    checkDeleteBtnStatus = function () {

+        var size = getSelectedItem().length;

+        if (size == 0) {

+            disableBtn($("#smslist-delete"));

+        } else {

+            enableBtn($("#smslist-delete"));

+        }

+    };

+

+    //刷新短消息列表

+    refreshClickHandler = function () {

+        $("#smslist-table").empty();

+        disableBtn($("#smslist-delete"));

+        disableCheckbox($("#smslist-checkAll", "#smsListForm"));

+        init();

+        renderCheckbox();

+    };

+

+    //删除全部短消息

+    deleteAllClickHandler = function () {

+        showConfirm("confirm_data_delete", function () {

+            showLoading('deleting');

+            service.deleteAllMessages({

+                location: "native_inbox"

+            }, function (data) {

+                cleanSmsList();

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), 0);

+                successOverlay();

+            }, function (error) {

+                errorOverlay(error.errorText);

+            });

+        });

+    };

+

+    //删除选中的短消息

+    deleteSelectClickHandler = function () {

+        showConfirm("confirm_sms_delete", function () {

+            showLoading('deleting');

+            var items = getIdsBySelectedIds();

+            service.deleteMessage({

+                ids: items.ids

+            }, function (data) {

+                renderAfterDelete(items);

+                disableBtn($("#smslist-delete"));

+                $("#checkbox-all").removeAttr("checked");

+                renderCheckbox();

+                successOverlay();

+            }, function (error) {

+                errorOverlay(error.errorText);

+            });

+        });

+

+        function renderAfterDelete(items) {

+            var ids = items.ids;

+            var nums = [];

+            $.each(config.dbMsgs, function (i, e) {

+                if ($.inArray(e.id, items.normalIds) != -1) {

+                    nums.push(e.number);

+                }

+            });

+            nums = _.uniq(nums);

+            $.each(nums, function (i, e) {

+                $("#smslist-item-" + getLastNumber(e, config.SMS_MATCH_LENGTH)).hide().remove();

+            });

+            $.each(items.groups, function (i, e) {

+                $("#smslist-item-" + e).hide().remove();

+            });

+            synchSmsList(nums, ids);

+        }

+

+        function getIdsBySelectedIds() {

+            var nums = [];

+            var resultIds = [];

+            var normalIds = [];

+            var groups = [];

+            var selectedItem = getSelectedItem();

+            $.each(selectedItem, function (i, e) {

+                var checkbox = $("#checkbox" + e);

+                if (checkbox.attr("groupid")) {

+                    groups.push(checkbox.attr("groupid"));

+                } else {

+                    nums.push(getLastNumber(checkbox.attr("number"), config.SMS_MATCH_LENGTH));

+                }

+            });

+

+            $.each(config.dbMsgs, function (i, e) {

+                if ($.inArray(getLastNumber(e.number, config.SMS_MATCH_LENGTH), nums) != -1 && (typeof e.groupId == "undefined" || _.isEmpty(e.groupId + ''))) {

+                    resultIds.push(e.id);

+                    normalIds.push(e.id);

+                } else if ($.inArray(e.groupId + '', groups) != -1) { //删除草稿组

+                    resultIds.push(e.id);

+                }

+            });

+            resultIds = _.uniq(resultIds);

+            return {

+                ids: resultIds,

+                groups: groups,

+                normalIds: normalIds

+            };

+        }

+    };

+

+    //新短信按钮点击

+    newMessageClickHandler = function () {

+        $("#chosenUser1", "#smsChatRoom").addClass("hide");

+        $("#chosenUser", "#smsChatRoom").show();

+

+        cleanChatInput();

+        checkSmsCapacityAndAlert();

+        $("select.chosen-select-deselect").val("").trigger("chosen:updated.chosen");

+        switchPage('chat');

+        gotoBottom();

+        clearChatList();

+    };

+

+    //返回聊天室列表

+    chatCancelClickHandler = function () {

+        if (config.CONTENT_MODIFIED.modified) {

+            var confirmMessage = 'sms_to_save_draft';

+            var selectedContact = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+            var noContactSelected = !selectedContact || selectedContact.length == 0;

+            if (noContactSelected) {

+                confirmMessage = 'sms_no_recipient';

+            }

+            if (noContactSelected) {

+                showConfirm(confirmMessage, {

+                    ok: function () {

+                        if (!noContactSelected) {

+                            saveDraftAction({

+                                content: $("#chat-input", "#smsChatRoom").val(),

+                                numbers: selectedContact,

+                                isFromBack: true

+                            });

+                        }

+                        config.resetContentModifyValue();

+                        backToSmsListMainPage();

+                    },

+                    no: function () {

+                        if (noContactSelected) {

+                            return true;

+                        }

+                        config.resetContentModifyValue();

+                        backToSmsListMainPage();

+                    }

+                });

+            } else {

+                saveDraftAction({

+                    content: $("#chat-input", "#smsChatRoom").val(),

+                    numbers: selectedContact,

+                    isFromBack: true

+                });

+                config.resetContentModifyValue();

+                backToSmsListMainPage();

+            }

+            return false;

+        }

+        backToSmsListMainPage();

+    };

+

+    //跳转页面至SIM卡侧、设置界面

+    toOtherClickHandler = function (href) {

+        config.CONTENT_MODIFIED.checkChangMethod();

+        if (config.CONTENT_MODIFIED.modified) {

+            draftListener();

+            if (config.CONTENT_MODIFIED.message == 'sms_to_save_draft') {

+                config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                config.resetContentModifyValue();

+                window.location.hash = href;

+            } else {

+                showConfirm(config.CONTENT_MODIFIED.message, {

+                    ok: function () {

+                        config.CONTENT_MODIFIED.callback.ok(config.CONTENT_MODIFIED.data);

+                        config.resetContentModifyValue();

+                        window.location.hash = href;

+                    },

+                    no: function () {

+                        var result = config.CONTENT_MODIFIED.callback.no(config.CONTENT_MODIFIED.data);

+                        if (!result) {

+                            window.location.hash = href;

+                            config.resetContentModifyValue();

+                        }

+                    }

+                });

+            }

+            return false;

+        } else {

+            window.location.hash = href;

+        }

+    };

+

+    function backToSmsListMainPage() {

+        $("select.chosen-select-deselect").val("").trigger("chosen:updated.chosen");

+        config.currentChatObject = null;

+        $(".smslist-btns", "#smslist-main").removeClass('smsListFloatButs');

+        switchPage('list');

+    }

+

+    function switchPage(page) {

+        if (page == 'chat') {

+            $("#smslist-main").hide();

+            $("#smsChatRoom").show();

+        } else {

+            $("#smsChatRoom").hide();

+            $("#smslist-main").show();

+        }

+    }

+

+    var sendSmsErrorTimer = null;

+    //添加发送错误消息

+    addSendSmsError = function (msg) {

+        if (sendSmsErrorTimer) {

+            window.clearTimeout(sendSmsErrorTimer);

+            sendSmsErrorTimer = null;

+        }

+        $("#sendSmsErrorLi").text($.i18n.prop(msg));

+        sendSmsErrorTimer = addTimeout(function () {

+            $("#sendSmsErrorLi").text("");

+        }, 5000);

+    };

+

+    //发送短消息

+    sendSmsClickHandler = function () {

+        if (!hasCapability) {

+            showAlert("sms_capacity_is_full_for_send");

+            return;

+        }

+        var inputVal = $("#chat-input", "#smsChatRoom");

+        var msgContent = inputVal.val();

+        if (msgContent == $.i18n.prop("chat_input_placehoder")) {

+            inputVal.val("");

+            msgContent = "";

+        }

+        var nums = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+        if ($.isArray(nums)) {

+            nums = $.grep(nums, function (n, i) {

+                return !_.isEmpty(n);

+            });

+        }

+        if (!nums || nums.length == 0) {

+            addSendSmsError("sms_contact_required");

+            return;

+        }

+        if (nums.length + smsCapability.nvUsed > smsCapability.nvTotal) {

+            showAlert({

+                msg: "sms_capacity_will_full_just",

+                params: [smsCapability.nvTotal - smsCapability.nvUsed]

+            });

+            return;

+        }

+        if (nums.length == 1) {

+            config.currentChatObject = getLastNumber(nums[0], config.SMS_MATCH_LENGTH);

+            showLoading('sending');

+        } else if (nums.length > 1) {

+            showLoading("sending", "<button id='sms_cancel_sending' onclick='cancelSending()' class='btn btn-primary'>"

+                 + $.i18n.prop("sms_stop_sending")

+                 + "</button>");

+            config.currentChatObject = null;

+        }

+        var i = 0;

+        var leftNum = nums.length;

+        couldSend = true;

+        disableBtn($("#btn-send", "#inputpanel"));

+        sendSms = function () {

+            if (!couldSend) {

+                hideLoading();

+                return;

+            }

+            var newMsg = {

+                id: -1,

+                number: nums[i],

+                content: msgContent,

+                isNew: false

+            };

+

+            if (leftNum == 1) {

+                $("#loading #loading_container").html("");

+            }

+

+            leftNum--;

+            service.sendSMS({

+                number: newMsg.number,

+                message: newMsg.content,

+                id: -1

+            }, function (data) {

+                var latestMsg = getLatestMessage() || {

+                    id: parseInt(config.smsMaxId, 10) + 1,

+                    time: transUnixTime($.now()),

+                    number: newMsg.number

+                };

+                config.smsMaxId = latestMsg.id;

+                newMsg.id = config.smsMaxId;

+                newMsg.time = latestMsg.time;

+                newMsg.tag = 2;

+                newMsg.hasDraft = false;

+                if (nums.length > 1) {

+                    newMsg.targetName = getNameOrNumberByNumber(newMsg.number);

+                }

+                addSendMessage(newMsg, i + 1 != nums.length);

+                updateDBMsg(newMsg);

+                updateMsgList(newMsg);

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+                gotoBottom();

+                if (i + 1 == nums.length) {

+                    updateChatInputWordLength();

+                    enableBtn($("#btn-send", "#inputpanel"));

+                    hideLoading();

+                    return;

+                }

+                i++;

+                sendSms();

+            }, function (error) {

+                var latestMsg = getLatestMessage() || {

+                    id: parseInt(config.smsMaxId, 10) + 1,

+                    time: transUnixTime($.now()),

+                    number: newMsg.number

+                };

+                config.smsMaxId = latestMsg.id;

+                newMsg.id = config.smsMaxId;

+                newMsg.time = latestMsg.time;

+                newMsg.errorText = $.i18n.prop(error.errorText);

+                newMsg.tag = 3;

+                newMsg.target = newMsg.number;

+                newMsg.hasDraft = false;

+                if (nums.length > 1) {

+                    newMsg.targetName = getNameOrNumberByNumber(newMsg.number);

+                }

+                addSendMessage(newMsg, i + 1 != nums.length);

+                updateDBMsg(newMsg);

+                updateMsgList(newMsg);

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+                gotoBottom();

+                if (i + 1 == nums.length) {

+                    updateChatInputWordLength();

+                    enableBtn($("#btn-send", "#inputpanel"));

+                    hideLoading();

+                    return;

+                }

+                i++;

+                sendSms();

+            });

+        };

+        sendSms();

+    };

+

+    var couldSend = true;

+

+    //取消剩余短信发送操作

+    cancelSending = function () {

+        couldSend = false;

+        $("#loading #loading_container").html($.i18n.prop('sms_cancel_sending'));

+    };

+

+    //获取最新的短消息

+    getLatestMessage = function () {

+        var data = service.getSMSMessages({

+            page: 0,

+            smsCount: 5,

+            nMessageStoreType: 1,

+            tags: 10,

+            orderBy: "order by id desc"

+        });

+        if (data.messages.length > 0) {

+            for (var i = 0; i < data.messages.length; i++) {

+                if (data.messages[i].tag == '2' || data.messages[i].tag == '3') {

+                    return data.messages[i];

+                }

+            }

+            return null;

+        } else {

+            return null;

+        }

+    };

+

+    //发送短信后,更新短信数据对象

+    function updateDBMsg(msg) {

+        if (config.dbMsgs.length == 0) {

+            config.dbMsgs = [msg];

+        } else {

+            /* cov_2

+            for(var j = 0; j < config.dbMsgs.length; j++){

+            if(config.dbMsgs[j].id == msg.id){

+            config.dbMsgs[j] = msg;

+            return;

+            } else {

+            var newMsg = [msg];

+            $.merge(newMsg, config.dbMsgs);

+            config.dbMsgs = newMsg;

+            return;

+            }

+            }

+             */

+            if (config.dbMsgs[0].id == msg.id) {

+                config.dbMsgs[0] = msg;

+                return;

+            } else {

+                var newMsg = [msg];

+                $.merge(newMsg, config.dbMsgs);

+                config.dbMsgs = newMsg;

+                return;

+            }

+        }

+    }

+

+    //发送短信后,更新短信列表, number不为空做删除处理,为空做增加处理

+    function updateMsgList(msg, number, counter) {

+        if ((!msg || !msg.number) && !number) {

+            return;

+        }

+        var itemId = '';

+        if (msg && typeof msg.groupId != "undefined" && msg.groupId != '') {

+            itemId = msg.groupId;

+        } else {

+            itemId = getLastNumber((number || msg.number), config.SMS_MATCH_LENGTH);

+        }

+        var item = $("#smslist-item-" + itemId);

+        if (item && item.length > 0) {

+            var totalCountItem = item.find(".smslist-item-total-count");

+            var count = totalCountItem.text();

+            count = Number(count.substring(1, count.length - 1));

+            if (number) {

+                if (count == 1 || msg == null) {

+                    item.hide().remove();

+                    return;

+                } else {

+                    totalCountItem.text("(" + (count - (counter || 1)) + ")");

+                    item.find(".smslist-item-draft-flag").addClass('hide');

+                }

+            } else {

+                totalCountItem.text("(" + (count + 1) + ")");

+                if (msg.tag == '4') {

+                    item.find(".smslist-item-draft-flag").removeClass('hide');

+                }

+            }

+            item.find(".smslist-item-checkbox p.checkbox").attr("id", msg.id);

+            item.find(".smslist-item-checkbox input:checkbox").val(msg.id).attr("id", "checkbox" + msg.id);

+            var contentHtml = msg.content;

+			var msgContent;

+            if (msg.tag == '4') {

+                //contentHtml = '<span class="smslist-item-draft-flag colorRed" data-trans="draft"></span>: ' + contentHtml;

+				msgContent = item.find(".smslist-item-msg").html('<span class="smslist-item-draft-flag colorRed" data-trans="draft"></span>: ' + HTMLEncode(contentHtml)); //.addClass("font-weight-bold");

+            } else {

+				msgContent = item.find(".smslist-item-msg").html(HTMLEncode(contentHtml)); //.addClass("font-weight-bold");

+			}

+            //var msgContent = item.find(".smslist-item-msg").html(HTMLEncode(contentHtml)); //.addClass("font-weight-bold");

+            msgContent.closest('td').prop('title', msg.content);

+            item.find(".smslist-item-repeat span").die().click(function () {

+                forwardClickHandler(msg.id);

+            });

+            item.find("span.clock-time").text(msg.time);

+            var tmpItem = item;

+            item.hide().remove();

+            $("#smslist-table").prepend(tmpItem.show());

+        } else {

+            if (smsTableTmpl == null) {

+                smsTableTmpl = $.template("smsTableTmpl", $("#smsTableTmpl"));

+            }

+            msg.checked = false;

+            msg.newCount = 0;

+            msg.latestId = msg.id;

+            msg.latestSms = msg.content;

+            msg.latestTime = msg.time;

+            if (msg.groupId == '' || typeof msg.groupId == "undefined") {

+                msg.totalCount = 1;

+            }

+            if (!msg.hasDraft) {

+                msg.hasDraft = false;

+            }

+            msg.itemId = itemId;

+            msg.name = getNameByNumber(msg.number);

+            $.tmpl("smsTableTmpl", {

+                data: [msg]

+            }).translate().prependTo("#smslist-table");

+        }

+        if (config.HAS_PHONEBOOK) {

+            $(".sms-add-contact-icon").removeClass("hide");

+        } else {

+            $(".sms-add-contact-icon").addClass("hide");

+        }

+        $("#smslist-table").translate();

+        renderCheckbox();

+    }

+

+    //增加发送内容到聊天室, notCleanChatInput 是否清除输入框内容

+    addSendMessage = function (sms, notCleanChatInput) {

+        if (smsMeTmpl == null) {

+            smsMeTmpl = $.template("smsMeTmpl", $("#smsMeTmpl"));

+        }

+        $.tmpl("smsMeTmpl", sms).appendTo("#chatlist");

+        $("#chatlist").translate();

+        if (!notCleanChatInput) {

+            cleanChatInput();

+        }

+        clearMySmsErrorMessage(sms.id);

+    };

+

+    //清楚错误消息,避免翻译问题

+    clearMySmsErrorMessage = function (id) {

+        addTimeout(function () {

+            $("div.error", "#talk-item-" + id).text("");

+        }, 3000);

+    };

+

+    //快速添加联系人overlay是否打开

+    var isPoped = false;

+

+    //关闭快速添加联系人overlay

+    hidePopup = function () {

+        $(".tagPopup").remove();

+        isPoped = false;

+    };

+

+    //清空聊天室内容

+    clearChatList = function () {

+        $("#chatlist").empty();

+        updateChatInputWordLength();

+    };

+

+    //过滤短消息内容

+    dealContent = function (content) {

+        if (config.HAS_PHONEBOOK) {

+            return HTMLEncode(content).replace(/(\d{3,})/g, function (word) {

+                var r = (new Date().getTime() + '').substring(6) + (getRandomInt(1000) + 1000);

+                return "<a id='aNumber" + r + "' href='javascript:openPhoneBook(\"" + r + "\", \"" + word + "\")'>" + word + "</a>";

+            });

+        } else {

+            return HTMLEncode(content);

+        }

+

+    };

+

+    //打开快速添加联系人overlay

+    openPhoneBook = function (id, num) {

+        var target = null;

+        var outContainer = "";

+        var itemsContainer = null;

+        var isChatRoom = false;

+        if (!id) {

+            target = $("#listNumber" + getLastNumber(num, config.SMS_MATCH_LENGTH));

+            outContainer = ".smslist-item";

+            itemsContainer = $("#addPhonebookContainer");

+        } else {

+            target = $("#aNumber" + id);

+            outContainer = ".msg_container";

+            itemsContainer = $("#chatlist");

+            isChatRoom = true;

+        }

+        if (isPoped) {

+            hidePopup();

+        }

+        isPoped = true;

+        $("#tagPopup").remove();

+

+        if (addPhonebookTmpl == null) {

+            addPhonebookTmpl = $.template("addPhonebookTmpl", $("#addPhonebookTmpl"));

+        }

+        $.tmpl("addPhonebookTmpl", {

+            number: num

+        }).appendTo(itemsContainer);

+        var p = target.position();

+        var msgContainer = target.closest(outContainer);

+        var msgP = msgContainer.position();

+        var _left = 0,

+        _top = 0;

+        if (isChatRoom) {

+            var containerWidth = itemsContainer.width();

+            var containerHeight = itemsContainer.height();

+            var pop = $("#innerTagPopup");

+            _left = msgP.left + p.left;

+            _top = msgP.top + p.top + 20;

+            if (pop.width() + _left > containerWidth) {

+                _left = containerWidth - pop.width() - 20;

+            }

+            if (containerHeight > 100 && pop.height() + _top > containerHeight) {

+                _top = containerHeight - pop.height() - 5;

+            }

+        } else {

+            _left = p.left;

+            _top = p.top;

+        }

+        $("#innerTagPopup").css({

+            top: _top + "px",

+            left: _left + "px"

+        });

+        $('#quickSaveContactForm').translate().validate({

+            submitHandler: function () {

+                quickSaveContact(isChatRoom);

+            },

+            rules: {

+                name: "name_check",

+                number: "phonenumber_check"

+            }

+        });

+    };

+

+    //快速添加联系人

+    quickSaveContact = function () {

+        var name = $(".tagPopup #innerTagPopup #name").val();

+        var number = $(".tagPopup #innerTagPopup #number").val();

+        var newContact = {

+            index: -1,

+            location: 1,

+            name: name,

+            mobile_phone_number: number,

+            home_phone_number: "",

+            office_phone_number: "",

+            mail: ""

+        };

+        var device = service.getDevicePhoneBookCapacity();

+        if (device.pcPbmUsedCapacity >= device.pcPbmTotalCapacity) {

+            showAlert("device_full");

+            return false;

+        }

+        showLoading('waiting');

+        service.savePhoneBook(newContact, function (data) {

+            if (data.result == "success") {

+                config.phonebook.push({

+                    pbm_name: name,

+                    pbm_number: number

+                });

+                updateItemShowName(name, number);

+                hidePopup();

+                successOverlay();

+            } else {

+                errorOverlay();

+            }

+        }, function (data) {

+            errorOverlay();

+        });

+    };

+

+    function updateItemShowName(name, number) {

+        var lastNum = getLastNumber(number, config.SMS_MATCH_LENGTH);

+        $("span.smslist-item-name2", "#smslist-item-" + lastNum).text(name);

+        $("#listNumber" + lastNum).hide();

+    }

+

+    //聊天室删除单条消息

+    deleteSingleItemClickHandler = function (id, resendCallback) {

+        if (resendCallback) {

+            deleteTheSingleItem(id);

+        } else {

+            showConfirm("confirm_sms_delete", function () {

+                showLoading('deleting');

+                deleteTheSingleItem(id);

+            });

+        }

+

+        function deleteTheSingleItem(id) {

+            service.deleteMessage({

+                ids: [id]

+            }, function (data) {

+                var target = $(".smslist-item-delete", "#talk-item-" + id).attr("target");

+                $("#talk-item-" + id).hide().remove();

+

+                synchSmsList(null, [id]);

+                updateMsgList(getPeopleLatestMsg(target), target);

+                if (resendCallback) {

+                    resendCallback();

+                } else {

+                    hideLoading();

+                }

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+            }, function (error) {

+                if (resendCallback) {

+                    resendCallback();

+                } else {

+                    hideLoading();

+                }

+            });

+        }

+    };

+

+    //删除草稿

+    function deleteDraftSms(ids, numbers) {

+        stopNavigation();

+        service.deleteMessage({

+            ids: ids

+        }, function (data) {

+            updateSmsCapabilityStatus(null, function () {

+                draftListener();

+                restoreNavigation();

+            });

+            for (var i = 0; i < numbers.length; i++) {

+                updateMsgList(getPeopleLatestMsg(numbers[i]), numbers[i], ids.length);

+            }

+            synchSmsList(null, ids);

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+        }, function (error) {

+            restoreNavigation();

+            // Do nothing

+        });

+    }

+

+    //删除群聊草稿草稿

+    function deleteMultiDraftSms(ids, groupId) {

+        service.deleteMessage({

+            ids: ids

+        }, function (data) {

+            synchSmsList(null, ids);

+            $("#smslist-item-" + groupId).hide().remove();

+            checkSmsCapacityAndAlert();

+            tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+        }, function (error) {

+            // Do nothing

+        });

+    }

+

+    getCurrentChatObject = function () {

+        var nums = $("select.chosen-select-deselect").val();

+        if (!nums) {

+            config.currentChatObject = null;

+        } else if (nums.length == 1) {

+            config.currentChatObject = getLastNumber(nums, config.SMS_MATCH_LENGTH);

+        } else if (nums.length > 1) {

+            config.currentChatObject = null;

+        }

+        return config.currentChatObject;

+    };

+

+    //获取当前聊天对象最新的短消息

+    getPeopleLatestMsg = function (number) {

+        for (var j = 0; j < config.dbMsgs.length; j++) {

+            if (!config.dbMsgs[j].groupId && getLastNumber(config.dbMsgs[j].number, config.SMS_MATCH_LENGTH) == getLastNumber(number, config.SMS_MATCH_LENGTH)) {

+                return config.dbMsgs[j];

+            }

+        }

+        return null;

+    };

+

+    //重新发送,复制消息到发送框

+    resendClickHandler = function (id) {

+        if (!hasCapability) {

+            showAlert("sms_capacity_is_full_for_send");

+            return;

+        }

+        showLoading('sending');

+        $("div.error", "#talk-item-" + id).text($.i18n.prop("sms_resending"));

+        var targetNumber = $("div.smslist-item-resend", "#talk-item-" + id).attr("target");

+        var content = $("div.J_content", "#talk-item-" + id).text();

+        for (var j = 0; j < config.dbMsgs.length; j++) {

+            if (config.dbMsgs[j].id == id) {

+                content = config.dbMsgs[j].content;

+            }

+        }

+

+        disableBtn($("#btn-send", "#inputpanel"));

+        var newMsg = {

+            id: -1,

+            number: targetNumber,

+            content: content,

+            isNew: false

+        };

+        service.sendSMS({

+            number: newMsg.number,

+            message: newMsg.content,

+            id: -1

+        }, function (data) {

+            var latestMsg = getLatestMessage() || {

+                id: parseInt(config.smsMaxId, 10) + 1,

+                time: transUnixTime($.now()),

+                number: newMsg.number

+            };

+            config.smsMaxId = latestMsg.id;

+            newMsg.id = config.smsMaxId;

+            newMsg.time = latestMsg.time;

+            newMsg.tag = 2;

+            newMsg.target = latestMsg.number;

+            newMsg.targetName = getNameOrNumberByNumber(targetNumber);

+            updateDBMsg(newMsg);

+            updateMsgList(newMsg);

+            deleteSingleItemClickHandler(id, function () {

+                addSendMessage(newMsg, true);

+                updateChatInputWordLength();

+                enableBtn($("#btn-send", "#inputpanel"));

+                hideLoading();

+                gotoBottom();

+            });

+        }, function (error) {

+            var latestMsg = getLatestMessage() || {

+                id: parseInt(config.smsMaxId, 10) + 1,

+                time: transUnixTime($.now()),

+                number: newMsg.number

+            };

+            config.smsMaxId = latestMsg.id;

+            newMsg.id = config.smsMaxId;

+            newMsg.time = latestMsg.time;

+            newMsg.errorText = $.i18n.prop("sms_resend_fail");

+            newMsg.tag = 3;

+            newMsg.target = latestMsg.number;

+            newMsg.targetName = getNameOrNumberByNumber(targetNumber);

+            updateDBMsg(newMsg);

+            updateMsgList(newMsg);

+            deleteSingleItemClickHandler(id, function () {

+                addSendMessage(newMsg, true);

+                updateChatInputWordLength();

+                enableBtn($("#btn-send", "#inputpanel"));

+                hideLoading();

+                gotoBottom();

+            });

+        });

+    };

+

+    //滚动到底部

+    gotoBottom = function () {

+        $("#chatpanel .clear-container").animate({

+            scrollTop: $("#chatlist").height()

+        });

+    };

+

+    //最后一条短消息距离顶部的距离

+    var lastItemOffsetTop = 0;

+    //页面是否处于滚动中

+    var scrolling = false;

+    //初始化页面状态信息

+    function initStatus() {

+        currentPage = 1;

+        ready = false;

+        shownMsgs = [];

+        scrolling = false;

+        lastItemOffsetTop = 0;

+        groupDrafts = groupDraftItems = [];

+        groupedDraftsObject = {};

+		config.dbMsgs = [];

+        config.listMsgs = null;

+        config.smsMaxId = 0;

+        config.phonebook = [];

+    }

+

+    function getReadyStatus() {

+        showLoading('waiting');

+        config.currentChatObject = null;

+        var getSMSReady = function () {

+            service.getSMSReady({}, function (data) {

+                if (data.sms_cmd_status_result == "2") {

+                    $("input:button", "#smsListForm .smslist-btns").attr("disabled", "disabled");

+                    hideLoading();

+                    showAlert("sms_init_fail");

+                } else if (data.sms_cmd_status_result == "1") {

+                    addTimeout(getSMSReady, 1000);

+                } else {

+                    if (config.HAS_PHONEBOOK) {

+                        getPhoneBookReady();

+                    } else {

+                        initSMSList(false);

+                    }

+                }

+            });

+        };

+

+        var getPhoneBookReady = function () {

+            service.getPhoneBookReady({}, function (data) {

+                if (data.pbm_init_flag == "6") {

+                    initSMSList(false);

+                } else if (data.pbm_init_flag != "0") {

+                    addTimeout(getPhoneBookReady, 1000);

+                } else {

+                    initSMSList(true);

+                }

+            });

+        };

+

+        var initSMSList = function (isPbmInitOK) {

+            initStatus();

+            if (isPbmInitOK) {

+                getSMSMessages(function () {

+                    getPhoneBooks();

+                    hideLoading();

+                });

+            } else {

+                getSMSMessages(function () {

+                    config.phonebook = [];

+                    //if(config.HAS_PHONEBOOK){

+                    dealPhoneBooks();

+                    //}

+                    hideLoading();

+                });

+            }

+            bindingEvents();

+            fixScrollTop();

+            window.scrollTo(0, 0);

+            initSmsCapability();

+        };

+

+        getSMSReady();

+    }

+

+    //初始化短信容量状态

+    function initSmsCapability() {

+        var capabilityContainer = $("#smsCapability");

+        updateSmsCapabilityStatus(capabilityContainer);

+        checkSimStatusForSend();

+        addInterval(function () {

+            updateSmsCapabilityStatus(capabilityContainer);

+            checkSimStatusForSend();

+        }, 5000);

+    }

+

+    //SIM卡未准备好时,禁用发送按钮

+    function checkSimStatusForSend() {

+        var data = service.getStatusInfo();

+        if (data.simStatus != 'modem_init_complete') {

+            disableBtn($("#btn-send"));

+            $("#sendSmsErrorLi").html('<span data-trans="no_sim_card_message">' + $.i18n.prop('no_sim_card_message') + '</span>');

+            $("#chatpanel .smslist-item-resend:visible").hide();

+        } else {

+            enableBtn($("#btn-send"));

+            $("#chatpanel .smslist-item-resend:hidden").show();

+        }

+    }

+

+    //更新短信容量状态

+    function updateSmsCapabilityStatus(capabilityContainer, callback) {

+        service.getSmsCapability({}, function (capability) {

+            if (capabilityContainer != null) {

+                capabilityContainer.text("(" + (capability.nvUsed > capability.nvTotal ? capability.nvTotal : capability.nvUsed) + "/" + capability.nvTotal + ")");

+            }

+            hasCapability = capability.nvUsed < capability.nvTotal;

+            smsCapability = capability;

+            if ($.isFunction(callback)) {

+                callback();

+            }

+        });

+    }

+

+    //初始化页面及VM

+    function init() {

+        getReadyStatus();

+    }

+

+    //事件绑定

+    bindingEvents = function () {

+        var $win = $(window);

+        var $smsListBtns = $("#smslist-main .smslist-btns");

+        var offsetTop = $("#mainContainer").offset().top;

+        $win.unbind("scroll").scroll(function () {

+            if ($win.scrollTop() > offsetTop) {

+                $smsListBtns.addClass("smsListFloatButs marginnone");

+            } else {

+                $smsListBtns.removeClass("smsListFloatButs marginnone");

+            }

+            //loadData(); //由于目前数据显示是全显示,不做动态加载,因此暂时注释掉

+        });

+

+        $("#smslist-table p.checkbox").die().live("click", function () {

+            checkboxClickHandler($(this).attr("id"));

+        });

+

+        $("#smslist-checkAll", "#smsListForm").die().live("click", function () {

+            checkDeleteBtnStatus();

+        });

+

+        $("#chat-input", "#smsChatRoom").die().live("drop", function () {

+            $("#inputpanel .chatform").addClass("chatformfocus");

+            var $this = $(this);

+            $this.removeAttr("data-trans");

+            if ($this.val() == $.i18n.prop("chat_input_placehoder")) {

+                $this.val("");

+            }

+            updateChatInputWordLength();

+        }).live("focusin", function () {

+            $("#inputpanel .chatform").addClass("chatformfocus");

+            var $this = $(this);

+            $this.removeAttr("data-trans");

+            if ($this.val() == $.i18n.prop("chat_input_placehoder")) {

+                $this.val("");

+            }

+            updateChatInputWordLength();

+        }).live("focusout", function () {

+            $("#inputpanel .chatform").removeClass("chatformfocus");

+            var $this = $(this);

+            if ($this.val() == "" || $this.val() == $.i18n.prop("chat_input_placehoder")) {

+                $this.val($.i18n.prop("chat_input_placehoder")).attr("data-trans", "chat_input_placehoder");

+            }

+            updateChatInputWordLength();

+        }).live("keyup", function () {

+            updateChatInputWordLength();

+        }).live("paste", function () {

+            window.setTimeout(function () {

+                updateChatInputWordLength();

+            }, 0);

+        }).live("cut", function () {

+            window.setTimeout(function () {

+                updateChatInputWordLength();

+            }, 0);

+        }).live("drop", function () {

+            window.setTimeout(function () {

+                updateChatInputWordLength();

+            }, 0);

+        }).live("contextmenu", function () {

+            return false;

+        });

+

+        $("#name").die().live("drop", function () {

+            updateNameInputWordLength();

+        }).live("focusin", function () {

+            updateNameInputWordLength();

+        }).live("focusout", function () {

+            updateNameInputWordLength();

+        }).live("keyup", function () {

+            updateNameInputWordLength();

+        }).live("paste", function () {

+            updateNameInputWordLength();

+        }).live("cut", function () {

+            updateNameInputWordLength();

+        }).live("dragend", function () {

+            updateNameInputWordLength();

+        }).live("contextmenu", function () {

+            return false;

+        });

+

+        $("select.chosen-select-deselect", "#smsChatRoom").die().live('change', function () {

+            draftListener();

+        });

+        $("#searchInput").die().live('blur', function () {

+            searchTextBlur();

+        }).live('keyup', function () {

+            updateSearchValue($("#searchInput").val());

+        });

+    };

+

+    //更新剩余字数

+    updateNameInputWordLength = function () {

+

+        var msgInput = $("#name", "#quickSaveContactForm");

+        var msgInputDom = msgInput[0];

+        var strValue = msgInput.val();

+        var encodeType = getEncodeType(strValue);

+        var maxLength = encodeType.encodeType == 'UNICODE' ? 11 : 22;

+        while (strValue.length + encodeType.extendLen > maxLength) {

+            strValue = strValue.substring(0, strValue.length - 1);

+            msgInputDom.value = strValue;

+            encodeType = getEncodeType(strValue);

+            maxLength = encodeType.encodeType == 'UNICODE' ? 11 : 22;

+        }

+    };

+

+//获取聊天对象的名字

+    getNameByNumber = function (num) {

+        for (var i = config.phonebook.length; i > 0; i--) {

+            if (getLastNumber(config.phonebook[i - 1].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(num, config.SMS_MATCH_LENGTH)) {

+                return config.phonebook[i - 1].pbm_name;

+            }

+        }

+        return "";

+    };

+    //获取聊天对象的名字和号码

+    getShowNameByNumber = function (num) {

+        for (var i = config.phonebook.length; i > 0; i--) {

+            if (getLastNumber(config.phonebook[i - 1].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(num, config.SMS_MATCH_LENGTH)) {

+                return config.phonebook[i - 1].pbm_name /* + "/" + num*/;

+            }

+        }

+        return num;

+    };

+

+    //获取聊天对象的名字,如果没有名字,则显示号码

+    getNameOrNumberByNumber = function (num) {

+        for (var i = config.phonebook.length; i > 0; i--) {

+            if (config.phonebook[i - 1].pbm_number == num) {

+                return config.phonebook[i - 1].pbm_name;

+            }

+        }

+        for (var i = config.phonebook.length; i > 0; i--) {

+            if (getLastNumber(config.phonebook[i - 1].pbm_number, config.SMS_MATCH_LENGTH) == getLastNumber(num, config.SMS_MATCH_LENGTH)) {

+                return config.phonebook[i - 1].pbm_name;

+            }

+        }

+        return num;

+    };

+

+    //点击短信列表条目,进入聊天室页面

+    smsItemClickHandler = function (num) {

+        if (chatRoomInLoading) {

+            return false;

+        }

+        chatRoomInLoading = true;

+        if (smsOtherTmpl == null) {

+            smsOtherTmpl = $.template("smsOtherTmpl", $("#smsOtherTmpl"));

+        }

+        if (smsMeTmpl == null) {

+            smsMeTmpl = $.template("smsMeTmpl", $("#smsMeTmpl"));

+        }

+

+        var name = getShowNameByNumber(num);

+        $("#chosenUser", "#smsChatRoom").hide();

+        $("#chosenUser1", "#smsChatRoom").addClass("hide");

+

+        config.currentChatObject = getLastNumber(num, config.SMS_MATCH_LENGTH);

+        setAsRead(num);

+        cleanChatInput();

+        clearChatList();

+        var userSelect = $("select.chosen-select-deselect", "#smsChatRoom");

+        var ops = $("option", userSelect);

+        var numberExist = false;

+        for (var i = 0; i < ops.length; i++) {

+            var n = ops[i];

+            if (getLastNumber(n.value, config.SMS_MATCH_LENGTH) == config.currentChatObject) {

+                num = n.value;

+                numberExist = true;

+                break;

+            }

+        }

+        if (!numberExist) {

+            userSelect.append("<option value='" + HTMLEncode(num) + "' selected='selected'>" + HTMLEncode(num) + "</option>");

+        }

+        $("select.chosen-select-deselect").val(num).trigger("chosen:updated.chosen");

+        switchPage('chat');

+        config.dbMsgs = _.sortBy(config.dbMsgs, function (e) {

+            return 0 - e.id;

+        });

+        var draftIds = [];

+        var dbMsgsTmp = [];

+        var dbMsgsTmpIds = [];

+        var chatHasDraft = false;

+        for (var i = config.dbMsgs.length - 1; i >= 0; i--) {

+            var e = config.dbMsgs[i];

+            if (_.indexOf(dbMsgsTmpIds, e.id) != -1) {

+                continue;

+            }

+            if (getLastNumber(e.number, config.SMS_MATCH_LENGTH) == config.currentChatObject && _.isEmpty(e.groupId)) {

+                e.isNew = false;

+                e.errorText = '';

+                e.targetName = '';

+                if (e.tag == "0" || e.tag == "1") {

+                    $.tmpl("smsOtherTmpl", e).appendTo("#chatlist");

+                    dbMsgsTmpIds.push(e.id);

+                    dbMsgsTmp.push(e);

+                } else if (e.tag == "2" || e.tag == "3") {

+                    $.tmpl("smsMeTmpl", e).appendTo("#chatlist");

+                    dbMsgsTmpIds.push(e.id);

+                    dbMsgsTmp.push(e);

+                } else if (e.tag == "4") {

+                    draftIds.push(e.id);

+                    $("#chat-input", "#smsChatRoom").val(e.content).removeAttr('data-trans');

+                    updateChatInputWordLength();

+                    chatHasDraft = true;

+                }

+            } else {

+                dbMsgsTmpIds.push(e.id);

+                dbMsgsTmp.push(e);

+            }

+        }

+        $("#chatlist").translate();

+        if (chatHasDraft) {

+            $("#chosenUser", "#smsChatRoom").show();

+            $("#chosenUser1", "#smsChatRoom").addClass("hide");

+        } else {

+            $("#chosenUser", "#smsChatRoom").hide();

+            $("#chosenUser1", "#smsChatRoom").removeClass("hide").html(HTMLEncode(name));

+        }

+        config.dbMsgs = dbMsgsTmp.reverse();

+        if (draftIds.length > 0) {

+            deleteDraftSms(draftIds, [num]);

+        } else {

+            checkSmsCapacityAndAlert();

+        }

+

+        checkSimStatusForSend();

+        gotoBottom();

+        chatRoomInLoading = false;

+    };

+

+    function checkSmsCapacityAndAlert() {

+        var capabilityContainer = $("#smsCapability");

+        updateSmsCapabilityStatus(capabilityContainer);

+        addTimeout(function () {

+            if (!hasCapability) {

+                showAlert("sms_capacity_is_full_for_send");

+            }

+        }, 2000);

+    }

+

+    cleanChatInput = function () {

+        $("#chat-input", "#smsChatRoom").val($.i18n.prop("chat_input_placehoder")).attr("data-trans", "chat_input_placehoder");

+    };

+

+    //设置为已读

+    setAsRead = function (num) {

+        var ids = [];

+        $.each(config.dbMsgs, function (i, e) {

+            if (getLastNumber(e.number, config.SMS_MATCH_LENGTH) == getLastNumber(num, config.SMS_MATCH_LENGTH) && e.isNew) {

+                ids.push(e.id);

+                e.isNew = false;

+            }

+        });

+        if (ids.length > 0) {

+            service.setSmsRead({

+                ids: ids

+            }, function (data) {

+                if (data.result) {

+                    $("#smslist-item-" + getLastNumber(num, config.SMS_MATCH_LENGTH) + " .smslist-item-new-count").text("").addClass("hide");

+                    $("#smslist-item-" + getLastNumber(num, config.SMS_MATCH_LENGTH)).removeClass("font-weight-bold");

+                    $("#smslist-item-" + getLastNumber(num, config.SMS_MATCH_LENGTH) + " td:nth-child(2)").removeClass("font-weight-bold");

+                }

+                $.each(config.listMsgs, function (i, e) {

+                    if (e.number == num && e.newCount > 0) {

+                        e.newCount = 0;

+                    }

+                });

+            });

+        }

+    };

+

+    //转发按钮点击事件

+    forwardClickHandler = function (id) {

+        var selectedContact = syncSelectAndChosen($("select#chosenUserSelect"), $('.search-choice', '#chosenUserSelect_chosen'));

+        var content = $("#chat-input", "#smsChatRoom").val();

+        var hasContent = typeof content != "undefined" && content != '' && content != $.i18n.prop('chat_input_placehoder');

+        if (hasContent) {

+            saveDraftAction({

+                content: content,

+                numbers: selectedContact,

+                isFromBack: true,

+                noLoading: true

+            });

+        }

+

+        clearChatList();

+        config.currentChatObject = null;

+

+        $("#chosenUser1", "#smsChatRoom").addClass("hide");

+        $("#chosenUser", "#smsChatRoom").show();

+        for (var j = 0; j < config.dbMsgs.length; j++) {

+            if (config.dbMsgs[j].id == id) {

+                var theChatInput = $("#chat-input", "#smsChatRoom");

+                theChatInput.val(config.dbMsgs[j].content);

+                setInsertPos(theChatInput[0], config.dbMsgs[j].content.length);

+            }

+        }

+        updateChatInputWordLength();

+        $("select.chosen-select-deselect").val("").trigger("chosen:updated.chosen");

+        addTimeout(function () {

+            $("#chosen-search-field-input").focus();

+        }, 300);

+        switchPage('chat');

+        gotoBottom();

+    };

+

+    //更新剩余字数

+    updateChatInputWordLength = function () {

+        var msgInput = $("#chat-input", "#smsChatRoom");

+        var msgInputDom = msgInput[0];

+        var strValue = msgInput.val();

+        var encodeType = getEncodeType(strValue);

+        var maxLength = encodeType.encodeType == 'UNICODE' ? 335 : 765;

+        if (strValue.length + encodeType.extendLen > maxLength) {

+            var scrollTop = msgInputDom.scrollTop;

+            var insertPos = getInsertPos(msgInputDom);

+            var moreLen = strValue.length + encodeType.extendLen - maxLength;

+            var insertPart = strValue.substr(insertPos - moreLen > 0 ? insertPos - moreLen : 0, moreLen);

+            var reversed = insertPart.split('').reverse();

+            var checkMore = 0;

+            var cutNum = 0;

+            for (var i = 0; i < reversed.length; i++) {

+                if (getEncodeType(reversed[i]).extendLen > 0) {

+                    checkMore += 2;

+                } else {

+                    checkMore++;

+                }

+                if (checkMore >= moreLen) {

+                    cutNum = i + 1;

+                    break;

+                }

+            }

+            var iInsertToStartLength = insertPos - cutNum;

+            msgInputDom.value = strValue.substr(0, iInsertToStartLength) + strValue.substr(insertPos);

+            if (msgInputDom.value.length > maxLength) {

+                msgInputDom.value = msgInputDom.value.substr(0, maxLength);

+            }

+            setInsertPos(msgInputDom, iInsertToStartLength);

+            msgInputDom.scrollTop = scrollTop;

+        }

+        var textLength = 0;

+        var newValue = $(msgInputDom).val();

+        var newEncodeType = {

+            encodeType: 'GSM7_default',

+            extendLen: 0

+        };

+        if (newValue != $.i18n.prop('chat_input_placehoder')) {

+            newEncodeType = getEncodeType(newValue);

+        }

+        var newMaxLength = newEncodeType.encodeType == 'UNICODE' ? 335 : 765;

+        var $inputCount = $("#inputcount", "#inputpanel");

+        var $inputItemCount = $("#inputItemCount", "#inputpanel");

+        if (newValue.length + newEncodeType.extendLen >= newMaxLength) {

+            $inputCount.addClass("colorRed");

+            $inputItemCount.addClass("colorRed");

+        } else {

+            $("#inputcount", "#inputpanel").removeClass("colorRed");

+            $("#inputItemCount", "#inputpanel").removeClass("colorRed");

+        }

+        if ("" != newValue && $.i18n.prop('chat_input_placehoder') != newValue) {

+            textLength = newValue.length + newEncodeType.extendLen;

+        }

+        $inputCount.html("(" + textLength + "/" + newMaxLength + ")");

+        $inputItemCount.html("(" + getSmsCount(newValue) + "/5)");

+        draftListener();

+    };

+

+    //文档内容监听,判断是否修改过

+    function draftListener() {

+        var content = $("#chat-input", "#smsChatRoom").val();

+        if (hasCapability) {

+            var selectedContact = getSelectValFromChosen($('.search-choice', '#chosenUserSelect_chosen'));

+            var noContactSelected = !selectedContact || selectedContact.length == 0;

+            var hasContent = typeof content != "undefined" && content != '' && content != $.i18n.prop('chat_input_placehoder');

+

+            if (!hasContent) {

+                config.resetContentModifyValue();

+                return;

+            }

+            if (hasContent && !noContactSelected) {

+                config.CONTENT_MODIFIED.modified = true;

+                config.CONTENT_MODIFIED.message = 'sms_to_save_draft';

+                config.CONTENT_MODIFIED.callback.ok = saveDraftAction;

+                config.CONTENT_MODIFIED.callback.no = $.noop;

+                config.CONTENT_MODIFIED.data = {

+                    content: $("#chat-input", "#smsChatRoom").val(),

+                    numbers: selectedContact

+                };

+                return;

+            }

+            if (hasContent && noContactSelected) {

+                config.CONTENT_MODIFIED.modified = true;

+                config.CONTENT_MODIFIED.message = 'sms_no_recipient';

+                config.CONTENT_MODIFIED.callback.ok = $.noop;

+                config.CONTENT_MODIFIED.callback.no = function () {

+                    // 返回true,页面保持原状

+                    return true;

+                }; //$.noop;

+                return;

+            }

+        } else {

+            config.resetContentModifyValue();

+        }

+    }

+

+    //保存草稿回调动作

+    function saveDraftAction(data) {

+        var datetime = new Date();

+        var params = {

+            index: -1,

+            currentTimeString: getCurrentTimeString(datetime),

+            groupId: data.numbers.length > 1 ? datetime.getTime() : '',

+            message: data.content,

+            numbers: data.numbers

+        };

+        !data.noLoading && showLoading('waiting');

+        service.saveSMS(params, function () {

+            if (data.isFromBack) {

+                getLatestDraftSms(data.numbers);

+                !data.noLoading && successOverlay('sms_save_draft_success');

+                window.location.reload();

+            } else {

+                !data.noLoading && successOverlay('sms_save_draft_success');

+                window.location.reload();

+            }

+        }, function () {

+            !data.noLoading && errorOverlay("sms_save_draft_failed")

+        });

+

+        //获取最新的草稿信息

+        function getLatestDraftSms(numbers) {

+            service.getSMSMessages({

+                page: 0,

+                smsCount: 5,

+                nMessageStoreType: 1,

+                tags: 4,

+                orderBy: "order by id desc"

+            }, function (data) {

+                if (data.messages && data.messages.length > 0) {

+                    var theGroupId = '',

+                    draftShowName = '',

+                    draftShowNameTitle = '',

+                    i = 0,

+                    drafts = [];

+                    for (; i < data.messages.length; i++) {

+                        var msg = data.messages[i];

+                        for (var k = 0; k < numbers.length; k++) {

+                            var num = numbers[k];

+                            if (getLastNumber(num, config.SMS_MATCH_LENGTH) == getLastNumber(msg.number, config.SMS_MATCH_LENGTH)) { //if (num.indexOf(msg.number) == 0) {

+                                msg.number = num;

+                            }

+                        }

+                        if (theGroupId != '' && theGroupId != msg.groupId) {

+                            break;

+                        }

+                        updateDBMsg(msg);

+                        if (msg.groupId == '') { // 单条草稿

+                            break;

+                        } else { // 多条草稿

+                            theGroupId = msg.groupId;

+                            var showName = getShowNameByNumber(msg.number);

+                            draftShowName += (i == 0 ? '' : ';') + showName;

+                            draftShowNameTitle += (i == 0 ? '' : ';') + showName;

+                        }

+                        drafts.push(msg);

+                    }

+                    if (theGroupId == '') { // 单条草稿

+                        var msg = data.messages[0];

+                        msg.hasDraft = true;

+                        updateMsgList(msg);

+                    } else { // 多条草稿

+                        var msg = data.messages[0];

+                        var len = 10;

+                        if (getEncodeType(draftShowName).encodeType == "UNICODE") {

+                            len = 10;

+                        }

+                        msg.draftShowNameTitle = draftShowNameTitle;

+                        msg.draftShowName = draftShowName.length > len ? draftShowName.substring(0, len) + "..." : draftShowName;

+                        msg.hasDraft = true;

+                        msg.totalCount = i;

+                        groupedDraftsObject[theGroupId] = drafts;

+                        updateMsgList(msg);

+                    }

+                    tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+                }

+            }, function () {

+                // do nothing

+            });

+        }

+    }

+

+    //点击群聊草稿进入草稿发送页面 在进入的过程中会先删掉草稿

+    draftSmsItemClickHandler = function (groupId) {

+        if (chatRoomInLoading) {

+            return false;

+        }

+        chatRoomInLoading = true;

+        var msgs = groupedDraftsObject[groupId];

+        var numbers = [];

+        var ids = [];

+        for (var i = 0; msgs && i < msgs.length; i++) {

+            numbers.push(getLastNumber(msgs[i].number, config.SMS_MATCH_LENGTH));

+            ids.push(msgs[i].id + '');

+        }

+        $("#chosenUser", "#smsChatRoom").show();

+        $("#chosenUser1", "#smsChatRoom").addClass("hide").html('');

+        $("select.chosen-select-deselect").val(numbers).trigger("chosen:updated.chosen");

+        $("#chat-input", "#smsChatRoom").val(msgs[0].content);

+        updateChatInputWordLength();

+        clearChatList();

+        switchPage('chat');

+        draftListener();

+        gotoBottom();

+        chatRoomInLoading = false;

+        deleteMultiDraftSms(ids, groupId);

+    };

+

+    //按列表条目删除短消息

+    deletePhoneMessageClickHandler = function (num) {

+        showConfirm("confirm_sms_delete", function () {

+            showLoading('deleting');

+            var ids = [];

+            $.each(config.dbMsgs, function (i, e) {

+                if (e.number == num) {

+                    ids.push(e.id);

+                }

+            });

+            service.deleteMessage({

+                ids: ids

+            }, function (data) {

+                $("#smslist-item-" + getLastNumber(num, config.SMS_MATCH_LENGTH)).hide().remove();

+                synchSmsList([num], ids);

+                successOverlay();

+                tryToDisableCheckAll($("#smslist-checkAll", "#smsListForm"), $(".smslist-item", "#smslist-table").length);

+            }, function (error) {

+                errorOverlay(error.errorText);

+            });

+        });

+    };

+

+    //同步短信列表数据

+    synchSmsList = function (nums, ids) {

+        if (nums && nums.length > 0) {

+            config.listMsgs = $.grep(config.listMsgs, function (n, i) {

+                return $.inArray(n.number, nums) == -1;

+            });

+        }

+        if (ids && ids.length > 0) {

+            var dbMsgsTmp = [];

+            $.each(config.dbMsgs, function (i, e) {

+                if ($.inArray(e.id, ids) == -1) {

+                    dbMsgsTmp.push(e);

+                }

+            });

+            config.dbMsgs = dbMsgsTmp;

+        }

+    };

+

+    //确定最后一条短消息距离顶部的距离

+    function fixScrollTop() {

+        var items = $(".smslist-item");

+        var lastOne;

+        if (items.length > 0) {

+            lastOne = items[items.length - 1];

+        } else {

+            lastOne = items[0];

+        }

+        lastItemOffsetTop = lastOne ? lastOne.offsetTop : 600;

+    }

+

+    function loadData() {

+        if (ready && !scrolling && lastItemOffsetTop < ($(window).scrollTop() + $(window).height())

+             && $(".smslist-item").length != config.listMsgs.length) {

+            scrolling = true;

+            addTimeout(function () {

+                removeChecked("smslist-checkAll");

+                changeShownMsgs();

+                fixScrollTop();

+                scrolling = false;

+            }, 100);

+        }

+    }

+

+    function stopNavigation() {

+        disableBtn($('#btn-back'));

+        $('a', '#left').bind("click", function () {

+            return false;

+        });

+        $('a', '#list-nav').bind("click", function () {

+            return false;

+        });

+    }

+

+    function restoreNavigation() {

+        enableBtn($('#btn-back'));

+        $('a', '#left').unbind("click");

+        $('a', '#list-nav').unbind("click");

+    }

+

+    function searchTable(key) {

+        key = $.trim(key);

+        var $trs = $('tr', '#smslist-table'),

+        trLength = $trs.length;

+        if (key == '') {

+            $trs.show();

+            return false;

+        }

+        $trs.hide();

+        while (trLength) {

+            var $tr = $($trs[trLength - 1]),

+            $tds = $('td', $tr),

+            tdLength = $tds.length;

+            while (tdLength - 1) {

+                var $td = $($tds[tdLength - 1]);

+                if ($td.text().toLowerCase().indexOf(key.toLowerCase()) != -1) {

+                    $tr.show();

+                    break;

+                }

+                tdLength--;

+            }

+            trLength--;

+        }

+

+        addTimeout(function () {

+            $(":checkbox:checked", "#addPhonebookContainer").removeAttr('checked');

+            vm.selectedItemIds([]);

+            vm.freshStatus($.now());

+            renderCheckbox();

+        }, 300);

+        return true;

+    }

+	updateSearchValue = function (key) {

+        if (key == "" || key == $.i18n.prop("search")) {

+            return true;

+        }

+        searchTable(key);

+    };

+	//清除搜索关键字事件

+    clearSearchKey = function () {

+        updateSearchValue($.i18n.prop("search"));

+        $("#searchInput").addClass("ko-grid-search-txt-default").attr("data-trans", "search");

+    };

+    //点击搜索输入框事件

+    searchTextClick = function () {

+        var searchText = $("#searchInput");

+        if (searchText.hasClass("ko-grid-search-txt-default")) {

+            updateSearchValue("");

+            searchText.val("");

+            searchText.removeClass("ko-grid-search-txt-default").removeAttr("data-trans");

+        }

+    };

+    //离开搜索输入框事件

+    searchTextBlur = function () {

+        var txt = $.trim($("#searchInput").val()).toLowerCase();

+        if (txt == "") {

+            clearSearchKey();

+        }

+    };

+

+    window.smsUtil = {

+        changeLocationHandler: function (ele) {

+            if ($(ele).val() == 'sim') {

+                window.location.hash = '#msg_sim';

+            } else {

+                window.location.hash = '#msg_main';

+            }

+        }

+    };

+

+    return {

+        init: init

+    };

+});

+

+define("sms_set","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var validityModes = _.map(config.SMS_VALIDITY, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    function SmsSetViewMode() {

+        var target = this;

+        var setting = getSmsSetting();

+        target.modes = ko.observableArray(validityModes);

+        target.selectedMode = ko.observable(setting.validity);

+        target.centerNumber = ko.observable(setting.centerNumber);

+        target.deliveryReport = ko.observable(setting.deliveryReport);

+

+        target.clear = function () {

+            init();

+            clearValidateMsg();

+        };

+

+        target.save = function () {

+            showLoading('waiting');

+            var params = {};

+            params.validity = target.selectedMode();

+            params.centerNumber = target.centerNumber();

+            params.deliveryReport = target.deliveryReport();

+            service.setSmsSetting(params, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+    }

+

+    //获取短信设置参数

+

+    function getSmsSetting() {

+        return service.getSmsSetting();

+    }

+

+    function init() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new SmsSetViewMode();

+        ko.applyBindings(vm, container[0]);

+        $('#smsSettingForm').validate({

+            submitHandler: function () {

+                vm.save();

+            },

+            rules: {

+                txtCenterNumber: "sms_service_center_check"

+            }

+        });

+    }

+

+    return {

+        init: init

+    };

+});

+

+define("sms_sim_messages","jquery knockout set service".split(" "),

+    function ($, ko, config, service) {

+    var simMsgListTmpl = null;

+    //每页记录条数

+    var perPage = 200;

+

+    //获取短信分页记录

+    function getSMSMessages() {

+        return service.getSMSMessages({

+            page: 0,

+            smsCount: perPage,

+            nMessageStoreType: 0,

+            tags: 10,

+            orderBy: "order by id desc"

+        }, function (data) {

+            tryToDisableCheckAll($("#simMsgList-checkAll"), data.messages.length);

+            dealPhoneBooks(data.messages);

+        }, function (data) {

+            dealPhoneBooks([]);

+        });

+    }

+

+    //短信显示联系人名字,并将结果显示在UI

+    function dealPhoneBooks(messages) {

+        $.each(messages, function (j, n) {

+            n.itemId = getLastNumber(n.number, config.SMS_MATCH_LENGTH);

+            for (var i = 0; i < config.phonebook.length; i++) {

+                var person = config.phonebook[i];

+                if (n.itemId == getLastNumber(person.pbm_number, config.SMS_MATCH_LENGTH)) {

+                    n.name = person.pbm_name;

+                    break;

+                }

+            }

+        });

+        renderSimMessageList(messages);

+    }

+

+    //清楚短信列表内容

+    cleanSimSmsList = function () {

+        $("#simMsgList_container").empty();

+    };

+

+    //将短信显示结果显示在UI

+    function renderSimMessageList(messages) {

+        if (simMsgListTmpl == null) {

+            simMsgListTmpl = $.template("simMsgListTmpl", $("#simMsgListTmpl"));

+        }

+        cleanSimSmsList();

+        $("#simMsgList_container").html($.tmpl("simMsgListTmpl", {

+                data: messages

+            }));

+        hideLoading();

+    }

+

+    //初始化电话本信息

+    function initPhoneBooks(cb) {

+        service.getPhoneBooks({

+            page: 0,

+            data_per_page: 2000,

+            orderBy: "name",

+            isAsc: true

+        }, function (books) {

+            if ($.isArray(books.pbm_data) && books.pbm_data.length > 0) {

+                config.phonebook = books.pbm_data;

+            } else {

+                config.phonebook = [];

+            }

+            cb();

+        }, function () {

+            errorOverlay();

+        });

+    }

+

+    function simSmsViewMode() {

+        var self = this;

+        start();

+    }

+

+    //短信删除事件处理

+    deleteSelectedSimMsgClickHandler = function () {

+        var checkbox = $("input[name=msgId]:checked", "#simMsgList_container");

+        var msgIds = [];

+        for (var i = 0; i < checkbox.length; i++) {

+            msgIds.push($(checkbox[i]).val());

+        }

+        if (msgIds.length == 0) {

+            return false;

+        }

+        showConfirm("confirm_sms_delete", function () {

+            showLoading('deleting');

+            service.deleteMessage({

+                ids: msgIds

+            }, function (data) {

+                removeChecked("simMsgList-checkAll");

+                disableBtn($("#simMsgList-delete"));

+                var idsForDelete = "";

+                checkbox.each(function (i, n) {

+                    idsForDelete += ".simMsgList-item-class-" + $(n).val() + ",";

+                });

+                if (idsForDelete.length > 0) {

+                    $(idsForDelete.substring(0, idsForDelete.length - 1)).hide().remove();

+                }

+                tryToDisableCheckAll($("#simMsgList-checkAll"), $(".smslist-item", "#simMsgList_container").length);

+                successOverlay();

+            }, function (error) {

+                errorOverlay(error.errorText);

+            });

+            //删除短信后需要刷新列表

+            updateSimSmsCapabilityStatus($("#simSmsCapability"));

+        });

+    };

+    //将被checked的条目添加到self.checkedItem中,用于在滚动还原checkbox

+    function checkboxClickHandler() {

+        if (getSelectedItemSize() == 0) {

+            disableBtn($("#simMsgList-delete"));

+        } else {

+            enableBtn($("#simMsgList-delete"));

+        }

+    }

+

+    //获取已选择的条目

+    function getSelectedItemSize() {

+        return $("input:checkbox:checked", '#simMsgList_container').length;

+    }

+

+    //模块开始,检查电话本及短信状态并加装页码数据

+    function start() {

+        showLoading('waiting');

+        var getSMSReady = function () {

+            service.getSMSReady({}, function (data) {

+                if (data.sms_cmd_status_result == "2") {

+                    hideLoading();

+                    showAlert("sms_init_fail");

+                } else if (data.sms_cmd_status_result == "1") {

+                    addTimeout(function () {

+                        getSMSReady();

+                    }, 1000);

+                } else {

+                    if (!config.HAS_PHONEBOOK) {

+                        initSMSList(config.HAS_PHONEBOOK);

+                    } else {

+                        getPhoneBookReady();

+                    }

+                }

+            });

+        };

+

+        var getPhoneBookReady = function () {

+            service.getPhoneBookReady({}, function (data) {

+                if (data.pbm_init_flag == "6") {

+                    initSMSList(false);

+                } else if (data.pbm_init_flag != "0") {

+                    addTimeout(function () {

+                        getPhoneBookReady();

+                    }, 1000);

+                } else {

+                    initSMSList(config.HAS_PHONEBOOK);

+                }

+            });

+        };

+

+        var initSMSList = function (isPbmInitOK) {

+            if (isPbmInitOK) {

+                initPhoneBooks(function () {

+                    getSMSMessages();

+                });

+            } else {

+                config.phonebook = [];

+                getSMSMessages();

+            }

+        };

+        getSMSReady();

+        initSimSmsCapability();

+    }

+

+    //初始化短信容量状态

+    function initSimSmsCapability() {

+        var capabilityContainer = $("#simSmsCapability");

+        updateSimSmsCapabilityStatus(capabilityContainer);

+        addInterval(function () {

+            updateSimSmsCapabilityStatus(capabilityContainer);

+        }, 5000);

+    }

+

+    //更新短信容量状态

+    function updateSimSmsCapabilityStatus(capabilityContainer) {

+        service.getSmsCapability({}, function (capability) {

+            if (capabilityContainer != null) {

+                capabilityContainer.text("(" + capability.simUsed + "/" + capability.simTotal + ")");

+            }

+        });

+    }

+

+    //清除搜索关键字事件

+    clearSearchKey = function () {

+        updateSearchValue($.i18n.prop("search"));

+        $("#searchInput").addClass("ko-grid-search-txt-default").attr("data-trans", "search");

+    };

+    //点击搜索输入框事件

+    searchTextClick = function () {

+        var searchText = $("#searchInput");

+        if (searchText.hasClass("ko-grid-search-txt-default")) {

+            updateSearchValue("");

+            searchText.val("");

+            searchText.removeClass("ko-grid-search-txt-default").removeAttr("data-trans");

+        }

+    };

+    //离开搜索输入框事件

+    searchTextBlur = function () {

+        var txt = $.trim($("#searchInput").val()).toLowerCase();

+        if (txt == "") {

+            clearSearchKey();

+        }

+    };

+

+    updateSearchValue = function (key) {

+        if (key == "" || key == $.i18n.prop("search")) {

+            return true;

+        }

+        searchTable(key);

+    }

+

+    function searchTable(key) {

+        key = $.trim(key);

+        var $trs = $('tr', '#smslist-table'),

+        trLength = $trs.length;

+        if (key == '') {

+            $trs.show();

+            return false;

+        }

+        $trs.hide();

+        while (trLength) {

+            var $tr = $($trs[trLength - 1]),

+            $tds = $('td', $tr),

+            tdLength = $tds.length;

+            while (tdLength - 1) {

+                var $td = $($tds[tdLength - 1]);

+                if ($td.text().toLowerCase().indexOf(key.toLowerCase()) != -1) {

+                    $tr.show();

+                    break;

+                }

+                tdLength--;

+            }

+            trLength--;

+        }

+

+        addTimeout(function () {

+            $(":checkbox:checked", "#addPhonebookContainer").removeAttr('checked');

+            vm.selectedItemIds([]);

+            vm.freshStatus($.now());

+            renderCheckbox();

+        }, 300);

+        return true;

+    }

+

+    //点击短信列表条目

+    simsmsItemClickHandler = function (tag, id, num) {

+        if (tag == "1") {

+            var ids = [];

+            ids.push(id);

+            service.setSmsRead({

+                ids: ids

+            }, function (data) {

+                if (data.result) {

+                    $(".simMsgList-item-class-" + id, "#simMsgTableContainer").removeClass('font-weight-bold');

+                }

+            });

+        }

+    }

+

+    //页面事件绑定

+    function initEventBind() {

+        $(".smslist-item-msg", "#simMsgTableContainer").die().live("click", function () {

+            var $this = $(this).addClass('showFullHeight');

+            $('.smslist-item-msg.showFullHeight', '#simMsgTableContainer').not($this).removeClass('showFullHeight');

+        });

+        $("#simMsgList_container p.checkbox, #simMsgListForm #simMsgList-checkAll").die().live("click", function () {

+            checkboxClickHandler();

+        });

+        $("#searchInput").die().live('blur', function () {

+            searchTextBlur();

+        }).live('keyup', function () {

+            updateSearchValue($("#searchInput").val());

+        });

+    }

+

+    //模块初始化开始

+    function init() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new simSmsViewMode();

+        ko.applyBindings(vm, container[0]);

+        initEventBind();

+    }

+

+    window.smsUtil = {

+        changeLocationHandler: function (ele) {

+            if ($(ele).val() == 'sim') {

+                window.location.hash = '#msg_sim';

+            } else {

+                window.location.hash = '#msg_main';

+            }

+        }

+    };

+

+    return {

+        init: init

+    };

+});

diff --git a/lynq/MD310EU/ap/app/zte_webui/js/wifi.js b/lynq/MD310EU/ap/app/zte_webui/js/wifi.js
new file mode 100755
index 0000000..a5ef6b9
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/js/wifi.js
@@ -0,0 +1,3764 @@
+define("wifi_advance","underscore jquery knockout set service jqui".split(" "),

+    function (_, $, ko, config, service, jqui) {

+    var $sliderRange = null;

+    //当前是否WiFi连接

+    var viaWifi = false;

+

+    function paintRateOption(data) {

+        var opts = [];

+        for (var i = 0; i < data.length; i++) {

+            var rate = data[i].rate == 0 ? "Auto" : data[i].rate + " Mbps";

+            opts.push(new Option(rate, data[i].index));

+        }

+        return opts;

+    }

+

+    //wifi传输速率

+    var transpeed = [0, 1, 2, 5.5, 6, 6.5, 9, 11, 12, 13, 18, 19.5, 24, 26, 36, 39, 48, 52, 54, 58.5, 65];

+

+    function rateSort(a, b) {

+        return a.rate - b.rate;

+    }

+    //删除重复速率值

+    function unionRate(rateTable) {

+        var rates = [],

+        result = [];

+        for (var i = 0; i < rateTable.length; i++) {

+            for (var j = 0; j < rateTable[i].length; j++) {

+                if (ko.utils.arrayIndexOf(rates, rateTable[i][j]) == -1) {

+                    rates.push(rateTable[i][j]);

+                    result.push({

+                        index: rateTable[i][j],

+                        rate: transpeed[rateTable[i][j]]

+                    });

+                }

+            }

+        }

+        result.sort(rateSort);

+        return result;

+    }

+

+    //根据模式生成速率选项

+    function modeRateOption(wifimode) {

+        var wifimodeN = [0, 5, 9, 11, 13, 15, 17, 19, 20];

+        var wifimodeG = [0, 4, 6, 8, 10, 12, 14, 16, 18];

+        var wifimodeB = [0, 1, 2, 3, 7];

+        var rate = [];

+

+        switch (wifimode) {

+            //--wifimode

+        case '5':

+            rate.push(wifimodeN);

+            rate.push(wifimodeG);

+            rate.push(wifimodeB);

+            break;

+        case '4':

+            rate.push(wifimodeN);

+            rate.push(wifimodeG);

+            rate.push(wifimodeB);

+            break;

+        case '3':

+            rate.push(wifimodeG);

+            rate.push(wifimodeB);

+            break;

+        case '2':

+            rate.push(wifimodeN);

+            break;

+        case '1':

+            rate.push(wifimodeG);

+            break;

+        case '0':

+            rate.push(wifimodeB);

+            break;

+

+        default:

+            rate.push(wifimodeN);

+            break;

+        }

+        var union = unionRate(rate);

+        return paintRateOption(union);

+    }

+

+    function getCountryCode(country) {

+        var countryCodeArr = config.countryCode;

+        var type = '';

+        for (key in countryCodeArr) {

+            var codes = countryCodeArr[key];

+            if ($.inArray(country, codes) != -1) {

+                type = key;

+                break;

+            }

+        }

+        var typeCode = config.countryCodeType[type];

+        return typeCode ? typeCode : "0";

+    }

+

+    function channelOption(country) {

+        var showOption = [new Option('Auto', '0')];

+        var type = getCountryCode(country) + '';

+        switch (type) {

+            //--type

+        case '9':

+            generateChannelOption(showOption, 2307, 13);

+            break;

+        case '7':

+            generateChannelOption(showOption, 2307, 13);

+            generateChannelOption(showOption, 2407, 11);

+            generateChannelOption(showOption, 2462, 2);

+            break;

+        case '3':

+            generateChannelOption(showOption, 2407, 11);

+            generateChannelOption(showOption, 2462, 2);

+            break;

+            //--type

+        case '2':

+            generateChannelOption(showOption, 2307, 13);

+            generateChannelOption(showOption, 2407, 11);

+            break;

+        case '1':

+            generateChannelOption(showOption, 2407, 11);

+            break;

+        default:

+            generateChannelOption(showOption, 2407, 11);

+        }

+        return showOption;

+    }

+    function generateChannelOption(showOption, start, count) {

+        for (var i = 1; i <= count; i++) {

+            var txt = start + i * 5 + "MHz (Channel " + showOption.length + ")";

+            showOption.push(new Option(txt, showOption.length + "_" + (start + i * 5)));

+        }

+    }

+

+    function channelOption5g(country) {

+        for (key in config.countryCode_5g) {

+            var item = config.countryCode_5g[key];

+            if ($.inArray(country, item.codes) != -1) {

+                return generate5gChannelOption(item.channels);

+            }

+        }

+        return [new Option('Auto', '0')];

+    }

+    function generate5gChannelOption(channels) {

+        var showOption = [new Option('Auto', '0')];

+        for (var i = 0; i < channels.length; i++) {

+            var channel = channels[i];

+            var mhz = channel * 5 + 5000;

+            var txt = mhz + "MHz (Channel " + channel + ")";

+            showOption.push(new Option(txt, channel + "_" + (mhz)));

+        }

+        return showOption;

+    }

+

+    function getBandOptions() {

+        var showOption = [];

+        if (!config.WIFI_HAS_5G) {

+            showOption.push(new Option('2.4GHz', 'b'));

+        } else {

+            showOption.push(new Option('5GHz', 'a'));

+            showOption.push(new Option('2.4GHz', 'b'));

+        }

+        return showOption;

+    }

+

+    function getChannelBandwidthsOptions(isSupport40) {

+        var showOption = [];

+        if (isSupport40) {

+            showOption.push(new Option('20MHz', '0'));

+            showOption.push(new Option('20MHz/40MHz', '1'));

+        } else {

+            showOption.push(new Option('20MHz', '0'));

+        }

+        return showOption;

+    }

+

+    function countryCodeOption(is5G) {

+        var countries = is5G ? config.countries_5g : config.countries;

+        var showOption = [];

+        for (key in countries) {

+            showOption.push(new Option(countries[key], key));

+        }

+        showOption = _.sortBy(showOption, function (opt) {

+            return opt.text;

+        });

+        return showOption;

+    }

+

+    function getWifiAdvance() {

+        return service.getWifiAdvance();

+    }

+

+    function getWpsState() {

+        return service.getWpsInfo();

+    }

+

+    function getModeOption(wifiBand) {

+        var modes = wifiBand == 'a' ? config.NETWORK_MODES_BAND : config.NETWORK_MODES;

+        if (wifiBand == 'a') {

+            $("#mode").hide();

+            $("#modeFor5HZ").show();

+            $("#modeLabel").attr('for', 'modeFor5HZ');

+        } else if (modes.length == 1) {

+            $("#mode").hide();

+            $("#modeFor5HZ").hide();

+        } else {

+            $("#mode").show();

+            $("#modeFor5HZ").hide();

+        }

+        var modeOptions = [];

+        for (var i = 0; i < modes.length; i++) {

+            modeOptions.push(new Option(modes[i].name, modes[i].value));

+        }

+        return modeOptions;

+    }

+

+    function getSelectedRateV(rate, rates) {

+        for (var i = 0; i < rates.length; i++) {

+            var opt = rates[i];

+            if (opt.text == rate + " Mbps") {

+                return opt.value;

+            }

+        }

+        return '0';

+    }

+    //获取所选的信道对应的value值

+    function getSelectedChannelV(channel, channels) {

+        for (var i = 0; i < channels.length; i++) {

+            var opt = $(channels[i]);

+            if (opt.val().split("_")[0] == channel) {

+                return opt.val();

+            }

+        }

+        return '0';

+    }

+

+    function WifiAdvanceViewModel() {

+        // Data

+        var target = this;

+

+        var wifiInfo = service.getWifiAdvance();

+        target.origin_ap_station_enable = wifiInfo.ap_station_enable;

+        target.modes = ko.observableArray(getModeOption(wifiInfo.wifiBand));

+        target.bands = ko.observableArray(getBandOptions());

+

+        var countryOpts = countryCodeOption(wifiInfo.wifiBand == 'a');

+        target.countries = ko.observableArray(countryOpts);

+        target.channels = ko.observableArray(wifiInfo.wifiBand == 'a' ? channelOption5g(wifiInfo.countryCode) : channelOption(wifiInfo.countryCode));

+        target.rates = ko.observableArray(modeRateOption(wifiInfo.mode));

+

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+        target.hasWifiBand = ko.observable(config.WIFI_BAND_SUPPORT);

+        target.hasBandwidth = ko.observable(config.WIFI_BANDWIDTH_SUPPORT);

+

+        target.selectedMode = ko.observable(wifiInfo.mode);

+        target.selectedChannel = ko.observable(getSelectedChannelV(wifiInfo.channel, target.channels()));

+        target.selectedChannelBandwidth = ko.observable(wifiInfo.bandwidth); //5:a, 2.5:b

+        target.selectedCountry = ko.observable(wifiInfo.countryCode.toUpperCase());

+        target.selectedBand = ko.observable(wifiInfo.wifiBand); //5:a, 2.5:b

+        target.selectedRate = ko.observable(getSelectedRateV(wifiInfo.rate, target.rates()));

+

+        var baseInfo = service.getWifiBasic();

+        target.wifi_enable = ko.observable(baseInfo.wifi_enable);

+        if (config.HAS_MULTI_SSID && ((baseInfo.m_AuthMode == "OPEN" && baseInfo.m_encryptType == "WEP") || (baseInfo.m_AuthMode == "SHARED" && baseInfo.m_encryptType == "WEP") || baseInfo.m_encryptType == "TKIP")) {

+            target.isF = ko.observable(true);

+        } else if ((baseInfo.AuthMode == "OPEN" && baseInfo.encryptType == "WEP") || (baseInfo.AuthMode == "SHARED" && baseInfo.encryptType == "WEP") || baseInfo.encryptType == "TKIP") {

+            target.isF = ko.observable(true);

+        } else {

+            target.isF = ko.observable(false);

+        }

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (baseInfo.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+        target.multi_ssid_enable = ko.observable(baseInfo.multi_ssid_enable);

+        target.origin_multi_ssid_enable = baseInfo.multi_ssid_enable;

+        target.maxStationNumber = ko.observable(wifiInfo.MAX_Station_num);

+        target.selectedStation = ko.observable(wifiInfo.MAX_Access_num);

+        target.selectedStationM = ko.observable(wifiInfo.m_MAX_Access_num);

+

+        target.oneBandTrans = ko.observable(wifiInfo.wifiBand == 'a' ? '5G' : '2.4G');

+        target.oneModeTrans = ko.observable((wifiInfo.wifiBand == 'a' ? 'network_modes_band_select_' : 'network_mode_select_') + wifiInfo.mode);

+

+        target.channelBandwidths = ko.computed(function () {

+            if (config.WIFI_BANDWIDTH_SUPPORT_40MHZ) {

+                return getChannelBandwidthsOptions(true);

+            } else {

+                return getChannelBandwidthsOptions(false);

+            }

+        });

+

+        wifiInfo = $.extend(wifiInfo, target);

+

+        //Event Handler 频段切换时更新对应的国家/地区码、信道和网络模式选项

+        target.bandChangeHandler = function () {

+            if (target.selectedBand() == 'a') { //5g

+                //802.11a only   802.11n only   802.11a/n

+                target.modes(getModeOption(target.selectedBand()));

+                target.countries(countryCodeOption(true));

+            } else { // 2.4g

+                //802.11 n only   802.11 b/g/n

+                target.modes(getModeOption(target.selectedBand()));

+                target.countries(countryCodeOption(false));

+            }

+            target.selectedCountry('0');

+            target.channels(target.generateChannelOption());

+            target.selectedChannel('0');

+        };

+

+        target.countryChangeHandler = function (data, event) {

+            var opts = target.generateChannelOption();

+            target.channels(opts);

+            target.selectedChannel('0');

+        };

+

+        target.modeChangeHandler = function (data, event) {

+            var opts = modeRateOption(target.selectedMode());

+            target.rates(opts);

+            target.selectedRate('0');

+        };

+

+        target.generateChannelOption = function () {

+            if (target.selectedBand() == 'a') {

+                return channelOption5g(target.selectedCountry());

+            } else {

+                return channelOption(target.selectedCountry());

+            }

+        };

+

+        target.save = function () {

+            var status = getWpsState();

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return;

+            }

+            var selectedRateTxt = $("#rate option:selected").text();

+            var rateVal = null;

+            if (selectedRateTxt != $.i18n.prop('rate_0')) {

+                rateVal = $.trim(selectedRateTxt.replace('Mbps', ''));

+            } else {

+                rateVal = 0;

+            }

+            var wifiParam = {};

+            wifiParam.countryCode = target.selectedCountry();

+            wifiParam.mode = target.selectedMode();

+            var selectedChannel = target.selectedChannel();

+            wifiParam.channel = selectedChannel == '0' ? '0' : selectedChannel.split("_")[0];

+            wifiParam.rate = rateVal;

+            wifiParam.wifiBand = target.selectedBand();

+            if (config.WIFI_BANDWIDTH_SUPPORT) {

+                wifiParam.bandwidth = target.selectedChannelBandwidth();

+            }

+            wifiParam.station = target.selectedStation();

+            wifiParam.m_station = target.selectedStationM();

+            showConfirm('wifi_disconnect_confirm', function () {

+                showLoading('waiting');

+                service.setWifiAdvance(wifiParam, function (result) {

+                    if (result.result == "success") {

+                        if (viaWifi) {

+                            setTimeout(advanceReloadVarWifi, 15000);

+                        } else {

+                            addInterval(advanceReload, 1000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            });

+        };

+

+        target.checkSettings = function (ssid) {

+            var status = getWpsState();

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            if (config.HAS_MULTI_SSID && baseInfo.multi_ssid_enable == "1") {

+                if ((ssid == "ssid1" && parseInt(target.selectedStation()) + parseInt(baseInfo.m_MAX_Access_num) > baseInfo.MAX_Station_num)

+                     || (ssid == "ssid2" && parseInt(target.m_selectedStation()) + parseInt(baseInfo.MAX_Access_num) > baseInfo.MAX_Station_num)) {

+                    showAlert({

+                        msg: 'multi_ssid_max_access_number_alert',

+                        wifiParam: baseInfo.MAX_Station_num

+                    });

+                    return true;

+                }

+            }

+

+            return false;

+        };

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = function () {

+                showLoading('waiting');

+                var wifiParam = {};

+                wifiParam.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    wifiParam.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(wifiParam, function (result) {

+                    if (result.result == "success") {

+                        if (viaWifi) {

+                            setTimeout(hasApReloadVarWifi, 15000);

+                        } else {

+                            addInterval(hasApReload, 1000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            var baseInfo = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!baseInfo.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!baseInfo.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+

+            function hasApReloadVarWifi() {

+                successOverlay();

+                setTimeout(function () {

+                    window.location.reload();

+                }, 1000);

+                clearTimer();

+                clearValidateMsg();

+                service.refreshAPStationStatus();

+                initialize();

+            }

+            function hasApReload() {

+                var baseInfo = service.getWifiBasic();

+                if (baseInfo.wifi_enable == target.wifi_enable()) {

+                    successOverlay();

+                    clearTimer();

+                    clearValidateMsg();

+                    service.refreshAPStationStatus();

+                    initialize();

+                }

+            }

+

+        };

+

+    }

+

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    function advanceReloadVarWifi() {

+        successOverlay();

+        setTimeout(function () {

+            window.location.reload();

+        }, 1000);

+    }

+

+    function advanceReload() {

+        var baseInfo = service.getWifiBasic();

+        if (baseInfo.wifi_enable == "1") {

+            successOverlay();

+            clearTimer();

+            clearValidateMsg();

+            initialize();

+        }

+    }

+

+    function initialize() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new WifiAdvanceViewModel();

+        ko.applyBindings(vm, container[0]);

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+

+        if (config.WDS_SUPPORT) {

+            checkWifiStatusUseWDS();

+        } else if (config.AP_STATION_SUPPORT) {

+            checkWifiStatus();

+        }

+

+        $('#wifi_advance_form').validate({

+            submitHandler: function () {

+                vm.save();

+            }

+        });

+

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+    }

+

+    function checkWifiStatusUseWDS() {

+        var baseInfo = service.getWdsInfo();

+        if (baseInfo.currentMode == "0") {

+            $(':input', '#frmWifiSwitch,#wifi_advance_form').each(function () {

+                $(this).prop("disabled", false);

+            });

+        } else {

+            $(':input', '#frmWifiSwitch,#wifi_advance_form').each(function () {

+                $(this).prop("disabled", true);

+            });

+        }

+    }

+

+    function checkWifiStatus() {

+        var baseInfo = service.getAPStationBasic();

+        if (baseInfo.ap_station_enable != "1") {

+            $(':input', '#wifi_advance_form').each(function () {

+                $(this).prop("disabled", false);

+            });

+        } else {

+            $(':input', '#wifi_advance_form').each(function () {

+                $(this).prop("disabled", true);

+            });

+        }

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_ap_station","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+    var viaWifi = false;

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    function apStationViewMode() {

+        var target = this;

+        var ssid_ex = "";

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+

+        var securityModes = _.map(config.AUTH_MODES_ALL, function (item) {

+            return new Option(item.name, item.value);

+        });

+        //当前页面标识  list列表页 add添加页面  edit编辑页面

+        target.page = {

+            list: 1,

+            add: 2,

+            edit: 3

+        };

+        //WiFi热点列表列的配置项

+        var gridColumn = [{

+                columnType: "radio",

+                headerTextTrans: "option",

+                rowText: "profileName",

+                width: "10%"

+            }, {

+                headerTextTrans: "ssid_title",

+                rowText: "ssid",

+                width: "30%"

+            }, {

+                columnType: "image",

+                headerTextTrans: "signal",

+                rowText: "imgSignal",

+                width: "30%"

+            }, {

+                headerTextTrans: "security_mode",

+                rowText: "authMode_show",

+                width: "30%"

+            }

+        ];

+        //搜索到的WiFi热点列表列的配置项

+        var searchGridColumn = [{

+                columnType: "radio",

+                rowText: "index",

+                width: "10%"

+            }, {

+                headerTextTrans: "ssid_title",

+                rowText: "ssid",

+                width: "30%"

+            }, {

+                columnType: "image",

+                headerTextTrans: "signal",

+                rowText: "imgSignal",

+                width: "30%"

+            }, {

+                headerTextTrans: "security_mode",

+                rowText: "authMode_show",

+                width: "30%"

+            }

+        ];

+

+        target.pageState = ko.observable(target.page.list);

+

+        var info = service.getAPStationBasic();

+

+        target.origin_ap_station_enable = info.ap_station_enable;

+        target.ap_station_enable = ko.observable(info.ap_station_enable);

+        target.apList = ko.observable([]);

+        if (target.origin_ap_station_enable == "1") {

+            var apList = service.getHotspotList();

+            target.apList(fixHotspotList(apList.hotspotList));

+        }

+

+        target.apSearchList = ko.observable([]);

+

+        target.connectButtonStatus = ko.observable("disable");

+        target.hasSelectFromUser = ko.observable();

+        target.showPassword = ko.observable(false);

+

+        target.isCableMode = ko.observable();

+

+        var infoBasic = service.getWifiBasic();

+        target.wifi_enable = ko.observable(infoBasic.wifi_enable);

+

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (infoBasic.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+        target.multi_ssid_enable = ko.observable(infoBasic.multi_ssid_enable);

+

+        //密码显示事件

+        target.showPasswordHandler = function () {

+            $("#codeWPAKey").parent().find(".error").hide();

+            $("#pwdWepKey").parent().find(".error").hide();

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+

+        target.showWPAPasswordHandler = function () {

+            $("#codeWPAKey").parent().find(".error").hide();

+            $("#pwdWepKey").parent().find(".error").hide();

+            if ($("#showWPAPassword").is(":checked")) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+

+        //列表模板创建

+        target.apGrid = new ko.simpleGrid.viewModel({

+            idName: "profileName",

+            data: target.apList(),

+            tmplType: 'list',

+            pageSize: 100,

+            columns: gridColumn,

+            primaryColumn: "fromProvider",

+            radioClickHandler: function () {

+                computeButtonState();

+            }

+        });

+        //热点搜索结果列表模板创建

+        target.apSearchGrid = new ko.simpleGrid.viewModel({

+            data: target.apSearchList(),

+            idName: "index",

+            tmplType: 'list',

+            pageSize: 100,

+            columns: searchGridColumn,

+            radioClickHandler: function () {

+                var index = target.apSearchGrid.radioSelectValue();

+                var aplist = target.apSearchList();

+                for (var i = 0; i < aplist.length; i++) {

+                    var list_item = aplist[i];

+                    if (list_item.index == index) {

+                        target.profileName("");

+                        target.ssid(list_item.ssid);

+                        ssid_ex = list_item.ssid;

+                        target.signal(list_item.signal);

+                        target.authMode(list_item.authMode);

+                        target.password(list_item.password);

+                        target.mac(list_item.mac);

+                        if (list_item.authMode == "WPAPSKWPA2PSK" || list_item.authMode == "WPA2PSK" || list_item.authMode == "WPAPSK" || list_item.authMode == "WPA3Personal" || list_item.authMode == "WPA2WPA3") {

+                            target.encryptType_WPA(list_item.encryptType);

+                        } else {

+                            target.encryptType(list_item.encryptType);

+                        }

+                        target.keyID(list_item.keyID);

+                        renderCustomElement($("#cipherGroup"));

+                        break;

+                    }

+                }

+            }

+        });

+

+        //计算并设置当前连接和按钮的状态

+        target.computeConnectStatus = function () {

+            computeButtonState();

+

+            var networkStatus = target.connectStatus();

+            if (networkStatus == "ppp_connected") {

+                target.current_status_trans("ap_station_wan_connected");

+                target.current_status_text($.i18n.prop("ap_station_wan_connected"));

+                return;

+            }

+

+            var ssid = target.connectWifiSSID();

+            var wifiStatus = target.connectWifiStatus();

+            if (ssid && wifiStatus == "connect") {

+                target.current_status_trans("ap_station_wlan_connected");

+                target.current_status_text($.i18n.prop("ap_station_wlan_connected"));

+                return;

+            }

+

+            target.current_status_trans("ap_station_no_connection");

+            target.current_status_text($.i18n.prop("ap_station_no_connection"));

+        };

+        //计算并设置按钮的状态

+        function computeButtonState() {

+            var profileName = target.apGrid.radioSelectValue();

+            if (!profileName) {

+                target.hasSelectFromUser(false);

+                target.connectButtonStatus("disable");

+                return;

+            }

+

+            var status = "";

+            var fromProvider = "";

+            for (var i = 0; i < target.apList().length; i++) {

+                var list_item = target.apList()[i];

+                if (list_item.profileName == profileName) {

+                    status = list_item.connectStatus;

+                    fromProvider = list_item.fromProvider;

+                    break;

+                }

+            }

+

+            if (status == "1") {

+                target.connectButtonStatus("hide");

+                target.hasSelectFromUser(false);

+            } else {

+                target.connectButtonStatus("show");

+                target.hasSelectFromUser(fromProvider == "0");

+            }

+        }

+        var statusInfo = service.getStatusInfo();

+        target.networkType = ko.observable(statusInfo.networkType);

+        target.networkOperator = ko.observable(statusInfo.networkOperator);

+        target.connectStatus = ko.observable(statusInfo.connectStatus);

+        target.connectWifiStatus = ko.observable(statusInfo.connectWifiStatus);

+        target.connectWifiProfile = ko.observable(statusInfo.connectWifiProfile);

+        target.connectWifiSSID = ko.observable(statusInfo.connectWifiSSID);

+

+        target.current_status_trans = ko.observable("");

+        target.current_status_text = ko.observable("");

+        target.current_status = ko.computed(function () {

+            target.computeConnectStatus()

+        });

+

+        target.modes = securityModes;

+        target.profileName = ko.observable("");

+        target.ssid = ko.observable();

+        target.signal = ko.observable("0");

+        target.authMode = ko.observable();

+        target.password = ko.observable();

+        target.encryptType = ko.observable();

+        target.encryptType_WPA = ko.observable("TKIPCCMP");

+        target.keyID = ko.observable("0");

+        target.mac = ko.observable();

+

+        target.openAddPage = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            target.clear();

+            getSearchHotspot();

+        };

+

+        //打开基本设置页面

+        target.openListPage = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            target.clear();

+            target.pageState(target.page.list);

+            target.apGrid.data(target.apList());

+            v.computeConnectStatus();

+        };

+

+        target.addHotspot = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            if (target.pageState() == target.page.add && target.apList().length >= config.AP_STATION_LIST_LENGTH) {

+                showAlert({

+                    msg: "ap_station_exceed_list_max",

+                    params: config.AP_STATION_LIST_LENGTH

+                });

+                return;

+            }

+            showLoading('waiting');

+            var wifi_para = {};

+            var profileName = target.apGrid.radioSelectValue();

+            wifi_para.profileName = target.profileName();

+            wifi_para.ssid = target.ssid();

+            wifi_para.signal = target.signal();

+            wifi_para.authMode = target.authMode();

+            wifi_para.password = target.password();

+            if (wifi_para.authMode == "SHARED") {

+                wifi_para.encryptType = "WEP";

+            } else if (wifi_para.authMode == "WPAPSKWPA2PSK" || wifi_para.authMode == "WPA2PSK" || wifi_para.authMode == "WPAPSK" || wifi_para.authMode == "WPA3Personal" || wifi_para.authMode == "WPA2WPA3") {

+                wifi_para.encryptType = target.encryptType_WPA();

+            } else {

+                wifi_para.encryptType = target.encryptType();

+            }

+            wifi_para.keyID = target.keyID();

+            wifi_para.mac = (target.mac() == "" || target.ssid() != ssid_ex) ? "0F:00:00:00:00:00" : target.mac();

+            wifi_para.apList = target.apList();

+            service.saveHotspot(wifi_para, function (data) {

+                target.callback(data, true);

+            });

+        };

+

+        target.deleteHotspot = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            showConfirm("confirm_data_delete", function () {

+                var wifi_para = {};

+                wifi_para.profileName = target.apGrid.radioSelectValue();

+                wifi_para.apList = target.apList();

+                showLoading('waiting');

+                service.deleteHotspot(wifi_para, function (data) {

+                    target.callback(data, true);

+                });

+            });

+        };

+

+        target.openEditPage = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            var profileName = target.apGrid.radioSelectValue();

+            var aplist = target.apList();

+            for (var i = 0; i < aplist.length; i++) {

+                var list_item = aplist[i];

+                if (list_item.profileName == profileName) {

+                    target.profileName(profileName);

+                    target.ssid(list_item.ssid);

+                    target.signal(list_item.signal);

+                    target.authMode(list_item.authMode);

+                    target.password(list_item.password);

+                    target.mac(list_item.mac);

+                    if (list_item.authMode == "WPAPSKWPA2PSK" || list_item.authMode == "WPA2PSK" || list_item.authMode == "WPAPSK" || list_item.authMode == "WPA3Personal" || list_item.authMode == "WPA2WPA3") {

+                        target.encryptType_WPA(list_item.encryptType);

+                    } else {

+                        target.encryptType(list_item.encryptType);

+                    }

+                    target.keyID(list_item.keyID);

+                }

+            }

+            target.pageState(target.page.edit);

+        };

+

+        target.connectHotspot = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            var profileName = target.apGrid.radioSelectValue();

+            var apList = target.apList();

+

+            function connect() {

+                showLoading("connecting");

+                var wifi_para = {};

+                var connectIndex = -1;

+                var ssid = "";

+                for (var i = 0; i < apList.length; i++) {

+                    if (apList[i].profileName == profileName) {

+

+                        wifi_para.EX_SSID1 = apList[i].ssid;

+                        wifi_para.EX_AuthMode = apList[i].authMode;

+                        wifi_para.EX_EncrypType = apList[i].encryptType;

+                        wifi_para.EX_DefaultKeyID = apList[i].keyID;

+                        wifi_para.EX_WEPKEY = apList[i].password;

+                        wifi_para.EX_WPAPSK1 = apList[i].password;

+                        wifi_para.EX_wifi_profile = apList[i].profileName;

+                        wifi_para.EX_mac = apList[i].mac;

+                        connectIndex = i;

+                        ssid = apList[i].ssid;

+                        break;

+                    }

+                }

+

+                target.connectWifiSSID(ssid);

+                target.connectWifiStatus("connecting");

+                target.apGrid.setRadioSelect(profileName);

+                target.connectButtonStatus("disable");

+

+                service.connectHotspot(wifi_para, function (data) {

+                    if (data && data.result == "success") {

+                        target.connectButtonStatus("disable");

+                        //延迟检测 确保取得的状态是最新的

+                        addTimeout(checkWifiStatus, 3000);

+                    } else if (data && data.result == "processing") {

+                        showAlert("ap_station_processing");

+                    } else {

+                        var apList = target.apList(); // cov_2

+                        apList[connectIndex].connectStatus = "0";

+                        target.connectWifiStatus("disconnect");

+                        target.connectButtonStatus("show");

+                        hideLoading();

+                        errorOverlay();

+                    }

+                    var apList = service.getHotspotList();

+                    target.apList(fixHotspotList(apList.hotspotList));

+                    target.connectWifiProfile(profileName);

+                    target.connectWifiSSID(ssid);

+                    target.apGrid.data([]);

+                    target.apGrid.data(target.apList());

+                    target.apGrid.setRadioSelect(profileName);

+                });

+            }

+

+            //将用户选中的profile排在运营商定制profile后的第一位

+            function refreshApList(profile, aplist) {

+                var apListLeft = [];

+                var apListPre = [];

+                for (var i = 0; i < aplist.length; i++) {

+                    if (aplist[i].fromProvider != "1") {

+                        if (aplist[i].profileName == profile) {

+                            apListPre.push(apList[i]);

+                        } else {

+                            apListLeft.push(apList[i]);

+                        }

+                    } else {

+                        apListPre.push(apList[i]);

+                    }

+                }

+                var apListNew = apListPre.concat(apListLeft);

+                service.saveHotspot({

+                    apList: apListNew

+                }, function (data) {

+                    if (data && data.result == "success") {

+                        apList = apListNew;

+                        target.apList(fixHotspotList(apList));

+                    }

+                });

+            }

+

+            var check_count = 0;

+            var connectStatus = false;

+

+            var status = service.getStatusInfo();

+            if (status.connectStatus == "ppp_connected" || status.connectStatus == "ppp_connecting") {

+                showConfirm("ap_station_connect_change_alert", function () {

+                    showLoading();

+                    connect();

+                });

+            } else {

+                connect();

+            }

+

+            function checkWifiStatus() {

+                check_count = check_count + 1;

+                if (check_count > 60) {

+                    hideLoading();

+                    errorOverlay();

+                    return;

+                }

+                if (!connectStatus) {

+                    var status = service.getStatusInfo();

+                    if (status.connectWifiStatus != "connect") {

+                        addTimeout(checkWifiStatus, 1000);

+                    } else {

+                        connectStatus = true;

+                    }

+                }

+                if (connectStatus) {

+                    //继续判断profile中连接状态是否为1

+                    service.getHotspotList({}, function (data) {

+                        for (var i = 0, len = data.hotspotList.length; i < len; i++) {

+                            var list_item = data.hotspotList[i];

+                            if (list_item.profileName == profileName) {

+                                if (list_item.connectStatus == "1") {

+                                    hideLoading();

+                                    return;

+                                } else {

+                                    var errorMsg = {

+                                        msg: 'ap_connect_error',

+                                        params: [list_item.ssid]

+                                    };

+                                    showAlert(errorMsg);

+                                    return;

+                                }

+                                break;

+                            }

+                        }

+                        addTimeout(checkWifiStatus, 1000);

+                    });

+                }

+            }

+

+        };

+

+        target.disconnectHotspot = function () {

+            if (wpsIsOn()) {

+                return;

+            }

+            showLoading('disconnecting');

+            service.disconnectHotspot({}, function (data) {

+                target.callback(data, true);

+            })

+        };

+

+        function getSearchHotspot() {

+            var check_count = 0;

+

+            function search() {

+                var result = service.getSearchHotspotList();

+                if (result.scan_finish == "0") {

+                    if (check_count <= 60) {

+                        check_count = check_count + 1;

+                        addTimeout(search, 1000);

+                    } else {

+                        hideLoading();

+                        showAlert("ap_station_search_hotspot_fail");

+                    }

+                } else {

+                    if ("2" == result.scan_finish) {

+                        hideLoading();

+                        showAlert("ap_station_processing");

+                    } else {

+                        target.apSearchList(fixHotspotList(result.hotspotList));

+                        target.apSearchGrid.data(target.apSearchList());

+                        hideLoading();

+                    }

+                }

+            }

+

+            showLoading('scanning');

+            service.searchHotspot({}, function (data) {

+                if (data && data.result == "processing") {

+                    hideLoading();

+                    showAlert("ap_station_processing");

+                } else if (data && data.result == "success") {

+                    if (target.pageState() != target.page.add) {

+                        target.pageState(target.page.add);

+                    }

+                    search();

+                } else {

+                    if (target.pageState() != target.page.add) {

+                        target.pageState(target.page.add);

+                    }

+                    hideLoading();

+                    showAlert("ap_station_search_hotspot_fail");

+                }

+            });

+        }

+

+        //清除编辑页面的信息

+        target.clear = function () {

+            target.apSearchGrid.clearRadioSelect();

+            target.profileName("");

+            target.ssid("");

+            target.signal("0");

+            target.authMode("OPEN");

+            target.password("");

+            target.encryptType("NONE");

+            target.encryptType_WPA("TKIPCCMP");

+            target.keyID("0");

+            target.mac("");

+        };

+

+        target.apply = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+

+            function setBasic() {

+                showLoading('waiting');

+                var wifi_para = {};

+                wifi_para.ap_station_enable = target.ap_station_enable();

+                service.setAPStationBasic(wifi_para, function (data) {

+                    if (target.origin_ap_station_enable == target.ap_station_enable()) {

+                        target.callback(data, true);

+                    } else {

+                        target.callback2(data, true);

+                    }

+                });

+                service.refreshAPStationStatus();

+            }

+            if (!config.HAS_MULTI_SSID) {

+                setBasic();

+            } else {

+                var infoBasic = service.getWifiBasic();

+                if (target.ap_station_enable() == "1" && infoBasic.multi_ssid_enable == "1") {

+                    showConfirm("ap_station_enable_confirm", setBasic);

+                } else {

+                    setBasic();

+                }

+            }

+        };

+        //刷新搜到的热点列表

+        target.searchHotspot = function () {

+            if (wifiIsClosed()) {

+                return;

+            }

+            if (wpsIsOn()) {

+                return;

+            }

+            getSearchHotspot();

+        };

+        //和webserver交互时的回调,wifi不重启的情况

+        target.callback = function (data, isInitPage) {

+            if (data) {

+                if (isInitPage) {

+                    initialize();

+                    $("#apList").translate();

+                }

+                if (data.result == "processing") {

+                    showAlert("ap_station_processing");

+                } else if (data.result == "spot_connected" || data.result == "spot_connecting") {

+                    showAlert("ap_station_update_fail");

+                } else if (data.result == "success") {

+                    successOverlay();

+                } else if (data.result == "exist") {

+                    showAlert("ap_station_exist");

+                } else {

+                    errorOverlay();

+                }

+            } else {

+                errorOverlay();

+            }

+        }

+

+        //和webserver交互时的回调,wifi会重启的情况

+        target.callback2 = function (data, isInitPage) {

+            if (data) {

+                if (!viaWifi) { //通过wifi登录webui

+                    addInterval(function () {

+                        var info = service.getWifiBasic();

+                        if (info.wifi_enable == "1") {

+                            clearTimer();

+                            clearValidateMsg();

+                            initialize();

+                            $("#apList").translate();

+                            if (data.result == "spot_connected" || data.result == "spot_connecting") {

+                                showAlert("ap_station_update_fail");

+                            } else if (data.result == "success") {

+                                successOverlay();

+                            } else {

+                                errorOverlay();

+                            }

+                        }

+                    }, 1000);

+                } else {

+                    setTimeout(function () {

+                        if (data.result == "processing") {

+                            showAlert("ap_station_processing");

+                        } else if (data.result == "spot_connecting" || data.result == "spot_connected") {

+                            showAlert("ap_station_update_fail");

+                        } else if (data.result == "success") {

+                            successOverlay();

+                            setTimeout(function () {

+                                window.location.reload();

+                            }, 1000);

+                            clearTimer();

+                            clearValidateMsg();

+                            initialize();

+                        } else {

+                            errorOverlay();

+                        }

+                    }, 15000);

+                }

+            } else {

+                errorOverlay();

+            }

+        };

+

+        target.checkSettings = function (ssid) {

+            var status = service.getWpsInfo();

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            if (config.HAS_MULTI_SSID && info.multi_ssid_enable == "1") {

+                if ((ssid == "ssid1" && parseInt(target.selectedStation()) + parseInt(info.m_MAX_Access_num) > info.MAX_Station_num)

+                     || (ssid == "ssid2" && parseInt(target.m_selectedStation()) + parseInt(info.MAX_Access_num) > info.MAX_Station_num)) {

+                    showAlert({

+                        msg: 'multi_ssid_max_access_number_alert',

+                        params: info.MAX_Station_num

+                    });

+                    return true;

+                }

+            }

+

+            return false;

+        };

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = function () {

+                showLoading('waiting');

+                var params = {};

+                params.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    params.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(params, function (result) {

+                    if (result.result == "success") {

+                        if (!viaWifi) {

+                            addInterval(function () {

+                                var info = service.getWifiBasic();

+                                if (info.wifi_enable == target.wifi_enable()) {

+                                    successOverlay();

+                                    clearTimer();

+                                    clearValidateMsg();

+                                    service.refreshAPStationStatus();

+                                    initialize();

+                                }

+                            }, 1000);

+                        } else {

+                            setTimeout(function () {

+                                successOverlay();

+                                setTimeout(function () {

+                                    window.location.reload();

+                                }, 1000);

+                                clearTimer();

+                                clearValidateMsg();

+                                service.refreshAPStationStatus();

+                                initialize();

+                            }, 15000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            var info = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!info.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!info.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+        };

+

+    }

+

+    function wpsIsOn() {

+        var wifi_info = service.getWpsInfo();

+        if (wifi_info.wpsFlag == '1') {

+            showAlert('wps_on_info', function() {

+                window.location.reload();

+            });

+            return true;

+        }

+    }

+

+    //处理热点列表内容,以便在表格显示

+    function fixHotspotList(list) {

+        var fixedList = [];

+        for (var ii = 0; ii < list.length; ii++) {

+            list[ii].index = ii;

+            var url_image = "";

+            if (list[ii].connectStatus != "1") {

+                if (list[ii].encryptType.toLowerCase() == "none" && list[ii].authMode.toLowerCase() == "open") {

+                    url_image = "pic/wlan_signal_" + list[ii].signal + ".png";

+                } else {

+                    url_image = "pic/wlan_lock_signal_" + list[ii].signal + ".png";

+                }

+            } else {

+                if (list[ii].encryptType.toLowerCase() == "none" && list[ii].authMode.toLowerCase() == "open") {

+                    url_image = "pic/wlan_connected.png";

+                } else {

+                    url_image = "pic/wlan_lock_connected.png";

+                }

+            }

+            list[ii].imgSignal = url_image;

+            list[ii].authMode_show = $.i18n.prop("ap_station_security_mode_" + list[ii].authMode);

+        }

+        return list;

+    }

+

+    function wifiIsClosed() {

+        var wifi_info = service.getWpsInfo();

+        if (wifi_info.radioFlag == "0") {

+            showAlert('wps_wifi_off');

+            return true;

+        }

+    }

+

+    function event_bind(aps_vm) {

+        $("#showWPAPassword").change(function () {

+            aps_vm.showWPAPasswordHandler();

+        });

+        $("#showPassword").change(function () {

+            aps_vm.showPasswordHandler();

+        });

+    }

+

+    function initialize() {

+        var aps_vm = new apStationViewMode();

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        ko.applyBindings(aps_vm, container);

+        event_bind(aps_vm);

+

+        aps_refresh(true);

+        clearTimer();

+        addInterval(function () {

+            aps_refresh(false);

+            checkAccessMode();

+        }, 1000);

+

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                aps_vm.setMultiSSIDSwitch();

+            }

+        });

+

+        $("#frmAPStation").validate({

+            submitHandler: function () {

+                aps_vm.addHotspot();

+            },

+            rules: {

+                txtSSID: "ssid_ap"

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "txtWPAKey" || id == "codeWPAKey") {

+                    error.insertAfter("#lblshowWPAPassword");

+                } else if (id == "txtWepKey" || id == "pwdWepKey") {

+                    error.insertAfter("#lblShowPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+

+        function aps_refresh(initPage) {

+            var info = service.getStatusInfo();

+            if (info.multi_ssid_enable != "1") {

+                aps_vm.isCableMode(checkCableMode(info.blc_wan_mode));

+                aps_vm.connectWifiProfile(info.connectWifiProfile);

+                aps_vm.connectWifiSSID(info.connectWifiSSID);

+                aps_vm.connectWifiStatus(info.connectWifiStatus);

+                aps_vm.networkType(info.networkType);

+                aps_vm.connectStatus(info.connectStatus);

+                aps_vm.computeConnectStatus();

+

+                service.getHotspotList({}, function (data) {

+                    var list = fixHotspotList(data.hotspotList);

+                    aps_vm.apList(list);

+                    var gripList = aps_vm.apGrid.data();

+                    if (list.length > 0 && list[0].profileName != gripList[0].profileName && list[0].connectStatus == "1") {

+                        aps_vm.apGrid.data([]);

+                        aps_vm.apGrid.data(aps_vm.apList());

+                        aps_vm.apGrid.setRadioSelect(list[0].profileName);

+                    }

+                    renderCustomElement($("#apList"));

+                    var radios = $("input[type='radio']", "#apList").each(function () {

+                        for (var i = 0, len = list.length; i < len; i++) {

+                            if (list[i].profileName == $(this).val()) {

+                                var img = $(this).parent().parent().find("img")[0];

+                                img.src = list[i].imgSignal;

+                                if (initPage) {

+                                    if (list[i].connectStatus == "1") {

+                                        aps_vm.hasSelectFromUser(false);

+                                        aps_vm.connectButtonStatus("disable");

+                                    }

+                                }

+                            }

+                        }

+                    });

+                });

+            } else {

+                //to do

+            }

+        }

+

+    }

+

+    return {

+        init: initialize

+    }

+});

+

+define("wifi_guest","underscore jquery knockout set service CryptoJS".split(" "),

+

+    function (_, $, ko, config, service, CryptoJS) {

+

+    var viaWifi = false;

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    var securityModes = _.map(config.WIFI_WEP_SUPPORT ? config.AUTH_MODES_WEP : config.AUTH_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    function maxStationAccess(max) {

+        var showOption = [];

+        for (var i = 1; i <= max; i++) {

+            showOption.push(new Option(i, i));

+        }

+        return showOption;

+    }

+

+    function wifiGuestVM() {

+        var target = this;

+        var info = service.getWifiBasic();

+

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.showIsolated = config.SHOW_WIFI_AP_ISOLATED;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+        target.hasWifiWep = config.WIFI_WEP_SUPPORT;

+        target.hasWifiWpa3 = config.WIFI_WAP3_SUPPORT;

+        target.hasWifiWpa23 = config.WIFI_WPA2_WAP3_SUPPORT;

+

+        var advanceInfo = service.getWifiAdvance();

+        target.adBand = ko.observable(advanceInfo.wifiBand);

+        target.adMode = ko.observable(advanceInfo.mode);

+

+        target.showQRSwitch = config.WIFI_SUPPORT_QR_CODE && config.WIFI_SUPPORT_QR_SWITCH;

+        target.showQR = ko.observable(info.m_show_qrcode_flag);

+        if (config.WIFI_SUPPORT_QR_SWITCH) {

+            target.showQRCode = ko.observable(config.WIFI_SUPPORT_QR_CODE && target.showQR());

+        } else {

+            target.showQRCode = ko.observable(config.WIFI_SUPPORT_QR_CODE);

+        }

+        if(config.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_multi_ssid_wifikey.png?_=' + $.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        target.origin_ap_station_enable = info.ap_station_enable;

+        target.wifi_enable = ko.observable(info.wifi_enable);

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (info.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+

+        target.multi_ssid_enable = ko.observable(info.multi_ssid_enable);

+        target.origin_multi_ssid_enable = info.multi_ssid_enable;

+

+        target.maxStationNumber = ko.computed(function () {

+            return config.MAX_STATION_NUMBER;

+        });

+

+        target.modes = ko.observableArray(securityModes);

+        target.selectedMode = ko.observable(info.AuthMode);

+        target.passPhrase = ko.observable(info.passPhrase);

+        target.showPassword = ko.observable(false);

+        target.ssid = ko.observable(info.SSID);

+        target.broadcast = ko.observable(info.broadcast == '1' ? '1' : '0');

+        target.apIsolation = ko.observable(info.apIsolation == '1' ? '1' : '0');

+        target.cipher = info.cipher;

+        target.selectedStation = ko.observable(info.MAX_Access_num);

+        target.maxStations = ko.observableArray(maxStationAccess(info.MAX_Station_num));

+

+        target.m_modes = ko.observableArray(securityModes);

+        target.m_selectedMode = ko.observable(info.m_AuthMode);

+        target.m_passPhrase = ko.observable(info.m_passPhrase);

+        target.m_showPassword = ko.observable(false);

+        target.m_ssid = ko.observable(info.m_SSID);

+        target.m_broadcast = ko.observable(info.m_broadcast == '1' ? '1' : '0');

+        target.m_apIsolation = ko.observable(info.m_apIsolation == '1' ? '1' : '0');

+        target.m_cipher = info.m_cipher;

+        target.m_selectedStation = ko.observable(info.m_MAX_Access_num);

+        target.m_maxStations = ko.observableArray(maxStationAccess(info.MAX_Station_num));

+        target.m_encryptType = ko.observable(info.m_encryptType);

+        target.m_keyID = ko.observable(info.m_keyID);

+        target.m_wepPassword = ko.observable("");

+

+        //刷新界面状态值显示

+        target.clear = function (option) {

+            if (option == "switch") {

+                target.multi_ssid_enable(info.multi_ssid_enable);

+                target.wifi_enable(info.wifi_enable);

+            } else if (option == "ssid1") {

+                target.selectedMode(info.AuthMode);

+                target.passPhrase(info.passPhrase);

+                target.ssid(info.SSID);

+                target.broadcast(info.broadcast == '1' ? '1' : '0');

+                target.cipher = info.cipher;

+                target.selectedStation(info.MAX_Access_num);

+                target.apIsolation(info.apIsolation == '1' ? '1' : '0');

+            } else if (option == "ssid2") {

+                target.m_selectedMode(info.m_AuthMode);

+                target.m_passPhrase(info.m_passPhrase);

+                target.m_ssid(info.m_SSID);

+                target.m_broadcast(info.m_broadcast == '1' ? '1' : '0');

+                target.m_cipher = info.m_cipher;

+                target.m_selectedStation(info.m_MAX_Access_num);

+                target.m_apIsolation(info.m_apIsolation == '1' ? '1' : '0');

+                if (config.WIFI_WEP_SUPPORT) {

+                    target.m_encryptType(info.m_encryptType);

+                    target.m_keyID(info.m_keyID);

+                    target.m_wepPassword(target.getWepPassword());

+                }

+            } else {

+                clearTimer();

+                clearValidateMsg();

+                initialize();

+                service.refreshAPStationStatus();

+            }

+        };

+

+        target.getWepPassword = function () {

+            return target.m_keyID() == '3' ? info.m_Key4Str1 : (target.m_keyID() == '2' ? info.m_Key3Str1 : target.m_keyID() == '1' ? info.m_Key2Str1 : info.m_Key1Str1);

+        }

+        target.m_wepPassword(target.getWepPassword());

+        //WEP加密模式下网络秘钥切换事件

+        target.profileChangeHandler = function (data, event) {

+            $("#pwdWepKey").parent().find("label[class='error']").hide();

+            target.m_wepPassword(target.getWepPassword());

+            return true;

+        };

+

+        target.saveSSID1 = function () {

+            if (target.checkSettings("ssid1")) {

+                return;

+            }

+            showConfirm('wifi_disconnect_confirm', function () {

+                target.saveSSID1Action();

+            });

+        };

+        target.saveSSID1Action = function () {

+            showLoading('waiting');

+            target.broadcast($("#broadcastCheckbox:checked").length > 0 ? '0' : '1');

+            target.apIsolation($("#apisolatedCheckbox:checked").length);

+            var params = {};

+            params.AuthMode = target.selectedMode();

+            params.passPhrase = target.passPhrase();

+            params.SSID = target.ssid();

+            params.broadcast = target.broadcast();

+            params.station = target.selectedStation();

+            params.cipher = target.selectedMode() == "WPA2PSK" ? 1 : 2;

+            if (params.AuthMode == "WPA3Personal" || params.AuthMode == "WPA2WPA3") {

+                params.cipher = 1;

+            }

+            params.NoForwarding = target.apIsolation();

+            params.show_qrcode_flag = target.showQR() == true ? 1 : 0;

+            service.setWifiBasic(params, function (result) {

+                if (result.result == "success") {

+                    if (viaWifi) {

+                        setTimeout(guestReloadVarWifi, 15000);

+                    } else {

+                        addInterval(guestReload, 1000);

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+        target.saveSSID2 = function () {

+            if (target.checkSettings("ssid2")) {

+                return;

+            }

+            if (!config.PASSWORD_ENCODE) {

+                var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,32}');

+                if (!pwdRegex.test(target.m_passPhrase())) {

+                        showConfirm("password_note_too_low", function () {

+                            showConfirm('wifi_disconnect_confirm', function () {

+                            target.saveSSID2Action();

+                            return;

+                        });

+                        return;

+                    });

+                    return;

+                }

+            }

+            showConfirm('wifi_disconnect_confirm', function () {

+                target.saveSSID2Action();

+            });

+        };

+        target.saveSSID2Action = function () {

+            showLoading('waiting');

+            target.m_broadcast($("#mBroadcastCheckbox:checked").length > 0 ? '0' : '1');

+            target.m_apIsolation($("#mApIsolatedCheckbox:checked").length);

+            var ciphertext = "";

+            if (config.PASSWORD_ENCODE) {

+	        ciphertext = target.m_passPhrase();

+	    } else {

+                var kparam = service.getDeviceInfoLow();

+                var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                ciphertext = CryptoJS.AES.encrypt(target.m_passPhrase(), tkey, {

+                    iv: tiv,

+                    mode: CryptoJS.mode.CBC,

+                    padding: CryptoJS.pad.ZeroPadding

+                    }).toString();

+	    }

+            var params = {};

+            params.m_AuthMode = target.m_selectedMode();

+            params.m_passPhrase = ciphertext;

+            params.m_SSID = target.m_ssid();

+            params.m_broadcast = target.m_broadcast();

+            params.m_station = target.m_selectedStation();

+            params.m_cipher = target.m_selectedMode() == "WPA2PSK" ? 1 : 2;

+            if (params.m_AuthMode == "WPA3Personal" || params.m_AuthMode == "WPA2WPA3") {

+                params.m_cipher = 1;

+            }

+            params.m_NoForwarding = target.m_apIsolation();

+            params.m_show_qrcode_flag = target.showQR() == true ? 1 : 0;

+

+            if (config.WIFI_WEP_SUPPORT) {

+                if (params.m_AuthMode == "SHARED") {

+                    params.m_encryptType = "WEP";

+                } else if (params.m_AuthMode == "WPAPSKWPA2PSK" || params.m_AuthMode == "WPA2PSK" || params.m_AuthMode == "WPAPSK" || params.m_AuthMode == "WPA3Personal" || params.m_AuthMode == "WPA2WPA3") {

+                    //params.m_encryptType = target.m_encryptType_WPA();

+                } else {

+                    params.m_encryptType = target.m_encryptType();

+                }

+                params.m_wep_default_key = target.m_keyID();

+                params.m_wep_key_4 = info.m_Key4Str1;

+                params.m_wep_key_3 = info.m_Key3Str1;

+                params.m_wep_key_2 = info.m_Key2Str1;

+                params.m_wep_key_1 = info.m_Key1Str1;

+                var mWEPSelect = '0';

+                if (target.m_wepPassword().length == '13' || target.m_wepPassword().length == '5') {

+                    mWEPSelect = '1';

+                } else {

+                    mWEPSelect = '0';

+                }

+                if (target.m_keyID() == '3') {

+                    params.m_wep_key_4 = target.m_wepPassword();

+                    params.m_WEP4Select = mWEPSelect;

+                } else if (target.m_keyID() == '2') {

+                    params.m_wep_key_3 = target.m_wepPassword();

+                    params.m_WEP3Select = mWEPSelect;

+                } else if (target.m_keyID() == '1') {

+                    params.m_wep_key_2 = target.m_wepPassword();

+                    params.m_WEP2Select = mWEPSelect;

+                } else {

+                    params.m_wep_key_1 = target.m_wepPassword();

+                    params.m_WEP1Select = mWEPSelect;

+                }

+            }

+

+            service.setWifiBasic4SSID2(params, function (result) {

+                if (result.result == "success") {

+                    if (viaWifi) {

+                        setTimeout(ssid2ReloadVarWifi, 15000);

+                    } else {

+                        addInterval(ssid2Reload, 1000);

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        };

+

+        function guestReloadVarWifi() {

+            successOverlay();

+            setTimeout(function () {

+                window.location.reload();

+            }, 1000);

+            target.clear();

+        }

+        function guestReload() {

+            var info = getWifiMain();

+            if (info.wifi_enable == "1") {

+                successOverlay();

+                target.clear();

+            }

+        }

+        function ssid2ReloadVarWifi() {

+            successOverlay();

+            setTimeout(function () {

+                window.location.reload();

+            }, 1000);

+            target.clear();

+        }

+        function ssid2Reload() {

+            var info = getWifiMain();

+            if (info.wifi_enable == "1") {

+                successOverlay();

+                target.clear();

+            }

+        }

+

+        target.checkSettings = function (ssid) {

+            var status = getWpsState();

+

+            if (config.HAS_MULTI_SSID) {

+                if (ssid == "ssid1" || ssid == "ssid2") {

+                    if (ssid == "ssid2") {

+                        var accessDevice = service.getStatusInfo().ssid2AttachedNum;

+                        if (parseInt(target.m_selectedStation()) < accessDevice) {

+                            showAlert('Extend_accessDevice');

+                            return true;

+                        }

+                    } else {

+                        var accessDevice = service.getStatusInfo().ssid1AttachedNum;

+                        if (parseInt(target.selectedStation()) < accessDevice) {

+                            showAlert('Extend_accessDevice');

+                            return true;

+                        }

+                    }

+                }

+            }

+

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            if (config.HAS_MULTI_SSID && info.multi_ssid_enable == "1") {

+                if ((ssid == "ssid1" && parseInt(target.selectedStation()) + parseInt(info.m_MAX_Access_num) > info.MAX_Station_num)

+                     || (ssid == "ssid2" && parseInt(target.m_selectedStation()) + parseInt(info.MAX_Access_num) > info.MAX_Station_num)) {

+                    showAlert({

+                        msg: 'multi_ssid_max_access_number_alert',

+                        params: info.MAX_Station_num

+                    });

+                    return true;

+                }

+            }

+

+            return false;

+        };

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = function () {

+                showLoading('waiting');

+                var params = {};

+                params.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    params.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(params, function (result) {

+                    if (result.result == "success") {

+                        if (viaWifi) {

+                            setTimeout(multiReloadViaWifi, 15000);

+                        } else {

+                            addInterval(multiReload, 1000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+            function multiReloadViaWifi() {

+                successOverlay();

+                setTimeout(function () {

+                    window.location.reload();

+                }, 1000);

+                target.clear();

+            }

+            function multiReload() {

+                var info = getWifiMain();

+                if (info.wifi_enable == target.wifi_enable()) {

+                    successOverlay();

+                    target.clear();

+                }

+            }

+            var info = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (config.AP_STATION_SUPPORT && target.multi_ssid_enable() == "1" && target.origin_ap_station_enable == "1") {

+                    if (!info.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!info.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+        };

+        target.showQRHandler = function () {

+            var checkbox = $("#showQR:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showQR(true);

+            } else {

+                target.showQR(false);

+            }

+            target.showQRCode(config.WIFI_SUPPORT_QR_CODE && target.showQR());

+        };

+

+        target.showPasswordHandler = guestShowPassword;

+

+        target.m_showPasswordHandler = m_guestShowPassword;

+

+        function guestShowPassword() {

+            $("#passShow").parent().find(".error").hide();

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        }

+        function m_guestShowPassword() {

+            $("#m_passShow").parent().find(".error").hide();

+            $("#m_pwdWepKey").parent().find(".error").hide();

+            var checkbox = $("#m_showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.m_showPassword(true);

+            } else {

+                target.m_showPassword(false);

+            }

+        }

+

+    }

+

+    function getWifiMain() {

+        return service.getWifiBasic();

+    }

+

+    function initialize() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new wifiGuestVM();

+        ko.applyBindings(vm, container[0]);

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+

+        function checkWifiStatus() {

+            var info = service.getAPStationBasic();

+            if (info.ap_station_enable != "1") {

+                $('#frmMultiSSID :input').each(function () {

+                    $(this).attr("disabled", false);

+                });

+            } else {

+                $('#frmMultiSSID :input').each(function () {

+                    $(this).attr("disabled", true);

+                });

+            }

+        }

+

+        function checkWifiStatusAccordingToWDS() {

+            var info = service.getWdsInfo();

+            if (info.currentMode == "0") {

+                $('#frmWifiSwitch :input').each(function () {

+                    $(this).attr("disabled", false);

+                });

+                $('#frmSSID2 :input').each(function () {

+                    $(this).attr("disabled", false);

+                });

+                $('#frmSSID1 :input').each(function () {

+                    $(this).attr("disabled", false);

+                });

+            } else {

+                $('#frmWifiSwitch :input').each(function () {

+                    $(this).attr("disabled", true);

+                });

+                $('#frmSSID2 :input').each(function () {

+                    $(this).attr("disabled", true);

+                });

+                $('#frmSSID1 :input').each(function () {

+                    $(this).attr("disabled", true);

+                });

+            }

+        }

+

+        if (config.WDS_SUPPORT) {

+            checkWifiStatusAccordingToWDS();

+        } else if (config.AP_STATION_SUPPORT) {

+            checkWifiStatus();

+        }

+

+        $('#frmMultiSSID').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+        $('#frmSSID2').validate({

+            submitHandler: function () {

+                vm.saveSSID2();

+            },

+            rules: {

+                m_ssid: 'ssid',

+                m_pwdWepKey: {

+                    wifi_wep_password_check: true,

+                    wifi_password_check: true

+                },

+                m_txtWepKey: {

+                    wifi_wep_password_check: true,

+                    wifi_password_check: true

+                },

+                m_pass: 'wifi_password_check',

+                m_passShow: 'wifi_password_check'

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "m_passShow" || id == "m_pass") {

+                    error.insertAfter("#m_lblShowPassword");

+                } else if (id == "m_txtWepKey" || id == "m_pwdWepKey") {

+                    error.insertAfter("#m_lblShowWepPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+        $('#frmSSID1').validate({

+            submitHandler: function () {

+                vm.saveSSID1();

+            },

+            rules: {

+                pass: 'wifi_password_check',

+                ssid: 'ssid',

+                passShow: 'wifi_password_check'

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "passShow" || id == "pass") {

+                    error.insertAfter("#lblShowPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+

+    }

+

+    function getWpsState() {

+        return service.getWpsInfo();

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_mac_filter","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var viaWifi = false;

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    function macFilterViewModel() {

+        var target = this;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.showIsolated = config.SHOW_WIFI_AP_ISOLATED;

+

+        var info = service.getMacFilterInfo();

+        var wifiBaseInfo = service.getWifiBasic();

+        target.multi_ssid_enable = ko.observable(wifiBaseInfo.multi_ssid_enable);

+        target.origin_ap_station_enable = wifiBaseInfo.ap_station_enable;

+        target.wifi_enable = ko.observable(wifiBaseInfo.wifi_enable);

+

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (wifiBaseInfo.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+

+        target.selectedAction = ko.observable(info.ACL_mode);

+        target.mac1 = ko.observable("");

+        target.mac2 = ko.observable("");

+        target.mac3 = ko.observable("");

+        target.mac4 = ko.observable("");

+        target.mac5 = ko.observable("");

+        target.mac6 = ko.observable("");

+        target.mac7 = ko.observable("");

+        target.mac8 = ko.observable("");

+        target.mac9 = ko.observable("");

+        target.mac10 = ko.observable("");

+        if (info.ACL_mode == "1") {

+            macInfoWhite = info.wifi_mac_white_list.split(";");

+            target.mac1 = ko.observable(macInfoWhite[0]);

+            target.mac2 = ko.observable(macInfoWhite[1]);

+            target.mac3 = ko.observable(macInfoWhite[2]);

+            target.mac4 = ko.observable(macInfoWhite[3]);

+            target.mac5 = ko.observable(macInfoWhite[4]);

+            target.mac6 = ko.observable(macInfoWhite[5]);

+            target.mac7 = ko.observable(macInfoWhite[6]);

+            target.mac8 = ko.observable(macInfoWhite[7]);

+            target.mac9 = ko.observable(macInfoWhite[8]);

+            target.mac10 = ko.observable(macInfoWhite[9]);

+        } else if (info.ACL_mode == "2") {

+            macInfoBlack = info.wifi_mac_black_list.split(";");

+            target.mac1 = ko.observable(macInfoBlack[0]);

+            target.mac2 = ko.observable(macInfoBlack[1]);

+            target.mac3 = ko.observable(macInfoBlack[2]);

+            target.mac4 = ko.observable(macInfoBlack[3]);

+            target.mac5 = ko.observable(macInfoBlack[4]);

+            target.mac6 = ko.observable(macInfoBlack[5]);

+            target.mac7 = ko.observable(macInfoBlack[6]);

+            target.mac8 = ko.observable(macInfoBlack[7]);

+            target.mac9 = ko.observable(macInfoBlack[8]);

+            target.mac10 = ko.observable(macInfoBlack[9]);

+        }

+

+        target.save = filter_save;

+        //切换MAC过滤规则事件

+        target.ChangeHandler = function () {

+            $("#mac_filter_form").find(".error").hide();

+            $("#mac_filter_form").find("input[type=text]").show();

+            var info = service.getMacFilterInfo();

+            if (target.selectedAction() == "1") {

+                macInfoWhite = info.wifi_mac_white_list.split(";");

+                target.mac1(macInfoWhite[0]);

+                target.mac2(macInfoWhite[1]);

+                target.mac3(macInfoWhite[2]);

+                target.mac4(macInfoWhite[3]);

+                target.mac5(macInfoWhite[4]);

+                target.mac6(macInfoWhite[5]);

+                target.mac7(macInfoWhite[6]);

+                target.mac8(macInfoWhite[7]);

+                target.mac9(macInfoWhite[8]);

+                target.mac10(macInfoWhite[9]);

+            } else if (target.selectedAction() == "2") {

+                macInfoBlack = info.wifi_mac_black_list.split(";");

+                target.mac1(macInfoBlack[0]);

+                target.mac2(macInfoBlack[1]);

+                target.mac3(macInfoBlack[2]);

+                target.mac4(macInfoBlack[3]);

+                target.mac5(macInfoBlack[4]);

+                target.mac6(macInfoBlack[5]);

+                target.mac7(macInfoBlack[6]);

+                target.mac8(macInfoBlack[7]);

+                target.mac9(macInfoBlack[8]);

+                target.mac10(macInfoBlack[9]);

+            } else {

+                target.mac1("");

+                target.mac2("");

+                target.mac3("");

+                target.mac4("");

+                target.mac5("");

+                target.mac6("");

+                target.mac7("");

+                target.mac8("");

+                target.mac9("");

+                target.mac10("");

+            }

+        }

+        //检查WPS状态

+        target.checkSettings = function (ssid) {

+            var wifi_status = service.getWpsInfo();

+            if (wifi_status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            return false;

+        };

+

+        //设置多SSID开关

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = setFilterSwitch;

+

+            var info = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!info.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!info.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+

+			function setFilterSwitch() {

+                showLoading('waiting');

+                var filter_param = {};

+                filter_param.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    filter_param.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(filter_param, function (result) {

+                    if (result.result == "success") {

+                        if (!viaWifi) {

+                            addInterval(function () {

+                                var info = service.getWifiBasic();

+                                service.refreshAPStationStatus();

+                                if (info.wifi_enable == target.wifi_enable()) {

+                                    successOverlay();

+                                    clearTimer();

+                                    clearValidateMsg();

+                                    service.refreshAPStationStatus();

+                                    initialize();

+                                }

+                            }, 1000);

+                        } else {

+                            setTimeout(function () {

+                                successOverlay();

+                                setTimeout(function () {

+                                    window.location.reload();

+                                }, 1000);

+                                clearTimer();

+                                clearValidateMsg();

+                                service.refreshAPStationStatus();

+                                initialize();

+                            }, 15000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            }

+        };

+

+		function filter_save() {

+            var wifi_status = service.getWpsInfo();

+            if (wifi_status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+

+            if (target.mac1() == undefined || target.mac1().indexOf(" ") >= 0) {

+                target.mac1("")

+            }

+            if (target.mac2() == undefined || target.mac2().indexOf(" ") >= 0) {

+                target.mac2("")

+            }

+            if (target.mac3() == undefined || target.mac3().indexOf(" ") >= 0) {

+                target.mac3("")

+            }

+            if (target.mac4() == undefined || target.mac4().indexOf(" ") >= 0) {

+                target.mac4("")

+            }

+            if (target.mac5() == undefined || target.mac5().indexOf(" ") >= 0) {

+                target.mac5("")

+            }

+            if (target.mac6() == undefined || target.mac6().indexOf(" ") >= 0) {

+                target.mac6("")

+            }

+            if (target.mac7() == undefined || target.mac7().indexOf(" ") >= 0) {

+                target.mac7("")

+            }

+            if (target.mac8() == undefined || target.mac8().indexOf(" ") >= 0) {

+                target.mac8("")

+            }

+            if (target.mac9() == undefined || target.mac9().indexOf(" ") >= 0) {

+                target.mac9("")

+            }

+            if (target.mac10() == undefined || target.mac10().indexOf(" ") >= 0) {

+                target.mac10("")

+            }

+

+            var mac_list = new Array(target.mac1(), target.mac2(), target.mac3(), target.mac4(), target.mac5(),

+                    target.mac6(), target.mac7(), target.mac8(), target.mac9(), target.mac10());

+            if (target.selectedAction() == "2" && info.client_mac_address != "" && $.inArray(info.client_mac_address, mac_list) != -1) {

+                showAlert('black_yourself_tip');

+                return false;

+            }

+            var list_sort = mac_list.sort(); //排序

+            for (var i = 0; i < list_sort.length - 1; i++) {

+                if (list_sort[i] != "" && list_sort[i] == list_sort[i + 1]) {

+                    showAlert('mac_repeat_tip');

+                    return false;

+                }

+            }

+            var string_maclist = "";

+            for (var i = 0; i < 10; i++) {

+                if (string_maclist == "") {

+                    string_maclist = mac_list[i];

+                } else {

+                    if (mac_list[i]) {

+                        string_maclist = string_maclist + ";" + mac_list[i];

+                    }

+                }

+            }

+            var filter_param = {};

+            filter_param.ACL_mode = target.selectedAction();

+            if (target.selectedAction() == "2") {

+                filter_param.wifi_mac_black_list = string_maclist;

+            } else if (target.selectedAction() == "1") {

+                filter_param.wifi_mac_white_list = string_maclist;

+            }

+            showLoading('waiting');

+            service.setMacFilter(filter_param, function (result) {

+                if (result.result == "success") {

+                    successOverlay();

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+    }

+

+    function bindContainer(filter_vm) {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(filter_vm, container[0]);

+

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                filter_vm.setMultiSSIDSwitch();

+            }

+        });

+        $('#mac_filter_form').validate({

+            submitHandler: function () {

+                filter_vm.save();

+            },

+            rules: {

+                mac_1: 'mac_check',

+                mac_2: 'mac_check',

+                mac_3: 'mac_check',

+                mac_4: 'mac_check',

+                mac_5: 'mac_check',

+                mac_6: 'mac_check',

+                mac_7: 'mac_check',

+                mac_8: 'mac_check',

+                mac_9: 'mac_check',

+                mac_10: 'mac_check'

+            }

+        });

+    }

+    function initialize() {

+        var filter_vm = new macFilterViewModel();

+        bindContainer(filter_vm);

+

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_main","underscore jquery knockout set service CryptoJS".split(" "),

+    function (_, $, ko, config, service, CryptoJS) {

+

+    var securityModes = _.map(config.WIFI_WEP_SUPPORT ? config.AUTH_MODES_WEP : config.AUTH_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    function maxStationAccess(max) {

+        var showOption = [];

+        for (var i = 1; i <= max; i++) {

+            showOption.push(new Option(i, i));

+        }

+        return showOption;

+    }

+    //是否通过wifi接入

+    var viaWifi = false;

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+

+    function WifiMainVM() {

+        var target = this;

+        var info = getWifiMain();

+

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.showIsolated = config.SHOW_WIFI_AP_ISOLATED;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+        target.hasWifiWep = config.WIFI_WEP_SUPPORT;

+        target.hasWifiWpa3 = config.WIFI_WAP3_SUPPORT;

+        target.hasWifiWpa23 = config.WIFI_WPA2_WAP3_SUPPORT;

+

+        var advanceInfo = service.getWifiAdvance();

+        target.adBand = ko.observable(advanceInfo.wifiBand);

+        target.adMode = ko.observable(advanceInfo.mode);

+        target.showQRSwitch = config.WIFI_SUPPORT_QR_CODE && config.WIFI_SUPPORT_QR_SWITCH;

+        target.showQR = ko.observable(info.show_qrcode_flag);

+        if (config.WIFI_SUPPORT_QR_SWITCH) {

+            target.showQRCode = ko.observable(config.WIFI_SUPPORT_QR_CODE && target.showQR());

+        } else {

+            target.showQRCode = ko.observable(config.WIFI_SUPPORT_QR_CODE);

+        }

+        if(config.WIFI_SUPPORT_QR_CODE){

+            target.qrcodeSrc = './pic/qrcode_ssid_wifikey.png?_=' + $.now();

+        } else {

+            target.qrcodeSrc = './pic/res_blacktrans.png';

+        }

+        target.origin_ap_station_enable = info.ap_station_enable;

+        target.wifi_enable = ko.observable(info.wifi_enable);

+

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) {

+            if (info.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+

+        target.multi_ssid_enable = ko.observable(info.multi_ssid_enable);

+        target.origin_multi_ssid_enable = info.multi_ssid_enable;

+

+        target.maxStationNumber = ko.computed(function () {

+            return config.MAX_STATION_NUMBER;

+        });

+

+        target.modes = ko.observableArray(securityModes);

+        target.selectedMode = ko.observable(info.AuthMode);

+        target.passPhrase = ko.observable(info.passPhrase);

+        target.showPassword = ko.observable(false);

+        target.ssid = ko.observable(info.SSID);

+        target.broadcast = ko.observable(info.broadcast == '1' ? '1' : '0');

+        target.apIsolation = ko.observable(info.apIsolation == '1' ? '1' : '0');

+        target.cipher = info.cipher;

+        target.selectedStation = ko.observable(info.MAX_Access_num);

+        target.maxStations = ko.observableArray(maxStationAccess(info.MAX_Station_num));

+        target.encryptType = ko.observable(info.encryptType);

+        target.keyID = ko.observable(info.keyID);

+        target.wepPassword = ko.observable("");

+

+        target.m_modes = ko.observableArray(securityModes);

+        target.m_selectedMode = ko.observable(info.m_AuthMode);

+        target.m_passPhrase = ko.observable(info.m_passPhrase);

+        target.m_showPassword = ko.observable(false);

+        target.m_ssid = ko.observable(info.m_SSID);

+        target.m_broadcast = ko.observable(info.m_broadcast == '1' ? '1' : '0');

+        target.m_apIsolation = ko.observable(info.m_apIsolation == '1' ? '1' : '0');

+        target.m_cipher = info.m_cipher;

+        target.m_selectedStation = ko.observable(info.m_MAX_Access_num);

+        target.m_maxStations = ko.observableArray(maxStationAccess(info.MAX_Station_num));

+

+        target.getWepPassword = function () {

+            return target.keyID() == '3' ? info.Key4Str1 : (target.keyID() == '2' ? info.Key3Str1 : target.keyID() == '1' ? info.Key2Str1 : info.Key1Str1);

+        }

+        target.wepPassword(target.getWepPassword());

+        target.profileChangeHandler = function (data, event) {

+            $("#pwdWepKey").parent().find("label[class='error']").hide();

+            target.wepPassword(target.getWepPassword());

+            return true;

+        };

+

+        target.clear = function (option) {

+            if (option == "switch") {

+                target.multi_ssid_enable(info.multi_ssid_enable);

+                target.wifi_enable(info.wifi_enable);

+            } else if (option == "ssid2") {

+                target.m_selectedMode(info.m_AuthMode);

+                target.m_passPhrase(info.m_passPhrase);

+                target.m_ssid(info.m_SSID);

+                target.m_broadcast(info.m_broadcast == '1' ? '1' : '0');

+                target.m_cipher = info.m_cipher;

+                target.m_selectedStation(info.m_MAX_Access_num);

+                target.m_apIsolation(info.m_apIsolation == '1' ? '1' : '0');

+            } else if (option == "ssid1") {

+                target.selectedMode(info.AuthMode);

+                target.passPhrase(info.passPhrase);

+                target.ssid(info.SSID);

+                target.broadcast(info.broadcast == '1' ? '1' : '0');

+                target.cipher = info.cipher;

+                target.selectedStation(info.MAX_Access_num);

+                target.apIsolation(info.apIsolation == '1' ? '1' : '0');

+                if (config.WIFI_WEP_SUPPORT) {

+                    target.encryptType(info.encryptType);

+                    target.keyID(info.keyID);

+                    target.wepPassword(target.getWepPassword());

+                }

+            } else {

+                clearTimer();

+                clearValidateMsg();

+                initialize();

+            }

+        };

+

+        target.saveSSID1 = function () {

+            if (target.checkSettings("ssid1")) {

+                return;

+            }

+            if (!config.PASSWORD_ENCODE) {

+                var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,32}');

+                if (!pwdRegex.test(target.passPhrase())) {

+                        showConfirm("password_note_too_low", function () {

+                            showConfirm('wifi_disconnect_confirm', function () {

+                            target.saveSSID1Action();

+                            return;

+                        });

+                        return;

+                    });

+                    return;

+                }

+            }

+            showConfirm('wifi_disconnect_confirm', function () {

+                target.saveSSID1Action();

+            });

+        };

+

+        target.saveSSID1Action = getSSID1Action;

+

+        target.saveSSID2 = function () {

+            if (target.checkSettings("ssid2")) {

+                return;

+            }

+            showConfirm('wifi_disconnect_confirm', function () {

+                target.saveSSID2Action();

+            });

+        };

+

+        target.saveSSID2Action = getSSID2Action;

+

+        //检测wps\最大接入数

+        target.checkSettings = function (ssid) {

+            var status = getWpsState();

+            if (ssid == "ssid1" || ssid == "ssid2") {

+                if (ssid == "ssid2") {

+                    var accessDevice = service.getStatusInfo().ssid2AttachedNum;

+                    if (parseInt(target.m_selectedStation()) < accessDevice) {

+                        showAlert('Extend_accessDevice');

+                        return true;

+                    }

+                } else {

+                    var accessDevice = service.getStatusInfo().ssid1AttachedNum;

+                    if (parseInt(target.selectedStation()) < accessDevice) {

+                        showAlert('Extend_accessDevice');

+                        return true;

+                    }

+                }

+            }

+

+            if (status.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+

+            if (info.multi_ssid_enable == "1" && config.HAS_MULTI_SSID) {

+                if ((ssid == "ssid2" && parseInt(target.m_selectedStation()) + parseInt(info.MAX_Access_num) > info.MAX_Station_num)

+                     || (ssid == "ssid1" && parseInt(target.selectedStation()) + parseInt(info.m_MAX_Access_num) > info.MAX_Station_num)) {

+                    showAlert({

+                        msg: 'multi_ssid_max_access_number_alert',

+                        params: info.MAX_Station_num

+                    });

+                    return true;

+                }

+            }

+

+            return false;

+        };

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            var setSwitch = function () {

+                showLoading('waiting');

+                var params = {};

+                params.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    params.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(params, function (result) {

+                    if (result.result == "success") {

+                        if (viaWifi) {

+                            setTimeout(hasApReloadVarWifi, 15000);

+                        } else {

+                            addInterval(hasApReload, 1000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            };

+

+            function hasApReloadVarWifi() {

+                successOverlay();

+                setTimeout(function () {

+                    window.location.reload();

+                }, 1000);

+                service.refreshAPStationStatus();

+                target.clear();

+            }

+            function hasApReload() {

+                var info = getWifiMain();

+                service.refreshAPStationStatus();

+                if (info.wifi_enable == target.wifi_enable()) {

+                    successOverlay();

+                    target.clear();

+                }

+            }

+

+            var info = service.getStatusInfo();

+            if (config.HAS_MULTI_SSID && target.wifi_enable() == "1") {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!info.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!info.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+        };

+

+        //二维码显示事件

+        target.showQRHandler = function () {

+            var checkbox = $("#showQR:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showQR(true);

+            } else {

+                target.showQR(false);

+            }

+            target.showQRCode(config.WIFI_SUPPORT_QR_CODE && target.showQR());

+        };

+

+        //SSID2

+        target.m_showPasswordHandler = function () {

+            $("#m_passShow").parent().find(".error").hide();

+            var checkbox = $("#m_showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.m_showPassword(true);

+            } else {

+                target.m_showPassword(false);

+            }

+        };

+        target.showPasswordHandler = function () {

+            $("#codeWPAKey").parent().find(".error").hide();

+            $("#pwdWepKey").parent().find(".error").hide();

+            var checkbox = $("#showPassword:checked");

+            if (checkbox && checkbox.length == 0) {

+                target.showPassword(true);

+            } else {

+                target.showPassword(false);

+            }

+        };

+

+        function getSSID2Action() {

+            showLoading('waiting');

+            var params = {};

+            params.m_AuthMode = target.m_selectedMode();

+            params.m_passPhrase = target.m_passPhrase();

+            params.m_SSID = target.m_ssid();

+            params.m_broadcast = target.m_broadcast();

+            params.m_station = target.m_selectedStation();

+            params.m_cipher = target.m_selectedMode() == "WPA2PSK" ? 1 : 2;

+            if (params.m_AuthMode == "WPA3Personal" || params.m_AuthMode == "WPA2WPA3") {

+                params.m_cipher = 1;

+            }

+            params.m_NoForwarding = target.m_apIsolation();

+            params.m_show_qrcode_flag = target.showQR() == true ? 1 : 0;

+            service.setWifiBasic4SSID2(params, function (result) {

+                if (result.result == "success") {

+                    if (viaWifi) {

+                        setTimeout(ssid2ReloadVarWifi, 15000);

+                    } else {

+                        addInterval(ssid2Reload, 1000);

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+        function ssid2ReloadVarWifi() {

+            successOverlay();

+            setTimeout(function () {

+                window.location.reload();

+            }, 1000);

+            target.clear();

+        }

+        function ssid2Reload() {

+            var info = getWifiMain();

+            if (info.wifi_enable == "1") {

+                successOverlay();

+                target.clear();

+            }

+        }

+

+        function getSSID1Action() {

+

+            showLoading('waiting');

+            target.broadcast($("#broadcastCheckbox:checked").length > 0 ? '0' : '1');

+            target.apIsolation($("#apisolatedCheckbox:checked").length);

+            var ciphertext = "";

+            if (config.PASSWORD_ENCODE) {

+	        ciphertext = target.passPhrase();

+	    } else {

+                var kparam = service.getDeviceInfoLow();

+                var tkey = CryptoJS.enc.Latin1.parse(kparam.skey);

+		var tiv = CryptoJS.enc.Latin1.parse(kparam.siv);

+                ciphertext = CryptoJS.AES.encrypt(target.passPhrase(), tkey, {

+                    iv: tiv,

+                    mode: CryptoJS.mode.CBC,

+                    padding: CryptoJS.pad.ZeroPadding

+                    }).toString();

+	    }

+            var params = {};

+            params.AuthMode = target.selectedMode();

+            params.passPhrase = ciphertext;

+            params.SSID = target.ssid();

+            params.broadcast = target.broadcast();

+            params.station = target.selectedStation();

+            params.cipher = target.selectedMode() == "WPA2PSK" ? 1 : 2;

+            if (params.AuthMode == "WPA3Personal" || params.AuthMode == "WPA2WPA3") {

+                params.cipher = 1;

+            }

+            params.NoForwarding = target.apIsolation();

+            params.show_qrcode_flag = target.showQR() == true ? 1 : 0;

+            if (config.WIFI_WEP_SUPPORT) {

+                if (params.AuthMode == "WPAPSK" || params.AuthMode == "WPA2PSK" || params.AuthMode == "WPAPSKWPA2PSK" || params.AuthMode == "WPA3Personal" || params.AuthMode == "WPA2WPA3") {}

+                else if (params.AuthMode == "SHARED") {

+                    params.encryptType = "WEP";

+                } else {

+                    params.encryptType = target.encryptType();

+                }

+                params.wep_default_key = target.keyID();

+                params.wep_key_1 = info.Key1Str1;

+                params.wep_key_2 = info.Key2Str1;

+                params.wep_key_3 = info.Key3Str1;

+                params.wep_key_4 = info.Key4Str1;

+                var WEPSelect = '0';

+                if (target.wepPassword().length == '5' || target.wepPassword().length == '13') {

+                    WEPSelect = '1';

+                } else {

+                    WEPSelect = '0';

+                }

+                if (target.keyID() == '3') {

+                    params.wep_key_4 = target.wepPassword();

+                    params.WEP4Select = WEPSelect;

+                } else if (target.keyID() == '2') {

+                    params.wep_key_3 = target.wepPassword();

+                    params.WEP3Select = WEPSelect;

+                } else if (target.keyID() == '1') {

+                    params.wep_key_2 = target.wepPassword();

+                    params.WEP2Select = WEPSelect;

+                } else {

+                    params.wep_key_1 = target.wepPassword();

+                    params.WEP1Select = WEPSelect;

+                }

+            }

+

+            service.setWifiBasic(params, function (result) {

+                if (result.result == "success") {

+                    if (viaWifi) {

+                        setTimeout(ssid1ReloadVarWifi, 15000);

+                    } else {

+                        addInterval(ssid1Reload, 1000);

+                    }

+                } else {

+                    errorOverlay();

+                }

+            });

+        }

+        function ssid1ReloadVarWifi() {

+            successOverlay();

+            setTimeout(function () {

+                window.location.reload();

+            }, 1000);

+            target.clear();

+        }

+        function ssid1Reload() {

+            var info = getWifiMain();

+            if (info.wifi_enable == "1") {

+                successOverlay();

+                target.clear();

+            }

+        }

+

+    }

+

+    function getWpsState() {

+        return service.getWpsInfo();

+    }

+

+    function getWifiMain() {

+        return service.getWifiBasic();

+    }

+

+    function initialize() {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        var vm = new WifiMainVM();

+        ko.applyBindings(vm, container[0]);

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+

+        if (config.WDS_SUPPORT) {

+            checkWifiStatusAccordingToWDS();

+        } else if (config.AP_STATION_SUPPORT) {

+            checkWifiStatus();

+        }

+

+        $('#frmSSID1').validate({

+            submitHandler: function () {

+                vm.saveSSID1();

+            },

+            rules: {

+                ssid: 'ssid',

+                pwdWepKey: {

+                    wifi_wep_password_check: true,

+                    wifi_password_check: true

+                },

+                txtWepKey: {

+                    wifi_wep_password_check: true,

+                    wifi_password_check: true

+                },

+                codeWPAKey: 'wifi_password_check',

+                txtWPAKey: 'wifi_password_check'

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "codeWPAKey" || id == "txtWPAKey") {

+                    error.insertAfter("#lblshowWPAPassword");

+                } else if (id == "pwdWepKey" || id == "txtWepKey") {

+                    error.insertAfter("#lblShowWepPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+        $('#frmSSID2').validate({

+            submitHandler: function () {

+                vm.saveSSID2();

+            },

+            rules: {

+                m_ssid: 'ssid',

+                m_pass: 'wifi_password_check',

+                m_passShow: 'wifi_password_check'

+            },

+            errorPlacement: function (error, element) {

+                var id = element.attr("id");

+                if (id == "m_pass" || id == "m_passShow") {

+                    error.insertAfter("#m_lblShowPassword");

+                } else if (id == "pass" || id == "passShow") {

+                    error.insertAfter("#lblShowPassword");

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+        //表单提交函数、校验规则配置

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+

+        $('#frmMultiSSID').validate({

+            submitHandler: function () {

+                vm.setMultiSSIDSwitch();

+            }

+        });

+

+    }

+

+    function checkWifiStatusAccordingToWDS() {

+        var info = service.getWdsInfo();

+        if (info.currentMode == "0") {

+            $('#frmWifiSwitch :input').each(function () {

+                $(this).prop("disabled", false);

+            });

+            $('#frmSSID1 :input').each(function () {

+                $(this).prop("disabled", false);

+            });

+            $('#frmSSID2 :input').each(function () {

+                $(this).prop("disabled", false);

+            });

+        } else {

+            $('#frmWifiSwitch :input').each(function () {

+                $(this).prop("disabled", true);

+            });

+            $('#frmSSID1 :input').each(function () {

+                $(this).prop("disabled", true);

+            });

+            $('#frmSSID2 :input').each(function () {

+                $(this).prop("disabled", true);

+            });

+        }

+    }

+    function checkWifiStatus() {

+        var info = service.getAPStationBasic();

+        if (info.ap_station_enable == "1") {

+            $('#frmMultiSSID :input').each(function () {

+                $(this).prop("disabled", true);

+            });

+        } else {

+            $('#frmMultiSSID :input').each(function () {

+                $(this).prop("disabled", false);

+            });

+        }

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_sleep_mode","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    //休眠方式

+    function getSleepMode() {

+        return service.getSleepMode();

+    }

+

+    //覆盖范围

+    function getWifiRange() {

+        return service.getWifiRange();

+    }

+

+    var wifiSleepTime = _.map(config.WIFI_SLEEP_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    var sleepTime = _.map(config.SLEEP_MODES, function (item) {

+        return new Option(item.name, item.value);

+    });

+

+    function SleepModeViewMode() {

+        var target = this;

+

+        target.isCPE = config.PRODUCT_TYPE == 'CPE';

+        target.showTSWDiv = config.TSW_SUPPORT;

+        target.showSleepDiv = config.WIFI_SLEEP_SUPPORT;

+        target.hasUssd = config.HAS_USSD;

+        target.hasUpdateCheck = config.HAS_UPDATE_CHECK;

+        target.hasDdns = config.DDNS_SUPPORT;

+

+        target.option = ko.observableArray(wifiSleepTime);

+        target.modes = ko.observableArray(sleepTime);

+

+        var smInfo = getSleepMode();

+        target.wifiSleepedMode = ko.observable(smInfo.wifiSleepMode);

+        target.selectedMode = ko.observable(smInfo.sleepMode);

+

+        var wifiRangeInfo = getWifiRange();

+        target.wifiRangeMode = ko.observable(wifiRangeInfo.wifiRangeMode);

+

+        target.setWifiRange = smSetWifiRange;

+

+        target.setWifiRangeAct = smSetWifiRangeAct;

+

+        target.setSleepMode = smSetSleepMode;

+

+        target.setSleepModeAct = smSetSleepModeAct;

+

+        var tsw = service.getTsw();

+        target.openEnable = ko.observable(tsw.openEnable == "" ? '0' : tsw.openEnable);

+        target.openH = ko.observable(tsw.openH);

+        target.openM = ko.observable(tsw.openM);

+        target.closeH = ko.observable(tsw.closeH);

+        target.closeM = ko.observable(tsw.closeM);

+        //定时休眠唤醒

+        target.saveTsw = smSaveTsw;

+

+        function smSetWifiRange() {

+            service.getWpsInfo({}, function (smInfo) {

+                if (smInfo.wpsFlag == '1') {

+                    showAlert('wps_on_info', function() {

+                        window.location.reload();

+                    });

+                } else if (smInfo.radioFlag == '0') {

+                    showAlert('wps_wifi_off');

+                } else {

+                    showConfirm('wifi_sleep_confirm', function () {

+                        showLoading('waiting');

+                        target.setWifiRangeAct();

+                    });

+

+                }

+            });

+        }

+        function smSetSleepModeAct() {

+            var params = {};

+            params.wifiSleepMode = target.wifiSleepedMode();

+            params.sleepMode = target.selectedMode();

+            service.setSleepMode(params, function (result) {

+                if (result.result != "success") {

+                    errorOverlay();

+                } else {

+                    successOverlay();

+                }

+            });

+        }

+

+        function smSetWifiRangeAct() {

+            var params = {};

+            params.wifiRangeMode = target.wifiRangeMode();

+            service.setWifiRange(params, function (result) {

+                if (result.result != "success") {

+                    errorOverlay();

+                } else {

+                    successOverlay();

+                }

+            });

+        }

+

+        function smSetSleepMode() {

+            showLoading('waiting');

+            service.getWpsInfo({}, function (info) {

+                if (info.wpsFlag == '1') {

+                    showAlert('wps_on_info', function() {

+                        window.location.reload();

+                    });

+                } else if (info.radioFlag == '0') {

+                    showAlert('wps_wifi_off');

+                } else {

+                    target.setSleepModeAct();

+                }

+            });

+        }

+        function smSaveTsw() {

+            if (target.openEnable() == '1') {

+                if (Math.abs((target.openH() * 60 + parseInt(target.openM(), 10)) - (target.closeH() * 60 + parseInt(target.closeM(), 10))) < 10) {

+                    showAlert('tsw_time_interval_alert');

+                    return false;

+                }

+                showLoading('waiting');

+                service.saveTsw({

+                    openEnable: target.openEnable(),

+                    closeEnable: target.openEnable(),

+                    openTime: leftInsert(target.openH(), 2, '0') + ':' + leftInsert(target.openM(), 2, '0'),

+                    closeTime: leftInsert(target.closeH(), 2, '0') + ':' + leftInsert(target.closeM(), 2, '0')

+                }, smShowRes, $.noop);

+            } else {

+                showLoading('waiting');

+                service.saveTsw({

+                    openEnable: target.openEnable(),

+                    closeEnable: target.openEnable()

+                }, smShowRes, $.noop);

+            }

+

+        }

+

+    }

+    function bindContainer(smVm) {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(smVm, container[0]);

+

+        $('#frmTsw').validate({

+            submitHandler: function () {

+                smVm.saveTsw();

+            },

+            errorPlacement: function (error, element) {

+                if (element.attr("name") == "closeM" || element.attr("name") == "closeH") {

+                    $("#closeErrorDiv").html(error);

+                } else if (element.attr("name") == "openM" || element.attr("name") == "openH") {

+                    $("#openErrorDiv").html(error);

+                } else {

+                    error.insertAfter(element);

+                }

+            }

+        });

+

+        $('#sleepModeForm').validate({

+            submitHandler: function () {

+                smVm.setSleepMode();

+            }

+        });

+

+        $('#wifiRangeForm').validate({

+            submitHandler: function () {

+                smVm.setWifiRange();

+            }

+        });

+

+    }

+    function initialize() {

+        var smVm = new SleepModeViewMode();

+        bindContainer(smVm);

+    }

+    function smShowRes(data) {

+        if (data && data.result == "success") {

+            successOverlay();

+        } else {

+            errorOverlay();

+        }

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_station_info","underscore jquery knockout set service menu".split(" "),

+    function (_, $, ko, config, service, menu) {

+

+    var stationUtil = {

+        dealElement: function (showEdit, idx) {

+            if (idx != "all") {

+                if (!showEdit) {

+                    $("#edit_btn_" + idx + ",#hostname_txt_" + idx).show();

+                    $("#save_btn_" + idx + ",#cancel_btn_" + idx + ",#hostname_input_" + idx).hide();

+                } else {

+                    $("#edit_btn_" + idx + ",#hostname_txt_" + idx).hide();

+                    $("#save_btn_" + idx + ",#cancel_btn_" + idx + ",#hostname_input_" + idx).show();

+                }

+            } else {

+                $("input[id^='hostname_txt_'],a[id^='edit_btn_']").show();

+                $("input[id^='hostname_input_'],a[id^='cancel_btn_'],a[id^='save_btn_']").hide();

+            }

+        },

+        //根据MAC匹配主机名

+        getHostName: function (hostName, mac, hostNameList) {

+            var element_data = _.find(hostNameList, function (element_data) {

+                return element_data.mac == mac;

+            });

+            return element_data ? element_data.hostname : hostName;

+        },

+        //匹配黑名单列表和主机名

+        parseBlackString: function (macStr, hostnameStr) {

+            if (macStr == "") {

+                return [];

+            }

+            var tempMac = macStr.split(';');

+            var tempHostName = hostnameStr.split(';');

+            var result = [];

+            for (var i = 0; i < tempMac.length; i++) {

+                //var obj = {};

+                //obj.hostName = tempHostName[i];

+                //obj.macAddress = tempMac[i];

+                result.push({

+                    hostName: tempHostName[i],

+                    macAddress: tempMac[i]

+                });

+            }

+            return result;

+        }

+    };

+

+    function staInfoViewMode() {

+        var target = this;

+        var originalData = {

+            user_ip: '',

+            macList: '',

+            ACL_mode: 2, //黑白名单

+            hostnameList: ''

+        };

+        target.showCableDiv = config.PRODUCT_TYPE == 'CPE' && config.RJ45_SUPPORT;

+        target.supportBlock = config.STATION_BLOCK_SUPPORT;

+        var pcMenu = menu.findMenu('#parental_control');

+        target.showPCLink = pcMenu && pcMenu.length > 0 && config.HAS_PARENTAL_CONTROL;

+

+        target.deviceInfo = ko.observableArray([]);

+        target.cableDeviceInfo = ko.observableArray([]);

+        target.blackDevices = ko.observableArray([]);

+        target.blackDevicesMac = ko.computed(function () {

+            return _.map(target.blackDevices(), function (element_data) {

+                return element_data.macAddress;

+            });

+        });

+        target.showBlackDiv = ko.observable(config.HAS_BLACK_AND_WHITE_FILTER ? (originalData.ACL_mode == '2' ? true : false) : config.STATION_BLOCK_SUPPORT);

+

+        ko.computed(function () {

+            target.deviceInfo();

+            target.cableDeviceInfo();

+            target.blackDevices();

+            $("#station_info_div").translate();

+        }).extend({

+            notify: 'always',

+            throttle: 300

+        });

+

+        var hostNameList = service.getHostNameList({}).devices;

+        //获取WiFi已连接设备

+        target.fetchAttachedDevices = function (cb) {

+            service.getCurrentlyAttachedDevicesInfo({}, function (data) {

+                if (editingHostname) {

+                    return false;

+                }

+                target.deviceInfo(_.map(data.attachedDevices, function (element_data, idx) {

+                        element_data.idx = _.uniqueId('wireless_');

+                        element_data.type = 1;

+                        element_data.inBlackGroup = config.HAS_BLACK_AND_WHITE_FILTER && originalData.ACL_mode != '2' ? false : _.contains(target.blackDevicesMac(), element_data.macAddress);

+                        element_data.hostName = stationUtil.getHostName(element_data.hostName, element_data.macAddress, hostNameList);

+                        element_data.disableFlag = (config.HAS_BLACK_AND_WHITE_FILTER && originalData.ACL_mode != '2') || element_data.inBlackGroup || editingHostname;

+                        return element_data;

+                    }));

+                if (_.isFunction(cb)) {

+                    cb.apply(this);

+                }

+            });

+        };

+        //获取RJ45已连接设备

+        target.fetchAttachedCableDevices = function (cb) {

+            service.getAttachedCableDevices({}, function (data) {

+                if (editingHostname) {

+                    return false;

+                }

+                target.cableDeviceInfo(_.map(data.attachedDevices, function (element_data, idx) {

+                        element_data.idx = _.uniqueId('cable_');

+                        element_data.hostName = stationUtil.getHostName(element_data.hostName, element_data.macAddress, hostNameList);

+                        element_data.type = 2;

+                        return element_data;

+                    }));

+                if (_.isFunction(cb)) {

+                    cb.apply(this);

+                }

+            });

+        };

+

+        target.fetchBlacklist = function (cb) {

+            service.getMacFilterInfo({}, function (data) {

+                originalData.ACL_mode = data.ACL_mode;

+                originalData.user_ip = data.user_ip_addr;

+                originalData.hostnameList = data.wifi_hostname_black_list;

+                originalData.macList = data.wifi_mac_black_list;

+                target.showBlackDiv(config.HAS_BLACK_AND_WHITE_FILTER ? (originalData.ACL_mode == '2' ? true : false) : config.STATION_BLOCK_SUPPORT);

+                var blackDevices = stationUtil.parseBlackString(data.wifi_mac_black_list, data.wifi_hostname_black_list);

+                target.blackDevices(_.map(blackDevices, function (element_data, idx) {

+                        element_data.idx = _.uniqueId('black_');

+                        element_data.type = 3;

+                        element_data.hostName = stationUtil.getHostName(element_data.hostName, element_data.macAddress, hostNameList);

+                        return element_data;

+                    }));

+                if (_.isFunction(cb)) {

+                    cb.apply(this);

+                }

+            }, $.noop);

+        };

+        target.fetchBlacklist();

+        target.fetchAttachedDevices();

+        if (target.showCableDiv) {

+            target.fetchAttachedCableDevices();

+        }

+

+        var editingHostname = 0;

+        addInterval(function () {

+            if (editingHostname == 0) {

+                target.fetchAttachedDevices();

+            }

+        }, 3000);

+

+        if (target.showCableDiv) {

+            addInterval(function () {

+                if (editingHostname == 0) {

+                    target.fetchAttachedCableDevices();

+                }

+            }, 5000);

+        }

+        //WiFi已连接设备列表中屏蔽按钮事件 入黑名单

+        target.wirelessBlockHandler = stationBlockEvent;

+        //保存主机名事件

+        target.saveHostNameHandler = saveHostNameEvent;

+        //主机名修改按钮点击事件

+        target.editHostNameHandler = function (element_data) {

+            editingHostname++;

+            $("#hostname_input_" + element_data.idx).val(element_data.hostName);

+            stationUtil.dealElement(true, element_data.idx);

+            return false;

+        };

+        //取消编辑主机名事件

+        target.cancelEditHostNameHandler = function (element_data) {

+            stationUtil.dealElement(false, element_data.idx);

+            editingHostname--;

+        };

+        target.cancelAllEditHostNameHandler = function () {

+            stationUtil.dealElement(false, "all");

+            editingHostname = 0;

+        };

+        //从黑名单列表中移除

+        target.blacklistRemoveHandler = function (element_data) {

+            if (originalData.macList.indexOf(element_data.macAddress) == -1) {

+                return false;

+            }

+            if (editingHostname) {

+                target.cancelAllEditHostNameHandler();

+            }

+            showLoading('waiting');

+            var macArr = [];

+            var hostnameArr = [];

+            $.each(target.blackDevices(), function (i, n) {

+                if (n.macAddress != element_data.macAddress) {

+                    macArr.push(n.macAddress);

+                    hostnameArr.push(n.hostName);

+                }

+            });

+            var params = {

+                ACL_mode: '2', //originalData.ACL_mode

+                macFilteringMode: '2', //originalData.ACL_mode

+                wifi_hostname_black_list: hostnameArr.join(';'),

+                wifi_mac_black_list: macArr.join(';')

+            };

+            target.updateMacFilterList(params);

+        };

+        target.updateMacFilterList = function (params) {

+            service.setMacFilter(params, function (data) {

+                if (data.result == "success") {

+                    target.blackDevices([]);

+                    target.fetchBlacklist(function () {

+                        target.fetchAttachedDevices(function () {

+                            successOverlay();

+                        });

+                    });

+                }

+            }, function () {

+                errorOverlay();

+            });

+        };

+

+        function saveHostNameEvent(element_data) {

+            var $input = $("#hostname_input_" + element_data.idx);

+            var newHostname = $input.val();

+            if (newHostname.indexOf(" ") == 0 || newHostname.lastIndexOf(" ") == (newHostname.length - 1) || /[\*\$\[&:,;<>'"\\`\]¥]{1,32}/.test(newHostname)) {

+                showAlert('device_rename');

+                return false;

+            } else if (newHostname == '') {

+                $(".promptErrorLabel", "#confirm-message-container").text($.i18n.prop("required"));

+                var $closestTD = $input.closest('td').addClass('has-error');

+                addTimeout(function () {

+                    $closestTD.removeClass('has-error');

+                }, 5000);

+                showAlert('required');

+                return false;

+            }

+            showLoading('waiting');

+            element_data.hostName = newHostname;

+            service.editHostName({

+                hostname: element_data.hostName,

+                mac: element_data.macAddress

+            }, function () {

+                editingHostname = 0;

+                service.getHostNameList({}, function (data) {

+                    hostNameList = data.devices;

+                    if (element_data.type == 3) {

+                        target.fetchBlacklist(function () {

+                            hideLoading();

+                            successOverlay();

+                        });

+                    } else if (element_data.type == 2) {

+                        target.fetchAttachedCableDevices(function () {

+                            hideLoading();

+                            successOverlay();

+                        });

+                    } else if (element_data.type == 1) {

+                        target.fetchAttachedDevices(function () {

+                            hideLoading();

+                            successOverlay();

+                        });

+                    }

+                });

+            }, function () {

+                errorOverlay();

+            });

+        }

+

+        function stationBlockEvent(element_data) {

+            if (config.HAS_BLACK_AND_WHITE_FILTER && originalData.ACL_mode != '2') {

+                return false;

+            }

+            if (originalData.macList.split(';').length == 10) {

+                showAlert('black_list_max');

+                return false;

+            }

+            if (originalData.macList.indexOf(element_data.macAddress) != -1) {

+                return false;

+            }

+            if (element_data.ipAddress == originalData.user_ip) {

+                showAlert('black_yourself_tip');

+                return false;

+            }

+            if (editingHostname) {

+                target.cancelAllEditHostNameHandler();

+            }

+            showLoading('waiting');

+            var newHostnameList = originalData.hostnameList == '' ? element_data.hostName : element_data.hostName + ';' + originalData.hostnameList;

+            var newMacList = originalData.macList == '' ? element_data.macAddress : element_data.macAddress + ';' + originalData.macList;

+            var params = {

+                ACL_mode: '2',

+                wifi_hostname_black_list: newHostnameList,

+                wifi_mac_black_list: newMacList

+            };

+            target.updateMacFilterList(params);

+        }

+

+    }

+

+    function bindContainer(ws_vm) {

+        var container = $('#container')[0];

+        ko.cleanNode(container);

+        ko.applyBindings(ws_vm, container);

+    }

+    function initialize() {

+        var ws_vm = new staInfoViewMode();

+        bindContainer(ws_vm);

+    }

+

+    return {

+        init: initialize

+    };

+});

+

+define("wifi_wps","underscore jquery knockout set service".split(" "),

+    function (_, $, ko, config, service) {

+

+    var viaWifi = false;

+

+    function WpsViewMode() {

+        var target = this;

+        target.hasMultiSSID = config.HAS_MULTI_SSID;

+        target.hasAPStation = config.AP_STATION_SUPPORT;

+        target.hasWifiSwitch = config.WIFI_SWITCH_SUPPORT;

+        target.hasWlanMacfilter = config.HAS_BLACK_AND_WHITE_FILTER;

+

+        target.wpsType = ko.observable('');

+        target.wpsPin = ko.observable('');

+

+        var state = getWpsState();

+        target.origin_ap_station_enable = state.ap_station_enable;

+

+        target.wpsFlag = ko.observable(state.wpsFlag);

+        target.authMode = ko.observable(state.authMode);

+

+        target.radioFlag = ko.observable(state.radioFlag);

+        target.encrypType = ko.observable(state.encrypType);

+

+        target.mulOption = ko.observable(paintSSIDOption(state));

+        target.wpsSSID = ko.observable(getSSIDCurrWps(state));

+

+        var infoBasic = service.getWifiBasic();

+        target.wifi_enable = ko.observable(infoBasic.wifi_enable);

+

+        target.isShowSSIDInfoDiv = ko.observable(false);

+        if (config.WIFI_SWITCH_SUPPORT) { //软开关

+            if (infoBasic.wifi_enable == "1") {

+                target.isShowSSIDInfoDiv(true);

+            } else {

+                target.isShowSSIDInfoDiv(false);

+            }

+        } else {

+            target.isShowSSIDInfoDiv(true);

+        }

+        target.multi_ssid_enable = ko.observable(infoBasic.multi_ssid_enable);

+        target.origin_multi_ssid_enable = infoBasic.multi_ssid_enable;

+

+        target.save = wpa_save;

+

+        // if (state.wpsFlag != '0') {

+        //     target.wpsType(state.wpsType == 'PIN' ? 'PIN' : 'PBC');

+        // } else {

+        //     target.wpsType('');

+        // }

+            target.wpsType(state.wpsType == 'PIN' ? 'PIN' : 'PBC');

+

+        target.setMultiSSIDSwitch = function () {

+            if (target.checkSettings("switch")) {

+                return;

+            }

+

+            function wpsSetSwitch() {

+                showLoading('waiting');

+                var wps_param = {};

+                wps_param.m_ssid_enable = target.multi_ssid_enable();

+                if (config.WIFI_SWITCH_SUPPORT) {

+                    wps_param.wifiEnabled = target.wifi_enable();

+                }

+                service.setWifiBasicMultiSSIDSwitch(wps_param, function (result) {

+                    if (result.result == "success") {

+                        if (!viaWifi) {

+                            addInterval(wpsReload, 1000);

+                        } else {

+                            setTimeout(wpsReloadViaWifi, 15000);

+                        }

+                    } else {

+                        errorOverlay();

+                    }

+                });

+            }

+

+            var setSwitch = wpsSetSwitch;

+            var state = service.getStatusInfo();

+            if (target.wifi_enable() == "1" && config.HAS_MULTI_SSID) {

+                if (target.multi_ssid_enable() == "1" && config.AP_STATION_SUPPORT && target.origin_ap_station_enable == "1") {

+                    if (!state.wifiStatus) {

+                        showConfirm("multi_ssid_enable_confirm", function () {

+                            setSwitch();

+                        });

+                    } else {

+                        showConfirm("multi_ssid_enable_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                } else {

+                    if (!state.wifiStatus) {

+                        setSwitch();

+                    } else {

+                        showConfirm("wifi_disconnect_confirm2", function () {

+                            setSwitch();

+                        });

+                    }

+                }

+            } else {

+                setSwitch();

+            }

+

+            function wpsReload() {

+                var state = service.getWifiBasic();

+                if (state.wifi_enable == target.wifi_enable()) {

+                    successOverlay();

+                    clearTimer();

+                    clearValidateMsg();

+                    service.refreshAPStationStatus();

+                    initialize();

+                }

+            }

+            function wpsReloadViaWifi() {

+                successOverlay();

+                setTimeout(function () {

+                    window.location.reload();

+                }, 1000);

+                clearTimer();

+                clearValidateMsg();

+                service.refreshAPStationStatus();

+                initialize();

+            }

+

+        };

+

+        target.checkSettings = function (ssid) {

+            var state = getWpsState();

+            if (state.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+            return false;

+        };

+

+        function wpa_save() {

+            var state = getWpsState();

+

+            if (state.radioFlag == '0') {

+                showAlert('wps_wifi_off');

+                return;

+            }

+

+            if (state.wpsFlag == '1') {

+                showAlert('wps_on_info', function() {

+                    window.location.reload();

+                });

+                return true;

+            }

+

+            if (target.wpsSSID() == "SSID1") {

+                var res = (state.AuthMode == "OPEN" && state.encrypType == "WEP")

+                 || (state.AuthMode == "SHARED" && state.encrypType == "WEP")

+                 || (state.AuthMode == "WPAPSK" && state.encrypType == "TKIP")

+                 || (state.AuthMode == "WPAPSK" && state.encrypType == "TKIPCCMP")

+                 || (state.AuthMode == "WPAPSK" && state.encrypType == "AES")

+                 || (state.AuthMode == "WPA2PSK" && state.encrypType == "TKIP")

+                 || (state.AuthMode == "WPAPSKWPA2PSK" && state.encrypType == "TKIP")

+                 || (state.AuthMode == "WPA3Personal")

+                 || (state.AuthMode == "WPA2WPA3");

+                if (res) {

+                    showAlert('wps_auth_open');

+                    return;

+                }

+            } else {

+                var resm = (state.m_AuthMode == "OPEN" && state.m_encrypType == "WEP")

+                 || (state.m_AuthMode == "SHARED" && state.m_encrypType == "WEP")

+                 || (state.m_AuthMode == "WPAPSK" && state.m_encrypType == "TKIP")

+                 || (state.m_AuthMode == "WPAPSK" && state.m_encrypType == "TKIPCCMP")

+                 || (state.m_AuthMode == "WPAPSK" && state.m_encrypType == "AES")

+                 || (state.m_AuthMode == "WPA2PSK" && state.m_encrypType == "TKIP")

+                 || (state.m_AuthMode == "WPAPSKWPA2PSK" && state.m_encrypType == "TKIP")

+                 || (state.m_AuthMode == "WPA3Personal")

+                 || (state.m_AuthMode == "WPA2WPA3");

+                if (resm) {

+                    showAlert('wps_auth_open');

+                    return;

+                }

+            }

+

+            var wpsSSID;

+            var wpsIndex;

+            if (target.wpsSSID() != "SSID1") {

+                wpsSSID = state.multiSSID;

+                wpsIndex = 2;

+            } else {

+                wpsSSID = state.ssid;

+                wpsIndex = 1;

+            }

+

+            var basic = service.getWifiBasic();

+            if (wpsSSID == basic.m_SSID && wpsIndex == 2) {

+                if (basic.m_broadcast == '1') {

+                    showAlert('wps_ssid_broadcast_disable');

+                    return;

+                }

+            } else if (wpsSSID == basic.SSID && wpsIndex == 1) {

+                if (basic.broadcast == '1') {

+                    showAlert('wps_ssid_broadcast_disable');

+                    return;

+                }

+            }

+

+            showLoading('waiting');

+            var wps_param = {};

+            wps_param.wpsType = target.wpsType();

+            wps_param.wpsSSID = wpsSSID;

+            wps_param.wpsIndex = wpsIndex;

+            wps_param.wpsPin = getWpsPin(target.wpsPin());

+

+            service.openWps(wps_param, function (result) {

+                if (result.result != "success") {

+                    errorOverlay();

+                } else {

+                    target.wpsPin('');

+                    clearValidateMsg();

+                    successOverlay();

+                }

+            });

+        }

+

+    }

+

+    function getWpsPin(value) {

+        if (value.length != 9) {

+            return value;

+        } else {

+            return value.substring(0, 4) + value.substring(5);

+        }

+    }

+

+    function getWpsState() {

+        return service.getWpsInfo();

+    }

+

+    function paintSSIDOption(info) {

+        var show_opt = [];

+        show_opt.push(new Option(info.ssid, "SSID1"));

+        if (info.ssidEnable == "1") {

+            show_opt.push(new Option(info.multiSSID, "SSID2"));

+        }

+        return show_opt;

+    }

+

+    //检查当前是否通过wifi登录webui

+    function checkAccessMode() {

+        service.getParams({

+            nv: 'user_ip_addr'

+        }, function (dataIp) {

+            service.getParams({

+                nv: 'station_list'

+            }, function (dataList) {

+                viaWifi = isWifiConnected(dataIp.user_ip_addr, dataList.station_list);

+            });

+        });

+    }

+    function bindContainer(wpsVm) {

+        var container = $('#container');

+        ko.cleanNode(container[0]);

+        ko.applyBindings(wpsVm, container[0]);

+

+        addTimeout(function () {

+            checkAccessMode();

+        }, 600);

+

+        $('#wpsForm').validate({

+            submitHandler: function () {

+                wpsVm.save();

+            },

+            rules: {

+                txtPin: {

+                    "wps_pin_validator": true

+                }

+            }

+        });

+

+        $('#frmWifiSwitch').validate({

+            submitHandler: function () {

+                wpsVm.setMultiSSIDSwitch();

+            }

+        });

+    }

+    function getSSIDCurrWps(info) {

+        if (info.ssid != info.multiSSID) {

+            return info.wpsSSID == info.multiSSID ? "SSID2" : "SSID1";

+        } else {

+            if (info.wifi_wps_index == '2') {

+                return "SSID2";

+            } else {

+                return "SSID1";

+            }

+        }

+    }

+    //视图初始化

+    function initialize() {

+        var wpsVm = new WpsViewMode();

+        bindContainer(wpsVm);

+    }

+

+    return {

+        init: initialize

+    };

+});

+

diff --git a/lynq/MD310EU/ap/app/zte_webui/makefile b/lynq/MD310EU/ap/app/zte_webui/makefile
new file mode 100755
index 0000000..2caeab6
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/makefile
@@ -0,0 +1,61 @@
+include $(zte_app_mak)

+

+all:

+	echo "zte_webui compile do nothing"

+

+clean:

+	echo "zte_webui clean do nothing"

+

+romfs:

+	@mkdir -p $(ROOTFS_DIR)/etc_ro/web

+	@cp -afvp $(APP_DIR)/zte_webui/*   $(ROOTFS_DIR)/etc_ro/web

+	find . -type f -name '*.js' | xargs -n1 -I {} java -jar $(YUICOMPRESSOR)  {} -o  $(ROOTFS_DIR)/etc_ro/web/{}

+	find . -type f -name '*.css' | xargs -n1 -I {} java -jar $(YUICOMPRESSOR)  {} -o  $(ROOTFS_DIR)/etc_ro/web/{}

+	find . -type f -name '*.html' | xargs -n1 -I {} sed -i 's/^[ \t]*//g' $(ROOTFS_DIR)/etc_ro/web/{}

+	find . -type f -name '*.html' | xargs -n1 -I {} sed -i 's/[ \t]*$$//g' $(ROOTFS_DIR)/etc_ro/web/{}

+	find . -type f -name '*.html' | xargs -n1 -I {} sed -i ":a;N;s/\r//g;ta" $(ROOTFS_DIR)/etc_ro/web/{}

+	find . -type f -name '*.html' | xargs -n1 -I {} sed -i ":a;N;s/\n//g;ta" $(ROOTFS_DIR)/etc_ro/web/{}

+ifeq ($(CONFIG_WEBUI_TYPE),CPE)

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+	-cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_cpe.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+endif

+ifeq ($(CONFIG_WEBUI_TYPE),CPE_SW)	

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+	-cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_cpe_sw.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+endif

+

+

+

+ifeq ($(PRJ_IS_MIN), yes)

+	-cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_min.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+ifeq ($(CONFIG_WIFI_MODULE), xr819)

+	-cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_xr819.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+endif

+ifeq ($(CONFIG_WIFI_MODULE), ssv6x5x)

+	-cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_ssv6x5x.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+endif

+endif

+ifeq ($(CONFIG_WIFI_MODULE), aic8800)

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+	-cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_aic8800.js $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+endif

+

+ifneq ($(CONFIG_USE_WEBUI_SECURITY),yes)

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/3rd/crypto-js.js

+	-cp -v $(ROOTFS_DIR)/etc_ro/web/js/ext/crypto-js-null.js $(ROOTFS_DIR)/etc_ro/web/js/3rd/crypto-js.js

+	-sed -i 's/PASSWORD_ENCODE:false,//' $(ROOTFS_DIR)/etc_ro/web/js/ext/set.js

+endif

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/crypto-js-null.js

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_min.js

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_xr819.js

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_ssv6x5x.js

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_aic8800.js

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_cpe.js

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/js/ext/set_cpe_sw.js

+	-rm -v $(ROOTFS_DIR)/etc_ro/web/makefile

+ifeq ($(CONFIG_USE_WEBUI_ZIP),yes)

+	(cd $(ROOTFS_DIR)/etc_ro && zip -r web.zip web)

+	(cd $(ROOTFS_DIR)/etc_ro && rm -rfv web)

+endif

+

+	

diff --git a/lynq/MD310EU/ap/app/zte_webui/pic/res_logo_web.png b/lynq/MD310EU/ap/app/zte_webui/pic/res_logo_web.png
new file mode 100755
index 0000000..659b3d5
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/pic/res_logo_web.png
Binary files differ
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/adm_lan.html b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_lan.html
new file mode 100755
index 0000000..5b6b28b
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_lan.html
@@ -0,0 +1,107 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='advanced_settings'></h1>

+            </div>

+        </div>

+    </div>

+<div class="row">

+<div class="col-xs-2">

+    <div class="nav_right">

+		<ul>

+			<li><a href="#wlan_sleep" data-trans="sleep_mode"></a></li>

+			<li class="active"><a href="#route_set" data-trans="router_setting"></a></li>

+			<li><a href="#filter_main" data-trans="firewall"></a></li>

+			<li data-bind="visible:hasUpdateCheck"><a href="#fota" data-trans="update_settings"></a></li>

+			<!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->

+			<li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>

+			<li><a href="#more" data-trans="others"></a></li>

+		</ul>

+	</div>

+</div>

+

+<div class="col-xs-10">

+<form id="frmLan" role="form">

+    <h3 class="form-title" data-trans="router_setting"></h3>

+    <div class="form-body margin-top-20">

+        <div class="content">

+            <div class="row form-group">

+                <label data-trans="ip_address" for="txtIpAddress" class="col-xs-4 side-right"></label>

+                <div class="col-xs-3">

+                    <input id="txtIpAddress" name="txtIpAddress" data-bind="value: ipAddress" maxlength="15" type="text" class="required form-control"/>

+                </div>

+            </div>

+            <div class="row form-group">

+                <label data-trans="subnet_mask" for="txtSubnetMask" class="col-xs-4 side-right"></label>

+                <div class="col-xs-3">

+                <input id="txtSubnetMask" name="txtSubnetMask" data-bind="value: subnetMask" maxlength="15"  type="text" class="required form-control"/>

+                </div>

+            </div>

+            <div class="row form-group" data-bind="visible: showMacAddress() && hasWifi()">

+                <label data-trans="mac_address" class="col-xs-4 side-right"></label>

+                <div class="col-xs-3">

+                <label id="txtMacAddress" data-bind="text: macAddress" class="label-content"></label>

+                </div>

+            </div>

+            <div class="row form-group">

+                <label class="col-xs-4 side-right" data-trans="dhcp_server"></label>

+                <div class="col-xs-8">

+                    <div class="row">

+                        <div class="col-xs-3">

+                            <input id="dhcpEnable" name="dhcpServer" data-bind="checked: dhcpServer,click: dhcpServerHandler" type="radio" value="1"/>

+                            <label data-trans="enable" for="dhcpEnable"></label>

+                        </div>

+                        <div class="col-xs-3">

+                            <input id="dhcpDisable" name="dhcpServer" data-bind="checked: dhcpServer,click: dhcpServerHandler" type="radio" value="0"/>

+                            <label data-trans="disable" for="dhcpDisable"></label>

+                        </div>

+                    </div>

+                </div>

+            </div>

+            <div data-bind='visible: dhcpServer() == "1"'>

+                <div class="row form-group">

+                    <label data-trans='dhcp_ip_pool' for="txtDhcpIpPoolStart" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-8 form-inline">

+                        <input id='txtDhcpIpPoolStart' name="txtDhcpIpPoolStart" data-bind="value: dhcpStart" maxlength="15" type="text" class="required rangeInput form-control"/>

+                        -

+                        <input id='txtDhcpIpPoolEnd' name="txtDhcpIpPoolEnd" data-bind="value: dhcpEnd" maxlength="15" type="text" class="required rangeInput form-control"/>

+                    </div>

+                </div>

+                <div class="row form-group">

+                    <label for="txtDhcpLease" data-trans="dhcp_lease" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-3">

+                        <div class="input-group">

+                            <input id="txtDhcpLease" name="txtDhcpLease" data-bind="value: dhcpLease" maxlength="5"  type="text" class="required form-control"/>

+                            <div data-trans="hours" id="leaseLabel" class="input-group-addon"></div>

+

+                        </div>

+                        <div id="errorHolder"></div>

+                    </div>

+                </div>

+            </div>

+        </div>

+        <div class="form-buttons">

+            <input type="submit" formmethod="post" data-trans="apply" class="btn btn-primary"/>

+        </div>

+        <div class="form-note">

+            <div class="notes-title">&nbsp;</div>

+            <ul class="notes-content">

+                <li data-trans="diconneted_operate_note"></li>

+                <li data-trans="lan_note_ip_address"></li>

+                <li data-trans="lan_note_subnet_mask"></li>

+                <li data-trans="lan_note_dhcp_server_enable"></li>

+                <li data-trans="lan_note_dhcp_server_disable"></li>

+                <li data-trans="lan_note_dhcp_ip_pool"></li>

+                <li data-trans="lan_note_dhcp_lease_time"></li>

+            </ul></div>

+    </div>

+</form>

+    </div>

+    </div>

+</div>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/adm_others.html b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_others.html
new file mode 100755
index 0000000..d1a22e6
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_others.html
@@ -0,0 +1,249 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='advanced_settings'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+		    <div class="nav_right">

+		    <ul>

+				<li><a href="#wlan_sleep" data-trans="sleep_mode"></a></li>

+				<li><a href="#route_set" data-trans="router_setting"></a></li>

+				<li><a href="#filter_main" data-trans="firewall"></a></li>

+				<li data-bind="visible:hasUpdateCheck"><a href="#fota" data-trans="update_settings"></a></li>

+				<!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->

+				<li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>      

+				<li class="active"><a href="#more" data-trans="others"></a></li>

+			</ul>

+			</div>

+		</div>

+        <div class="col-xs-10">

+        <form id="frmRestoreReset">

+            <div class="form-body">

+                <h3 data-trans="others_restart_reset" class="form-title"></h3>

+				<div class="row form-group">

+                    <div data-trans="others_note_info" class="col-xs-12"></div>

+                </div>

+                <div class="row form-group">				    

+                    <div class="col-xs-12 align-right">

+                        <input data-trans="restart_button" data-bind="click: restart" type="button" class="btn btn-primary margin-right-20"/>

+                        <input data-trans="restore_button" data-bind="visible: currentUserInChildGroup() == false, click: restore" type="button" class="btn btn-primary margin-right-20"/>

+                    </div>

+                </div>

+            </div>

+        </form>

+

+		<!-- add by qumengjia for schedule restart start -->

+		<form id="frmScheduleRestart">

+			<div class="form-body">

+				<h3 data-trans="restart_schedule" class="form-title"></h3>

+				<div class="row form-group">

+					<label data-trans="enable_reboot_switch" class="col-xs-4 side-right"></label>

+					<div class="col-xs-8">

+						<div class="row">

+							<div class="col-xs-3">

+								<input id="restartEnable" data-bind="checked: scheduleSetting" type="radio" value="1"/>

+								<label data-trans="enable" for="restartEnable"></label>

+							</div>

+							<div class="col-xs-3">

+								<input id="restartDidable" data-bind="checked: scheduleSetting" type="radio" value="0"/>

+								<label data-trans="disable" for="restartDidable"></label>

+							</div>

+						</div>

+					</div>

+				</div>

+				<div data-bind='visible: scheduleSetting() == "1"' class="row form-group">

+					<label class="col-xs-4 side-right" data-trans='restart_schedule_time'></label>

+					<div class="col-xs-8">

+						<label data-trans="eyeryday" style="display:inline-block; width:auto; padding-right:0"></label>

+						<select id="restartHour" data-bind="options: scr_hours, value: scheduleHour, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select> 

+						<label data-trans="hour" for="restartHour" style="display:inline-block; width:auto; padding-right:0"></label>

+						<select id="restartMinute" data-bind="options: scr_minutes, value: scheduleMinute, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select> 

+						<label data-trans="minute" for="restartMinute" style="display:inline-block; width:auto; padding-right:0"></label>

+					</div>

+				</div>

+				<div class="form-buttons">

+					<input data-bind="click:scheduleRestart" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

+				</div>

+			</div>

+		</form>

+		<!-- add by qumengjia for schedule restart end -->

+

+        <form id="frmtrunOffDevice" data-bind="visible: turnOffSupport">

+            <div class="form-body">

+                <h3 data-trans="others_turn_off" class="form-title"></h3>

+                <div class="row form-group">

+                    <div class="col-xs-12 align-right">

+                        <input data-bind="click: turnoff" data-trans="turnoff_button" type="button" class="btn btn-primary margin-right-20"/>

+                    </div>

+                </div>

+            </div>

+        </form>

+

+        <form data-bind="visible: fastbootSupport">

+            <div class="form-body">

+                <h3 class="form-title" data-trans="fastboot_setting"></h3>

+                <div class="row form-group">

+                    <label data-trans="fastboot_setting" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-8">

+                        <div class="row">

+                            <div class="col-xs-3">

+                                <input id="fastEnable" name="fastboot" data-bind="checked: fastbootSetting, enable: fastbootEnableFlag" type="radio" value="1"/>

+                                <label data-trans="enable" for="fastEnable"></label>

+                            </div>

+                            <div class="col-xs-3">

+                                <input id="fastDisable" name="fastboot" data-bind="checked: fastbootSetting, enable: fastbootEnableFlag" type="radio" value="0"/>

+                                <label data-trans="disable" for="fastDisable"></label>

+                            </div>

+                        </div>

+                    </div>

+                </div>

+                <div class="row form-group">

+                    <div class="col-xs-12" data-trans="fastboot_note"></div>

+                </div>

+                <div class="row form-group">

+                    <div class="col-xs-12 align-right">

+                        <input data-bind="click: saveFastBoot, enable: fastbootEnableFlag" data-trans="apply" type="button" class="btn btn-primary margin-right-20"/>

+                    </div>

+                </div>

+            </div>

+        </form>

+

+

+		<form id="sntpForm" data-bind="visible: SNTPSupport">

+			<div class="form-body">

+				<h3 class="form-title">SNTP</h3>

+				<div class="content">

+					<div class="row form-group">

+						<label class="col-xs-4 side-right" data-trans='local_current_time'></label>

+						<div class="col-xs-8">

+							<span class="span3" data-bind="text: localTime"></span>

+							<span>&nbsp;</span>

+							<span id="weekday" data-bind="text: day"></span>

+						</div>

+					</div>

+					<div class="row form-group">

+						<label class="col-xs-4 side-right" data-trans='time_set_mode' for="sntpSetTimeMode"></label>

+						<div class="col-xs-4">

+							<select id="sntpSetTimeMode" class="form-control" data-transid="time_set_time" data-bind="options: timeSetModes, value: currentMode, optionsText: transOption('time_set_time'), optionsValue: 'value', event:{change: changeSetTimeMode}"></select>

+						</div>					

+					</div>

+					<div id="manualSetTime" data-bind="visible: isManualSetTime">

+						<div class="row form-group">

+							<label class="col-xs-4 side-right" data-trans='time_set_time_manual'></label>							

+

+							<div class="col-xs-8">

+									<select id="manualYear" data-bind="options: years, value: currentYear, optionsText: 'text', optionsValue: 'value', event:{change: initDateList}" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px"  class="form-control"></select> 

+								    <label data-trans="year" for="manualYear" style="display:inline-block; width:auto; padding-right:0"></label>

+

+								    <select id="manualMonth" data-bind="options: months, value: currentMonth, optionsText: 'text', optionsValue: 'value', event: {change: initDateList}" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select> 

+								    <label data-trans="month" for="manualMonth" style="display:inline-block; width:auto; padding-right:0"></label>

+

+									<select id="manualDate" data-bind="options: dates, value: currentDate, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select> 

+								    <label data-trans="date" for="manualDate" style="display:inline-block; width:auto; padding-right:0"></label>

+

+									<select id="manualHour" data-bind="options: hours, value: currentHour, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select> 

+								    <label data-trans="hour" for="manualHour" style="display:inline-block; width:auto; padding-right:0"></label>

+

+									<select id="manualMinute" data-bind="options: minutes, value: currentMinute, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:auto; padding-right:5px; padding-left:5px" class="form-control"></select> 

+									<label data-trans="minute" for="manualMinute" style="display:inline-block; width:auto; padding-right:0"></label>

+							</div>

+                        </div>						

+					</div>

+					<div id="autoSntpTime" data-bind="visible: isAutoSntpTime">

+						<div id="sntp_server0" class="row form-group">

+							<label data-trans='stnp_server1' for="sntp_server1_select" class="col-xs-4 side-right"></label>

+							<div class="col-xs-4">

+								<select id="sntp_server1_select" data-bind="options: serverList, value: currentServer0, optionsText: 'text', optionsValue: 'value', event: {change: changeServerSelect}" class="form-control"></select>

+							</div>

+							<div class="col-xs-4">

+							    <input id="sntp_other_server0" name="sntp_other_server0" data-bind="value:customServer0, visible:isOther0" type="text" class="required form-control"/>

+							</div>

+						</div>

+						<div id="sntp_server1" class="row form-group">

+							<label class="col-xs-4 side-right" data-trans='stnp_server2' for="stnp_server2_select"></label>

+							<div class="col-xs-4">

+								<select id="stnp_server2_select" data-bind="options: serverList, value: currentServer1, optionsText: 'text', optionsValue: 'value', event: {change: changeServerSelect}" class="form-control"></select>

+	                        </div>

+							<div class="col-xs-4">						

+    							<input id="sntp_other_server1" name="sntp_other_server1"  data-bind="value:customServer1, visible:isOther1" type="text" class="required form-control"/>

+							</div>

+						</div>

+						<div id="sntp_server2" class="row form-group">

+							<label data-trans='stnp_server3' for="stnp_server3_select" class="col-xs-4 side-right"></label>

+							<div class="col-xs-4">

+								<select id="stnp_server3_select" class="form-control" data-bind="options: serverList, value: currentServer2, optionsText: 'text', optionsValue: 'value', event: {change: changeServerSelect}"></select>

+							</div>

+							<div class="col-xs-4">

+								<input id="sntp_other_server2" name="sntp_other_server2" data-bind="value:customServer2, visible:isOther2" type="text" class="required form-control"/>

+							</div>

+						</div>

+						<div class="row form-group">

+							<label data-trans='time_zone' for="time_zone_select" class="col-xs-4 side-right"></label>

+							<div class="col-xs-4">

+								<select id="time_zone_select" data-bind="options: timeZones, value: currentTimeZone, optionsText: transOption('time_zone'), optionsValue: 'value'" data-transid="time_zone" class="form-control"></select>

+							</div>

+						</div>

+

+					</div>		

+				</div>

+				<div class="form-buttons">

+					<input data-bind="" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

+				</div>

+			</div>

+		</form>

+

+		<!-- add by qumengjia for ping diagnostics start -->

+		<form id="frmPingDiagnostics">

+			<div class="form-body">

+				<h3 data-trans="ping_diagnostics" class="form-title"></h3>

+				<div class="content">

+					<div class="row form-group">

+						<label data-trans="ping_times" for="txtPingTimes" class="col-xs-4 side-right"></label>

+						<div class="col-xs-3">

+							<select id="restartHour" data-bind="options: src_times, value: pingTimes, optionsText: 'text', optionsValue: 'value'" style="display:inline-block; width:167.5px; padding-right:5px; padding-left:5px" class="form-control"></select> 

+							<!-- <input id="txtPingTimes" maxlength="15" type="text" class="required form-control"/> -->

+						</div>

+					</div>

+					<div class="row form-group">

+						<label data-trans="ping_url" for="txtPingURL" class="col-xs-4 side-right"></label>

+						<div class="col-xs-3">

+							<input id="txtPingURL" name="txtPingURL" data-bind="value: pingURL" type="text" class="required form-control"/>

+							<!-- <input id="txtPingURL" maxlength="15" type="text" class="required form-control"/> -->

+						</div>

+					</div>

+					<div class="row form-group">

+						<textarea id="fileContent" readonly  data-bind="value: pingResult" style="width: 760px; height: 190px; border-radius: 6px;" class="col-xs-4 side-right"></textarea>

+					</div>	

+				</div>

+				<div class="form-buttons">

+					<input data-bind="click:pingStart" data-trans="ping_start" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

+					<input data-bind="click:pingClear" data-trans="ping_clear" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/>

+					<!-- <input data-trans="ping_start" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/> -->

+					<!-- <input data-trans="ping_end" type="submit" formmethod="post" class="btn btn-primary margin-right-20"/> -->

+				</div>

+			</div>

+		</form>

+		<!-- add by qumengjia for schedule ping diagnostics end -->

+

+        <div class="form-body">

+            <div class="content margin-top-20 line-height-30">

+                <div class="row">

+                    <a href="#pin_mode">

+                        <div data-trans="pin_management" class="col-xs-3 arrow-right">

+                        </div>

+                    </a>

+                </div>

+            </div>

+        </div>

+    </div>

+</div>

+</div>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/adm_quick_set.html b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_quick_set.html
new file mode 100755
index 0000000..ee908d0
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/adm_quick_set.html
@@ -0,0 +1,308 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='quick_setting'></h1>

+				<p data-trans='step1_exp1'></p>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-1 margin-top-15">

+        </div>

+        <div class="col-xs-11">

+

+<form id='quickSettingForm'>

+    <div class="form-body">

+        <div class="content">

+            <div class="row form-group side-right form-buttons">

+                <input id="btnBack" data-bind="visible:currentStep()>1,click:previous" data-trans="prev_step" type="button" class="btn btn-primary">

+                <input id="btnNext" data-bind="visible:currentStep()<5,disable: adBand()=='b' && adMode() == '2' && (selectedSecurityMode() == 'SHARED' || (selectedSecurityMode() == 'OPEN' && encryptType() == 'WEP'))" data-trans="next_step" type="submit" formmethod="post" class="btn btn-primary">

+                <input id="btnSave" data-bind="visible:currentStep()==5" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary">

+            </div>

+            <div data-bind="visible:currentStep()==1" style="display: none" id="step1">

+                <h3 data-trans="apn_settings" class="form-title"></h3>

+                <div class="content">

+					<div class="row form-group">

+						<label data-trans="apn_settings" class="col-xs-3 side-right"></label>

+						<div class="col-xs-6">

+							<div class="row">

+								<div class="col-xs-4">

+									<input id="radAuto" name="apnMode" data-bind="checked: apnMode,disable: apnModeDisabled()" type="radio" value="auto"/>

+									<label data-trans="apn_auto_apn" for="radAuto"></label>

+								</div>

+								<div class="col-xs-4">						

+									<input id="radManual" name="apnMode" data-bind="checked: apnMode,disable: apnModeDisabled()" type="radio" value="manual"/>

+									<label data-trans="apn_manual_apn" for="radManual"></label>

+								</div>

+							</div>

+						</div>

+					</div>

+					<div id="apnSetting" data-bind="visible:apnMode()=='manual'">

+						<div class="row form-group">

+							<label data-trans="apn_profile_name" for="profile_name" class="col-xs-3 side-right"></label>

+							<div class="col-xs-6">

+								<input id="profile_name" name="txtProfileName" data-bind="value:profileName" disabled="disabled" maxlength="30" type="text" class=" form-control"/>

+							 </div>

+						</div>

+						<div data-bind="visible:showIPv4" class="row form-group">

+							<label for="txtAPN" data-bind="attr:{'data-trans':transAPN}" class="col-xs-3 side-right"></label>

+							<div class="col-xs-6">

+								<input id="txtAPN" name="txtAPN" data-bind="value:apn,disable: apnDisabled()" maxlength="64" type="text" class="form-control required"/>

+							</div>

+						</div>

+						<div data-bind="visible:showIPv6" class="row form-group">

+							<label for="txtIPv6APN" data-bind="attr:{'data-trans':transAPNIPv6}" class="col-xs-3 side-right"></label>

+							<div class="col-xs-6">

+								<input id="txtIPv6APN" name="txtIPv6APN" data-bind="value:ipv6_apn,disable: apnDisabled()" maxlength="64" type="text" class="form-control required"/>

+							</div>

+						</div>

+					</div>

+				</div>                

+				<div class="form-note">

+					<div class="notes-title">&nbsp;</div>

+					<ul class="notes-content">

+						<li data-trans="diconneted_operate_note"></li>

+						<li data-trans="step2_auto_apn_explain"></li>

+						<li data-trans="step2_profile_name_explain"></li>

+					</ul>

+				</div>

+            </div>

+            <div id="step2" data-bind="visible:currentStep()==2" style="display: none">

+                <h3 data-trans="ppp_authentication" class="form-title"></h3>

+                <div class="content">

+					<div data-bind="visible:showIPv4" class="row form-group">

+						<label data-bind="attr:{'data-trans':transAuthMode}" for="selAuthMode" class="col-xs-3 side-right"></label>

+						<div class="col-xs-6">

+							<select id="selAuthMode" name="selAuthMode" 

+								data-bind="options: authModes, disable: apnDisabled(), value: selectedAuthMode, optionsText: 'text', optionsValue: 'value'" class="form-control"></select>

+						</div>

+					</div>

+					<div data-bind="visible:showIPv4" class="row form-group">

+						<label data-bind="attr:{'data-trans':transUserName}" for="txtUserName" class="col-xs-3 side-right"></label>

+						<div class="col-xs-6">

+							<input id="txtUserName" name="txtUserName"

+								   data-bind="value:username,disable: apnDisabled()" maxlength="64" type="text" class=" form-control"/>

+						</div>

+					</div>

+					<div data-bind="visible:showIPv4" class="row form-group">

+						<label data-bind="attr:{'data-trans':transPassword}" for="txtSecretCode" class="col-xs-3 side-right"></label>

+						<div class="col-xs-6">

+							<input id="txtSecretCode" name="txtSecretCode"

+							   data-bind="value:password,disable: apnDisabled()" maxlength="64" type="password" class=" form-control"/>

+						</div>

+					</div>

+					<div data-bind="visible:showIPv6" class="row form-group">

+						<label data-bind="attr:{'data-trans':transAuthModeIPv6}" for="selIPv6AuthMode" class="col-xs-3 side-right"></label>

+						<div class="col-xs-6">

+							<select id="selIPv6AuthMode" name="selIPv6AuthMode"

+									data-bind="options: authModes, disable: apnDisabled(), value: ipv6_selectedAuthMode, optionsText: 'text', optionsValue: 'value'"  class="form-control"></select>

+						</div>

+					</div>

+					<div data-bind="visible:showIPv6" class="row form-group">

+						<label class="col-xs-3 side-right" for="txtIPv6UserName" data-bind="attr:{'data-trans':transUserNameIPv6}"></label>

+						<div class="col-xs-6">

+							<input id="txtIPv6UserName" name="txtIPv6UserName"

+								   data-bind="value:ipv6_username,disable: apnDisabled()" maxlength="64" type="text" class=" form-control"/>

+						</div>

+					</div>

+					<div data-bind="visible:showIPv6" class="row form-group">

+						<label data-bind="attr:{'data-trans':transPasswordIPv6}" for="txtIPv6SecretCode" class="col-xs-3 side-right"></label>

+						<div class="col-xs-6">

+							<input id="txtIPv6SecretCode" name="txtIPv6SecretCode" data-bind="value:ipv6_password,disable: apnDisabled()" maxlength="64"

+								   type="password" class="form-control"/>

+						</div>

+					</div>

+                </div>

+                <div class="form-note">

+                    <div class="notes-title">&nbsp;</div>

+                    <ul class="notes-content">

+                        <li data-trans="step3_authentication_apn_explain1"></li>

+                        <li data-trans="step3_authentication_apn_explain2"></li>

+                        <li data-trans="step3_authentication_apn_explain3"></li>

+                    </ul>

+                </div>

+

+            </div>

+            <div id="step3" data-bind="visible:currentStep()==3" style="display: none">

+                <h3 class="form-title" data-trans="ssid_title"></h3>

+                <div class="content">

+                <div class="row form-group">

+                    <label data-trans="ssid_name" for="txtSSID" class="col-xs-3 side-right"></label>

+                    <div class="col-xs-6">

+                        <input id="txtSSID" name="txtSSID" data-bind="disable:wifiDisabled,value:ssid" maxlength="32" type="text" class="form-control required"/>

+                    </div>

+                </div>

+                <div class="row form-group">

+                    <label class="col-xs-3 side-right" data-trans="ssid_broadcast"></label>

+                    <div class="col-xs-6">

+                       <input id="radBroadcastEnable" data-bind="disable:wifiDisabled,checked: broadcast" name="radBroadcast"

+                           type="radio" value="0"/>

+                        <label for="radBroadcastEnable" data-trans="enable"></label>

+                        <input id="radBroadcastDisable" name="radBroadcast"

+                               data-bind="disable:wifiDisabled,checked: broadcast" type="radio" value="1"/>

+                        <label data-trans="disable" for="radBroadcastDisable"></label>

+                    </div>

+                </div>

+                </div>

+                <div class="form-note">

+                    <div class="notes-title">&nbsp;</div>

+                    <ul class="notes-content">

+                        <li data-trans="step4_ssid_explain"></li>

+                        <li data-trans="wifi_basic_note_network_name_input"></li>

+                        <li data-trans="step4_ssid_broadcast_explain1"></li>

+                    </ul>

+                </div>

+

+            </div>

+            <div data-bind="visible:currentStep()==4" style="display: none" id="step4">

+                <h3 class="form-title" data-trans="security_mode"></h3>

+                <div class="content">

+                <div class="row form-group">

+                    <label for="selSecurityMode" data-trans="security_mode" class="col-xs-3 side-right"></label>

+                    <div class="col-xs-6">

+                        <select id="selSecurityMode" name="selSecurityMode" data-transid='security_mode'

+                                data-bind="disable:wifiDisabled,options: securityModes, value: selectedSecurityMode, optionsText: transOption('security_mode'), optionsValue: 'value'"  class="form-control"></select>

+                    </div>

+                </div>

+

+				<div data-bind='visible: selectedSecurityMode() == "OPEN" && hasWifiWep' class="row form-group">

+					<label for='selEncryptType' data-trans='ap_station_encrypt_type' class="col-xs-3 side-right"></label>

+					<div class="col-xs-6">

+						<select id="selEncryptType" data-bind="value: encryptType,optionsValue: 'value'" class="form-control">

+							<option data-trans="ap_station_encrypt_type_none" value="NONE"></option>

+							<option data-trans="ap_station_encrypt_type_wep" value="WEP"></option>

+						</select>

+					</div>

+				</div>

+				<div data-bind='visible:  (selectedSecurityMode() == "OPEN" && encryptType() == "WEP" && hasWifiWep) || (selectedSecurityMode() == "SHARED" && hasWifiWep)' class="row form-group">

+					<label data-trans='ap_station_wep_default_key' for='selWepKeyType' class="col-xs-3 side-right"></label>

+					<div class="col-xs-6">

+						<select id="selWepKeyType" data-bind="value: keyID,optionsValue: 'value', event:{ change: profileChangeHandler}" class="form-control">

+							<option data-trans="ap_station_wep_key_0" value="0"></option>

+							<option data-trans="ap_station_wep_key_1" value="1"></option>

+							<option data-trans="ap_station_wep_key_2" value="2"></option>

+							<option data-trans="ap_station_wep_key_3" value="3"></option>

+						</select>

+					</div>

+				</div>

+				<div data-bind='visible: (selectedSecurityMode() == "OPEN" && encryptType() == "WEP" && hasWifiWep) || (selectedSecurityMode() == "SHARED" && hasWifiWep)' class="row form-group">

+					<label data-trans='ap_station_wep_key' for='pwdWepKey' class="col-xs-3 side-right"></label>

+					<div class="col-xs-6">

+						<input id='pwdWepKey' name="pwdWepKey" type="password"

+											   data-bind="value: wepPassword,visible:!showWifiPassword()" maxlength='26' class="required form-control"/>

+						<input id='txtWepKey' name="txtWepKey" type="text"

+											   data-bind="value: wepPassword,visible:showWifiPassword()" maxlength='26' class="required form-control"/>

+						<div class="margin-top-10">

+							<p data-bind="css:{'checkbox_selected': showWifiPassword()}, click: showWifiPasswordHandler"

+										   manualControl="true" class="checkbox">

+								<input id="showWepPassword" data-bind="checked:showWifiPassword" type="checkbox"/>

+							</p>

+							<label data-trans="display_password" for="showWepPassword" class="floatleft margintop5 lineheight25"/>

+						</div>

+						<div id="lblShowWepPassword" class="clear"></div>

+					</div>

+				</div>

+

+                <div data-bind="visible:selectedSecurityMode() == 'WPA2PSK' || selectedSecurityMode() == 'WPAPSKWPA2PSK' || selectedSecurityMode() == 'WPA3Personal' || selectedSecurityMode() == 'WPA2WPA3'" class="row form-group">

+                    <label data-trans="pass_phrase" for="txtWPAKey" class="col-xs-3 side-right"></label>

+                    <div class="col-xs-6">

+                        <input id="codeWPAKey" name="codeWPAKey" data-bind="disable:wifiDisabled,value:WPAKey,visible:!showWifiPassword()" maxlength='63' minlength='8' type="password" class="form-control required"/>

+                        <input id="txtWPAKey" name="txtWPAKey" data-bind="disable:wifiDisabled,value:WPAKey,visible:showWifiPassword()" maxlength='63' minlength='8' type="text" class="form-control required"/>

+                        <p data-bind="css:{'checkbox_selected': showWifiPassword()}, click: showWifiPasswordHandler" manualControl="true" class="checkbox floatleft margintop10 marginleft5 marginright5">

+                            <input id="showWifiPassword" data-bind="checked:showWifiPassword" type="checkbox"/>

+                        </p>

+                        <label data-trans="display_password" for="showWifiPassword" class="floatleft margintop5 lineheight25"/>

+                        <div id="lblShowWifiPassword" class="clear"></div>

+                    </div>

+                </div>

+                </div>

+                <div class="form-note">

+                    <div class="notes-title">&nbsp;</div>

+                    <ul class="notes-content">

+                        <li data-trans="step5_encryption_mode_info"></li>

+                        <li class="no-style">

+                            <ul>

+                                <li data-trans="step5_encryption_mode_explain1"></li>

+								<li data-bind='visible: hasWifiWep' data-trans="wifi_basic_note_shared"></li>

+                                <li data-trans="step5_encryption_mode_explain2"></li>

+                                <li data-trans="step5_encryption_mode_explain3"></li>

+                                <li data-bind='visible: hasWifiWpa3' data-trans="wifi_basic_note_wpa3"></li>

+                                <li data-bind='visible: hasWifiWpa23' data-trans="wifi_basic_note_wpa2_wpa3"></li>

+                            </ul>

+                        </li>

+                        <li data-trans="step5_encryption_mode_explain4"></li>

+                    </ul>

+                </div>

+

+            </div>

+            <div data-bind="visible:currentStep()==5" style="display: none" id="step5">

+                <h3 class="form-title" data-trans="step_name_6"></h3>

+				<div class="content">

+                <div class="row form-group">

+                    <label data-trans="apn_settings" class="col-xs-3 side-right"></label>

+                    <label data-bind="text:apnMode_display,attr:{'data-trans':apnMode_trans}" class="col-xs-6"></label>

+                </div>

+                <div data-bind="visible:apnMode()=='manual'">

+                    <div class="row form-group">

+                        <label data-trans="apn_profile_name" class="col-xs-3 side-right"></label>

+                        <label data-bind="text:profileName" class="col-xs-6"></label>

+                    </div>

+                    <div class="row form-group" data-bind="visible:showIPv4">

+                        <label data-bind="attr:{'data-trans':transAPN}" class="col-xs-3 side-right"></label>

+                        <label data-bind="text: apn,attr:{title:apn}" class="col-xs-6 ellipsis"></label>

+                    </div>

+                    <div class="row form-group" data-bind="visible:showIPv4">

+                        <label data-bind="attr:{'data-trans':transAuthMode}" class="col-xs-3 side-right"></label>

+                        <label data-bind="text:selectedAuthMode_display" class="col-xs-6"></label>

+                    </div>

+                    <div class="row form-group" data-bind="visible:showIPv4">

+                        <label data-bind="attr:{'data-trans':transUserName}" class="col-xs-3 side-right"></label>

+                        <label  data-bind="text:username,attr:{title:username}" class="col-xs-6 ellipsis"></label>

+                    </div>

+                    <div class="row form-group" data-bind="visible:showIPv6">

+                        <label data-bind="attr:{'data-trans':transAPNIPv6}" class="col-xs-3 side-right"></label>

+                        <label data-bind="text:ipv6_apn" class="col-xs-6"></label>

+                    </div>

+                    <div class="row form-group" data-bind="visible:showIPv6">

+                        <label data-bind="attr:{'data-trans':transAuthModeIPv6}" class="col-xs-3 side-right"></label>

+                        <label data-bind="text:ipv6_selectedAuthMode_display" class="col-xs-6"></label>

+                    </div>

+                    <div class="row form-group" data-bind="visible:showIPv6">

+                        <label data-bind="attr:{'data-trans':transUserNameIPv6}" class="col-xs-3 side-right"></label>

+                        <label  data-bind="text:ipv6_username,attr:{title:ipv6_username}" class="col-xs-6 ellipsis"></label>

+                    </div>

+                </div>

+                <div class="row form-group">

+                    <label data-trans="ssid_name" class="col-xs-3 side-right"></label>

+                    <label data-bind="text:ssid" class="col-xs-6"></label>

+                </div>

+                <div class="row form-group">

+                    <label data-trans="ssid_broadcast" class="col-xs-3 side-right"></label>

+                    <label data-bind="text:broadcast_display,attr:{'data-trans':broadcast_trans}" class="col-xs-6"></label>

+                </div>

+                <div class="row form-group">

+                    <label data-trans="security_mode" class="col-xs-3 side-right"></label>

+                    <label data-bind="text:selectedSecurityMode_display,attr:{'data-trans':selectedSecurityMode_trans}" class="col-xs-6"></label>

+                </div>

+                <div class="form-note">

+                    <div class="notes-title">&nbsp;</div>

+                    <ul class="notes-content">

+                        <li data-trans="step6_apply_explain"></li>

+                    </ul>

+                </div>

+                </div>

+            </div>      

+

+		</div>

+    </div>

+</form>		

+

+        </div>

+    </div>

+</div>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/firewall.html b/lynq/MD310EU/ap/app/zte_webui/subpg/firewall.html
new file mode 100755
index 0000000..bf00b0c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/firewall.html
@@ -0,0 +1,69 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='advanced_settings'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+			<div class="nav_right">

+				<ul>

+					<li><a data-trans="sleep_mode" href="#wlan_sleep"></a></li>

+					<li><a data-trans="router_setting" href="#route_set"></a></li>

+					<li class="active"><a data-trans="firewall" href="#filter_main"></a></li>

+					<li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>

+					<!-- <li data-bind="visible:hasUssd"><a data-trans="USSD" href="#usat"></a></li> -->

+					<li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>

+					<li><a data-trans="others" href="#more"></a></li>

+				</ul>

+			</div>

+		</div>

+

+    <div class="col-xs-10">

+        <div class="form-body">

+            <div class="content margin-top-20">

+                <div class="col-xs-4">

+                    <div class="row">

+                        <a href="#filter_port">

+                            <div data-trans="port_filter" class="line-height-40 arrow-right cursorhand"></div>

+                        </a>

+                    </div>

+                    <div class="row" style="display:none">

+                        <a href="#map_port">

+                            <div data-trans="port_map" class="line-height-40 arrow-right cursorhand"></div>

+                        </a>

+                    </div>

+                    <div class="row" style="display:none">

+                        <a href="#foward_port">

+                            <div data-trans="port_forward" class="line-height-40 arrow-right cursorhand"></div>

+                        </a>

+                    </div>

+                    <div data-bind="visible: hasUrlFilter" class="row">

+                        <a href="#filter_url">

+                            <div data-trans="url_filter" class="line-height-40 arrow-right cursorhand"></div>

+                        </a>

+                    </div>

+                    <div class="row">

+                        <a href="#universal_plug_and_play">

+                            <div data-trans="upnp" class="line-height-40 arrow-right cursorhand"></div>

+                        </a>

+                    </div>

+                    <div class="row">

+                        <a href="#demilitarized_zone">

+                            <div data-trans="dmz" class="line-height-40 arrow-right cursorhand"></div>

+                        </a>

+                    </div>

+                </div>

+            </div>

+        </div>

+    </div>

+    </div>

+</div>

+

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/firewall_url_filter.html b/lynq/MD310EU/ap/app/zte_webui/subpg/firewall_url_filter.html
new file mode 100755
index 0000000..d53b01b
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/firewall_url_filter.html
Binary files differ
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/main.html b/lynq/MD310EU/ap/app/zte_webui/subpg/main.html
new file mode 100755
index 0000000..eb7a57c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/main.html
@@ -0,0 +1,233 @@
+

+<div class="row margin-top-20">

+<div class="type_items">

+	<ul>

+		<li><a href="#child_ctl" data-bind="visible: hasParentalControl" data-trans="parental_control" class="c0EC6DC"></a></li>

+		<li><a href="#msg_main"  data-bind="visible: hasSms" data-trans="sms" class="cF53A58"></a></li>

+		<li><a href="#usat" data-bind="visible:hasUssd" data-trans="USSD"></a></li>

+		<li><a href="#pb_main" data-bind="visible: hasPhonebook" data-trans="phonebook" class="c00AEFF"></a></li>

+		<li><a href="#sdcard" data-bind="visible: isSupportSD" data-trans="sd" class="c2175FF"></a></li>

+		<li><a data-bind="attr: {href: notDataCard? '#wlan_sleep' : '#demilitarized_zone'}" data-trans="advanced_settings" class="cFFCE2B"></a></li>

+		<li><a href="#fast_set" data-bind="visible: isSupportQuicksetting()" data-trans="quick_setting" class="cFFCE2B"></a></li>

+	</ul>

+</div>

+</div>

+

+<div class="row margin-top-20" id="home_image">

+

+<div class="row">

+    <div style="position: relative">	

+        <div class="internet_status_container">

+		    <div data-bind=" css: {'item_icon_connect': cStatus()== 1, 'item_icon_disconnect': cStatus() != 1}"></div>

+			<h3 data-trans="net_surfing" class="home_h3"></h3>

+			<div class="net_surfing_list">

+				<ul>

+					<li><a id="h_connect_btn" href="javascript: void(0)" data-bind="visible: canConnect() && isShowHomeConnect(), click: connectHandler , css: {'h_connect_on': cStatus()== 1, 'h_connect_off': cStatus() != 1}" style="display: none;"></a></li>

+					<li><i class="up"></i><span data-bind="text: up_Speed"></span></li>

+					<li><i class="down"></i><span data-bind="text: down_Speed"></span></li>

+					<li><span data-bind="text: connected_Time"></span></li>

+				</ul>

+			</div>

+        </div>

+

+		<div class="network_control_container">

+		    <div class="item_icon"></div>

+			<h3 data-trans="my_router" class="home_h3"></h3>			

+			<!--div id="h_network_type" data-bind="text: networkType, css: {'no-btn': !(canConnect() && isShowHomeConnect())}"></div-->

+			<div class="my_router_list">

+				<ul>

+					<li data-bind="visible: hasRj45"><a id="opmode" data-bind="click: showOpModeWindow, css: {'not-allowed': enableFlag}" href="javascript:void(0)"></a></li>

+					<li><a data-bind="click: showNetworkSettingsWindow" data-trans="settings_internet" href="javascript:void(0)"></a></li>

+					<!--li><div id="h_ssid"></div></li-->

+					<li data-bind="visible: notDataCard"><a data-trans="settings_wireless" href="#wlan_main"></a></li>

+				</ul>

+			</div>

+		</div>

+

+        <!--div id="h_connect_status" data-bind="visible:notDataCard, css: {'h_status_connected': cStatus()== 1, 'h_status_disconnected': cStatus()== 2, 'h_status_connecting': cStatus()== 3, 'h_status_disconnecting': cStatus()== 4, }">

+        </div-->

+

+		<div data-bind="visible: notDataCard" onclick="window.location.hash='#conn_device'" class="connected_devices_container">

+		    <div class="item_icon"></div>

+			<h3 data-trans="station_info" class="home_h3" ></h3>

+            <div style="text-align:center;display:inline" class="margin-top-20">

+				<div id="h_wire_device" data-bind="visible: hasRj45 && isCPE">

+					<span data-bind="text: wireDeviceNum" style="font-size:70px;"><em></em></span><sub data-trans="device_unit" style="font-size: 16px;"></sub>

+					<span data-trans="cable" style="font-size:15px;text-align:center;display:block"></span>

+				</div>

+				<div id="h_wireless_device" style="display-block">

+					<span data-bind="text: wirelessDeviceNum" style="font-size:70px"></span><sub data-trans="device_unit" style="font-size: 16px;"></sub>

+					<span data-trans="wireless" style="font-size:15px;text-align:center;display:block"></span>

+				</div>

+			</div>	

+            <!--a href="#conn_device" id="h_attached_device_link">

+            </a-->

+        </div>

+    </div>

+</div>

+</div>

+

+

+<div class="row margin-top-20 label-font-normal margin-bottom-20">

+    <div class="text-center traffic_control_container" data-bind="visible: showTraffic()">

+        <h4 data-trans="traffic_data_plan" style="font-size:14px;text-align:right;padding-right:15px"></h4>

+        <div style="display:inline-block">

+            <div id="traffic_graphic" style="width: 200px; height: 165px; visibility: visible;"></div>

+        </div>		

+        <div style="text-align: left;padding-left:20px;font-size:18px">

+			<span style="background-color: #8CC916;" class="color_block"></span>

+			<span data-trans="traffic_used" class="color_block_desc"></span>

+			<span class="color_block_desc">:</span>

+			<span data-bind="text: trafficUsed" class="color_block_desc"></span>

+	    </div>

+		<div class="statistics_list">

+			<ul>

+				<li><a href="#flow_ctl">

+				    <div data-bind="visible: trafficAlertEnable">

+                        <span data-bind="text: trafficLimited" class="line-height-20"></span>

+                        <span data-trans="traffic_limit_data" class="line-height-20"></span>

+                    </div>

+                    <div data-bind="visible: trafficAlertEnable() == false">

+                        <div data-trans="traffic_not_set_limited" class="line-height-20"></div>

+                    </div>

+				</a></li>

+			</ul>

+		</div>

+    </div>

+

+

+	<div data-bind="css:{'device_info_container_hastraffic':showTraffic(),'device_info_container_notraffic':!showTraffic()}" class="device_info_container">

+        <h4 data-trans="device_info" style="font-size:14px;text-align:left;padding-left:15px;color:#fff"></h4>

+        <div style="color:#fff;position: relative;height: 210px;font-size: 18px;line-height: 1.5em;padding:20px 0px 0px 15px;">

+			<div class="row">

+				<label data-trans="sim_serial_number" class="col-xs-5"></label>

+				<label data-bind="text: simSerialNumber" class="col-xs-7"></label>

+			</div>

+			<div class="row">

+				<label data-trans="imei" class="col-xs-5"></label>

+				<label data-bind="text: imei" class="col-xs-7"></label>

+			</div>

+			<div class="row">

+				<label data-trans="imsi" class="col-xs-5"></label>

+				<label data-bind="text: imsi" class="col-xs-7"></label>

+			</div>

+			<div class="row">

+				<label data-trans="iccid" class="col-xs-5"></label>

+				<label data-bind="text: iccid" class="col-xs-7"></label>

+			</div>

+			<div class="row">

+				<label data-trans="cellid" class="col-xs-5"></label>

+				<label data-bind="text: cellid" class="col-xs-7"></label>

+			</div>

+			<!--div class="row" data-bind="visible: notDataCard">

+				<label class="col-xs-5" data-trans="wifi_range"></label>

+				<label class="col-xs-7" data-bind="attr: {'data-trans': wifiLongMode}"></label>

+			</div-->

+			<div class="row">

+				<label data-trans="signal_strength_label" class="col-xs-5"></label>

+				<label id="fresh_signal_strength" class="col-xs-7"></label>

+			</div>

+			<div class="row" data-bind="visible: hasWifi && showMultiSsid()">

+				<label data-trans="network_name_ssid1" class="col-xs-5"></label>

+				<label data-bind="text: ssid" style="word-wrap: break-word;" class="col-xs-7"></label>

+			</div>

+			<div class="row" data-bind="visible: hasWifi && !showMultiSsid()">

+				<label data-trans="network_name" class="col-xs-5"></label>

+				<label data-bind="text: ssid" style="word-wrap: break-word;" class="col-xs-7"></label>

+			</div>

+		</div>

+        <div style="text-align:right;">

+		    <a href="javascript: void(0)" data-trans="detail_info" id="showDetailInfo" tabindex="0"></a>

+        </div>

+    </div>

+</div>

+

+

+<div id="h_qrcode" data-bind="visible: showQRCode" style="float:right" class="text-center">

+    <img id="qrcode_img" data-bind="attr: {src: qrcodeSrc}" src="./pic/res_blacktrans.png" width="111"/>

+</div>

+

+<script type="text/x-jquery-tmpl" id="detailInfoTmpl">

+<div class="row">

+    <label class="col-xs-6" data-trans="sim_serial_number" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= simSerialNumber %></label>

+</div>

+<div class="row">

+    <label data-trans="imei" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= imei %></label>

+</div>

+<div class="row">

+    <label data-trans="imsi" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= imsi %></label>

+</div>

+<div class="row">

+    <label data-trans="iccid" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= iccid %></label>

+</div>

+<div class="row">

+    <label data-trans="cellid" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= cellid %></label>

+</div>

+<div class="row">

+    <label data-trans="signal_strength_label" class="col-xs-6"></label>

+    <label class="col-xs-6" id="popoverSignalTxt"><%= signal %></label>

+</div>

+<% if(hasWifi){ %>

+<div class="row">

+    <label data-trans="<%= showMultiSsid ? 'network_name_ssid1': 'network_name' %>" class="col-xs-6"></label>

+    <label style="word-wrap: break-word; word-break: break-all;" class="col-xs-6"><%= ssid %></label>

+</div>

+<div class="row">

+    <label data-trans="<%= showMultiSsid ? 'max_access_num_ssid1': 'max_access_num' %>" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= max_access_num %></label>

+</div>

+    <% if(showMultiSsid){ %>

+        <div class="row">

+            <label data-trans="network_name_ssid2" class="col-xs-6"></label>

+            <label style="word-wrap: break-word; word-break: break-all;" class="col-xs-6"><%= m_ssid %></label>

+        </div>

+        <div class="row">

+            <label data-trans="max_access_num_ssid2" class="col-xs-6"></label>

+            <label class="col-xs-6"><%= m_max_access_num %></label>

+        </div>

+    <% } %>

+<div class="row">

+    <label data-trans="wifi_range" class="col-xs-6"></label>

+    <label data-trans="<%= wifi_long_mode %>" class="col-xs-6"></label>

+</div>

+<% } %>

+<div class="row">

+    <label data-trans="lan_domain" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= lanDomain %></label>

+</div>

+<div class="row">

+    <label data-trans="ip_address" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= ipAddress %></label>

+</div>

+<% if(showMacAddress){ %>

+<div class="row">

+    <label data-trans="mac_address" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= macAddress %></label>

+</div>

+<% } %>

+<% if(showIpv4WanIpAddr){ %>

+<div class="row">

+    <label data-trans="wan_ip_address" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= wanIpAddress %></label>

+</div>

+<% } %>

+<% if(showIpv6WanIpAddr){ %>

+<div class="row">

+    <label data-trans="ipv6_wan_ip_address" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= ipv6WanIpAddress %></label>

+</div>

+<% } %>

+<div class="row">

+    <label data-trans="software_version" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= sw_version %></label>

+</div>

+<div class="row">

+    <label data-trans="hardware_version" class="col-xs-6"></label>

+    <label class="col-xs-6"><%= hw_version %></label>

+</div>

+</script>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/network_apn_set.html b/lynq/MD310EU/ap/app/zte_webui/subpg/network_apn_set.html
new file mode 100755
index 0000000..16cd939
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/network_apn_set.html
@@ -0,0 +1,221 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='net_setting'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+		<div class="nav_right">

+			<ul>

+			    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

+				<li><a data-trans="net_select" href="#network_choose"></a></li>

+				<li class="active"><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+				<li><a data-trans="net_info" href="#net_status"></a></li>

+			</ul>

+		</div>

+	    </div>

+

+	    <div class="col-xs-10">

+

+<form id="apn_setting_form">

+	<div class="form-body">

+	    <h3 data-trans="apn_setting" class="form-title"></h3>

+		<div class="content">

+            <!-- 当前APN -->

+			<div class="row form-group">

+				<label data-trans="apn_currentApn" class="col-xs-3 side-right"></label>

+				<label data-bind="text: defApn" class="col-xs-6"></label>

+			</div>

+            <!-- 模式  手动、自动 -->

+			<div class="row form-group">

+				<label data-trans="apn_mode" class="col-xs-3 side-right"></label>

+                <div class="col-xs-6">

+                    <div class="row">

+                        <div class="col-xs-4">

+                            <input id="apnMode_auto" type="radio" name="apnMode" data-bind="checked: apnMode, event: {click: apnModeChangeHandler}, disable: autoApnChecked() == false && disableProfile() == true" value="auto"/>

+                            <label for="apnMode_auto" data-trans="apn_auto_apn"></label>

+                        </div>

+                        <div class="col-xs-4">

+                            <input id="apnMode_manual" type="radio" name="apnMode" data-bind="checked: apnMode, event: {click: apnModeChangeHandler}, disable: autoApnChecked() == false && disableProfile() == true" value="manual"/>

+                            <label for="apnMode_manual" data-trans="apn_manual_apn"></label>

+                        </div>

+                    </div>

+                </div>

+			</div>

+			<div id="apn_form_container" data-bind="visible: showAutoApnDetail()">

+				<div class="row form-group">

+					<label class="col-xs-3 side-right" for="profile" data-trans="apn_profile"></label>

+	                <div class="col-xs-4">

+	                    <select id="autoProfile" name="autoProfile" data-bind="options: autoProfiles, value: selectedAutoProfile, optionsText: 'text', optionsValue: 'value', disable: disableProfile, event:{ change: autoProfileChangeHandler}, visible: apnMode() == 'auto'" class="form-control"></select>

+	                    <select id="profile" name="profile" data-bind="options: profiles, value: selectedProfile, optionsText: 'text', optionsValue: 'value', disable: disableProfile, event:{ change: profileChangeHandler}, visible: apnMode() == 'manual'" class="form-control"></select>

+	                </div>

+

+                    <div class="col-xs-2">

+                        <input type="button" data-bind="click: addAct, visible: autoApnChecked() == false && disableProfile() == false && hasCapacity() == true" data-trans="add_new" class="btn btn-primary"/>

+                        <input type="button" data-bind="click: cancelAddAct, visible: autoApnChecked() == false && disableProfile() == true && hasCapacity() == true" data-trans="cancel" class="btn btn-primary"/>

+                    </div>

+				</div>

+				<div data-bind="visible: supportIPv6()" class="row form-group">

+					<label for="apn_pdp_type" data-trans="apn_pdp_type" class="col-xs-3 side-right"></label>

+	                <div class="col-xs-6">

+	                    <select id="apn_pdp_type" name="apn_pdp_type" data-bind="options: pdpTypes, value: selectedPdpType, optionsText: 'text', optionsValue: 'value', disable: checkInputDisable, event:{ change: pdpTypeChangeAlert}" class="form-control"></select>&nbsp;

+	                </div>

+				</div>

+				<div class="row form-group">

+					<label for="profile_name" data-trans="apn_profile_name" class="col-xs-3 side-right"></label>

+	                <div class="col-xs-6">

+	                    <input id="profile_name" type="text" name="profile_name" data-bind="value: profileName, disable: checkInputDisable" maxlength="15" class="required form-control"/>

+	                </div>

+				</div>

+				<div id="ipv4_section" data-bind="visible: selectedPdpType() != 'IPv6'">

+					<div class="row form-group">

+						<label for="apn_ipv4_apn" data-bind="attr:{'data-trans': transApn}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+							<input id="apn_ipv4_apn" type="text" name="apn_ipv4_apn" data-bind="value: apn, disable: checkInputDisable" maxlength="64" class="required form-control"/>

+		                </div>

+					</div>

+					<div class="row form-group" data-bind="visible: showApnDns()">

+						<label data-bind="attr:{'data-trans': transDnsMode}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+		                    <input id="apn_auto_dns_ipv4" type="radio" name="apn_auto_dns_ipv4" data-bind="checked: dnsMode, disable: checkInputDisable" value="auto"/>

+		                    <label for="apn_auto_dns_ipv4" data-trans="apn_auto_dns"></label>

+		                    <input id="apn_manual_dns_ipv4" type="radio" name="apn_manual_dns_ipv4" data-bind="checked: dnsMode, disable: checkInputDisable" value="manual"/>

+		                    <label for="apn_manual_dns_ipv4" data-trans="apn_manual_dns"></label>

+		                </div>

+					</div>

+					<div data-bind="visible: showDns() && showApnDns()" class="row form-group">

+						<label for="apn_dns1_ipv4" data-bind="attr:{'data-trans': transDns1}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+		                    <input id="apn_dns1_ipv4" type="text" name="apn_dns1_ipv4" data-bind="value: dns1, disable: checkInputDisable" maxlength="15" class="required ipv4 form-control"/>

+		                </div>

+					</div>

+					<div data-bind="visible: showDns() && showApnDns()" class="row form-group">

+						<label for="apn_dns2_ipv4" data-bind="attr:{'data-trans': transDns2}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+		                    <input id="apn_dns2_ipv4" type="text" name="apn_dns2_ipv4" data-bind="value: dns2, disable: checkInputDisable" maxlength="15" class="ipv4 form-control"/>

+		                </div>

+					</div>

+					<div class="row form-group">

+						<label for="apn_authentication_ipv4" data-bind="attr:{'data-trans': transAuth}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+		                    <select id="apn_authentication_ipv4" name="apn_authentication_ipv4" data-bind="options: authModes, disable: checkInputDisable, value: selectedAuthentication, optionsText: 'text', optionsValue: 'value'" class="form-control"></select>

+		                </div>

+					</div>

+					<div class="row form-group">

+						<label for="apn_user_name_ipv4" data-bind="attr:{'data-trans': transUserName}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+							<input id="apn_user_name_ipv4" type="text" name="apn_user_name_ipv4" data-bind="value: username, disable: checkInputDisable" maxlength="64" class="form-control"/>

+		                </div>

+					</div>

+					<div class="row form-group">

+						<label class="col-xs-3 side-right" for="apn_secretcode_ipv4" data-bind="attr:{'data-trans': transPassword}"></label>

+						<div class="col-xs-6">

+							<input id="apn_secretcode_ipv4" type="password" name="apn_secretcode_ipv4" data-bind="value: password,visible:!showPassword(), disable: checkInputDisable" maxlength="64" class="form-control"/>

+							<input id="apn_secretcode_ipv4_show" type="text" name="apn_secretcode_ipv4" data-bind="value: password,visible:showPassword(), disable: checkInputDisable" maxlength="64" class="form-control"/>

+							<div class="margin-top-10">

+								<p data-bind="css:{'checkbox_selected': showPassword()}, click: showPasswordHandler" manualControl="true" class="checkbox">

+									<input id="showPassword" data-bind="checked:showPassword" type="checkbox"/>

+								</p>

+								<label data-trans="display_password" class="floatleft lineheight25 margintop5"></label>

+							</div>

+						</div>

+					</div>

+				</div>

+

+				<!-- 以下是ipv6 -->

+

+				<div data-bind="visible: (selectedPdpType() == 'IPv4v6' && supportIpv4AndIpv6()) || selectedPdpType() == 'IPv6'">

+					<div class="row form-group">

+						<label for="apn_ipv6_apn" data-bind="attr:{'data-trans': transApnV6}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+							<input id="apn_ipv6_apn" type="text" name="apn_ipv6_apn" data-bind="value: apnV6, disable: checkInputDisable" maxlength="64" class="required form-control"/>

+		                </div>

+					</div>

+					<div data-bind="visible: showApnDns()" class="row form-group">

+						<label data-bind="attr:{'data-trans': transDnsModeV6}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+		                    <input id="apn_auto_dns_ipv6" type="radio" name="dns_ipv6" data-bind="checked: dnsModeV6, disable: checkInputDisable" value="auto"/>

+		                    <label for="apn_auto_dns_ipv6" data-trans="apn_auto_dns"></label>

+		                    <input id="apn_manual_dns_ipv6" type="radio" name="dns_ipv6" data-bind="checked: dnsModeV6, disable: checkInputDisable" value="manual"/>

+		                    <label for="apn_manual_dns_ipv6" data-trans="apn_manual_dns"></label>

+		                </div>

+					</div>

+					<div data-bind="visible: showDnsV6() && showApnDns()" class="row form-group">

+						<label for="apn_dns1_ipv6" data-bind="attr:{'data-trans': transDns1V6}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+		                    <input id="apn_dns1_ipv6" type="text" name="apn_dns1_ipv6" data-bind="value: dns1V6, disable: checkInputDisable" class="required ipv6 form-control"/>

+		                </div>

+					</div>

+					<div class="row form-group" data-bind="visible: showDnsV6() && showApnDns()">

+						<label class="col-xs-3 side-right" for="apn_dns2_ipv6" data-bind="attr:{'data-trans': transDns2V6}"></label>

+		                <div class="col-xs-6">

+		                    <input id="apn_dns2_ipv6" type="text" name="apn_dns2_ipv6" data-bind="value: dns2V6, disable: checkInputDisable" class="ipv6 form-control"/>

+		                </div>

+					</div>

+

+					<div class="row form-group">

+						<label for="authentication_ipv6" data-bind="attr:{'data-trans': transAuthV6}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+		                    <select id="authentication_ipv6" name="authentication_ipv6" data-bind="options: authModes, disable: checkInputDisable, value: selectedAuthenticationV6, optionsText: 'text', optionsValue: 'value'" class="form-control"></select>

+		                </div>

+					</div>

+					<div class="row form-group">

+						<label for="apn_user_name_ipv6" data-bind="attr:{'data-trans': transUserNameV6}" class="col-xs-3 side-right"></label>

+		                <div class="col-xs-6">

+							<input id="apn_user_name_ipv6" type="text" name="apn_user_name_ipv6" data-bind="value: usernameV6, disable: checkInputDisable" maxlength="64" class="form-control"/>

+		                </div>

+					</div>

+					<div class="row form-group">

+						<label for="apn_secretcode_ipv6" data-bind="attr:{'data-trans': transPasswordV6}" class="col-xs-3 side-right"></label>

+						<div class="col-xs-6">

+							<input id="apn_secretcode_ipv6" type="password" name="apn_secretcode_ipv6" data-bind="value: passwordV6,visible:!showPassword(), disable: checkInputDisable" maxlength="64" class="form-control"/>

+							<input id="apn_secretcode_ipv6_show" type="text" name="apn_secretcode_ipv6" data-bind="value: passwordV6,visible:showPassword(), disable: checkInputDisable" maxlength="64" class="form-control"/>

+							<div class="margin-top-10">

+								<p data-bind="css:{'checkbox_selected': showPassword()}, click: showPasswordHandler" manualControl="true" class="checkbox">

+									<input id="showV6Password" data-bind="checked:showPassword" type="checkbox"/>

+								</p>

+								<label data-trans="display_password" class="floatleft lineheight25 margintop5"></label>

+							</div>

+						</div>

+					</div>

+				</div>

+			    <div class="row form-group">

+					<label for="apn_secretcode_ipv6" data-trans="dial_num" class="col-xs-3 side-right"></label>

+		            <label class="col-xs-6" data-bind="text: wanDial"></label>

+				</div>

+			</div>

+		</div>

+		<div class="form-buttons">

+			<input type="button" data-bind="click: setDefaultAct, visible: disableProfile() == false && setDefaultVisible() && !defaultCfg()" data-trans="set_default" class="btn btn-primary"/>

+			<input type="submit" formmethod="post" data-bind="visible: (!autoApnChecked() && !predeterminedCfg()) || disableProfile() == true" data-trans="apply" class="btn btn-primary"/>

+			<input type="button" data-bind="click: deleteAct, visible: !autoApnChecked() && !defaultCfg() && !predeterminedCfg() && !disableProfile()" data-trans="delete" class="btn btn-primary"/>

+		</div>

+		<div class="form-note">

+            <div class="notes-title">&nbsp;</div>

+            <ul class="notes-content">

+        		<li data-trans="apn_note_whole_page"></li>

+        		<li data-trans="apn_note_mode"></li>

+        		<li data-trans="apn_note_profile"></li>

+        		<li data-trans="apn_note_pdp_type" data-bind="visible: supportIPv6()"></li>

+        		<li data-trans="apn_note_profile_name"></li>

+        		<li data-trans="apn_note_apn"></li>

+        		<li data-trans="apn_note_dns_mode" data-bind="visible: showApnDns()"></li>

+        		<li data-trans="apn_note_authentication"></li>

+        		<li data-trans="apn_note_username"></li>

+        		<li data-trans="apn_note_password"></li>

+        		<li data-trans="apn_note_set_default"></li>

+        	</ul>

+		</div>

+	</div>

+</form>

+    </div>

+</div>

+</div>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/network_dial_set.html b/lynq/MD310EU/ap/app/zte_webui/subpg/network_dial_set.html
new file mode 100755
index 0000000..a13017d
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/network_dial_set.html
@@ -0,0 +1,69 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='net_setting'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+		<div class="nav_right">

+			<ul>

+			    <li class="active"><a data-trans="dial_mode" href="#conn_set"></a></li>

+				<li><a data-trans="net_select" href="#network_choose"></a></li>

+				<li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                <li><a data-trans="net_info" href="#net_status"></a></li>

+			</ul>

+		</div>

+	    </div>

+

+	    <div class="col-xs-10">

+

+<form>

+<div class="form-body">

+	    <h3 data-trans="dial_mode" class="form-title"></h3>

+    <div class="content">

+            <div class="row form-group">

+                <label data-trans='dial_mode' class="col-xs-3 side-right"></label>

+                <div class="col-xs-2">

+                    <input id='auto_mode' type="radio" name="modeGroup" value="auto_dial" data-bind="checked: selectMode, enable: enableFlag" />

+                    <label for='auto_mode' data-trans='auto_select'></label>

+                </div>

+                <div class="col-xs-2">

+                    <input id='manual_mode' type="radio" name="modeGroup"  value="manual_dial" data-bind="checked: selectMode, enable: enableFlag" />

+                    <label for='manual_mode' data-trans='manual_select'></label>

+                </div>

+            </div>

+

+            <div data-bind="visible: selectMode() == 'auto_dial'" class="row form-group">

+                <div class="col-xs-3"></div>

+                <div class="col-xs-8 label-absolute">

+                    <p id="roamBtn" data-bind="css:{'checkbox_selected': isAllowedRoaming()=='on'}, click: setAllowedRoaming" manualControl="true"class="checkbox floatleft margintop5 checkboxToggle">

+                        <input type="checkbox" id="isAllowedRoaming" value="on" data-bind="checked:isAllowedRoaming()=='on'" />

+                    </p>

+                    <label for="isAllowedRoaming" data-trans="dial_roaming_remind" class="update_inline floatleft lineheight25"></label>

+                </div>

+            </div>

+    </div>

+    <div class="form-buttons">

+        <input type="button" data-bind='click: save, enable: enableFlag' data-trans="apply" class="btn btn-primary"/>

+    </div>

+    <div class="form-note">

+        <div class="notes-title">&nbsp;</div>

+        <ul class="notes-content">

+			<li data-trans="diconneted_operate_note"></li>

+            <li data-trans="dial_setting_note_automatic"></li>

+            <li data-trans="dial_setting_note_manual"></li>

+        </ul>

+    </div>

+</div>

+</form>

+    </div>

+</div>

+</div>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/network_info.html b/lynq/MD310EU/ap/app/zte_webui/subpg/network_info.html
new file mode 100755
index 0000000..84dabe4
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/network_info.html
@@ -0,0 +1,64 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='net_setting'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+            <div class="nav_right">

+                <ul>

+                    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

+                    <li><a data-trans="net_select" href="#network_choose"></a></li>

+                    <li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                    <li class="active"><a data-trans="net_info" href="#net_status"></a></li>

+                </ul>

+            </div>

+	    </div>

+

+        <div class="col-xs-10">

+            <form role="form">

+                <div class="form-body">

+                    <h3 data-trans="net_info" class="form-title"></h3>

+                    <div class="content">

+                        <div class="row form-group">

+                            <label data-trans="pci" class="col-xs-5"></label>

+				            <label data-bind="text: pci" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="sinr" class="col-xs-5"></label>

+				            <label data-bind="text: sinr" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="rsrp" class="col-xs-5"></label>

+				            <label data-bind="text: rsrp" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="rsrq" class="col-xs-5"></label>

+				            <label data-bind="text: rsrq" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="plmn" class="col-xs-5"></label>

+				            <label data-bind="text: plmn" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="cellid" class="col-xs-5"></label>

+				            <label data-bind="text: cellid" class="col-xs-7"></label>

+                        </div>

+                        <div class="row form-group">

+                            <label data-trans="band" class="col-xs-5"></label>

+				            <label data-bind="text: band" class="col-xs-7"></label>

+                        </div>

+                    </div>

+                </div>

+            </form>

+        </div>

+    </div>

+</div>
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/network_net_select.html b/lynq/MD310EU/ap/app/zte_webui/subpg/network_net_select.html
new file mode 100755
index 0000000..fa6f286
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/network_net_select.html
@@ -0,0 +1,107 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='net_setting'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+		<div class="nav_right">

+			<ul>

+			    <li><a data-trans="dial_mode" href="#conn_set"></a></li>

+				<li class="active"><a data-trans="net_select" href="#network_choose"></a></li>

+				<li><a data-trans="apn_setting" href="#cgdcont_set"></a></li>

+                <li><a data-trans="net_info" href="#net_status"></a></li>

+			</ul>

+		</div>

+	    </div>

+

+	    <div class="col-xs-10">

+

+<form role="form">

+<div class="form-body">

+	    <h3 data-trans="net_select" class="form-title"></h3>

+    <div class="content">

+        <div class="row form-group">

+            <label data-trans='net_select' class="col-xs-4 side-right"></label>

+            <div class="col-xs-8">

+                <div class="row">

+                    <div class="col-xs-4">

+                        <input id='auto_select' type="radio" name="selectGroup" value="auto_select" data-bind="checked: selectMode, enable: enableFlag" />

+                        <label for='auto_select' data-trans='auto_select'></label>

+                    </div>

+                    <div class="col-xs-6" style="display: none;">

+                        <select id="type" data-transid='auto_select_type' data-bind="options: types, value: selectedType, optionsText: transOption('auto_select_type'), optionsValue: 'value', enable: enableFlag() && selectMode() == 'auto_select'" class="form-control"></select>

+                    </div>

+                </div>

+            </div>

+        </div>

+        <div class="row form-group">

+            <label class="col-xs-4 side-right"></label>

+            <div class="col-xs-8">

+                <input id='manual_select' type="radio" name="selectGroup"  value="manual_select" data-bind="checked: selectMode, enable: enableFlag" />

+                <label for='manual_select' data-trans='manual_select'></label>

+            </div>

+        </div>

+    </div>

+    <div class="form-buttons">

+        <input type="button" data-bind='click: save, visible: selectMode() == "auto_select", enable: enableFlag, css: {disabled: !enableFlag()}' data-trans='apply' class="btn btn-primary"/>

+        <input type="button" data-bind='click: search, visible: selectMode() != "auto_select", enable: enableFlag, css: {disabled: !enableFlag()}' data-trans='search' class="btn btn-primary"/>

+    </div>

+

+    <div data-bind='visible: networkList().length > 0 && selectMode() == "manual_select"' class="content">

+        <div class="form-title">

+            <h2 data-trans='network_list'></h2>

+        </div>

+        <div class="content">

+            <div class="ko-grid-container marginnone">

+                <table cellspacing="0" cellpadding="0" class="table table-striped table-hover">

+                    <thead>

+                    <tr>

+                        <th width="12%" data-trans="option"></th>

+                        <th width="16%" data-trans="net_status"></th>

+                        <th width="21%" data-trans="network_provider"></th>

+                        <th width="18%" data-trans="mccmnc"></th>

+                        <th width="18%" data-trans="networktype"></th>

+                        <th width="15%" data-trans="subnet"></th>

+                    </tr>

+                    </thead>

+                    <tbody data-bind='foreach: networkList'>

+                    <tr data-bind="css:{odd:$index()%2==1, even:$index()%2==0}">

+                        <td><input type="radio" name="networkGroup"

+                                   data-bind='value: $root.networkValue($data), checked: $root.selectNetwork, attr: {id: $root.networkValue($data)}, enable: $root.enableFlag'/>

+                        </td>

+                        <td data-bind='attr: {"data-trans": $root.networkStatusId($data)}, text: $root.networkStatus($data)'></td>

+                        <td data-bind='text: $root.operatorName($data)'></td>

+                        <td data-bind='text: $root.networkText($data)'></td>

+                        <td data-bind='attr: {"data-trans": $root.networkTypeId($data)}, text: $root.networkType($data)'></td>

+                        <td data-bind='attr: {"data-trans": $root.subnetTypeId($data)}, text: $root.subnetworkType($data)'></td>

+                    </tr>

+                    </tbody>

+                </table>

+            </div>

+        </div>

+	     <div class="form-buttons">

+		     <input type="button" data-bind='click: register, enable: selectNetwork() != "" && enableFlag, css: {disabled: selectNetwork() == "" || !enableFlag()}' data-trans='register' class="btn btn-primary"/>

+		 </div>

+     </div>

+    <div class="form-note">

+        <div class="notes-title">&nbsp;</div>

+        <ul class="notes-content">

+			<li data-trans="diconneted_operate_note"></li>

+            <li data-trans="net_select_note_automatic"></li>

+            <li data-trans="net_select_note_manual"></li>

+        </ul>

+    </div>

+</div>

+</form>

+    </div>

+</div>

+</div>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/ota_update.html b/lynq/MD310EU/ap/app/zte_webui/subpg/ota_update.html
new file mode 100755
index 0000000..bac683a
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/ota_update.html
@@ -0,0 +1,242 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='advanced_settings'></h1>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+			<div class="nav_right">

+				<ul>

+					<li data-bind="visible: isDataCard"><a href="#demilitarized_zone" data-trans="dmz_setting"></a></li>

+					<li data-bind="visible: isDataCard"><a href="#pin_mode" data-trans="pin_management"></a></li>

+					<li data-bind="visible: !isDataCard"><a href="#wlan_sleep" data-trans="sleep_mode"></a></li>

+					<li data-bind="visible: !isDataCard"><a href="#route_set" data-trans="router_setting"></a></li>

+					<li data-bind="visible: !isDataCard"><a href="#filter_main" data-trans="firewall"></a></li>

+					<li data-bind="visible:hasUpdateCheck" class="active"><a href="#fota" data-trans="update_settings"></a></li>

+					<!-- <li data-bind="visible:hasUssd"><a href="#usat" data-trans="USSD"></a></li> -->

+					<li data-bind="visible:hasDdns"><a href="#dynamic_dns" data-trans="DDNS"></a></li>

+					<li data-bind="visible: !isDataCard"><a href="#more" data-trans="others"></a></li>

+				</ul>

+			</div>

+		</div>

+

+<div class="col-xs-10">

+<form id="frmOTAUpdate" role="form" data-bind="visible: updateType() == 'mifi_fota'">

+     <!-- <h3 data-trans="ota_update_manual" class="form-title"></h3 --> 

+    <div class="form-body margin-top-20">

+        <!--div class="content">

+            <div class="row">

+                <div class="col-xs-6">

+                    <span data-trans="ota_last_update_check"></span>

+                    <span data-bind="text: lastCheckTime"></span>

+                </div>

+                <div class="col-xs-6 align-right">

+                    <input id="btnCheckNewVersion" data-bind="click:checkNewVersion" data-trans="ota_check_new_version" type="button" class="btn btn-primary margin-right-20"/>

+                </div>

+            </div>

+			<div class="form-note">

+                <div class="notes-title">&nbsp;</div>

+                <ul class="notes-content">

+                    <li data-trans="ota_check_new_version_desc"></li>

+                </ul>

+		    </div>

+        </div-->

+

+        <!--div class="form-title" data-trans='ota_update_manual'></div>

+        <div class="content">

+            <span class="paddingleft25" data-trans="ota_check_new_version_desc"></span>

+        </div>

+        <div class="form-buttons">

+            <input id="btnCheckNewVersion" type="button" class="btn btn-primary" data-trans="ota_check_new_version"

+                   data-bind="click:checkNewVersion"/>

+        </div>

+        <div class="form-title" data-trans='ota_update_setting'></div-->

+        <div class="content">

+			<!--

+            <h3 data-trans="ota_update_setting" class="form-title"></h3>

+            <div class="row">

+                <label data-trans="ota_auto_update_switch" class="col-xs-4 side-right"></label>

+                <div class="col-xs-8">

+                    <div class="row form-group">

+                        <div class="col-xs-3">

+                            <input id="auto_update_enable" name="updateMode" data-bind="checked: updateMode" type="radio" value="1"/>

+                            <label data-trans="enable" for="auto_update_enable"></label>

+                        </div>

+                        <div class="col-xs-3">

+                            <input id="auto_update_disable" name="updateMode" data-bind="checked: updateMode" type="radio" value="0"/>

+                            <label data-trans="disable" for="auto_update_disable"></label>

+                        </div>

+                    </div>

+                </div>

+            </div>

+            <div class="row form-group" data-bind="visible: false">

+                <label data-trans="ota_update_interval_day" for="selInterValDay" class="col-xs-4 side-right"></label>

+

+                <div class="col-xs-3">

+                    <select id="selInterValDay" name="selInterValDay" data-bind="value: updateIntervalDay" class="form-control">

+                        <option data-trans="ota_update_every_day" value="1"></option>

+                        <option data-trans="ota_update_15_day" value="15"></option>

+                        <option data-trans="ota_update_30_day" value="30"></option>

+                    </select>

+                </div>

+            </div>

+            <div class="row form-group" data-bind="visible: updateMode()=='1'">

+                <div class="col-xs-12 padding-top-10">

+                    <p class="checkbox" data-bind="css:{'checkbox_selected': allowRoamingUpdate()=='1'}, click: clickAllowRoamingUpdate"

+                       manualControl="true">

+                        <input id="chkUpdateRoamPermission" name="chkUpdateRoamPermission" data-bind="checked:allowRoamingUpdate()=='1'" type="checkbox" value="1"/>

+                    </p>

+                    <label data-trans="ota_update_roaming_remind" class="update_inline floatleft"></label>

+                </div>

+            </div>

+

+            <div class="form-buttons">

+                <input id="btnApply" data-trans="apply" type="submit" formmethod="post" class="btn btn-primary"/>

+            </div-->

+

+            <div class="row form-group">

+                <label data-trans="ota_manual_upgrade_url" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-3">

+                        <input id="upgrade_url" type="text" size="128" data-bind="value:updateURL" class="required form-control">

+                    </div>

+            </div>

+            <div class="form-buttons">

+                <input id="btnOtaUpgApply" data-bind="click:ota_upgrade_apply" data-trans="download" type="submit" formmethod="post" class="btn btn-primary"/>

+            </div>

+

+            <div><br></div>

+            <div><br></div>

+            <div class="row form-group">

+                <label data-trans="wefota_check_new_version" class="col-xs-4 side-right"></label>

+            </div>

+            <div class="form-buttons">

+                <input id="btnOtaUpgCheck" data-bind="click:ota_upgrade_check" data-trans="ota_check_new_version" type="submit" formmethod="post" class="btn btn-primary"/>

+            </div>

+

+            <!--div class="form-note">

+                <div class="notes-title">&nbsp;</div>

+                <ul class="notes-content">

+                    <li data-trans="fota_note1"></li>

+                </ul>

+		    </div-->

+		</div>

+

+	</div>

+</form>

+<!--form id="frmNativeUpdate" data-bind="visible: updateType() == 'mifi_local'" method="post" name="UploadFile" id="UploadFile" action="../../cgi-bin/upload.cgi" enctype="multipart/form-data" target="ifr"> 

+	<div class="form-body">

+		<h3 class="form-title" data-trans="software_upload"></h3>

+		<table style="width:100%">  

+			<input type="text" id="upfile" size="20" style="height:35px; width:200px; display:inline-block;" readonly />

+			<input type="button" class="btn btn-primary" data-trans='browse_btn' style="height:34px; width:81px;" />

+			<input id="fileName" class="form-control" type="file" name="fileName" style="margin-left: 15px;background-color:#E3E3E3;opacity:0;filter:alpha(opacity=0);position:absolute;left:0px; width:280px; display:inline-block;" /> 

+			<input class="btn btn-primary" id="fileuploadsubmit" type="submit" formmethod="post" data-trans="ota_title" style="float:right; margin-top:8px; margin-right: 20px;" /> 

+		</table>  

+		<iframe name="ifr" id="ifr" style="display:none;"></iframe>

+	</div>

+</form-->

+

+

+<br><br>

+<form id="uploadForm" action="../../cgi-bin/upload/upload.cgi" method="post" enctype="multipart/form-data">

+	<h3 class="form-title" data-trans="local_upload"></h3>

+    <div class="row form-group col-xs-4 side-right">

+        <label for="fileInput" data-trans="software_upload" style="display: none;"></label>

+        <input class="required form-control btn btn-primary" type="file" id="fileInput" name="file" style="display: none;">

+        <label for="fileInput" class="required btn btn-primary" data-trans="browse_btn" style="width: 70px;"></label>

+        <span id="fileNameDisplay" style="margin-left: 10px; font-weight: normal;"></span>

+    </div>

+    <br><br>

+    <div style="text-align: right; padding-right: 20px;">

+        <button class="btn btn-primary" type="submit" data-trans="ota_title" id="submitButton" disabled></button>

+    </div>

+</form>

+

+

+    <div id="uploadSection" data-bind="visible: updateType() == 'mifi_local'">

+        <h3 class="form-title" data-trans="software_upload"></h3>

+        <iframe id="fileUploadIframe" name="fileUploadIframe" frameborder="0" height="0" scrolling="no" style="height:0px;width:0px;" width="0"></iframe>

+        <form id="fileUploadForm" name="fileUploadForm" action="../../cgi-bin/upload/upload.cgi" enctype="multipart/form-data" method="post" target="fileUploadIframe">

+            <input id="fileField" name="filename" dir="ltr" maxlength="200" type="file"/>

+            <div class="fileUploadDiv">

+                <input id="fileUploadApplyBtn" name="fileUploadApplyBtn" data-trans="ota_title" type="button" onclick="fileUploadSubmitClickHandler();" class="btn btn-primary margin-left-5 margin-top-2"/>

+            </div>

+            <div class="clear"></div>

+        </form>

+    </div>

+	<form data-bind="visible: updateType() == 'mifi_local'">

+	    <div class="form-body">

+	    <div class="form-note">

+            <div class="notes-title">&nbsp;</div>

+            <ul class="notes-content">

+                <li data-trans="local_note"></li>

+            </ul>

+		</div>

+		</div>

+	</form>

+</div>

+</div>

+</div>

+

+<script>

+    const fileInput = document.getElementById('fileInput');

+    const fileNameDisplay = document.getElementById('fileNameDisplay');

+    const submitButton = document.getElementById('submitButton');

+    const uploadForm = document.getElementById('uploadForm');

+

+    fileInput.addEventListener('change', function () {

+        const fileName = fileInput.files[0] ? fileInput.files[0].name : '';

+        fileNameDisplay.textContent = fileName;

+        

+        if (fileName) {

+            submitButton.disabled = false;

+        } else {

+            submitButton.disabled = true;

+        }

+    });

+

+	uploadForm.addEventListener('submit', function (event) {

+		event.preventDefault();

+		showLoading("upload_file");

+

+		const formData = new FormData(uploadForm);

+		console.log("Form data submitted:", formData);

+

+		fetch(uploadForm.action, {

+			method: 'POST',

+			body: formData

+		})

+		.then(response => {

+			if (!response.ok) {

+				throw new Error(`HTTP error! Status: ${response.status}`);

+			}

+			return response.text();

+		})

+		.then(text => {

+			console.log("Server response:", text);

+			try {

+				const data = JSON.parse(text);

+				if (data.success) {

+					showAlert("start_update");

+				} else {

+					errorOverlay("verify_error");

+				}

+			} catch (error) {

+				console.error("Upload error:", error);

+				errorOverlay("File upload successful: Server returned non-JSON response.");

+			}

+		})

+		.catch(error => {

+			console.error("Upload error:", error);

+			errorOverlay("File upload failed!");

+		});

+	});

+</script>
\ No newline at end of file
diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/ussd.html b/lynq/MD310EU/ap/app/zte_webui/subpg/ussd.html
new file mode 100755
index 0000000..7310027
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/ussd.html
@@ -0,0 +1,85 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title">

+                <h1 data-trans='USSD'></h1>

+            </div>

+        </div>

+    </div>

+<div class="row">

+    <!-- <div class="col-xs-2">

+		<div class="nav_right">

+			<ul>

+			    <li><a data-trans="sleep_mode" href="#wlan_sleep"></a></li>

+				<li><a data-trans="router_setting" href="#route_set"></a></li>

+				<li><a data-trans="firewall" href="#filter_main"></a></li>

+				<li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>

+				<li class="active"><a data-trans="USSD" href="#usat"></a></li>

+				<li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>

+				<li><a data-trans="others" href="#more"></a></li>

+			</ul>

+		</div>

+	</div> -->

+

+	<div class="innerContainer">

+

+    <form id="frmUSSD">

+        <div class="col-xs-1 margin-top-15">

+	</div>

+	<div class="col-xs-11">

+	    <h3 data-trans="USSD" class="form-title"></h3>

+        <div id="USSD_send_div"  data-bind="visible: USSDLocation()==0" class="margin-top-20">

+            <div class="content">

+                <div class="row form-group">

+                    <label data-trans="ussd_send_to" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-3">

+                        <input id="USSD_send" type="text" size="20" data-bind="value:USSDSend,valueUpdate:'afterkeydown'" class="required form-control">

+                    </div>

+                </div>

+                <div class="form-buttons">

+                    <input id="sendToNet" type="button" data-trans='ussd_send' data-bind="disable:USSDSend().length<=0,css:{disabled:USSDSend().length<=0},click:sendToNet" class="btn btn-primary marginright10" />

+                    <!--input type="reset"  data-trans='ussd_cancel' data-bind="disable:USSDSend().length<=0,css:{disabled:USSDSend().length<=0},click:resetUSSD" id="cancelToNet" class="btn btn-primary"/-->

+                </div>

+            </div>

+        </div>

+        <div id="USSD_reply_div"  data-bind="visible: USSDLocation()==1" class="margin-top-20">

+            <!--<div class="form-title" data-trans='ussd_contents'></div>!-->

+            <div class="content">

+                <div class="row form-group">

+                    <label data-trans="ussd_contents" class="col-xs-4 side-right"></label>

+                    <div class="col-xs-3">

+                        <textarea id="USSD_Content" rows="8" cols="50" readonly="readonly" name="USSD_Content"></textarea>

+                    </div>

+                </div>

+                <div class="form-buttons">

+                    <input type="button" data-trans='ussd_cancel' data-bind="click:noReplyCancel" class="btn btn-primary marginright10"/>

+                </div>

+                <div id="ussd_action" data-bind="visible: ussd_action()!=0">

+                    <div class="row form-group">

+                        <label class="col-xs-4 side-right" data-trans="ussd_reply_to"></label>

+                        <div class="col-xs-3">

+                            <input id="USSD_reply" type="text" name="USSD_reply" size="20" data-bind="value:USSDReply"  class="required form-control">

+                        </div>

+                    </div>

+                    <div class="form-buttons">

+                        <input type="button" data-trans='ussd_reply' data-bind="click:replyToNet" class="btn btn-primary marginright10"/>

+                    </div>

+                </div>

+            </div>

+        </div>

+        <div class="form-note">

+            <div class="notes-title">&nbsp;</div>

+            <ul class="notes-content">

+                <li data-trans="ussd_note1"></li>

+            </ul>

+        </div>

+	</div>

+	</form>

+    </div>

+    </div>

+</div>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_sleep_mode.html b/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_sleep_mode.html
new file mode 100755
index 0000000..8a3234c
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_sleep_mode.html
@@ -0,0 +1,168 @@
+<div id="innerContainer">

+<div class="row header-row">

+    <div class="col-xs-1">

+        <a href="#main">

+            <img alt="" src="pic/direct-back.png">

+        </a>

+    </div>

+    <div class="col-xs-11">

+        <div class="form-title">

+            <h1 data-trans='advanced_settings'></h1>

+        </div>

+    </div>

+</div>

+<div class="row">

+    <div class="col-xs-2">

+		<div class="nav_right">

+		    <ul>

+            <li class="active"><a data-trans="sleep_mode" href="#wlan_sleep"></a></li>

+            <li><a data-trans="router_setting" href="#route_set"></a></li>

+            <li><a data-trans="firewall" href="#filter_main"></a></li>

+            <li data-bind="visible:hasUpdateCheck"><a data-trans="update_settings" href="#fota"></a></li>

+            <!-- <li data-bind="visible:hasUssd"><a data-trans="USSD" href="#usat"></a></li> -->

+			<li data-bind="visible:hasDdns"><a data-trans="DDNS" href="#dynamic_dns"></a></li>

+            <li><a data-trans="others" href="#more"></a></li>

+        </ul>

+	    </div>

+	</div>

+    <div class="col-xs-10">

+

+

+<div class="form-body margin-top-20">

+    <!--hide wifi range settings until sw implements it-->

+    <form id='wifiRangeForm'>

+        <h3 data-trans="wifi_range_settings" class="form-title"></h3>

+        <div class="content">

+            <div class="row">

+                <label data-trans='wifi_range' class="col-xs-3"></label>

+                <div class="col-xs-8">

+                    <input id='short_mode' data-bind="checked: wifiRangeMode" name="rangeGroup" type="radio" value="short_mode"/>

+                    <label data-bind="visible: !isCPE" data-trans='wifi_short_mode' for='short_mode'></label>

+                    <label data-bind="visible: isCPE" data-trans='wifi_des_short_mode' for='short_mode'></label>

+                </div>

+            </div>

+            <div class="row">

+                <label class="col-xs-3"></label>

+                <div class="col-xs-8">

+                    <input id='medium_mode' data-bind="checked: wifiRangeMode" name="rangeGroup" type="radio" value="medium_mode"/>

+                    <label data-trans='wifi_medium_mode' for='medium_mode'></label>

+                </div>

+            </div>

+            <div class="row">

+                <label class="col-xs-3"></label>

+                <div class="col-xs-8">

+                    <input id='long_mode' data-bind="checked: wifiRangeMode" name="rangeGroup" type="radio" value="long_mode"/>

+                    <label data-trans='wifi_long_mode' for='long_mode'></label>

+                </div>

+            </div>

+        </div>

+        <div class="form-buttons">

+            <input data-trans='apply' type="submit" formmethod="post" class="btn btn-primary"/>

+        </div>

+        <div class="form-note">

+            <div class="notes-title">&nbsp;</div>

+            <ul class="notes-content">

+                <li data-trans="wifi_range_note_range"></li>

+                <li class="no-style">

+                    <ul data-bind="visible: !isCPE">

+                        <li data-trans="wifi_range_note_short"></li>

+                        <li data-trans="wifi_range_note_medium"></li>

+                        <li data-trans="wifi_range_note_long"></li>

+                    </ul>

+                    <ul data-bind="visible: isCPE">

+                        <li data-trans="wifi_range_note_short_cpe"></li>

+                        <li data-trans="wifi_range_note_medium_cpe"></li>

+                        <li data-trans="wifi_range_note_long_cpe"></li>

+                    </ul>

+                </li>

+            </ul>

+        </div>

+    </form>

+    <form id="frmTsw" data-bind="visible: showTSWDiv">

+        <div class="form-body">

+            <h3 data-trans="time_sleep_wake_up" class="form-title"></h3>

+            <div class="content">

+                <div class="row form-group">

+                    <label data-trans="tsw_settings" class="col-xs-3 side-right"></label>

+                    <div class="col-xs-6">

+                        <div class="row">

+                            <div class="col-xs-4">

+                                <input id="tswEnable" data-bind="checked: openEnable" name="tswGrp" type="radio" value="1"/>

+                                <label data-trans="enable" for="tswEnable"></label>

+                            </div>

+                            <div class="col-xs-4">

+                                <input id="tswDisable" data-bind="checked: openEnable" name="tswGrp" type="radio" value="0"/>

+                                <label for="tswDisable" data-trans="disable"></label>

+                            </div>

+                        </div>

+                    </div>

+                </div>

+                <div data-bind="visible: openEnable() == '1'" class="row form-group">

+                    <div class="col-xs-3">

+                        <span data-trans="tsw_timer_on"></span>

+                    </div>

+                    <div class="col-xs-9">

+                        <div>

+                            <input id="openH" data-bind="value: openH" min="0" max="23" maxlength="2" name="openH" style="width: 27px;display:inline-block;padding: 5px 4px;" type="text" class="required form-control"> :

+                            <input id="openM" data-bind="value: openM" min="0" max="59" maxlength="2" name="openM" style="width: 27px;display:inline-block;padding: 5px 4px;" type="text" class="required form-control">

+                        </div>

+                    </div>

+                    <div id="openErrorDiv" class="col-xs-9 col-md-offset-3"></div>

+                </div>

+                <div data-bind="visible: openEnable() == '1'" class="row form-group">

+                    <div class="col-xs-3">

+                        <span data-trans="tsw_timer_off"></span>

+                    </div>

+                    <div class="col-xs-9">

+                        <input id="closeH" data-bind="value: closeH" min="0" max="23" maxlength="2" name="closeH" style="width: 27px;display:inline-block;padding: 5px 4px;" type="text" class="required form-control"> :

+                        <input id="closeM" data-bind="value: closeM" min="0" max="59" maxlength="2" name="closeM" style="width: 27px;display:inline-block;padding: 5px 4px;" type="text" class="required form-control">

+                    </div>

+                    <div id="closeErrorDiv" class="col-xs-9 col-md-offset-3"></div>

+                </div>

+            </div>

+            <div class="form-buttons">

+                <input data-trans="apply" type="submit" formmethod="post" class="btn btn-primary"/>

+            </div>

+            <div class="form-note">

+                <div class="notes-title">&nbsp;</div>

+                <ul class="notes-content">

+                    <li data-trans="tsw_note"></li>

+                    <li data-trans="tsw_note_on"></li>

+                    <li data-trans="tsw_note_off"></li>

+                </ul>

+            </div>

+        </div>

+    </form>

+    <form id='sleepModeForm' data-bind="visible: showSleepDiv">

+        <h3 data-trans='wifi_sleep' class="form-title"></h3>

+        <div class="form-group">

+            <div class="row">

+                <label data-trans='wifi_sleep_mode' class="col-xs-3" for='power_save_mode'></label>

+                <div class="col-xs-4" style="border: none;">

+                <!-- <select id="power_save_mode" data-bind="options: option, value: wifiSleepedMode, optionsText: transOption('sleep_select'), optionsValue: 'value'" data-transid='sleep_select' class="form-control"></select> -->

+                <label id="power_save_mode" data-trans='sleep_select_1' style="border: none;"></label>

+                </div>

+            </div>

+        </div>

+        <div class="form-group">

+            <div class="row">

+                <label data-trans='sleep_time' class="col-xs-3" for='mode'></label>

+                <div class="col-xs-4">

+                <select id="mode" data-bind="options: modes, value: selectedMode, optionsText: transOption('sleep_mode'), optionsValue: 'value'" data-transid='sleep_mode' class="form-control"></select>

+                </div>

+            </div>

+        </div>

+        <div class="form-buttons">

+            <input data-trans='apply' type="submit" formmethod="post" class="btn btn-primary"/>

+        </div>

+        <div class="form-note">

+            <div class="notes-title">&nbsp;</div>

+            <ul class="notes-content">

+                <li data-trans="wifi_sleep_note_info"></li>

+            </ul>

+        </div>

+    </form>

+</div>

+    </div>

+</div>

+</div>

diff --git a/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_wps.html b/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_wps.html
new file mode 100755
index 0000000..0a96aa6
--- /dev/null
+++ b/lynq/MD310EU/ap/app/zte_webui/subpg/wifi_wps.html
@@ -0,0 +1,123 @@
+<div id="innerContainer">

+    <div class="row header-row">

+        <div class="col-xs-1">

+            <a href="#main">

+                <img alt="" src="pic/direct-back.png">

+            </a>

+        </div>

+        <div class="col-xs-11">

+            <div class="form-title form-title-multi">

+                <h1 data-trans='wifi_wireless_settings'></h1>

+                <p data-trans="wifi_main_sub_title"></p>

+            </div>

+        </div>

+    </div>

+    <div class="row">

+        <div class="col-xs-2">

+		    <div class="nav_right">

+				<ul data-bind="visible: isShowSSIDInfoDiv">

+					<li><a data-trans="multi_ssid_1" data-bind="attr:{'data-trans': hasMultiSSID ? 'multi_ssid_1':'ssid_title'}" href="#wlan_main"></a></li>

+					<li data-bind="visible: hasMultiSSID"><a data-trans="multi_ssid_2" href="#wlan_guset"></a></li>

+					<li class="active"><a data-trans="wps" href="#wlan_wps"></a></li>

+					<li data-bind="visible: hasAPStation"><a data-trans="ap_station" href="#wlan_station"></a></li>

+					<li><a data-trans="wifi_advance" href="#wlan_adv"></a></li>

+					<li data-bind="visible: hasWlanMacfilter"><a data-trans="mac_filter" href="#filter_mac"></a></li>

+				</ul>

+			</div>

+		</div>

+        <div class="col-xs-10">

+

+<div class="form-body">

+    <form id="frmWifiSwitch" role="form">

+        <div class="content margin-top-20">

+            <div data-bind="visible: hasWifiSwitch" class="row form-group">

+                <label data-trans="wifi_switch" class="col-xs-4 side-right"></label>

+                <div class="col-xs-6">

+                    <div class="row">

+                        <div class="col-xs-4">

+                            <input id="wifi_switch_enable"

+                                   data-bind="checked: wifi_enable" name="wifi_switch" type="radio" value="1"/>

+                            <label data-trans="enable" for="wifi_switch_enable"></label>

+                        </div>

+                        <div class="col-xs-4">

+                            <input id="wifi_switch_disable"

+                                   data-bind="checked: wifi_enable" name="wifi_switch" type="radio" value="0"/>

+                            <label data-trans="disable" for="wifi_switch_disable"></label>

+                        </div>

+                    </div>

+                </div>

+            </div>

+            <div data-bind="visible: wifi_enable() == '1' && hasMultiSSID" class="row form-group">

+                <label data-trans="multi_ssid_enable" class="col-xs-4 side-right"></label>

+                <div class="col-xs-6">

+                    <div class="row">

+                        <div class="col-xs-4">

+                            <input id="multi_ssid_switch_enable"

+                                   data-bind="checked: multi_ssid_enable" name="multi_ssid_switch" type="radio" value="1"/>

+                            <label data-trans="enable" for="multi_ssid_switch_enable"></label>

+                        </div>

+                        <div class="col-xs-4">

+                            <input id="multi_ssid_switch_disable"

+                                   data-bind="checked: multi_ssid_enable" name="multi_ssid_switch" type="radio" value="0"/>

+                            <label data-trans="disable" for="multi_ssid_switch_disable"></label>

+                        </div>

+                    </div>

+                </div>

+            </div>

+            <div data-bind="visible: hasWifiSwitch || (wifi_enable() == '1' && hasMultiSSID)" class="form-buttons">

+                <input id="wifi_switch_apply" data-trans='apply' type="submit" formmethod="post" class="btn btn-primary"/>

+                <!--input id="wifi_switch_cancel" type="button" class="btn-1 " data-bind='click: function(){clear("switch");}' data-trans='cancel'/-->

+            </div>

+        </div>

+    </form>

+

+    <div data-bind="visible: isShowSSIDInfoDiv" class="content">

+        <form id='wpsForm' role="form">

+	    <h3 data-bind="attr:{'data-trans': 'wps'}" class="form-title"></h3>

+        <div data-bind="visible: hasMultiSSID" class="row form-group">

+            <label data-trans='ssid_title' for="multiSSID" class="col-xs-4 side-right"></label>

+            <div class="col-xs-4">

+                <select id="multiSSID" data-bind="options: mulOption, value: wpsSSID, optionsValue: 'value', optionsText: 'text'" class="valid form-control">

+				</select>

+            </div>

+        </div>

+		<!-- <div class="row form-group">

+            <label data-trans="wps" class="col-xs-4 side-right"></label>

+            <div class="col-xs-6">

+                <div class="row">

+                    <div class="col-xs-4">

+                        <input id="pinMode" data-bind="checked: wpsType" name="wpsMode" type="radio" value="PIN"/>

+                        <label data-trans="wps_pin" for="pinMode"></label>

+                    </div>

+                    <div class="col-xs-6">

+                        <input id="txtPin" data-bind="value: wpsPin, enable: wpsType() == 'PIN', valueUpdate: 'keypress'" maxlength="9" name="txtPin" type="text" class="required margin-left-5  form-control"/>

+                    </div>

+                </div>

+            </div>

+        </div> -->

+        <div class="row form-group">

+            <label data-trans="wps" class="col-xs-4 side-right"></label>

+            <label class="col-xs-4 side-right"></label>

+            <div class="col-xs-6">

+                <input id="pbcMode" data-bind="checked: wpsType" name="wpsMode" type="radio" value="PBC"/>

+                <label data-trans="wps_pbc" for="pbcMode"></label>

+            </div>

+        </div>

+        <div class="form-buttons">

+            <input data-bind="enable: wpsType() != '', css:{disabled: wpsType() == ''}" class="btn btn-primary" data-trans='apply' type="submit" formmethod="post"/>

+        </div>

+        <div class="form-note">

+            <div class="notes-title">&nbsp;</div>

+            <ul class="notes-content">

+                <li data-trans="wps_note_all"></li>

+                <!-- <li data-trans="wps_note_pin"></li> -->

+                <li data-trans="wps_note_pbc"></li>

+                <li data-trans="wps_note_wait"></li>

+            </ul>

+        </div>

+        </form>

+    </div>

+</div>

+    </div>

+</div>

+</div>