Merge "[Bugfix][T108-GSW][bug-view-1513] gsw_get_sig_info error" into mbtk_source_ds
diff --git a/mbtk/include/mbtk/mbtk_device.h b/mbtk/include/mbtk/mbtk_device.h
index f7e7cef..b2f1729 100755
--- a/mbtk/include/mbtk/mbtk_device.h
+++ b/mbtk/include/mbtk/mbtk_device.h
@@ -6,17 +6,15 @@
 * Author : lb
 * Date   : 2023/12/30 11:36:35
 */
-#ifndef _MBTK_DEVICE_V2_H
-#define _MBTK_DEVICE_V2_H
+#ifndef _MBTK_DEVICE_H
+#define _MBTK_DEVICE_H
 //#include "mbtk_type.h"
 
 #define MBTK_DEVICE_INFO_PARTITION_NAME "device_info"
 #define MBTK_DEVICE_INFO_PARTITION_TAG 0x87878787
-#define MBTK_DEVICE_INFO_CURR_VERSION 2
 
-#define MBTK_DEV_INFO_PARTITION_ADDR 0x02A20000
+#define MBTK_DEV_INFO_PARTITION_ADDR 0x005C0000
 
-// 78,147,482,134742231
 #define MBTK_BAND_ALL_GSM_DEFAULT 78             // GSM : ASR default.
 #define MBTK_BAND_ALL_WCDMA_DEFAULT 147          // WCDMA : ASR default.
 #define MBTK_BAND_ALL_TDLTE_DEFAULT 482          // TDD-LTE : ASR default.
@@ -27,45 +25,11 @@
 #define MBTK_BAND_ALL_NR_1_DEFAULT 256           // n41
 #define MBTK_BAND_ALL_NR_0_DEFAULT 134217877     // n1/n3/n5/n8/n28
 
-#define MBTK_BAND_CN_GSM_DEFAULT 11             // GSM : B3/B8 (PGSM 900/DCS GSM 1800/EGSM 900)
-#define MBTK_BAND_CN_WCDMA_DEFAULT 145          // WCDMA : B1/B5/B8
-#define MBTK_BAND_CN_TDLTE_DEFAULT 482          // TDD-LTE : B34/B38/B39/B40/B41
-#define MBTK_BAND_CN_FDDLTE_DEFAULT 149         // FDD-LTE : B1/B3/B5/B8
-#define MBTK_BAND_CN_EXT_LTE_DEFAULT 0          // EXT-LTE
-#define MBTK_BAND_CN_NR_3_DEFAULT 0
-#define MBTK_BAND_CN_NR_2_DEFAULT 24576         // n78/n79
-#define MBTK_BAND_CN_NR_1_DEFAULT 384           // n40/n41
-#define MBTK_BAND_CN_NR_0_DEFAULT 134217877     // n1/n3/n5/n8/n28
-
-#define MBTK_BAND_EU_GSM_DEFAULT 11             // GSM : B3/B8 (PGSM 900/DCS GSM 1800/EGSM 900)
-#define MBTK_BAND_EU_WCDMA_DEFAULT 145          // WCDMA : B1/B5/B8
-#define MBTK_BAND_EU_TDLTE_DEFAULT 416          // TDD-LTE : B38/B40/B41
-#define MBTK_BAND_EU_FDDLTE_DEFAULT 134742229   // FDD-LTE : B1/B3/B5/B7/B8/B20/B28
-#define MBTK_BAND_EU_EXT_LTE_DEFAULT 0          // EXT-LTE
-#define MBTK_BAND_EU_NR_3_DEFAULT 0
-#define MBTK_BAND_EU_NR_2_DEFAULT 12352         // n71/n77/n78
-#define MBTK_BAND_EU_NR_1_DEFAULT 416           // n38/n40/n41
-#define MBTK_BAND_EU_NR_0_DEFAULT 134742229     // n1/n3/n5/n7/n8/n20/n28
-
-#define MBTK_BAND_SA_GSM_DEFAULT 79             // GSM : B2/B3/B5/B8(GSM 850/PGSM 900/EGSM 900/DCS GSM 1800/PCS GSM 1900)
-#define MBTK_BAND_SA_WCDMA_DEFAULT 155          // WCDMA : B1/B2/B4/B5/B8
-#define MBTK_BAND_SA_TDLTE_DEFAULT 128          // TDD-LTE : B40
-#define MBTK_BAND_SA_FDDLTE_DEFAULT 134217951  // FDD-LTE : B1/B2/B3/B4/B5/B7/B8/B28
-#define MBTK_BAND_SA_EXT_LTE_DEFAULT 2          // EXT-LTE : B66
-#define MBTK_BAND_SA_NR_3_DEFAULT MBTK_BAND_ALL_NR_3_DEFAULT
-#define MBTK_BAND_SA_NR_2_DEFAULT MBTK_BAND_ALL_NR_2_DEFAULT
-#define MBTK_BAND_SA_NR_1_DEFAULT MBTK_BAND_ALL_NR_1_DEFAULT
-#define MBTK_BAND_SA_NR_0_DEFAULT MBTK_BAND_ALL_NR_0_DEFAULT
-
 #define MBTK_DEVICE_INFO_ITEM_STR_BASIC "BASIC"
 #define MBTK_DEVICE_INFO_ITEM_STR_FOTA "FOTA"
 #define MBTK_DEVICE_INFO_ITEM_STR_MODEM "MODEM"
 #define MBTK_DEVICE_INFO_ITEM_STR_LOG "LOG"
 
-#define MBTK_DEVICE_INFO_ITEM_ADDR_BASIC    0x100   // Header is 0x100
-#define MBTK_DEVICE_INFO_ITEM_ADDR_FOTA     0x500   // Basic is 1k
-#define MBTK_DEVICE_INFO_ITEM_ADDR_MODEM    0x900   // Fota is 1k
-#define MBTK_DEVICE_INFO_ITEM_ADDR_LOG      0xD00   // Modem is 1k
 
 #define MBTK_NET_SUPPORT_2G (1)
 #define MBTK_NET_SUPPORT_3G (1<<1)
@@ -94,6 +58,11 @@
 } mbtk_device_info_header_t;
 
 typedef enum {
+    DEV_INFO_VERSION_V1 = 1,
+    DEV_INFO_VERSION_V2,
+} mbtk_device_info_version_enum;
+
+typedef enum {
     MBTK_REBOOT_FLAG_NORMAL = 0,
     MBTK_REBOOT_FLAG_DOWNLOAD,
     MBTK_REBOOT_FLAG_POWER_OFF,  //Power off and restart
@@ -113,13 +82,41 @@
     uint8 revision_out[48];     // L508_X6v01.01b04.00
     uint8 revision_in[64];
     uint8 build_time[64];
-    uint8 asr_baseline[64];
+} mbtk_device_info_basic_v1_t;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    uint8 project[16];          // T108 / L508_X6
+    uint8 project_cust[16];     // T108_C1 / L508_X6_C1  (Refer to: Custom_Model in blf file.)
+    uint32 ab_support;          // 1 for ab
+    mbtk_device_info_reboot_flag_enum reboot_flag;
+    uint8 revision_out[48];     // L508_X6v01.01b04.00
+    uint8 revision_in[64];
+    uint8 build_time[64];
+    uint8 asr_baseline[128];
+} mbtk_device_info_basic_v2_t;
+
+typedef struct {
+    mbtk_device_info_version_enum version;
+    union {
+        mbtk_device_info_basic_v1_t v1;
+        mbtk_device_info_basic_v2_t v2;
+    } basic;
 } mbtk_device_info_basic_t;
 
 typedef struct {
     uint8 name[16];
     uint32 version;             // Default : 0x01
     uint32 state;               //
+} mbtk_device_info_fota_v1_t, mbtk_device_info_fota_v2_t;
+
+typedef struct {
+    mbtk_device_info_version_enum version;
+    union {
+        mbtk_device_info_fota_v1_t v1;
+        mbtk_device_info_fota_v2_t v2;
+    } fota;
 } mbtk_device_info_fota_t;
 
 typedef enum {
@@ -133,6 +130,17 @@
     uint8 name[16];
     uint32 version;             // Default : 0x01
     mbtk_modem_band_area_enum band_area;
+    uint32 band_gsm;
+    uint32 band_wcdma;
+    uint32 band_tdlte;
+    uint32 band_fddlte;
+    uint32 band_lte_ext;
+} mbtk_device_info_modem_v1_t;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    mbtk_modem_band_area_enum band_area;
     uint32 net_pref;    // Refor to : mbtk_net_pref_enum
     uint32 net_support; // 1:GSM      2:WCDMA   4:LTE   8:NR
     uint32 band_gsm;
@@ -144,25 +152,33 @@
     uint32 band_nr_2;
     uint32 band_nr_1;
     uint32 band_nr_0;
+} mbtk_device_info_modem_v2_t;
+
+typedef struct {
+    mbtk_device_info_version_enum version;
+    union {
+        mbtk_device_info_modem_v1_t v1;
+        mbtk_device_info_modem_v2_t v2;
+    } modem;
 } mbtk_device_info_modem_t;
 
 typedef struct {
     uint8 name[16];
     uint32 version;             // Default : 0x01
     uint32 state;               //
+} mbtk_device_info_log_v1_t, mbtk_device_info_log_v2_t;
+
+typedef struct {
+    mbtk_device_info_version_enum version;
+    union {
+        mbtk_device_info_log_v1_t v1;
+        mbtk_device_info_log_v2_t v2;
+    } log;
 } mbtk_device_info_log_t;
 
-
-/*
-* MBTK_DEVICE_INFO_ITEM_BASIC - mbtk_device_info_basic_t
-* MBTK_DEVICE_INFO_ITEM_FOTA - mbtk_device_info_fota_t
-* MBTK_DEVICE_INFO_ITEM_MODEM - mbtk_device_info_modem_t
-* MBTK_DEVICE_INFO_ITEM_LOG - mbtk_device_info_log_t
-*/
 int mbtk_dev_info_read(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size);
 int mbtk_dev_info_write(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size);
 int mbtk_dev_info_revision_get(char *revision_out, char *revision_in, char *project_cust, char *band_area,
             char* build_time);
 
-#endif /* _MBTK_DEVICE_V2_H */
-
+#endif /* _MBTK_DEVICE_H */
diff --git a/mbtk/include/mbtk/mbtk_info_api.h b/mbtk/include/mbtk/mbtk_info_api.h
old mode 100644
new mode 100755
index f713273..362b592
--- a/mbtk/include/mbtk/mbtk_info_api.h
+++ b/mbtk/include/mbtk/mbtk_info_api.h
@@ -818,6 +818,14 @@
     MBTK_ECALL_URC_ID_MSD_SEND_FAIL_FOR_NG  // NG-eCall fail to transfer MSD

 } mbtk_ecall_urc_id_enum;

 

+typedef struct{

+    uint8            cid; //cid number

+    bool             connect_state; //true: connect, false: disconnect;

+    bool             auto_urc; //urc generated by manual/auto dialing

+    uint8            pdp_result; //The cause of the dialing result 

+    mbtk_ipv4_info_t ipv4; //ipv4 info

+    mbtk_ipv6_info_t ipv6; //ipv6 info

+}mbtk_pdp_cb_info_s;

 

 int ipv6_2_str(const void *ipv6, void *ipv6_str);

 

diff --git a/mbtk/include/mbtk/mbtk_rtp.h b/mbtk/include/mbtk/mbtk_rtp.h
index 8786c36..a449c72 100755
--- a/mbtk/include/mbtk/mbtk_rtp.h
+++ b/mbtk/include/mbtk/mbtk_rtp.h
@@ -20,6 +20,8 @@
 
 int mbtk_rtp_remote_ip_set(const char *ipv4);
 
+int mbtk_rtp_vlan_set(const char *vlan);
+
 int mbtk_rtp_server_port_set(int port);
 
 int mbtk_rtp_client_port_set(int port);
diff --git a/mbtk/libmbtk_lib/Makefile b/mbtk/libmbtk_lib/Makefile
index 52d5886..3129978 100755
--- a/mbtk/libmbtk_lib/Makefile
+++ b/mbtk/libmbtk_lib/Makefile
@@ -78,7 +78,8 @@
 	common/mbtk_version.c \
 	common/mbtk_gpio.c \
 	common/mbtk_adc.c \
-	common/mbtk_loopbuff.c
+	common/mbtk_loopbuff.c \
+	common/mbtk_oem_rw.c 
 
 ifeq ($(MBTK_SOURCE_VERSION), 2)
 LOCAL_SRC_FILES += common/mbtk_led_control.c
diff --git a/mbtk/libmbtk_lib/common/mbtk_device_info.c b/mbtk/libmbtk_lib/common/mbtk_device_info.c
index 670a320..3924297 100755
--- a/mbtk/libmbtk_lib/common/mbtk_device_info.c
+++ b/mbtk/libmbtk_lib/common/mbtk_device_info.c
@@ -42,46 +42,6 @@
     mbtk_device_info_header_t info_header;
     memset(&info_header, 0, sizeof(mbtk_device_info_header_t));
 
