[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/service/mcf/src/mcf_ut.c b/mcu/service/mcf/src/mcf_ut.c
new file mode 100644
index 0000000..792c9e7
--- /dev/null
+++ b/mcu/service/mcf/src/mcf_ut.c
@@ -0,0 +1,17045 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2018
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ * Filename:
+ * ---------
+ *   mcf_ut.c
+ *
+ * Project:
+ * --------
+ *   UMOLYA
+ *
+ * Description:
+ * ------------
+ *   MD Configuration Framework unit test implementation.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ *                 HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#include "kal_public_api.h"
+#include "sys_test.h"
+#include "fs_general_api.h"
+#include <direct.h>
+#include "syscomp_config.h"
+
+#include "em_msgid.h"
+#include "em_l4_common_public_struct.h"
+#include "em_mcf_public_struct.h"
+#include "em_struct.h"
+
+#include "nvram_interface.h"
+#include "nvram_group_def.h"
+#include "mcf_nvram_editor.h"
+
+#include "mcf_if.h"
+#include "mcf_util.h"
+#include "mcf_defs.h"
+#include "mcf_object.h"
+#include "mcf_debug.h"
+#include "mcf_utfwk.h"
+
+/*------------------------------------------------------------------------------
+ * Constant definition.
+ *----------------------------------------------------------------------------*/
+#define MCF_FS_DUMMY_AP_FILE_PATH "/nvdata/mdota"
+#define MCF_TEST_OTA_LID_BASE_GID 5059
+#define MCF_TEST_OTA_QUERY_LID_BASE_GID 5188
+ 
+/*------------------------------------------------------------------------------
+ * Private Helper macros.
+ *----------------------------------------------------------------------------*/
+#define MCF_UT_FAKE_PRINT 2
+#if MCF_UT_FAKE_PRINT == 1
+    extern int fake_print(const char *fmt, ...);
+    #define _mcf_ut_printf fake_print
+#elif MCF_UT_FAKE_PRINT == 2
+    #define _mcf_ut_printf printf
+#else
+    #define _mcf_ut_printf(...)  
+#endif
+
+#define mcf_ut_printf(_fmts, ...) \
+        _mcf_ut_printf("%s(): " _fmts, __FUNCTION__, ##__VA_ARGS__)
+
+#define mcf_ut_format_err_str(_fmts, ...) \
+        kal_sprintf(p_ret_err_str, "%s():%d: " _fmts, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
+        mcf_ut_printf("[FAILED] %s():%d: " _fmts, __FUNCTION__, __LINE__, ##__VA_ARGS__)
+
+#define MCF_UT_PASS() mcf_ut_printf("PASSED\n")
+
+/*------------------------------------------------------------------------------
+ * Global variables.
+ *----------------------------------------------------------------------------*/
+extern nvram_mcf_lid_info_struct mcf_last_mod_lid_g;
+extern nvram_mcf_lid_info_struct mcf_curr_mod_lid_g;
+extern nvram_mcf_lid_info_struct   mcf_tlvota_last_mod_lid_g[MAX_SIM_NUM];
+extern nvram_mcf_lid_info_struct   mcf_tlvota_curr_mod_lid_g[MAX_SIM_NUM];
+extern nvram_mcf_lid_info_struct   mcf_general_tlvota_last_mod_lid_g[MAX_SIM_NUM];
+extern nvram_mcf_lid_info_struct   mcf_general_tlvota_curr_mod_lid_g[MAX_SIM_NUM];
+extern kal_bool    is_read_tlvota[MAX_SIM_NUM];
+extern kal_bool    is_read_general_tlvota[MAX_SIM_NUM];
+extern nvram_ef_mcf_internal_info_struct nv_int_info;
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+extern kal_uint8 mcf_merge_buffer[MCF_MAX_TLVOTA_FILE_SIZE];
+kal_uint8 mcf_file_buffer[MCF_MAX_TLVOTA_FILE_SIZE];
+#endif
+
+/*------------------------------------------------------------------------------
+ * Private variables.
+ *----------------------------------------------------------------------------*/
+static nvram_ef_mcf_test_struct mcf_utfwk_lid_buffer;
+/* OTA test LID value pattern */
+static const nvram_ef_mcf_test_struct mcf_ut_test_lid_value_pattern = {
+    6, // val_byte_11
+    6, // val_byte_12
+    0x6, // val_bit_byte_11
+    0xf0, // val_bit_byte_12
+    6, // val_short_11
+    6, // val_short_12
+    6, // val_int_1
+    6, // val_float_1
+    6, // val_long_1
+    6.6, // val_double_1
+    "MCF Test 66", // val_buffer_1
+    {6, 6, 0x6, 0xf0, 6, 6, 6, 6, 6, 6.6, "MCF Test 66"}, // val_struct_1
+    6, // val_byte_21
+    6, // val_byte_22
+    0x6, // val_bit_byte_21
+    0xf0, // val_bit_byte_22
+    6, // val_short_21
+    6, // val_short_22
+    6, // val_int_2
+    6, // val_float_2
+    6, // val_long_2
+    6.6, // val_double_2
+    "MCF Test 66", // val_buffer_2
+    {6, 6, 0x6, 0xf0, 6, 6, 6, 6, 6, 6.6, "MCF Test 66"}, // val_struct_2
+    {{6, 6, 0x6, 0x6, 6, 6, 6, 6, 6, 6.6, "MCF"}, // val_struct_3[0]
+     {6, 6, 0x6, 0x6, 6, 6, 6, 6, 6, 6.6, "MCF"}, // val_struct_3[1]
+     {6, 6, 0x6, 0x6, 6, 6, 6, 6, 6, 6.6, "MCF"}, // val_struct_3[2]
+     {6, 6, 0x6, 0x6, 6, 6, 6, 6, 6, 6.6, "MCF"}} // val_struct_3[3]
+};
+
+/* OTA test LID value pattern */
+static nvram_ef_mcf_test_struct mcf_ut_test_lid_value_new_pattern = {
+    0, // val_byte_11
+    0, // val_byte_12
+    0x0, // val_bit_byte_11
+    0x0, // val_bit_byte_12
+    0, // val_short_11
+    0, // val_short_12
+    0, // val_int_1
+    0, // val_float_1
+    0, // val_long_1
+    0, // val_double_1
+    "", // val_buffer_1
+    {0, 0, 0x0, 0x0, 0, 0, 0, 0, 0, 0, "", {"MCF"}, {1,2,3}}, // val_struct_1
+    0, // val_byte_21
+    0, // val_byte_22
+    0x0, // val_bit_byte_21
+    0x0, // val_bit_byte_22
+    0, // val_short_21
+    0, // val_short_22
+    0, // val_int_2
+    0, // val_float_2
+    0, // val_long_2
+    0, // val_double_2
+    "", // val_buffer_2
+    {0, 0, 0x0, 0x0, 0, 0, 0, 0, 0, 0, "", {"MCF"}, {1,2,3}}, // val_struct_2
+    {{0, 0, 0x0, 0x0, 0, 0, 0, 0, 0, 0, "", {"MCF"}, {1,2,3}}, // val_struct_3[0]
+     {0, 0, 0x0, 0x0, 0, 0, 0, 0, 0, 0, "", {"MCF"}, {1,2,3}}, // val_struct_3[1]
+     {0, 0, 0x0, 0x0, 0, 0, 0, 0, 0, 0, "", {"MCF"}, {1,2,3}}, // val_struct_3[2]
+     {0, 0, 0x0, 0x0, 0, 0, 0, 0, 0, 0, "", {"MCF"}, {1,2,3}}}, // val_struct_3[3]
+    0xFFFF,
+    0xFFFFFFFF,
+    0xFF,
+    0xFF,
+    0xFFFF,
+    0xFFFFFFFF
+};
+
+/*------------------------------------------------------------------------------
+ * Private fucntions.
+ *----------------------------------------------------------------------------*/
+extern kal_char* release_verno(void);
+extern kal_char* build_date_time(void);
+extern sim_interface_enum l4c_gemini_get_actual_sim_id(sim_interface_enum simId);
+extern kal_bool mcf_set_file_path(l4c_mcf_set_config_req_struct *req);
+extern kal_bool mcf_get_applied_file_path(l4c_mcf_get_config_req_struct *req, l4c_mcf_get_config_cnf_struct *resp);
+extern kal_bool mcf_em_update_req_hdlr(local_para_struct *local_para_ptr);
+extern chmod(const char *_Filename,int _Mode);
+
+void mcf_ut_init(void)
+{
+    mcf_t              *pMcf;
+    mcf_ota_file_t     *ota_file;
+    mcf_tlvota_file_t  *tlvota_file;
+    kal_uint8          *lid_buffer;
+    kal_uint32          i;
+
+    pMcf = mcf_get_instance();
+    ota_file = &(pMcf->ota_file);
+    kal_mem_set(pMcf, 0, sizeof(mcf_t));
+
+    /* Object init */
+    MCF_INIT_OBJECT_BEGIN(ota_file, mcf_enhmutex_g);
+    MCF_INIT_OBJECT_END(ota_file, mcf_enhmutex_g);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_INIT_OBJECT_BEGIN(tlvota_file, mcf_enhmutex_g);
+        MCF_INIT_OBJECT_END(tlvota_file, mcf_enhmutex_g);
+    }
+
+    tlvota_file = &(pMcf->general_tlvota_file);
+    MCF_INIT_OBJECT_BEGIN(tlvota_file, mcf_enhmutex_g);
+    MCF_INIT_OBJECT_END(tlvota_file, mcf_enhmutex_g);
+
+    /* Reset NVRAM_EF_MCF_OTA_FILE_LID */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, i+1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /* Reset NVRAM_EF_MCF_TLVOTA_FILE_LID */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TLVOTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, i+1, lid_buffer, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TLVOTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /* Reset NVRAM_EF_MCF_TEST_OTA_LID */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, i+1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /* Reset NVRAM_EF_MCF_TEST_OTA_QUERY_LID */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_QUERY_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, i+1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_QUERY_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /* Reset NVRAM_EF_MCF_SW_INFO_LID */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_SW_INFO_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, i+1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+    
+    /* Reset NVRAM_EF_MCF_INTERNAL_INFO_LID */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_internal_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_INTERNAL_INFO_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, i+1, lid_buffer, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_INTERNAL_INFO_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    return;
+}
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_open_test_data(kal_char *filename, kal_char *data_buff, kal_uint32 size)
+{
+    kal_char    test_data_path[512];
+    kal_char   *pos; 
+    FILE       *file;
+
+    getcwd(test_data_path, sizeof(test_data_path));
+    pos = strstr(test_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s%c", MCF_UT_DB_FOLDER_PATH, filename, '\0');
+    file = fopen(test_data_path, "rb");
+
+    if(file != NULL)
+    {
+        kal_mem_set(data_buff, 0, size);
+        fread(data_buff, size, 1, file);
+        fclose(file);
+    } else {
+        return KAL_FALSE;
+    }
+
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_write_test_data(kal_char *filename, kal_char *data_buff)
+{
+    kal_char    test_data_path[512];
+    kal_char   *pos; 
+    FILE       *file;
+
+    getcwd(test_data_path, sizeof(test_data_path));
+    pos = strstr(test_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s%c", MCF_UT_DB_FOLDER_PATH, filename, '\0');
+    file = fopen(test_data_path, "w");
+
+    if(file != NULL)
+    {
+		fwrite(data_buff,1,strlen(data_buff),file);
+        fclose(file);
+    } else {
+        return KAL_FALSE;
+    }
+
+    return KAL_TRUE;
+}
+static kal_bool mcf_utfwk_dsbp_callback(sbp_reconfig_custom_param_struct *param_ptr)
+{
+    mcf_ota_result_e mcf_ota_result = MCF_OTA_R_SUCCESS;
+    mcf_tlvota_sbp_tag_t ota_sbp_tag;
+  
+    ota_sbp_tag.sbp_id = param_ptr->sbp_id;
+    memcpy(&(ota_sbp_tag.mcc), param_ptr->mcc, MAX_MCC_STR_LEN);
+    memcpy(&(ota_sbp_tag.mnc), param_ptr->mnc, MAX_MNC_STR_LEN);
+    mcf_ota_result = mcf_read_tlvota_buffer_sbp_tag(param_ptr->ps_id, ota_sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8*)&mcf_utfwk_lid_buffer, sizeof(mcf_utfwk_lid_buffer));
+    
+    return KAL_TRUE;
+}
+#endif
+
+kal_bool mcf_check_dsbp_mode(kal_bool is_ignore_dsbp, sim_interface_enum sim_id)
+{
+    nvram_ef_mcf_internal_info_struct nv_int_info;
+    kal_bool                    ret = KAL_TRUE;
+
+    /* Read MCF SW information in NVRAM */
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+        printf("%s():%d: Fail to read LID(%d)\n", __FUNCTION__, __LINE__, NVRAM_EF_MCF_INTERNAL_INFO_LID);
+        ret = KAL_FALSE;
+
+        return ret;
+    }
+
+    if (nv_int_info.tlvota_is_ignore_dsbp[sim_id] != is_ignore_dsbp) {
+        ret = KAL_FALSE;
+
+        return ret;
+    }
+
+    return ret;
+}
+
+kal_bool mcf_ut_check_file_path(
+    l4c_mcf_set_config_req_struct *req,
+    kal_bool is_null_ota_path,
+    kal_bool is_null_tlvota_path,
+    kal_bool is_dsbp_active_mode)
+{
+    mcf_t      *pMcf = mcf_get_instance();
+    kal_bool    ret = KAL_TRUE;
+    kal_uint8   sim_id = req->ps_id;
+
+    switch (req->op)
+    {
+        case L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH:
+        {
+            nvram_ef_mcf_ota_file_info_struct       nv_ota_file;
+            nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+
+            ret = mcf_check_dsbp_mode(KAL_FALSE, sim_id);
+            if ( (ret != KAL_TRUE) || (pMcf->is_ignore_dsbp[sim_id] != KAL_FALSE) ) {
+                printf("%s():%d: MCF DSBP mode is incorrect!! is_ignore_dsbp(%d)\n", __FUNCTION__, __LINE__, pMcf->is_ignore_dsbp[sim_id]);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+
+            /* OTA */
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                printf("%s():%d: Fail to read LID(%d)\n", __FUNCTION__, __LINE__, NVRAM_EF_MCF_OTA_FILE_LID);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+            if (is_null_ota_path == KAL_FALSE) {
+                if ( (strncmp(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                     || (strncmp(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ){
+                    ret = KAL_FALSE;
+                }
+            } else {
+                if ( (strcmp(nv_ota_file.path, "") != 0) || (strcmp(nv_ota_file.name, "") != 0) ) {
+                    ret = KAL_FALSE;
+                }
+            }
+
+            /* TLV-OTA */
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+                printf("%s():%d: Fail to read LID(%d)\n", __FUNCTION__, __LINE__, NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+            if (is_null_tlvota_path == KAL_FALSE) {
+                if ( (strncmp(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                     || (strncmp(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ){
+                    ret = KAL_FALSE;
+                }
+            } else {
+                if ( (strcmp(nv_tlvota_file.path, "") != 0) || (strcmp(nv_tlvota_file.name, "") != 0) ) {
+                    ret = KAL_FALSE;
+                }
+            }
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_OTA_FILE_PATH:
+        {
+            nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+
+            ret = mcf_check_dsbp_mode(KAL_FALSE, sim_id);
+            if ( (ret != KAL_TRUE) || (pMcf->is_ignore_dsbp[sim_id] != KAL_FALSE) ) {
+                printf("%s():%d: MCF DSBP mode is incorrect!! is_ignore_dsbp(%d)\n", __FUNCTION__, __LINE__, pMcf->is_ignore_dsbp[sim_id]);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                printf("%s():%d: Fail to read LID(%d)\n", __FUNCTION__, __LINE__, NVRAM_EF_MCF_OTA_FILE_LID);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+
+            if (is_null_ota_path == KAL_FALSE) {
+                if ( (strncmp(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                     || (strncmp(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ){
+                    ret = KAL_FALSE;
+                }
+            } else {
+                if ( (strcmp(nv_ota_file.path, "") != 0) || (strcmp(nv_ota_file.name, "") != 0) ) {
+                    ret = KAL_FALSE;
+                }
+            }
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH:
+        {
+            nvram_ef_mcf_tlvota_file_info_struct   nv_tlvota_file;
+
+            ret = mcf_check_dsbp_mode(KAL_FALSE, sim_id);
+            if ( (ret != KAL_TRUE) || (pMcf->is_ignore_dsbp[sim_id] != KAL_FALSE) ) {
+                printf("%s():%d: MCF DSBP mode is incorrect!! is_ignore_dsbp(%d)\n", __FUNCTION__, __LINE__, pMcf->is_ignore_dsbp[sim_id]);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+                printf("%s():%d: Fail to read LID(%d)\n", __FUNCTION__, __LINE__, NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+
+            if (is_null_tlvota_path == KAL_FALSE) {
+                if ( (strncmp(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                     || (strncmp(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ){
+                    ret = KAL_FALSE;
+                }
+            } else {
+                if ( (strcmp(nv_tlvota_file.path, "") != 0) || (strcmp(nv_tlvota_file.name, "") != 0) ) {
+                    ret = KAL_FALSE;
+                }
+            }
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
+        {
+            ret = mcf_check_dsbp_mode(KAL_TRUE, sim_id);
+            if ( (ret != KAL_TRUE) || (pMcf->is_ignore_dsbp[sim_id] != KAL_TRUE) ) {
+                printf("%s():%d: MCF DSBP mode is incorrect!! is_ignore_dsbp(%d)\n", __FUNCTION__, __LINE__, pMcf->is_ignore_dsbp[sim_id]);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+
+            switch (req->config_type)
+            {
+                case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+                {
+                    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+
+                    if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                        printf("%s():%d: Fail to read LID(%d)\n", __FUNCTION__, __LINE__, NVRAM_EF_MCF_OTA_FILE_LID);
+                        ret = KAL_FALSE;
+
+                        return ret;
+                    }
+
+                    if (is_null_ota_path == KAL_FALSE) {
+                        if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+                            if ( (strncmp(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                                 || (strncmp(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ) {
+                                ret = KAL_FALSE;
+                            }
+                        } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+                            if ( (strncmp(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                                 || (strncmp(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ) {
+                                ret = KAL_FALSE;
+                            }
+                        }
+                    } else {
+                        if ( (strncmp(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                             || (strncmp(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ){
+                            ret = KAL_FALSE;
+                        }
+                    }
+                    break;
+                }
+
+                case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+                {
+                    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+
+                    if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+                        printf("%s():%d: Fail to read LID(%d)\n", __FUNCTION__, __LINE__, NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                        ret = KAL_FALSE;
+
+                        return ret;
+                    }
+
+                    if (is_null_tlvota_path == KAL_FALSE) {
+                        if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+                            if ( (strncmp(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                                 || (strncmp(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ){
+                                ret = KAL_FALSE;
+                            }
+                        } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+                            if ( (strncmp(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)
+                                 || (strncmp(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN) != 0) ) {
+                                ret = KAL_FALSE;
+                            }
+                        }
+                    } else {
+                        if ( (strcmp(nv_tlvota_file.path, "") != 0) || (strcmp(nv_tlvota_file.name, "") != 0) ) {
+                            ret = KAL_FALSE;
+                        }
+                    }
+                    break;
+                }
+
+                default:
+                    printf("%s():%d: Invalid config type(%d)\n", __FUNCTION__, __LINE__, req->config_type);
+                    ret = KAL_FALSE;
+                    break;
+            }
+
+            break;
+        }
+
+        default:
+            ret = KAL_FALSE;
+            break;
+    }
+
+    return ret;
+}
+
+kal_bool mcf_check_test_lid_value(kal_uint8 *target_buff)
+{
+    kal_bool    ret = KAL_TRUE;
+    kal_uint8  *lid_buffer;
+
+    if (target_buff) {
+        if ( kal_mem_cmp(target_buff, &mcf_ut_test_lid_value_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+            ret = KAL_FALSE;
+        }
+    } else {
+        /*
+         *  NVRAM_EF_MCF_TEST_OTA_LID record 1
+         */
+        lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+        if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+            ret = KAL_FALSE;
+        }
+
+        if ( kal_mem_cmp(lid_buffer, &mcf_ut_test_lid_value_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+            ret = KAL_FALSE;
+        }
+        free_ctrl_buffer_set_null(lid_buffer);
+        
+        if (ret == KAL_FALSE) {
+            return ret;
+        }
+
+        /*
+         *  NVRAM_EF_MCF_TEST_OTA_LID record 2
+         */
+        lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+        if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 2, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+            ret = KAL_FALSE;
+        }
+
+        if ( kal_mem_cmp(lid_buffer, &mcf_ut_test_lid_value_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+            ret = KAL_FALSE;
+        }
+        free_ctrl_buffer_set_null(lid_buffer);
+
+        if (ret == KAL_FALSE) {
+            return ret;
+        }
+    }
+
+
+    return ret;
+}
+
+/*------------------------------------------------------------------------------
+ * Test case functions.
+ *----------------------------------------------------------------------------*/
+kal_bool mcf_ut_mcf_set_file_path_dsbp_passive_mode(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    l4c_mcf_set_config_req_struct  *req;
+    kal_uint8                       i;
+    mcf_ota_result_e                mcf_ret;
+    kal_bool                        ret;
+
+    mcf_ut_init();
+
+    /*
+     * Set both OTA and TLV-OTA path positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH;
+        strcpy(req->config1, MCF_FS_DUMMY_AP_FILE_PATH);
+        strcpy(req->config2, MCF_FS_DEFAULT_OTA_FILE_NAME);
+        strcpy(req->config3, MCF_FS_DUMMY_AP_FILE_PATH);
+        strcpy(req->config4, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+        req->ps_id = i;
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set both OTA/TLV-OTA file paths positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+
+        ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_FALSE, KAL_FALSE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set both OTA/TLV-OTA file paths positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set both OTA and TLV-OTA path positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH;
+        strcpy(req->config1, MCF_FS_DUMMY_AP_FILE_PATH);
+        strcpy(req->config2, MCF_FS_DEFAULT_OTA_FILE_NAME);
+        strcpy(req->config3, "");
+        strcpy(req->config4, "");
+        req->ps_id = i;
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set one of OTA/TLV-OTA file path positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+
+        ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_TRUE, KAL_FALSE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set one of OTA/TLV-OTA file path positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set both OTA and TLV-OTA path negative test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH;
+        strcpy(req->config1, MCF_FS_DUMMY_AP_FILE_PATH);
+        strcpy(req->config2, MCF_FS_DEFAULT_OTA_FILE_NAME);
+        strcpy(req->config3, "");
+        strcpy(req->config4, "");
+        req->ps_id = i;
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set one of OTA/TLV-OTA file path negative test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+
+        ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_FALSE, KAL_FALSE);
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check set one of OTA/TLV-OTA file path negative test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set OTA path positive test
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_OTA_FILE_PATH;
+    strcpy(req->config1, MCF_FS_DUMMY_AP_FILE_PATH);
+    strcpy(req->config2, MCF_FS_DEFAULT_OTA_FILE_NAME);
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Set OTA file path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_TRUE, KAL_FALSE);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check set OTA file path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Delete OTA path positive test
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_OTA_FILE_PATH;
+    strcpy(req->config1, "");
+    strcpy(req->config2, "");
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Delete OTA file path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_FALSE);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check delete OTA file path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Set OTA path negative test
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_OTA_FILE_PATH;
+    strcpy(req->config1, MCF_FS_DUMMY_AP_FILE_PATH);
+    strcpy(req->config2, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Set OTA file path negative test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_TRUE, KAL_FALSE);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check set OTA file path negative test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Set TLV-OTA path positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH;
+        strcpy(req->config1, MCF_FS_DUMMY_AP_FILE_PATH);
+        strcpy(req->config2, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+        req->ps_id = i;
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_FALSE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Delete TLV-OTA path positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH;
+        strcpy(req->config1, "");
+        strcpy(req->config2, "");
+        req->ps_id = i;
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Delete TLV-OTA file path positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+
+        ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_TRUE, KAL_FALSE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check delete TLV-OTA file path positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set TLV-OTA path negative test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH;
+        strcpy(req->config1, MCF_FS_DUMMY_AP_FILE_PATH);
+        strcpy(req->config2, MCF_FS_DEFAULT_OTA_FILE_NAME);
+        req->ps_id = i;
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path negative test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+
+        ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_FALSE, KAL_FALSE);
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path negative test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_mcf_set_file_path_dsbp_active_mode(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                          *pMcf = mcf_get_instance();
+    mcf_ota_file_t                 *ota_file;
+    mcf_tlvota_file_t              *tlvota_file;
+    mcf_tool_file_info_t           *pFile;
+    l4c_mcf_set_config_req_struct  *req;
+	sim_interface_enum              sim_id;
+    kal_uint8                       i;
+    mcf_ota_result_e                mcf_ret;
+    kal_bool                        ret;
+
+    mcf_ut_init();
+
+    ota_file = &(pMcf->ota_file);
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+        pFile->file_version = 2;
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("set file path FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }else {
+            mcf_ut_format_err_str("set file path FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     * Set OTA path in default path positive test
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+    req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+    req->path_type = L4C_MCF_PATH_TYPE_OTA;
+    strcpy(req->config1, MCF_FS_DEFAULT_OTA_FILE_NAME);
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Set OTA file path in default path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_TRUE, KAL_TRUE);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check set OTA file path in default path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+	
+	/*
+     * Set OTA path in default path with NULL file name positive test
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+    req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+    req->path_type = L4C_MCF_PATH_TYPE_OTA;
+    strcpy(req->config1, "");
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Set OTA file path in default path with NULL file name positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_TRUE, KAL_TRUE);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check set OTA file path in default path with NULL file name positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Set OTA path in runtime path positive test
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+    req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+    req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+    strcpy(req->config1, MCF_FS_DEFAULT_OTA_FILE_NAME);
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Set OTA file path in runtime path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    ret = mcf_ut_check_file_path(req, KAL_FALSE, KAL_TRUE, KAL_TRUE);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check set OTA file path in runtime path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Set OTA path in default path with NULL file name positive test
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+    req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+    req->path_type = L4C_MCF_PATH_TYPE_OTA;
+    strcpy(req->config1, "");
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Set OTA file path in default path with NULL file name positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_TRUE, KAL_TRUE);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check set OTA file path in default path with NULL file name positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Set OTA path in runtime path with NULL file name positive test
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+    req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+    req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+    strcpy(req->config1, "");
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Set OTA file path in runtime path with NULL file name positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_TRUE, KAL_TRUE);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check set OTA file path in runtime path with NULL file name positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Set TLV-OTA path in default path positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_OTA;
+        strcpy(req->config1, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            req->ps_id = i;
+			sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+		
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set TLV-OTA path in default path with NULL file name (deactivate OTA by OP) positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_OTA;
+        strcpy(req->config1, "");
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            req->ps_id = i;
+			sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path with NULL file name (deactivate OTA by OP) positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+		
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_TRUE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path with NULL file name (deactivate OTA by OP) positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set TLV-OTA path in runtime path positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+        strcpy(req->config1, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            req->ps_id = i;
+			sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in runtime path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+		
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+
+		
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in runtime path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set TLV-OTA path in runtime path with NULL file name (deactivate OTA by OP) positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+        strcpy(req->config1, "");
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            req->ps_id = i;
+			sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in runtime path with NULL file name (deactivate OTA by OP) positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+		
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_TRUE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in runtime path with NULL file name (deactivate OTA by OP) positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set TLV-OTA path in default path positive test - file is not changed
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_OTA;
+        strcpy(req->config1, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+        req->ps_id = i;
+		sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+
+        // First send file path
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+		
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+
+        // Send same file path
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_FILE_NOT_CHANGE) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+		
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set TLV-OTA path in runtime path positive test - file is not changed
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+        strcpy(req->config1, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+        req->ps_id = i;
+		sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+
+        // First send file path
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+		
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+
+        // Send same file path
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_FILE_NOT_CHANGE) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+		
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set TLV-OTA path in default path positive test - set file path after deactivated
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_OTA;
+        strcpy(req->config1, "");
+        req->ps_id = i;
+		sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+
+        // First send file path
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+		
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_TRUE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+
+        // Send same file path
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile->file_version = 2;
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        strcpy(req->config1, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+		
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set TLV-OTA path in runtime path positive test - set file path after deactivated
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pFile->file_version = 2;
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+        strcpy(req->config1, "");
+        req->ps_id = i;
+		sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+
+        // First send file path
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+		
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_TRUE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+
+        // Send same file path
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile->file_version = 2;
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Set TLV-OTA path fail! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        strcpy(req->config1, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+		
+		/* Assume DSBP success */
+        pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+        kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+
+        ret = mcf_ut_check_file_path(req, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check set TLV-OTA file path in default path positive test FAIL\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+    /*
+     * Set OTA path in default path negative test - invalid config type
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+    req->config_type = L4C_MCF_CONFIG_TYPE_MAX;
+    req->path_type = L4C_MCF_PATH_TYPE_OTA;
+    strcpy(req->config1, MCF_FS_DEFAULT_OTA_FILE_NAME);
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Check set OTA path in default path negative test (invalid config type) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Set OTA path negative test - invalid path type
+     */
+    req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+    req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+    req->path_type = L4C_MCF_PATH_TYPE_MAX;
+    strcpy(req->config1, MCF_FS_DEFAULT_OTA_FILE_NAME);
+
+    mcf_ret = mcf_set_file_path(req);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Check set OTA path negative test (invalid path type) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+
+    /*
+     * Set TLV-OTA path negative test - invalid path type
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->path_type = L4C_MCF_PATH_TYPE_MAX;
+        strcpy(req->config1, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+        req->ps_id = i;
+
+        mcf_ret = mcf_set_file_path(req);
+        if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+            mcf_ut_format_err_str("Set TLV-OTA file path in runtime path with NULL file name (deactivate OTA by OP) positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_mcf_get_applied_file_path(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                          *pMcf = mcf_get_instance();
+    l4c_mcf_get_config_req_struct  *req;
+    l4c_mcf_get_config_cnf_struct  *resp;
+    sim_interface_enum              sim_id;
+    kal_uint8                       i;
+    mcf_ota_result_e                mcf_ret;
+
+    mcf_ut_init();
+
+    pMcf->ota_file.path_type = L4C_MCF_PATH_TYPE_OTA;
+    strcpy(pMcf->ota_file.relative_path_name, MCF_FS_DEFAULT_OTA_FILE_NAME);
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        pMcf->tlvota_file[i].path_type = L4C_MCF_PATH_TYPE_OTA;
+        strcpy(pMcf->tlvota_file[i].relative_path_name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME);
+    }
+
+    /*
+     * Get applied OTA file path positive test
+     */
+    req = (l4c_mcf_get_config_req_struct *)construct_local_para(sizeof(l4c_mcf_get_config_req_struct), TD_RESET);
+    resp = (l4c_mcf_get_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_get_config_cnf_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH;
+    req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+
+    mcf_ret = mcf_get_applied_file_path(req, resp);
+    if ( (mcf_ret != MCF_OTA_R_SUCCESS) || (resp->config_type != req->config_type)
+         || (resp->path_type != pMcf->ota_file.path_type)
+         || (strcmp(resp->config1, pMcf->ota_file.relative_path_name) != 0) ) {
+        mcf_ut_format_err_str("Get applied OTA file path positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)resp);
+
+    /*
+     * Get applied TLV-OTA file path positive test
+     */
+    for(i = 0; i < MAX_SIM_NUM; i++) {
+        req = (l4c_mcf_get_config_req_struct *)construct_local_para(sizeof(l4c_mcf_get_config_req_struct), TD_RESET);
+        resp = (l4c_mcf_get_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_get_config_cnf_struct), TD_RESET);
+        req->op = L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH;
+        req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        req->ps_id = i;
+        sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+
+        mcf_ret = mcf_get_applied_file_path(req, resp);
+        if ( (mcf_ret != MCF_OTA_R_SUCCESS) || (resp->config_type != req->config_type)
+             || (resp->path_type != pMcf->tlvota_file[sim_id].path_type)
+             || (strcmp(resp->config1, pMcf->tlvota_file[sim_id].relative_path_name) != 0) ) {
+            mcf_ut_format_err_str("Get applied TLV-OTA file path positive test FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+        free_local_para((local_para_struct *)req);
+        free_local_para((local_para_struct *)resp);
+    }
+
+    /*
+     * Get applied file path negative test - invalid config type
+     */
+    req = (l4c_mcf_get_config_req_struct *)construct_local_para(sizeof(l4c_mcf_get_config_req_struct), TD_RESET);
+    resp = (l4c_mcf_get_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_get_config_cnf_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH;
+    req->config_type = L4C_MCF_CONFIG_TYPE_MAX;
+
+    mcf_ret = mcf_get_applied_file_path(req, resp);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Get applied OTA file path negative test (invalid config type) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)resp);
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_do_ota_full(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    mcf_tool_file_info_t               *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    kal_uint8                          *lid_buffer;
+    nvram_ef_mcf_test_struct            empty_buffer = {0};
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+    kal_uint32                          i;
+
+    mcf_ut_init();
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - Both SW verno of file and MD mismatch
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (Both SW verno of file and MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - SW verno of file mismatch
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /* Reset updated file information in NVRAM */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno of file mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - SW verno of MD mismatch
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /* Reset updated MD SW version in NVRAM */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno of MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - SW verno match
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    mcf_ret = mcf_do_ota_full();
+    if ( (mcf_ret != MCF_OTA_R_SUCCESS) || ((com_Mcf.boot_trace_flag & MCF_BOOT_TRACE_F_NO_NEED) == 0) ) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+        printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        ret = KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno match) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /*
+     *  Do full OTA negative test - invlaid file type
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        strncpy(pFile->file_type, "MCF", 8);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if ( (mcf_ret != MCF_OTA_R_INVALID_FILE) || ((com_Mcf.boot_trace_flag & MCF_BOOT_TRACE_F_INVALID_FILE) == 0) ) {
+        mcf_ut_format_err_str("full OTA: invalid file type case FAIL!! ret(%d), boot_flag(%x) \r\n", mcf_ret, com_Mcf.boot_trace_flag);
+        return KAL_FALSE;
+    }
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+        printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        ret = KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno match) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /*
+     *  Do full OTA positive test - item with mismatched verno in file
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_mismatched_verno.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_mismatched_verno.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (item with mismatched verno in file) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - File with checksum
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_checksum_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_checksum_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (File with checksum) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - File with checksum and encryption
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_checksum_and_encryption_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_checksum_and_encryption_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (File with checksum) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_do_ota_by_lid(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_ota_file_item_t           *pItem;
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    kal_uint8                          *lid_buffer;
+    kal_uint32                          i;
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    nvram_ltable_entry_struct           lid_info;
+    nvram_errno_enum                    nvram_api_ret;
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+
+    mcf_ut_init();
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + sizeof(mcf_tool_file_info_t));
+
+    /*
+     *  Do OTA by LID positive test
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        mcf_ut_format_err_str("Fail to get LID information!! lid(%d), nvram_ret(%d)\r\n", NVRAM_EF_MCF_TEST_OTA_LID, nvram_api_ret);
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_by_lid(NVRAM_EF_MCF_TEST_OTA_LID, 1, NVRAM_EF_MCF_TEST_OTA_TOTAL, &lid_info);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do OTA by LID negative test - invalid OTA attribute
+     */
+    lid_info.attr &= ~NVRAM_ATTR_MCF_OTA;
+    mcf_ret = mcf_do_ota_by_lid(NVRAM_EF_MCF_TEST_OTA_LID, 1, NVRAM_EF_MCF_TEST_OTA_TOTAL, &lid_info);
+    if (mcf_ret != MCF_OTA_R_INVALID_ATTR) {
+        mcf_ut_format_err_str("OTA by LID: invalid OTA attribute case FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do OTA by LID negative test - invlaid file type
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        strncpy(pFile->file_type, "MCF", 8);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_by_lid(NVRAM_EF_MCF_TEST_OTA_LID, 1, NVRAM_EF_MCF_TEST_OTA_TOTAL, &lid_info);
+    if (mcf_ret != MCF_OTA_R_INVALID_FILE) {
+        mcf_ut_format_err_str("OTA by LID: invlaid file type case FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do OTA by LID positive test - item with mismatched verno in file
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        mcf_ut_format_err_str("Fail to get LID information!! lid(%d), nvram_ret(%d)", NVRAM_EF_MCF_TEST_OTA_LID, nvram_api_ret);
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_mismatched_verno.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_mismatched_verno.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_by_lid(NVRAM_EF_MCF_TEST_OTA_LID, 1, NVRAM_EF_MCF_TEST_OTA_TOTAL, &lid_info);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do OTA by LID positive test (item with mismatched verno in file) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_read_ota_buffer(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_ota_file_item_t           *pItem;
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    nvram_ef_mcf_test_struct            test_lid_buffer;
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+
+    mcf_ut_init();
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + sizeof(mcf_tool_file_info_t));
+
+    /*
+     *  Read OTA LID positive test
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    // Record index 1
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    // Record index 2
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 2, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read OTA by LID positive test - item with mismatched verno in file
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_mismatched_verno.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_mismatched_verno.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read OTA by LID positive test (item with mismatched verno in file) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_read_tlvota_buffer(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                                  *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tool_tlvota_file_item_t            *pItem;
+    mcf_tlvota_file_t                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+    nvram_ef_mcf_test_struct                test_lid_buffer;
+    nvram_ef_mcf_test_struct                empty_buffer = {0};
+    mcf_tlvota_tag_t                        tlvota_tag;
+    kal_char                                tag[16];
+    mcf_ota_result_e                        mcf_ret;
+    kal_bool                                ret;
+
+    mcf_ut_init();
+
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & tag positive test - fully matched tag
+     */
+    tlvota_file = &(pMcf->general_tlvota_file);
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+        ret = mcf_ut_open_test_data("MCF_TLVOTA_ICCID_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_ICCID_ut_normal.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(&tlvota_tag, 0, sizeof(mcf_tlvota_tag_t));
+    tlvota_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+    strcpy(tag, SBP_PARTIAL_TAG);
+    tlvota_tag.tag_len = strlen(tag);
+    tlvota_tag.tag = tag;
+
+    mcf_ret = mcf_read_tlvota_buffer(0, tlvota_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag positive test (fully matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches tag (12_NA_NA_TEST)
+     */
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(&tlvota_tag, 0, sizeof(mcf_tlvota_tag_t));
+    tlvota_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+    strcpy(tag, "12_NA_NA_TEST");
+    tlvota_tag.tag_len = strlen(tag);
+    tlvota_tag.tag = tag;
+
+    mcf_ret = mcf_read_tlvota_buffer(0, tlvota_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag positive test (partially matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & tag positive test - no matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches tag (12_NA)
+     */
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(&tlvota_tag, 0, sizeof(mcf_tlvota_tag_t));
+    tlvota_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+    strcpy(tag, "12_NA");
+    tlvota_tag.tag_len = strlen(tag);
+    tlvota_tag.tag = tag;
+
+    mcf_ret = mcf_read_tlvota_buffer(0, tlvota_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag positive test (no matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & tag positive test - item with mismatched verno in file
+     */
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(&tlvota_tag, 0, sizeof(mcf_tlvota_tag_t));
+    tlvota_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+    strcpy(tag, SBP_PARTIAL_TAG);
+    tlvota_tag.tag_len = strlen(tag);
+    tlvota_tag.tag = tag;
+
+    tlvota_file = &(pMcf->general_tlvota_file);
+    pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        ret = mcf_ut_open_test_data("MCF_TLVOTA_ICCID_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_ICCID_ut_normal.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_read_tlvota_buffer(0, tlvota_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag negative test (item with mismatched verno in file) FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag positive test (fully matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_read_tlvota_buffer_sbp(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                                  *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tool_tlvota_file_item_t            *pItem;
+    mcf_tlvota_file_t                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+    nvram_ef_mcf_test_struct                test_lid_buffer;
+    nvram_ef_mcf_test_struct                empty_buffer = {0};
+    mcf_tlvota_sbp_tag_t                    sbp_tag;
+    kal_uint8                               i;
+    mcf_ota_result_e                        mcf_ret;
+    kal_bool                                ret;
+
+    mcf_ut_init();
+
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches SBP_FULL_TAG (12_33_21)
+     */
+    /* Fill TLV-OTA file into buffer */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (NA_NA_NA), but user searches SBP_FULL_TAG (12_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_NA_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_NA_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - fully matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_FULL_TAG (12_33_21), and user searches SBP_FULL_TAG (12_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (fully matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - no matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_FULL_TAG (12_33_21), and user searches SBP_FULL_TAG (12_33_NA)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, "", MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - no matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG_NO_SBPID (NA_33_21), and user searches SBP_FULL_TAG (12_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_no_sbpid_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_no_sbpid_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - no matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_FULL_TAG (12_33_21), and user searches SBP_FULL_TAG (12_NA_NA)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, "", MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, "", MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG_NO_SBPID (NA_33_21), and user searches SBP_PARTIAL_TAG_NO_SBPID (NA_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_no_sbpid_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_no_sbpid_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_ID_INVALID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MCC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - item with mismatched verno in file
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_mismatched_verno.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_mismatched_verno.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MCC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag negative test (item with mismatched verno in file) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_reset_lid_full(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    mcf_tool_file_info_t               *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    nvram_ef_mcf_test_struct            empty_buffer = {0};
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+    nvram_ef_mcf_test_struct            test_lid_buffer;
+    kal_uint8                           *lid_buffer;
+
+    mcf_ut_init();
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Reset all LID positive
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+        printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        ret = KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Reset LID record 1 FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    free_ctrl_buffer_set_null(lid_buffer);
+  
+    
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID New OTA apply FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    /*
+     *  Reset all LID negative
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    pFile->operation_mask |= MCF_FILE_OP_NOT_RESET_LID;
+    
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    pFile->operation_mask |= MCF_FILE_OP_NOT_RESET_LID;
+    
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID New OTA apply FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+  
+    
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID New OTA apply FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_gid_do_ota_full(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    mcf_tool_file_info_t               *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    kal_uint8                          *lid_buffer;
+    nvram_ef_mcf_test_struct            empty_buffer = {0};
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+    kal_uint32                          i;
+    nvram_ef_mcf_test_struct            nv_lid_buffer;
+
+    mcf_ut_init();
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - Both SW verno of file and MD mismatch
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (Both SW verno of file and MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - SW verno of file mismatch
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /* Reset updated file information in NVRAM */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno of file mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - SW verno of MD mismatch
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /* Reset updated MD SW version in NVRAM */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno of MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - SW verno match
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    mcf_ret = mcf_do_ota_full();
+    if ( (mcf_ret != MCF_OTA_R_SUCCESS) || ((com_Mcf.boot_trace_flag & MCF_BOOT_TRACE_F_NO_NEED) == 0) ) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+        printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        ret = KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno match) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    /*
+     *  Do full OTA negative test - invlaid file type
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        strncpy(pFile->file_type, "MCF", 8);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if ( (mcf_ret != MCF_OTA_R_INVALID_FILE) || ((com_Mcf.boot_trace_flag & MCF_BOOT_TRACE_F_INVALID_FILE) == 0) ) {
+        mcf_ut_format_err_str("full OTA: invalid file type case FAIL!! ret(%d), boot_flag(%x) \r\n", mcf_ret, com_Mcf.boot_trace_flag);
+        return KAL_FALSE;
+    }
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+        printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        ret = KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno match) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+    
+    /*
+     *  Do full OTA positive test - 3-Dimension array
+     */
+    
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    for(i = 0; i < NVRAM_EF_MCF_TEST_OTA_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+    
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_3d_array_and_bit_byte_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_3d_array_and_bit_byte_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, (kal_uint8 *)&nv_lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+        printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        ret = KAL_FALSE;
+    }
+    
+    if ( kal_mem_cmp((kal_uint8 *)&nv_lid_buffer, &mcf_ut_test_lid_value_new_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+        ret = KAL_FALSE;
+        printf("Do full OTA positive test (SW verno match) FAIL!!\r\n");
+    }
+    
+    
+    if (ret == KAL_FALSE) {
+        return ret;
+    }
+
+    /*
+     *  Do full OTA positive test - File with checksum
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_checksum_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_checksum_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (File with checksum) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do full OTA positive test - File with checksum and encryption
+     */
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_sw_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        printf("Fail to reset NVRAM_EF_MCF_SW_INFO_LID!!\r\n");
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_ota_file_info_struct));
+    kal_mem_set(lid_buffer, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    for(i = 0; i < NVRAM_EF_MCF_OTA_FILE_TOTAL; i++) {
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            printf("Fail to reset NVRAM_EF_MCF_OTA_FILE_LID!!\r\n");
+        }
+    }
+    free_ctrl_buffer_set_null(lid_buffer);
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_checksum_and_encryption_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_checksum_and_encryption_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (File with checksum) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_gid_do_ota_by_lid(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_gid_ota_file_item_t       *pItem;
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    nvram_ltable_entry_struct           lid_info;
+    nvram_errno_enum                    nvram_api_ret;
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+
+    mcf_ut_init();
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + sizeof(mcf_tool_file_info_t));
+
+    /*
+     *  Do OTA by LID positive test
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        mcf_ut_format_err_str("Fail to get LID information!! lid(%d), nvram_ret(%d)\r\n", NVRAM_EF_MCF_TEST_OTA_LID, nvram_api_ret);
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_by_lid(NVRAM_EF_MCF_TEST_OTA_LID, 1, NVRAM_EF_MCF_TEST_OTA_TOTAL, &lid_info);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do OTA by LID negative test - invalid OTA attribute
+     */
+    lid_info.attr &= ~NVRAM_ATTR_MCF_OTA;
+    mcf_ret = mcf_do_ota_by_lid(NVRAM_EF_MCF_TEST_OTA_LID, 1, NVRAM_EF_MCF_TEST_OTA_TOTAL, &lid_info);
+    if (mcf_ret != MCF_OTA_R_INVALID_ATTR) {
+        mcf_ut_format_err_str("OTA by LID: invalid OTA attribute case FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Do OTA by LID negative test - invlaid file type
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        strncpy(pFile->file_type, "MCF", 8);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_by_lid(NVRAM_EF_MCF_TEST_OTA_LID, 1, NVRAM_EF_MCF_TEST_OTA_TOTAL, &lid_info);
+    if (mcf_ret != MCF_OTA_R_INVALID_FILE) {
+        mcf_ut_format_err_str("OTA by LID: invlaid file type case FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_gid_read_ota_buffer(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_gid_ota_file_item_t       *pItem;
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    nvram_ef_mcf_test_struct            test_lid_buffer;
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+
+    mcf_ut_init();
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + sizeof(mcf_tool_file_info_t));
+
+    /*
+     *  Read OTA LID positive test
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    // Record index 1
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    // Record index 2
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 2, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_gid_read_tlvota_buffer(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                                  *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tool_gid_tlvota_file_item_t        *pItem;
+    mcf_tlvota_file_t                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+    nvram_ef_mcf_test_struct                test_lid_buffer;
+    nvram_ef_mcf_test_struct                empty_buffer = {0};
+    mcf_tlvota_tag_t                        tlvota_tag;
+    kal_char                                tag[16];
+    mcf_ota_result_e                        mcf_ret;
+    kal_bool                                ret;
+
+    mcf_ut_init();
+
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & tag positive test - fully matched tag
+     */
+    tlvota_file = &(pMcf->general_tlvota_file);
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+        ret = mcf_ut_open_test_data("MCF_TLVOTA_ICCID_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_ICCID_ut_gid_normal.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(&tlvota_tag, 0, sizeof(mcf_tlvota_tag_t));
+    tlvota_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+    strcpy(tag, SBP_PARTIAL_TAG);
+    tlvota_tag.tag_len = strlen(tag);
+    tlvota_tag.tag = tag;
+
+    mcf_ret = mcf_read_tlvota_buffer(0, tlvota_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag positive test (fully matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches tag (12_NA_NA_TEST)
+     */
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(&tlvota_tag, 0, sizeof(mcf_tlvota_tag_t));
+    tlvota_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+    strcpy(tag, "12_NA_NA_TEST");
+    tlvota_tag.tag_len = strlen(tag);
+    tlvota_tag.tag = tag;
+
+    mcf_ret = mcf_read_tlvota_buffer(0, tlvota_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag positive test (partially matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & tag positive test - no matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches tag (12_NA)
+     */
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(&tlvota_tag, 0, sizeof(mcf_tlvota_tag_t));
+    tlvota_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+    strcpy(tag, "12_NA");
+    tlvota_tag.tag_len = strlen(tag);
+    tlvota_tag.tag = tag;
+
+    mcf_ret = mcf_read_tlvota_buffer(0, tlvota_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag positive test (no matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & tag positive test - item with mismatched verno in file
+     */
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(&tlvota_tag, 0, sizeof(mcf_tlvota_tag_t));
+    tlvota_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+    strcpy(tag, SBP_PARTIAL_TAG);
+    tlvota_tag.tag_len = strlen(tag);
+    tlvota_tag.tag = tag;
+
+    tlvota_file = &(pMcf->general_tlvota_file);
+    pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        ret = mcf_ut_open_test_data("MCF_TLVOTA_ICCID_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_ICCID_ut_gid_normal.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_read_tlvota_buffer(0, tlvota_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag negative test (item with mismatched verno in file) FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & tag positive test (fully matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_gid_read_tlvota_buffer_sbp(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                                  *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tool_gid_tlvota_file_item_t        *pItem;
+    mcf_tlvota_file_t                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+    nvram_ef_mcf_test_struct                test_lid_buffer;
+    nvram_ef_mcf_test_struct                empty_buffer = {0};
+    mcf_tlvota_sbp_tag_t                    sbp_tag;
+    kal_uint8                               i;
+    mcf_ota_result_e                        mcf_ret;
+    kal_bool                                ret;
+
+    mcf_ut_init();
+
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches SBP_FULL_TAG (12_33_21)
+     */
+    /* Fill TLV-OTA file into buffer */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (NA_NA_NA), but user searches SBP_FULL_TAG (12_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_NA_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_NA_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - fully matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_FULL_TAG (12_33_21), and user searches SBP_FULL_TAG (12_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (fully matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - no matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_FULL_TAG (12_33_21), and user searches SBP_FULL_TAG (12_33_NA)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, "", MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - no matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG_NO_SBPID (NA_33_21), and user searches SBP_FULL_TAG (12_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_no_sbpid_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_no_sbpid_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - no matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_FULL_TAG (12_33_21), and user searches SBP_FULL_TAG (12_NA_NA)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, "", MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, "", MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG_NO_SBPID (NA_33_21), and user searches SBP_PARTIAL_TAG_NO_SBPID (NA_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_no_sbpid_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_no_sbpid_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_ID_INVALID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+    
+    /*
+     *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), and user searches SBP_PARTIAL_TAG (12_NA_NA)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_OPOTA_ut_gid_3d_array_bit_byte_SBP_partial.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OPOTA_ut_gid_3d_array_bit_byte_SBP_partial.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, "NA", MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, "NA", MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        if (kal_mem_cmp(&test_lid_buffer, &mcf_ut_test_lid_value_new_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (no matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+    
+    /*
+     *  General OPOTA INVALID_FILE / OPOTA SUCCESS
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), and user searches SBP_PARTIAL_TAG (12_NA_NA)
+     */
+    tlvota_file = &(pMcf->general_tlvota_file);
+    kal_mem_set(tlvota_file->buff, 0, MCF_MAX_TLVOTA_FILE_SIZE);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+             ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, "NA", MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, "NA", MAX_MNC_STR_LEN);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    /*
+     *  General OPOTA SUCCESS / OPOTA INVALID_FILE
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG_NO_SBPID (NA_33_21), and user searches SBP_FULL_TAG (NA_33_21)
+     */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        kal_mem_set(tlvota_file->buff, 0, MCF_MAX_TLVOTA_FILE_SIZE);
+    }
+    tlvota_file = &(pMcf->general_tlvota_file);
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_no_sbpid_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_no_sbpid_ut_gid_normal.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+    
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id =  SBP_ID_INVALID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_tlvota_buffer_sbp_tag(0, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_gid_reset_lid_full(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    mcf_tool_file_info_t               *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    nvram_ef_mcf_test_struct            empty_buffer = {0};
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+    nvram_ef_mcf_test_struct            test_lid_buffer;
+    kal_uint8                           *lid_buffer;
+
+    mcf_ut_init();
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Reset all LID positive
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+
+    lid_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+        printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        ret = KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Reset LID record 1 FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    free_ctrl_buffer_set_null(lid_buffer);
+  
+    
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID New OTA apply FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    /*
+     *  Reset all LID negative
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    pFile->operation_mask |= MCF_FILE_OP_NOT_RESET_LID;
+    
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    pFile->operation_mask |= MCF_FILE_OP_NOT_RESET_LID;
+    
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID New OTA apply FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+  
+    
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID New OTA apply FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+kal_bool mcf_ut_em_update_req_hdlr(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                      *pMcf = mcf_get_instance();
+    l4cps_em_update_req_struct  req;
+    kal_bool                    ret;
+
+    mcf_ut_init();
+
+    /*
+     *  EM update request handler positive test - ON
+     */
+    com_Mcf.is_em_on = KAL_FALSE;
+    req.em_src = EM_FROM_ELT;
+    req.info_request[MCF_EM_OTA_FILE_INFO] = EM_ON;
+
+    ret = mcf_em_update_req_hdlr((local_para_struct *)&req);
+    if ( (ret != KAL_TRUE) && (com_Mcf.is_em_on != KAL_TRUE) ) {
+        mcf_ut_format_err_str("EM update request handler positive test (ON) FAIL!! \r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  EM update request handler positive test - OFF
+     */
+    com_Mcf.is_em_on = KAL_TRUE;
+    req.em_src = EM_FROM_ELT;
+    req.info_request[MCF_EM_OTA_FILE_INFO] = EM_OFF;
+
+    ret = mcf_em_update_req_hdlr((local_para_struct *)&req);
+    if ( (ret != KAL_TRUE) && (com_Mcf.is_em_on != KAL_FALSE) ) {
+        mcf_ut_format_err_str("EM update request handler positive test (OFF) FAIL!! \r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  EM update request handler positive test - No change
+     */
+    com_Mcf.is_em_on = KAL_TRUE;
+    req.em_src = EM_FROM_ELT;
+    req.info_request[MCF_EM_OTA_FILE_INFO] = EM_NC;
+
+    ret = mcf_em_update_req_hdlr((local_para_struct *)&req);
+    if ( (ret != KAL_TRUE) && (com_Mcf.is_em_on != KAL_TRUE) ) {
+        mcf_ut_format_err_str("EM update request handler positive test (No change) FAIL!! \r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  EM update request handler positive test - Invalid operation
+     */
+    com_Mcf.is_em_on = KAL_TRUE;
+    req.em_src = EM_FROM_ELT;
+    req.info_request[MCF_EM_OTA_FILE_INFO] = 0xFF;
+
+    ret = mcf_em_update_req_hdlr((local_para_struct *)&req);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("EM update request handler positive test (Invalid operation) FAIL!! \r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  EM update request handler positive test - Invalid EM source
+     */
+    com_Mcf.is_em_on = KAL_TRUE;
+    req.em_src = EM_FROM_RMMI;
+    req.info_request[MCF_EM_OTA_FILE_INFO] = EM_OFF;
+
+    ret = mcf_em_update_req_hdlr((local_para_struct *)&req);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("EM update request handler positive test (Invalid EM source) FAIL!! \r\n");
+        return KAL_FALSE;
+    }
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+#if defined(__MCF_FIND_TAG_SUPPORT__)
+kal_bool mcf_ut_find_tag(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_bool    ret;
+    kal_uint16  byte_offset, bit_offset;
+    kal_uint32  size;
+    mcf_tag_info_struct   unuse;
+    MCF_DB_STRUCT_VARIABLE    const *unuse_db_ptr = NULL;
+    kal_char     tag[64];
+
+    // INT
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_BYTE_11");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 0 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    // BIT
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_BIT_BYTE_11.B1");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 2 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_BIT_BYTE_11.B4");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 2 || bit_offset != 3 || size != 1)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_BIT_BYTE_12.F4B");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 3 || bit_offset != 0 || size != 4)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_BIT_BYTE_12.L4B");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 3 || bit_offset != 4 || size != 4)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_DOUBLE_1");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 24 || bit_offset != 0 || size != 8)
+        return KAL_FALSE;
+
+    // array
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_BUFFER_1");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 32 || bit_offset != 0 || size != 32)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_BUFFER_1[0]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 32 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_BUFFER_1[10]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 42 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    // struct
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_1.VBYTE1");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 64 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_1.VDOUBLE");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 88 || bit_offset != 0 || size != 8)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_1.VBUFFER");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 96 || bit_offset != 0 || size != 32)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_1.VBUFFER[31]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 127 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[0].VBUFFER[0]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 896 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3.VBUFFER[0]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 896 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[0].VBUFFER");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 896 || bit_offset != 0 || size != 32)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[3].VBUFFER[0]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 2000 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[3].VBUFFER[3]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 2003 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[0].ARRAY_D[0][0][0]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 928 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[0].ARRAY_D[4][3][2]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 987 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[3].ARRAY_D[0][0][0]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 2032 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[3].ARRAY_D[4][3][2]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 2091 || bit_offset != 0 || size != 1)
+        return KAL_FALSE;
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[3].ARRAY_D4[0][0][2]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 2100 || bit_offset != 0 || size != 4)
+        return KAL_FALSE;
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "VAL_STRUCT_3[3].ARRAY_D4[4][3][2]");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_TRUE || byte_offset != 2328 || bit_offset != 0 || size != 4)
+        return KAL_FALSE;
+	
+    // can not find tag
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "XXX");
+    ret = mcf_find_tag_offset(4098, tag, &byte_offset, &bit_offset, &size, &unuse_db_ptr, &unuse);
+    if(ret != KAL_FALSE)
+        return KAL_FALSE;
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+#if defined(__MCF_FIND_GID_SUPPORT__)
+kal_bool mcf_ut_find_gid(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	kal_bool ret = KAL_FALSE;
+	kal_uint16 lid_num;
+    kal_uint16 byte_offset;
+    kal_int16 bit_offset;
+    kal_uint32 size;
+    kal_bool is_bit;
+	
+	// val_byte_11
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 44, "", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 0 || bit_offset  != -1 || size !=1 || is_bit != KAL_FALSE) return KAL_FALSE;
+
+	// val_bit_2byte_3.F2b
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 1, "", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 2336 || bit_offset  != 8 || size != 2 || is_bit != KAL_TRUE) return KAL_FALSE;
+
+	// val_buffer_2[]
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 43, "0$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 464 || bit_offset  != -1 && size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 43, "1$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 465 || bit_offset  != -1 && size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 43, "31$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 495 || bit_offset  != -1 && size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+
+	//val_struct_3[x].array_d[x][x][x]
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 106, "0$0$0$0$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 928 || bit_offset  != -1 && size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 106, "0$4$3$2$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 987 || bit_offset  != -1 && size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 106, "2$0$0$0$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 1664 || bit_offset  != -1 && size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 106, "3$4$3$2$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 2091 || bit_offset  != -1 && size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+
+	// val_struct_3[x].vbit_byte1.b8
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 116, "2$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 1602 || bit_offset  != 7 || size != 1 || is_bit != KAL_TRUE) return KAL_FALSE;
+	// val_struct_3[x].vbit_byte2.F4b
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 118, "2$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 1603 || bit_offset  != 0 || size != 4 || is_bit != KAL_TRUE) return KAL_FALSE;
+	// val_struct_3[x].vbit_byte2.L4b
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 119, "2$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 1603 || bit_offset  != 4 || size != 4 || is_bit != KAL_TRUE) return KAL_FALSE;
+	
+	// val_struct_1.vbuffer[]
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 74, "0$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 96 || bit_offset  != -1 || size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 74, "31$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 127 || bit_offset  != -1 || size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+	
+	// val_struct_1.array_d4[][][]
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 61, "0$0$0$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 188 || bit_offset  != -1 || size != 4 || is_bit != KAL_FALSE) return KAL_FALSE;
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 61, "4$3$2$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 424 || bit_offset  != -1 || size != 4 || is_bit != KAL_FALSE) return KAL_FALSE;
+
+	// val_struct_1.array_d[][][]
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 60, "0$0$0$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 128 || bit_offset  != -1 || size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+	ret = mcf_find_gid_offset(MCF_TEST_OTA_LID_BASE_GID + 60, "4$3$2$", &lid_num, &byte_offset, &bit_offset, &size, &is_bit);
+	if(ret!= KAL_TRUE || lid_num != 4098 || byte_offset != 187 || bit_offset  != -1 || size != 1 || is_bit != KAL_FALSE) return KAL_FALSE;
+
+	MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+
+kal_bool mcf_ut_mcf_encrypt_decrypt(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_char    password[] = "MTKTEST";
+    kal_bool    ret = KAL_FALSE;
+    kal_char    content[192] = {0}; 
+    kal_uint32  content_length = 0;
+    kal_char    test_data[] = "What does it take to change everything? Technology that¡¦s great, not expensive. Technology that helps people change the world on their own terms.";
+
+    
+    strcpy(content, test_data);
+    content_length = (strlen(test_data) + 0xF & ~0xF); // 16B alignment
+
+    // CASE1 : AES128 test
+    ret =  mcf_encrypt_128bit(password, content, content_length);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    ret =  mcf_decrypt_128bit(password, content, content_length);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+
+    if(strcmp(content, test_data) != 0) return KAL_FALSE;
+    
+    // CASE2 : AES256 test
+    ret =  mcf_encrypt_256bit(password, content, content_length);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    ret =  mcf_decrypt_256bit(password, content, content_length);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+
+    if(strcmp(content, test_data) != 0) return KAL_FALSE;
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_find_ini_item(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t              *pMcf = mcf_get_instance();
+    mcf_ini_file_t     *ini_file;
+    kal_bool            ret;
+	kal_char            value[64];
+    kal_char            tag[64];
+
+    mcf_ut_init();
+    
+    ini_file = &(pMcf->ini_file);
+	
+	//kal_mem_set(&ini_file, 0, sizeof(mcf_ini_file_t));
+    /*
+     *  Read ini positive test
+     */
+    
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+
+    kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "AP_Monitor_Time");
+    
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"120") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        //return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "TagName");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"108_466_97,1_460_NA,1_460_02") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "AP_Monitor_Time");
+
+    if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"120") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Gen_Time");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"2018.1025.120000") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	   /*
+     *  Read ini positive test --- don't care uppercase
+     */
+    
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "GeN_TIme");
+    
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"2018.1025.120000") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "GEN_TIME");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"2018.1025.120000") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "gen_time");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"2018.1025.120000") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	   /*
+     *  Read ini positive test --- don't care space
+     */
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "g e n_ tim e");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"2018.1025.120000") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "gen _ time");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"2018.1025.120000") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "AP _Monitor_Time");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"120") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+
+    /*
+     *  Read ini negative test
+     */
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Critical");
+	
+    if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) == KAL_TRUE) {
+		mcf_ut_format_err_str("Read OTA by LID FAIL!!  \r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Config");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) == KAL_TRUE) {
+		mcf_ut_format_err_str("Read OTA by LID FAIL!!  \r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "GenTime");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) == KAL_TRUE) {
+		mcf_ut_format_err_str("Read OTA by LID FAIL!!  \r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Tag_Name");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) == KAL_TRUE) {
+		mcf_ut_format_err_str("Read OTA by LID FAIL!!  \r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "108");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) == KAL_TRUE) {
+		mcf_ut_format_err_str("Read OTA by LID FAIL!!  \r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "0000");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) == KAL_TRUE) {
+		mcf_ut_format_err_str("Read OTA by LID FAIL!!  \r\n");
+        return KAL_FALSE;
+	}
+
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_find_ini_sbp_id(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	kal_uint32                         sbp_id[200];
+	kal_uint16                         sbp_id_num = 0;
+	kal_uint16                         i = 0;
+	kal_uint32                         sbp_id_ans[5]={108,1};
+	kal_bool                           general = KAL_FALSE;
+    kal_char                           tag[64];
+
+    mcf_ut_init();
+	
+    /*
+     *  Read ini positive test
+     */
+    
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "108_466_97,1_460_NA,1_460_02");
+    if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	
+	
+	
+	for (i = 0; i < sbp_id_num; i++){
+		if (sbp_id[i] != sbp_id_ans[i]){
+			mcf_ut_format_err_str("Find ini file sbp id FAIL!! sbp id(%d) sbp id ans(%d) \r\n", sbp_id[i], sbp_id_ans[i]);
+			return KAL_FALSE;
+		}
+	}
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "108_466_97,1_460_NA,1_460_02,1_450_01,1_10_1");
+    if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+
+	
+	for (i = 0; i < sbp_id_num; i++){
+		if (sbp_id[i] != sbp_id_ans[i]){
+			mcf_ut_format_err_str("Find ini file sbp id FAIL!! sbp id(%d) sbp id ans(%d) \r\n", sbp_id[i], sbp_id_ans[i]);
+			return KAL_FALSE;
+		}
+	}
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "108_470_97,108_466_97,1_460_NA,1_460_02");
+	if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+
+	
+	for (i = 0; i < sbp_id_num; i++){
+		if (sbp_id[i] != sbp_id_ans[i]){
+			mcf_ut_format_err_str("Find ini file sbp id FAIL!! sbp id(%d) sbp id ans(%d) \r\n", sbp_id[i], sbp_id_ans[i]);
+			return KAL_FALSE;
+		}
+	}
+	
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "108_470_97,108_466_97,1_460_NA,1_460_02,");
+	if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+
+	
+	for (i = 0; i < sbp_id_num; i++){
+		if (sbp_id[i] != sbp_id_ans[i]){
+			mcf_ut_format_err_str("Find ini file sbp id FAIL!! sbp id(%d) sbp id ans(%d) \r\n", sbp_id[i], sbp_id_ans[i]);
+			return KAL_FALSE;
+		}
+	}
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "108_470_97,108_466_97,105_25_43,5_470_123,5_460_NA,1_460_NA,1_460_02");
+    if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	
+	sbp_id_ans[0]=108; sbp_id_ans[1]=105; sbp_id_ans[2]=5; sbp_id_ans[3]=1; 
+	
+	
+	for (i = 0; i < sbp_id_num; i++){
+		if (sbp_id[i] != sbp_id_ans[i]){
+			mcf_ut_format_err_str("Find ini file sbp id FAIL!! sbp id(%d) sbp id ans(%d) \r\n", sbp_id[i], sbp_id_ans[i]);
+			return KAL_FALSE;
+		}
+	}
+	
+	//NA case
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "NA_123_45,NA_02_53,108_470_97,108_466_97,1_460_NA,1_460_02,");
+	if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if (general != KAL_TRUE){
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! general(%d)  \r\n", general);
+		return KAL_FALSE;
+	}
+	
+	//ICCID case
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "123456,NA_02_53,108_470_97,108_466_97,1_460_NA,1_460_02,");
+	if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if (general != KAL_TRUE){
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! general(%d)  \r\n", general);
+		return KAL_FALSE;
+	}
+	
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "123456");
+	if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if (general != KAL_TRUE){
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! general(%d)  \r\n", general);
+		return KAL_FALSE;
+	}
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "108_460_32,123456");
+    if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if (general != KAL_TRUE){
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! general(%d)  \r\n", general);
+		return KAL_FALSE;
+	}
+	
+	kal_mem_set(tag, 0, 64);
+    strcpy(tag, "108_460_32");
+    if (mcf_find_ini_sbp_id(tag, sbp_id, &sbp_id_num, &general) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find ini file sbp id FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	for (i = 0; i < sbp_id_num; i++){
+		if (sbp_id[i] != sbp_id_ans[i]){
+			mcf_ut_format_err_str("Find ini file sbp id FAIL!! sbp id(%d) sbp id ans(%d) \r\n", sbp_id[i], sbp_id_ans[i]);
+			return KAL_FALSE;
+		}
+	}
+	
+	
+	
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_compose_ini_item(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_bool                            ret;
+	mcf_t                              *pMcf = mcf_get_instance();
+    mcf_ini_file_t                     *ini_file = &(pMcf->ini_file);
+	kal_char                           value[64];
+    kal_char                           test_data_path[512];
+    kal_char                           *pos; 
+    kal_char                           tag[64];
+    kal_char                           new_value[64];
+    kal_char                           old_value[64];
+	
+
+    mcf_ut_init();
+	
+
+    /*
+     *  Read ini positive test
+     */
+	kal_mem_set(ini_file->buff, 0, MCF_MAX_INI_FILE_SIZE);
+	kal_mem_set(ini_file->tmp_buff, 0, MCF_MAX_INI_FILE_SIZE);
+    ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG.ini", ini_file->buff, MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+
+	kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "AP_Monitor_Time");
+    strcpy(old_value, "120");
+    strcpy(new_value, "2");
+    
+    if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+    
+    /* Change write permission of ini file */
+    getcwd(test_data_path, sizeof(test_data_path));
+    pos = strstr(test_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s%c", MCF_UT_DB_FOLDER_PATH, "MTK_MD_OTA_CONFIG_WRITE.ini", '\0');
+    chmod(test_data_path, 0666);
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	
+	/* Read again */
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+    kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "TagName");
+    strcpy(old_value, "108_466_97,1_460_NA,1_460_02");
+    strcpy(new_value, "108_466_97,1_460_02");
+    
+	if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	
+	/* Read again */
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+    kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "AP_Monitor_Time");
+    strcpy(old_value, "2");
+    strcpy(new_value, "23000");
+    
+	if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	
+	/* Read again */
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+	kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "Gen_Time");
+    strcpy(old_value, "2018.1025.120000");
+    strcpy(new_value, "2018.1104.182054");
+    
+    if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	
+	/* Read again */
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+	/* New item */
+	
+    kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "Reboot_Mode");
+    strcpy(old_value, "");
+    strcpy(new_value, "1");
+    
+	if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	
+	/* Read again */
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+    kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "GenTime");
+    strcpy(old_value, "");
+    strcpy(new_value, "2018.1106.110355");
+    
+	if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	
+	/* Read again */
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+    kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "BatteryLife");
+    strcpy(old_value, "");
+    strcpy(new_value, "87%");
+    
+	if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+
+    kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "AP_Monitor_Time");
+    
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"23000") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "GenTime");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"2018.1106.110355") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "TagName");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"108_466_97,1_460_02") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Gen_Time");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"2018.1104.182054") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Reboot_Mode");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"1") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "BatteryLife");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"87%") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Battery Life");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"87%") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "BaTTery LIFE");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"87%") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	/* Read again */
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+    kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "Gen_Time");
+    strcpy(old_value, "2018.1104.182054");
+    strcpy(new_value, "");
+    
+	if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Gen_Time");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+    kal_mem_set(tag, 0, 64);
+    kal_mem_set(new_value, 0, 64);
+    kal_mem_set(old_value, 0, 64);
+    strcpy(tag, "Gen_Time");
+    strcpy(old_value, "");
+    strcpy(new_value, "125_25_67");
+    
+	if (mcf_compose_ini_item(ini_file->buff, ini_file->tmp_buff, tag, old_value, new_value) != KAL_TRUE) {
+		mcf_ut_format_err_str("Find compose_ini_item FAIL!! item(%s) value(%s) \r\n", tag, new_value);
+        return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_write_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", ini_file->tmp_buff);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG.ini");
+		return KAL_FALSE;
+	}
+	
+	ret = mcf_ut_open_test_data("MTK_MD_OTA_CONFIG_WRITE.ini", (kal_char *)(ini_file->buff), MCF_MAX_INI_FILE_SIZE);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_MD_OTA_CONFIG_WRITE.ini");
+		return KAL_FALSE;
+	}
+	
+	kal_mem_set(value, 0, 64);
+    
+    kal_mem_set(tag, 0, 64);
+    strcpy(tag, "Gen_Time");
+	
+	if (mcf_find_ini_item((kal_char *)ini_file->buff, tag, value, pMcf) != KAL_TRUE) {
+		mcf_ut_format_err_str("Read ini file FAIL!! item(%s) \r\n", tag);
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(value,"125_25_67") != 0){
+		mcf_ut_format_err_str("Read ini file positive test FAIL!!\r\n");
+        return KAL_FALSE;
+	}
+	
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_mcf_boot_trace(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	kal_uint32 d1 = 100, d2 = 200;
+	char string[] = "MCF TEST";
+	char string2[] = "MCF TEST2";
+	kal_uint32 i = 0;
+	
+	mcf_do_ota_full();
+	
+	MCF_BOOT_TRACE(MCF_BOOT_TRACE_TEST2);
+	MCF_BOOT_TRACE(MCF_BOOT_TRACE_TEST1, d1);
+	MCF_BOOT_TRACE(MCF_BOOT_TRACE_TEST3, string);
+	MCF_BOOT_TRACE(MCF_BOOT_TRACE_TEST4, d1, string);
+	MCF_BOOT_TRACE(MCF_BOOT_TRACE_TEST5, string, string2, d1);
+	
+	for(i = 0;i< 10000;i++)
+	{
+		MCF_BOOT_TRACE(MCF_BOOT_TRACE_TEST5, string, string2, d1);
+	}
+	
+	mcf_dump_boot_trace();
+	
+	MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_config_LID(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_bool                                                ret;
+    l4c_mcf_config_lid_variable_operation_req_struct       *req = NULL;
+    l4c_mcf_config_lid_variable_operation_cnf_struct       *cnf = NULL;
+    mcf_ota_result_e                                        mcf_ret = MCF_OTA_R_SUCCESS;
+    mcf_t                                                  *pMcf = mcf_get_instance();
+    mcf_ota_file_t                                         *ota_file = &(pMcf->ota_file);
+    mcf_tool_file_info_t                                   *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    nvram_ef_mcf_ota_file_info_struct                       nv_ota_file;
+    nvram_ef_mcf_sw_info_struct                             nv_sw_info;
+    mcf_tlvota_file_t                                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct                    nv_tlvota_file;
+    mcf_tlvota_sbp_tag_t                                    sbp_tag;
+    kal_uint8                                               i;
+    kal_uint8                                               test_pattern[512];
+
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Apply default OTA
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    
+    
+    /*
+     * Set OTA path in default path positive test
+     */
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_BYTE_11");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable FAIL!!(%s)\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, VAL_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_BIT_BYTE_11");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable FAIL!!(%s)\r\n", "VAL_BIT_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_bit_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_BIT_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, VAL_BIT_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_BIT_BYTE_11.B3");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_BIT_BYTE_11.B3");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "01", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_BIT_BYTE_11.B3, %s, %s\r\n", cnf->value, "01");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, VAL_BIT_BYTE_11.B3, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_byte_12");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_byte_12");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_bit_byte_12), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_byte_12, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_byte_12, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_byte_12.L4b");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_byte_12.L4b");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_byte_12.F4b, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_byte_12.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_short_11");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_short_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_short_11), cnf->len*2, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*4) != 0){
+        mcf_ut_format_err_str("Config LID, val_short_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_short_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->tag_name, "val_double_1");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_double_1");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_double_1), cnf->len*8, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*16) != 0){
+        mcf_ut_format_err_str("Config LID, val_double_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_double_1, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+	req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->tag_name, "val_buffer_1");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_buffer_1");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_buffer_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("Config LID, val_buffer_1, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_buffer_1");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_buffer_1");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_buffer_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 32){
+        mcf_ut_format_err_str("Config LID, val_buffer_1, %d, %d\r\n", cnf->len, 32);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->tag_name, "val_buffer_1[0]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_buffer_1[0]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_buffer_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_buffer_1, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->tag_name, "val_struct_1.vfloat");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_struct_1.vfloat");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_1.vfloat), cnf->len*4, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*8) != 0){
+        mcf_ut_format_err_str("Config LID, val_struct_1.vfloat, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_struct_1.vfloat, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->tag_name, "val_struct_3[0].vint");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_struct_3[0].vint");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_3[0].vint), cnf->len*4, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*8) != 0){
+        mcf_ut_format_err_str("Config LID, val_struct_3[0].vint, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_struct_3[0].vint, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+	req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_struct_3[0]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_3[0]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+	if(strncmp((kal_char *)(cnf->value), test_pattern, 510) != 0){
+         mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0], %s, %s\r\n", cnf->value, test_pattern);
+         return KAL_FALSE;
+     }
+    
+     if(cnf->len != 255){
+         mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0], %d, %d\r\n", cnf->len, 255);
+         return KAL_FALSE;
+     }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    
+
+
+    /* negative test */
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[3].VBUFFER[2][4][5]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[3].VBUFFER[2][4][5]");
+        return KAL_FALSE;
+    }
+
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /* Test TLV OTA */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_NA_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_NA_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    req->ps_id = 0;
+    strcpy(req->tag_name, "VAL_BYTE_11");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, VAL_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    
+    /* Test 3-d array */
+    
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Apply 3-d array default OTA
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_3d_array_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_3d_array_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D[4][3][2]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][3][2]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "06", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4][3][2], %s, %s\r\n", cnf->value, "06");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4][3][2], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 4;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4][3], %s, %s\r\n", cnf->value, "060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 3){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4][3], %d, %d\r\n", cnf->len, 3);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4][3], %s, %s\r\n", cnf->value, "060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 3){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4][3], %d, %d\r\n", cnf->len, 3);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D[4]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060606060606060606060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4], %s, %s\r\n", cnf->value, "060606060606060606060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 12){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4], %d, %d\r\n", cnf->len, 12);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D, %s, %s\r\n", cnf->value, "060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 60){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D, %d, %d\r\n", cnf->len, 60);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D[4][2]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][2]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4][2], %s, %s\r\n", cnf->value, "0606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[4][2], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 10;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D[3]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[3]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "06060606060606060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[3], %s, %s\r\n", cnf->value, "06060606060606060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 10){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D[3], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    
+    /* Different variable size */
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D4[4][3][2]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][3][2]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "06000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4][3][2], %s, %s\r\n", cnf->value, "06000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4][3][2], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D4[4][3]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][3]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060000000600000006000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4][3], %s, %s\r\n", cnf->value, "060000000600000006000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 3){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4][3], %d, %d\r\n", cnf->len, 3);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D4[4]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4], %s, %s\r\n", cnf->value, "060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 12){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4], %d, %d\r\n", cnf->len, 12);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D4[4]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0600000006000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4], %s, %s\r\n", cnf->value, "0600000006000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D4[4][2]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][2]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0600000006000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4], %s, %s\r\n", cnf->value, "0600000006000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4[4], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D4");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern, 0 , 512);
+    for (i = 0; i < cnf->len; i++){
+        kal_mem_cpy(test_pattern+(i*8),"06000000",8);
+    }
+    
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*8) != 0){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 60){
+        mcf_ut_format_err_str("Config LID, VAL_STRUCT_3[0].ARRAY_D4, %d, %d\r\n", cnf->len, 60);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /* Nagative test case */
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[0].ARRAY_D[5]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[5]");
+        return KAL_FALSE;
+    }
+
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "VAL_STRUCT_3[4]");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "VAL_STRUCT_3[4]");
+        return KAL_FALSE;
+    }
+
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /*
+     *  Apply 2bytes to bit default OTA
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_2_byte_4_byte_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_2byte_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_2byte_3");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_2byte_3");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "F02F", cnf->len*4) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3, %s, %s\r\n", cnf->value, "F02F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_2byte_3.F4b");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_2byte_3.F4b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "00", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.F4b, %s, %s\r\n", cnf->value, "00");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_2byte_3.L4b");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_2byte_3.L4b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.L4b, %s, %s\r\n", cnf->value, "0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.L4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_2byte_3.F2b");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_2byte_3.F2b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.F2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.F2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_2byte_3.L2b");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_2byte_3.L2b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.L2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.L2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_2byte_3.b2");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_2byte_3.b2");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "01", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.b2, %s, %s\r\n", cnf->value, "01");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_2byte_3.b2, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_4byte_3");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_4byte_3");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0001FE0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_4byte_3, %s, %s\r\n", cnf->value, "0001FE0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("Config LID, val_bit_4byte_3, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_4byte_3.F9b");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_4byte_3.F9b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0001", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_4byte_3.F9b, %s, %s\r\n", cnf->value, "0001");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("Config LID, val_bit_4byte_3.F9b, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_4byte_3.F4b");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_4byte_3.F4b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_4byte_3.F4b, %s, %s\r\n", cnf->value, "0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_4byte_3.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_config_lid_variable_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_LID_VARIABLE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->lid_num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->tag_name, "val_bit_4byte_3.F2b");
+    
+    cnf = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_config_LID_variable(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Config LID variable (%s) FAIL!!\r\n", "val_bit_4byte_3.F2b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("Config LID, val_bit_4byte_3.F2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("Config LID, val_bit_4byte_3.F2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_query_variable_value(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_bool                                                ret;
+    l4c_mcf_variable_value_operation_req_struct                *req = NULL;
+    l4c_mcf_variable_value_operation_cnf_struct                *cnf = NULL;
+    mcf_ota_result_e                                        mcf_ret = MCF_OTA_R_SUCCESS;
+    mcf_t                                                  *pMcf = mcf_get_instance();
+    mcf_ota_file_t                                         *ota_file = &(pMcf->ota_file);
+    mcf_tool_file_info_t                                   *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    nvram_ef_mcf_ota_file_info_struct                       nv_ota_file;
+    nvram_ef_mcf_sw_info_struct                             nv_sw_info;
+    mcf_tlvota_file_t                                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct                    nv_tlvota_file;
+    mcf_tlvota_sbp_tag_t                                    sbp_tag;
+    kal_uint8                                               i;
+    kal_uint8                                               test_pattern[512];
+    kal_uint8                                               array_tag[16];
+    nvram_ef_mcf_test_struct                                nv_lid_buffer;
+
+#ifdef __MCF_FIND_TAG_SUPPORT__    
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Apply default OTA
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+     //Byte operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_BYTE_11");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //Bit operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_BIT_BYTE_11");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_bit_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_BIT_BYTE_11.B3");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11.B3");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "01", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11.B3, %s, %s\r\n", cnf->value, "01");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11.B3, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_byte_12");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_byte_12");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_bit_byte_12), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_byte_12, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_byte_12, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_byte_12.L4b");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_byte_12.L4b");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_byte_12.F4b, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_byte_12.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //short operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_short_11");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_short_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_short_11), cnf->len*2, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*4) != 0){
+        mcf_ut_format_err_str("val_short_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_short_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+
+    //double operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "val_double_1");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_double_1");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_double_1), cnf->len*8, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*16) != 0){
+        mcf_ut_format_err_str("val_double_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_double_1, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+	//buffer operation with len = 2
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "val_buffer_1");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_buffer_1");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_buffer_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_buffer_1, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //buffer operation - read all buffer
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_buffer_1");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_buffer_1");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_buffer_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 32){
+        mcf_ut_format_err_str("val_buffer_1, %d, %d\r\n", cnf->len, 32);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //buffer operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "val_buffer_1[0]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_buffer_1[0]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_buffer_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_buffer_1, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //float operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "val_struct_1.vfloat");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_struct_1.vfloat");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_1.vfloat), cnf->len*4, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*8) != 0){
+        mcf_ut_format_err_str("val_struct_1.vfloat, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_struct_1.vfloat, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //int in struct operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "val_struct_3[0].vint");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_struct_3[0].vint");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_3[0].vint), cnf->len*4, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*8) != 0){
+        mcf_ut_format_err_str("val_struct_3[0].vint, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_struct_3[0].vint, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+	//struct operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_struct_3[0]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_3[0]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+	if(strncmp((kal_char *)(cnf->value), test_pattern, 510) != 0){
+         mcf_ut_format_err_str("VAL_STRUCT_3[0], %s, %s\r\n", cnf->value, test_pattern);
+         return KAL_FALSE;
+     }
+    
+     if(cnf->len != 255){
+         mcf_ut_format_err_str("VAL_STRUCT_3[0], %d, %d\r\n", cnf->len, 255);
+         return KAL_FALSE;
+     }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //buffer in struct operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[3].VBUFFER[2][4][5]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[3].VBUFFER[2][4][5]");
+        return KAL_FALSE;
+    }
+
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    
+    /* Test TLV OTA */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_NA_ut_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_NA_ut_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    
+    //byte operation
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    req->ps_id = 0;
+    strcpy(req->config, "VAL_BYTE_11");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    
+    /* Test 3-d array */
+    
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Apply 3-d array default OTA
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_3d_array_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_3d_array_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D[4][3][2]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][3][2]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "06", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3][2], %s, %s\r\n", cnf->value, "06");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3][2], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 4;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3], %s, %s\r\n", cnf->value, "060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 3){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3], %d, %d\r\n", cnf->len, 3);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3], %s, %s\r\n", cnf->value, "060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 3){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3], %d, %d\r\n", cnf->len, 3);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D[4]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060606060606060606060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4], %s, %s\r\n", cnf->value, "060606060606060606060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 12){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4], %d, %d\r\n", cnf->len, 12);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D, %s, %s\r\n", cnf->value, "060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 60){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D, %d, %d\r\n", cnf->len, 60);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D[4][2]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][2]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][2], %s, %s\r\n", cnf->value, "0606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][2], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 10;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D[3]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[3]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "06060606060606060606", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[3], %s, %s\r\n", cnf->value, "06060606060606060606");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 10){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[3], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    
+    /* Different variable size */
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D4[4][3][2]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][3][2]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "06000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][3][2], %s, %s\r\n", cnf->value, "06000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][3][2], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D4[4][3]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][3]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060000000600000006000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][3], %s, %s\r\n", cnf->value, "060000000600000006000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 3){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][3], %d, %d\r\n", cnf->len, 3);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D4[4]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %s, %s\r\n", cnf->value, "060000000600000006000000060000000600000006000000060000000600000006000000060000000600000006000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 12){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %d, %d\r\n", cnf->len, 12);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D4[4]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0600000006000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %s, %s\r\n", cnf->value, "0600000006000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D4[4][2]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][2]");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0600000006000000", cnf->len*8) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %s, %s\r\n", cnf->value, "0600000006000000");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D4");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern, 0 , 512);
+    for (i = 0; i < cnf->len; i++){
+        kal_mem_cpy(test_pattern+(i*8),"06000000",8);
+    }
+    
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*8) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 60){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4, %d, %d\r\n", cnf->len, 60);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /* Nagative test case */
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[0].ARRAY_D[5]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[5]");
+        return KAL_FALSE;
+    }
+
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "VAL_STRUCT_3[4]");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[4]");
+        return KAL_FALSE;
+    }
+
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /*
+     *  Apply 2bytes to bit default OTA
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_2_byte_4_byte_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_2byte_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_2byte_3");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "F02F", cnf->len*4) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3, %s, %s\r\n", cnf->value, "F02F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_bit_2byte_3, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_2byte_3.F4b");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.F4b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "00", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.F4b, %s, %s\r\n", cnf->value, "00");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_2byte_3.L4b");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.L4b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.L4b, %s, %s\r\n", cnf->value, "0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.L4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_2byte_3.F2b");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.F2b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.F2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.F2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_2byte_3.L2b");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.L2b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.L2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.L2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_2byte_3.b2");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.b2");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "01", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.b2, %s, %s\r\n", cnf->value, "01");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.b2, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_4byte_3");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0001FE0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3, %s, %s\r\n", cnf->value, "0001FE0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("val_bit_4byte_3, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_4byte_3.F9b");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3.F9b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0001", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3.F9b, %s, %s\r\n", cnf->value, "0001");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_bit_4byte_3.F9b, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_4byte_3.F4b");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3.F4b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3.F4b, %s, %s\r\n", cnf->value, "0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_4byte_3.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_PATH;
+    req->num = 4098;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "val_bit_4byte_3.F2b");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3.F2b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3.F2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_4byte_3.F2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+#else
+    
+#endif
+
+    /*Query variable with gid format*/
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Apply default OTA
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Reset LID FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+     //Byte operation - VAL_BYTE_11
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+44;
+    req->rec_id = 1;
+    req->len = 0;
+    kal_mem_set(array_tag, 0, 16);
+    strcpy(req->config, array_tag);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //Bit operation - VAL_BIT_BYTE_11
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+18;
+    req->rec_id = 1;
+    req->len = 0;
+    kal_mem_set(array_tag, 0, 16);
+    strcpy(req->config, array_tag);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BIT_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_bit_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //Bit operation - VAL_BIT_BYTE_11.B3
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+21;
+    req->rec_id = 1;
+    req->len = 0;
+    kal_mem_set(array_tag, 0, 16);
+    strcpy(req->config, array_tag);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BIT_BYTE_11.B3");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "01", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11.B3, %s, %s\r\n", cnf->value, "01");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11.B3, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //Bit operation - val_bit_byte_12 
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+27;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_byte_12");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_bit_byte_12), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_byte_12, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_byte_12, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //Bit operation - val_bit_byte_12.L4b
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+29;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_byte_12.L4b");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_byte_12.F4b, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_byte_12.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //short operation - val_short_11
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+56;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_short_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_short_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_short_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_short_11, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+
+    //double operation - val_double_1
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+48;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_double_1");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_double_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_double_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 8){
+        mcf_ut_format_err_str("val_double_1, %d, %d\r\n", cnf->len, 8);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+	//buffer operation with len = 2 - val_buffer_1
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+42;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_buffer_1");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_buffer_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_buffer_1, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //buffer operation - read all buffer - val_buffer_1[0]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+42;
+    req->rec_id = 1;
+    req->len = 32;
+    strcpy(req->config, "0");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_buffer_1[0]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_buffer_1[0], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 32){
+        mcf_ut_format_err_str("val_buffer_1[0], %d, %d\r\n", cnf->len, 32);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //buffer operation - val_buffer_1[0]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+42;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "0");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_buffer_1[0]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_buffer_1[0], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_buffer_1[0], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //float operation - val_struct_1.vfloat
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+78;
+    req->rec_id = 1;
+    req->len = 4;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_struct_1.vfloat");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_1.vfloat), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_struct_1.vfloat, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("val_struct_1.vfloat, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //int in struct operation - val_struct_3[0].vint
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+125;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_struct_3[0].vint");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_3[0].vint), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_struct_3[0].vint, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("val_struct_3[0].vint, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+    
+    //buffer in struct operation - VAL_STRUCT_3[3].VBUFFER[2][4][5]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+120;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "3,2,4,5");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[3].VBUFFER[2][4][5]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_struct_3[3].vbuffer[2]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[3].VBUFFER[2][4][5], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[3].VBUFFER[2][4][5], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /* Test TLV OTA */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_NA_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_NA_ut_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    
+    //byte operation - VAL_BYTE_11
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+44;
+    req->rec_id = 1;
+    req->len = 0;
+    req->ps_id = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_pattern.val_byte_11), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BYTE_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    
+    /* Test 3-d array */
+    
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Apply 3-d array and bit byte operation default OTA 
+     */
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_3d_array_and_bit_byte_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_3d_array_and_bit_byte_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Reset LID FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, (kal_uint8 *)&nv_lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+        mcf_ut_format_err_str("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+        ret = KAL_FALSE;
+    }
+    
+    if ( kal_mem_cmp((kal_uint8 *)&nv_lid_buffer, &mcf_ut_test_lid_value_new_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+        ret = KAL_FALSE;
+        mcf_ut_format_err_str("Do full OTA positive test (SW verno match) FAIL!!\r\n");
+    }
+
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D[4][3][2]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0,4,3,2");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][3][2]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d[4][3][2]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3][2], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3][2], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D[4][3]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0,4,3");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][3]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d[4][3]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][3], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D[4]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0,4");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d[4]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D[4][2]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "0,4,2");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[4][2]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d[4][2]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][2], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[4][2], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D[3]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 10;
+    strcpy(req->config, "0,3");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[3]");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d[3]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[3], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 10){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[3], %d, %d\r\n", cnf->len, 10);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    
+    /* Different variable size */
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D4[4][3][2]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+107;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0,4,3,2");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][3][2]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d4[4][3][2]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][3][2], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][3][2], %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D4[4][3]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+107;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0,4,3");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][3]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d4[4][3]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][3], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][3], %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D4[4]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+107;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0,4");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4]");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d4[4]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D4[4]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+107;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "0,4");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d4[4]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D4[4][2]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+107;
+    req->rec_id = 1;
+    req->len = 2;
+    strcpy(req->config, "0,4,2");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4[4][2]");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d4[4]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][2], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4[4][2], %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D4
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+107;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D4");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d4), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D4, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /* Nagative test case */
+    
+    //over array size - VAL_STRUCT_3[0].ARRAY_D[5] 
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0,5");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("over array size! VAL_STRUCT_3[0].ARRAY_D[5] is not FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //over array size - VAL_STRUCT_3[4].ARRAY_D
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "4");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_INVALID_PARAMETER) {
+        mcf_ut_format_err_str("over array size! VAL_STRUCT_3[4].ARRAY_D is not FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation- val_bit_2byte_3
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "FFFF", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3, %s, %s\r\n", cnf->value, "FFFF");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_bit_2byte_3, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation- val_bit_2byte_3.F4b
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+2;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.F4b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.F4b, %s, %s\r\n", cnf->value, "0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation - val_bit_2byte_3.L4b
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+4;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.L4b");
+        return KAL_FALSE;
+    }
+
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.L4b, %s, %s\r\n", cnf->value, "0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.L4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation - val_bit_2byte_3.F2b
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+1;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.F2b");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.F2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.F2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation - val_bit_2byte_3.L2b
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+3;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.L2b");
+        return KAL_FALSE;
+    }
+    
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.L2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.L2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation - val_bit_2byte_3.b2
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+6;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_2byte_3.b2");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "01", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_2byte_3.b2, %s, %s\r\n", cnf->value, "01");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_2byte_3.b2, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation - val_bit_4byte_3
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+9;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "FFFFFFFF", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3, %s, %s\r\n", cnf->value, "FFFFFFFF");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("val_bit_4byte_3, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation - val_bit_4byte_3.F9b
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+12;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3.F9b");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "FF01", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3.F9b, %s, %s\r\n", cnf->value, "FF01");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_bit_4byte_3.F9b, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation - val_bit_4byte_3.F4b
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+11;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3.F4b");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "0F", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3.F4b, %s, %s\r\n", cnf->value, "0F");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_4byte_3.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //2 byte bit operation - val_bit_4byte_3
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+10;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3.F2b");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "03", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3.F2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_4byte_3.F2b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /* Negative test */
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D[3] - not end '$'
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 10;
+    strcpy(req->config, "0,3");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[3]");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d[3]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[3], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 10){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[3], %d, %d\r\n", cnf->len, 10);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //3-D array operation - VAL_STRUCT_3[0].ARRAY_D[3] - not use '$' to separate - result = VAL_STRUCT_3[0].ARRAY_D[0]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+106;
+    req->rec_id = 1;
+    req->len = 1;
+    strcpy(req->config, "0,3");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_STRUCT_3[0].ARRAY_D[3]");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(mcf_ut_test_lid_value_new_pattern.val_struct_3[0].array_d[3]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+
+    if(strncmp((kal_char *)(cnf->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[3], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[0].ARRAY_D[3], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    //Read len is too large - val_bit_4byte_3(4 byte)
+     req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+9;
+    req->rec_id = 1;
+    req->len = 4;
+    strcpy(req->config, "");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "val_bit_4byte_3.F2b");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((kal_char *)(cnf->value), "FFFFFFFF", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_4byte_3.F2b, %s, %s\r\n", cnf->value, "03");
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("val_bit_4byte_3.F2b, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+#if !defined(__MTK_TARGET__)
+kal_bool mcf_ut_mcf_check_lid_need_reset(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+
+    mcf_ut_init();
+
+    /*
+     *  Check LID need reset positive test - Modify 3 LIDs
+     */
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("OTA_3_LIDs.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "OTA_3_LIDs.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Check LID need reset positive test - Modify 2 LIDs
+     */
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("OTA_2_LIDs.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "OTA_2_LIDs.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Check LID need reset positive test - OTA file does not update
+     */
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Check LID need reset positive test - Max last LID list count
+     */
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_last_mod_lid_g.lid_cnt = NVRAM_MCF_SAVE_LAST_LID_CNT;
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max last LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max last LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max last LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Check LID need reset positive test - Max current LID list count
+     */
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_curr_mod_lid_g.lid_cnt = NVRAM_MCF_SAVE_LAST_LID_CNT;
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max current LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max current LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max current LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+
+	MCF_UT_PASS();
+    return KAL_TRUE;
+}
+kal_bool mcf_ut_gid_mcf_check_lid_need_reset(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+
+    mcf_ut_init();
+
+    /*
+     *  Check LID need reset positive test - Modify 3 LIDs
+     */
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("OTA_3_LIDs_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "OTA_3_LIDs_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Check LID need reset positive test - Modify 2 LIDs
+     */
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("OTA_2_LIDs_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "OTA_2_LIDs_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Check LID need reset positive test - OTA file does not update
+     */
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Check LID need reset positive test - Max last LID list count
+     */
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_last_mod_lid_g.lid_cnt = NVRAM_MCF_SAVE_LAST_LID_CNT;
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max last LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max last LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max last LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    /*
+     *  Check LID need reset positive test - Max current LID list count
+     */
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    mcf_curr_mod_lid_g.lid_cnt = NVRAM_MCF_SAVE_LAST_LID_CNT;
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max current LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_IMS_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max current LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_XCAP_PROFILE_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Max current LID list count) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+
+	MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_ut_gid_mcf_check_lid_need_reset_by_psid(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    mcf_t                                  *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tool_gid_tlvota_file_item_t        *pItem;
+    mcf_tlvota_file_t                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+    mcf_ota_result_e                        mcf_ret;
+    kal_bool                                ret;
+    kal_uint8                               i;
+    sbp_reconfig_custom_param_struct        param_ptr;
+    nvram_ef_mcf_sw_info_struct             nv_sw_info;
+
+    mcf_ut_init();
+    
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+        mcf_ut_format_err_str("Read NVRAM_EF_MCF_SW_INFO_LID FAIL!");
+        return KAL_FALSE;
+    }
+    
+    strncpy(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN);
+    strncpy(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN);
+
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+        mcf_ut_format_err_str("Write NVRAM_EF_MCF_SW_INFO_LID FAIL!");
+        return KAL_FALSE;
+    } 
+
+    /*
+     *  Check LID need reset positive test - Modify 3 LIDs with SBP_PARTIAL_TAG
+     */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_3LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_3LIDs_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        is_read_general_tlvota[i] = KAL_FALSE;
+        is_read_tlvota[i] = KAL_TRUE;
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+    
+    /*
+     *  Check LID need reset positive test - Modify 2 LIDs
+     */
+	 
+	/* Read MCF TLV-OTA file into cache buffer */
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+		mcf_ut_format_err_str("Fail to read MCF TLV-OTA file info to NVRAM!!\r\n");
+		return KAL_FALSE;
+	} 
+	
+    /* Write MCF TLV-OTA file version to NVRAM */
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_2LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_2LIDs_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        is_read_general_tlvota[i] = KAL_FALSE;
+        is_read_tlvota[i] = KAL_TRUE;
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+        
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+	
+	/*
+     *  Check LID need reset positive test - TLV-OTA file does not update
+     */
+	 
+	kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+	
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+        
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (TLV-OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (TLV-OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (TLV-OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+	
+	/*
+     *  Check LID need reset positive test - Max last LID list count
+     */
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		mcf_tlvota_last_mod_lid_g[i].lid_cnt = NVRAM_MCF_SAVE_LAST_LID_CNT;
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+			return KAL_FALSE;
+		}
+	}
+	
+	/*
+     *  Check LID need reset positive test - Max current LID list count
+     */
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		mcf_tlvota_curr_mod_lid_g[i].lid_cnt = NVRAM_MCF_SAVE_LAST_LID_CNT;
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+			return KAL_FALSE;
+		}
+	}
+	
+	/*
+     *  Check LID need reset positive test - Modify 3 LIDs with SBP_PARTIAL_TAG_WITH_MCC 
+     */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_tag_with_mcc_ut_3LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_tag_with_mcc_ut_3LIDs_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG_WITH_MCC
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        is_read_general_tlvota[i] = KAL_FALSE;
+        is_read_tlvota[i] = KAL_TRUE;
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_partial_tag_with_mcc) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_partial_tag_with_mcc) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_partial_tag_with_mcc) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+	
+	/*
+     *  Check LID need reset positive test - Modify 3 LIDs with SBP_FULL_TAG
+     */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_tag_ut_3LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_tag_ut_3LIDs_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID with SBP_FULL_TAG
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        is_read_general_tlvota[i] = KAL_FALSE;
+        is_read_tlvota[i] = KAL_TRUE;
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+	
+	/*
+     *  Check LID need reset positive test - Modify 3 LIDs by auto select apply
+     */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MTK_OPOTA_SBPID_12.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_OPOTA_SBPID_12.mcfopota");
+                return KAL_FALSE;
+            }
+			
+			tlvota_file->last_mod_time = MCF_UT_GEN_TIME;
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        is_read_general_tlvota[i] = KAL_FALSE;
+        is_read_tlvota[i] = KAL_FALSE;
+        pMcf->is_ignore_dsbp[i] = KAL_FALSE;
+
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+		
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+    }
+	
+	for (i = 0; i < MAX_SIM_NUM; i++){
+		mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+	}
+
+	/*General TLV-OTA*/
+
+	/*
+     *  Check LID need reset positive test - Modify 3 LIDs
+     */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF General TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_general_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+	tlvota_file = &(pMcf->general_tlvota_file);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_NA_ut_3LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_NA_ut_3LIDs_gid_normal.mcfopota");
+			return KAL_FALSE;
+		}
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	kal_mem_set(is_read_general_tlvota, 0, MAX_SIM_NUM);
+    
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        is_read_tlvota[i] = KAL_FALSE;
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+		is_read_general_tlvota[i] = KAL_TRUE;
+
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+    
+    /*
+     *  Check LID need reset positive test - Modify 2 LIDs
+     */
+	 
+	/* Read MCF TLV-OTA file into cache buffer */
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+		mcf_ut_format_err_str("Fail to read MCF General TLV-OTA file info to NVRAM!!\r\n");
+		return KAL_FALSE;
+	} 
+	
+    /* Write MCF TLV-OTA file version to NVRAM */
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF General TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_general_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+	tlvota_file = &(pMcf->general_tlvota_file);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_NA_ut_2LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_NA_ut_2LIDs_gid_normal.mcfopota");
+			return KAL_FALSE;
+		}
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+    kal_mem_set(is_read_general_tlvota, 0, MAX_SIM_NUM);
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+        
+        is_read_tlvota[i] = KAL_FALSE;
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+		is_read_general_tlvota[i] = KAL_TRUE;
+        
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+	
+	/*
+     *  Check LID need reset positive test - General TLV-OTA file does not update
+     */
+	 
+	kal_mem_set(&mcf_general_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+        
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (TLV-OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (TLV-OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (TLV-OTA file does not update) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+	
+	/*
+     *  Check LID need reset positive test - Modify 3 LIDs with ICCID tag by auto select apply
+     */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF General TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_general_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+	tlvota_file = &(pMcf->general_tlvota_file);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_ICCID_ut_3LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_ICCID_ut_3LIDs_gid_normal.mcfopota");
+			return KAL_FALSE;
+		}
+		tlvota_file->last_mod_time = MCF_UT_GEN_TIME;
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	
+    kal_mem_set(is_read_general_tlvota, 0, MAX_SIM_NUM);
+	
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		strcpy(param_ptr.iccid, SBP_PARTIAL_TAG);
+
+        is_read_tlvota[i] = KAL_FALSE;
+        pMcf->is_ignore_dsbp[i] = KAL_FALSE;
+
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with NA tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+    }
+	for (i = 0; i < MAX_SIM_NUM; i++){
+		mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+	}
+	
+	/*
+     *  Check LID need reset positive test - Apply SIM1 and SIM2 and General OP-OTA separately
+     */
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+
+	tlvota_file = &(pMcf->tlvota_file[0]);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MTK_OPOTA_SBPID_12.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_OPOTA_SBPID_12.mcfopota");
+			return KAL_FALSE;
+		}
+		
+		tlvota_file->last_mod_time = MCF_UT_GEN_TIME;
+		kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+
+	param_ptr.sbp_id = SBP_TAG_SBPID; 
+	param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(0);
+	kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+	kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	kal_mem_set(param_ptr.iccid, 0, 21);
+
+	is_read_general_tlvota[0] = KAL_FALSE;
+	is_read_tlvota[0] = KAL_FALSE;
+	pMcf->is_ignore_dsbp[i] = KAL_FALSE;
+
+	ret = mcf_auto_select_tlvota_file(&param_ptr);
+	if (ret != KAL_TRUE) {
+		mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+		return KAL_FALSE;
+	}
+
+	ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(0));
+	if (ret != KAL_TRUE) {
+		mcf_ut_format_err_str("Apply SIM1 and SIM2 and General OP-OTA separately FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+		return KAL_FALSE;
+	}
+
+	ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(0));
+	if (ret != KAL_TRUE) {
+		mcf_ut_format_err_str("Apply SIM1 and SIM2 and General OP-OTA separately FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+		return KAL_FALSE;
+	}
+
+	ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(0));
+	if (ret != KAL_TRUE) {
+		mcf_ut_format_err_str("Apply SIM1 and SIM2 and General OP-OTA separately FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+		return KAL_FALSE;
+	}
+	
+	mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(0));
+	
+	tlvota_file = &(pMcf->tlvota_file[1]);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MTK_OPOTA_SBPID_12.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_OPOTA_SBPID_12.mcfopota");
+			return KAL_FALSE;
+		}
+		
+		tlvota_file->last_mod_time = MCF_UT_GEN_TIME;
+		kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+
+	param_ptr.sbp_id = SBP_TAG_SBPID; 
+	param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(1);
+	kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+	kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	kal_mem_set(param_ptr.iccid, 0, 21);
+
+	is_read_general_tlvota[1] = KAL_FALSE;
+	is_read_tlvota[1] = KAL_FALSE;
+	pMcf->is_ignore_dsbp[i] = KAL_FALSE;
+
+	ret = mcf_auto_select_tlvota_file(&param_ptr);
+	if (ret != KAL_TRUE) {
+		mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+		return KAL_FALSE;
+	}
+
+	ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(1));
+	if (ret != KAL_TRUE) {
+		mcf_ut_format_err_str("Apply SIM1 and SIM2 and General OP-OTA separately FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+		return KAL_FALSE;
+	}
+
+	ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(1));
+	if (ret != KAL_TRUE) {
+		mcf_ut_format_err_str("Apply SIM1 and SIM2 and General OP-OTA separately FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+		return KAL_FALSE;
+	}
+
+	ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(1));
+	if (ret != KAL_TRUE) {
+		mcf_ut_format_err_str("Apply SIM1 and SIM2 and General OP-OTA separately FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+		return KAL_FALSE;
+	}
+	
+	mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(1));
+	
+	tlvota_file = &(pMcf->general_tlvota_file);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_NA_ut_2LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_NA_ut_2LIDs_gid_normal.mcfopota");
+			return KAL_FALSE;
+		}
+		
+		tlvota_file->last_mod_time = MCF_UT_GEN_TIME;
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+
+	kal_mem_set(is_read_general_tlvota, 0, MAX_SIM_NUM);
+	
+	for(i = 0; i < MAX_SIM_NUM; i++){
+		param_ptr.sbp_id = SBP_TAG_SBPID; 
+		param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+		kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		kal_mem_set(param_ptr.iccid, 0, 21);
+
+		
+		is_read_tlvota[i] = KAL_FALSE;
+		pMcf->is_ignore_dsbp[i] = KAL_FALSE;
+
+		ret = mcf_auto_select_tlvota_file(&param_ptr);
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+		if (ret != KAL_TRUE) {
+			mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_full_tag) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+			return KAL_FALSE;
+		}
+	}
+	
+	for(i = 0; i < MAX_SIM_NUM; i++){
+		mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+	}
+	
+	/*
+     *  Check LID need reset positive test - Change SIM1, SIM2 card
+     */
+	
+	kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_3LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_3LIDs_gid_normal.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        is_read_general_tlvota[i] = KAL_FALSE;
+        is_read_tlvota[i] = KAL_TRUE;
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+	
+	//Change SIM1/SIM2
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+        // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+        param_ptr.sbp_id = 108; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+
+        is_read_general_tlvota[i] = KAL_FALSE;
+        is_read_tlvota[i] = KAL_FALSE;
+        pMcf->is_ignore_dsbp[i] = KAL_TRUE;
+
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+            return KAL_FALSE;
+        }
+
+        ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, l4c_gemini_get_switched_sim_id(i));
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs with SBP_PARTIAL_TAG) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+            return KAL_FALSE;
+        }
+        
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(i));
+    }
+	
+	
+	MCF_UT_PASS();
+    return KAL_TRUE;
+}
+kal_bool mcf_ut_mcf_check_ota_need_update(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_bool                            ret;
+    mcf_tlvota_sbp_tag_t                sbp_tag;
+    kal_char                            iccid_tag[16];
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_tlvota_file_item_t        *pItem;
+    mcf_tlvota_file_t                  *tlvota_file;
+    sbp_reconfig_custom_param_struct    param_ptr;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    
+    mcf_ut_init();
+    
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+        mcf_ut_format_err_str("Read NVRAM_EF_MCF_SW_INFO_LID FAIL!");
+        return KAL_FALSE;
+    }
+    
+    strncpy(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN);
+    strncpy(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN);
+
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+        mcf_ut_format_err_str("Write NVRAM_EF_MCF_SW_INFO_LID FAIL!");
+        return KAL_FALSE;
+    } 
+    
+    /*
+    *  TLV-OTA file test
+    */
+    /* First time, need to update TLV-OTA*/
+    
+    /* Fill TLV-OTA file into buffer */
+    
+    tlvota_file = &(pMcf->tlvota_file[0]);
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+        ret = mcf_ut_open_test_data("MTK_OPOTA_SBPID_12.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_OPOTA_SBPID_12.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+    
+
+    // fill in SBP TAG
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    
+    kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+    strcpy(iccid_tag, SBP_PARTIAL_TAG);
+    
+    param_ptr.sbp_id = SBP_TAG_SBPID; 
+    param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(0);
+    kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    kal_mem_set(param_ptr.iccid, 0, 21);
+    
+    
+    // Check TLV-OTA need update
+    ret = mcf_check_ota_need_update(param_ptr.ps_id, sbp_tag, iccid_tag);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_check_ota_need_update FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    
+    //DSBP flow
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+    
+    
+    /* Second time, do not change TLV-OTA, no need to update */
+    
+    // Check TLV-OTA need update
+    ret = mcf_check_ota_need_update(param_ptr.ps_id, sbp_tag, iccid_tag);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("mcf_check_ota_need_update FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    
+    //DSBP flow
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+    
+    /* When chang sim card, need to update */
+    
+    // fill in SBP TAG
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = 1;
+    strncpy(sbp_tag.mcc, "460", MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, "01", MAX_MNC_STR_LEN);
+    
+    kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+    strcpy(iccid_tag, SBP_PARTIAL_TAG);
+    
+    param_ptr.sbp_id = 1; 
+    param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(0);
+    kal_mem_cpy(param_ptr.mcc, "460", MAX_MCC_STR_LEN);
+    kal_mem_cpy(param_ptr.mnc, "01", MAX_MNC_STR_LEN);
+    kal_mem_set(param_ptr.iccid, 0, 21);
+    
+    /* Fill TLV-OTA file into buffer */
+    
+    tlvota_file = &(pMcf->tlvota_file[0]);
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+        ret = mcf_ut_open_test_data("MTK_OPOTA_SBPID_1.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_OPOTA_SBPID_1.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+    
+    // Check TLV-OTA need update
+    ret = mcf_check_ota_need_update(param_ptr.ps_id, sbp_tag, iccid_tag);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_check_ota_need_update FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    
+    /*
+    *  General TLV-OTA file test
+    */
+    /* First time, need to update TLV-OTA*/
+    
+    /* Fill TLV-OTA file into buffer */
+    
+    tlvota_file = &(pMcf->general_tlvota_file);
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+        ret = mcf_ut_open_test_data("MTK_OPOTA_GENERAL.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_OPOTA_GENERAL.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+    
+
+    // fill in SBP TAG
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    
+    kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+    strcpy(iccid_tag, SBP_PARTIAL_TAG);
+    
+    param_ptr.sbp_id = SBP_TAG_SBPID; 
+    param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(0);
+    kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    kal_mem_set(param_ptr.iccid, 0, 21);
+    
+    
+    // Check TLV-OTA need update
+    ret = mcf_check_ota_need_update(param_ptr.ps_id, sbp_tag, iccid_tag);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_check_ota_need_update FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    
+    //DSBP flow
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+    
+    
+    
+    /* Second time, do not change General TLV-OTA, no need to update */
+    
+    // Check TLV-OTA need update
+    ret = mcf_check_ota_need_update(param_ptr.ps_id, sbp_tag, iccid_tag);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("mcf_check_ota_need_update FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    
+    //DSBP flow
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+    
+    MCF_UT_PASS();
+    return KAL_TRUE;
+
+}
+
+kal_bool mcf_ut_mcf_get_tlvota_file_result(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_bool                            ret;
+    mcf_tlvota_sbp_tag_t                sbp_tag;
+    kal_char                            iccid_tag[16];
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_tlvota_file_item_t        *pItem;
+    mcf_tlvota_file_t                  *tlvota_file;
+    sbp_reconfig_custom_param_struct    param_ptr;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    mcf_ota_result_e                    mcf_ret = MCF_OTA_R_SUCCESS;
+    kal_uint8                           i;
+    
+    mcf_ut_init();
+    
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+        mcf_ut_format_err_str("Read NVRAM_EF_MCF_SW_INFO_LID FAIL!");
+        return KAL_FALSE;
+    }
+    
+    strncpy(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN);
+    strncpy(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN);
+
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+        mcf_ut_format_err_str("Write NVRAM_EF_MCF_SW_INFO_LID FAIL!");
+        return KAL_FALSE;
+    } 
+    
+    /*
+    *  TLV-OTA file test
+    */
+    /* First time, need to update TLV-OTA*/
+    
+    /* Fill TLV-OTA file into buffer */
+    
+    tlvota_file = &(pMcf->tlvota_file[0]);
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+        ret = mcf_ut_open_test_data("MTK_OPOTA_SBPID_12.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_OPOTA_SBPID_12.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+    
+
+    // fill in SBP TAG
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    
+    kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+    strcpy(iccid_tag, SBP_PARTIAL_TAG);
+    
+    param_ptr.sbp_id = SBP_TAG_SBPID; 
+    param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(0);
+    kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    kal_mem_set(param_ptr.iccid, 0, 21);
+    
+    //DSBP flow
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+    
+    mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+    
+    if (mcf_ret != MCF_OTA_R_SUCCESS){
+        mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    
+    /* Second time, do not change TLV-OTA, no need to update */
+
+    //DSBP flow
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+    
+    mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+    
+    if (mcf_ret != MCF_OTA_R_SUCCESS){
+        mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    
+    /* When chang sim card, need to update */
+    
+    // fill in SBP TAG
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = 1;
+    strncpy(sbp_tag.mcc, "460", MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, "01", MAX_MNC_STR_LEN);
+    
+    kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+    strcpy(iccid_tag, SBP_PARTIAL_TAG);
+    
+    param_ptr.sbp_id = 1; 
+    param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(0);
+    kal_mem_cpy(param_ptr.mcc, "460", MAX_MCC_STR_LEN);
+    kal_mem_cpy(param_ptr.mnc, "01", MAX_MNC_STR_LEN);
+    kal_mem_set(param_ptr.iccid, 0, 21);
+    
+    /* Fill TLV-OTA file into buffer */
+    
+    tlvota_file = &(pMcf->tlvota_file[0]);
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+        ret = mcf_ut_open_test_data("MTK_OPOTA_SBPID_1.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MTK_OPOTA_SBPID_1.mcfopota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+    
+   //DSBP flow
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+    
+    mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+    
+    if (mcf_ret != MCF_OTA_R_SUCCESS){
+        mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+    
+    /*
+    *
+    * False positive test - Invalid TLVOTA file
+    *
+    */
+    
+    for(i = 0; i < MAX_SIM_NUM; i++){
+        // fill in SBP TAG
+        kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+        sbp_tag.sbp_id = SBP_TAG_SBPID;
+        strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        
+        kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+        strcpy(iccid_tag, SBP_PARTIAL_TAG);
+        
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+        
+        /* Use OTA file */
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        
+        //DSBP flow
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+        mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+        
+        if (mcf_ret != MCF_OTA_R_INVALID_FILE){
+            mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+    }
+    
+    /*
+    *
+    * False positive test - decyption FAIL
+    *
+    */
+    
+    for(i = 0; i < MAX_SIM_NUM; i++){
+        // fill in SBP TAG
+        kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+        sbp_tag.sbp_id = SBP_TAG_SBPID;
+        strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        
+        kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+        strcpy(iccid_tag, SBP_PARTIAL_TAG);
+        
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+        
+        /* Use error AES-128 file */
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_encyption_wrong_key.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_encyption_wrong_key.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        
+        //DSBP flow
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+        mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+        
+        if (mcf_ret != MCF_OTA_R_CHECKSUM_ERROR){
+            mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+    }
+    
+    /*
+    *
+    * False positive test - digest FAIL
+    *
+    */
+    
+    for(i = 0; i < MAX_SIM_NUM; i++){
+        // fill in SBP TAG
+        kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+        sbp_tag.sbp_id = SBP_TAG_SBPID;
+        strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        
+        kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+        strcpy(iccid_tag, SBP_PARTIAL_TAG);
+        
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+        
+        /* Use error AES-128 file */
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_wrong_RSA2048.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_wrong_RSA2048.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        
+        //DSBP flow
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+        mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+        
+        if (mcf_ret != MCF_OTA_R_DIGEST_FAIL){
+            mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+    }
+    
+    /*
+    *
+    * False positive test - Invalid TLVOTA file - mcf_check_ota_need_update
+    *
+    */
+    
+    for(i = 0; i < MAX_SIM_NUM; i++){
+        // fill in SBP TAG
+        kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+        sbp_tag.sbp_id = SBP_TAG_SBPID;
+        strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        
+        kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+        strcpy(iccid_tag, SBP_PARTIAL_TAG);
+        
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+        
+        /* Use OTA file */
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+    
+    
+        // Check TLV-OTA need update
+        ret = mcf_check_ota_need_update(param_ptr.ps_id, sbp_tag, iccid_tag);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("mcf_check_ota_need_update FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        
+        //DSBP flow
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+        mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+        
+        if (mcf_ret != MCF_OTA_R_INVALID_FILE){
+            mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+    }
+    
+    /*
+    *
+    * False positive test - decyption FAIL - mcf_check_ota_need_update
+    *
+    */
+    
+    for(i = 0; i < MAX_SIM_NUM; i++){
+        // fill in SBP TAG
+        kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+        sbp_tag.sbp_id = SBP_TAG_SBPID;
+        strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        
+        kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+        strcpy(iccid_tag, SBP_PARTIAL_TAG);
+        
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+        
+        /* Use error AES-128 file */
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_encyption_wrong_key.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_encyption_wrong_key.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        
+        // Check TLV-OTA need update
+        ret = mcf_check_ota_need_update(param_ptr.ps_id, sbp_tag, iccid_tag);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("mcf_check_ota_need_update FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        
+        /* Use error AES-128 file */
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_encyption_wrong_key.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_encyption_wrong_key.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        
+        //DSBP flow
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+        mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+        
+        if (mcf_ret != MCF_OTA_R_CHECKSUM_ERROR){
+            mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+    }
+    
+    /*
+    *
+    * False positive test - digest FAIL - mcf_check_ota_need_update
+    *
+    */
+    
+    for(i = 0; i < MAX_SIM_NUM; i++){
+        // fill in SBP TAG
+        kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+        sbp_tag.sbp_id = SBP_TAG_SBPID;
+        strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        
+        kal_mem_set(&iccid_tag, 0, sizeof(kal_char));
+        strcpy(iccid_tag, SBP_PARTIAL_TAG);
+        
+        param_ptr.sbp_id = SBP_TAG_SBPID; 
+        param_ptr.ps_id =  l4c_gemini_get_switched_sim_id(i);
+        kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+        kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+        kal_mem_set(param_ptr.iccid, 0, 21);
+        
+        /* Use error RSA2048 file */
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_wrong_RSA2048.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_wrong_RSA2048.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        
+        // Check TLV-OTA need update
+        ret = mcf_check_ota_need_update(param_ptr.ps_id, sbp_tag, iccid_tag);
+        if (ret != KAL_TRUE) {
+            mcf_ut_format_err_str("mcf_check_ota_need_update FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        
+        /* Use error RSA2048 file */
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+            ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_wrong_RSA2048.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+            if (ret == KAL_FALSE) {
+                mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_wrong_RSA2048.mcfopota");
+                return KAL_FALSE;
+            }
+
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        } else {
+            mcf_ut_format_err_str("Read TLV-OTA FAIL!! Fail to take write lock! \r\n");
+            return KAL_FALSE;
+        }
+        
+        //DSBP flow
+        ret = mcf_auto_select_tlvota_file(&param_ptr);
+        if (ret != KAL_FALSE) {
+            mcf_ut_format_err_str("mcf_auto_select_tlvota_file FAIL! ret(%d) \r\n", ret);
+            return KAL_FALSE;
+        }
+        mcf_set_config_after_dsbp(l4c_gemini_get_switched_sim_id(param_ptr.ps_id));
+        mcf_ret = mcf_get_tlvota_file_result(param_ptr.ps_id);
+        
+        if (mcf_ret != MCF_OTA_R_DIGEST_FAIL){
+            mcf_ut_format_err_str("mcf_get_tlvota_file_result FAIL! ret(%d) \r\n", mcf_ret);
+            return KAL_FALSE;
+        }
+    }
+    
+    MCF_UT_PASS();
+    return KAL_TRUE;
+
+}
+#endif
+
+#if defined(__MCF_UT_FRAMEWORK_SUPPORT__)
+extern kal_bool mcf_utfwk_sample_code_start_ut();
+kal_bool mcf_utfwk_sample_code_ut(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	kal_bool ret = KAL_TRUE;
+	ret = mcf_utfwk_sample_code_start_ut();
+	if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("mcf utfwk sample code failed \r\n");
+        return KAL_FALSE;
+    }
+	MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_utfwk_ut_test_flow (void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_bool ret = KAL_TRUE;
+    static mcf_utfwk_ota_input_struct    ota_input;
+    kal_char    ota_data_path[512];
+    kal_char   *pos; 
+    kal_uint8    *dump_buffer;
+    nvram_errno_enum                 nvram_api_ret;
+    nvram_ltable_entry_struct        lid_info = {0};
+    static kal_uint32          value;
+    kal_uint64          sh_value;
+    kal_uint8           oring_value[20];
+    kal_uint8           hex_value[20];
+    kal_uint32          sim_id = 0;
+    static mcf_utfwk_config_variable_struct     var;
+    static mcf_utfwk_config_variable_struct     var_arr[5];
+    static kal_uint32          value1;
+    static kal_uint32          bit_value;
+    nvram_ef_mcf_test_struct  test_lid_buffer;
+
+    
+    /* Normal Case */
+    kal_mem_set(&ota_input, 0, sizeof(mcf_utfwk_ota_input_struct));
+    ota_input.lid[0] = NVRAM_EF_MCF_TEST_OTA_LID;
+    ota_input.lid_cnt = 1;
+    ota_input.ota_type = MCF_UTFWK_ATTR_OTA;
+
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s%c", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_ut_gid_normal.mcfota", '\0');
+    
+    ota_input.input_op = MCF_UTFWK_OTA_FILE_PATH;
+    strcpy(ota_input.input_mode.file_path_name, ota_data_path);
+    
+    ret = mcf_utfwk_initial_env(ota_input);
+    if (ret == KAL_FALSE){
+        return ret;
+    }
+    
+    mcf_utfwk_execute();
+    
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        ret = KAL_FALSE;
+
+        return ret;
+    }
+    
+    dump_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_LID, dump_buffer, lid_info.size, 0, "") != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+        
+    if ( kal_mem_cmp(dump_buffer, &mcf_ut_test_lid_value_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+
+    free_ctrl_buffer_set_null(dump_buffer);
+    
+    mcf_utfwk_reset();
+    
+    /* OTA for Query Case */
+    kal_mem_set(&ota_input, 0, sizeof(mcf_utfwk_ota_input_struct));
+    
+    ota_input.lid[0] = NVRAM_EF_MCF_TEST_OTA_QUERY_LID;
+    ota_input.lid_cnt = 1;
+    ota_input.ota_type = MCF_UTFWK_ATTR_OTA;
+
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s%c", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_QUERY_ut_gid_normal.mcfota", '\0');
+    
+    ota_input.input_op = MCF_UTFWK_OTA_FILE_PATH;
+    strcpy(ota_input.input_mode.file_path_name, ota_data_path);
+    
+    ret = mcf_utfwk_initial_env(ota_input);
+    if (ret == KAL_FALSE){
+        return ret;
+    }
+
+    mcf_utfwk_execute();
+    
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        
+        ret = KAL_FALSE;
+        return ret;
+    }
+    
+    kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    if((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) {
+        if(mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct)) != MCF_OTA_R_SUCCESS){
+            ret = KAL_FALSE;
+            return ret;
+        }
+    }else {
+        ret = KAL_FALSE;
+        return ret;
+    }
+    
+    if ( kal_mem_cmp(&test_lid_buffer, &mcf_ut_test_lid_value_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+        ret = KAL_FALSE;
+        return ret;
+    }
+    
+    dump_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, MCF_UTFWK_DUMP_LID, dump_buffer, lid_info.size, 0, "") != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    if ( kal_mem_cmp(dump_buffer, &mcf_ut_test_lid_value_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+        ret = KAL_FALSE;
+        
+        return KAL_FALSE;
+    }
+
+    free_ctrl_buffer_set_null(dump_buffer);
+    
+    mcf_utfwk_reset();
+    
+    
+    /* Generate OTA Case */
+    
+    kal_mem_set(&ota_input, 0, sizeof(mcf_utfwk_ota_input_struct));
+    kal_mem_set(&var, 0, sizeof(mcf_utfwk_config_variable_struct));
+
+    ota_input.lid[0] = NVRAM_EF_MCF_TEST_OTA_LID;
+    ota_input.lid_cnt = 1;
+    ota_input.ota_type = MCF_UTFWK_ATTR_OTA;
+    ota_input.input_op = MCF_UTFWK_OTA_VARIABLE_CONFIG;
+    
+    //VAL_STRUCT_3[0].ARRAY_D[4][3][2]
+    var.gid = MCF_TEST_OTA_LID_BASE_GID+106;
+    strcpy(var.array_index, "0$4$3$2$");
+    value = 12;
+    var.value = &value;
+    var.value_len = 1;
+    var.rec_id = 1;
+    ota_input.input_mode.var_info.var = &var;
+    ota_input.input_mode.var_info.var_cnt = 1;
+    
+    ret = mcf_utfwk_initial_env(ota_input);
+    if (ret == KAL_FALSE){
+        return ret;
+    }
+    
+    mcf_utfwk_execute();
+    
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        
+        ret = KAL_FALSE;
+        return ret;
+    }
+    
+    dump_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_ONE_VARIABLE, dump_buffer, 1, var.gid, var.array_index) != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    mcf_bytes_to_hex(&value, 1, KAL_FALSE, &oring_value);
+    mcf_bytes_to_hex(dump_buffer, 1, KAL_FALSE, &hex_value);
+    
+    if (strncmp(hex_value, oring_value, 2) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+
+    free_ctrl_buffer_set_null(dump_buffer);
+    
+    mcf_utfwk_reset();
+    
+    /* Generate OTA Case - 2 variables */
+    
+    kal_mem_set(&ota_input, 0, sizeof(mcf_utfwk_ota_input_struct));
+    kal_mem_set(&var_arr, 0, sizeof(mcf_utfwk_config_variable_struct)*5);
+
+    ota_input.lid[0] = NVRAM_EF_MCF_TEST_OTA_LID;
+    ota_input.lid_cnt = 1;
+    ota_input.ota_type = MCF_UTFWK_ATTR_OTA;
+    ota_input.input_op = MCF_UTFWK_OTA_VARIABLE_CONFIG;
+    
+    //VAL_STRUCT_3[0].ARRAY_D[4][3][2]
+    var_arr[0].gid = MCF_TEST_OTA_LID_BASE_GID+106;
+    strcpy(var_arr[0].array_index, "0$4$3$2$");
+    value = 12;
+    var_arr[0].value = &value;
+    var_arr[0].value_len = 1;
+    var_arr[0].rec_id = 1;
+    
+    //val_byte_11
+    var_arr[1].gid = MCF_TEST_OTA_LID_BASE_GID+44;
+    value1 = 32;
+    var_arr[1].value = &value1;
+    var_arr[1].value_len = 1;
+    var_arr[1].rec_id = 1;
+    ota_input.input_mode.var_info.var = var_arr;
+    ota_input.input_mode.var_info.var_cnt = 2;  
+
+    
+    ret = mcf_utfwk_initial_env(ota_input);
+    if (ret == KAL_FALSE){
+        return ret;
+    }
+    
+    mcf_utfwk_execute();
+    
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        
+        ret = KAL_FALSE;
+        return ret;
+    }
+    
+    dump_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_ONE_VARIABLE, dump_buffer, 1, var_arr[0].gid, var_arr[0].array_index) != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    mcf_bytes_to_hex(&value, 1, KAL_FALSE, &oring_value);
+    mcf_bytes_to_hex(dump_buffer, 1, KAL_FALSE, &hex_value);
+    
+    if (strncmp(hex_value, oring_value, 2) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_ONE_VARIABLE, dump_buffer, 1, var_arr[1].gid, var_arr[1].array_index) != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    mcf_bytes_to_hex(&value1, 1, KAL_FALSE, &oring_value);
+    mcf_bytes_to_hex(dump_buffer, 1, KAL_FALSE, &hex_value);
+    
+    if (strncmp(hex_value, oring_value, 2) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+
+    free_ctrl_buffer_set_null(dump_buffer);
+    
+    mcf_utfwk_reset();
+    
+    /* OP OTA Case */
+    
+    kal_mem_set(&ota_input, 0, sizeof(mcf_utfwk_ota_input_struct));
+    kal_mem_set(&mcf_utfwk_lid_buffer,0, sizeof(nvram_ef_mcf_test_struct));
+    
+    ota_input.lid[0] = NVRAM_EF_MCF_TEST_OTA_LID;
+    ota_input.lid_cnt = 1;
+    ota_input.ota_type = MCF_UTFWK_ATTR_OTA_BY_OP;
+    ota_input.sim_id = 0;
+    ota_input.sbp_id = SBP_TAG_SBPID;
+    strncpy(ota_input.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(ota_input.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s%c", MCF_UT_DB_FOLDER_PATH, "MCF_TLVOTA_SBP_full_ut_gid_normal.mcfopota", '\0');
+    
+    ota_input.input_op = MCF_UTFWK_OTA_FILE_PATH;
+    strcpy(ota_input.input_mode.file_path_name, ota_data_path);
+    
+    ret = mcf_utfwk_initial_env(ota_input);
+    if (ret == KAL_FALSE){
+        return ret;
+    }
+    
+    mcf_utfwk_initial_dsbp_callback(mcf_utfwk_dsbp_callback);
+    
+    mcf_utfwk_execute();
+    
+    if ( kal_mem_cmp(&mcf_utfwk_lid_buffer, &mcf_ut_test_lid_value_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+        ret = KAL_FALSE;
+        return ret;
+    }
+    
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        
+        ret = KAL_FALSE;
+        return ret;
+    }
+    
+    dump_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_LID, dump_buffer, lid_info.size, 0, "") != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+
+    
+    if ( kal_mem_cmp(dump_buffer, &mcf_ut_test_lid_value_pattern, sizeof(nvram_ef_mcf_test_struct)) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+
+    free_ctrl_buffer_set_null(dump_buffer);
+    
+    mcf_utfwk_reset();
+    
+    /* OP OTA Generate Case */
+    
+    kal_mem_set(&ota_input, 0, sizeof(mcf_utfwk_ota_input_struct));
+    kal_mem_set(&var_arr, 0, sizeof(mcf_utfwk_config_variable_struct)*5);
+    kal_mem_set(&mcf_utfwk_lid_buffer,0, sizeof(nvram_ef_mcf_test_struct));
+    
+    ota_input.lid[0] = NVRAM_EF_MCF_TEST_OTA_LID;
+    ota_input.lid_cnt = 1;
+    ota_input.ota_type = MCF_UTFWK_ATTR_OTA_BY_OP;
+    ota_input.sim_id = 0;
+    ota_input.sbp_id = SBP_TAG_SBPID;
+    strncpy(ota_input.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(ota_input.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+
+    ota_input.input_mode.var_info.tag_type = 1;
+    ota_input.input_op = MCF_UTFWK_OTA_VARIABLE_CONFIG;
+    //VAL_BYTE_11
+    var_arr[0].gid = MCF_TEST_OTA_LID_BASE_GID+44;
+    value = 32;
+    var_arr[0].value = &value;
+    var_arr[0].value_len = 1;
+    var_arr[0].rec_id = 1;
+    //VAL_STRUCT_3[0].ARRAY_D[4][3][2]
+    var_arr[1].gid = MCF_TEST_OTA_LID_BASE_GID+106;
+    strcpy(var_arr[1].array_index, "0$4$3$2$");
+    value1 = 64;
+    var_arr[1].value = &value1;
+    var_arr[1].value_len = 1;
+    var_arr[1].rec_id = 1;
+    //VAL_SHORT_11
+    var_arr[2].gid = MCF_TEST_OTA_LID_BASE_GID+56;
+    sh_value = 5566;
+    var_arr[2].value = &sh_value;
+    var_arr[2].value_len = 2;
+    var_arr[2].rec_id = 1;
+    //VAL_BIT_BYTE_11.B3
+    var_arr[3].gid = MCF_TEST_OTA_LID_BASE_GID+21;
+    bit_value = 1;
+    var_arr[3].value = &bit_value;
+    var_arr[3].value_len = 1;
+    var_arr[3].rec_id = 1;
+    
+    
+    ota_input.input_mode.var_info.var = var_arr;
+    ota_input.input_mode.var_info.var_cnt = 4; 
+    
+    ret = mcf_utfwk_initial_env(ota_input);
+    if (ret == KAL_FALSE){
+        return ret;
+    }
+    
+    mcf_utfwk_initial_dsbp_callback(mcf_utfwk_dsbp_callback);
+    
+    mcf_utfwk_execute();
+    
+    nvram_api_ret = nvram_external_get_lid_info(NVRAM_EF_MCF_TEST_OTA_LID, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        
+        ret = KAL_FALSE;
+        return ret;
+    }
+    
+    dump_buffer = (kal_uint8 *)get_ctrl_buffer(sizeof(nvram_ef_mcf_test_struct));
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_ONE_VARIABLE, dump_buffer, 1, var_arr[0].gid, var_arr[0].array_index) != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    mcf_bytes_to_hex(&value, 1, KAL_FALSE, &oring_value);
+    mcf_bytes_to_hex(dump_buffer, 1, KAL_FALSE, &hex_value);
+    
+    if (strncmp(hex_value, oring_value, 2) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_ONE_VARIABLE, dump_buffer, 1, var_arr[1].gid, var_arr[1].array_index) != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    mcf_bytes_to_hex(&value1, 1, KAL_FALSE, &oring_value);
+    mcf_bytes_to_hex(dump_buffer, 1, KAL_FALSE, &hex_value);
+    
+    if (strncmp(hex_value, oring_value, 2) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_ONE_VARIABLE, dump_buffer, 2, var_arr[2].gid, var_arr[2].array_index) != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    mcf_bytes_to_hex(&sh_value, 2, KAL_FALSE, &oring_value);
+    mcf_bytes_to_hex(dump_buffer, 2, KAL_FALSE, &hex_value);
+    
+    if (strncmp(hex_value, oring_value, 4) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(dump_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+    
+    if(mcf_utfwk_dump_result(NVRAM_EF_MCF_TEST_OTA_LID, 1, MCF_UTFWK_DUMP_ONE_VARIABLE, dump_buffer, 1, var_arr[3].gid, var_arr[3].array_index) != KAL_TRUE){
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+    
+    mcf_bytes_to_hex(&bit_value, 1, KAL_FALSE, &oring_value);
+    mcf_bytes_to_hex(dump_buffer, 1, KAL_FALSE, &hex_value);
+    
+    if (strncmp(hex_value, oring_value, 2) != 0 ) {
+        ret = KAL_FALSE;
+        return KAL_FALSE;
+    }
+
+    free_ctrl_buffer_set_null(dump_buffer);
+    
+    mcf_utfwk_reset();
+
+    
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+#endif
+#if defined(__MCF_COMBINE_FILE_SUPPORT__)
+kal_uint8 test_file1[MCF_MAX_OTA_FILE_SIZE];
+kal_uint8 test_file2[MCF_MAX_OTA_FILE_SIZE];
+kal_uint8 output_file[MCF_MAX_OTA_FILE_SIZE];
+kal_bool mcf_merge_ota_file_ut(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_char ota_data_path[512];
+    kal_bool ret = KAL_FALSE;
+    FILE *file1, *file2;
+    kal_char *pos;
+	kal_bool mcf_ret;
+    
+	// ========== BASIC TEST ========== //
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "OTA_2_LIDs_ut_gid_normal.mcfota");
+    file1 = fopen(ota_data_path, "rb");
+    
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "OTA_3_LIDs_ut_gid_normal.mcfota");
+    file2 = fopen(ota_data_path, "rb");
+    
+    if(file1 != NULL && file2 != NULL)
+    {
+        kal_mem_set(test_file1, 0, sizeof(test_file1));
+        fread(test_file1, sizeof(test_file1), 1, file1);
+        fclose(file1);
+        kal_mem_set(test_file2, 0, sizeof(test_file2));
+        fread(test_file2, sizeof(test_file2), 1, file2);
+        fclose(file2);
+    } else {
+        mcf_ut_format_err_str("Merge OTA open file failed!!\r\n");
+        return KAL_FALSE;
+    }
+    ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+    if (ret == KAL_FALSE){
+        mcf_ut_format_err_str("Merge OTA buffer failed!!\r\n");
+        return KAL_FALSE;
+    }
+
+	// checksum comparasion
+	{
+		mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+		if (mcf_check_check_sum((kal_uint32 *)output_file, output_header->file_size) != 0) {
+			mcf_ut_format_err_str("Merge OTA buffer checksim failed!!\r\n");
+			return KAL_FALSE;
+		}
+	}
+
+	// ========== VALUE TEST : no encypted file========== //
+	{
+		mcf_t                              *pMcf = mcf_get_instance();
+		mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+		mcf_tool_file_info_t               *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+		nvram_ef_mcf_test_struct                test_lid_buffer;
+		mcf_tool_file_info_t *file_header;
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_ut_gid_normal.mcfota");
+		file1 = fopen(ota_data_path, "rb");
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_QUERY_ut_gid_normal.mcfota");
+		file2 = fopen(ota_data_path, "rb");
+
+		if (file1 != NULL && file2 != NULL)
+		{
+			kal_mem_set(test_file1, 0, sizeof(test_file1));
+			fread(test_file1, sizeof(test_file1), 1, file1);
+			fclose(file1);
+			kal_mem_set(test_file2, 0, sizeof(test_file2));
+			fread(test_file2, sizeof(test_file2), 1, file2);
+			fclose(file2);
+		}
+		else {
+			mcf_ut_format_err_str("Merge OTA open file failed!!\r\n");
+			return KAL_FALSE;
+		}
+		file_header = (mcf_tool_file_info_t *)test_file2;
+		file_header->operation_mask |= MCF_FILE_OP_AES_128;
+		ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Merge OTA buffer failed!!\r\n");
+			return KAL_FALSE;
+		}
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_GID_MERGE.mcfota");
+		file1 = fopen(ota_data_path, "wb");
+
+		if (file1 != NULL)
+		{
+			mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+			fwrite(output_file, 1, output_header->file_size, file1);
+			fclose(file1);
+		}
+		else {
+			return KAL_FALSE;
+		}
+
+		if (ota_file) {
+			ret = mcf_ut_open_test_data("MCF_OTA_GID_MERGE.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+			if (ret == KAL_FALSE) {
+				mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_GID_MERGE.mcfota");
+				return KAL_FALSE;
+			}
+		}
+		else {
+			mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+
+		mcf_ret = mcf_do_ota_full();
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_test_lid_value(NULL);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Do full OTA positive test FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+
+		// Record index 1
+		kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+		mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+
+		// Record index 2
+		kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+		mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 2, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+	}
+    // ========== VALUE TEST : encypted file========== //
+	{
+		mcf_t                              *pMcf = mcf_get_instance();
+		mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+		mcf_tool_file_info_t               *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+		nvram_ef_mcf_test_struct                test_lid_buffer;
+		mcf_tool_file_info_t *file_header;
+        kal_char password[32] = {0};
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_ut_gid_normal_AES256_RSA3072.mcfota");
+		file1 = fopen(ota_data_path, "rb");
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_QUERY_ut_gid_normal_AES256_RSA3072.mcfota");
+		file2 = fopen(ota_data_path, "rb");
+
+		if (file1 != NULL && file2 != NULL)
+		{
+			kal_mem_set(test_file1, 0, sizeof(test_file1));
+			fread(test_file1, sizeof(test_file1), 1, file1);
+			fclose(file1);
+			kal_mem_set(test_file2, 0, sizeof(test_file2));
+			fread(test_file2, sizeof(test_file2), 1, file2);
+			fclose(file2);
+		}
+		else {
+			mcf_ut_format_err_str("Merge OTA open file failed!!\r\n");
+			return KAL_FALSE;
+		}
+        
+        // decrypt input file
+        file_header = (mcf_tool_file_info_t *)test_file1;
+        mcf_get_custom_aes_password(password);
+        if (mcf_decrypt_256bit(password, (kal_char *)file_header + file_header->total_len, (file_header->file_size - file_header->total_len)) != KAL_TRUE)
+            return KAL_FALSE;
+        
+        file_header = (mcf_tool_file_info_t *)test_file2;
+        if (mcf_decrypt_256bit(password, (kal_char *)file_header + file_header->total_len, (file_header->file_size - file_header->total_len)) != KAL_TRUE)
+            return KAL_FALSE;
+
+        
+		ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Merge OTA buffer failed!!\r\n");
+			return KAL_FALSE;
+		}
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_GID_MERGE_AES256.mcfota");
+		file1 = fopen(ota_data_path, "wb");
+
+		if (file1 != NULL)
+		{
+			mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+			fwrite(output_file, 1, output_header->file_size, file1);
+			fclose(file1);
+		}
+		else {
+			return KAL_FALSE;
+		}
+
+		if (ota_file) {
+			ret = mcf_ut_open_test_data("MCF_OTA_GID_MERGE_AES256.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+			if (ret == KAL_FALSE) {
+				mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_GID_MERGE_AES256.mcfota");
+				return KAL_FALSE;
+			}
+		}
+		else {
+			mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+
+		mcf_ret = mcf_do_ota_full();
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_test_lid_value(NULL);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Do full OTA positive test FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+
+		// Record index 1
+		kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+		mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+
+		// Record index 2
+		kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+		mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 2, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+			return KAL_FALSE;
+		}
+
+		ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+	}
+    
+    // ========== BIG FILE TEST ========== //
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_ut_big_size.mcfota");
+    file1 = fopen(ota_data_path, "rb");
+    
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_ut_big_size.mcfota");
+    file2 = fopen(ota_data_path, "rb");
+    
+    if(file1 != NULL && file2 != NULL)
+    {
+        kal_mem_set(test_file1, 0, sizeof(test_file1));
+        fread(test_file1, sizeof(test_file1), 1, file1);
+        fclose(file1);
+        kal_mem_set(test_file2, 0, sizeof(test_file2));
+        fread(test_file2, sizeof(test_file2), 1, file2);
+        fclose(file2);
+    } else {
+        mcf_ut_format_err_str("Merge OTA open file failed!!\r\n");
+        return KAL_FALSE;
+    }
+    ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+    if (ret == KAL_FALSE){
+        mcf_ut_format_err_str("Merge OTA buffer failed!!\r\n");
+        return KAL_FALSE;
+    }
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+kal_bool mcf_merge_ota_by_op_file_ut(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	kal_char ota_data_path[512];
+	kal_bool ret = KAL_FALSE;
+	FILE *file1, *file2;
+	kal_char *pos;
+
+	getcwd(ota_data_path, sizeof(ota_data_path));
+	pos = strstr(ota_data_path, "mcu");
+	kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MTK_OPOTA_SBPID_1.mcfopota");
+	file1 = fopen(ota_data_path, "rb");
+
+	getcwd(ota_data_path, sizeof(ota_data_path));
+	pos = strstr(ota_data_path, "mcu");
+	kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MTK_OPOTA_SBPID_2.mcfopota");
+	file2 = fopen(ota_data_path, "rb");
+
+	if (file1 != NULL && file2 != NULL)
+	{
+		kal_mem_set(test_file1, 0, sizeof(test_file1));
+		fread(test_file1, sizeof(test_file1), 1, file1);
+		fclose(file1);
+		kal_mem_set(test_file2, 0, sizeof(test_file2));
+		fread(test_file2, sizeof(test_file2), 1, file2);
+		fclose(file2);
+	}
+	else {
+		mcf_ut_format_err_str("Merge OTA by OP open file failed!!\r\n");
+		return KAL_FALSE;
+	}
+	ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Merge OTA by OP buffer failed!!\r\n");
+		return KAL_FALSE;
+	}
+	// checksum comparasion
+	{
+		mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+		if (mcf_check_check_sum((kal_uint32 *)output_file, output_header->file_size) != 0) {
+			mcf_ut_format_err_str("Merge OTA by OP buffer checksim failed!!\r\n");
+			return KAL_FALSE;
+		}
+	}
+	// ========== VALUE TEST : no encrypted file========== //
+	{
+		mcf_t                                  *pMcf = mcf_get_instance();
+		mcf_tool_file_info_t                   *pFile;
+		mcf_tool_gid_tlvota_file_item_t        *pItem;
+		mcf_tlvota_file_t                      *tlvota_file;
+		nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+		nvram_ef_mcf_test_struct                test_lid_buffer;
+		nvram_ef_mcf_test_struct                empty_buffer = { 0 };
+		mcf_tlvota_sbp_tag_t                    sbp_tag;
+		kal_uint8                               i;
+		mcf_ota_result_e                        mcf_ret;
+		kal_bool                                ret;
+		mcf_tool_file_info_t *file_header;
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_TLVOTA_SBP_full_ut_gid_normal.mcfopota");
+		file1 = fopen(ota_data_path, "rb");
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota");
+		file2 = fopen(ota_data_path, "rb");
+
+		if (file1 != NULL && file2 != NULL)
+		{
+			kal_mem_set(test_file1, 0, sizeof(test_file1));
+			fread(test_file1, sizeof(test_file1), 1, file1);
+			fclose(file1);
+			kal_mem_set(test_file2, 0, sizeof(test_file2));
+			fread(test_file2, sizeof(test_file2), 1, file2);
+			fclose(file2);
+		}
+		else {
+			mcf_ut_format_err_str("Merge OTA open file failed!!\r\n");
+			return KAL_FALSE;
+		}
+		file_header = (mcf_tool_file_info_t *)test_file2;
+		//file_header->operation_mask |= MCF_FILE_OP_AES_128;
+		ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Merge OTA buffer failed!!\r\n");
+			return KAL_FALSE;
+		}
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_BY_OP_GID_MERGE.mcfota");
+		file1 = fopen(ota_data_path, "wb");
+
+		if (file1 != NULL)
+		{
+			mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+			fwrite(output_file, 1, output_header->file_size, file1);
+			fclose(file1);
+		}
+		else {
+			return KAL_FALSE;
+		}
+		/*
+		 *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+		 *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches SBP_FULL_TAG (12_33_21)
+		 */
+		 /* Fill TLV-OTA file into buffer */
+		for (i = 0; i < MAX_SIM_NUM; i++) {
+			tlvota_file = &(pMcf->tlvota_file[i]);
+
+			if (tlvota_file) {
+				pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+				pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+				ret = mcf_ut_open_test_data("MCF_OTA_BY_OP_GID_MERGE.mcfota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+				if (ret == KAL_FALSE) {
+					mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_BY_OP_GID_MERGE.mcfota");
+					return KAL_FALSE;
+				}
+
+			}
+			else {
+				mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+				return KAL_FALSE;
+			}
+		}
+
+		// NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+		kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+		sbp_tag.sbp_id = SBP_TAG_SBPID;
+		strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+		for (i = 0; i < MAX_SIM_NUM; i++) {
+			kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+			mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+			if (mcf_ret != MCF_OTA_R_SUCCESS) {
+				mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+				return KAL_FALSE;
+			}
+
+			ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+			if (ret == KAL_FALSE) {
+				mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+				return KAL_FALSE;
+			}
+		}
+	}
+    
+    // ========== VALUE TEST : encrypted file========== //
+	{
+		mcf_t                                  *pMcf = mcf_get_instance();
+		mcf_tool_file_info_t                   *pFile;
+		mcf_tool_gid_tlvota_file_item_t        *pItem;
+		mcf_tlvota_file_t                      *tlvota_file;
+		nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+		nvram_ef_mcf_test_struct                test_lid_buffer;
+		nvram_ef_mcf_test_struct                empty_buffer = { 0 };
+		mcf_tlvota_sbp_tag_t                    sbp_tag;
+		kal_uint8                               i;
+		mcf_ota_result_e                        mcf_ret;
+		kal_bool                                ret;
+		mcf_tool_file_info_t *file_header;
+        kal_char password[32] = {0};
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_TLVOTA_SBP_full_ut_gid_normal_AES256_RSA3072.mcfopota");
+		file1 = fopen(ota_data_path, "rb");
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_TLVOTA_SBP_partial_ut_gid_normal_AES256_RSA3072.mcfopota");
+		file2 = fopen(ota_data_path, "rb");
+
+		if (file1 != NULL && file2 != NULL)
+		{
+			kal_mem_set(test_file1, 0, sizeof(test_file1));
+			fread(test_file1, sizeof(test_file1), 1, file1);
+			fclose(file1);
+			kal_mem_set(test_file2, 0, sizeof(test_file2));
+			fread(test_file2, sizeof(test_file2), 1, file2);
+			fclose(file2);
+		}
+		else {
+			mcf_ut_format_err_str("Merge OTA open file failed!!\r\n");
+			return KAL_FALSE;
+		}
+        
+        // decrypt input file
+        file_header = (mcf_tool_file_info_t *)test_file1;
+        mcf_get_custom_aes_password(password);
+        if (mcf_decrypt_256bit(password, (kal_char *)file_header + file_header->total_len, (file_header->file_size - file_header->total_len)) != KAL_TRUE)
+            return KAL_FALSE;
+        
+        file_header = (mcf_tool_file_info_t *)test_file2;
+        if (mcf_decrypt_256bit(password, (kal_char *)file_header + file_header->total_len, (file_header->file_size - file_header->total_len)) != KAL_TRUE)
+            return KAL_FALSE;
+    
+		ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Merge OTA buffer failed!!\r\n");
+			return KAL_FALSE;
+		}
+
+		getcwd(ota_data_path, sizeof(ota_data_path));
+		pos = strstr(ota_data_path, "mcu");
+		kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MCF_OTA_BY_OP_GID_MERGE_AES256.mcfota");
+		file1 = fopen(ota_data_path, "wb");
+
+		if (file1 != NULL)
+		{
+			mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+			fwrite(output_file, 1, output_header->file_size, file1);
+			fclose(file1);
+		}
+		else {
+			return KAL_FALSE;
+		}
+		/*
+		 *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+		 *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches SBP_FULL_TAG (12_33_21)
+		 */
+		 /* Fill TLV-OTA file into buffer */
+		for (i = 0; i < MAX_SIM_NUM; i++) {
+			tlvota_file = &(pMcf->tlvota_file[i]);
+
+			if (tlvota_file) {
+                l4c_mcf_path_type_enum *apply_path_type;
+                kal_char               apply_filename[256],
+				pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+				pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+				ret = mcf_ut_open_test_data("MCF_OTA_BY_OP_GID_MERGE_AES256.mcfota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+                mcf_read_tlvota_file(KAL_FALSE, i, "", "", &apply_path_type, apply_filename, pMcf); 
+				if (ret == KAL_FALSE) {
+					mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_BY_OP_GID_MERGE_AES256.mcfota");
+					return KAL_FALSE;
+				}
+
+			}
+			else {
+				mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+				return KAL_FALSE;
+			}
+		}
+
+		// NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+		kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+		sbp_tag.sbp_id = SBP_TAG_SBPID;
+		strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+		for (i = 0; i < MAX_SIM_NUM; i++) {
+			kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+			mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+			if (mcf_ret != MCF_OTA_R_SUCCESS) {
+				mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+				return KAL_FALSE;
+			}
+
+			ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+			if (ret == KAL_FALSE) {
+				mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+				return KAL_FALSE;
+			}
+		}
+	}
+	MCF_UT_PASS();
+	return KAL_TRUE;
+}
+
+kal_uint8 gid_buffer[256];
+kal_bool mcf_merge_one_gid_ut(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	kal_bool ret = KAL_FALSE;
+	mcf_tool_gid_ota_file_item_t *ota_gid;
+	mcf_tool_gid_tlvota_file_item_t *ota_by_op_gid;
+	kal_uint32 *value;
+
+	kal_mem_set(gid_buffer, 0, sizeof(gid_buffer));
+	ota_gid = gid_buffer;
+	ota_gid->global_id = 5103;
+	ota_gid->record_idx = 1;
+	ota_gid->value_len = 4;
+	value = &ota_gid->buff_start;
+	*value = 6;
+	ota_gid->total_len = (kal_uint32)&ota_gid->buff_start + ota_gid->value_len - (kal_uint32)gid_buffer;
+
+	mcf_merge_one_gid(ota_gid, MCF_TYPE_OTA, output_file, sizeof(output_file), MCF_FILE_OP_CHECKSUM);
+	// check result
+	{
+		mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+		kal_uint8 *current_pos = NULL;
+		if (output_header->item_num != 1) {
+			mcf_ut_format_err_str("Merge one gid item_num FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+		if (output_header->operation_mask != MCF_FILE_OP_CHECKSUM) {
+			mcf_ut_format_err_str("Merge one gid mask FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+		if (mcf_check_check_sum((kal_uint32 *)output_file, output_header->file_size) != 0) {
+			mcf_ut_format_err_str("Merge one gid checksum failed!!\r\n");
+			return KAL_FALSE;
+		}
+		current_pos = (kal_uint8 *)output_header + output_header->total_len;
+		if (kal_mem_cmp(ota_gid, current_pos, ota_gid->total_len)) {
+			mcf_ut_format_err_str("Merge one gid value failed!!\r\n");
+			return KAL_FALSE;
+		}
+	}
+
+	kal_mem_set(gid_buffer, 0, sizeof(gid_buffer));
+	ota_by_op_gid = gid_buffer;
+	ota_by_op_gid->global_id = 5103;
+	ota_by_op_gid->value_len = 4;
+	
+	ota_by_op_gid->tag_type = MCF_TLVOTA_TAG_SBPID;
+	ota_by_op_gid->tag_len = strlen(SBP_FULL_TAG);
+	strcpy((kal_uint32)&ota_by_op_gid->buff_start, SBP_FULL_TAG);
+	value = &ota_by_op_gid->buff_start + ota_by_op_gid->tag_len;
+	*value = 6;
+	ota_by_op_gid->total_len = (kal_uint32)&ota_by_op_gid->buff_start + ota_by_op_gid->value_len + ota_by_op_gid->tag_len - (kal_uint32)gid_buffer;
+
+	mcf_merge_one_gid(ota_by_op_gid, MCF_TYPE_OTA_BY_OP, output_file, sizeof(output_file), MCF_FILE_OP_CHECKSUM);
+	// check result
+	{
+		mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+		kal_uint8 *current_pos = NULL;
+		if (output_header->item_num != 1) {
+			mcf_ut_format_err_str("Merge one gid item_num FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+		if (output_header->operation_mask != MCF_FILE_OP_CHECKSUM) {
+			mcf_ut_format_err_str("Merge one gid mask FAIL!!\r\n");
+			return KAL_FALSE;
+		}
+		if (mcf_check_check_sum((kal_uint32 *)output_file, output_header->file_size) != 0) {
+			mcf_ut_format_err_str("Merge one gid checksum failed!!\r\n");
+			return KAL_FALSE;
+		}
+		current_pos = (kal_uint8 *)output_header + output_header->total_len;
+		if (kal_mem_cmp(ota_by_op_gid, current_pos, ota_by_op_gid->total_len)) {
+			mcf_ut_format_err_str("Merge one gid value failed!!\r\n");
+			return KAL_FALSE;
+		}
+	}
+	MCF_UT_PASS();
+	return KAL_TRUE;
+}
+
+
+kal_bool mcf_merge_ota_by_op_merge_one_gid_ut(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	kal_char ota_data_path[512];
+	kal_bool ret = KAL_FALSE;
+	FILE *file1, *file2;
+	kal_char *pos;
+
+	getcwd(ota_data_path, sizeof(ota_data_path));
+	pos = strstr(ota_data_path, "mcu");
+	kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "MTK_OPOTA_SBPID_1.mcfopota");
+	file1 = fopen(ota_data_path, "rb");
+
+	if (file1 != NULL)
+	{
+		kal_mem_set(test_file1, 0, sizeof(test_file1));
+		fread(test_file1, sizeof(test_file1), 1, file1);
+		fclose(file1);
+	}
+	else {
+		mcf_ut_format_err_str("Merge OTA by OP open file failed!!\r\n");
+		return KAL_FALSE;
+	}
+    
+	mcf_tool_gid_tlvota_file_item_t *ota_by_op_gid;
+	kal_uint32 *value;
+
+	kal_mem_set(gid_buffer, 0, sizeof(gid_buffer));
+	ota_by_op_gid = gid_buffer;
+	ota_by_op_gid->global_id = 5103;
+	ota_by_op_gid->value_len = 4;
+	
+	ota_by_op_gid->tag_type = MCF_TLVOTA_TAG_SBPID;
+	ota_by_op_gid->tag_len = strlen(SBP_FULL_TAG);
+	strcpy((kal_uint32)&ota_by_op_gid->buff_start, SBP_FULL_TAG);
+	value = &ota_by_op_gid->buff_start + ota_by_op_gid->tag_len;
+	*value = 6;
+	ota_by_op_gid->total_len = (kal_uint32)&ota_by_op_gid->buff_start + ota_by_op_gid->value_len + ota_by_op_gid->tag_len - (kal_uint32)gid_buffer;
+
+	mcf_merge_one_gid(ota_by_op_gid, MCF_TYPE_OTA_BY_OP, test_file2, sizeof(test_file2), MCF_FILE_OP_CHECKSUM);
+    
+	ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Merge OTA by OP buffer failed!!\r\n");
+		return KAL_FALSE;
+	}
+	MCF_UT_PASS();
+	return KAL_TRUE;
+}
+
+kal_bool mcf_merge_encrypted_ota_file_ut(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_char ota_data_path[512];
+    kal_bool ret = KAL_FALSE;
+    FILE *file1, *file2;
+    kal_char *pos;
+    kal_bool mcf_ret;
+    kal_char password[32] = {0};
+    mcf_tool_file_info_t *file_header;
+    
+    // ========== BASIC TEST ========== //
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "AES256_SHA256_RSA2048.mcfota");
+    file1 = fopen(ota_data_path, "rb");
+    
+    getcwd(ota_data_path, sizeof(ota_data_path));
+    pos = strstr(ota_data_path, "mcu");
+    kal_sprintf(pos + strlen("mcu"), "\\%s\\%s", MCF_UT_DB_FOLDER_PATH, "AES256_SHA384_RSA3072.mcfota");
+    file2 = fopen(ota_data_path, "rb");
+    
+    if(file1 != NULL && file2 != NULL)
+    {
+        kal_mem_set(test_file1, 0, sizeof(test_file1));
+        fread(test_file1, sizeof(test_file1), 1, file1);
+        fclose(file1);
+        kal_mem_set(test_file2, 0, sizeof(test_file2));
+        fread(test_file2, sizeof(test_file2), 1, file2);
+        fclose(file2);
+    } else {
+        mcf_ut_format_err_str("Merge OTA open file failed!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    // decrypt input file
+    file_header = (mcf_tool_file_info_t *)test_file1;
+    mcf_get_custom_aes_password(password);
+    if (mcf_decrypt_256bit(password, (kal_char *)file_header + file_header->total_len, (file_header->file_size - file_header->total_len)) != KAL_TRUE)
+        return KAL_FALSE;
+    
+    file_header = (mcf_tool_file_info_t *)test_file2;
+    if (mcf_decrypt_256bit(password, (kal_char *)file_header + file_header->total_len, (file_header->file_size - file_header->total_len)) != KAL_TRUE)
+        return KAL_FALSE;
+    
+    ret = mcf_merge_ota_buffer(test_file1, test_file2, output_file, sizeof(output_file));
+    if (ret == KAL_FALSE){
+        mcf_ut_format_err_str("Merge OTA buffer failed!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    // decrypt merge file
+    file_header = (mcf_tool_file_info_t *)output_file;
+    if (mcf_decrypt_256bit(password, (kal_char *)file_header + file_header->total_len, (file_header->file_size - file_header->total_len)) != KAL_TRUE)
+        return KAL_FALSE;
+
+    // checksum comparasion
+    {
+        mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)output_file;
+        if (mcf_check_check_sum((kal_uint32 *)output_file, output_header->file_size) != 0) {
+            mcf_ut_format_err_str("Merge OTA buffer checksim failed!!\r\n");
+            return KAL_FALSE;
+        }
+    }
+
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+kal_bool mcf_ut_combined_ota_file(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	mcf_t                              *pMcf = mcf_get_instance();
+    mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+    mcf_tool_file_info_t               *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+    nvram_ef_mcf_sw_info_struct         nv_sw_info;
+    kal_uint8                          *lid_buffer;
+    nvram_ef_mcf_test_struct            empty_buffer = {0};
+    mcf_ota_result_e                    mcf_ret;
+    kal_bool                            ret;
+    kal_uint32                          i;
+    nvram_ef_mcf_test_struct            nv_lid_buffer;
+	nvram_ef_mcf_test_struct            test_lid_buffer;
+	l4c_mcf_set_config_req_struct      *assigned_file_req;
+	l4c_mcf_set_config_req_struct      *combined_file_req;
+    mcf_tool_gid_tlvota_file_item_t        *pItem;
+    mcf_tlvota_file_t                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+    mcf_tlvota_sbp_tag_t                    sbp_tag;
+    sbp_reconfig_custom_param_struct        param_ptr;
+
+
+    mcf_ut_init();
+
+    /*
+     *  Merge two file positive test - Same path
+     */
+	
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+	
+	assigned_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	assigned_file_req->op = L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH;
+	assigned_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	assigned_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(assigned_file_req->config1,"MCF_OTA_ut_merge.mcfota");
+	
+	if(mcf_assign_combined_file_path(assigned_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Assign combined OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	free_local_para((local_para_struct *)assigned_file_req);
+	
+	/* First apply MCF_OTA_ut_gid_normal - reset */
+	
+	combined_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_OTA_ut_normal.mcfota");
+	combined_file_req->reset = KAL_TRUE;
+	
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	/* Second. apply MCF_OTA_QUERY_ut_gid_normal.mcfota - append */
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_OTA_QUERY_ut_gid_normal.mcfota");
+	combined_file_req->reset = KAL_FALSE;
+
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(mcf_file_buffer, ota_file->buff, MCF_MAX_OTA_FILE_SIZE);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+	if (ota_file) {
+		if(mcf_merge_ota_buffer(mcf_file_buffer, ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
+			mcf_ut_format_err_str("Merge OTA file FAIL!!\r\n");
+			ret = KAL_FALSE;
+			MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+			return ret;
+		}
+			MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+	}
+	
+	free_local_para((local_para_struct *)combined_file_req);
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	if(strcmp(nv_ota_file.path,MCF_FS_CUSTOM_FOLDER_PATH) != 0){
+		mcf_ut_format_err_str("Fail to store file path!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(nv_ota_file.name,"MCF_OTA_ut_merge.mcfota") != 0){
+		mcf_ut_format_err_str("Fail to store file name!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy((kal_char *)(ota_file->buff), mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (Both SW verno of file and MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	//first reset NVRAM_EF_MCF_TEST_OTA_LID
+	ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_QUERY_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	/*
+     *  Merge two file positive test - different path
+     */
+	
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+	
+	/* Reset NVRAM_EF_MCF_INTERNAL_INFO_LID */
+    kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write NVRAM_EF_MCF_INTERNAL_INFO_LID to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	assigned_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	assigned_file_req->op = L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH;
+	assigned_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	assigned_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(assigned_file_req->config1,"MCF_OTA_ut_merge.mcfota");
+	
+	if(mcf_assign_combined_file_path(assigned_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Assign combined OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	free_local_para((local_para_struct *)assigned_file_req);
+	
+	/* First apply MCF_OTA_ut_gid_normal - reset */
+	
+	combined_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_OTA_ut_normal.mcfota");
+	combined_file_req->reset = KAL_TRUE;
+	
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+
+	/* Second. apply MCF_OTA_QUERY_ut_gid_normal.mcfota - append */
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_OTA_QUERY_ut_gid_normal.mcfota");
+	combined_file_req->reset = KAL_FALSE;
+
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(mcf_file_buffer, ota_file->buff, MCF_MAX_OTA_FILE_SIZE);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+	if (ota_file) {
+		if(mcf_merge_ota_buffer(mcf_file_buffer, ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
+			mcf_ut_format_err_str("Merge OTA file FAIL!!\r\n");
+			ret = KAL_FALSE;
+			MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+			return ret;
+		}
+			MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+	}
+	
+	free_local_para((local_para_struct *)combined_file_req);
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	if(strcmp(nv_ota_file.path,MCF_FS_CUSTOM_FOLDER_PATH) != 0){
+		mcf_ut_format_err_str("Fail to store file path!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(nv_ota_file.name,"MCF_OTA_ut_merge.mcfota") != 0){
+		mcf_ut_format_err_str("Fail to store file name!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy((kal_char *)(ota_file->buff), mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (Both SW verno of file and MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	//first reset, second append
+	ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_QUERY_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	/*
+     *  Merge two file positive test - Same path - both of reset
+     */
+	
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+	
+	/* Reset NVRAM_EF_MCF_INTERNAL_INFO_LID */
+    kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write NVRAM_EF_MCF_INTERNAL_INFO_LID to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	/* Reset NVRAM_EF_MCF_INTERNAL_INFO_LID */
+    kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+	
+	assigned_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	assigned_file_req->op = L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH;
+	assigned_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	assigned_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(assigned_file_req->config1,"MCF_OTA_ut_merge.mcfota");
+	
+	if(mcf_assign_combined_file_path(assigned_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Assign combined OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	free_local_para((local_para_struct *)assigned_file_req);
+	
+	/* First. apply MCF_OTA_QUERY_ut_gid_normal.mcfota - reset */
+	combined_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_OTA_QUERY_ut_gid_normal.mcfota");
+	combined_file_req->reset = KAL_TRUE;
+	
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	/* Second apply MCF_OTA_ut_gid_normal - reset */
+
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_OTA_ut_gid_normal.mcfota");
+	combined_file_req->reset = KAL_TRUE;
+	
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+
+	free_local_para((local_para_struct *)combined_file_req);
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	if(strcmp(nv_ota_file.path,MCF_FS_CUSTOM_FOLDER_PATH) != 0){
+		mcf_ut_format_err_str("Fail to store file path!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(nv_ota_file.name,"MCF_OTA_ut_gid_normal.mcfota") != 0){
+		mcf_ut_format_err_str("Fail to store file name!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (Both SW verno of file and MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	//Due to reset, need to reset
+
+	ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    if (kal_mem_cmp(&test_lid_buffer, &empty_buffer, sizeof(nvram_ef_mcf_test_struct)) != 0) {
+        mcf_ut_format_err_str("Reset LID FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	/*
+     *  Merge two file positive test - Same path - both of append
+     */
+	
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    
+    kal_mem_set(&mcf_last_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_curr_mod_lid_g, 0, sizeof(nvram_mcf_lid_info_struct));
+	
+	/* Reset NVRAM_EF_MCF_INTERNAL_INFO_LID */
+    kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write NVRAM_EF_MCF_INTERNAL_INFO_LID to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	assigned_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	assigned_file_req->op = L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH;
+	assigned_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	assigned_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(assigned_file_req->config1,"MCF_OTA_ut_merge.mcfota");
+	
+	if(mcf_assign_combined_file_path(assigned_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Assign combined OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	free_local_para((local_para_struct *)assigned_file_req);
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_set(ota_file->buff, 0, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	/* First. apply MCF_OTA_QUERY_ut_gid_normal.mcfota - append */
+	combined_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_OTA_QUERY_ut_gid_normal.mcfota");
+	combined_file_req->reset = KAL_FALSE;
+	
+    MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_QUERY_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_QUERY_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+
+	/* Second apply MCF_OTA_ut_gid_normal - append */
+
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_OTA_ut_normal.mcfota");
+	combined_file_req->reset = KAL_FALSE;
+	
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(mcf_file_buffer, ota_file->buff, MCF_MAX_OTA_FILE_SIZE);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+	if (ota_file) {
+		if(mcf_merge_ota_buffer(mcf_file_buffer, ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
+			mcf_ut_format_err_str("Merge OTA file FAIL!!\r\n");
+			ret = KAL_FALSE;
+			MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+			return ret;
+		}
+			MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+	}
+
+	free_local_para((local_para_struct *)combined_file_req);
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+	if(strcmp(nv_ota_file.path,MCF_FS_CUSTOM_FOLDER_PATH) != 0){
+		mcf_ut_format_err_str("Fail to store file path!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(nv_ota_file.name,"MCF_OTA_ut_merge.mcfota") != 0){
+		mcf_ut_format_err_str("Fail to store file name!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+		kal_mem_cpy((kal_char *)(ota_file->buff), mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (Both SW verno of file and MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	//Due to append, no need to reset
+	ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_QUERY_LID);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+    mcf_ret = mcf_read_ota_buffer(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 1, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Read OTA by LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Read OTA by LID positive test FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	//Deactive combine OTA
+	combined_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"");
+	combined_file_req->reset = KAL_FALSE;
+	
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        ret = mcf_ut_open_test_data("MCF_OTA_ut_gid_normal.mcfota", (kal_char *)(ota_file->buff), MCF_MAX_OTA_FILE_SIZE);
+        if (ret == KAL_FALSE) {
+            mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_OTA_ut_gid_normal.mcfota");
+            return KAL_FALSE;
+        }
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	free_local_para((local_para_struct *)combined_file_req);
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+	if(strcmp(nv_ota_file.path,"") != 0){
+		mcf_ut_format_err_str("Fail to store file path!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(nv_ota_file.name,"") != 0){
+		mcf_ut_format_err_str("Fail to store file name!!\r\n");
+        return KAL_FALSE;
+	}
+
+    mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Do full OTA FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_test_lid_value(NULL);
+    if (ret == KAL_FALSE) {
+        mcf_ut_format_err_str("Do full OTA positive test (Both SW verno of file and MD mismatch) FAIL!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	ret = mcf_check_lid_need_reset(NVRAM_EF_MCF_TEST_OTA_LID);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+	
+	
+	/*
+     *  Read TLV-OTA by LID & sbp_tag positive test - partially matched tag
+     *  NVRAM_EF_MCF_TEST_OTA_LID with tag SBP_PARTIAL_TAG (12_NA_NA), but user searches SBP_FULL_TAG (12_33_21)
+     */
+    /* Fill TLV-OTA file into buffer */
+	/*Merge two OP-OTA file positive test - Same path */
+	
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	/* Reset NVRAM_EF_MCF_INTERNAL_INFO_LID */
+    kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write NVRAM_EF_MCF_INTERNAL_INFO_LID to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	/*Assign merged file name*/
+	assigned_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	assigned_file_req->op = L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH;
+	assigned_file_req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+	assigned_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(assigned_file_req->config1,"MCF_OPOTA_ut_merge.mcfopota");
+	
+	if(mcf_assign_combined_file_path(assigned_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Assign combined OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	free_local_para((local_para_struct *)assigned_file_req);
+
+	/* First. apply MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota - reset */
+	combined_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota");
+	combined_file_req->reset = KAL_TRUE;
+    
+	tlvota_file = &(pMcf->tlvota_file[0]);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota");
+			return KAL_FALSE;
+		}
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+
+	
+	/* Second. apply MCF_TLVOTA_SBP_full_ut_gid_query_normal.mcfopota - append */
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_TLVOTA_SBP_full_ut_gid_query_normal.mcfopota");
+	combined_file_req->reset = KAL_FALSE;
+    
+	tlvota_file = &(pMcf->tlvota_file[0]);
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	//Due to append, no need to reset
+	ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, 0);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_QUERY_LID, 0);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 3 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+	
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		kal_mem_cpy(mcf_file_buffer, (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_full_ut_gid_query_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_full_ut_gid_query_normal.mcfopota");
+			return KAL_FALSE;
+		}
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	
+	MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		if(mcf_merge_ota_buffer(mcf_file_buffer, tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
+			//XXX
+			ret = MCF_OTA_R_INVALID_PARAMETER;
+			MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			return ret;
+		}
+		MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	}
+	
+	free_local_para((local_para_struct *)combined_file_req);
+    
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLVOTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+	if(strcmp(nv_tlvota_file.path,MCF_FS_CUSTOM_FOLDER_PATH) != 0){
+		mcf_ut_format_err_str("Fail to store file path!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(nv_tlvota_file.name,"MCF_OPOTA_ut_merge.mcfopota") != 0){
+		mcf_ut_format_err_str("Fail to store file name!!\r\n");
+        return KAL_FALSE;
+	}
+
+	MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+		MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	}
+
+    // NVRAM_EF_MCF_TEST_OTA_LID with SBP_PARTIAL_TAG
+    kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+
+    
+	kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+	mcf_ret = mcf_read_tlvota_buffer_sbp_tag(0, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+	if (mcf_ret != MCF_OTA_R_SUCCESS) {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", 0, mcf_ret);
+		return KAL_FALSE;
+	}
+
+	ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+		return KAL_FALSE;
+	}
+	
+	kal_mem_set(&test_lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+	mcf_ret = mcf_read_tlvota_buffer_sbp_tag(0, sbp_tag, NVRAM_EF_MCF_TEST_OTA_QUERY_LID, (kal_uint8 *)&test_lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+	if (mcf_ret != MCF_OTA_R_SUCCESS) {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", 0, mcf_ret);
+		return KAL_FALSE;
+	}
+
+	ret = mcf_check_test_lid_value((kal_uint8 *)&test_lid_buffer);
+	if (ret == KAL_FALSE) {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag positive test (partially matched tag) FAIL!!\r\n");
+		return KAL_FALSE;
+	}
+    
+    /* Test By OP merged reset */
+    
+    /* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	/* Reset NVRAM_EF_MCF_INTERNAL_INFO_LID */
+    kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write NVRAM_EF_MCF_INTERNAL_INFO_LID to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	/*Assign merged file name*/
+	assigned_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	assigned_file_req->op = L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH;
+	assigned_file_req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+	assigned_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(assigned_file_req->config1,"MCF_OPOTA_ut_merge.mcfopota");
+	
+	if(mcf_assign_combined_file_path(assigned_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Assign combined OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	free_local_para((local_para_struct *)assigned_file_req);
+
+	/* First. apply MCF_TLVOTA_SBP_partial_ut_3LIDs_gid_normal.mcfopota - reset */
+	combined_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_TLVOTA_SBP_partial_ut_3LIDs_gid_normal.mcfopota");
+	combined_file_req->reset = KAL_TRUE;
+    
+	tlvota_file = &(pMcf->tlvota_file[0]);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_3LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_3LIDs_gid_normal.mcfopota");
+			return KAL_FALSE;
+		}
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+
+	
+	/* Second. apply MCF_TLVOTA_SBP_partial_ut_2LIDs_gid_normal.mcfopota - append */
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_TLVOTA_SBP_partial_ut_2LIDs_gid_normal.mcfopota");
+	combined_file_req->reset = KAL_FALSE;
+    combined_file_req->trigger_dsbp = KAL_TRUE;
+    
+	tlvota_file = &(pMcf->tlvota_file[0]);
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		kal_mem_cpy(mcf_file_buffer, (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_2LIDs_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_2LIDs_gid_normal.mcfopota");
+			return KAL_FALSE;
+		}
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	
+	MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		if(mcf_merge_ota_buffer(mcf_file_buffer, tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
+			//XXX
+			ret = MCF_OTA_R_INVALID_PARAMETER;
+			MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			return ret;
+		}
+		MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	}
+	
+	free_local_para((local_para_struct *)combined_file_req);
+    
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLVOTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+
+	if(strcmp(nv_tlvota_file.path,MCF_FS_CUSTOM_FOLDER_PATH) != 0){
+		mcf_ut_format_err_str("Fail to store file path!!\r\n");
+        return KAL_FALSE;
+	}
+	
+	if(strcmp(nv_tlvota_file.name,"MCF_OPOTA_ut_merge.mcfopota") != 0){
+		mcf_ut_format_err_str("Fail to store file name!!\r\n");
+        return KAL_FALSE;
+	}
+
+	MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+		MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	}
+    
+    param_ptr.sbp_id = SBP_TAG_SBPID; 
+    param_ptr.ps_id = 0;
+    kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    kal_mem_set(param_ptr.iccid, 0, 21);
+    
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    
+    //Due to append, no need to reset
+    ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, 0);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, 0);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, 0);
+    if (ret != KAL_FALSE) {
+        mcf_ut_format_err_str("Check LID need reset positive test (Modify 2 LIDs) FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+    
+    ret = mcf_set_config_after_dsbp(0);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("can not set config. ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    
+    //Apply MCF_TLVOTA_SBP_partial_ut_gid_normal with reset
+    
+    combined_file_req = (l4c_mcf_set_config_req_struct *)construct_local_para(sizeof(l4c_mcf_set_config_req_struct), TD_RESET);
+	combined_file_req->op = L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN;
+	combined_file_req->config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+	combined_file_req->path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+	strcpy(combined_file_req->config1,"MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota");
+	combined_file_req->reset = KAL_TRUE;
+    combined_file_req->trigger_dsbp = KAL_TRUE;
+    
+	tlvota_file = &(pMcf->tlvota_file[0]);
+
+	MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	if (tlvota_file) {
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + sizeof(mcf_tool_file_info_t));
+
+		ret = mcf_ut_open_test_data("MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota", (kal_char *)(tlvota_file->buff), MCF_MAX_TLVOTA_FILE_SIZE);
+		if (ret == KAL_FALSE) {
+			mcf_ut_format_err_str("Open test data(%s) FAIL!! \r\n", "MCF_TLVOTA_SBP_partial_ut_gid_normal.mcfopota");
+			return KAL_FALSE;
+		}
+
+		MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+	} else {
+		mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! Fail to take write lock! \r\n");
+		return KAL_FALSE;
+	}
+	
+	if(mcf_combined_ota_file(combined_file_req) != MCF_OTA_R_SUCCESS){
+		mcf_ut_format_err_str("Combine OTA fail!! \r\n");
+        return KAL_FALSE;
+	}
+    free_local_para((local_para_struct *)combined_file_req);
+    
+    param_ptr.sbp_id = SBP_TAG_SBPID; 
+    param_ptr.ps_id = 0;
+    kal_mem_cpy(param_ptr.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    kal_mem_cpy(param_ptr.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+    kal_mem_set(param_ptr.iccid, 0, 21);
+    
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("auto select tlvota file FAIL!! ret(%d) \r\n", ret);
+        return KAL_FALSE;
+    }
+    
+    //Due to reset, need to reset
+	ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_MCF_TEST_OTA_LID, 0);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset reset test FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_MCF_TEST_OTA_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_IMS_PROFILE_LID, 0);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset reset test FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_IMS_PROFILE_LID);
+        return KAL_FALSE;
+    }
+
+    ret = mcf_check_lid_need_reset_by_psid(NVRAM_EF_XCAP_PROFILE_LID, 0);
+    if (ret != KAL_TRUE) {
+        mcf_ut_format_err_str("Check LID need reset reset test FAIL!! ret(%d), LID(%d) \r\n", ret, NVRAM_EF_XCAP_PROFILE_LID);
+        return KAL_FALSE;
+    }
+    
+	
+	MCF_UT_PASS();
+	return KAL_TRUE;
+}
+
+kal_bool mcf_ut_write_variable_value(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+	kal_bool                                                ret;
+    l4c_mcf_variable_value_operation_req_struct            *req = NULL;
+    l4c_mcf_variable_value_operation_cnf_struct            *cnf = NULL;
+    mcf_ota_result_e                                        mcf_ret = MCF_OTA_R_SUCCESS;
+    mcf_t                                                  *pMcf = mcf_get_instance();
+    mcf_ota_file_t                                         *ota_file = &(pMcf->ota_file);
+    mcf_tool_file_info_t                                   *pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    nvram_ef_mcf_ota_file_info_struct                       nv_ota_file;
+    nvram_ef_mcf_sw_info_struct                             nv_sw_info;
+    mcf_tlvota_file_t                                      *tlvota_file;
+    nvram_ef_mcf_tlvota_file_info_struct                    nv_tlvota_file;
+    mcf_tlvota_sbp_tag_t                                    sbp_tag;
+    kal_uint8                                               i;
+    kal_uint8                                               test_pattern[512];
+    kal_uint8                                               array_tag[16];
+    nvram_ef_mcf_test_struct                                nv_lid_buffer;
+	kal_uint32                                              int_value;
+	kal_char                                                value[256];
+	kal_uint16                                               sh_value;
+	nvram_ef_mcf_test_struct                                lid_buffer;
+	l4c_mcf_variable_value_operation_req_struct            *query_req = NULL;
+    l4c_mcf_variable_value_operation_cnf_struct            *query_cnf = NULL;
+	double                                                  db_value;
+	float                                                   fl_value;
+	kal_uint8                                               ch_value;
+
+    mcf_ut_init();
+	
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+     //Byte operation - VAL_BYTE_11
+	req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+44;
+    req->rec_id = 1;
+    req->len = 1;
+    kal_mem_set(array_tag, 0, 16);
+    strcpy(req->config, array_tag);
+	int_value = 64;
+	mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_byte_11), 1, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BYTE_11, %s, %s\r\n", req->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BYTE_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //Bit operation - VAL_BIT_BYTE_11
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+18;
+    req->rec_id = 1;
+    req->len = 0;
+    kal_mem_set(array_tag, 0, 16);
+    strcpy(req->config, array_tag);
+	int_value = 255;
+	mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+	
+	kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_bit_byte_11), 1, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_byte_11, %s, %s\r\n", req->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_byte_11, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //Bit operation - VAL_BIT_BYTE_11.B3
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+21;
+    req->rec_id = 1;
+    req->len = 0;
+    kal_mem_set(array_tag, 0, 16);
+    strcpy(req->config, array_tag);
+	int_value = 255;
+	mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+	
+	query_req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    query_req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    query_req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    query_req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    query_req->num = MCF_TEST_OTA_LID_BASE_GID+21;
+    query_req->rec_id = 1;
+    query_req->len = 0;
+    kal_mem_set(array_tag, 0, 16);
+    strcpy(query_req->config, array_tag);
+    
+    query_cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(query_req, query_cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BIT_BYTE_11.B3");
+        return KAL_FALSE;
+    }
+
+    if(strncmp((query_cnf->value), "01", cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11.B3, %s, %s\r\n", cnf->value, "01");
+        return KAL_FALSE;
+    }
+	
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_BIT_BYTE_11.B3, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+	free_local_para((local_para_struct *)query_req);
+    free_local_para((local_para_struct *)query_cnf);
+    
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //Bit operation - val_bit_byte_12 
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+27;
+    req->rec_id = 1;
+    req->len = 1;
+    strcpy(req->config, "");
+	int_value = 16;
+	mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+	
+	kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_bit_byte_12), 1, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_bit_byte_12, %s, %s\r\n", req->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_byte_12, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //Bit operation - val_bit_byte_12.L4b
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+29;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+	int_value = 15;
+	mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+	
+	query_req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    query_req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    query_req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA;
+    query_req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    query_req->num = MCF_TEST_OTA_LID_BASE_GID+29;
+    query_req->rec_id = 1;
+    query_req->len = 0;
+    kal_mem_set(array_tag, 0, 16);
+    strcpy(query_req->config, array_tag);
+    
+    query_cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_query_variable_value(query_req, query_cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BIT_BYTE_11.B3");
+        return KAL_FALSE;
+    }
+
+    if(strncmp(query_cnf->value, "0F", cnf->len*2+2) != 0){
+        mcf_ut_format_err_str("val_bit_byte_12.F4b, %s, %s\r\n", cnf->value, "0F");
+        return KAL_FALSE;
+    }
+
+    
+    if(query_cnf->len != 1){
+        mcf_ut_format_err_str("val_bit_byte_12.F4b, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+	free_local_para((local_para_struct *)query_req);
+    free_local_para((local_para_struct *)query_cnf);
+    
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //short operation - val_short_11
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+56;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+	sh_value = 256;
+	mcf_bytes_to_hex(&sh_value, 2, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_short_11), 2, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_short_11, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 2){
+        mcf_ut_format_err_str("val_short_11, %d, %d\r\n", cnf->len, 2);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //double operation - val_double_1
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+48;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "");
+	db_value = 6.6;
+	mcf_bytes_to_hex(&db_value, 8, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+    
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_double_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_double_1, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 8){
+        mcf_ut_format_err_str("val_double_1, %d, %d\r\n", cnf->len, 8);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //buffer operation -  val_buffer_1[0]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+42;
+    req->rec_id = 1;
+    req->len = 1;
+    strcpy(req->config, "0");
+	ch_value = 'M';
+    mcf_bytes_to_hex(&ch_value, 1, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+    
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_buffer_1[0], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("val_buffer_1[0], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //float operation - val_struct_1.vfloat
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+78;
+    req->rec_id = 1;
+    req->len = 4;
+    strcpy(req->config, "");
+	fl_value = 0.4;
+    mcf_bytes_to_hex(&fl_value, 4, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_struct_1.vfloat), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_struct_1.vfloat, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("val_struct_1.vfloat, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+    
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //int in struct operation - val_struct_3[0].vint
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+125;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "0");
+	int_value = 66;
+    mcf_bytes_to_hex(&int_value, 4, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_struct_3[0].vint), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_struct_3[0].vint, %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 4){
+        mcf_ut_format_err_str("val_struct_3[0].vint, %d, %d\r\n", cnf->len, 4);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+
+    /* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //buffer in struct operation - VAL_STRUCT_3[3].VBUFFER[2][4][5]
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = MCF_TEST_OTA_LID_BASE_GID+120;
+    req->rec_id = 1;
+    req->len = 0;
+    strcpy(req->config, "3,2,4,5");
+    ch_value = 'C';
+    mcf_bytes_to_hex(&ch_value, 1, KAL_FALSE, &value);
+	strcpy((kal_char *)(req->value), value);
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_struct_3[3].vbuffer[2]), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+        mcf_ut_format_err_str("VAL_STRUCT_3[3].VBUFFER[2][4][5], %s, %s\r\n", cnf->value, test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 1){
+        mcf_ut_format_err_str("VAL_STRUCT_3[3].VBUFFER[2][4][5], %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+	
+	//Test value byte is not equal to variable size
+	
+	/* Write MCF OTA file version to NVRAM */
+    kal_mem_set(&nv_ota_file, 0, sizeof(nvram_ef_mcf_ota_file_info_struct));
+    strncpy(nv_ota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_ota_file.name, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+    kal_mem_set(&nv_sw_info, 0, sizeof(nvram_ef_mcf_sw_info_struct));
+    strncpy(nv_sw_info.last_update_file.sw_version, MCF_UT_SW_VERNO, MCF_FILE_MAX_SW_VERSION_LEN);
+    strncpy(nv_sw_info.last_update_file.gen_time, MCF_UT_GEN_TIME, MCF_FILE_MAX_GEN_TIME_LEN);
+    strcpy(nv_sw_info.last_update_file.path, "");
+    strcpy(nv_sw_info.last_update_file.name, "");
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF sw info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+    //buffer operation -  val_long_1
+    req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+    req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+    req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA;
+    req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+    req->num = 5113;
+    req->rec_id = 1;
+    req->len = 1;
+	strcpy((kal_char *)(req->value), "be15");
+    
+    cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+    mcf_ret = mcf_set_variable_value(req, cnf);
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+        return KAL_FALSE;
+    }
+	
+	MCF_W_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_cpy(ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE);
+
+        MCF_W_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        mcf_ut_format_err_str("Do full OTA FAIL!! Fail to take write lock! \r\n");
+        return KAL_FALSE;
+    }
+	
+	mcf_ret = mcf_do_ota_full();
+    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+        mcf_ut_format_err_str("Reset LID FAIL!! ret(%d) \r\n", mcf_ret);
+        return KAL_FALSE;
+    }
+	
+	if ( !nvram_external_read_data(NVRAM_EF_MCF_TEST_OTA_LID, 1, &lid_buffer, sizeof(nvram_ef_mcf_test_struct)) ) {
+		printf("Fail to read NVRAM_EF_MCF_TEST_OTA_LID!!\r\n");
+		ret = KAL_FALSE;
+	}
+    
+    kal_mem_set(test_pattern,0,512);
+    mcf_bytes_to_hex(&(lid_buffer.val_long_1), cnf->len, KAL_FALSE, &test_pattern);
+    mcf_toupper((char *)test_pattern);
+	mcf_toupper((char *)req->value);
+
+    if(strncmp(test_pattern, "BE15000000000000", cnf->len*2) != 0){
+        mcf_ut_format_err_str("val_long_1, %s, %s\r\n", "BE15000000000000", test_pattern);
+        return KAL_FALSE;
+    }
+    
+    if(cnf->len != 8){
+        mcf_ut_format_err_str("val_long_1, %d, %d\r\n", cnf->len, 1);
+        return KAL_FALSE;
+    }
+    
+    free_local_para((local_para_struct *)req);
+    free_local_para((local_para_struct *)cnf);
+	
+	/*Test TLVOTA file*/
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+44;
+		req->ps_id = i;
+		req->len = 1;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(req->config, array_tag);
+		int_value = 64;
+		mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_byte_11), 1, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("VAL_BYTE_11, %s, %s\r\n", req->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 1){
+			mcf_ut_format_err_str("VAL_BYTE_11, %d, %d\r\n", cnf->len, 1);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+    //Bit operation - VAL_BIT_BYTE_11
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+18;
+		req->ps_id = i;
+		req->len = 1;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(req->config, array_tag);
+		int_value = 255;
+		mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_bit_byte_11), 1, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("val_bit_byte_11, %s, %s\r\n", req->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 1){
+			mcf_ut_format_err_str("val_bit_byte_11, %d, %d\r\n", cnf->len, 1);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+    //Bit operation - VAL_BIT_BYTE_11.B3
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BIT_BYTE_11.B3
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+21;
+		req->ps_id = i;
+		req->len = 1;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(req->config, array_tag);
+		int_value = 255;
+		mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		query_req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		query_req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		query_req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA;
+		query_req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		query_req->num = MCF_TEST_OTA_LID_BASE_GID+21;
+		query_req->ps_id = i;
+		query_req->len = 0;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(query_req->config, array_tag);
+		
+		query_cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		mcf_ret = mcf_query_variable_value(query_req, query_cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BIT_BYTE_11.B3");
+			return KAL_FALSE;
+		}
+
+		if(strncmp(query_cnf->value, "01", cnf->len*2) != 0){
+			mcf_ut_format_err_str("VAL_BIT_BYTE_11.B3, %s, %s\r\n", cnf->value, "01");
+			return KAL_FALSE;
+		}
+		
+		
+		if(cnf->len != 1){
+			mcf_ut_format_err_str("VAL_BIT_BYTE_11.B3, %d, %d\r\n", cnf->len, 1);
+			return KAL_FALSE;
+		}
+
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+		free_local_para((local_para_struct *)query_req);
+		free_local_para((local_para_struct *)query_cnf);
+	}
+    
+	//Bit operation - val_bit_byte_12 
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+27;
+		req->ps_id = i;
+		req->len = 1;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(req->config, array_tag);
+		int_value = 16;
+		mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_bit_byte_12), 1, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("val_bit_byte_12, %s, %s\r\n", req->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 1){
+			mcf_ut_format_err_str("val_bit_byte_12, %d, %d\r\n", cnf->len, 1);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+    //Bit operation - val_bit_byte_12.L4b
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+29;
+		req->ps_id = i;
+		req->len = 1;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(req->config, array_tag);
+		int_value = 15;
+		mcf_bytes_to_hex(&int_value, 1, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		query_req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		query_req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		query_req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA;
+		query_req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		query_req->num = MCF_TEST_OTA_LID_BASE_GID+29;
+		query_req->ps_id = i;
+		query_req->len = 0;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(query_req->config, array_tag);
+		
+		query_cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		mcf_ret = mcf_query_variable_value(query_req, query_cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BIT_BYTE_11.B3");
+			return KAL_FALSE;
+		}
+
+		if(strncmp(query_cnf->value, "0F", cnf->len*2) != 0){
+			mcf_ut_format_err_str("VAL_BIT_BYTE_12.L4B, %s, %s\r\n", cnf->value, "01");
+			return KAL_FALSE;
+		}
+		
+		
+		if(query_cnf->len != 1){
+			mcf_ut_format_err_str("VAL_BIT_BYTE_12.L4B, %d, %d\r\n", cnf->len, 1);
+			return KAL_FALSE;
+		}
+
+
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+		free_local_para((local_para_struct *)query_req);
+		free_local_para((local_para_struct *)query_cnf);
+	}
+
+    //short operation - val_short_11
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+56;
+		req->ps_id = i;
+		req->len = 1;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(req->config, array_tag);
+		sh_value = 256;
+		mcf_bytes_to_hex(&sh_value, 2, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_short_11), 2, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("val_short_11, %s, %s\r\n", cnf->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 2){
+			mcf_ut_format_err_str("val_short_11, %d, %d\r\n", cnf->len, 2);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+    //double operation - val_double_1
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+48;
+		req->ps_id = i;
+		req->len = 1;
+		kal_mem_set(array_tag, 0, 16);
+		strcpy(req->config, array_tag);
+		db_value = 6.6;
+		mcf_bytes_to_hex(&db_value, 8, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_double_1), cnf->len, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("val_double_1, %s, %s\r\n", cnf->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 8){
+			mcf_ut_format_err_str("val_double_1, %d, %d\r\n", cnf->len, 8);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+    //buffer operation -  val_buffer_1[0]
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+42;
+		req->ps_id = i;
+		req->len = 1;
+		strcpy(req->config, "0");
+		ch_value = 'M';
+		mcf_bytes_to_hex(&ch_value, 1, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_buffer_1), cnf->len, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("val_buffer_1[0], %s, %s\r\n", cnf->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 1){
+			mcf_ut_format_err_str("val_buffer_1[0], %d, %d\r\n", cnf->len, 1);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+    //float operation - val_struct_1.vfloat
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+78;
+		req->ps_id = i;
+		req->len = 4;
+		strcpy(req->config, "");
+		fl_value = 0.4;
+		mcf_bytes_to_hex(&fl_value, 4, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_struct_1.vfloat), cnf->len, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("val_struct_1.vfloat, %s, %s\r\n", cnf->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 4){
+			mcf_ut_format_err_str("val_struct_1.vfloat, %d, %d\r\n", cnf->len, 4);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+    //int in struct operation - val_struct_3[0].vint
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+125;
+		req->ps_id = i;
+		req->len = 0;
+		strcpy(req->config, "0");
+		int_value = 66;
+		mcf_bytes_to_hex(&int_value, 4, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_struct_3[0].vint), cnf->len, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("val_struct_3[0].vint, %s, %s\r\n", cnf->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 4){
+			mcf_ut_format_err_str("val_struct_3[0].vint, %d, %d\r\n", cnf->len, 4);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+    //buffer in struct operation - VAL_STRUCT_3[3].VBUFFER[2][4][5]
+	/* Write MCF TLV-OTA file version to NVRAM */
+    kal_mem_set(&nv_tlvota_file, 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    strncpy(nv_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN);
+    strncpy(nv_tlvota_file.name, MCF_FS_DEFAULT_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+        mcf_ut_format_err_str("Fail to write MCF TLV-OTA file info to NVRAM!!\r\n");
+        return KAL_FALSE;
+    }
+	
+	kal_mem_set(&sbp_tag, 0, sizeof(mcf_tlvota_sbp_tag_t));
+    sbp_tag.sbp_id = SBP_TAG_SBPID;
+    strncpy(sbp_tag.mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+    strncpy(sbp_tag.mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+	
+	for (i = 0; i < MAX_SIM_NUM; i++) {
+		tlvota_file = &(pMcf->tlvota_file[i]);
+		tlvota_file->sbp_id = SBP_TAG_SBPID;
+		strncpy(tlvota_file->mcc, SBP_TAG_MCC, MAX_MCC_STR_LEN);
+		strncpy(tlvota_file->mnc, SBP_TAG_MNC, MAX_MNC_STR_LEN);
+		
+		 //Byte operation - VAL_BYTE_11
+		req = (l4c_mcf_variable_value_operation_req_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_req_struct), TD_RESET);
+		req->op = L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION;
+		req->action = L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA;
+		req->format = L4C_MCF_QUERY_VARIABLE_FORM_GID;
+		req->num = MCF_TEST_OTA_LID_BASE_GID+120;
+		req->ps_id = i;
+		req->len = 0;
+		strcpy(req->config, "3,2,4,5");
+		ch_value = 'C';
+		mcf_bytes_to_hex(&ch_value, 1, KAL_FALSE, &value);
+		strcpy((kal_char *)(req->value), value);
+		
+		cnf = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+
+		mcf_ret = mcf_set_variable_value(req, cnf);
+		if (mcf_ret != MCF_OTA_R_SUCCESS) {
+			mcf_ut_format_err_str("GID Query Variable Value (%s) FAIL!!\r\n", "VAL_BYTE_11");
+			return KAL_FALSE;
+		}
+		
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			kal_mem_cpy(tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		} else {
+			mcf_ut_format_err_str("Fail to take write lock! \r\n");
+			return KAL_FALSE;
+		}
+		
+		kal_mem_set(&lid_buffer, 0, sizeof(nvram_ef_mcf_test_struct));
+
+        mcf_ret = mcf_read_tlvota_buffer_sbp_tag(i, sbp_tag, NVRAM_EF_MCF_TEST_OTA_LID, (kal_uint8 *)&lid_buffer, sizeof(nvram_ef_mcf_test_struct));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            mcf_ut_format_err_str("Read TLV-OTA by LID & sbp_tag FAIL!! i(%d), ret(%d) \r\n", i, mcf_ret);
+            return KAL_FALSE;
+        }
+
+		kal_mem_set(test_pattern,0,512);
+		mcf_bytes_to_hex(&(lid_buffer.val_struct_3[3].vbuffer[2]), cnf->len, KAL_FALSE, &test_pattern);
+		mcf_toupper((char *)test_pattern);
+		mcf_toupper((char *)req->value);
+
+		if(strncmp((kal_char *)(req->value), test_pattern, cnf->len*2) != 0){
+			mcf_ut_format_err_str("VAL_STRUCT_3[3].VBUFFER[2][4][5], %s, %s\r\n", cnf->value, test_pattern);
+			return KAL_FALSE;
+		}
+		
+		if(cnf->len != 1){
+			mcf_ut_format_err_str("VAL_STRUCT_3[3].VBUFFER[2][4][5], %d, %d\r\n", cnf->len, 1);
+			return KAL_FALSE;
+		}
+		free_local_para((local_para_struct *)req);
+		free_local_para((local_para_struct *)cnf);
+	}
+	
+	MCF_UT_PASS();
+	return KAL_TRUE;
+}
+#endif
+
+kal_char mcf_ut_digest_file[MCF_MAX_OTA_FILE_SIZE];
+kal_bool mcf_ut_mcf_verify_digest(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz)
+{
+    kal_uint32 ret = KAL_TRUE;
+    kal_uint32 checksum = KAL_TRUE;
+    mcf_tool_file_info_t *ota_file;
+    mcf_digest *sign;
+    
+    // CASE1 : verify pure digest by SHA256+RSA2048
+    ret = mcf_ut_open_test_data("SHA256_RSA2048.mcfota", mcf_ut_digest_file, MCF_MAX_OTA_FILE_SIZE);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    ota_file = (mcf_tool_file_info_t *) mcf_ut_digest_file;
+    sign = (kal_char *)ota_file + ota_file->file_size;
+
+    ret =  mcf_verify_digest(MCF_FILE_OP_SHA256_RSA2048, ota_file, sign);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    // CASE2 : verify AES128 & digest by SHA256+RSA2048
+    
+    ret = mcf_ut_open_test_data("AES128_SHA256_RSA2048.mcfota", mcf_ut_digest_file, MCF_MAX_OTA_FILE_SIZE);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    ota_file = (mcf_tool_file_info_t *) mcf_ut_digest_file;
+    sign = (kal_char *)ota_file + ota_file->file_size;
+
+    ret =  mcf_verify_digest(MCF_FILE_OP_SHA256_RSA2048, ota_file, sign);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    {
+        kal_char   password[32] = { '\0' };
+        mcf_get_custom_aes_password(password);
+        mcf_decrypt_128bit((kal_char *)password, ((kal_char *)ota_file + ota_file->total_len), (ota_file->file_size - ota_file->total_len));
+        checksum = mcf_check_check_sum((kal_uint32 *)(ota_file), ota_file->file_size);
+        if(checksum != 0) return KAL_FALSE;
+    }
+    
+    // CASE3 : verify AES256 & digest by SHA256+RSA2048
+    
+    ret = mcf_ut_open_test_data("AES256_SHA256_RSA2048.mcfota", mcf_ut_digest_file, MCF_MAX_OTA_FILE_SIZE);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    ota_file = (mcf_tool_file_info_t *) mcf_ut_digest_file;
+    sign = (kal_char *)ota_file + ota_file->file_size;
+
+    ret =  mcf_verify_digest(MCF_FILE_OP_SHA256_RSA2048, ota_file, sign);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    {
+        kal_char   password[32] = { '\0' };
+        mcf_get_custom_aes_password(password);
+        mcf_decrypt_256bit((kal_char *)password, ((kal_char *)ota_file + ota_file->total_len), (ota_file->file_size - ota_file->total_len));
+        checksum = mcf_check_check_sum((kal_uint32 *)(ota_file), ota_file->file_size);
+        if(checksum != 0) return KAL_FALSE;
+    }
+
+    // CASE4 : verify pure digest by SHA384+RSA3072
+    ret = mcf_ut_open_test_data("SHA384_RSA3072.mcfota", mcf_ut_digest_file, MCF_MAX_OTA_FILE_SIZE);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    ota_file = (mcf_tool_file_info_t *) mcf_ut_digest_file;
+    sign = (kal_char *)ota_file + ota_file->file_size;
+
+    ret =  mcf_verify_digest(MCF_FILE_OP_SHA384_RSA3072, ota_file, sign);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+
+    // CASE5 : verify AES128 & pure digest by SHA384+RSA3072
+
+    ret = mcf_ut_open_test_data("AES128_SHA384_RSA3072.mcfota", mcf_ut_digest_file, MCF_MAX_OTA_FILE_SIZE);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    ota_file = (mcf_tool_file_info_t *) mcf_ut_digest_file;
+    sign = (kal_char *)ota_file + ota_file->file_size;
+
+    ret =  mcf_verify_digest(MCF_FILE_OP_SHA384_RSA3072, ota_file, sign);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    {
+        kal_char   password[32] = { '\0' };
+        mcf_get_custom_aes_password(password);
+        mcf_decrypt_128bit((kal_char *)password, ((kal_char *)ota_file + ota_file->total_len), (ota_file->file_size - ota_file->total_len));
+        checksum = mcf_check_check_sum((kal_uint32 *)(ota_file), ota_file->file_size);
+        if(checksum != 0) return KAL_FALSE;
+    }
+    
+    // CASE6 : verify AES256 & pure digest by SHA384+RSA3072
+
+    ret = mcf_ut_open_test_data("AES256_SHA384_RSA3072.mcfota", mcf_ut_digest_file, MCF_MAX_OTA_FILE_SIZE);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    ota_file = (mcf_tool_file_info_t *) mcf_ut_digest_file;
+    sign = (kal_char *)ota_file + ota_file->file_size;
+
+    ret =  mcf_verify_digest(MCF_FILE_OP_SHA384_RSA3072, ota_file, sign);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    {
+        kal_char   password[32] = { '\0' };
+        mcf_get_custom_aes_password(password);
+        mcf_decrypt_256bit((kal_char *)password, ((kal_char *)ota_file + ota_file->total_len), (ota_file->file_size - ota_file->total_len));
+        checksum = mcf_check_check_sum((kal_uint32 *)(ota_file), ota_file->file_size);
+        if(checksum != 0) return KAL_FALSE;
+    }
+    
+    // CASE7 : Test wrong digest for SHA256 RSA2048
+    ret = mcf_ut_open_test_data("wrong_SHA256_RSA2048.mcfota", mcf_ut_digest_file, MCF_MAX_OTA_FILE_SIZE);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    ota_file = (mcf_tool_file_info_t *) mcf_ut_digest_file;
+    sign = (kal_char *)ota_file + ota_file->file_size;
+
+    ret =  mcf_verify_digest(MCF_FILE_OP_SHA256_RSA2048, ota_file, sign);
+    if(ret == KAL_TRUE) return KAL_FALSE;
+    
+    // CASE8 : Test wrong digest for SHA384 RSA3072
+    ret = mcf_ut_open_test_data("wrong_SHA384_RSA3072.mcfota", mcf_ut_digest_file, MCF_MAX_OTA_FILE_SIZE);
+    if(ret == KAL_FALSE) return KAL_FALSE;
+    
+    ota_file = (mcf_tool_file_info_t *) mcf_ut_digest_file;
+    sign = (kal_char *)ota_file + ota_file->file_size;
+
+    ret =  mcf_verify_digest(MCF_FILE_OP_SHA384_RSA3072, ota_file, sign);
+    if(ret == KAL_TRUE) return KAL_FALSE;
+    
+    MCF_UT_PASS();
+    return KAL_TRUE;
+}
+
+/*------------------------------------------------------------------------------
+ * Public fucntions.
+ *----------------------------------------------------------------------------*/
+#define MCF_UT_CASE(_func, _param) { #_func, _func, _param }
+
+kal_bool mcf_ut_st_create(void)
+{
+    static ST_TCASE_T mcf_ut_cases_s[] = {
+		
+        MCF_UT_CASE(mcf_ut_mcf_set_file_path_dsbp_passive_mode, NULL),
+        MCF_UT_CASE(mcf_ut_mcf_set_file_path_dsbp_active_mode, NULL),
+        MCF_UT_CASE(mcf_ut_mcf_get_applied_file_path, NULL),
+#if !defined(__MTK_TARGET__)
+		MCF_UT_CASE(mcf_ut_find_ini_item, NULL),
+        MCF_UT_CASE(mcf_ut_find_ini_sbp_id, NULL),
+        MCF_UT_CASE(mcf_ut_compose_ini_item, NULL),
+        MCF_UT_CASE(mcf_ut_gid_do_ota_full, NULL),
+        MCF_UT_CASE(mcf_ut_gid_do_ota_by_lid, NULL),
+        MCF_UT_CASE(mcf_ut_gid_read_ota_buffer, NULL),
+        MCF_UT_CASE(mcf_ut_gid_read_tlvota_buffer, NULL),
+        MCF_UT_CASE(mcf_ut_gid_read_tlvota_buffer_sbp, NULL),      
+        MCF_UT_CASE(mcf_ut_gid_reset_lid_full, NULL),
+        MCF_UT_CASE(mcf_ut_gid_mcf_check_lid_need_reset, NULL),
+        MCF_UT_CASE(mcf_ut_mcf_check_ota_need_update, NULL),
+        MCF_UT_CASE(mcf_ut_mcf_get_tlvota_file_result, NULL),
+        #if defined(__MCF_COMBINE_FILE_SUPPORT__)
+            MCF_UT_CASE(mcf_ut_combined_ota_file, NULL),
+            MCF_UT_CASE(mcf_ut_write_variable_value, NULL),
+        #endif
+#endif
+#if defined(__MCF_UT_FRAMEWORK_SUPPORT__)
+        MCF_UT_CASE(mcf_utfwk_ut_test_flow, NULL),
+		MCF_UT_CASE(mcf_utfwk_sample_code_ut, NULL),
+#endif
+        MCF_UT_CASE(mcf_ut_em_update_req_hdlr, NULL),
+#if defined(__MCF_FIND_TAG_SUPPORT__)
+        MCF_UT_CASE(mcf_ut_find_tag, NULL),
+        MCF_UT_CASE(mcf_ut_config_LID, NULL),
+        #if !defined(__MTK_TARGET__)
+            MCF_UT_CASE(mcf_ut_do_ota_full, NULL),
+            MCF_UT_CASE(mcf_ut_do_ota_by_lid, NULL),
+            MCF_UT_CASE(mcf_ut_read_ota_buffer, NULL),
+            MCF_UT_CASE(mcf_ut_read_tlvota_buffer, NULL),
+            MCF_UT_CASE(mcf_ut_read_tlvota_buffer_sbp, NULL),      
+            MCF_UT_CASE(mcf_ut_reset_lid_full, NULL),
+            MCF_UT_CASE(mcf_ut_mcf_check_lid_need_reset, NULL),
+        #endif
+#endif
+#if defined(__MCF_FIND_GID_SUPPORT__)
+        MCF_UT_CASE(mcf_ut_find_gid, NULL),
+        MCF_UT_CASE(mcf_ut_query_variable_value, NULL),
+#endif
+        MCF_UT_CASE(mcf_ut_gid_mcf_check_lid_need_reset_by_psid, NULL),
+        MCF_UT_CASE(mcf_ut_mcf_encrypt_decrypt, NULL),
+        MCF_UT_CASE(mcf_ut_mcf_verify_digest, NULL),
+        #if defined(__MCF_COMBINE_FILE_SUPPORT__)
+            MCF_UT_CASE(mcf_merge_ota_file_ut, NULL),
+            MCF_UT_CASE(mcf_merge_ota_by_op_file_ut, NULL),
+            MCF_UT_CASE(mcf_merge_one_gid_ut, NULL),
+            MCF_UT_CASE(mcf_merge_ota_by_op_merge_one_gid_ut, NULL),
+            MCF_UT_CASE(mcf_merge_encrypted_ota_file_ut, NULL),
+        #endif
+		//MCF_UT_CASE(mcf_ut_mcf_boot_trace, NULL),
+        
+		
+    };
+
+#if defined(TEST_MCF_TEST_TASK)
+    {
+        kal_uint32 i = 0;
+        kal_bool ret = KAL_FALSE;
+        kal_char p_ret_err_str[100];
+        kal_uint32  p_ret_err_str_sz;
+        for (i = 0 ; i < (sizeof(mcf_ut_cases_s)/sizeof(ST_TCASE_T)) ; i++)
+        {
+            ret = mcf_ut_cases_s[i].test_func(mcf_ut_cases_s[i].test_param, p_ret_err_str, &p_ret_err_str_sz);
+            if (ret == KAL_FALSE) 
+                ASSERT(0);
+        }
+    }
+#elif defined(TEST_SYS_TEST_TASK)
+    return st_reg_test("MCF", &(mcf_ut_cases_s[0]), (sizeof(mcf_ut_cases_s)/sizeof(ST_TCASE_T)));
+#endif
+}
+
+#if defined(TEST_MCF_TEST_TASK)
+kal_bool mcf_test_task_init(void)
+{
+    return KAL_TRUE;
+}
+
+void mcf_test_task_main(task_entry_struct *task_entry_ptr)
+{
+    ilm_struct	current_ilm;
+
+    kal_set_active_module_id(MOD_MCF_TEST);
+
+    mcf_ut_st_create();
+    // external queue, this may suspend.*/
+	while(1)
+	{
+		if (KAL_TRUE == msg_receive_extq(&current_ilm)) {
+		// handle ILM
+			destroy_ilm(&current_ilm);
+		}
+	}
+}
+
+kal_bool mcf_test_create(comptask_handler_struct **handle)
+{
+    static const comptask_handler_struct mcf_test_task_info =
+    {
+        mcf_test_task_main,          /* task entry function */
+        mcf_test_task_init,          /* task initialization function */
+        NULL                        /* task reset handler */
+    };
+
+    *handle = (comptask_handler_struct *)&mcf_test_task_info;
+    return KAL_TRUE;
+}
+#endif
+