-    switch(item_type) {
-        case MBTK_DEVICE_INFO_ITEM_BASIC:
-        {
-            if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_basic_t)) {
-                LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
-                return -1;
-            }
-            break;
-        }
-        case MBTK_DEVICE_INFO_ITEM_FOTA:
-        {
-            if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_fota_t)) {
-                LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
-                return -1;
-            }
-            break;
-        }
-        case MBTK_DEVICE_INFO_ITEM_MODEM:
-        {
-            if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_modem_t)) {
-                LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
-                return -1;
-            }
-            break;
-        }
-        case MBTK_DEVICE_INFO_ITEM_LOG:
-        {
-            if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_log_t)) {
-                LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
-                return -1;
-            }
-            break;
-        }
-        default:
-        {
-            LOGE("Item type[%d] error.", item_type);
-            return -1;
-        }
-    }
-
     mbtk_partition_info_t *partition_info = mbtk_partition_get();
     if(partition_info == NULL) {
         LOGE("mbtk_partition_get() fail.");
@@ -121,12 +81,7 @@
         goto fail;
     }
 
-    if(info_header.version != MBTK_DEVICE_INFO_CURR_VERSION) {
-        LOGE("Version error : %d", info_header.version);
-        goto fail;
-    }
-
-    LOGD("Item count:%d", info_header.item_count);
+    LOGD("Dev info version : %d, Item count:%d", info_header.version, info_header.item_count);
 
     if(info_header.item_header[item_type].addr == 0) {
         LOGE("No found item : %d", item_type);
@@ -134,9 +89,110 @@
     }
 
     lseek(fd, info_header.item_header[item_type].addr, SEEK_SET);
-    if (read(fd, item_ptr, item_size) != item_size) {
-        LOGE("Read fail:%d", errno);
-        goto fail;
+
+
+    switch(item_type) {
+        case MBTK_DEVICE_INFO_ITEM_BASIC:
+        {
+            if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_basic_t)) {
+                LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
+                goto fail;
+            }
+
+            mbtk_device_info_basic_t *basic_ptr = (mbtk_device_info_basic_t*)item_ptr;
+            basic_ptr->version = (mbtk_device_info_version_enum)info_header.version;
+            if(basic_ptr->version == DEV_INFO_VERSION_V1) {
+                if (read(fd, &(basic_ptr->basic.v1), sizeof(mbtk_device_info_basic_v1_t)) !=
+                        sizeof(mbtk_device_info_basic_v1_t)) {
+                    LOGE("Read fail:%d", errno);
+                    goto fail;
+                }
+            } else {
+                if (read(fd, &(basic_ptr->basic.v2), sizeof(mbtk_device_info_basic_v2_t)) !=
+                        sizeof(mbtk_device_info_basic_v2_t)) {
+                    LOGE("Read fail:%d", errno);
+                    goto fail;
+                }
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_FOTA:
+        {
+            if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_fota_t)) {
+                LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
+                goto fail;
+            }
+
+            mbtk_device_info_fota_t *fota_ptr = (mbtk_device_info_fota_t*)item_ptr;
+            fota_ptr->version = (mbtk_device_info_version_enum)info_header.version;
+            if(fota_ptr->version == DEV_INFO_VERSION_V1) {
+                if (read(fd, &(fota_ptr->fota.v1), sizeof(mbtk_device_info_fota_v1_t)) !=
+                        sizeof(mbtk_device_info_fota_v1_t)) {
+                    LOGE("Read fail:%d", errno);
+                    goto fail;
+                }
+            } else {
+                if (read(fd, &(fota_ptr->fota.v2), sizeof(mbtk_device_info_fota_v2_t)) !=
+                        sizeof(mbtk_device_info_fota_v2_t)) {
+                    LOGE("Read fail:%d", errno);
+                    goto fail;
+                }
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_MODEM:
+        {
+            if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_modem_t)) {
+                LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
+                goto fail;
+            }
+
+            mbtk_device_info_modem_t *modem_ptr = (mbtk_device_info_modem_t*)item_ptr;
+            modem_ptr->version = (mbtk_device_info_version_enum)info_header.version;
+            if(modem_ptr->version == DEV_INFO_VERSION_V1) {
+                if (read(fd, &(modem_ptr->modem.v1), sizeof(mbtk_device_info_modem_v1_t)) !=
+                        sizeof(mbtk_device_info_modem_v1_t)) {
+                    LOGE("Read fail:%d", errno);
+                    goto fail;
+                }
+            } else {
+                if (read(fd, &(modem_ptr->modem.v2), sizeof(mbtk_device_info_modem_v2_t)) !=
+                        sizeof(mbtk_device_info_modem_v2_t)) {
+                    LOGE("Read fail:%d", errno);
+                    goto fail;
+                }
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_LOG:
+        {
+            if(item_ptr == NULL || item_size != sizeof(mbtk_device_info_log_t)) {
+                LOGE("ARG error:item-%d, item_size-%d", item_type, item_size);
+                goto fail;
+            }
+
+            mbtk_device_info_log_t *log_ptr = (mbtk_device_info_log_t*)item_ptr;
+            log_ptr->version = (mbtk_device_info_version_enum)info_header.version;
+            if(log_ptr->version == DEV_INFO_VERSION_V1) {
+                if (read(fd, &(log_ptr->log.v1), sizeof(mbtk_device_info_log_v1_t)) !=
+                        sizeof(mbtk_device_info_log_v1_t)) {
+                    LOGE("Read fail:%d", errno);
+                    goto fail;
+                }
+            } else {
+                if (read(fd, &(log_ptr->log.v2), sizeof(mbtk_device_info_log_v2_t)) !=
+                        sizeof(mbtk_device_info_log_v2_t)) {
+                    LOGE("Read fail:%d", errno);
+                    goto fail;
+                }
+            }
+            break;
+        }
+        default:
+        {
+            LOGE("Item type[%d] error.", item_type);
+            goto fail;
+        }
     }
 
     close(fd);
@@ -154,49 +210,9 @@
         return -1;
     }
 
-    switch(item_type) {
-        case MBTK_DEVICE_INFO_ITEM_BASIC:
-        {
-            if(item_size != sizeof(mbtk_device_info_basic_t)) {
-                LOGE("item_size != sizeof(mbtk_device_info_basic_t)\n\r");
-                return -1;
-            }
-            break;
-        }
-        case MBTK_DEVICE_INFO_ITEM_FOTA:
-        {
-            if(item_size != sizeof(mbtk_device_info_fota_t)) {
-                LOGE("item_size != sizeof(mbtk_device_info_fota_t)\n\r");
-                return -1;
-            }
-            break;
-        }
-        case MBTK_DEVICE_INFO_ITEM_MODEM:
-        {
-            if(item_size != sizeof(mbtk_device_info_modem_t)) {
-                LOGE("item_size != sizeof(mbtk_device_info_modem_t)\n\r");
-                return -1;
-            }
-            break;
-        }
-        case MBTK_DEVICE_INFO_ITEM_LOG:
-        {
-            if(item_size != sizeof(mbtk_device_info_log_t)) {
-                LOGE("item_size != sizeof(mbtk_device_info_log_t)\n\r");
-                return -1;
-            }
-            break;
-        }
-        default:
-        {
-            LOGE("Item type[%d] error.\n\r", item_type);
-            return -1;
-        }
-    }
-
     mbtk_partition_info_t info;
     memset(&info, 0x0, sizeof(mbtk_partition_info_t));
-    if(mbtk_partition_get_by_name("device_info", &info)) {
+    if(mbtk_partition_get_by_name(MBTK_DEVICE_INFO_PARTITION_NAME, &info)) {
         LOGE("mbtk_partition_get_by_name() fail.");
         return -1;
     }
@@ -218,7 +234,7 @@
     char *mtd_buff = (char*)malloc(info.erase_size);
     if(mtd_buff == NULL) {
         LOGE("malloc() failed\n");
-		return -1;
+        return -1;
     }
     memset(mtd_buff, 0xFF, info.erase_size);
     int len = read(fd, mtd_buff, info.erase_size);
@@ -240,7 +256,101 @@
 	ioctl(fd, MEMERASE, &mtdEraseInfo);
 
     mbtk_device_info_header_t *info_header = (mbtk_device_info_header_t*)mtd_buff;
-    memcpy(mtd_buff + info_header->item_header[item_type].addr, item_ptr, item_size);
+    switch(item_type) {
+        case MBTK_DEVICE_INFO_ITEM_BASIC:
+        {
+            if(item_size != sizeof(mbtk_device_info_basic_t)) {
+                LOGE("item_size != sizeof(mbtk_device_info_basic_t)\n\r");
+                goto fail;
+            }
+
+            mbtk_device_info_basic_t *basic_ptr = (mbtk_device_info_basic_t*)item_ptr;
+            if(info_header->version != basic_ptr->version) {
+                LOGE("basic version error.");
+                goto fail;
+            }
+
+            if(basic_ptr->version == DEV_INFO_VERSION_V1) {
+                memcpy(mtd_buff + info_header->item_header[item_type].addr, &(basic_ptr->basic.v1),
+                    sizeof(mbtk_device_info_basic_v1_t));
+            } else {
+                memcpy(mtd_buff + info_header->item_header[item_type].addr, &(basic_ptr->basic.v2),
+                    sizeof(mbtk_device_info_basic_v2_t));
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_FOTA:
+        {
+            if(item_size != sizeof(mbtk_device_info_fota_t)) {
+                LOGE("item_size != sizeof(mbtk_device_info_fota_t)\n\r");
+                goto fail;
+            }
+
+            mbtk_device_info_fota_t *fota_ptr = (mbtk_device_info_fota_t*)item_ptr;
+            if(info_header->version != fota_ptr->version) {
+                LOGE("fota version error.");
+                goto fail;
+            }
+
+            if(fota_ptr->version == DEV_INFO_VERSION_V1) {
+                memcpy(mtd_buff + info_header->item_header[item_type].addr, &(fota_ptr->fota.v1),
+                    sizeof(mbtk_device_info_fota_v1_t));
+            } else {
+                memcpy(mtd_buff + info_header->item_header[item_type].addr, &(fota_ptr->fota.v2),
+                    sizeof(mbtk_device_info_fota_v2_t));
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_MODEM:
+        {
+            if(item_size != sizeof(mbtk_device_info_modem_t)) {
+                LOGE("item_size != sizeof(mbtk_device_info_modem_t)\n\r");
+                goto fail;
+            }
+
+            mbtk_device_info_modem_t *modem_ptr = (mbtk_device_info_modem_t*)item_ptr;
+            if(info_header->version != modem_ptr->version) {
+                LOGE("modem version error.");
+                goto fail;
+            }
+
+            if(modem_ptr->version == DEV_INFO_VERSION_V1) {
+                memcpy(mtd_buff + info_header->item_header[item_type].addr, &(modem_ptr->modem.v1),
+                    sizeof(mbtk_device_info_modem_v1_t));
+            } else {
+                memcpy(mtd_buff + info_header->item_header[item_type].addr, &(modem_ptr->modem.v2),
+                    sizeof(mbtk_device_info_modem_v2_t));
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_LOG:
+        {
+            if(item_size != sizeof(mbtk_device_info_log_t)) {
+                LOGE("item_size != sizeof(mbtk_device_info_log_t)\n\r");
+                goto fail;
+            }
+
+            mbtk_device_info_log_t *log_ptr = (mbtk_device_info_log_t*)item_ptr;
+            if(info_header->version != log_ptr->version) {
+                LOGE("log version error.");
+                goto fail;
+            }
+
+            if(log_ptr->version == DEV_INFO_VERSION_V1) {
+                memcpy(mtd_buff + info_header->item_header[item_type].addr, &(log_ptr->log.v1),
+                    sizeof(mbtk_device_info_log_v1_t));
+            } else {
+                memcpy(mtd_buff + info_header->item_header[item_type].addr, &(log_ptr->log.v2),
+                    sizeof(mbtk_device_info_log_v2_t));
+            }
+            break;
+        }
+        default:
+        {
+            LOGE("Item type[%d] error.\n\r", item_type);
+            goto fail;
+        }
+    }
 
     lseek(fd, 0, SEEK_SET);
     if (write(fd, mtd_buff, info.erase_size) != info.erase_size) {
@@ -279,20 +389,40 @@
         return -1;
     }
 
-    if(strlen((char*)info_basic.revision_out) > 0) {
-        memcpy(revision_out, info_basic.revision_out, strlen((char*)info_basic.revision_out));
-    }
-    if(strlen((char*)info_basic.revision_in) > 0) {
-        memcpy(revision_in, info_basic.revision_in, strlen((char*)info_basic.revision_in));
-    }
-    if(strlen((char*)info_basic.project_cust) > 0) {
-        memcpy(project_cust, info_basic.project_cust, strlen((char*)info_basic.project_cust));
-    }
-    if(strlen((char*)info_basic.build_time) > 0) {
-        memcpy(build_time, info_basic.build_time, strlen((char*)info_basic.build_time));
+    mbtk_modem_band_area_enum modem_band_area = MBTK_MODEM_BAND_AREA_ALL;
+    if(info_basic.version == DEV_INFO_VERSION_V1) {
+        if(strlen((char*)info_basic.basic.v1.revision_out) > 0) {
+            memcpy(revision_out, info_basic.basic.v1.revision_out, strlen((char*)info_basic.basic.v1.revision_out));
+        }
+        if(strlen((char*)info_basic.basic.v1.revision_in) > 0) {
+            memcpy(revision_in, info_basic.basic.v1.revision_in, strlen((char*)info_basic.basic.v1.revision_in));
+        }
+        if(strlen((char*)info_basic.basic.v1.project_cust) > 0) {
+            memcpy(project_cust, info_basic.basic.v1.project_cust, strlen((char*)info_basic.basic.v1.project_cust));
+        }
+        if(strlen((char*)info_basic.basic.v1.build_time) > 0) {
+            memcpy(build_time, info_basic.basic.v1.build_time, strlen((char*)info_basic.basic.v1.build_time));
+        }
+
+        modem_band_area = info_modem.modem.v1.band_area;
+    } else {
+        if(strlen((char*)info_basic.basic.v2.revision_out) > 0) {
+            memcpy(revision_out, info_basic.basic.v2.revision_out, strlen((char*)info_basic.basic.v2.revision_out));
+        }
+        if(strlen((char*)info_basic.basic.v2.revision_in) > 0) {
+            memcpy(revision_in, info_basic.basic.v2.revision_in, strlen((char*)info_basic.basic.v2.revision_in));
+        }
+        if(strlen((char*)info_basic.basic.v2.project_cust) > 0) {
+            memcpy(project_cust, info_basic.basic.v2.project_cust, strlen((char*)info_basic.basic.v2.project_cust));
+        }
+        if(strlen((char*)info_basic.basic.v2.build_time) > 0) {
+            memcpy(build_time, info_basic.basic.v2.build_time, strlen((char*)info_basic.basic.v2.build_time));
+        }
+
+        modem_band_area = info_modem.modem.v2.band_area;
     }
 
-    switch(info_modem.band_area) {
+    switch(modem_band_area) {
         case MBTK_MODEM_BAND_AREA_CN:
             memcpy(band_area, "CN", 2);
             break;
diff --git a/mbtk/libmbtk_lib/common/mbtk_oem_rw.c b/mbtk/libmbtk_lib/common/mbtk_oem_rw.c
new file mode 100755
index 0000000..74cd150
--- /dev/null
+++ b/mbtk/libmbtk_lib/common/mbtk_oem_rw.c
@@ -0,0 +1,230 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <fcntl.h>

+#include <unistd.h>

+#include <sys/ioctl.h>

+#include <mtd/mtd-user.h>

+#include <errno.h>

+#include <dlfcn.h>

+#include "mbtk_log.h"

+

+

+

+

+#define FLASH_DEVICE    "/dev/mtd32"

+#define BACKUP_DEVICE   "/dev/mtd33"

+

+

+/**

+ * @brief 从指定的flash页面读取数据

+ * @param block_id 块ID(从1开始)

+ * @param data 存储读取数据的缓冲区

+ * @param len 存储读取数据长度的指针

+ * @return GSW_HAL_SUCCESS 或 GSW_HAL_FAIL

+ */

+int mbtk_oem_read_data_ext(unsigned int block_id, void *data, unsigned int *len) 

+{

+    int fd;

+    struct mtd_info_user mtd_info;

+    off_t offset;

+    ssize_t bytes_read;

+    unsigned int max_block_id;

+    // 输入参数验证

+    if (!data || !len) 

+    {

+        LOGE("invalid :data or len is NULL\n");

+        return -2;

+    }

+

+    // 打开flash设备

+    fd = open(FLASH_DEVICE, O_RDONLY);

+    if (fd == -1) 

+    {

+        LOGE("open flash device error %s\n", strerror(errno));

+        return -1;

+    }

+

+    // 获取MTD设备信息

+    if (ioctl(fd, MEMGETINFO, &mtd_info) < 0) 

+    {

+        LOGE("Get MTD info erro:%s\n", strerror(errno));

+        close(fd);

+        return -1;

+    }

+

+    // 计算最大块ID

+    max_block_id = mtd_info.size / mtd_info.erasesize;

+

+    // 验证block_id

+    if (block_id < 1 || block_id > max_block_id) 

+    {

+        LOGE("invalid block_id: %u (max: %u)\n", block_id, max_block_id);

+        close(fd);

+        return -2;

+    }

+

+    // 计算偏移量(block_id从1开始)

+    offset = (block_id - 1) * mtd_info.erasesize;

+

+    // 定位到块位置

+    if (lseek(fd, offset, SEEK_SET) == -1) 

+    {

+        LOGE("lseek block error:%s\n", strerror(errno));

+        close(fd);

+        return -1;

+    }

+

+    // 读取块

+    bytes_read = read(fd, data, mtd_info.erasesize);

+    if (bytes_read != mtd_info.erasesize) 

+    {

+        LOGE("Read block fail:%s\n", strerror(errno));

+        close(fd);

+        return -1;

+    }

+

+    *len = bytes_read;

+    close(fd);

+    return 0;

+}

+

+/**

+ * @brief 向指定的flash页面写入数据并进行备份

+ * @param block_id 块ID(从1开始)

+ * @param data 要写入的数据

+ * @param len 要写入的数据长度

+ * @return GSW_HAL_SUCCESS 或 GSW_HAL_FAIL

+ */

+int mbtk_oem_write_data_ext(unsigned int block_id, void *data, unsigned int len) 

+{

+    int fd_main;

+    int fd_backup;

+    struct mtd_info_user mtd_info;

+    off_t offset_main;

+    off_t offset_backup;

+    ssize_t bytes_written;

+    unsigned int max_block_id;

+    struct erase_info_user erase_info; 

+    // 输入参数验证

+    if (!data) 

+    {

+        printf("invalid data is NULL\n");

+        return -2;

+    }

+

+    // 首先打开主设备以获取MTD信息

+    fd_main = open(FLASH_DEVICE, O_RDWR);

+    if (fd_main == -1) 

+    {

+        printf("open flash error %s\n", strerror(errno));

+        return -1;

+    }

+

+    // 获取MTD设备信息

+    if (ioctl(fd_main, MEMGETINFO, &mtd_info) < 0)

+    {

+        printf("get mtd block info error %s\n", strerror(errno));

+        close(fd_main);

+        return -1;

+    }

+

+    // 计算最大块ID

+    max_block_id = mtd_info.size / mtd_info.erasesize;

+

+    // 验证block_id和len

+    if (block_id < 1 || block_id > max_block_id)

+    {

+        LOGE("invalid block_id: %u (max:%u)\n", block_id, max_block_id);

+        close(fd_main);

+        return -2;

+    }

+

+    if (len > mtd_info.erasesize)

+    {

+        LOGE("invalid len: %u (max: %u)\n", len, mtd_info.erasesize);

+        close(fd_main);

+        return -2;

+    }

+

+    // 打开备份设备

+    fd_backup = open(BACKUP_DEVICE, O_RDWR);

+    if (fd_backup == -1) 

+    {

+        LOGE("open bak device fail %s\n", strerror(errno));

+        close(fd_main);

+        return -1;

+    }

+

+    // 计算偏移量

+    offset_main = (block_id - 1) * mtd_info.erasesize;

+    offset_backup = (block_id - 1) * mtd_info.erasesize;

+

+    // 准备erase_info结构体

+    erase_info.start = offset_main; // 设置主设备的起始位置

+    erase_info.length = mtd_info.erasesize; // 设置擦除长度

+

+    // 首先写入备份

+    if (ioctl(fd_backup, MEMERASE, &erase_info) < 0) 

+    {

+        LOGE("MEMERASE backup block faile:%s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+

+    if (lseek(fd_backup, offset_backup, SEEK_SET) == -1) 

+    {

+        LOGE("lseek backup device failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+

+    bytes_written = write(fd_backup, data, len);

+    if (bytes_written != len) 

+    {

+        LOGE("write to backup flahs  failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+    

+    erase_info.start = offset_main; 

+    erase_info.length = mtd_info.erasesize; 

+

+    // 然后写入主flash

+    if (ioctl(fd_main, MEMERASE, &erase_info) < 0) 

+    {

+        LOGE("MEMERASE main flash failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+

+    if (lseek(fd_main, offset_main, SEEK_SET) == -1) 

+    {

+        LOGE("lseek main flash failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+

+    bytes_written = write(fd_main, data, len);

+    if (bytes_written != len) 

+    {

+        LOGE(" write to main flash failed %s\n", strerror(errno));

+        close(fd_main);

+        close(fd_backup);

+        return -1;

+    }

+    

+    // 确保数据已写入flash

+    fsync(fd_main);

+    fsync(fd_backup);

+

+    close(fd_main);

+    close(fd_backup);

+    return 0;

+}

+

diff --git a/mbtk/libmbtk_lib/rtp/mbtk_rtp.c b/mbtk/libmbtk_lib/rtp/mbtk_rtp.c
index 961b9c5..58d1077 100755
--- a/mbtk/libmbtk_lib/rtp/mbtk_rtp.c
+++ b/mbtk/libmbtk_lib/rtp/mbtk_rtp.c
@@ -192,6 +192,36 @@
     }
 }
 
+int mbtk_rtp_vlan_set(const char *vlan)
+{
+    if(rtp_cli_fd < 0) {
+        LOGW("RTP client not inited.");
+        return -1;
+    }
+
+    if(str_empty(vlan)) {
+        LOGE("vlan is empty.");
+        return -1;
+    }
+
+    char cmd[100] = {0};
+    char rsp[100] = {0};
+    snprintf(cmd, sizeof(cmd), "vlan %s", vlan); // vlan <dev>
+    char *result = rtp_cmd_exec(cmd, rsp, sizeof(rsp));
+    if(!result) {
+        return -1;
+    }
+
+    // vlan:<err>
+    if(strcmp(result, "vlan:0") == 0) {
+        return 0;
+    } else {
+        LOGE("CMD exec error:%s", result);
+        return -1;
+    }
+}
+
+
 int mbtk_rtp_server_port_set(int port)
 {
     if(rtp_cli_fd < 0) {
diff --git a/mbtk/mbtk_rild/src/main.c b/mbtk/mbtk_rild/src/main.c
index 22e739c..a527ed1 100755
--- a/mbtk/mbtk_rild/src/main.c
+++ b/mbtk/mbtk_rild/src/main.c
@@ -217,9 +217,9 @@
             cgact_wait.waitting = false;

         }

 

-        uint8 data_pdp;

-        data_pdp = 1;       //

-        urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

+        //uint8 data_pdp;

+        //data_pdp = 1;       //

+        //urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

     }

     // +CGEV:

     // +CGEV: NW DEACT <cid>,<cid>

@@ -240,14 +240,23 @@
     // +CGEV: NW REATTACH

     else if(strStartsWith(s, "+CGEV:"))

     {

-        if(at_process && !at_cfun_command) {

-            if(cgact_wait.act) {

-                if(strStartsWith(s, "+CGEV: ME PDN ACT ")) { // +CGEV: ME PDN ACT 15,4

-                    if(cgact_wait.cid == atoi(s + 18)) {

+        if(at_process && !at_cfun_command)

+        {

+            mbtk_pdp_cb_info_s pdp_cb_info;

+            memset(&pdp_cb_info, 0x00, sizeof(mbtk_pdp_cb_info_s));

+            pdp_cb_info.auto_urc = false;

+            if(cgact_wait.act)

+            {

+                if(strStartsWith(s, "+CGEV: ME PDN ACT ")) // +CGEV: ME PDN ACT 15,4

+                {

+                    if(cgact_wait.cid == atoi(s + 18))

+                    {

                         cgact_wait.waitting = false;

                     }

 

-                    uint8 data_pdp;

+                    pdp_cb_info.cid = atoi(s + 18);

+                    pdp_cb_info.connect_state = true;

+#if 0

                     char* tmp_s = memdup(s + 18,strlen(s + 18));

                     char* free_ptr = tmp_s;

                     char *line = tmp_s;

@@ -264,10 +273,10 @@
                     {

                         goto at_PDP_CREG_EXIT;

                     }

-                    data_pdp = tmp_int;

+                    pdp_cb_info.pdp_result = tmp_int;

 at_PDP_CREG_EXIT:

                     free(free_ptr);

-

+                    free_ptr = NULL;

                     //data_pdp = (uint8)atoi(s + 20);  //reason

                     if(cgact_wait.cid >= 1 && cgact_wait.cid < 8)

                     {

@@ -302,71 +311,69 @@
                             urc_msg_distribute(true, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

                         }

                     }

-                } else if(strStartsWith(s, "+CGEV: NW MODIFY ")) { // +CGEV: NW MODIFY 1,4

-                    if(cgact_wait.cid == atoi(s + 17)) {

-                        cgact_wait.waitting = false;

-                    }

+#endif

+                    urc_msg_distribute(true, INFO_URC_MSG_PDP_STATE, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));

                 }

-            } else {

-                if(strStartsWith(s, "+CGEV: ME PDN DEACT ")) { // +CGEV: ME PDN DEACT 1

-                    if(cgact_wait.cid == atoi(s + 20)) {

+                else if(strStartsWith(s, "+CGEV: NW MODIFY ")) // +CGEV: NW MODIFY 1,4

+                { 

+                    if(cgact_wait.cid == atoi(s + 17))

+                    {

                         cgact_wait.waitting = false;

                     }

-                    uint8 data_pdp;

-                    data_pdp = 0;       //

-                    urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

-                    if(cgact_wait.cid != 0)

+                    

+                    pdp_cb_info.cid = atoi(s + 17);

+                    pdp_cb_info.connect_state = true;

+                    //urc_msg_distribute(true, INFO_URC_MSG_PDP_STATE, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));

+                }

+            } 

+            else

+            {

+                if(strStartsWith(s, "+CGEV: ME PDN DEACT ")) // +CGEV: ME PDN DEACT 1

+                {

+                    if(cgact_wait.cid == atoi(s + 20))

                     {

-                        data_pdp = cgact_wait.cid + 100;

-                        urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

+                        cgact_wait.waitting = false;

                     }

+                    

+                    pdp_cb_info.cid = atoi(s + 20);

+                    pdp_cb_info.connect_state = false;

+                    urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));

                 }

             }

-        } else {

-            // apn_state_set

-

+        } 

+        else

+        {

             // +CGEV: NW PDN DEACT <cid>

-

             // +CGEV: EPS PDN ACT 1

             // +CGEV: ME PDN ACT 8,1

-

             // +CGEV: ME PDN ACT 2,4

-            uint8 data[2] = {0xFF};

-            if(strStartsWith(s, "+CGEV: NW PDN DEACT ")) { // +CGEV: NW PDN DEACT <cid>

-                //apn_state_set(atoi(s + 20), false);

-                data[0] = (uint8)0;

-                data[1] = (uint8)atoi(s + 20);

+            mbtk_pdp_cb_info_s pdp_cb_info;

+            memset(&pdp_cb_info, 0x00, sizeof(mbtk_pdp_cb_info_s));

+            pdp_cb_info.auto_urc = true;

+            if(strStartsWith(s, "+CGEV: NW PDN DEACT ")) // +CGEV: NW PDN DEACT <cid>

+            { 

+                pdp_cb_info.cid = (uint8)atoi(s + 20);

+                pdp_cb_info.connect_state = false;

+                urc_msg_distribute(true, INFO_URC_MSG_CGEV, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));

+            }

+            else if(strStartsWith(s, "+CGEV: EPS PDN ACT ")) // +CGEV: EPS PDN ACT <cid>

+            { 

+                pdp_cb_info.cid = (uint8)atoi(s + 19);

+                pdp_cb_info.connect_state = true;

+            }

+            else if(strStartsWith(s, "+CGEV: ME PDN DEACT ")) // +CGEV: EPS PDN DEACT <cid>

+            {

+                pdp_cb_info.cid = (uint8)atoi(s + 20);

+                pdp_cb_info.connect_state = false;

+                urc_msg_distribute(true, INFO_URC_MSG_CGEV, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));

+            }

+            else if(strStartsWith(s, "+CGEV: ME PDN ACT ")) // +CGEV: ME PDN ACT <cid>,1

+            {

+                pdp_cb_info.cid = (uint8)atoi(s + 18);

+                pdp_cb_info.connect_state = true;

+                //urc_msg_distribute(true, INFO_URC_MSG_PDP_STATE, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));

 

-                uint8 data_pdp;

-                data_pdp = 0;       //

-                urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

-                data_pdp = data[1] + 100;

-                urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

-            } else if(strStartsWith(s, "+CGEV: EPS PDN ACT ")) { // +CGEV: EPS PDN ACT <cid>

-                //apn_state_set(atoi(s + 19), true);

-#if (defined(MBTK_AF_SUPPORT) || defined(MBTK_ALL_CID_SUPPORT))

-				//data[0] = (uint8)1;

-                //data[1] = (uint8)atoi(s + 19);

-#else

-                data[0] = (uint8)1;

-                data[1] = (uint8)atoi(s + 19);

-#endif

-            } else if(strStartsWith(s, "+CGEV: ME PDN DEACT ")) { // +CGEV: EPS PDN DEACT <cid>

-                //apn_state_set(atoi(s + 19), true);

-                data[0] = (uint8)0;

-                data[1] = (uint8)atoi(s + 20);

-

-                uint8 data_pdp;

-                data_pdp = 0;       //

-                urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

-                data_pdp = data[1] + 100;

-                urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

-            } else if(strStartsWith(s, "+CGEV: ME PDN ACT ")) { // +CGEV: ME PDN ACT <cid>,1

-                //apn_state_set(atoi(s + 18), true);

-                data[0] = (uint8)1;

-                data[1] = (uint8)atoi(s + 18);

-

-                uint8 data_pdp;

+#if 0

                 char* tmp_s = memdup(s + 18,strlen(s + 18));

                 char* free_ptr = tmp_s;

                 char *line = tmp_s;

@@ -413,16 +420,19 @@
                     {

 

                     }

-

                     data_pdp = data[1] + 200;

                     urc_msg_distribute(true, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

 					data[1] = 0;

                 }

-            } else {

+#endif

+

+            } 

+            else

+            {

                 LOGI("No process : %s", s);

             }

 

-			urc_msg_distribute(true, INFO_URC_MSG_CGEV, data, sizeof(uint8) * 2);

+			//urc_msg_distribute(true, INFO_URC_MSG_CGEV, data, sizeof(uint8) * 2);

         }

     }

     // +CREG: 1, "8010", "000060a5", 0, 2, 0

@@ -520,12 +530,14 @@
         } else {

             data[2] = (uint8)0xFF; // AcT

         }

+#if 0

         if(data[1] == 5)

         {

             uint8 data_pdp;

             data_pdp = 5;       //

             urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

         }

+#endif

         urc_msg_distribute(false, INFO_URC_MSG_NET_CS_REG_STATE, data, sizeof(data));

         urc_msg_distribute(true, INFO_URC_MSG_NET_STATE_LOG, NULL, 0);

 CREG_EXIT:

@@ -686,12 +698,14 @@
             sim_info_reg.sim = 0;

         else if(strStartsWith(s, "*SIMDETEC:1,SIM"))

             sim_info_reg.sim = 1;

+#if 0

         if(sim_info_reg.sim == 0)

         {

             uint8 data_pdp;

             data_pdp = 11;       //

             urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

         }

+#endif

         urc_msg_distribute(false, INFO_URC_MSG_SIM_STATE, &sim_info_reg, sizeof(mbtk_sim_card_info));

     }

     // *EUICC:1

@@ -814,14 +828,14 @@
         }

         else

             sim_info_reg.sim = 20;

-

+#if 0

         if(sim_info_reg.sim == 18)

         {

             uint8 data_pdp;

             data_pdp = 11;       //

             urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));

         }

-

+#endif

         urc_msg_distribute(false, INFO_URC_MSG_SIM_STATE, &sim_info_reg, sizeof(mbtk_sim_card_info));

     }

     // +CMT: ,23

diff --git a/mbtk/mbtk_rild/src/mbtk_info_server.c b/mbtk/mbtk_rild/src/mbtk_info_server.c
index 5c1469a..3ebaf1a 100755
--- a/mbtk/mbtk_rild/src/mbtk_info_server.c
+++ b/mbtk/mbtk_rild/src/mbtk_info_server.c
@@ -5556,13 +5556,13 @@
                                 err = MBTK_INFO_ERR_CID_EXIST;
                                 break;
                             }
-
+#if 0
                             if(mbtk_check_default_pdp_state(cid))
                             {
                                 err = MBTK_INFO_ERR_UNSUPPORTED;
                                 break;
                             }
-
+#endif
                             data_call_reconn:
                             //mbtk wyq for data_call_ex add end
                             cgact_wait.waitting = true;
@@ -5707,12 +5707,26 @@
                                     }
 
                                     cid_active[cid] = 1;
-                                    mbtk_set_default_pdp_state(true, cid);
-                                    mbtk_qser_route_config(cid, &ipv4, &ipv6);
+                                    //mbtk_set_default_pdp_state(true, cid);
+                                    //mbtk_qser_route_config(cid, &ipv4, &ipv6);
                                     if(cli_info->fd != DATA_CALL_BOOTCONN_FD)
                                     {
                                         mbtk_net_led_set(MBTK_NET_LED_DATA_CONNECT);
                                         pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
+#ifdef MBTK_ALL_CID_SUPPORT
+										if(cid == 1) //cid 1 as a special treatment
+										{
+											mbtk_pdp_cb_info_s pdp_cb_info;
+											memset(&pdp_cb_info, 0x00, sizeof(mbtk_pdp_cb_info_s));
+											pdp_cb_info.cid = cid;
+											pdp_cb_info.auto_urc = false;
+											pdp_cb_info.connect_state = true;
+											memcpy(&(pdp_cb_info.ipv4), &ipv4, sizeof(mbtk_ipv4_info_t));
+											memcpy(&(pdp_cb_info.ipv6), &ipv6, sizeof(mbtk_ipv6_info_t));
+											usleep(1000);
+											pack_rsp_send(cli_info->fd , MBTK_INFO_ID_IND_PDP_STATE_CHANGE, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));
+										}
+#endif
                                     }
                                     else
                                     {
@@ -5738,8 +5752,8 @@
                             if(cid == 1)
                             {
                                 char dev[20] = {0};
-                                uint8 pdp_data = cid + 100;
-                                pack_rsp_send(cli_info->fd , MBTK_INFO_ID_IND_PDP_STATE_CHANGE, &pdp_data, sizeof(uint8));
+                                mbtk_pdp_cb_info_s pdp_cb_info;
+                                memset(&pdp_cb_info, 0x00, sizeof(mbtk_pdp_cb_info_s));
 
                                 sprintf(dev, "ccinet%d", cid - 1);
 
@@ -5749,8 +5763,13 @@
                                 } else {
                                     LOGD("Config %s IPv4 0 success.", dev);
                                 }
+                                pdp_cb_info.cid = cid;
+                                pdp_cb_info.connect_state = false;
+                                pdp_cb_info.auto_urc = false;
+                                pack_rsp_send(cli_info->fd , MBTK_INFO_ID_IND_PDP_STATE_CHANGE, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));
+                                
                                 cid_active[cid] = 0;
-                                mbtk_set_default_pdp_state(false, cid);
+                                //mbtk_set_default_pdp_state(false, cid);
                                 mbtk_net_led_set(MBTK_NET_LED_NET_CONNECT);
                                 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
                                 break;
@@ -5793,7 +5812,7 @@
                                 }
 #endif
                                 cid_active[cid] = 0;
-                                mbtk_set_default_pdp_state(false, cid);
+                                //mbtk_set_default_pdp_state(false, cid);
                                 mbtk_net_led_set(MBTK_NET_LED_NET_CONNECT);
                                 pack_rsp_send(cli_info->fd, MBTK_INFO_ID_NET_DATA_CALL_RSP, NULL, 0);
                             }
@@ -6765,7 +6784,7 @@
 }
 */
 
-static void net_ifc_state_change(bool act, int cid, mbtk_pdp_act_info_t *act_info)
+static void net_ifc_state_change(bool act, int cid, mbtk_pdp_cb_info_s *pdp_cb_info)
 {
     if(cid < MBTK_APN_CID_MIN || cid > MBTK_APN_CID_MAX) { // No nothing for cid 1 and 8
         return;
@@ -6815,9 +6834,9 @@
             }
 #endif
 
-            if(act_info) {
-                memcpy(&(act_info->ipv4), &ipv4, sizeof(mbtk_ipv4_info_t));
-                memcpy(&(act_info->ipv6), &ipv6, sizeof(mbtk_ipv6_info_t));
+            if(pdp_cb_info) {
+                memcpy(&(pdp_cb_info->ipv4), &ipv4, sizeof(mbtk_ipv4_info_t));
+                memcpy(&(pdp_cb_info->ipv6), &ipv6, sizeof(mbtk_ipv6_info_t));
             }
 
             // Config IPv4 address.
@@ -6851,7 +6870,7 @@
                 }
             }
 
-            mbtk_qser_route_config(cid, &ipv4, &ipv6);
+            //mbtk_qser_route_config(cid, &ipv4, &ipv6);
         }
     } else { // Del IP
         if(mbtk_ifc_configure2(dev, NULL, 0, NULL, NULL)) {
@@ -6862,6 +6881,7 @@
     }
 }
 
+#if 0
 static void data_call_restart()
 {
 #if 0
@@ -6885,34 +6905,36 @@
 #endif
     // +CGACT
     int cid;
-    uint8 data_pdp = 0;
+    mbtk_pdp_cb_info_s pdp_cb_info;
     LOGD("Start active APN.");
-    at_process = true;
+    //at_process = true;
     cgact_wait.act = true;
-    for(cid = MBTK_APN_CID_MIN; cid <= MBTK_APN_CID_MAX; cid++) {
+    for(cid = MBTK_APN_CID_MIN; cid <= MBTK_APN_CID_MAX; cid++)
+    {
         if(cid_active[cid])
         {
             LOG("Active cid : %d", cid);
+            memset(&pdp_cb_info, 0x00, sizeof(mbtk_pdp_cb_info_s));
             cgact_wait.waitting = true;
             cgact_wait.cid = cid;
+            
             net_ifc_state_change(false, cid, NULL);
-            data_pdp = cid + 100;
-            urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &data_pdp, sizeof(uint8));
+            pdp_cb_info.cid = cid;
+            pdp_cb_info.connect_state = false;
+            pdp_cb_info.auto_urc = true;
+            urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));
+            
             req_data_call_start(cid, NULL);
             wait_cgact_complete(10);
-
-            mbtk_pdp_act_info_t act_info;
-            memset(&act_info, 0, sizeof(mbtk_pdp_act_info_t));
-            data_pdp = cid + 220;
-            act_info.state = data_pdp;
-
-            net_ifc_state_change(true, cid, &act_info);
-
-            urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &act_info, sizeof(mbtk_pdp_act_info_t));
+          
+            net_ifc_state_change(true, cid, &pdp_cb_info);
+            pdp_cb_info.connect_state = true;
+            urc_msg_distribute(false, INFO_URC_MSG_PDP_STATE, &pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));
         }
     }
-    at_process = false;
+    //at_process = false;
 }
+#endif
 
 static void urc_msg_process(info_urc_msg_t *msg)
 {
@@ -6932,32 +6954,29 @@
         }
         case INFO_URC_MSG_CGEV:
         {
-            bool act = data[0];
-            int cid = data[1];
-            if(cid > 0) {
-                net_ifc_state_change(act, cid, NULL);
+            mbtk_pdp_cb_info_s *pdp_cb_info = (mbtk_pdp_cb_info_s *)(msg->data);
+            if(pdp_cb_info->cid >= MBTK_APN_CID_MIN && pdp_cb_info->cid <= MBTK_APN_CID_MAX)
+            {
+                net_ifc_state_change(pdp_cb_info->connect_state, pdp_cb_info->cid, NULL);
+                cid_active[pdp_cb_info->cid] = 0;
+                pdp_state_change(pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));
+            }
+            else
+            {
+                LOGD("[%s] pdp_cb_info->cid unknown.[%d]", __func__, pdp_cb_info->cid);
             }
             break;
         }
         case INFO_URC_MSG_PDP_STATE:
         {
-            // pdp_state_change
-            mbtk_pdp_act_info_t act_info;
-            memset(&act_info, 0, sizeof(mbtk_pdp_act_info_t));
+            //data call connect success
             int cme_err = MBTK_INFO_ERR_CME_NON;
-            uint8 cid = *((uint8*)(msg->data));
-            act_info.state = cid;
-#if 0
-            if(cid > 220) {
-                cid -= 220;
-            } else { // > 200
-                cid -= 200;
-            }
-#endif
-            if(!req_data_call_state_get(cid, &(act_info.ipv4), &(act_info.ipv6), &cme_err) && cme_err == MBTK_INFO_ERR_CME_NON)
+            mbtk_pdp_cb_info_s *pdp_cb_info = (mbtk_pdp_cb_info_s *)(msg->data);
+            if(req_data_call_state_get(pdp_cb_info->cid, &(pdp_cb_info->ipv4), &(pdp_cb_info->ipv6), &cme_err) || cme_err != MBTK_INFO_ERR_CME_NON)
             {
-                pdp_state_change(&act_info, sizeof(mbtk_pdp_act_info_t));
+                LOGE("[%s] req_data_call_state_get() fail.[%d]", __func__, cme_err);
             }
+            pdp_state_change(pdp_cb_info, sizeof(mbtk_pdp_cb_info_s));
             break;
         }
         case INFO_URC_MSG_NET_PS_REG_STATE:
@@ -6976,10 +6995,11 @@
                 {
                     net_data[2] = info.net_type;
                     net_state_change(net_data, sizeof(net_data));
-
+#if 0
                     if(info.net_type >= MBTK_RADIO_TECH_UTRAN) {
                         data_call_restart();
                     }
+#endif
                 } else {
                     net_data[2] = (uint8)0xFF;
                     net_state_change(net_data, sizeof(net_data));
@@ -7331,12 +7351,21 @@
         band_set_info.band_fddlte = MBTK_BAND_ALL_FDDLTE_DEFAULT;
         band_set_info.band_lte_ext = MBTK_BAND_ALL_EXT_LTE_DEFAULT;
     } else {
-        band_area = info_modem.band_area;
-        band_set_info.band_gsm = info_modem.band_gsm;
-        band_set_info.band_wcdma = info_modem.band_wcdma;
-        band_set_info.band_tdlte = info_modem.band_tdlte;
-        band_set_info.band_fddlte = info_modem.band_fddlte;
-        band_set_info.band_lte_ext = info_modem.band_lte_ext;
+        if(info_modem.version == DEV_INFO_VERSION_V1) {
+            band_area = info_modem.modem.v1.band_area;
+            band_set_info.band_gsm = info_modem.modem.v1.band_gsm;
+            band_set_info.band_wcdma = info_modem.modem.v1.band_wcdma;
+            band_set_info.band_tdlte = info_modem.modem.v1.band_tdlte;
+            band_set_info.band_fddlte = info_modem.modem.v1.band_fddlte;
+            band_set_info.band_lte_ext = info_modem.modem.v1.band_lte_ext;
+        } else {
+            band_area = info_modem.modem.v2.band_area;
+            band_set_info.band_gsm = info_modem.modem.v2.band_gsm;
+            band_set_info.band_wcdma = info_modem.modem.v2.band_wcdma;
+            band_set_info.band_tdlte = info_modem.modem.v2.band_tdlte;
+            band_set_info.band_fddlte = info_modem.modem.v2.band_fddlte;
+            band_set_info.band_lte_ext = info_modem.modem.v2.band_lte_ext;
+        }
     }
 
     bool is_first = TRUE;
@@ -7383,10 +7412,15 @@
     }
     else
     {
-        reboot_reason = info_basic.reboot_flag;
-        if(info_basic.reboot_flag != MBTK_REBOOT_FLAG_NORMAL)
+        reboot_reason = info_basic.version == DEV_INFO_VERSION_V1 ? info_basic.basic.v1.reboot_flag :
+            info_basic.basic.v2.reboot_flag;
+        if(reboot_reason != MBTK_REBOOT_FLAG_NORMAL)
         {
-            info_basic.reboot_flag = MBTK_REBOOT_FLAG_NORMAL;
+            if(info_basic.version == DEV_INFO_VERSION_V1) {
+                info_basic.basic.v1.reboot_flag = MBTK_REBOOT_FLAG_NORMAL;
+            } else {
+                info_basic.basic.v2.reboot_flag = MBTK_REBOOT_FLAG_NORMAL;
+            }
             ret = mbtk_dev_info_write(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));
             if(ret != 0) {
                 LOGE("[%s] mbtk_dev_info_write(BASIC) fail.", __func__);
diff --git a/mbtk/mbtk_rild_v2/src/main.c b/mbtk/mbtk_rild_v2/src/main.c
index ae286cc..c4befdf 100755
--- a/mbtk/mbtk_rild_v2/src/main.c
+++ b/mbtk/mbtk_rild_v2/src/main.c
@@ -2910,27 +2910,37 @@
         band_info.band_support.nr_0_band = 0;

 #endif

     } else {

-        band_info.band_area = info_modem.band_area;

-        band_info.net_support = info_modem.net_support;

-        if(info_modem.net_pref < MBTK_NET_PREF_MAX) {

-            band_info.band_support.net_pref = info_modem.net_pref;

+        if(info_modem.version == DEV_INFO_VERSION_V1) {

+            band_info.band_area = info_modem.modem.v1.band_area;

+            band_info.band_support.net_pref = MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF;  // 15

+            band_info.band_support.gsm_band = info_modem.modem.v1.band_gsm;

+            band_info.band_support.umts_band = info_modem.modem.v1.band_wcdma;

+            band_info.band_support.tdlte_band = info_modem.modem.v1.band_tdlte;

+            band_info.band_support.fddlte_band = info_modem.modem.v1.band_fddlte;

+            band_info.band_support.lte_ext_band = info_modem.modem.v1.band_lte_ext;

         } else {

-            if(band_info.net_support & MBTK_NET_SUPPORT_5G) {

-                band_info.band_support.net_pref = MBTK_NET_PREF_LTE_NR_NR_PREF;  // 19

+            band_info.band_area = info_modem.modem.v2.band_area;

+            band_info.net_support = info_modem.modem.v2.net_support;

+            if(info_modem.modem.v2.net_pref < MBTK_NET_PREF_MAX) {

+                band_info.band_support.net_pref = info_modem.modem.v2.net_pref;

             } else {

-                band_info.band_support.net_pref = MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF;  // 15

+                if(band_info.net_support & MBTK_NET_SUPPORT_5G) {

+                    band_info.band_support.net_pref = MBTK_NET_PREF_LTE_NR_NR_PREF;  // 19

+                } else {

+                    band_info.band_support.net_pref = MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF;  // 15

+                }

             }

-        }

-        band_info.band_support.gsm_band = info_modem.band_gsm;

-        band_info.band_support.umts_band = info_modem.band_wcdma;

-        band_info.band_support.tdlte_band = info_modem.band_tdlte;

-        band_info.band_support.fddlte_band = info_modem.band_fddlte;

-        band_info.band_support.lte_ext_band = info_modem.band_lte_ext;

+            band_info.band_support.gsm_band = info_modem.modem.v2.band_gsm;

+            band_info.band_support.umts_band = info_modem.modem.v2.band_wcdma;

+            band_info.band_support.tdlte_band = info_modem.modem.v2.band_tdlte;

+            band_info.band_support.fddlte_band = info_modem.modem.v2.band_fddlte;

+            band_info.band_support.lte_ext_band = info_modem.modem.v2.band_lte_ext;

 

-        band_info.band_support.nr_3_band = info_modem.band_nr_3;

-        band_info.band_support.nr_2_band = info_modem.band_nr_2;

-        band_info.band_support.nr_1_band = info_modem.band_nr_1;

-        band_info.band_support.nr_0_band = info_modem.band_nr_0;

+            band_info.band_support.nr_3_band = info_modem.modem.v2.band_nr_3;

+            band_info.band_support.nr_2_band = info_modem.modem.v2.band_nr_2;

+            band_info.band_support.nr_1_band = info_modem.modem.v2.band_nr_1;

+            band_info.band_support.nr_0_band = info_modem.modem.v2.band_nr_0;

+        }

     }

 }

 

diff --git a/mbtk/mbtk_rtpd/src/main.c b/mbtk/mbtk_rtpd/src/main.c
index d09098c..ec2baad 100755
--- a/mbtk/mbtk_rtpd/src/main.c
+++ b/mbtk/mbtk_rtpd/src/main.c
@@ -169,6 +169,13 @@
         char rsp[100] = {0};
         sprintf(rsp, "%cchannel:%d%c", MBTK_IND_START_FLAG, ret, MBTK_IND_END_FLAG);
         mbtk_write(fd, rsp, strlen(rsp));
+    } else if(memcmp(msg, "vlan", 4) == 0) {// vlan <dev>
+        int ret = 0;
+        memcpy(rtp_confs.vlan, msg + 5, strlen(msg + 5) + 1);
+
+        char rsp[100] = {0};
+        sprintf(rsp, "%cvlan:%d%c", MBTK_IND_START_FLAG, ret, MBTK_IND_END_FLAG);
+        mbtk_write(fd, rsp, strlen(rsp));
     } else {
         LOGW("Unknown RTP msg : %s", msg);
     }
diff --git a/mbtk/mbtk_rtpd/src/rtp_server.c b/mbtk/mbtk_rtpd/src/rtp_server.c
index 4ae8a74..155ade2 100755
--- a/mbtk/mbtk_rtpd/src/rtp_server.c
+++ b/mbtk/mbtk_rtpd/src/rtp_server.c
@@ -41,6 +41,7 @@
 #include "mbtk_utils.h"
 #include "mbtk_audio2.h"
 #include "mbtk_rtp_internal.h"
+#include "mbtk_ifc.h"
 
 #define RTP_DEBUG_PCM_FILE 1
 #define RTP_UDP_READ_BUFF_SIZE 2048
@@ -375,6 +376,26 @@
     return ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
 }
 
+int ip_get_from_dev(const char *dev_name, void *addr)
+{
+    int ret = 0;
+    if(mbtk_ifc_open()) {
+        LOGE("mbtk_ifc_open() fail.");
+        ret = -1;
+        goto return_result;
+    }
+
+    if(mbtk_ifc_get_addr(dev_name, addr)) {
+        LOGE("mbtk_ifc_get_addr() fail.");
+        ret = -1;
+        goto return_result;
+    }
+
+return_result:
+    mbtk_ifc_close();
+    return ret;
+}
+
 static void voip_playback_thread(void *arg)
 {
     UNUSED(arg);
@@ -522,18 +543,36 @@
     return -1;
 }
 
-static int rtp_udp_cli_open(const char *remote_addr, int remote_port)
+static int rtp_udp_cli_open(const char *vlan, const char *remote_addr, int remote_port)
 {
-    struct sockaddr_in dst_sa4, src_sa4;
-    if (inet_pton(AF_INET, "0.0.0.0", &src_sa4.sin_addr) > 0) {
-        src_sa4.sin_family = AF_INET;
-        src_sa4.sin_port = htons(0);
-        memset(&src_sa4.sin_zero, 0, sizeof(src_sa4.sin_zero));
-    } else {
-        LOGE("Set src addr fail.");
+    int fd = socket(AF_INET, SOCK_DGRAM, 0);
+    if(fd < 0){
+        LOGE("socket() fail.[%d]", errno);
         return -1;
     }
 
+#if 0
+    struct sockaddr_in src_sa4;
+    memset(&src_sa4, 0, sizeof(src_sa4));
+    src_sa4.sin_family = AF_INET;
+    src_sa4.sin_port = htons(0);
+    src_sa4.sin_addr.s_addr = inet_addr("127.0.0.1");
+
+    if (bind(fd, (struct sockaddr*) &src_sa4, sizeof(src_sa4)) < 0) {
+        LOGE("bind() failed: %d", errno);
+        goto result_fail_with_close;
+    }
+#else
+    if(strlen(vlan) > 0) {
+        if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,
+                       vlan, strlen(vlan)) < 0) {
+            LOGE("setsockopt(SO_BINDTODEVICE) failed");
+            return -1;
+        }
+    }
+#endif
+
+    struct sockaddr_in dst_sa4;
     if (inet_pton(AF_INET, remote_addr, &dst_sa4.sin_addr) > 0) {
         dst_sa4.sin_family = AF_INET;
         dst_sa4.sin_port = htons(remote_port);
@@ -543,17 +582,6 @@
         return -1;
     }
 
-    int fd = socket(AF_INET, SOCK_DGRAM, 0);
-    if(fd < 0){
-        LOGE("socket() fail.[%d]", errno);
-        return -1;
-    }
-
-    if (bind(fd, (struct sockaddr*) &src_sa4, sizeof(src_sa4)) < 0) {
-        LOGE("bind() failed: %d", errno);
-        goto result_fail_with_close;
-    }
-
     if (connect(fd, (struct sockaddr*) &dst_sa4, sizeof(dst_sa4)) < 0) {
         LOGE("connect() failed: %d", errno);
         goto result_fail_with_close;
@@ -726,7 +754,7 @@
     }
 
     LOGD("Start open UDP client : %s-%d", conf_info->remote_ip, conf_info->server_port);
-    rtp_info.udp_send_sock.fd = rtp_udp_cli_open(conf_info->remote_ip, conf_info->server_port);
+    rtp_info.udp_send_sock.fd = rtp_udp_cli_open(conf_info->vlan, conf_info->remote_ip, conf_info->server_port);
     if(rtp_info.udp_send_sock.fd < 0) {
         LOGE("Can not connected to %s:%d [errno-%d].", conf_info->remote_ip, conf_info->server_port, errno);
         goto error;
diff --git a/mbtk/mbtk_servicesd_v2/src/reboot_reason.c b/mbtk/mbtk_servicesd_v2/src/reboot_reason.c
index e40c7f4..f1dfc8c 100755
--- a/mbtk/mbtk_servicesd_v2/src/reboot_reason.c
+++ b/mbtk/mbtk_servicesd_v2/src/reboot_reason.c
@@ -39,8 +39,8 @@
     mbtk_device_info_reboot_flag_enum reboot_reason = MBTK_REBOOT_FLAG_NORMAL;

     mbtk_device_info_basic_t info_basic = {0};

     memset(&info_basic, 0, sizeof(mbtk_device_info_basic_t));

-    

-    

+

+

     ret = mbtk_dev_info_read(MBTK_DEVICE_INFO_ITEM_BASIC, &(info_basic), sizeof(mbtk_device_info_basic_t));

     if(ret != 0)

     {

@@ -49,14 +49,27 @@
     }

     else

     {

-        reboot_reason = info_basic.reboot_flag;

-        if(info_basic.reboot_flag != MBTK_REBOOT_FLAG_NORMAL)

-        {

-            info_basic.reboot_flag = MBTK_REBOOT_FLAG_NORMAL;

-            ret = mbtk_dev_info_write(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));

-            if(ret != 0) {

-                LOGE("[%s] mbtk_dev_info_write(BASIC) fail.", __func__);

+        if(info_basic.version == DEV_INFO_VERSION_V1) {

+            reboot_reason = info_basic.basic.v1.reboot_flag;

+            if(reboot_reason != MBTK_REBOOT_FLAG_NORMAL)

+            {

+                info_basic.basic.v1.reboot_flag = MBTK_REBOOT_FLAG_NORMAL;

+                ret = mbtk_dev_info_write(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));

+                if(ret != 0) {

+                    LOGE("[%s] mbtk_dev_info_write(BASIC) fail.", __func__);

+                }

             }

+        } else {

+            reboot_reason = info_basic.basic.v2.reboot_flag;

+            if(reboot_reason != MBTK_REBOOT_FLAG_NORMAL)

+            {

+                info_basic.basic.v2.reboot_flag = MBTK_REBOOT_FLAG_NORMAL;

+                ret = mbtk_dev_info_write(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));

+                if(ret != 0) {

+                    LOGE("[%s] mbtk_dev_info_write(BASIC) fail.", __func__);

+                }

+            }

+

         }

     }

 

@@ -64,7 +77,7 @@
     memset(buff, 0x0, 32);

     sprintf(buff, "%d", reboot_reason);

     property_set("persist.mbtk.reboot_reason", buff);

-    

+

     LOGD("[%s] reboot reason exit.", __func__);

 

     return 0;

diff --git a/mbtk/mbtk_utils/device_info.c b/mbtk/mbtk_utils/device_info.c
index a5cc759..976f289 100755
--- a/mbtk/mbtk_utils/device_info.c
+++ b/mbtk/mbtk_utils/device_info.c
@@ -125,35 +125,36 @@
     memset(info_modem, 0, sizeof(mbtk_device_info_modem_t));
     if(mbtk_dev_info_read(MBTK_DEVICE_INFO_ITEM_MODEM, info_modem, sizeof(mbtk_device_info_modem_t))) {
         printf("mbtk_dev_info_read(MODEM) fail, use default band.\n");
-        info_modem->band_area = MBTK_MODEM_BAND_AREA_ALL;
+        info_modem->version = DEV_INFO_VERSION_V2;
+        info_modem->modem.v2.band_area = MBTK_MODEM_BAND_AREA_ALL;
 #ifdef MBTK_5G_SUPPORT
-        info_modem->net_pref = 19; // MBTK_NET_PREF_LTE_NR_NR_PREF
-        info_modem->net_support = MBTK_NET_SUPPORT_4G | MBTK_NET_SUPPORT_5G;
+        info_modem->modem.v2.net_pref = 19; // MBTK_NET_PREF_LTE_NR_NR_PREF
+        info_modem->modem.v2.net_support = MBTK_NET_SUPPORT_4G | MBTK_NET_SUPPORT_5G;
 
-        info_modem->band_gsm = 0;
-        info_modem->band_wcdma = 0;
-        info_modem->band_tdlte = MBTK_BAND_ALL_TDLTE_DEFAULT;
-        info_modem->band_fddlte = MBTK_BAND_ALL_FDDLTE_DEFAULT;
-        info_modem->band_lte_ext = MBTK_BAND_ALL_EXT_LTE_DEFAULT;
+        info_modem->modem.v2.band_gsm = 0;
+        info_modem->modem.v2.band_wcdma = 0;
+        info_modem->modem.v2.band_tdlte = MBTK_BAND_ALL_TDLTE_DEFAULT;
+        info_modem->modem.v2.band_fddlte = MBTK_BAND_ALL_FDDLTE_DEFAULT;
+        info_modem->modem.v2.band_lte_ext = MBTK_BAND_ALL_EXT_LTE_DEFAULT;
 
-        info_modem->band_nr_3 = MBTK_BAND_ALL_NR_3_DEFAULT;
-        info_modem->band_nr_2 = MBTK_BAND_ALL_NR_2_DEFAULT;
-        info_modem->band_nr_1 = MBTK_BAND_ALL_NR_1_DEFAULT;
-        info_modem->band_nr_0 = MBTK_BAND_ALL_NR_0_DEFAULT;
+        info_modem->modem.v2.band_nr_3 = MBTK_BAND_ALL_NR_3_DEFAULT;
+        info_modem->modem.v2.band_nr_2 = MBTK_BAND_ALL_NR_2_DEFAULT;
+        info_modem->modem.v2.band_nr_1 = MBTK_BAND_ALL_NR_1_DEFAULT;
+        info_modem->modem.v2.band_nr_0 = MBTK_BAND_ALL_NR_0_DEFAULT;
 #else
-        info_modem->net_pref = 15; // MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF
-        info_modem->net_support = MBTK_NET_SUPPORT_2G | MBTK_NET_SUPPORT_3G | MBTK_NET_SUPPORT_4G;
+        info_modem->modem.v2.net_pref = 15; // MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF
+        info_modem->modem.v2.net_support = MBTK_NET_SUPPORT_2G | MBTK_NET_SUPPORT_3G | MBTK_NET_SUPPORT_4G;
 
-        info_modem->band_gsm = MBTK_BAND_ALL_GSM_DEFAULT;
-        info_modem->band_wcdma = MBTK_BAND_ALL_WCDMA_DEFAULT;
-        info_modem->band_tdlte = MBTK_BAND_ALL_TDLTE_DEFAULT;
-        info_modem->band_fddlte = MBTK_BAND_ALL_FDDLTE_DEFAULT;
-        info_modem->band_lte_ext = MBTK_BAND_ALL_EXT_LTE_DEFAULT;
+        info_modem->modem.v2.band_gsm = MBTK_BAND_ALL_GSM_DEFAULT;
+        info_modem->modem.v2.band_wcdma = MBTK_BAND_ALL_WCDMA_DEFAULT;
+        info_modem->modem.v2.band_tdlte = MBTK_BAND_ALL_TDLTE_DEFAULT;
+        info_modem->modem.v2.band_fddlte = MBTK_BAND_ALL_FDDLTE_DEFAULT;
+        info_modem->modem.v2.band_lte_ext = MBTK_BAND_ALL_EXT_LTE_DEFAULT;
 
-        info_modem->band_nr_3 = 0;
-        info_modem->band_nr_2 = 0;
-        info_modem->band_nr_1 = 0;
-        info_modem->band_nr_0 = 0;
+        info_modem->modem.v2.band_nr_3 = 0;
+        info_modem->modem.v2.band_nr_2 = 0;
+        info_modem->modem.v2.band_nr_1 = 0;
+        info_modem->modem.v2.band_nr_0 = 0;
 #endif
     }
 }
@@ -164,20 +165,24 @@
     char rsp[100] = {0};
 
     // Only support 4G/5G
-    if(band->net_support & MBTK_NET_SUPPORT_5G) {
+    if(band->modem.v2.net_support & MBTK_NET_SUPPORT_5G) {
         // AT*band=19,0,0,482,134742231,0,24576,256,134217877,0
-        if(band->band_lte_ext > 0) {
-            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,%d,%d,%d,%d,0,,,,%d", band->net_pref, band->band_gsm, band->band_wcdma, band->band_tdlte, band->band_fddlte,
-                band->band_nr_3, band->band_nr_2, band->band_nr_1, band->band_nr_0, band->band_lte_ext);
+        if(band->modem.v2.band_lte_ext > 0) {
+            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,%d,%d,%d,%d,0,,,,%d", band->modem.v2.net_pref, band->modem.v2.band_gsm,
+                band->modem.v2.band_wcdma, band->modem.v2.band_tdlte, band->modem.v2.band_fddlte,
+                band->modem.v2.band_nr_3, band->modem.v2.band_nr_2, band->modem.v2.band_nr_1,
+                band->modem.v2.band_nr_0, band->modem.v2.band_lte_ext);
         } else {
-            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,%d,%d,%d,%d,0", band->net_pref, band->band_gsm, band->band_wcdma, band->band_tdlte, band->band_fddlte,
-                band->band_nr_3, band->band_nr_2, band->band_nr_1, band->band_nr_0);
+            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,%d,%d,%d,%d,0", band->modem.v2.net_pref, band->modem.v2.band_gsm,
+                band->modem.v2.band_wcdma, band->modem.v2.band_tdlte, band->modem.v2.band_fddlte,
+                band->modem.v2.band_nr_3, band->modem.v2.band_nr_2, band->modem.v2.band_nr_1, band->modem.v2.band_nr_0);
         }
     } else {
-        if(band->band_lte_ext > 0) {
-            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,,,,%d", band->net_pref, band->band_gsm, band->band_wcdma, band->band_tdlte, band->band_fddlte, band->band_lte_ext);
+        if(band->modem.v2.band_lte_ext > 0) {
+            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d,,,,%d", band->modem.v2.net_pref, band->modem.v2.band_gsm, band->modem.v2.band_wcdma,
+                band->modem.v2.band_tdlte, band->modem.v2.band_fddlte, band->modem.v2.band_lte_ext);
         } else {
-            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d", band->net_pref, band->band_gsm, band->band_wcdma, band->band_tdlte, band->band_fddlte);
+            sprintf(cmd, "serial_atcmd AT*BAND=%d,%d,%d,%d,%d", band->modem.v2.net_pref, band->modem.v2.band_gsm, band->modem.v2.band_wcdma, band->modem.v2.band_tdlte, band->modem.v2.band_fddlte);
         }
     }
 
@@ -205,11 +210,11 @@
     }
     else // Set band success.
     {
-        if(info_modem->band_area == MBTK_MODEM_BAND_AREA_CN) {
+        if(info_modem->modem.v2.band_area == MBTK_MODEM_BAND_AREA_CN) {
             property_set("persist.mbtk.band_config", "CN");
-        } else if(info_modem->band_area == MBTK_MODEM_BAND_AREA_EU) {
+        } else if(info_modem->modem.v2.band_area == MBTK_MODEM_BAND_AREA_EU) {
             property_set("persist.mbtk.band_config", "EU");
-        } else if(info_modem->band_area == MBTK_MODEM_BAND_AREA_SA) {
+        } else if(info_modem->modem.v2.band_area == MBTK_MODEM_BAND_AREA_SA) {
             property_set("persist.mbtk.band_config", "SA");
         } else {
             property_set("persist.mbtk.band_config", "ALL");
@@ -258,14 +263,25 @@
             uint8 revision_out[48];     // L508_X6v01.01b04.00
             uint8 revision_in[64];
         */
-        printf("Project:%s\n", info_basic.project);
-        printf("Custom_Model:%s\n", info_basic.project_cust);
-        printf("Revision_Out:%s\n", info_basic.revision_out);
-        printf("Revision_In:%s\n", info_basic.revision_in);
-        printf("Build_Time:%s\n", info_basic.build_time);
-        printf("AB System:%s\n", info_basic.ab_support ? "Yes" : "No");
-        printf("Reboot flag:%d\n", info_basic.reboot_flag);
-        printf("ASR Baseline:%s\n", info_basic.asr_baseline);
+        printf("Version:%d\n", info_basic.version);
+        if(info_basic.version == DEV_INFO_VERSION_V1) {
+            printf("Project:%s\n", info_basic.basic.v1.project);
+            printf("Custom_Model:%s\n", info_basic.basic.v1.project_cust);
+            printf("Revision_Out:%s\n", info_basic.basic.v1.revision_out);
+            printf("Revision_In:%s\n", info_basic.basic.v1.revision_in);
+            printf("Build_Time:%s\n", info_basic.basic.v1.build_time);
+            printf("AB System:%s\n", info_basic.basic.v1.ab_support ? "Yes" : "No");
+            printf("Reboot flag:%d\n", info_basic.basic.v1.reboot_flag);
+        } else {
+            printf("Project:%s\n", info_basic.basic.v2.project);
+            printf("Custom_Model:%s\n", info_basic.basic.v2.project_cust);
+            printf("Revision_Out:%s\n", info_basic.basic.v2.revision_out);
+            printf("Revision_In:%s\n", info_basic.basic.v2.revision_in);
+            printf("Build_Time:%s\n", info_basic.basic.v2.build_time);
+            printf("AB System:%s\n", info_basic.basic.v2.ab_support ? "Yes" : "No");
+            printf("Reboot flag:%d\n", info_basic.basic.v2.reboot_flag);
+            printf("ASR Baseline:%s\n", info_basic.basic.v2.asr_baseline);
+        }
 
         mbtk_device_info_modem_t info_modem;
         memset(&info_modem, 0, sizeof(mbtk_device_info_modem_t));
@@ -275,18 +291,27 @@
             return -1;
         }
 
-        printf("net_pref:%d\n", info_modem.net_pref);
-        printf("net_support:%s\n", net_support_str_get(info_modem.net_support));
-        printf("Band:%s\n", band_2_str(info_modem.band_area));
-        printf("Band GSM:0x%08x(%s)\n", info_modem.band_gsm, band_str_get(info_modem.band_gsm, 0));
-        printf("Band WCDMA:0x%08x(%s)\n", info_modem.band_wcdma, band_str_get(info_modem.band_wcdma, 0));
-        printf("Band TDLTE:0x%08x(%s)\n", info_modem.band_tdlte, band_str_get(info_modem.band_tdlte, 1));
-        printf("Band FDDLTE:0x%08x(%s)\n", info_modem.band_fddlte, band_str_get(info_modem.band_fddlte, 0));
-        printf("Band EXT_LTE:0x%08x(%s)\n", info_modem.band_lte_ext, band_str_get(info_modem.band_lte_ext, 0));
-        printf("Band NR_3:0x%08x(%s)\n", info_modem.band_nr_3, band_str_get(info_modem.band_nr_3, 3));
-        printf("Band NR_2:0x%08x(%s)\n", info_modem.band_nr_2, band_str_get(info_modem.band_nr_2, 2));
-        printf("Band NR_1:0x%08x(%s)\n", info_modem.band_nr_1, band_str_get(info_modem.band_nr_1, 1));
-        printf("Band NR_0:0x%08x(%s)\n", info_modem.band_nr_0, band_str_get(info_modem.band_nr_0, 0));
+        if(info_modem.version == DEV_INFO_VERSION_V1) {
+            printf("Band:%s\n", band_2_str(info_modem.modem.v1.band_area));
+            printf("Band GSM:0x%08x(%s)\n", info_modem.modem.v1.band_gsm, band_str_get(info_modem.modem.v1.band_gsm, 0));
+            printf("Band WCDMA:0x%08x(%s)\n", info_modem.modem.v1.band_wcdma, band_str_get(info_modem.modem.v1.band_wcdma, 0));
+            printf("Band TDLTE:0x%08x(%s)\n", info_modem.modem.v1.band_tdlte, band_str_get(info_modem.modem.v1.band_tdlte, 1));
+            printf("Band FDDLTE:0x%08x(%s)\n", info_modem.modem.v1.band_fddlte, band_str_get(info_modem.modem.v1.band_fddlte, 0));
+            printf("Band EXT_LTE:0x%08x(%s)\n", info_modem.modem.v1.band_lte_ext, band_str_get(info_modem.modem.v1.band_lte_ext, 0));
+        } else {
+            printf("net_pref:%d\n", info_modem.modem.v2.net_pref);
+            printf("net_support:%s\n", net_support_str_get(info_modem.modem.v2.net_support));
+            printf("Band:%s\n", band_2_str(info_modem.modem.v2.band_area));
+            printf("Band GSM:0x%08x(%s)\n", info_modem.modem.v2.band_gsm, band_str_get(info_modem.modem.v2.band_gsm, 0));
+            printf("Band WCDMA:0x%08x(%s)\n", info_modem.modem.v2.band_wcdma, band_str_get(info_modem.modem.v2.band_wcdma, 0));
+            printf("Band TDLTE:0x%08x(%s)\n", info_modem.modem.v2.band_tdlte, band_str_get(info_modem.modem.v2.band_tdlte, 1));
+            printf("Band FDDLTE:0x%08x(%s)\n", info_modem.modem.v2.band_fddlte, band_str_get(info_modem.modem.v2.band_fddlte, 0));
+            printf("Band EXT_LTE:0x%08x(%s)\n", info_modem.modem.v2.band_lte_ext, band_str_get(info_modem.modem.v2.band_lte_ext, 0));
+            printf("Band NR_3:0x%08x(%s)\n", info_modem.modem.v2.band_nr_3, band_str_get(info_modem.modem.v2.band_nr_3, 3));
+            printf("Band NR_2:0x%08x(%s)\n", info_modem.modem.v2.band_nr_2, band_str_get(info_modem.modem.v2.band_nr_2, 2));
+            printf("Band NR_1:0x%08x(%s)\n", info_modem.modem.v2.band_nr_1, band_str_get(info_modem.modem.v2.band_nr_1, 1));
+            printf("Band NR_0:0x%08x(%s)\n", info_modem.modem.v2.band_nr_0, band_str_get(info_modem.modem.v2.band_nr_0, 0));
+        }
     }
     return 0;
 }
diff --git a/mbtk/mbtk_utils/mbtk_reboot.c b/mbtk/mbtk_utils/mbtk_reboot.c
index a355235..d3861e2 100755
--- a/mbtk/mbtk_utils/mbtk_reboot.c
+++ b/mbtk/mbtk_utils/mbtk_reboot.c
@@ -45,7 +45,11 @@
         return -1;
     }
 
-    info_basic.reboot_flag = MBTK_REBOOT_FLAG_DOWNLOAD;
+    if(info_basic.version == DEV_INFO_VERSION_V1) {
+        info_basic.basic.v1.reboot_flag = MBTK_REBOOT_FLAG_DOWNLOAD;
+    } else {
+        info_basic.basic.v2.reboot_flag = MBTK_REBOOT_FLAG_DOWNLOAD;
+    }
     result = mbtk_dev_info_write(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));
     if(result) {
         printf("mbtk_dev_info_write(BASIC) fail.\n");
diff --git a/mbtk/mbtk_utils_linux/Makefile b/mbtk/mbtk_utils_linux/Makefile
index c2427bc..9e6c72b 100755
--- a/mbtk/mbtk_utils_linux/Makefile
+++ b/mbtk/mbtk_utils_linux/Makefile
@@ -5,8 +5,8 @@
 #DEFINE = -DMBTK_DEV_INFO_VERSION_2
 #endif
 
-INC_DIR += \
-		-I$(LOCAL_PATH)
+#INC_DIR += \
+#		-I$(LOCAL_PATH)
 
 CC=gcc
 
diff --git a/mbtk/mbtk_utils_linux/mbtk_device.h b/mbtk/mbtk_utils_linux/mbtk_device.h
new file mode 100755
index 0000000..1850811
--- /dev/null
+++ b/mbtk/mbtk_utils_linux/mbtk_device.h
@@ -0,0 +1,155 @@
+/*
+* mbtk_device.h
+*
+* MBTK device_info partition data header.
+*
+* Author : lb
+* Date   : 2023/12/30 11:36:35
+*/
+#ifndef _MBTK_DEVICE_H
+#define _MBTK_DEVICE_H
+//#include "mbtk_type.h"
+
+#define MBTK_DEVICE_INFO_PARTITION_NAME "device_info"
+#define MBTK_DEVICE_INFO_PARTITION_TAG 0x87878787
+#define MBTK_DEVICE_INFO_CURR_VERSION 2
+
+// 78,147,482,134742231
+#define MBTK_BAND_ALL_GSM_DEFAULT 78             // GSM : ASR default.
+#define MBTK_BAND_ALL_WCDMA_DEFAULT 147          // WCDMA : ASR default.
+#define MBTK_BAND_ALL_TDLTE_DEFAULT 482          // TDD-LTE : ASR default.
+#define MBTK_BAND_ALL_FDDLTE_DEFAULT 134742231   // FDD-LTE : ASR default.
+#define MBTK_BAND_ALL_EXT_LTE_DEFAULT 0          // EXT-LTE
+#define MBTK_BAND_ALL_NR_3_DEFAULT 0
+#define MBTK_BAND_ALL_NR_2_DEFAULT 24576         // n78/n79
+#define MBTK_BAND_ALL_NR_1_DEFAULT 256           // n41
+#define MBTK_BAND_ALL_NR_0_DEFAULT 134217877     // n1/n3/n5/n8/n28
+
+#define MBTK_BAND_CN_GSM_DEFAULT 11             // GSM : B3/B8 (PGSM 900/DCS GSM 1800/EGSM 900)
+#define MBTK_BAND_CN_WCDMA_DEFAULT 129          // WCDMA : B1/B8
+#define MBTK_BAND_CN_TDLTE_DEFAULT 482          // TDD-LTE : B34/B38/B39/B40/B41
+#define MBTK_BAND_CN_FDDLTE_DEFAULT 149         // FDD-LTE : B1/B3/B5/B8
+#define MBTK_BAND_CN_EXT_LTE_DEFAULT 0          // EXT-LTE
+#define MBTK_BAND_CN_NR_3_DEFAULT 0
+#define MBTK_BAND_CN_NR_2_DEFAULT 24576         // n78/n79
+#define MBTK_BAND_CN_NR_1_DEFAULT 384           // n40/n41
+#define MBTK_BAND_CN_NR_0_DEFAULT 134217877     // n1/n3/n5/n8/n28
+
+#define MBTK_BAND_EU_GSM_DEFAULT 11             // GSM : B3/B8 (PGSM 900/DCS GSM 1800/EGSM 900)
+#define MBTK_BAND_EU_WCDMA_DEFAULT 145          // WCDMA : B1/B5/B8
+#define MBTK_BAND_EU_TDLTE_DEFAULT 416          // TDD-LTE : B38/B40/B41
+#define MBTK_BAND_EU_FDDLTE_DEFAULT 134742229   // FDD-LTE : B1/B3/B5/B7/B8/B20/B28
+#define MBTK_BAND_EU_EXT_LTE_DEFAULT 0          // EXT-LTE
+#define MBTK_BAND_EU_NR_3_DEFAULT 0
+#define MBTK_BAND_EU_NR_2_DEFAULT 12352         // n71/n77/n78
+#define MBTK_BAND_EU_NR_1_DEFAULT 416           // n38/n40/n41
+#define MBTK_BAND_EU_NR_0_DEFAULT 134742229     // n1/n3/n5/n7/n8/n20/n28
+
+#define MBTK_BAND_SA_GSM_DEFAULT 79             // GSM : B2/B3/B5/B8(GSM 850/PGSM 900/EGSM 900/DCS GSM 1800/PCS GSM 1900)
+#define MBTK_BAND_SA_WCDMA_DEFAULT 155          // WCDMA : B1/B2/B4/B5/B8
+#define MBTK_BAND_SA_TDLTE_DEFAULT 128          // TDD-LTE : B40
+#define MBTK_BAND_SA_FDDLTE_DEFAULT 134217951  // FDD-LTE : B1/B2/B3/B4/B5/B7/B8/B28
+#define MBTK_BAND_SA_EXT_LTE_DEFAULT 2          // EXT-LTE : B66
+#define MBTK_BAND_SA_NR_3_DEFAULT MBTK_BAND_ALL_NR_3_DEFAULT
+#define MBTK_BAND_SA_NR_2_DEFAULT MBTK_BAND_ALL_NR_2_DEFAULT
+#define MBTK_BAND_SA_NR_1_DEFAULT MBTK_BAND_ALL_NR_1_DEFAULT
+#define MBTK_BAND_SA_NR_0_DEFAULT MBTK_BAND_ALL_NR_0_DEFAULT
+
+#define MBTK_DEVICE_INFO_ITEM_STR_BASIC "BASIC"
+#define MBTK_DEVICE_INFO_ITEM_STR_FOTA "FOTA"
+#define MBTK_DEVICE_INFO_ITEM_STR_MODEM "MODEM"
+#define MBTK_DEVICE_INFO_ITEM_STR_LOG "LOG"
+
+#define MBTK_DEVICE_INFO_ITEM_ADDR_BASIC    0x100   // Header is 0x100
+#define MBTK_DEVICE_INFO_ITEM_ADDR_FOTA     0x500   // Basic is 1k
+#define MBTK_DEVICE_INFO_ITEM_ADDR_MODEM    0x900   // Fota is 1k
+#define MBTK_DEVICE_INFO_ITEM_ADDR_LOG      0xD00   // Modem is 1k
+
+#define MBTK_NET_SUPPORT_2G (1)
+#define MBTK_NET_SUPPORT_3G (1<<1)
+#define MBTK_NET_SUPPORT_4G (1<<2)
+#define MBTK_NET_SUPPORT_5G (1<<3)
+
+typedef enum {
+    MBTK_DEVICE_INFO_ITEM_BASIC = 0,
+    MBTK_DEVICE_INFO_ITEM_FOTA,
+    MBTK_DEVICE_INFO_ITEM_MODEM,
+    MBTK_DEVICE_INFO_ITEM_LOG,
+
+    MBTK_DEVICE_INFO_ITEM_NUM
+} mbtk_device_info_item_enum;
+
+typedef struct {
+    mbtk_device_info_item_enum item;
+    uint32 addr;
+} mbtk_device_info_item_header_t;
+
+typedef struct {
+    uint32 tag;
+    uint32 version;             // Default : 0x01
+    uint32 item_count;
+    mbtk_device_info_item_header_t item_header[MBTK_DEVICE_INFO_ITEM_NUM];
+} mbtk_device_info_header_t;
+
+typedef enum {
+    MBTK_REBOOT_FLAG_NORMAL = 0,
+    MBTK_REBOOT_FLAG_DOWNLOAD,
+    MBTK_REBOOT_FLAG_POWER_OFF,  //Power off and restart
+    MBTK_REBOOT_FLAG_HARDWARE,   //Hardware restart
+    MBTK_REBOOT_FLAG_COMMAND,    //"reboot" "reboot -f" Command restart
+    MBTK_REBOOT_FLAG_ABNORMAL,   //Abnormal restart
+    MBTK_REBOOT_FLAG_UNKNOWN,    //unknown restart
+} mbtk_device_info_reboot_flag_enum;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    uint8 project[16];          // T108 / L508_X6
+    uint8 project_cust[16];     // T108_C1 / L508_X6_C1  (Refer to: Custom_Model in blf file.)
+    uint32 ab_support;          // 1 for ab
+    mbtk_device_info_reboot_flag_enum reboot_flag;
+    uint8 revision_out[48];     // L508_X6v01.01b04.00
+    uint8 revision_in[64];
+    uint8 build_time[64];
+    uint8 asr_baseline[64];
+} mbtk_device_info_basic_t;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    uint32 state;               //
+} mbtk_device_info_fota_t;
+
+typedef enum {
+    MBTK_MODEM_BAND_AREA_ALL,
+    MBTK_MODEM_BAND_AREA_CN,
+    MBTK_MODEM_BAND_AREA_EU,
+    MBTK_MODEM_BAND_AREA_SA
+} mbtk_modem_band_area_enum;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    mbtk_modem_band_area_enum band_area;
+    uint32 net_pref;    // Refor to : mbtk_net_pref_enum
+    uint32 net_support; // 1:GSM      2:WCDMA   4:LTE   8:NR
+    uint32 band_gsm;
+    uint32 band_wcdma;
+    uint32 band_tdlte;
+    uint32 band_fddlte;
+    uint32 band_lte_ext;
+    uint32 band_nr_3;
+    uint32 band_nr_2;
+    uint32 band_nr_1;
+    uint32 band_nr_0;
+} mbtk_device_info_modem_t;
+
+typedef struct {
+    uint8 name[16];
+    uint32 version;             // Default : 0x01
+    uint32 state;               //
+} mbtk_device_info_log_t;
+
+
+#endif /* _MBTK_DEVICE_H */
+
diff --git a/mbtk/mbtk_utils_linux/mbtk_type.h b/mbtk/mbtk_utils_linux/mbtk_type.h
new file mode 100755
index 0000000..c7fc885
--- /dev/null
+++ b/mbtk/mbtk_utils_linux/mbtk_type.h
@@ -0,0 +1,123 @@
+#ifndef MBTK_TYPE_INCLUDE
+#define MBTK_TYPE_INCLUDE
+#include <stdio.h>
+#include <stdbool.h>
+#include <sys/types.h>
+
+#ifndef MBTK_PLATFORM_LINUX
+#define MBTK_PLATFORM_LINUX
+#endif
+
+#ifndef MBTK_PLATFORM_QCOMM
+//#define MBTK_PLATFORM_QCOMM
+#endif
+
+#define MBTK_SUCCESS 0
+#define MBTK_FAILE (-1)
+
+#ifndef UNUSED
+#define UNUSED(param) ((void) param)
+#endif
+
+#ifndef UNUSEDPARAM
+#define UNUSEDPARAM(param) ((void) param)
+#endif
+
+#ifndef TRUE
+#define TRUE   1   /* Boolean true value. */
+#endif
+
+#ifndef true
+#define true   1   /* Boolean true value. */
+#endif
+
+#ifndef FALSE
+#define FALSE  0   /* Boolean false value. */
+#endif
+
+#ifndef false
+#define false  0   /* Boolean false value. */
+#endif
+
+
+#ifndef NULL
+#define NULL  0
+#endif
+
+
+#ifndef null
+#define null  0
+#endif
+
+/**
+ * Compiler-digit : 16
+ * char : 1     (%c)
+ * char* : 2
+ * short int : 2
+ * int : 2      (%d)
+ * unsigned int : 2  (%u)
+ * float : 4    (%f)
+ * double : 8   (%f)
+ * long : 4
+ * unsigned long : 4
+ * long long : 8
+ * unsigned long long : 8
+ *
+ *
+ * Compiler-digit : 32
+ * char : 1
+ * char* : 4
+ * short int : 2
+ * int : 4
+ * unsigned int : 4
+ * float : 4
+ * double : 8
+ * long : 4
+ * unsigned long : 4
+ * long long : 8
+ * unsigned long long : 8
+ *
+ *
+ * Compiler-digit : 64
+ * char : 1
+ * char* : 8
+ * short int : 2
+ * int : 4
+ * unsigned int : 4
+ * float : 4
+ * double : 8
+ * long : 8
+ * unsigned long : 8
+ * long long : 8
+ * unsigned long long : 8
+ */
+typedef unsigned char boolean; /* Boolean value type. */
+// typedef unsigned char bool; /* Boolean value type. */
+typedef unsigned long long uint64; /* Unsigned 64 bit value */
+typedef unsigned long long uint64_t; /* Unsigned 64 bit value */
+typedef unsigned int uint32; /* Unsigned 32 bit value */
+typedef unsigned int uint32_t; /* Unsigned 32 bit value */
+typedef unsigned short uint16; /* Unsigned 16 bit value */
+typedef unsigned short uint16_t;
+typedef unsigned char uint8; /* Unsigned 8  bit value */
+typedef unsigned char uint8_t;
+typedef signed long long int64; /* Signed 64 bit value */
+typedef signed long long sint64; /* Signed 64 bit value */
+typedef signed int int32; /* Signed 32 bit value */
+typedef signed int sint32; /* Signed 32 bit value */
+typedef signed short int16; /* Signed 16 bit value */
+typedef signed short sint16; /* Signed 16 bit value */
+typedef signed char int8; /* Signed 8  bit value */
+typedef signed char sint8; /* Signed 8  bit value */
+typedef unsigned char byte; /* byte type */
+
+
+typedef struct
+{
+    char *buffer;
+    int size;
+    int size_max;
+} mbtk_buffer_t;
+
+
+#endif /* MBTK_TYPE_INCLUDE */
diff --git a/mbtk/test/libmbtk_lib/mbtk_rtp_test.c b/mbtk/test/libmbtk_lib/mbtk_rtp_test.c
index 2140e25..bc20847 100755
--- a/mbtk/test/libmbtk_lib/mbtk_rtp_test.c
+++ b/mbtk/test/libmbtk_lib/mbtk_rtp_test.c
@@ -15,6 +15,7 @@
     printf("rtp_mode <0/1>: Disable/Enable RTP.\n");
     printf("volume <0-7>: Set volume.\n");
     printf("remote_ip <xxx:xxx:xxx:xxx>: Set remote ip.\n");
+    printf("vlan <dev>: Set local device.\n");
     printf("client_port <port>: Set client(local) port.\n");
     printf("server_port <port>: Set server(remote) port.\n");
     printf("sample_rate <8000/16000>: Set sample rate.\n");
@@ -93,6 +94,16 @@
                     }
                 }
             }
+            else if(!strncasecmp(cmd, "vlan", 4)){
+                char vlan[20] = {0};
+                if(1 == sscanf(cmd, "vlan %s", vlan)) {
+                    if(mbtk_rtp_vlan_set(vlan)) {
+                        printf("Error\n");
+                    } else {
+                        printf("Success\n");
+                    }
+                }
+            }
             else if(!strncasecmp(cmd, "client_port", 11)){
                 int temp;
                 if(1 == sscanf(cmd, "client_port %d", &temp)) {