[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/service/mcf/src/mcf_if.c b/mcu/service/mcf/src/mcf_if.c
new file mode 100644
index 0000000..068c57a
--- /dev/null
+++ b/mcu/service/mcf/src/mcf_if.c
@@ -0,0 +1,11901 @@
+/*****************************************************************************
+* 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_if.c
+ *
+ * Project:
+ * --------
+ * UMOLYA
+ *
+ * Description:
+ * ------------
+ * MD Configuration Framework public interface 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!
+ * 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 "fs_general_api.h"
+#include <math.h>
+
+#include "md_sap.h"
+#include "md_svc_sap.h"
+#include "em_msgid.h"
+#include "em_l4_common_public_struct.h"
+#include "em_mcf_public_struct.h"
+#include "nvram_interface.h"
+
+#include "mcf_nvram_editor.h"
+#include "mcf_msgid.h"
+#include "mcf_custom.h"
+#include "mcf_defs.h"
+#include "mcf_if.h"
+#include "mcf_debug.h"
+#include "mcf_util.h"
+#include "mcf_object.h"
+#include "mcf_utfwk.h"
+
+/*------------------------------------------------------------------------------
+ * Global variables.
+ *----------------------------------------------------------------------------*/
+extern MCF_DB_LID_MAPPING mcf_db_lid_mapping_tbl[];
+extern mcf_dump_param_struct mcf_dump_param_tbl[];
+extern kal_uint32 mcf_dump_param_tbl_num;
+
+kal_uint8 mcf_dump_buffer[MCF_MAX_DUMP_SIZE + MCF_MAX_RECORD_CNT * MCF_DUMP_LID_HEADER_SIZE];
+nvram_mcf_lid_info_struct mcf_last_mod_lid_g = {0};
+nvram_mcf_lid_info_struct mcf_curr_mod_lid_g = {0};
+nvram_mcf_lid_info_struct mcf_tlvota_last_mod_lid_g[MAX_SIM_NUM] = {0};
+nvram_mcf_lid_info_struct mcf_tlvota_curr_mod_lid_g[MAX_SIM_NUM] = {0};
+nvram_mcf_lid_info_struct mcf_general_tlvota_last_mod_lid_g[MAX_SIM_NUM] = {0};
+nvram_mcf_lid_info_struct mcf_general_tlvota_curr_mod_lid_g[MAX_SIM_NUM] = {0};
+kal_char txt_buff[64];
+kal_bool is_read_tlvota[MAX_SIM_NUM] = {0};
+kal_bool is_read_general_tlvota[MAX_SIM_NUM] = {0};
+kal_bool is_update_tlvota[MAX_SIM_NUM];
+nvram_ef_mcf_internal_info_struct nv_int_info;
+kal_char mcf_gid_buff[256];
+mcf_ota_result_e set_op_read_ret[MAX_SIM_NUM];
+
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+kal_uint8 mcf_merge_buffer[MCF_MAX_FILE_SIZE];
+kal_uint8 mcf_file_buffer[MCF_MAX_FILE_SIZE];
+kal_wchar merge_ota_name[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+#endif
+
+kal_uint8 dsbp_ret = 0;
+
+/*------------------------------------------------------------------------------
+ * Helper macro.
+ *----------------------------------------------------------------------------*/
+
+
+/*------------------------------------------------------------------------------
+ * Private data structure.
+ *----------------------------------------------------------------------------*/
+typedef struct tm MCF_TIME_STRUCT;
+
+/*------------------------------------------------------------------------------
+ * Private variables.
+ *----------------------------------------------------------------------------*/
+
+/*------------------------------------------------------------------------------
+ * Extern 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 sim_interface_enum l4c_gemini_get_switched_sim_id(sim_interface_enum simId);
+extern void mcf_merge_make_ota_file_header(mcf_tool_file_info_t *output_header, mcf_tool_file_info_t *copy_header);
+
+/*------------------------------------------------------------------------------
+ * Private fucntions.
+ *----------------------------------------------------------------------------*/
+_STATIC kal_bool mcf_check_tag_match(
+ mcf_tool_tlvota_file_item_t *pItem,
+ mcf_tlvota_tag_t *tag_entry,
+ kal_uint32 tag_num,
+ kal_uint32 *match_idx)
+{
+ kal_uint32 tag_cnt = 0;
+
+ ASSERT(pItem);
+ ASSERT(tag_entry);
+ ASSERT(tag_num >= 0);
+
+ while(tag_cnt < tag_num) {
+ if ( (pItem->tag_type == tag_entry[tag_cnt].tag_type) && (strncmp(&(pItem->buff_start), tag_entry[tag_cnt].tag, pItem->tag_len) == 0) ) {
+ *match_idx = tag_cnt;
+
+ return KAL_TRUE;
+ }
+
+ tag_cnt++;
+ }
+
+ return KAL_FALSE;
+}
+
+_STATIC kal_bool mcf_v2_check_tag_match(
+ mcf_tool_gid_tlvota_file_item_t *pItem,
+ mcf_tlvota_tag_t *tag_entry,
+ kal_uint32 tag_num,
+ kal_uint32 *match_idx)
+{
+ kal_uint32 tag_cnt = 0;
+
+ ASSERT(pItem);
+ ASSERT(tag_entry);
+ ASSERT(tag_num >= 0);
+
+ while(tag_cnt < tag_num) {
+ if ( (pItem->tag_type == tag_entry[tag_cnt].tag_type) && (strncmp(&(pItem->buff_start), tag_entry[tag_cnt].tag, pItem->tag_len) == 0) ) {
+ *match_idx = tag_cnt;
+
+ return KAL_TRUE;
+ }
+
+ tag_cnt++;
+ }
+
+ return KAL_FALSE;
+}
+
+_STATIC mcf_ota_result_e mcf_fill_tag_entry(mcf_tlvota_sbp_tag_t sbp_tag, kal_bool is_general, mcf_tlvota_tag_t *tag_entry, kal_uint32 *tag_num)
+{
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ static kal_char tag[4][MCF_MAX_TAG_LEN];
+ kal_int32 ret_snprintf;
+
+ kal_mem_set(tag, 0, sizeof(kal_char) * 4 * MCF_MAX_TAG_LEN);
+ *tag_num = 0;
+ /* Fill tag entry */
+ if (sbp_tag.sbp_id != SBP_ID_INVALID) {
+ if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
+ if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // sbpid_mcc_mnc case
+ /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
+ if (is_general == KAL_TRUE){
+ /* NA_mcc_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ /* NA_mcc_mnc */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+ }else{
+ /* Reuse tag_entry */
+ *tag_num = 0;
+ /* NA_NA_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ /* sbpid_NA_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ /* sbpid_mcc_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ /* sbpid_mcc_mnc */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_%s", sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+ }
+ } else { // sbpid_mcc_NA case
+ /* NA_mcc_NA case should be updated first */
+ if (is_general == KAL_TRUE){
+ /* NA_mcc_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+ }else{
+ /* Reuse tag_entry */
+ *tag_num = 0;
+ /* NA_NA_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ /* sbpid_NA_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ /* sbpid_mcc_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+ }
+ }
+ } else {
+ if (strcmp((kal_char *)sbp_tag.mnc, "") == 0) { // sbpid_NA_NA case
+ if (is_general == KAL_FALSE){
+ /* NA_NA_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ /* sbpid_NA_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+ }
+ } else { // sbpid_NA_mnc case is not allowed!!
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ ret = MCF_OTA_R_INVALID_SBP_TAG;
+
+ return ret;
+ }
+ }
+ } else {
+ if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
+ if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // NA_mcc_mnc case
+ /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
+ if (is_general == KAL_TRUE){
+ /* NA_mcc_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ /* NA_mcc_mnc */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+ }else{
+ /* Reuse tag_entry */
+ *tag_num = 0;
+ /* NA_NA_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+ }
+ } else { // NA_mcc_NA case
+ /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
+ if (is_general == KAL_TRUE){
+ /* NA_mcc_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+
+ }else{
+ /* Reuse tag_entry */
+ *tag_num = 0;
+ /* NA_NA_NA */
+ tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+ tag_entry[*tag_num].tag = tag[*tag_num];
+ *tag_num = *tag_num +1;
+ }
+ }
+ } else { // NA_NA_mnc cases is not allowed!!
+ MD_TRC_MCF_TR_FILL_TAG_ENTRY_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ ret = MCF_OTA_R_INVALID_SBP_TAG;
+
+ return ret;
+ }
+ }
+ return ret;
+}
+_STATIC void mcf_v1_read_tlvota_buffer_tag_update_flow(mcf_tlvota_file_t *tlvota_file, mcf_tlvota_tag_t *tag_entry, kal_uint32 tag_num, nvram_lid_enum lid, kal_uint8 *buffer)
+{
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_tlvota_file_item_t *pItem;
+ kal_uint16 item_cnt = 0;
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ kal_uint32 match_idx;
+ kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+ mcf_tag_info_struct unuse = {0};
+ MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
+
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+ /* Read changed items from TLV-OTA file */
+ while (item_cnt < pFile->item_num) {
+ /* Check if LID and tag match */
+ if ( (pItem->lid != lid) || (mcf_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
+ goto next;
+ }
+
+ /* Check if item_tag_len is valid */
+ if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+ mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d) \r\n", pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+ goto next;
+ }
+
+ /* Update LID item */
+ if (pItem->is_bit_op == 0) {
+ strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if (pItem->op.byte.value_len > item_size) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
+ mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->op.byte.value_len, item_size);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BYTE_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, pItem->op.byte.value_len);
+ mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
+
+ kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.bit.value_len);
+
+ strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BIT_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, item_bit_offset, pItem->op.bit.len, pItem->op.bit.value_len, bit_value);
+
+ if (pItem->op.bit.value_len == 1) {
+ kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 2) {
+ kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 4) {
+ kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ }
+ }
+
+next:
+ pItem = (mcf_tool_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+}
+
+_STATIC mcf_ota_result_e mcf_read_tlvota_buffer_multi_tag(
+ kal_uint8 ps_id,
+ mcf_tlvota_tag_t *tag_entry,
+ kal_uint32 tag_num,
+ nvram_lid_enum lid,
+ kal_uint8 *buffer,
+ kal_uint32 size)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_gid_tlvota_file_item_t *pItem;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+ mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
+ nvram_ltable_entry_struct lid_info;
+ kal_uint16 item_cnt = 0;
+ kal_uint32 match_idx;
+ nvram_errno_enum nvram_api_ret;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_bool item_is_bit = KAL_FALSE;
+ kal_uint16 item_lid;
+
+ ASSERT(buffer);
+ ASSERT(size > 0);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_START(ps_id, sim_id, tag_num);
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+ mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if (size != lid_info.size) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_SIZE(size, lid, lid_info.size);
+ mcf_utfwk_printf("Invalid buffer_size(%d)!! LID(%d), record_size(%d) \r\n", size, lid, lid_info.size);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_ATTR_NOT_SET(lid, lid_info.attr);
+ mcf_utfwk_printf("ERROR!! OTA by op attribute is not set! LID(%d), attribute(%x) \r\n", lid, lid_info.attr);
+ ret = MCF_OTA_R_INVALID_ATTR;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+ if (pFile->file_version == 2){
+ mcf_v1_read_tlvota_buffer_tag_update_flow(tlvota_file, tag_entry, tag_num, lid, buffer);
+ }else if (pFile->file_version == 3){
+ pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+ /* Read changed items from TLV-OTA file */
+ while (item_cnt < pFile->item_num) {
+ /* Check if array_index_len is valid */
+ if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ mcf_utfwk_printf("Invalid array_index_len(%d)!! max array_index_len(%d) \r\n", pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ goto next;
+ }
+ strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
+ array_tag[pItem->array_index_len] = '\0';
+
+ /* Find GID corresponding LID */
+ item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+ if (item_lid == 65535){
+ //-1(65535) means not found
+ goto next;
+ }
+
+ /* Check if LID and tag match */
+ if ( (item_lid != lid) || (mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
+ goto next;
+ }
+
+
+ if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+ goto next;
+ }
+
+ /* Update LID item */
+ if (item_is_bit == 0) {
+ if (pItem->value_len > item_size) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_LARGE_VAL_LEN(pItem->value_len, item_size);
+ mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->value_len, item_size);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BYTE_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, pItem->value_len);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BYTE_UPDATE, lid, tag_entry[match_idx].tag, item_byte_offset, pItem->value_len);
+ mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+ kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+ nv_int_info.update_general_tlvota_result = KAL_TRUE;
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+ kal_uint32 offset = 0;
+ kal_uint32 var_size = 1;
+ kal_uint32 val_tmp = 0;
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+ if (pItem->value_len > 4) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BIT_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, item_bit_offset, item_size, pItem->value_len, bit_value);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BIT_UPDATE, lid, tag_entry[match_idx].tag, item_byte_offset, item_bit_offset, item_size, pItem->value_len, bit_value);
+
+ if (item_size > 8 && item_size <= 16) {
+ var_size = 2;
+ }else if (item_size > 16 && item_size <= 24) {
+ var_size = 3;
+ }else if (item_size > 24 && item_size <= 32) {
+ var_size = 4;
+ }
+
+ if (item_bit_offset > 0 && item_bit_offset < 8) {
+ offset = 0;
+ }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ offset = 1;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ offset = 2;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ offset = 3;
+ }else if (item_bit_offset >= 32){
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset > 0) {
+ if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+ var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+ }
+ }
+ if(var_size > 4){
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ item_bit_offset -= 8;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ item_bit_offset -= 16;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ item_bit_offset -= 24;
+ }
+
+
+ kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
+ val_tmp &= ~(bit_mask << item_bit_offset);
+ val_tmp |= (bit_value << item_bit_offset);
+
+ kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
+ nv_int_info.update_general_tlvota_result = KAL_TRUE;
+ }
+
+ next:
+ pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ } else {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_TAKE_READ_LOCK_FAIL();
+ mcf_utfwk_printf("Fail to take read lock!! \r\n");
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ }
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_read_tlvota_buffer_sbp_multi_tag(
+ kal_uint8 ps_id,
+ mcf_tlvota_tag_t *tag_entry,
+ kal_uint32 tag_num,
+ nvram_lid_enum lid,
+ kal_uint8 *buffer,
+ kal_uint32 size)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_gid_tlvota_file_item_t *pItem;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+ mcf_tlvota_file_t *tlvota_file;
+ nvram_ltable_entry_struct lid_info;
+ kal_uint16 item_cnt = 0;
+ kal_uint32 match_idx;
+ nvram_errno_enum nvram_api_ret;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_bool item_is_bit = KAL_FALSE;
+ kal_uint16 item_lid;
+
+ ASSERT(buffer);
+ ASSERT(size > 0);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_START(ps_id, sim_id, tag_num);
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_SIM_ID(ps_id, sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+ mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if (size != lid_info.size) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_SIZE(size, lid, lid_info.size);
+ mcf_utfwk_printf("Invalid buffer_size(%d)!! LID(%d), record_size(%d) \r\n", size, lid, lid_info.size);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_ATTR_NOT_SET(lid, lid_info.attr);
+ mcf_utfwk_printf("ERROR!! OTA by op attribute is not set! LID(%d), attribute(%x) \r\n", lid, lid_info.attr);
+ ret = MCF_OTA_R_INVALID_ATTR;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+ if (pFile->file_version == 2){
+ mcf_v1_read_tlvota_buffer_tag_update_flow(tlvota_file, tag_entry, tag_num, lid, buffer);
+ }else if (pFile->file_version == 3){
+ pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+ /* Read changed items from TLV-OTA file */
+ while (item_cnt < pFile->item_num) {
+ /* Check if array_index_len is valid */
+ if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ goto next;
+ }
+ strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
+ array_tag[pItem->array_index_len] = '\0';
+
+ /* Find GID corresponding LID */
+ item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+ if (item_lid == 65535){
+ //-1(65535) means not found
+ goto next;
+ }
+
+ /* Check if LID and tag match */
+ if ( (item_lid != lid) || (mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
+ goto next;
+ }
+
+ if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+ goto next;
+ }
+
+ /* Update LID item */
+ if (item_is_bit == 0) {
+ if (pItem->value_len > item_size) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_LARGE_VAL_LEN(pItem->value_len, item_size);
+ mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->value_len, item_size);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_BYTE_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, pItem->value_len);
+ mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+ kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+ nv_int_info.update_tlvota_result[sim_id] = KAL_TRUE;
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+ kal_uint32 offset = 0;
+ kal_uint32 var_size = 1;
+ kal_uint32 val_tmp = 0;
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+ if (pItem->value_len > 4) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_BIT_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, item_bit_offset, item_size, pItem->value_len, bit_value);
+
+ if (item_size > 8 && item_size <= 16) {
+ var_size = 2;
+ }else if (item_size > 16 && item_size <= 24) {
+ var_size = 3;
+ }else if (item_size > 24 && item_size <= 32) {
+ var_size = 4;
+ }
+
+ if (item_bit_offset > 0 && item_bit_offset < 8) {
+ offset = 0;
+ }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ offset = 1;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ offset = 2;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ offset = 3;
+ }else if (item_bit_offset >= 32){
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset > 0) {
+ if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+ var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+ }
+ }
+ if(var_size > 4){
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ item_bit_offset -= 8;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ item_bit_offset -= 16;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ item_bit_offset -= 24;
+ }
+
+
+ kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
+ val_tmp &= ~(bit_mask << item_bit_offset);
+ val_tmp |= (bit_value << item_bit_offset);
+
+ kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
+ nv_int_info.update_tlvota_result[sim_id] = KAL_TRUE;
+ }
+
+ next:
+ pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ } else {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_TAKE_READ_LOCK_FAIL();
+ mcf_utfwk_printf("Fail to take read lock!! \r\n");
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ }
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_set_dsbp_mode(kal_bool is_ignore_dsbp, kal_bool is_general, sim_interface_enum sim_id)
+{
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ MD_TRC_MCF_TR_SET_DSBP_MODE_START(is_ignore_dsbp, is_general, sim_id);
+
+ if(sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_SET_DSBP_MODE_INVALID_SIM_ID(sim_id);
+ }
+
+ kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+ /* 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))) {
+ MD_TRC_MCF_TR_SET_DSBP_MODE_READ_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if (is_general == KAL_FALSE){
+ if(sim_id >= 0 && sim_id < MAX_SIM_NUM){
+ nv_int_info.tlvota_is_ignore_dsbp[sim_id] = is_ignore_dsbp;
+ }
+ }else{
+ nv_int_info.general_is_ignore_dsbp = is_ignore_dsbp;
+ }
+
+ /* Write MCF SW information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_DSBP_MODE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_set_not_reset(kal_bool not_reset, l4c_mcf_config_type_enum config_type, sim_interface_enum sim_id)
+{
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_SET_NOT_RESET_INVALID_SIM_ID(sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+ /* 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))) {
+ MD_TRC_MCF_TR_SET_NOT_RESET_READ_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ switch (config_type)
+ {
+ case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+ nv_int_info.not_reset_ota = not_reset;
+ break;
+ case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+ nv_int_info.not_reset_tlvota[sim_id] = not_reset;
+ break;
+ case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+ nv_int_info.not_reset_general_tlvota = not_reset;
+ break;
+ default:
+ MD_TRC_MCF_TR_SET_NOT_RESET_INVALID_CONFIG_TYPE(config_type);
+ ret = KAL_FALSE;
+ break;
+ }
+
+ /* Write MCF SW information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_NOT_RESET_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ return ret;
+}
+
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+_STATIC mcf_ota_result_e mcf_store_tlvota_modified_lid(sim_interface_enum sim_id, mcf_tlvota_sbp_tag_t sbp_tag, kal_bool is_general)
+#else
+_STATIC mcf_ota_result_e mcf_store_tlvota_modified_lid(sim_interface_enum sim_id, mcf_tlvota_sbp_tag_t sbp_tag, kal_bool is_general, kal_bool not_reset, kal_bool set_combined)
+#endif
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ mcf_tlvota_tag_t tag_entry[4];
+ kal_uint32 tag_num = 0;
+ kal_uint16 pre_LID = 0;
+ kal_int16 pos = -1;
+ kal_uint16 in_pos = 0;
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_gid_tlvota_file_item_t *pItem;
+ nvram_ltable_entry_struct lid_info;
+ kal_uint16 item_cnt = 0;
+ kal_uint32 match_idx;
+ nvram_errno_enum nvram_api_ret;
+ kal_uint16 dummy_byte_offset;
+ kal_uint16 dummy_bit_offset;
+ kal_uint32 dummy_size;
+ kal_bool dummy_is_bit;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_uint16 item_lid = 65535;
+ mcf_tlvota_file_t *tlvota_file;
+ mcf_tlvota_tag_t iccid_tag;
+ kal_char iccid[21];
+
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_START(sim_id, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc, is_general);
+
+ #if defined(__MCF_COMBINE_FILE_SUPPORT__)
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_NOT_RESET(not_reset);
+#endif
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_SIM_ID(sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ kal_mem_set(tag_entry, 0, sizeof(mcf_tlvota_tag_t) * 4);
+ kal_mem_set(&mcf_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+ kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+ kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
+
+ ret = mcf_fill_tag_entry(sbp_tag, is_general, tag_entry, &tag_num);
+ if (ret != MCF_OTA_R_SUCCESS){
+ return ret;
+ }
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+ if (is_general == KAL_TRUE){
+ if (com_Mcf.is_iccid == KAL_TRUE){
+ kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
+ iccid_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ kal_mem_cpy(&iccid, tlvota_file->iccid, 21);
+ iccid_tag.tag = iccid;
+ iccid_tag.tag_len = strlen((kal_char *)tlvota_file->iccid);
+
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_TAKE_READ_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return ret;
+ }
+ }
+
+ tlvota_file = &(pMcf->general_tlvota_file);
+ }
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ if (pFile->file_version == 3){
+ pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+ /* Read changed LID from TLV-OTA file */
+ while (item_cnt < pFile->item_num) {
+ /* Check if array_index_len is valid */
+ if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ goto next;
+ }
+ strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
+ array_tag[pItem->array_index_len] = '\0';
+
+ /* Find GID corresponding LID */
+ item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+ if (item_lid == 65535){
+ //-1(65535) means not found
+ goto next;
+ }
+
+ if ( (item_lid == pre_LID)){
+ goto next;
+ }
+
+ /* Check if LID and tag match */
+ if ((mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
+ if (com_Mcf.is_iccid == KAL_TRUE){
+ if ((pItem->tag_type != iccid_tag.tag_type) || (strncmp(&(pItem->buff_start), iccid_tag.tag, pItem->tag_len) != 0) ) {
+ goto next;
+ }
+ }else{
+ goto next;
+ }
+ }
+
+ if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &dummy_byte_offset, &dummy_bit_offset, &dummy_size, &dummy_is_bit) == KAL_FALSE){
+ goto next;
+ }
+
+ /* Store last time modified LID */
+ nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_GET_LID_INFO_FAIL(item_lid, nvram_api_ret);
+ ret = KAL_FALSE;
+ goto next;
+ }
+ if ( ((lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) != 0)) {
+ if (((lid_info.attr & NVRAM_ATTR_OTA_RESET) == 0)){
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_RESET_ATTR_NOT_SET(item_lid, lid_info.attr);
+ }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ if (is_general == KAL_FALSE){
+ if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid(item_lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &in_pos);
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid(item_lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, in_pos) != KAL_TRUE){
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
+ }else{
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
+ }
+ mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
+ }
+ }
+ }else{
+ if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid(item_lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &in_pos);
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid(item_lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, in_pos) != KAL_TRUE){
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
+ }else{
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
+ }
+ mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
+ }
+ }
+ }
+#else
+ if (is_general == KAL_FALSE){
+ if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid_struct(item_lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &in_pos);
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid_struct(item_lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, in_pos, not_reset, set_combined) != KAL_TRUE){
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
+ }else{
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
+ }
+ mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
+ }
+ }
+ }else{
+ if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid_struct(item_lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &in_pos);
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid_struct(item_lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, in_pos, not_reset, set_combined) != KAL_TRUE){
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
+ }else{
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
+ }
+ mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
+ }
+ }
+ }
+#endif
+
+ }
+
+ next:
+ pre_LID = item_lid;
+ pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+
+ }else{
+ //File version is not 3
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_FILE_VERSION(pFile->file_version);
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ } else {
+ MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_TAKE_READ_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+
+
+ return ret;
+}
+
+_STATIC void mcf_em_send_ota_file_info(em_mcf_read_ota_file_info_struct *read_file_info)
+{
+ ilm_struct ilm;
+ em_mcf_ota_file_info_ind_struct *em_para_ptr = NULL;
+
+ if (com_Mcf.is_em_on == KAL_TRUE) {
+ em_para_ptr = (em_mcf_ota_file_info_ind_struct *)construct_local_para(sizeof(em_mcf_ota_file_info_ind_struct), TD_RESET);
+
+ em_para_ptr->em_info = MCF_EM_OTA_FILE_INFO;
+ kal_mem_cpy(&(em_para_ptr->read_file_info), read_file_info, sizeof(em_mcf_read_ota_file_info_struct));
+
+ ilm.src_mod_id = MOD_MCF;
+ ilm.dest_mod_id = MOD_DHL;
+ ilm.msg_id = MSG_ID_EM_MCF_OTA_FILE_INFO_IND;
+ ilm.sap_id = EM_PS_SAP;
+ ilm.local_para_ptr = (local_para_struct *)em_para_ptr;
+ ilm.peer_buff_ptr = NULL;
+
+ dhl_EM_logger(&ilm);
+ destroy_ilm(&ilm);
+ } else {
+#ifdef __MT_FRAMEWORK_SUPPORT__
+ if (kal_query_systemInit() == KAL_TRUE) {
+ /* EM switch may not be ON in init stage */
+ em_para_ptr = (em_mcf_ota_file_info_ind_struct *)construct_local_para(sizeof(em_mcf_ota_file_info_ind_struct), TD_RESET);
+
+ em_para_ptr->em_info = MCF_EM_OTA_FILE_INFO;
+ kal_mem_cpy(&(em_para_ptr->read_file_info), read_file_info, sizeof(em_mcf_read_ota_file_info_struct));
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_MT, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_EM_MCF_OTA_FILE_INFO_IND, /* msg_id */
+ (local_para_struct*)em_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ }
+#endif
+ }
+}
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+_STATIC mcf_ota_result_e mcf_combined_ota_file(l4c_mcf_set_config_req_struct *req)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ kal_uint32 i;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+ mcf_tool_file_info_t *pFile;
+ kal_int32 fs_ret = FS_NO_ERROR;
+ static nvram_ef_mcf_ota_file_info_struct nv_ota_file;
+ static nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+ static kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ static kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
+ static kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+ kal_int32 fs_api_ret;
+ static kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type;
+ em_mcf_read_ota_file_info_struct read_file_info;
+ kal_bool read_file_fail = KAL_FALSE;
+
+ kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+ kal_mem_set(mcf_merge_buffer, 0, MCF_MAX_FILE_SIZE);
+ kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
+ kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+
+ switch (req->config_type)
+ {
+ case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+ {
+ mcf_ota_file_t *ota_file = &(pMcf->ota_file);
+ kal_uint16 pre_LID = 0;
+ kal_int16 pos = -1;
+ kal_uint16 in_pos = 0;
+ mcf_tool_gid_ota_file_item_t *pItem;
+ nvram_ltable_entry_struct lid_info;
+ kal_uint16 item_cnt = 0;
+ nvram_errno_enum nvram_api_ret;
+ kal_uint16 dummy_byte_offset;
+ kal_uint16 dummy_bit_offset;
+ kal_uint32 dummy_size;
+ kal_bool dummy_is_bit;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_uint16 item_lid;
+
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+
+ /* Check if file is existed */
+ kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+ fs_api_ret = FS_GetAttributes(filename);
+ if (fs_api_ret < FS_NO_ERROR) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
+ ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF Internal 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))) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+ }
+
+ /* Write MCF OTA file information to NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if(req->reset == KAL_TRUE){
+ //Need to reset LID
+ nv_int_info.not_reset_ota = KAL_FALSE;
+
+ //Clear LIDs which is add due to combine
+ if(mcf_clear_last_modified_lid(nv_int_info.last_mod_lid.lid_conf, &nv_int_info.last_mod_lid.lid_cnt) != KAL_TRUE){
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ /* Combine OTA file - Only apply one OTA file */
+ ret = mcf_read_ota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+
+ /*Store LID which need to reset into last modified buffer*/
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+ /* Check if file type is OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if (pFile->file_version == 3){
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+ pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+ /* Read changed items from OTA file */
+ while (item_cnt < pFile->item_num) {
+ if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ goto next;
+ }
+ strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
+ array_tag[pItem->array_index_len] = '\0';
+
+ /* Find GID corresponding LID */
+ item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+ if (item_lid == 65535){
+ //-1(65535) means not found
+ goto next;
+ }
+
+ if ( (item_lid == pre_LID)){
+ goto next;
+ }
+
+ if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &dummy_byte_offset, &dummy_bit_offset, &dummy_size, &dummy_is_bit) == KAL_FALSE){
+ goto next;
+ }
+
+ /* Store last time modified LID */
+ nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_GET_LID_INFO_FAIL(item_lid, nvram_api_ret);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ goto next;
+ }
+ /* Store reset LIDs into last time modified LID */
+ if ( ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+ && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+ if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid_struct(item_lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_SEARCH_STORE_LID(item_lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid_struct(item_lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, in_pos, KAL_FALSE, KAL_TRUE) != KAL_TRUE){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LID_FAIL(item_lid);
+ }else{
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LID(item_lid, in_pos);
+ }
+ nv_int_info.last_mod_lid.lid_cnt++;
+ }
+ }
+ }
+
+ next:
+ pre_LID = item_lid;
+ pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+
+ }
+ }
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+ }
+
+ }else{
+ //Do not Need to reset LID
+ nv_int_info.not_reset_ota = KAL_TRUE;
+
+ /* Combine OTA file - Append OTA file*/
+ for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
+ if(nv_int_info.last_mod_lid.lid_conf[i].not_reset == KAL_FALSE && nv_int_info.last_mod_lid.lid_conf[i].set_combined == KAL_FALSE){
+ nv_int_info.last_mod_lid.lid_conf[i].not_reset = KAL_TRUE;
+ }
+ }
+ ret = mcf_read_ota_file(KAL_FALSE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_ota_file.path, nv_ota_file.name);
+ read_file_fail = KAL_TRUE;
+ }
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+ /* Check if file type is OTA file */ //If not OTA file, Construct empty file header
+ if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+ mcf_tool_file_info_t copy_header = {0};
+ mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
+
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
+
+ kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+ copy_header.file_version = 3;
+ copy_header.operation_mask = 0;
+ mcf_merge_make_ota_file_header(output_header, ©_header); // copy first header to output header
+ kal_mem_set(output_header->file_type, 0, 8);
+ strncpy(output_header->file_type, MCF_FILE_TYPE_OTA, 7);
+ output_header->item_num = 0;
+ output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
+
+ }else{
+ kal_mem_cpy(mcf_file_buffer, ota_file->buff, MCF_MAX_OTA_FILE_SIZE);
+ }
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ }
+ ret = mcf_read_ota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+ /* Check if file type is OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if(mcf_merge_ota_buffer(mcf_file_buffer, ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ return ret;
+ }
+
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ }
+ strncpy(fs_root_path, nv_ota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(curr_filename, nv_ota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Before create merged OTA file, need to delete last time merged OTA file */
+ kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
+ fs_ret = FS_Delete(merge_ota_name);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
+ ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return ret;
+ }
+ pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
+ if(pFile->file_size > MCF_MAX_OTA_FILE_SIZE){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_OTA_FILE_SIZE);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+ ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ }
+ strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ }else{
+ /*Deactivate Combine OTA setting */
+
+ kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
+ kal_mem_set(nv_ota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(nv_ota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
+
+ kal_mem_set(nv_ota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(nv_ota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
+
+ nv_int_info.is_combined_ota = KAL_FALSE;
+
+ //Need to reset LID
+ nv_int_info.not_reset_ota = KAL_FALSE;
+
+ for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
+ if(nv_int_info.last_mod_lid.lid_conf[i].not_reset == KAL_TRUE){
+ nv_int_info.last_mod_lid.lid_conf[i].not_reset = KAL_FALSE;
+ }
+ }
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ }
+
+
+ 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)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+ {
+ mcf_tlvota_file_t *tlvota_file;
+ mcf_tlvota_sbp_tag_t sbp_tag;
+
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_TLVOTA_START(sim_id);
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_SIM_ID(req->ps_id, sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
+ /* If MCF is in DSBP passive mode, change to DSBP active mode */
+ ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
+ }
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+
+ /* Check if file is existed */
+ kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+ fs_api_ret = FS_GetAttributes(filename);
+ if (fs_api_ret < FS_NO_ERROR) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
+ ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF Internal 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))) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+ }
+
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if(req->reset == KAL_TRUE){
+ //Need to reset LID
+ nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
+
+ //Clear LIDs which is add due to combine
+ if(mcf_clear_last_modified_lid(nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf, &nv_int_info.tlvota_last_mod_lid[sim_id].lid_cnt) != KAL_TRUE){
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ /* Combine OTA file - Only apply one OTA file */
+ ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ sbp_tag.sbp_id = tlvota_file->sbp_id;
+ kal_mem_cpy(sbp_tag.mcc, tlvota_file->mcc, MAX_MCC_STR_LEN);
+ kal_mem_cpy(sbp_tag.mnc, tlvota_file->mnc, MAX_MNC_STR_LEN);
+
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ }else {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_TAKE_READ_LOCK_FAIL();
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+
+ ret = mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE, KAL_FALSE, KAL_TRUE);
+
+ kal_mem_cpy(&mcf_tlvota_last_mod_lid_g[sim_id], &nv_int_info.tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LAST_LID_FAIL();
+ return ret;
+ }
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ }else{
+ //Do not need to reset LID
+ nv_int_info.not_reset_tlvota[sim_id] = KAL_TRUE;
+
+ /* Combine OTA file - Append OTA file*/
+ for(i = 0; i < nv_int_info.tlvota_last_mod_lid[sim_id].lid_cnt; i++){
+ if(nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_FALSE && nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].set_combined == KAL_FALSE){
+ nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_TRUE;
+ }
+ }
+ ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name);
+ read_file_fail = KAL_TRUE;
+ }
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ /* Check if file type is TLV-OTA file */ //If not TLVOTA file, Construct empty file header
+ if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ mcf_tool_file_info_t copy_header = {0};
+ mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
+
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
+
+ kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+ copy_header.file_version = 3;
+ copy_header.operation_mask = 0;
+ mcf_merge_make_ota_file_header(output_header, ©_header); // copy first header to output header
+ kal_mem_set(output_header->file_type, 0, 8);
+ strncpy(output_header->file_type, MCF_FILE_TYPE_TLVOTA, 7);
+ output_header->item_num = 0;
+ output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
+
+ }else{
+ kal_mem_cpy(mcf_file_buffer, tlvota_file->buff, MCF_MAX_TLVOTA_FILE_SIZE);
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if(mcf_merge_ota_buffer(mcf_file_buffer, tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
+ 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);
+ }
+ strncpy(fs_root_path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(curr_filename, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Before create merged OTA file, need to delete last time merged OTA file */
+ kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
+ fs_ret = FS_Delete(merge_ota_name);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
+ ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return ret;
+ }
+
+ pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
+ if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ }
+
+ if (req->trigger_dsbp == 1) {
+ /* Read TLV-OTA file */
+ kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+ read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+ read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+ read_file_info.ps_id = req->ps_id;
+ read_file_info.start_time = kal_get_systicks();
+
+ ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+ // Store Read TLV-OTA file result for dsbp urc use
+ set_op_read_ret[sim_id] = ret;
+ if (ret == MCF_OTA_R_SUCCESS) {
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ read_file_info.path_type = tlvota_file->path_type;
+ strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ is_read_tlvota[sim_id] = KAL_TRUE;
+ } else {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+ }
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+ }
+
+ strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+
+ }else{
+ /*Deactivate Combine OTA setting */
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+ /* If MCF is in DSBP passive mode, change to DSBP active mode */
+ ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+ }
+
+ kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
+ kal_mem_set(nv_tlvota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(nv_tlvota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
+
+ /* Deactivate TLV-OTA setting, reset combined setting */
+ nv_int_info.is_combined_tlvota[sim_id] = KAL_FALSE;
+ kal_mem_set(nv_tlvota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(nv_tlvota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
+
+ //Need to reset LID
+ nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
+
+ for(i = 0; i < nv_int_info.tlvota_last_mod_lid[sim_id].lid_cnt; i++){
+ if(nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_TRUE){
+ nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_FALSE;
+ }
+ }
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if (req->trigger_dsbp == 1) {
+ /* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+ tlvota_file->path_type = req->path_type;
+ strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+ }
+ is_read_tlvota[sim_id] = KAL_TRUE;
+ }
+
+ }
+
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+ case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+ {
+ mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
+ mcf_tlvota_sbp_tag_t sbp_tag;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_SIM_ID(req->ps_id, sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ if (pMcf->general_is_ignore_dsbp == KAL_FALSE) {
+ /* If MCF is in DSBP passive mode, change to DSBP active mode */
+ ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_TRUE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->general_is_ignore_dsbp = KAL_TRUE;
+ }
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+
+ /* Check if file is existed */
+ kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+ fs_api_ret = FS_GetAttributes(filename);
+ if (fs_api_ret < FS_NO_ERROR) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
+ ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF Internal 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))) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+ }
+
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if(req->reset == KAL_TRUE){
+ //Need to reset LID
+ nv_int_info.not_reset_general_tlvota = KAL_FALSE;
+
+ //Clear LIDs which is add due to combine
+ if(mcf_clear_last_modified_lid(nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf, &nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_cnt) != KAL_TRUE){
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ /* Combine OTA file - Only apply one OTA file */
+ ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ sbp_tag.sbp_id = tlvota_file->sbp_id;
+ kal_mem_cpy(sbp_tag.mcc, tlvota_file->mcc, MAX_MCC_STR_LEN);
+ kal_mem_cpy(sbp_tag.mnc, tlvota_file->mnc, MAX_MNC_STR_LEN);
+
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ }else {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_TAKE_READ_LOCK_FAIL();
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ tlvota_file = &(pMcf->general_tlvota_file);
+ ret = mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+
+ kal_mem_cpy(&mcf_general_tlvota_last_mod_lid_g[sim_id], &nv_int_info.general_tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LAST_LID_FAIL();
+ return ret;
+ }
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+
+ }else{
+ //Do not need to reset LID
+ nv_int_info.not_reset_general_tlvota = KAL_TRUE;
+
+ /* Combine OTA file - Append OTA file*/
+ for(i = 0; i < nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_cnt; i++){
+ if(nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_FALSE && nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].set_combined == KAL_FALSE){
+ nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_TRUE;
+ }
+ }
+ ret = mcf_read_general_tlvota_file(KAL_FALSE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name);
+ read_file_fail = KAL_TRUE;
+ }
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ /* Check if file type is TLV-OTA file */ //If not TLVOTA file, Construct empty file header
+ if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ mcf_tool_file_info_t copy_header = {0};
+ mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
+
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
+
+ kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+ copy_header.file_version = 3;
+ copy_header.operation_mask = 0;
+ mcf_merge_make_ota_file_header(output_header, ©_header); // copy first header to output header
+ kal_mem_set(output_header->file_type, 0, 8);
+ strncpy(output_header->file_type, MCF_FILE_TYPE_TLVOTA, 7);
+ output_header->item_num = 0;
+ output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
+
+ }else{
+ kal_mem_cpy(mcf_file_buffer, tlvota_file->buff, MCF_MAX_TLVOTA_FILE_SIZE);
+ }
+
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+ if(ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if(mcf_merge_ota_buffer(mcf_file_buffer, tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
+ 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);
+ }
+ strncpy(fs_root_path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(curr_filename, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Before create merged OTA file, need to delete last time merged OTA file */
+ kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
+ fs_ret = FS_Delete(merge_ota_name);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
+ ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return ret;
+ }
+
+ pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
+ if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
+ return ret;
+ }
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ }
+
+ if (req->trigger_dsbp == 1) {
+ /* Read general TLV-OTA file */
+ kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+ read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+ read_file_info.config_type = L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN;
+ read_file_info.ps_id = req->ps_id;
+ read_file_info.start_time = kal_get_systicks();
+
+ ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+ if (ret == MCF_OTA_R_SUCCESS) {
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ read_file_info.path_type = tlvota_file->path_type;
+ strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ for(i = 0; i < MAX_SIM_NUM; i++){
+ is_read_general_tlvota[i] = KAL_TRUE;
+ }
+ } else {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+ }
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+ }
+
+ strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+
+ }else{
+ /*Deactivate Combine OTA setting */
+ if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_TRUE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->general_is_ignore_dsbp = KAL_FALSE;
+ }
+
+ kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
+ kal_mem_set(nv_tlvota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(nv_tlvota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
+
+ /* Deactivate TLV-OTA setting, reset combined setting */
+ nv_int_info.is_combined_general_tlvota = KAL_FALSE;
+ kal_mem_set(nv_tlvota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ kal_mem_set(nv_tlvota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
+
+ //Need to reset LID
+ nv_int_info.not_reset_general_tlvota = KAL_FALSE;
+
+ for(i = 0; i < nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_cnt; i++){
+ if(nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_TRUE){
+ nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_FALSE;
+ }
+ }
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if (req->trigger_dsbp == 1) {
+ /* Deactivate general TLV-OTA setting, reset general TLV-OTA buffer */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+ tlvota_file->path_type = req->path_type;
+ strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ tlvota_file->last_mod_time = 0;
+ kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+ }
+ for(i = 0; i < MAX_SIM_NUM; i++){
+ is_read_general_tlvota[i] = KAL_TRUE;
+ }
+ }
+
+ }
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ 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)) ) {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+ break;
+ }
+
+ default:
+ {
+ MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_CONFIG_TYPE(req->config_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+
+ }
+
+
+ return ret;
+}
+#endif
+_STATIC mcf_ota_result_e mcf_set_file_path(l4c_mcf_set_config_req_struct *req)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ mcf_tool_file_info_t *pFile;
+ kal_uint32 i = 0;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ 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;
+
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+ }
+
+ /* Read MCF OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ MD_TRC_MCF_TR_SET_OTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2);
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ strncpy(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
+ } else {
+ strncpy(nv_ota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ }
+ MD_TRC_MCF_TR_SET_OTA_FILE_PATH_MD((kal_char *)nv_ota_file.path, (kal_char *)nv_ota_file.name);
+
+ /* Write MCF OTA file information in NVRAM */
+ 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)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = KAL_FALSE;
+
+ return MCF_OTA_R_READ_NVRAM_FAIL;
+ }
+
+ MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_AP((kal_char *)req->config3, (kal_char *)req->config4, req->ps_id);
+ if (strcmp((kal_char *)req->config3, "") != 0) {
+ strncpy(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, (kal_char *)req->config4, MCF_FILE_MAX_NAME_LEN - 1);
+ } else {
+ strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ }
+ MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_MD((kal_char *)nv_tlvota_file.path, (kal_char *)nv_tlvota_file.name, sim_id);
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_SET_OTA_FILE_PATH:
+ {
+ nvram_ef_mcf_ota_file_info_struct nv_ota_file;
+
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+ }
+
+ /* Read MCF OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ MD_TRC_MCF_TR_SET_OTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2);
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ strncpy(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
+ } else {
+ strncpy(nv_ota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ }
+ MD_TRC_MCF_TR_SET_OTA_FILE_PATH_MD((kal_char *)nv_ota_file.path, (kal_char *)nv_ota_file.name);
+
+ /* Write MCF OTA file information in NVRAM */
+ 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)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH:
+ {
+ nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+ }
+
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2, req->ps_id);
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ strncpy(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
+ } else {
+ strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ }
+ MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_MD((kal_char *)nv_tlvota_file.path, (kal_char *)nv_tlvota_file.name, sim_id);
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
+ {
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
+ /* If MCF is in DSBP passive mode, change to DSBP active mode */
+ ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
+ }
+ pMcf->dsbp_cnf_ret = KAL_TRUE;
+ pMcf->dsbp_ind_ret = KAL_TRUE;
+
+ switch (req->config_type)
+ {
+ case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+ {
+ nvram_ef_mcf_ota_file_info_struct nv_ota_file;
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
+ kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+ kal_bool is_get_custom_filename = KAL_FALSE;
+ kal_int32 fs_api_ret;
+ kal_uint8 path_type;
+
+ if (nv_int_info.not_reset_ota == KAL_TRUE) {
+ /* If MCF is in not reset mode, change to reset mode */
+ ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ nv_int_info.not_reset_ota = KAL_FALSE;
+ }
+
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ is_get_custom_filename = mcf_get_custom_file_path_name(&path_type, curr_filename);
+ if (is_get_custom_filename == KAL_TRUE) {
+ if (path_type >= L4C_MCF_PATH_TYPE_MAX) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ if (path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }
+ } else {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(curr_filename, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }
+ }
+
+ /* Check if file is existed */
+ kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+ fs_api_ret = FS_GetAttributes(filename);
+ if (fs_api_ret < FS_NO_ERROR) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, curr_filename);
+ ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ return ret;
+ }
+
+ /* Write MCF OTA file information to NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+
+ 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)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+ {
+ mcf_tlvota_file_t *tlvota_file;
+ mcf_tool_file_info_t *pFile;
+ nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+ em_mcf_read_ota_file_info_struct read_file_info;
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type;
+ kal_int32 fs_api_ret;
+
+ if (nv_int_info.not_reset_tlvota[sim_id] == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_not_reset(KAL_FALSE, req->config_type, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
+ }
+
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ /* Check if file is existed */
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ fs_api_ret = FS_GetAttributes(filename);
+ if (fs_api_ret < FS_NO_ERROR) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
+ ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+ read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+ read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+ read_file_info.ps_id = req->ps_id;
+ read_file_info.start_time = kal_get_systicks();
+
+ /* Read TLV-OTA file */
+ ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
+ // Store Read TLV-OTA file result for dsbp urc use
+ set_op_read_ret[sim_id] = ret;
+ if (ret == MCF_OTA_R_SUCCESS) {
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ /* Do not trigger DSBP if the same file as last one */
+ if ( (tlvota_file->last_file.path_type == apply_path_type) &&
+ (strncmp(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) &&
+ (strncmp(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len) == 0) &&
+ (strncmp(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len) == 0) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_CHANGE(0, tlvota_file->last_file.path_type);
+ dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.name);
+ dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.sw_version);
+ dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.gen_time);
+ ret = MCF_OTA_R_FILE_NOT_CHANGE;
+ } else {
+ /* Store temp updated file informantion */
+ kal_mem_set(&(tlvota_file->temp_file), 0, sizeof(mcf_file_info_t));
+ tlvota_file->temp_file.path_type = apply_path_type;
+ strncpy(tlvota_file->temp_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(tlvota_file->temp_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+ tlvota_file->temp_file.sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_VERSION(pFile->sw_version_len);
+ }
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(tlvota_file->temp_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+ tlvota_file->temp_file.gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_GEN_TIME(pFile->gen_time_len);
+ }
+
+ read_file_info.path_type = tlvota_file->path_type;
+ strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+ }
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
+ com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_FILE;
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return ret;
+ }
+ is_read_tlvota[sim_id] = KAL_TRUE;
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
+ }
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+ } else {
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ /* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+ tlvota_file->path_type = req->path_type;
+ strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+ }
+
+ /* Do not trigger DSBP if no last file */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ if (strncmp(tlvota_file->last_file.name, "", MCF_FILE_MAX_NAME_LEN) == 0) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_CHANGE(1, tlvota_file->last_file.path_type);
+ ret = MCF_OTA_R_FILE_NOT_CHANGE;
+ } else {
+ /* Clear last updated file informantion */
+ kal_mem_set(&(tlvota_file->temp_file), 0, sizeof(mcf_file_info_t));
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
+ }
+ is_read_tlvota[sim_id] = KAL_TRUE;
+ }
+
+ break;
+ }
+
+ default:
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
+ {
+ kal_bool is_combine = KAL_FALSE;
+
+ /* Read MCF Internal 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+ pMcf->dsbp_cnf_ret = KAL_TRUE;
+ pMcf->dsbp_ind_ret = KAL_TRUE;
+
+ switch (req->config_type)
+ {
+ case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+ {
+ nvram_ef_mcf_ota_file_info_struct nv_ota_file;
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
+ kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+ kal_int32 fs_api_ret;
+
+ is_combine = nv_int_info.is_combined_ota;
+
+ if(is_combine == KAL_FALSE){
+ if (nv_int_info.not_reset_ota == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ nv_int_info.not_reset_ota = KAL_FALSE;
+ }
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ /* Check if file is existed */
+ kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+ fs_api_ret = FS_GetAttributes(filename);
+ if (fs_api_ret < FS_NO_ERROR) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, curr_filename);
+ ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ return ret;
+ }
+
+ /* Write MCF OTA file information to NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+
+ 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)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+ } else {
+ /* Write MCF OTA file information to NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ kal_mem_set(nv_ota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ kal_mem_set(nv_ota_file.name, 0, MCF_FILE_MAX_NAME_LEN - 1);
+
+ 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)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+ }
+ }else{
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ ret = mcf_combined_ota_file(req);
+ if(ret != MCF_OTA_R_SUCCESS){
+ return ret;
+ }
+#else
+ ret = MCF_OTA_R_MCF_NOT_SUPPORT;
+ return ret;
+#endif
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+ {
+ mcf_tlvota_file_t *tlvota_file;
+ nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+ em_mcf_read_ota_file_info_struct read_file_info;
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type;
+ kal_int32 fs_api_ret;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ is_combine = nv_int_info.is_combined_tlvota[sim_id];
+ if(is_combine == KAL_FALSE){
+ if (nv_int_info.not_reset_tlvota[sim_id] == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_not_reset(KAL_FALSE, req->config_type, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
+ }
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
+ /* If MCF is in DSBP passive mode, change to DSBP active mode */
+ ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
+ }
+
+ /* Check if file is existed */
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ fs_api_ret = FS_GetAttributes(filename);
+ if (fs_api_ret < FS_NO_ERROR) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
+ ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if (req->trigger_dsbp == 1) {
+ /* Read TLV-OTA file */
+ kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+ read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+ read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+ read_file_info.ps_id = req->ps_id;
+ read_file_info.start_time = kal_get_systicks();
+
+ ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
+ // Store Read TLV-OTA file result for dsbp urc use
+ set_op_read_ret[sim_id] = ret;
+ if (ret == MCF_OTA_R_SUCCESS) {
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ /* Store last updated file informantion */
+ tlvota_file->last_file.path_type = apply_path_type;
+ strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+ tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_VERSION(pFile->sw_version_len);
+ }
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+ tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_GEN_TIME(pFile->gen_time_len);
+ }
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
+ com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_FILE;
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return ret;
+ }
+ read_file_info.path_type = tlvota_file->path_type;
+ strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+ is_read_tlvota[sim_id] = KAL_TRUE;
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
+ }
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ }
+ } else {
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+ }
+
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if (req->trigger_dsbp == 1) {
+ /* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+ tlvota_file->path_type = req->path_type;
+ strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ tlvota_file->last_mod_time = 0;
+ /* Clear last updated file informantion */
+ kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+ }
+ is_read_tlvota[sim_id] = KAL_TRUE;
+ }
+ }
+ }else{
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ ret = mcf_combined_ota_file(req);
+ if(ret != MCF_OTA_R_SUCCESS){
+ return ret;
+ }
+#else
+ ret = MCF_OTA_R_MCF_NOT_SUPPORT;
+ return ret;
+#endif
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+ {
+ mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
+ nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+ em_mcf_read_ota_file_info_struct read_file_info;
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type;
+ kal_int32 fs_api_ret;
+
+ is_combine = nv_int_info.is_combined_general_tlvota;
+ if(is_combine == KAL_FALSE){
+ if (nv_int_info.not_reset_general_tlvota == KAL_TRUE) {
+ /* If MCF is in DSBP active mode, change to DSBP passive mode */
+ ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ nv_int_info.not_reset_general_tlvota = KAL_FALSE;
+ }
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ if (pMcf->general_is_ignore_dsbp == KAL_FALSE) {
+ /* If MCF is in DSBP passive mode, change to DSBP active mode */
+ ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_TRUE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->general_is_ignore_dsbp = KAL_TRUE;
+ }
+ /* Check if file is existed */
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ fs_api_ret = FS_GetAttributes(filename);
+ if (fs_api_ret < FS_NO_ERROR) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
+ ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF general TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Write MCF general TLV-OTA file information in NVRAM */
+ 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)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if (req->trigger_dsbp == 1) {
+ /* Read general TLV-OTA file */
+ kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+ read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+ read_file_info.config_type = L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN;
+ read_file_info.ps_id = req->ps_id;
+ read_file_info.start_time = kal_get_systicks();
+
+ ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
+ if (ret == MCF_OTA_R_SUCCESS) {
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ /* Store last updated file informantion */
+ tlvota_file->last_file.path_type = apply_path_type;
+ strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+ tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+ }
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+ tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+ }
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return ret;
+ }
+ read_file_info.path_type = tlvota_file->path_type;
+ strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+ for(i = 0; i < MAX_SIM_NUM; i++){
+ is_read_general_tlvota[i] = KAL_TRUE;
+ }
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
+ }
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+ }
+ } else {
+ if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
+ /* If MCF is in DSBP passive mode, change to DSBP active mode */
+ ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_TRUE, sim_id);
+ if (ret != MCF_OTA_R_SUCCESS) {
+ return ret;
+ }
+ pMcf->general_is_ignore_dsbp = KAL_FALSE;
+ }
+ /* Read MCF general TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+
+ /* Write MCF general TLV-OTA file information in NVRAM */
+ 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)) ) {
+ MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if (req->trigger_dsbp == 1) {
+ /* Deactivate general TLV-OTA setting, reset general TLV-OTA buffer */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+ tlvota_file->path_type = req->path_type;
+ strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+ tlvota_file->last_mod_time = 0;
+ /* Clear last updated file informantion */
+ kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+ }
+ for(i = 0; i < MAX_SIM_NUM; i++){
+ is_read_general_tlvota[i] = KAL_TRUE;
+ }
+ }
+ }
+ }else{
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ ret = mcf_combined_ota_file(req);
+ if(ret != MCF_OTA_R_SUCCESS){
+ return ret;
+ }
+#else
+ ret = MCF_OTA_R_MCF_NOT_SUPPORT;
+ return ret;
+#endif
+ }
+
+ break;
+ }
+
+ default:
+ MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+
+ break;
+ }
+
+ default:
+ ASSERT(0);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ }
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_get_applied_file_path(
+ l4c_mcf_get_config_req_struct *req,
+ l4c_mcf_get_config_cnf_struct *resp)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ switch (req->op)
+ {
+ case L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH:
+ switch (req->config_type)
+ {
+ case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+ {
+ mcf_ota_file_t *ota_file = &(pMcf->ota_file);
+
+ resp->config_type = req->config_type;
+
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ resp->path_type = ota_file->path_type;
+ strncpy((kal_char *)resp->config1, ota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ }
+ break;
+ }
+
+ case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+ {
+ mcf_tlvota_file_t *tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ resp->config_type = req->config_type;
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ resp->path_type = tlvota_file->path_type;
+ strncpy((kal_char *)resp->config1, tlvota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ }
+ break;
+ }
+
+ case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+ {
+ mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
+
+ resp->config_type = req->config_type;
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ resp->path_type = tlvota_file->path_type;
+ strncpy((kal_char *)resp->config1, tlvota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ }
+ break;
+ }
+
+ default:
+ MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_UNSUPPORTED_CONFIG_TYPE(req->config_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH(ret, req->ps_id, sim_id, req->config_type, resp->path_type, resp->config1);
+ break;
+
+ default:
+ ASSERT(0);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ }
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_dump_all_lid_data(l4c_mcf_dump_data_req_struct *req_ptr)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_custom_dump_param_struct dump_para[MAX_SIM_NUM];
+ mcf_dump_lid_header_struct dump_lid_header;
+ mcf_dump_lid_header_struct *dump_header_ptr = NULL;
+ nvram_ltable_entry_struct lid_info = {0};
+ time_t time_sec;
+ MCF_TIME_STRUCT curr_time;
+ kal_wchar foldername[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char folder_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char file_name[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_uint32 total_size;
+ kal_uint32 lid_size;
+ kal_uint32 padding;
+ kal_uint32 i, j, k;
+ kal_bool is_found = KAL_FALSE;
+ kal_bool ret;
+ nvram_errno_enum nvram_api_ret;
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+ kal_uint32 dump_lid_cnt = 0;
+ kal_uint32 m;
+ kal_char last_dump_folder_name[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_int32 fs_ret = FS_NO_ERROR;
+ kal_wchar pathname[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_int32 ret_snprintf;
+ kal_int32 ret_sprintf;
+ time_t time_ret;
+
+ /* Create dump folder */
+ time_ret = time(&time_sec);
+ if (time_ret == (time_t)(-1)){
+ time_sec = 0;
+ }
+#if __MTK_TARGET__
+ localtime_r(&time_sec, &curr_time);
+#else
+ curr_time.tm_year = 12;
+ curr_time.tm_mon = 3;
+ curr_time.tm_mday = 4;
+ curr_time.tm_hour = 5;
+ curr_time.tm_min = 6;
+ curr_time.tm_sec = 7;
+#endif
+ mcf_snprintf(folder_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s\\%s_%.4d%.2d%.2d_%.2d%.2d%.2d%c", MCF_FS_CUSTOM_FOLDER_PATH, MCF_DUMP_FOLDER_PREFIX, curr_time.tm_year + 1900, curr_time.tm_mon + 1, curr_time.tm_mday, curr_time.tm_hour, curr_time.tm_min, curr_time.tm_sec, '\0');
+
+ kal_wsprintf(foldername, "%s\0", folder_path);
+ FS_CreateDir(foldername);
+
+ /* Support MCF Tool Read/Write - Delete txt */
+
+ kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_DUMP_FOLDER_NAME);
+ fs_ret = FS_Delete(pathname);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DELETE_FILE_FAIL(fs_ret);
+ mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return mcf_ret;
+ }
+
+ MD_TRC_MCF_TR_DUMP_ALL_LID_START(folder_path);
+
+ kal_mem_set(dump_para, 0, sizeof(mcf_custom_dump_param_struct) * MAX_SIM_NUM);
+ for (k = 0; k < MAX_SIM_NUM; k++) {
+ dump_para[k].ps_id = l4c_gemini_get_switched_sim_id(k);
+ dump_para[k].sbp_id = pMcf->tlvota_file[k].sbp_id;
+ kal_mem_cpy(&(dump_para[k].mcc), &(pMcf->tlvota_file[k].mcc), MAX_MCC_STR_LEN);
+ kal_mem_cpy(&(dump_para[k].mnc), &(pMcf->tlvota_file[k].mnc), MAX_MNC_STR_LEN);
+ kal_mem_cpy(&(dump_para[k].iccid), &(pMcf->tlvota_file[k].iccid), 21);
+ dump_para[k].size = &lid_size;
+ }
+
+ dump_lid_cnt = req_ptr->lid_cnt;
+ MD_TRC_MCF_TR_DUMP_ALL_LID_NUMBER(dump_lid_cnt);
+
+ /* Dump all LIDs */
+ if(dump_lid_cnt == 0){
+ for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
+ is_found = KAL_FALSE;
+
+ nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_GET_LID_INFO_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
+ continue;
+ }
+
+ if ((lid_info.size % 4) == 0) {
+ padding = 0;
+ } else {
+ padding = 4 - (lid_info.size % 4);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_SIZE_NOT_ALIGNMENT(lid_info.LID, lid_info.size, padding);
+ }
+
+ for (j = 0; j < mcf_dump_param_tbl_num; j++) {
+ if ( (mcf_dump_param_tbl[j].lid == mcf_db_lid_mapping_tbl[i].lid_num) ) {
+ is_found = KAL_TRUE;
+
+ if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
+ total_size = 0;
+
+ if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
+ for (k = 0; k < lid_info.total_records; k++) {
+ dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[0].lid = mcf_dump_param_tbl[j].lid;
+ dump_para[0].type = MCF_TYPE_OTA;
+ dump_para[0].record_idx = k + 1;
+ dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+ *(dump_para[0].size) = 0;
+
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_CALLBACK(dump_para[0].lid, dump_para[0].type, dump_para[0].record_idx, dump_para[0].buffer);
+
+ ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[0]);
+ if ( (ret == KAL_FALSE) || (*(dump_para[0].size) != lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_DUMP_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, ret, lid_info.size, *(dump_para[0].size));
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = k + 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+ }
+ } else {
+ /* If not register callback */
+ for (k = 0; k < lid_info.total_records; k++) {
+ dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+ if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size);
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = k + 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+ }
+ }
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_default%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+
+ if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
+ if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
+ for (k = 0; k < MAX_SIM_NUM; k++) {
+ if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+ continue;
+ }
+
+ total_size = 0;
+
+ dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[k].lid = mcf_dump_param_tbl[j].lid;
+ dump_para[k].type = MCF_TYPE_OTA_BY_OP;
+ dump_para[k].record_idx = 1;
+ dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+ *(dump_para[k].size) = 0;
+
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_CALLBACK_1_USIR(dump_para[k].ps_id, dump_para[k].sbp_id, dump_para[k].mcc, dump_para[k].mnc, dump_para[k].iccid);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_CALLBACK_2(dump_para[k].lid, dump_para[k].type, dump_para[k].record_idx, dump_para[k].buffer);
+
+ ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[k]);
+ if ( (ret == KAL_FALSE) || (*(dump_para[k].size) != lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_DUMP_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, ret, lid_info.size, *(dump_para[k].size));
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+ } else {
+ /* If not register callback */
+ for (k = 0; k < MAX_SIM_NUM; k++) {
+ if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+ continue;
+ }
+
+ total_size = 0;
+
+ dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+ if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size);
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+ }
+ }
+
+ break;
+ }
+ }
+
+ /* If not register callback */
+ if (is_found == KAL_FALSE) {
+ if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
+ total_size = 0;
+
+ for (k = 0; k < lid_info.total_records; k++) {
+ dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+ if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size);
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = k + 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+ }
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_default%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+
+ if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
+ for (k = 0; k < MAX_SIM_NUM; k++) {
+ if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+ continue;
+ }
+
+ total_size = 0;
+
+ dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+ if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size);
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+ }
+ }
+ }
+ }else if (dump_lid_cnt > 0)
+ {
+ /* Only dump dump_lid_cnt LIDs */
+ for(m = 0; m < dump_lid_cnt; m++){
+ is_found = KAL_FALSE;
+ for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
+ if (req_ptr->lid[m] == mcf_db_lid_mapping_tbl[i].lid_num){
+ is_found = KAL_TRUE;
+ }
+
+ }
+ if (is_found == KAL_FALSE)
+ {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_CANNOT_FIND_LID(req_ptr->lid[m]);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ }
+
+ for(m = 0; m < dump_lid_cnt; m++){
+ is_found = KAL_FALSE;
+ for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
+ if (req_ptr->lid[m] == mcf_db_lid_mapping_tbl[i].lid_num){
+ is_found = KAL_FALSE;
+
+ nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_GET_LID_INFO_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
+ continue;
+ }
+
+ if ((lid_info.size % 4) == 0) {
+ padding = 0;
+ } else {
+ padding = 4 - (lid_info.size % 4);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_SIZE_NOT_ALIGNMENT(lid_info.LID, lid_info.size, padding);
+ }
+
+ for (j = 0; j < mcf_dump_param_tbl_num; j++) {
+ if ( (mcf_dump_param_tbl[j].lid == mcf_db_lid_mapping_tbl[i].lid_num) ) {
+ is_found = KAL_TRUE;
+
+ if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
+ total_size = 0;
+
+ if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
+ for (k = 0; k < lid_info.total_records; k++) {
+ dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[0].lid = mcf_dump_param_tbl[j].lid;
+ dump_para[0].type = MCF_TYPE_OTA;
+ dump_para[0].record_idx = k + 1;
+ dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+ *(dump_para[0].size) = 0;
+
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_CALLBACK(dump_para[0].lid, dump_para[0].type, dump_para[0].record_idx, dump_para[0].buffer);
+
+ ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[0]);
+ if ( (ret == KAL_FALSE) || (*(dump_para[0].size) != lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_DUMP_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, ret, lid_info.size, *(dump_para[0].size));
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = k + 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+ }
+ } else {
+ /* If not register callback */
+ for (k = 0; k < lid_info.total_records; k++) {
+ dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+ if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size);
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = k + 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+ }
+ }
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_default%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+
+ if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
+ if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
+ for (k = 0; k < MAX_SIM_NUM; k++) {
+ if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+ continue;
+ }
+
+ total_size = 0;
+
+ dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[k].lid = mcf_dump_param_tbl[j].lid;
+ dump_para[k].type = MCF_TYPE_OTA_BY_OP;
+ dump_para[k].record_idx = 1;
+ dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+ *(dump_para[k].size) = 0;
+
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_CALLBACK_1_USIR(dump_para[k].ps_id, dump_para[k].sbp_id, dump_para[k].mcc, dump_para[k].mnc, dump_para[k].iccid);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_CALLBACK_2(dump_para[k].lid, dump_para[k].type, dump_para[k].record_idx, dump_para[k].buffer);
+
+ ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[k]);
+ if ( (ret == KAL_FALSE) || (*(dump_para[k].size) != lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_DUMP_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, ret, lid_info.size, *(dump_para[k].size));
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+ } else {
+ /* If not register callback */
+ for (k = 0; k < MAX_SIM_NUM; k++) {
+ if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+ continue;
+ }
+
+ total_size = 0;
+
+ dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+ if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size);
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+ }
+ }
+
+ break;
+ }
+ }
+
+ /* If not register callback */
+ if (is_found == KAL_FALSE) {
+ if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
+ total_size = 0;
+
+ for (k = 0; k < lid_info.total_records; k++) {
+ dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+ if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size);
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = k + 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+ }
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_default%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+
+ if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
+ for (k = 0; k < MAX_SIM_NUM; k++) {
+ if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+ continue;
+ }
+
+ total_size = 0;
+
+ dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+ kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+ dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+ if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size);
+ break;
+ }
+
+ /* Add header */
+ kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+ strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+ dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+ dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+ dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+ dump_lid_header.content_len = lid_info.size;
+ dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+ dump_lid_header.record_idx = 1;
+ strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+ dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+ dump_lid_header.checksum = 0; /* unused */
+ kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+ total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+ ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+ }
+ mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+ }
+ }
+
+ }
+ }
+ }
+ }
+
+ /* Support MCF Tool Read/Write - Write dump folder name into txt */
+ kal_mem_set(last_dump_folder_name, 0, MCF_FILE_MAX_MD_PATH_LEN);
+ ret_sprintf = kal_snprintf(last_dump_folder_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%.4d%.2d%.2d_%.2d%.2d%.2d%c", MCF_DUMP_FOLDER_PREFIX, curr_time.tm_year + 1900, curr_time.tm_mon + 1, curr_time.tm_mday, curr_time.tm_hour, curr_time.tm_min, curr_time.tm_sec, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(last_dump_folder_name, "unknown_error", MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }
+ MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_FOLDER_NAME(last_dump_folder_name);
+ if(mcf_ret == MCF_OTA_R_SUCCESS){
+ mcf_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_DUMP_FOLDER_NAME, (kal_uint8 *)last_dump_folder_name, sizeof(kal_char) * strlen(last_dump_folder_name));
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ }
+
+ return mcf_ret;
+}
+
+_STATIC mcf_ota_result_e mcf_config_ini_info(
+ l4c_mcf_config_req_struct *req,
+ l4c_mcf_config_cnf_struct *resp)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+ mcf_ini_file_t *ini_file = &(pMcf->ini_file);
+ kal_char *buffer = (kal_char *)ini_file->tmp_buff;
+ kal_char orign_value[MCF_MAX_INI_ITEM_VALUE_LEN];
+ kal_uint64 ini_path_ota_file_last_mod_time = 0;
+ kal_uint64 ini_path_runtime_file_last_mod_time = 0;
+ kal_uint64 ini_last_read_mod_time = 0;
+ kal_char ini_root_path[20];
+
+ if(strcmp((kal_char *)req->item,"") == 0){
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ if(strlen((kal_char *)req->item) > 63){
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ kal_mem_set((kal_char *)resp->item,0,MCF_MAX_INI_ITEM_LEN);
+ kal_mem_set((kal_char *)resp->value,0,MCF_MAX_INI_ITEM_VALUE_LEN);
+ strncpy((kal_char *)resp->item, (kal_char *)req->item, MCF_MAX_INI_ITEM_LEN-1);
+
+ switch (req->mode)
+ {
+ case L4C_MCF_CONFIG_MODE_READ:
+
+ ini_last_read_mod_time = ini_file->last_mod_time;
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if (mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+ }
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_CONFIG_INI_LAST_MOD_TIME(ini_path_ota_file_last_mod_time, ini_path_runtime_file_last_mod_time, ini_last_read_mod_time);
+ kal_mem_set(ini_root_path,0,20);
+ if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
+ strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
+ }else{
+ strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
+ }
+
+ MD_TRC_MCF_TR_CONFIG_INI_READ(ini_root_path);
+ if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) == MCF_OTA_R_SUCCESS) {
+
+ } else {
+ /* Cannot do OTA if fail to read ini file */
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+
+ if (mcf_find_ini_item((kal_char *)ini_file->buff, (kal_char *)resp->item, (kal_char *)resp->value, pMcf) == KAL_TRUE) {
+
+
+
+ } else {
+ /* Cannot do OTA if fail to read ini file */
+ mcf_ret = MCF_OTA_R_INVALID_INI_ITEM;
+ return mcf_ret;
+ }
+
+
+ break;
+
+ case L4C_MCF_CONFIG_MODE_WRITE:
+
+ strncpy((kal_char *)resp->value, (kal_char *)req->value, MCF_MAX_INI_ITEM_VALUE_LEN-1);
+
+
+ ini_last_read_mod_time = ini_file->last_mod_time;
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if (mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+ }
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_CONFIG_INI_LAST_MOD_TIME(ini_path_ota_file_last_mod_time, ini_path_runtime_file_last_mod_time, ini_last_read_mod_time);
+ kal_mem_set(ini_root_path,0,20);
+ if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
+ strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
+ }else{
+ strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
+ }
+
+
+ MD_TRC_MCF_TR_CONFIG_INI_READ(ini_root_path);
+ if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) == MCF_OTA_R_SUCCESS) {
+
+ } else {
+ /* Cannot do OTA if fail to read ini file */
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+ kal_mem_set(orign_value, 0, MCF_MAX_INI_ITEM_VALUE_LEN);
+ kal_mem_set((kal_char *)resp->value, 0, MCF_MAX_INI_ITEM_VALUE_LEN);
+ mcf_find_ini_item((kal_char *)ini_file->buff, (kal_char *)resp->item, orign_value, pMcf);
+
+ kal_mem_set(buffer,0,MCF_MAX_INI_FILE_SIZE);
+ if (mcf_compose_ini_item((kal_char *)ini_file->buff, buffer, (kal_char *)resp->item, orign_value, (kal_char *)resp->value) == KAL_TRUE) {
+ mcf_ret = mcf_write_buffer(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, (kal_uint8 *)buffer, strlen(buffer));
+ if (mcf_ret != MCF_OTA_R_SUCCESS){
+ return mcf_ret;
+ }
+
+ } else {
+ /* Cannot do OTA if fail to read ini file */
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ break;
+
+ default:
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ }
+
+
+ return mcf_ret;
+}
+
+_STATIC mcf_ota_result_e mcf_update_ota_file(
+ l4c_mcf_update_ota_file_req_struct *req,
+ l4c_mcf_update_ota_file_cnf_struct *resp,
+ module_type src_mod_id,
+ kal_bool *reset_MD)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ //sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+ //nvram_ef_mcf_ini_file_info_struct ini_file;
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+ mcf_ini_file_t *ini_file = &(pMcf->ini_file);
+ kal_uint32 sbp_id_arr[MCF_MAX_TAG_NUM];
+ kal_char tag_str[MCF_MAX_INI_ITEM_VALUE_LEN];
+ kal_uint16 sbp_id_num = 0;
+ mcf_ota_file_t *ota_file = &(pMcf->ota_file);
+ mcf_tlvota_file_t *tlvota_file;
+ kal_int32 i = 0;
+ kal_int32 j = 0;
+ kal_char ota_path_name[MCF_FILE_MAX_NAME_LEN];
+ kal_uint64 ota_last_read_mod_time = 0;
+ kal_uint64 ota_path_ota_file_last_mod_time = 0;
+ kal_uint64 ota_path_runtime_file_last_mod_time = 0;
+ kal_uint32 sbp_id = SBP_ID_INVALID;
+ protocol_id_enum ps_id = 0;
+ kal_char tlvota_path_name[MCF_FILE_MAX_NAME_LEN];
+ kal_uint64 tlvota_last_read_mod_time = 0;
+ kal_uint64 tlvota_path_ota_file_last_mod_time = 0;
+ kal_uint64 tlvota_path_runtime_file_last_mod_time = 0;
+ mcf_l4bsbp_trigger_dsbp_ind_struct *ind_ptr = NULL;
+ kal_bool apply_general_tlv;
+ kal_char tag_name[10];
+ kal_bool trigger_ps_id[MAX_SIM_NUM];
+ kal_uint64 ini_last_read_mod_time = 0;
+ kal_uint64 ini_path_ota_file_last_mod_time = 0;
+ kal_uint64 ini_path_runtime_file_last_mod_time = 0;
+ kal_char ini_root_path[20];
+ kal_uint32 ret_sprintf;
+
+
+ MD_TRC_MCF_TR_UPDATE_OTA_START();
+
+
+ pMcf->dsbp_cnf_ret = KAL_TRUE;
+ pMcf->dsbp_ind_ret = KAL_TRUE;
+ apply_general_tlv = KAL_FALSE;
+ kal_mem_set(trigger_ps_id,0,MAX_SIM_NUM);
+ /* Compare modified time of OTA file to know whether update OTA file */
+
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ kal_mem_set(ota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+ strncpy(ota_path_name, ota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
+ ota_last_read_mod_time = ota_file->last_mod_time;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ } else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_OTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if (mcf_get_file_last_mod_time (MCF_FS_DEFAULT_OTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ mcf_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+ //return mcf_ret;
+ }
+ }
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_OTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_OTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ mcf_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+ //return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_OTA_LAST_MOD_TIME(ota_path_ota_file_last_mod_time, ota_path_runtime_file_last_mod_time, ota_last_read_mod_time);
+
+ if (ota_path_ota_file_last_mod_time > ota_path_runtime_file_last_mod_time){
+ if(ota_path_ota_file_last_mod_time > ota_last_read_mod_time){
+ /* If OTA file is updated, need to reset MD to apply OTA */
+ MD_TRC_MCF_TR_UPDATE_OTA_RESET_MD(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((ota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((ota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_last_read_mod_time & 0xFFFFFFFF));
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ *reset_MD = KAL_TRUE;
+
+ return mcf_ret;
+ }
+ }else{
+ if(ota_path_runtime_file_last_mod_time > ota_last_read_mod_time){
+ /* If OTA file is updated, need to reset MD to apply OTA */
+ MD_TRC_MCF_TR_UPDATE_OTA_RESET_MD(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((ota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((ota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_last_read_mod_time & 0xFFFFFFFF));
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ *reset_MD = KAL_TRUE;
+ return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_OTA();
+
+ switch (req->action)
+ {
+ case L4C_MCF_CONFIG_ACT_NO_READ_INI:
+ /* Update OTA file without reading ini file */
+ MD_TRC_MCF_TR_UPDATE_OTA_NO_READ_INI();
+
+ /* If general_tlvota_file update, every sim card should apply */
+ tlvota_file = &(pMcf->general_tlvota_file);
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if (mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+
+ }
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_GTLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+ if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+
+ /* If TLV OTA file is updated, trigger DSBP with retry */
+ if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+ MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }else{
+ MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }
+
+
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+
+ for (i = 0; i < MAX_SIM_NUM; i++){
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return mcf_ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->src_mod_id = src_mod_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+ ind_ptr->is_dsbp_retry = 1;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + i, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
+ apply_general_tlv = KAL_TRUE;
+ return mcf_ret;
+
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
+
+ tlvota_path_ota_file_last_mod_time = 0;
+ tlvota_path_runtime_file_last_mod_time = 0;
+ tlvota_last_read_mod_time = 0;
+
+ /* Compare modified time of TLV OTA file to know whether update TLV OTA 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){
+ sbp_id = tlvota_file->sbp_id;
+ ps_id = tlvota_file->ps_id;
+ tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+ tlvota_path_ota_file_last_mod_time = 0;
+ tlvota_path_runtime_file_last_mod_time = 0;
+
+ if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_SBP_ID(sbp_id);
+
+ /* If have not read tlv ota file, trigger DSBP */
+ if(sbp_id == SBP_ID_INVALID){
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ }else{
+ kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+ ret_sprintf = kal_snprintf(tlvota_path_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, sbp_id, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+
+ if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+
+ /* If TLV OTA file is updated, trigger DSBP with retry */
+ if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+ MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }else{
+ MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }
+
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return mcf_ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->src_mod_id = src_mod_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+ ind_ptr->is_dsbp_retry = 1;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + ps_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ mcf_ret = MCF_OTA_R_SUCCESS;
+
+
+
+ }
+
+ }
+ }
+
+
+ break;
+
+ case L4C_MCF_CONFIG_ACT_READ_INI:
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_INI();
+ /* Update OTA file with reading ini file */
+ ini_last_read_mod_time = ini_file->last_mod_time;
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if (mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+ }
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ ini_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_INI_LAST_MOD_TIME(ini_path_ota_file_last_mod_time, ini_path_runtime_file_last_mod_time, ini_last_read_mod_time);
+ kal_mem_set(ini_root_path,0,20);
+ if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
+ strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
+ }else{
+ strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
+ }
+
+
+ MD_TRC_MCF_TR_UPDATE_OTA_INI_READ(ini_root_path);
+ if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) != MCF_OTA_R_SUCCESS) {
+ mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+ return mcf_ret;
+ }
+
+ kal_mem_set(tag_name,0,10);
+ strncpy(tag_name,"TagName", 9);
+ mcf_find_ini_item((kal_char *)ini_file->buff, tag_name, tag_str, pMcf);
+ if(strcmp(tag_str,"") == 0){
+ /* Normal TLV OTA apply */
+ /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
+ MD_TRC_MCF_TR_UPDATE_OTA_FIND_INI_TAGNAME_NULL();
+ /* If general_tlvota_file update, every sim card should apply */
+
+ tlvota_file = &(pMcf->general_tlvota_file);
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if (mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+
+ }
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+ if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+
+ /* If TLV OTA file is updated, trigger DSBP with retry */
+ if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+ MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }else{
+ MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }
+
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+
+ for (i = 0; i < MAX_SIM_NUM; i++){
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return mcf_ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->src_mod_id = src_mod_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+ ind_ptr->is_dsbp_retry = 1;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + i, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ }
+ MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
+ apply_general_tlv = KAL_TRUE;
+ return mcf_ret;
+
+
+ }
+
+ tlvota_path_ota_file_last_mod_time = 0;
+ tlvota_path_runtime_file_last_mod_time = 0;
+ tlvota_last_read_mod_time = 0;
+
+ /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
+ MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
+ 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){
+ sbp_id = tlvota_file->sbp_id;
+ ps_id = tlvota_file->ps_id;
+ tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+ if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ tlvota_path_ota_file_last_mod_time = 0;
+ tlvota_path_runtime_file_last_mod_time = 0;
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_SBP_ID(sbp_id);
+ /* If have not read tlv ota file, trigger DSBP */
+ if(sbp_id == SBP_ID_INVALID){
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ }else{
+ kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+ ret_sprintf = kal_snprintf(tlvota_path_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, sbp_id, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+ if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+
+ /* If TLV OTA file is updated, trigger DSBP with retry */
+ if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+ MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }else{
+ MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }
+
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return mcf_ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->src_mod_id = src_mod_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+ ind_ptr->is_dsbp_retry = 1;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + ps_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ mcf_ret = MCF_OTA_R_SUCCESS;
+
+
+
+ }
+
+ }
+ }
+ }else{
+ /* If critical tag is not null */
+ MD_TRC_MCF_TR_UPDATE_OTA_FIND_INI_TAGNAME(tag_str);
+ if(mcf_find_ini_sbp_id (tag_str,sbp_id_arr,&sbp_id_num,&apply_general_tlv) == KAL_TRUE){
+ /*If general tlvota case is critical, every sim card need to apply general tlv ota */
+ if (apply_general_tlv == KAL_TRUE){
+
+ tlvota_file = &(pMcf->general_tlvota_file);
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if (mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+
+ }
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_CGTLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+ if(tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+
+ /* If TLV OTA file is updated, trigger DSBP with retry */
+ if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+ MD_TRC_MCF_TR_UPDATE_CRITICAL_GTLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }else{
+ MD_TRC_MCF_TR_UPDATE_CRITICAL_GTLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }
+
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+
+ for (i = 0; i < MAX_SIM_NUM; i++){
+
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return mcf_ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->src_mod_id = src_mod_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+ ind_ptr->is_dsbp_retry = 0;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + i, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ }
+ MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
+ return mcf_ret;
+
+
+ }
+
+ tlvota_path_ota_file_last_mod_time = 0;
+ tlvota_path_runtime_file_last_mod_time = 0;
+ tlvota_last_read_mod_time = 0;
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
+
+ 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){
+ sbp_id = tlvota_file->sbp_id;
+ ps_id = tlvota_file->ps_id;
+ tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+ if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ tlvota_path_ota_file_last_mod_time = 0;
+ tlvota_path_runtime_file_last_mod_time = 0;
+ kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+ ret_sprintf = kal_snprintf(tlvota_path_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, sbp_id, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
+ for (j = 0; j < sbp_id_num; j++){
+ if (sbp_id == sbp_id_arr[j]){
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+ if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+
+ /* If TLV OTA file is updated, trigger DSBP without retry */
+ if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+ MD_TRC_MCF_TR_UPDATE_CRITICAL_TLVOTA_TRIGGER_DSBP(tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }else{
+ MD_TRC_MCF_TR_UPDATE_CRITICAL_TLVOTA_TRIGGER_DSBP(tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }
+
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+
+ return mcf_ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->src_mod_id = src_mod_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+ ind_ptr->is_dsbp_retry = 0;
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + ps_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ trigger_ps_id[ps_id] = KAL_TRUE;
+
+
+
+ }
+ }
+ }
+
+ }
+
+ /* If no critical OP OTA trigger DSBP, check if general OTA whether updated */
+
+ if(pMcf->dsbp_cnf_cnt < MAX_SIM_NUM){
+
+ MD_TRC_MCF_TR_UPDATE_OTA_NO_CRITICAL_CASE();
+
+ /* If general_tlvota_file update, every sim card should apply */
+ tlvota_file = &(pMcf->general_tlvota_file);
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if (mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+
+ }
+
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+ if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+
+ /* If TLV OTA file is updated, trigger DSBP with retry */
+ if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+ MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }else{
+ MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }
+
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+
+
+
+ for (i = 0; i < MAX_SIM_NUM; i++){
+
+ if (trigger_ps_id[i] != KAL_TRUE){
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return mcf_ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->src_mod_id = src_mod_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+ ind_ptr->is_dsbp_retry = 1;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + i, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ }
+
+ }
+ apply_general_tlv = KAL_TRUE;
+ MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
+ return mcf_ret;
+
+
+ }
+
+ tlvota_path_ota_file_last_mod_time = 0;
+ tlvota_path_runtime_file_last_mod_time = 0;
+ tlvota_last_read_mod_time = 0;
+
+ /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
+ MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
+ 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){
+ sbp_id = tlvota_file->sbp_id;
+ ps_id = tlvota_file->ps_id;
+ tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return mcf_ret;
+ }
+
+ if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ tlvota_path_ota_file_last_mod_time = 0;
+ tlvota_path_runtime_file_last_mod_time = 0;
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
+ /* If have not read tlv ota file, trigger DSBP */
+ if(sbp_id == SBP_ID_INVALID){
+ mcf_ret = MCF_OTA_R_SUCCESS;
+ }else{
+ kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+ ret_sprintf = kal_snprintf(tlvota_path_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, sbp_id, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_ota_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+
+ if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+ tlvota_path_runtime_file_last_mod_time = 0;
+ MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+ //return mcf_ret;
+ }
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+ if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+
+ /* If TLV OTA file is updated, trigger DSBP with retry */
+ if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+ MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }else{
+ MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+ (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+ }
+
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+ if(trigger_ps_id[ps_id] != KAL_TRUE){
+
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return mcf_ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->src_mod_id = src_mod_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+ ind_ptr->is_dsbp_retry = 1;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + ps_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ mcf_ret = MCF_OTA_R_SUCCESS;
+
+ }
+
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+
+
+
+ break;
+
+ default:
+ ASSERT(0);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ }
+
+ MD_TRC_MCF_TR_UPDATE_OTA_RETURN_VALUE(pMcf->dsbp_cnf_cnt);
+ return mcf_ret;
+}
+
+_STATIC mcf_ota_result_e mcf_config_LID_variable(
+ l4c_mcf_config_lid_variable_operation_req_struct *req,
+ l4c_mcf_config_lid_variable_operation_cnf_struct *resp)
+{
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+#ifdef __MCF_FIND_TAG_SUPPORT__
+ mcf_t *pMcf = mcf_get_instance();
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+ kal_bool ret = KAL_TRUE;
+ nvram_ltable_entry_struct lid_info = {0};
+ nvram_errno_enum nvram_api_ret;
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ mcf_custom_dump_param_struct dump_para;
+ kal_uint32 lid_size;
+ kal_uint32 i;
+ mcf_tag_info_struct query_tag = {0};
+ kal_uint8 lid_value[512];
+ kal_uint32 j = 0;
+ kal_uint32 n = 1;
+ MCF_DB_STRUCT_VARIABLE const *db_ptr = NULL;
+ kal_uint32 read_len = 0;
+ kal_bool invalid_arr_size = KAL_FALSE;
+ kal_bool next_level_array = KAL_FALSE;
+ kal_bool is_found = KAL_FALSE;
+ kal_uint8 hex_value[512];
+
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_START(req->lid_num, req->rec_id, req->tag_name);
+ kal_mem_set(&dump_para, 0, sizeof(mcf_custom_dump_param_struct));
+ kal_mem_set(hex_value, 0, 512);
+
+ resp->len = req->len;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_SIM_ID(req->ps_id, sim_id);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+
+ nvram_api_ret = nvram_external_get_lid_info(req->lid_num, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_GET_LID_INFO_FAIL(req->lid_num, nvram_api_ret);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+
+
+ kal_mem_set(mcf_dump_buffer, 0, lid_info.size);
+
+ if(req->rec_id > lid_info.total_records){
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }else if (req->rec_id == 0){
+ req->rec_id = 1;
+ }
+
+ dump_para.ps_id = req->ps_id;
+ dump_para.sbp_id = pMcf->tlvota_file[sim_id].sbp_id;
+ kal_mem_cpy(&(dump_para.mcc), &(pMcf->tlvota_file[sim_id].mcc), MAX_MCC_STR_LEN);
+ kal_mem_cpy(&(dump_para.mnc), &(pMcf->tlvota_file[sim_id].mnc), MAX_MNC_STR_LEN);
+ kal_mem_cpy(&(dump_para.iccid), &(pMcf->tlvota_file[sim_id].iccid), 21);
+ dump_para.size = &lid_size;
+
+
+
+
+ for (i = 0; i < mcf_dump_param_tbl_num; i++) {
+ if ( (mcf_dump_param_tbl[i].lid == req->lid_num) ) {
+ is_found = KAL_TRUE;
+ if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+
+ dump_para.type = MCF_TYPE_OTA;
+ dump_para.record_idx = req->rec_id;
+
+ if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
+
+ dump_para.lid = mcf_dump_param_tbl[i].lid;
+ dump_para.buffer = mcf_dump_buffer;
+ *(dump_para.size) = 0;
+
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_CALLBACK(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
+
+ ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
+ if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_DUMP_ERROR(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ } else {
+ /* If not register callback */
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM(lid_info.LID, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
+ dump_para.buffer = mcf_dump_buffer;
+ if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ }
+ }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
+ dump_para.type = MCF_TYPE_OTA_BY_OP;
+ dump_para.record_idx = 1;
+
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_USIR(dump_para.lid, dump_para.record_idx, dump_para.ps_id, dump_para.sbp_id, dump_para.mnc, dump_para.mcc, dump_para.iccid);
+
+ if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
+ dump_para.lid = mcf_dump_param_tbl[i].lid;
+ dump_para.buffer = mcf_dump_buffer;
+ *(dump_para.size) = 0;
+
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_CALLBACK_USIR(dump_para.lid, dump_para.type, dump_para.record_idx, dump_para.sbp_id, dump_para.mnc, dump_para.mcc, dump_para.iccid);
+
+ ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
+ if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_DUMP_FAIL(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ } else {
+ /* If not register callback */
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type);
+ dump_para.buffer = mcf_dump_buffer;
+ if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ if (is_found == KAL_FALSE){
+ /* If not register callback */
+ if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+
+ dump_para.type = MCF_TYPE_OTA;
+ dump_para.record_idx = req->rec_id;
+
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM_NOT_CALLBACK(req->lid_num, req->rec_id);
+ dump_para.buffer = mcf_dump_buffer;
+ if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM_FAIL_NOT_CALLBACK(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
+ dump_para.type = MCF_TYPE_OTA_BY_OP;
+ dump_para.record_idx = 1;
+
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM_NOT_CALLBACK_USIR(req->lid_num, dump_para.ps_id, dump_para.sbp_id, dump_para.mcc, dump_para.mnc, dump_para.iccid);
+ dump_para.buffer = mcf_dump_buffer;
+ if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM_FAIL_NOT_CALLBACK(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ }
+
+ }
+
+ if (mcf_ret == MCF_OTA_R_INVALID_PARAMETER){
+ return mcf_ret;
+ }
+
+ mcf_toupper((char *)req->tag_name);
+ if (mcf_find_tag_offset(req->lid_num, (char *)req->tag_name, &item_byte_offset, &item_bit_offset, &item_size, &db_ptr, &query_tag) == KAL_FALSE) {
+ //Cannot find the tag
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_FIND_TAG_FAIL(req->lid_num, req->tag_name);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+
+ }
+
+ for(i = 0; i < query_tag.arr_cnt; i++){
+ if (db_ptr->array_size[i]-1 < query_tag.array_size[i])
+ {
+ invalid_arr_size = KAL_TRUE;
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_ARR_SIZE(db_ptr->array_size[i]-1, query_tag.array_size[i]);
+ break;
+ }
+ }
+
+ if (invalid_arr_size == KAL_TRUE){
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ resp->len = req->len;
+
+ read_len = req->len * db_ptr->variable_size;
+
+ if (read_len == 0)
+ {
+ read_len = 1 * db_ptr->variable_size;
+ }
+
+ if (read_len > db_ptr->total_size){
+ read_len = db_ptr->total_size;
+ }
+ if (read_len > 255){
+ read_len = 255;
+ }
+
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_LENGTH(read_len, db_ptr->variable_size, db_ptr->total_size);
+ kal_mem_set(lid_value, 0, 512);
+
+ if (query_tag.is_bit == KAL_FALSE){
+
+ j = query_tag.arr_cnt;
+
+ while(db_ptr->array_size[j] != 0){
+ n *= (db_ptr->array_size[j]);
+
+
+ j++;
+ next_level_array = KAL_TRUE;
+ }
+
+ if(req->len == 0)
+ {
+ read_len *= n;
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_TOTAL_ARRAY_SIZE(n, db_ptr->variable_size);
+ }
+
+ if(next_level_array == KAL_FALSE && read_len > item_size){
+ read_len = item_size;
+ }
+ if(next_level_array == KAL_TRUE && read_len > n*db_ptr->variable_size){
+ read_len = n*db_ptr->variable_size;
+ }
+
+
+ if (read_len > 255){
+ read_len = 255;
+ }
+
+ kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BYTE(lid_value, read_len);
+ mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 512);
+ if (db_ptr->variable_size <= read_len){
+ resp->len = read_len / db_ptr->variable_size;
+ }else{
+ resp->len = read_len;
+ }
+ }else{
+
+ if (query_tag.upper_vsize == 1){
+ resp->len = 1;
+ }else if(query_tag.upper_vsize == 2){
+ resp->len = 2;
+ }else if(query_tag.upper_vsize == 4){
+ resp->len = 4;
+ }else{
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_INVALID_BIT_LEN(query_tag.upper_vsize);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_SIZE(query_tag.upper_vsize, resp->len);
+
+ if (db_ptr->is_bit == KAL_TRUE){
+
+ kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), resp->len);
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_WHOLE(lid_value, resp->len);
+
+ mcf_bytes_to_hex(lid_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 512);
+ }else{
+
+ if (query_tag.upper_vsize == 1){
+ kal_uint8 bit_value = *(mcf_dump_buffer + item_byte_offset);
+ kal_uint8 bit_mask = (kal_uint8)MCF_GEN_BIT_MASK(item_size);
+ bit_value &= (bit_mask << item_bit_offset);
+ bit_value = ((kal_uint8)bit_value >> item_bit_offset);
+
+ resp->len = item_size/8+1;
+
+ mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 512);
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
+ }else if(query_tag.upper_vsize == 2){
+ kal_uint16 bit_value = 0;
+ kal_uint16 bit_mask = (kal_uint16)MCF_GEN_BIT_MASK(item_size);
+
+ kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),2);
+
+ bit_value &= (bit_mask << item_bit_offset);
+ bit_value = ((kal_uint16)bit_value >> item_bit_offset);
+
+ resp->len = item_size/8+1;
+
+ mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 512);
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
+ }else if(query_tag.upper_vsize == 4){
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+
+ kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),4);
+
+ bit_value &= (bit_mask << item_bit_offset);
+ bit_value = ((kal_uint32)bit_value >> item_bit_offset);
+
+ resp->len = item_size/8+1;
+
+ mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 512);
+ MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
+ }
+
+ }
+ }
+
+#else
+ resp->len = req->len;
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+#endif
+
+ return mcf_ret;
+
+}
+_STATIC mcf_ota_result_e mcf_query_variable_value(
+ l4c_mcf_variable_value_operation_req_struct *req,
+ l4c_mcf_variable_value_operation_cnf_struct *resp)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+ kal_bool ret = KAL_TRUE;
+ nvram_ltable_entry_struct lid_info = {0};
+ nvram_errno_enum nvram_api_ret;
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ mcf_custom_dump_param_struct dump_para;
+ kal_uint32 lid_size;
+ kal_uint32 i;
+ kal_uint8 lid_value[512];
+ kal_uint32 read_len = 0;
+ kal_bool is_found = KAL_FALSE;
+ kal_uint16 lid = 0;
+ kal_bool is_bit;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_char hex_value[512];
+#if defined(__MCF_FIND_TAG_SUPPORT__)
+ kal_bool invalid_arr_size = KAL_FALSE;
+ kal_bool next_level_array = KAL_FALSE;
+ kal_uint32 j = 0;
+ kal_uint32 n = 1;
+ MCF_DB_STRUCT_VARIABLE const *db_ptr = NULL;
+ mcf_tag_info_struct query_tag = {0};
+#endif
+
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_START(req->format, req->action, req->num, req->rec_id);
+ kal_mem_set(&dump_para, 0, sizeof(mcf_custom_dump_param_struct));
+
+
+ resp->len = req->len;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_SIM_ID(req->ps_id, sim_id);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+
+ if (req->format == L4C_MCF_QUERY_VARIABLE_FORM_PATH){
+ lid = req->num;
+ }else if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
+ lid = mcf_find_gid_return_lid_num(req->num);
+ if (lid == 65535){
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_GET_LID_NUM_FAIL(req->num);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ }
+ nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+
+
+ kal_mem_set(mcf_dump_buffer, 0, lid_info.size);
+
+ if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+ if(req->rec_id > lid_info.total_records || req->rec_id == 0){
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+ }
+
+ dump_para.ps_id = req->ps_id;
+ dump_para.sbp_id = pMcf->tlvota_file[sim_id].sbp_id;
+ kal_mem_cpy(&(dump_para.mcc), &(pMcf->tlvota_file[sim_id].mcc), MAX_MCC_STR_LEN);
+ kal_mem_cpy(&(dump_para.mnc), &(pMcf->tlvota_file[sim_id].mnc), MAX_MNC_STR_LEN);
+ kal_mem_cpy(&(dump_para.iccid), &(pMcf->tlvota_file[sim_id].iccid), 21);
+ dump_para.size = &lid_size;
+
+ for (i = 0; i < mcf_dump_param_tbl_num; i++) {
+ if ( (mcf_dump_param_tbl[i].lid == lid) ) {
+ is_found = KAL_TRUE;
+ if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+
+ dump_para.type = MCF_TYPE_OTA;
+ dump_para.record_idx = req->rec_id;
+
+ if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
+
+ dump_para.lid = mcf_dump_param_tbl[i].lid;
+ dump_para.buffer = mcf_dump_buffer;
+ *(dump_para.size) = 0;
+
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_CALLBACK(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
+
+ ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
+ if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_DUMP_ERROR(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ } else {
+ /* If not register callback */
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM(lid_info.LID, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
+ dump_para.buffer = mcf_dump_buffer;
+ if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ }
+ }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
+ dump_para.type = MCF_TYPE_OTA_BY_OP;
+ dump_para.record_idx = 1;
+
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_USIR(dump_para.lid, dump_para.record_idx, dump_para.ps_id, dump_para.sbp_id, dump_para.mnc, dump_para.mcc, dump_para.iccid);
+
+ if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
+ dump_para.lid = mcf_dump_param_tbl[i].lid;
+ dump_para.buffer = mcf_dump_buffer;
+ *(dump_para.size) = 0;
+
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_CALLBACK_USIR(dump_para.lid, dump_para.type, dump_para.record_idx, dump_para.sbp_id, dump_para.mnc, dump_para.mcc, dump_para.iccid);
+
+ ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
+ if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_DUMP_FAIL(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ } else {
+ /* If not register callback */
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type);
+ dump_para.buffer = mcf_dump_buffer;
+ if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ if (is_found == KAL_FALSE){
+ /* If not register callback */
+ if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+
+ dump_para.type = MCF_TYPE_OTA;
+ dump_para.record_idx = req->rec_id;
+
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM_NOT_CALLBACK(lid, req->rec_id);
+ dump_para.buffer = mcf_dump_buffer;
+ if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM_FAIL_NOT_CALLBACK(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
+ dump_para.type = MCF_TYPE_OTA_BY_OP;
+ dump_para.record_idx = 1;
+
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM_NOT_CALLBACK_USIR(lid, dump_para.ps_id, dump_para.sbp_id, dump_para.mcc, dump_para.mnc, dump_para.iccid);
+ dump_para.buffer = mcf_dump_buffer;
+ if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM_FAIL_NOT_CALLBACK(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ }
+
+ }
+
+ if (mcf_ret == MCF_OTA_R_INVALID_PARAMETER){
+ return mcf_ret;
+ }
+
+ if (req->format == L4C_MCF_QUERY_VARIABLE_FORM_PATH){
+#if defined(__MCF_FIND_TAG_SUPPORT__)
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_TAG(req->config);
+ mcf_toupper((char *)req->config);
+ if (mcf_find_tag_offset(lid, (char *)req->config, &item_byte_offset, &item_bit_offset, &item_size, &db_ptr, &query_tag) == KAL_FALSE) {
+ //Cannot find the tag
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_FIND_TAG_FAIL(lid, req->config);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+
+ }
+
+ for(i = 0; i < query_tag.arr_cnt; i++){
+ if (db_ptr->array_size[i]-1 < query_tag.array_size[i])
+ {
+ invalid_arr_size = KAL_TRUE;
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_ARR_SIZE(db_ptr->array_size[i]-1, query_tag.array_size[i]);
+ break;
+ }
+ }
+
+ if (invalid_arr_size == KAL_TRUE){
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ resp->len = req->len;
+
+ read_len = req->len * db_ptr->variable_size;
+
+ if (read_len == 0)
+ {
+ read_len = 1 * db_ptr->variable_size;
+ }
+
+ if (read_len > db_ptr->total_size){
+ read_len = db_ptr->total_size;
+ }
+ if (read_len > 255){
+ read_len = 255;
+ }
+
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_LENGTH(read_len, db_ptr->variable_size, db_ptr->total_size);
+ kal_mem_set(lid_value, 0, 512);
+
+ if (query_tag.is_bit == KAL_FALSE){
+
+ j = query_tag.arr_cnt;
+
+ while(db_ptr->array_size[j] != 0){
+ n *= (db_ptr->array_size[j]);
+ j++;
+ next_level_array = KAL_TRUE;
+ }
+
+ if(req->len == 0)
+ {
+ read_len *= n;
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_TOTAL_ARRAY_SIZE(n, db_ptr->variable_size);
+ }
+
+ if(next_level_array == KAL_FALSE && read_len > item_size){
+ read_len = item_size;
+ }
+ if(next_level_array == KAL_TRUE && read_len > n*db_ptr->variable_size){
+ read_len = n*db_ptr->variable_size;
+ }
+
+
+ if (read_len > 255){
+ read_len = 255;
+ }
+
+ kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BYTE(lid_value, read_len);
+ mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 511);
+ if (db_ptr->variable_size <= read_len){
+ resp->len = read_len / db_ptr->variable_size;
+ }else{
+ resp->len = read_len;
+ }
+ }else{
+
+ if (query_tag.upper_vsize == 1){
+ resp->len = 1;
+ }else if(query_tag.upper_vsize == 2){
+ resp->len = 2;
+ }else if(query_tag.upper_vsize == 4){
+ resp->len = 4;
+ }else{
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_INVALID_BIT_LEN(query_tag.upper_vsize);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_SIZE(query_tag.upper_vsize, resp->len);
+
+ if (db_ptr->is_bit == KAL_TRUE){
+
+ kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), resp->len);
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_WHOLE(lid_value, resp->len);
+
+ mcf_bytes_to_hex(lid_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 511);
+ }else{
+
+ if (query_tag.upper_vsize == 1){
+ kal_uint8 bit_value = *(mcf_dump_buffer + item_byte_offset);
+ kal_uint8 bit_mask = (kal_uint8)MCF_GEN_BIT_MASK(item_size);
+ bit_value &= (bit_mask << item_bit_offset);
+ bit_value = ((kal_uint8)bit_value >> item_bit_offset);
+
+ resp->len = item_size/8+1;
+
+ mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 511);
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
+ }else if(query_tag.upper_vsize == 2){
+ kal_uint16 bit_value = 0;
+ kal_uint16 bit_mask = (kal_uint16)MCF_GEN_BIT_MASK(item_size);
+
+ kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),2);
+
+ bit_value &= (bit_mask << item_bit_offset);
+ bit_value = ((kal_uint16)bit_value >> item_bit_offset);
+
+ resp->len = item_size/8+1;
+
+ mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 511);
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
+ }else if(query_tag.upper_vsize == 4){
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+
+ kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),4);
+
+ bit_value &= (bit_mask << item_bit_offset);
+ bit_value = ((kal_uint32)bit_value >> item_bit_offset);
+
+ resp->len = item_size/8+1;
+
+ mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(kal_char *)(resp->value), hex_value, 511);
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
+ }
+
+ }
+ }
+#else
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+#endif
+ }else if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
+
+ kal_mem_set(array_tag, 0, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ if(strcmp((kal_char *)req->config, "") != 0){
+ strncpy(array_tag, (kal_char *)req->config, MCF_FILE_MAX_ARRAY_TAG_LEN-1);
+ array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN-1] = '\0';
+ if (strlen((kal_char *)req->config) >= MCF_FILE_MAX_ARRAY_TAG_LEN){
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, strlen((kal_char *)req->config));
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ mcf_replace_char(array_tag, ',', '$');
+ if (strlen(array_tag) != 0 && array_tag[strlen(array_tag)] != '$'){
+ array_tag[strlen(array_tag)] = '$';
+ }
+ }
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_ARRAY_INDEX(req->num, array_tag);
+ if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
+ //Cannot find the gid
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+
+ }
+ if(req->len == 0){
+ read_len = item_size;
+ }else{
+ read_len = req->len;
+ }
+ if(read_len > (lid_info.size-item_byte_offset)){
+ read_len = lid_info.size-item_byte_offset;
+ }
+ if(read_len > 255){
+ read_len = 255;
+ }
+
+ if (is_bit == KAL_FALSE){
+ kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BYTE(lid_value, read_len);
+ mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 511);
+ resp->len = read_len;
+ }else{
+ kal_uint32 align_addr;
+ kal_uint32 bit_value;
+ kal_uint32 *ptr = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+ MCF_READ_ADDR_GET_ALIGN((kal_uint32)(mcf_dump_buffer + item_byte_offset),align_addr);
+ ptr = (kal_uint32 *)align_addr;
+ bit_value = *(ptr);
+ bit_value = bit_value >> ((((kal_uint32)(mcf_dump_buffer + item_byte_offset))-align_addr)*8);
+ bit_value = (bit_value >> item_bit_offset);
+ bit_value &= bit_mask;
+ if (item_size <= 8){
+ resp->len = 1;
+ }else if(item_size > 8 && item_size <= 16){
+ resp->len = 2;
+ }else if(item_size > 16 && item_size <= 32){
+ if (item_size % 8 == 0){
+ resp->len = item_size/8;
+ }else{
+ resp->len = item_size/8+1;
+ }
+ }else if (item_size > 32){
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_INVALID_BIT_LEN(item_size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
+ mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+ strncpy((kal_char *)(resp->value), hex_value, 511);
+ }
+
+ }
+
+ return mcf_ret;
+
+}
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+_STATIC mcf_ota_result_e mcf_set_variable_value(
+ l4c_mcf_variable_value_operation_req_struct *req,
+ l4c_mcf_variable_value_operation_cnf_struct *resp)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ kal_uint16 lid = 0;
+ static kal_char lid_value[512];
+ kal_bool is_bit;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_int32 value_len;
+ kal_uint32 operation_mask = 0;
+ mcf_tool_file_info_t *pFile;
+ kal_uint32 align_len = 0;
+ kal_int32 fs_ret = FS_NO_ERROR;
+ static kal_char hex_value[512];
+ nvram_ltable_entry_struct lid_info = {0};
+ nvram_errno_enum nvram_api_ret;
+ static kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type;
+ kal_bool read_file_fail = KAL_FALSE;
+ kal_int32 ret_snprintf;
+
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_START(req->format, req->action, req->num, req->rec_id);
+
+ resp->len = req->len;
+
+ if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
+
+ kal_mem_set(array_tag, 0, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ if(strcmp((kal_char *)req->config, "") != 0){
+ strncpy(array_tag, (kal_char *)req->config, MCF_FILE_MAX_ARRAY_TAG_LEN-1);
+ array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN-1] = '\0';
+ if (strlen((kal_char *)req->config) >= MCF_FILE_MAX_ARRAY_TAG_LEN){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, strlen((kal_char *)req->config));
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ mcf_replace_char(array_tag, ',', '$');
+ if (strlen(array_tag) != 0 && array_tag[strlen(array_tag)] != '$'){
+ array_tag[strlen(array_tag)] = '$';
+ }
+ }
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_ARRAY_INDEX(req->num, array_tag);
+
+
+ kal_mem_set(lid_value, 0, 512);
+ kal_mem_set(hex_value, 0, 512);
+ kal_mem_cpy(hex_value, req->value, 511);
+
+ /* If value length is odd, need to add '0'*/
+ kal_mem_cpy(hex_value, req->value, 511);
+ value_len = strlen(hex_value);
+
+ if(strlen(hex_value) % 2 != 0){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VALUE_LEN(strlen(hex_value));
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ mcf_hex_to_bytes(hex_value, &value_len, lid_value);
+
+
+ if(req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA){
+ 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;
+
+ kal_mem_set(&pItem, 0, sizeof(mcf_tool_gid_ota_file_item_t));
+
+ /*Compose a file content*/
+ pItem.global_id = req->num;
+ pItem.record_idx = req->rec_id;
+ pItem.array_index_len = strlen(array_tag);
+
+ if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
+ //Cannot find the gid
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+
+ }
+
+ nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+
+ if(req->rec_id > lid_info.total_records || req->rec_id == 0){
+ MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+ }
+
+ if (pItem.array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, pItem.array_index_len);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ if(value_len > item_size){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VAL_LEN(value_len, item_size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ pItem.total_len = 16;
+
+ if(is_bit == KAL_TRUE){
+ pItem.value_len = item_size/8+1;
+ item_size = item_size/8+1;
+ }else{
+ pItem.value_len = item_size;
+ }
+ pItem.total_len += item_size;
+ pItem.total_len += pItem.array_index_len;
+
+ if (pItem.total_len % 4 != 0){
+ align_len = (4-(pItem.total_len % 4));
+ pItem.total_len += align_len;
+ }
+
+ resp->len = pItem.value_len;
+
+ if (pItem.array_index_len > 0){
+ strncpy(&(pItem.buff_start), array_tag, 1);
+ }else{
+ strncpy(&(pItem.buff_start), lid_value, 1);
+ }
+
+ kal_mem_set(mcf_gid_buff, 0, 128);
+ kal_mem_cpy(mcf_gid_buff, &pItem, pItem.total_len);
+ strncpy(mcf_gid_buff+16, array_tag, strlen(array_tag));
+ kal_mem_cpy(mcf_gid_buff+16+strlen(array_tag), lid_value, value_len);
+ kal_mem_set(mcf_gid_buff+16+strlen(array_tag)+value_len, 0, item_size-value_len);
+ kal_mem_set(mcf_gid_buff+16+strlen(array_tag)+item_size, 0, align_len);
+ operation_mask |= MCF_FILE_OP_CHECKSUM;
+
+ kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+
+ /* Read MCF OTA file information to NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
+ return mcf_ret;
+ }
+
+ if (strcmp(nv_ota_file.merged_path,"") == 0){
+ strncpy(nv_ota_file.merged_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }
+
+ if (strcmp(nv_ota_file.merged_name,"") == 0){
+ strncpy(nv_ota_file.merged_name, MCF_FS_DEFAULT_OTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+ }
+
+ if(mcf_merge_one_gid(mcf_gid_buff, MCF_TYPE_OTA, mcf_file_buffer, MCF_MAX_OTA_FILE_SIZE, operation_mask) != KAL_TRUE){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_GID_TO_FILE_FAIL(MCF_TYPE_OTA);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ mcf_ret = mcf_read_ota_file(KAL_FALSE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
+ //Read fail return fail
+ if(mcf_ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_ota_file.path, nv_ota_file.name, mcf_ret);
+ read_file_fail = KAL_TRUE;
+ }
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+ /* Check if file type is OTA file */
+ if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_FILE();
+ kal_mem_cpy(mcf_merge_buffer, mcf_file_buffer, MCF_MAX_OTA_FILE_SIZE);
+ }else{
+ if (mcf_merge_ota_buffer(ota_file->buff, mcf_file_buffer, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_OTA_FILE_FAIL();
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ }
+
+
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ }else{
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ return mcf_ret;
+ }
+
+ /* Before create merged OTA file, need to delete last time merged OTA file */
+ kal_wsprintf(merge_ota_name, "%s\\%s\0", nv_ota_file.merged_path, nv_ota_file.merged_name);
+ fs_ret = FS_Delete(merge_ota_name);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_DELETE_FILE_FAIL(fs_ret);
+ mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return mcf_ret;
+ }
+
+ pFile = (mcf_tool_file_info_t *)mcf_merge_buffer;
+
+ if(pFile->file_size > MCF_MAX_OTA_FILE_SIZE){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_OTA_FILE_SIZE);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ /*Write Merged OTA file*/
+ mcf_ret = mcf_write_buffer(nv_ota_file.merged_path, nv_ota_file.merged_name, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_FILE_FAIL(nv_ota_file.merged_path, nv_ota_file.merged_name);
+ return mcf_ret;
+ }
+
+ strncpy(nv_ota_file.path, nv_ota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.name, nv_ota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+
+ 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)) ) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return mcf_ret;
+ }
+
+ }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA){
+ mcf_tool_gid_tlvota_file_item_t pItem_op;
+ mcf_tlvota_file_t *tlvota_file;
+ kal_char tag[MCF_MAX_TAG_LEN];
+ kal_bool is_general = KAL_FALSE;
+ nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_SIM_ID(req->ps_id, sim_id);
+
+ return KAL_FALSE;
+ }
+
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+ /*Compose a file content*/
+ pItem_op.global_id = req->num;
+ pItem_op.array_index_len = strlen(array_tag);
+
+ if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
+ //Cannot find the gid
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return mcf_ret;
+
+ }
+ if (pItem_op.array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, pItem_op.array_index_len);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ if(value_len > item_size){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VAL_LEN(value_len, item_size);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ pItem_op.tag_type = MCF_TLVOTA_TAG_SBPID;
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TLVOTA_SBPID(tlvota_file->sbp_id, tlvota_file->mcc, tlvota_file->mnc);
+ if (tlvota_file->sbp_id != SBP_ID_INVALID) {
+ is_general = KAL_FALSE;
+ if (strcmp((kal_char *)tlvota_file->mcc, "") != 0) {
+ if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
+ ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_%s_%s%c", tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag, "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+ }
+ }else{
+ ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_%s_NA%c", tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag, "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+ }
+ }
+ }else{
+ if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
+ ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_NA_%s%c", tlvota_file->sbp_id, (kal_char *)tlvota_file->mnc, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag, "SBP_NA_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+ }
+ }else{
+ ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_NA_NA%c", tlvota_file->sbp_id, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag, "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+ }
+ }
+ }
+ }else{
+ is_general = KAL_TRUE;
+ if (strcmp((kal_char *)tlvota_file->mcc, "") != 0) {
+ if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
+ ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_%s_%s%c", (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag, "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+ }
+ }else{
+ ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_%s_NA%c", (kal_char *)tlvota_file->mcc, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag, "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+ }
+ }
+ }else{
+ if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
+ ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_NA_%s%c", (kal_char *)tlvota_file->mnc, '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag, "NA_NA_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+ }
+ }else{
+ is_general = KAL_FALSE;
+ ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_NA_NA%c", '\0');
+ if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag, "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+ }
+ }
+ }
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ return mcf_ret;
+ }
+
+ if(is_general == KAL_TRUE){
+ tlvota_file = &(pMcf->general_tlvota_file);
+ }
+
+ pItem_op.tag_len = strlen(tag);
+
+ pItem_op.total_len = 16;
+
+ if(is_bit == KAL_TRUE){
+ pItem_op.value_len = item_size/8+1;
+ item_size = item_size/8+1;
+ }else{
+ pItem_op.value_len = item_size;
+ }
+ pItem_op.total_len += pItem_op.value_len;
+ pItem_op.total_len += pItem_op.array_index_len;
+ pItem_op.total_len += pItem_op.tag_len;
+ if (pItem_op.total_len % 4 != 0){
+ align_len = (4-(pItem_op.total_len % 4));
+ pItem_op.total_len += align_len;
+ }
+ resp->len = pItem_op.value_len;
+
+ strncpy(&(pItem_op.buff_start), tag, 1);
+
+ kal_mem_set(mcf_gid_buff, 0, 128);
+ kal_mem_cpy(mcf_gid_buff, &pItem_op, pItem_op.total_len);
+ strncpy(mcf_gid_buff+16, tag, strlen(tag));
+ strncpy(mcf_gid_buff+16+strlen(tag), array_tag, strlen(array_tag));
+ kal_mem_cpy(mcf_gid_buff+16+strlen(tag)+strlen(array_tag), lid_value, value_len);
+ kal_mem_set(mcf_gid_buff+16+strlen(tag)+strlen(array_tag)+value_len, 0, item_size-value_len);
+ kal_mem_set(mcf_gid_buff+16+strlen(tag)+strlen(array_tag)+item_size, 0, align_len);
+
+ operation_mask |= MCF_FILE_OP_CHECKSUM;
+
+ kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+
+ if(is_general == KAL_FALSE){
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return mcf_ret;
+ }
+ mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+ if(mcf_ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name, mcf_ret);
+ read_file_fail = KAL_TRUE;
+ }
+ }else{
+ /* Read MCF general 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))) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return mcf_ret;
+ }
+ mcf_ret = mcf_read_general_tlvota_file(KAL_FALSE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+ if(mcf_ret != MCF_OTA_R_SUCCESS){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name, mcf_ret);
+ read_file_fail = KAL_TRUE;
+ }
+ }
+
+ if (strcmp(nv_tlvota_file.merged_path,"") == 0){
+ strncpy(nv_tlvota_file.merged_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }
+
+ if (strcmp(nv_tlvota_file.merged_name,"") == 0){
+ if(is_general == KAL_FALSE){
+ mcf_snprintf(nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN, "%s_%d.mcfopota%c", MCF_FS_DEFAULT_TLVOTA_MERGED_FILE_PREFIX, sim_id, '\0');
+ }else{
+ strncpy(nv_tlvota_file.merged_name, MCF_FS_GENERAL_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+ }
+ }
+
+ if(mcf_merge_one_gid(mcf_gid_buff, MCF_TYPE_OTA_BY_OP, mcf_file_buffer, MCF_MAX_TLVOTA_FILE_SIZE, operation_mask) != KAL_TRUE){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_GID_TO_FILE_FAIL(MCF_TYPE_OTA_BY_OP);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ /* Check if file type is OTA file */
+ if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_FILE();
+ kal_mem_cpy(mcf_merge_buffer, mcf_file_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+ }else{
+ if(mcf_merge_ota_buffer(tlvota_file->buff, mcf_file_buffer, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_OTA_FILE_FAIL();
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+ }
+
+
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ return mcf_ret;
+ }
+
+ /* Before create merged OTA file, need to delete last time merged OTA file */
+ kal_wsprintf(merge_ota_name, "%s\\%s\0", nv_tlvota_file.merged_path, nv_tlvota_file.merged_name);
+ fs_ret = FS_Delete(merge_ota_name);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_DELETE_FILE_FAIL(fs_ret);
+ mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return mcf_ret;
+ }
+
+ pFile = (mcf_tool_file_info_t *)mcf_merge_buffer;
+
+ if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ /*Write Merged OTA file*/
+ mcf_ret = mcf_write_buffer(nv_tlvota_file.merged_path, nv_tlvota_file.merged_name, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_FILE_FAIL(nv_tlvota_file.merged_path, nv_tlvota_file.merged_name);
+ return mcf_ret;
+ }
+
+ strncpy(nv_tlvota_file.path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.name, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+
+ if(is_general == KAL_FALSE){
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return mcf_ret;
+ }
+ }else{
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return mcf_ret;
+ }
+ }
+
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
+ /* If MCF is in DSBP passive mode, change to DSBP active mode */
+ mcf_ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ return mcf_ret;
+ }
+ pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
+ }
+ }
+
+ }
+
+ return mcf_ret;
+
+}
+#endif
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+_STATIC mcf_ota_result_e mcf_assign_combined_file_path(l4c_mcf_set_config_req_struct *req)
+{
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ switch (req->config_type)
+ {
+ case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+ {
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
+ kal_char *file_extension1 = NULL;
+ kal_char *file_extension2 = NULL;
+ nvram_ef_mcf_ota_file_info_struct nv_ota_file;
+
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ file_extension1 = strstr((kal_char *)req->config1, ".mcfota");
+ if (file_extension1 == NULL){
+ file_extension2 = strstr((kal_char *)req->config1, ".bin");
+ if (file_extension2 == NULL) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+ }
+ strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+ } else {
+ strncpy(curr_filename, MCF_FS_DEFAULT_OTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+ }
+
+ /* Read MCF OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF Internal 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))) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_ota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_ota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ nv_int_info.is_combined_ota = KAL_TRUE;
+
+ /* Write MCF OTA file information in NVRAM */
+ 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)) ) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+ {
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
+ kal_char *file_extension1 = NULL;
+ kal_char *file_extension2 = NULL;
+ nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ file_extension1 = strstr((kal_char *)req->config1, ".mcfopota");
+ if (file_extension1 == NULL){
+ file_extension2 = strstr((kal_char *)req->config1, ".bin");
+ if (file_extension2 == NULL) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+ }
+ strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+ } else {
+ strncpy(curr_filename, MCF_FS_DEFAULT_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+ }
+
+ /* Read MCF Internal 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))) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF TLV-OTA file information in NVRAM */
+ 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))) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = KAL_FALSE;
+
+ return MCF_OTA_R_READ_NVRAM_FAIL;
+ }
+
+ strncpy(nv_tlvota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ nv_int_info.is_combined_tlvota[sim_id] = KAL_TRUE;
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ /* Write MCF TLV-OTA file information in NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+ case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+ {
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
+ kal_char *file_extension1 = NULL;
+ kal_char *file_extension2 = NULL;
+ nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+
+ if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ if (strcmp((kal_char *)req->config1, "") != 0) {
+ file_extension1 = strstr((kal_char *)req->config1, ".mcfopota");
+ if (file_extension1 == NULL){
+ file_extension2 = strstr((kal_char *)req->config1, ".bin");
+ if (file_extension2 == NULL) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+ }
+ strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+ } else {
+ strncpy(curr_filename, MCF_FS_GENERAL_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+ }
+
+ /* Read MCF Internal 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))) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ /* Read MCF general 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))) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ strncpy(nv_tlvota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_tlvota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ nv_int_info.is_combined_general_tlvota = KAL_TRUE;
+
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ return ret;
+ }
+ 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))) {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ break;
+ }
+
+ default:
+ {
+ MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+
+ }
+
+
+ return ret;
+}
+#endif
+_STATIC mcf_ota_result_e mcf_l4_set_config(ilm_struct *ilm)
+{
+ l4c_mcf_set_config_req_struct *req = (l4c_mcf_set_config_req_struct *)ilm->local_para_ptr;
+ l4c_mcf_set_config_cnf_struct *local_para_ptr = NULL;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ mcf_ota_result_e write_ret;
+ kal_int32 fs_ret = FS_NO_ERROR;
+ kal_wchar pathname[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_uint32 ret_sprintf;
+
+ switch (req->op)
+ {
+ case L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH:
+ case L4C_MCF_CONFIG_SET_OTA_FILE_PATH:
+ case L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH:
+ ret = mcf_set_file_path(req);
+ break;
+
+ case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
+ {
+ mcf_t *pMcf = mcf_get_instance();
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+ mcf_l4bsbp_trigger_dsbp_ind_struct *ind_ptr = NULL;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_L4_SET_CONFIG_INVALID_SIM_ID(req->ps_id, sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ if (pMcf->is_dsbp_ongoing[sim_id] == KAL_TRUE) {
+ MD_TRC_MCF_TR_L4_SET_CONFIG_DSBP_ONGOING(req->ps_id, sim_id);
+
+ /* Send process result to ATCI */
+ local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+ if (!local_para_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+ local_para_ptr->src_id = req->src_id;
+ local_para_ptr->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+ local_para_ptr->dsbp_result = MCF_TRIGGER_DSBP_R_FAIL_MCF_DSBP_ONGOING;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ goto out;
+ }
+
+ ret = mcf_set_file_path(req);
+ if (ret == MCF_OTA_R_SUCCESS) {
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->config_op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+ ind_ptr->src_mod_id = ilm->src_mod_id;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + req->ps_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ pMcf->is_dsbp_ongoing[sim_id] = KAL_TRUE;
+
+ /* Support MCF Tool Send AT cmd - delete txt */
+ kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
+ fs_ret = FS_Delete(pathname);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
+ ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return ret;
+ }
+
+ /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
+ kal_mem_set(txt_buff, 0, 64);
+ ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE, 0, MCF_TRIGGER_DSBP_R_FAIL_MCF_DSBP_ONGOING, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > 64){
+ strncpy(txt_buff, "EMCFC unknown error", 63);
+ }
+ MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
+ write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+ if (write_ret != MCF_OTA_R_SUCCESS) {
+ return write_ret;
+ }
+
+
+ goto out;
+ }else {
+ /* Send process result to ATCI */
+ local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+ if (!local_para_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+ local_para_ptr->src_id = req->src_id;
+ local_para_ptr->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+ local_para_ptr->mcf_result = ret;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ goto out;
+ }
+ break;
+ }
+
+ case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
+ {
+ mcf_l4bsbp_trigger_dsbp_ind_struct *ind_ptr = NULL;
+ kal_uint32 i = 0;
+ mcf_t *pMcf = mcf_get_instance();
+
+ ret = mcf_set_file_path(req);
+ if ( (req->trigger_dsbp == 1) && (ret == MCF_OTA_R_SUCCESS) ) {
+ /*
+ * Trigger DSBP and do not respond to AP immediately.
+ * Wait DSBP response, and then respond to AP.
+ */
+ if (req->config_type == L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN){
+ //General OP-OTA need to trigger dsbp all sims
+ dsbp_ret = 0;
+
+ for (i = 0; i < MAX_SIM_NUM; i++){
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->config_op = req->op;
+ ind_ptr->src_mod_id = ilm->src_mod_id;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + i, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ pMcf->dsbp_cnf_cnt ++;
+ pMcf->dsbp_ind_cnt ++;
+ pMcf->dsbp_cnf_ret = KAL_TRUE;
+ ret = MCF_OTA_R_SUCCESS;
+ }
+
+ }else{
+ //OTA and OP-OTA only need to by sim trigger dsbp
+
+ ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+ ind_ptr->src_id = req->src_id;
+ ind_ptr->config_op = req->op;
+ ind_ptr->src_mod_id = ilm->src_mod_id;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4BSBP + req->ps_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ }
+
+ /* Support MCF Tool Send AT cmd - delete txt */
+ kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
+ fs_ret = FS_Delete(pathname);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
+ ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return ret;
+ }
+
+ /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
+ kal_mem_set(txt_buff, 0, 64);
+ ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN, 0, MCF_TRIGGER_DSBP_R_FAIL_MCF_DSBP_ONGOING, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > 64){
+ strncpy(txt_buff, "EMCFC unknown error", 63);
+ }
+ MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
+ write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+ if (write_ret != MCF_OTA_R_SUCCESS) {
+ return write_ret;
+ }
+
+ goto out;
+ } else {
+ /* Send process result to ATCI */
+ local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+ if (!local_para_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+ local_para_ptr->src_id = req->src_id;
+ local_para_ptr->op = req->op;
+ local_para_ptr->mcf_result = ret;
+ local_para_ptr->dsbp_result = 0;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ /* Support MCF Tool Send AT cmd - delete txt */
+ kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
+ fs_ret = FS_Delete(pathname);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
+ ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return ret;
+ }
+
+ /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
+ kal_mem_set(txt_buff, 0, 64);
+ ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN, ret, 0, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > 64){
+ strncpy(txt_buff, "EMCFC unknown error", 63);
+ }
+ MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
+ write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+ if (write_ret != MCF_OTA_R_SUCCESS) {
+ return write_ret;
+ }
+
+ goto out;
+ }
+ break;
+ }
+
+ default:
+ MD_TRC_MCF_TR_L4_SET_CONFIG_UNKNOWN_OP(req->op);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+
+ /* Send process result to ATCI */
+ local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+ if (!local_para_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+ local_para_ptr->src_id = req->src_id;
+ if (ret == MCF_OTA_R_SUCCESS) {
+ local_para_ptr->result = KAL_TRUE;
+ } else {
+ local_para_ptr->result = KAL_FALSE;
+ }
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+out:
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_get_config(ilm_struct *ilm)
+{
+ l4c_mcf_get_config_req_struct *req = (l4c_mcf_get_config_req_struct *)ilm->local_para_ptr;
+ l4c_mcf_get_config_cnf_struct *local_para_ptr = NULL;
+ mcf_ota_result_e ret;
+
+ local_para_ptr = (l4c_mcf_get_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_get_config_cnf_struct), TD_RESET);
+ if (!local_para_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+ switch (req->op)
+ {
+ case L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH:
+ ret = mcf_get_applied_file_path(req, local_para_ptr);
+ break;
+
+ default:
+ MD_TRC_MCF_TR_L4_GET_CONFIG_UNKNOWN_OP(req->op);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+ local_para_ptr->src_id = req->src_id;
+ if (ret == MCF_OTA_R_SUCCESS) {
+ local_para_ptr->result = KAL_TRUE;
+ } else {
+ local_para_ptr->result = KAL_FALSE;
+ }
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_GET_CONFIG_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_dump_data(ilm_struct *ilm)
+{
+ l4c_mcf_dump_data_req_struct *req_ptr = (l4c_mcf_dump_data_req_struct *)ilm->local_para_ptr;
+ l4c_mcf_dump_data_cnf_struct *cnf_ptr = NULL;
+ mcf_l4c_report_state_ind_struct *ind_ptr = NULL;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ mcf_ota_result_e write_ret = MCF_OTA_R_SUCCESS;
+ kal_char urc_result[16];
+ kal_uint32 at_len;
+ kal_int32 fs_ret = FS_NO_ERROR;
+ kal_wchar pathname[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_uint32 ret_sprintf;
+
+ switch (req_ptr->op)
+ {
+ case L4C_MCF_CONFIG_DUMP_LID_DATA:
+ cnf_ptr = (l4c_mcf_dump_data_cnf_struct *)construct_local_para(sizeof(l4c_mcf_dump_data_cnf_struct), TD_RESET);
+ if (!cnf_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+ cnf_ptr->src_id = req_ptr->src_id;
+ cnf_ptr->op = req_ptr->op;
+ cnf_ptr->result = ret;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_DUMP_DATA_CNF, /* msg_id */
+ (local_para_struct*)cnf_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ /* Support MCF Tool Open Dump File - delete txt */
+ kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
+ fs_ret = FS_Delete(pathname);
+
+ if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+ MD_TRC_MCF_TR_L4_DUMP_DATA_DELETE_FILE_FAIL(fs_ret);
+ ret = MCF_OTA_R_WRITE_DISK_FAIL;
+ return ret;
+ }
+
+
+ /* Support MCF Tool Open Dump File - Write AT cmd result in txt */
+ kal_mem_set(txt_buff, 0, 64);
+ ret_sprintf = kal_snprintf(txt_buff, 63, "EMCFC=%d,%d%c", req_ptr->op, ret, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > 64){
+ strncpy(txt_buff, "EMCFC unknown error", 63);
+ }
+ MD_TRC_MCF_TR_L4_DUMP_DATA_CMD_RESULT(txt_buff);
+ write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+ if (write_ret != MCF_OTA_R_SUCCESS) {
+ return write_ret;
+ }
+
+ ret = mcf_dump_all_lid_data(req_ptr);
+ break;
+
+ default:
+ MD_TRC_MCF_TR_L4_DUMP_DATA_UNKNOWN_OP(req_ptr->op);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+ ind_ptr->type = MCF_L4C_REPORT_MCF_DUMP_RESULT;
+ ind_ptr->result = ret;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ /* Support MCF Tool Open Dump File - Write Urc result in txt */
+ kal_mem_set(urc_result,0,16);
+ ret_sprintf = kal_snprintf(urc_result, 15, "%cEMCFRPT=%d,%d%c", '\n', ind_ptr->type, ret, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > 16){
+ strncpy(urc_result, "EMCFRPT error", 15);
+ }
+ at_len = strlen(txt_buff);
+ strncat(txt_buff, urc_result, 15);
+ MD_TRC_MCF_TR_L4_DUMP_DATA_CMD_RESULT(txt_buff);
+ write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, at_len+strlen(urc_result));
+ if (write_ret != MCF_OTA_R_SUCCESS) {
+ return write_ret;
+ }
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_update_ota(ilm_struct *ilm)
+{
+ l4c_mcf_update_ota_file_req_struct *req = (l4c_mcf_update_ota_file_req_struct *)ilm->local_para_ptr;
+ l4c_mcf_update_ota_file_cnf_struct *local_para_ptr1 = NULL;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ mcf_l4c_report_state_ind_struct *ind_ptr = NULL;
+ mcf_t *pMcf = mcf_get_instance();
+ module_type src_mod_id = ilm->src_mod_id;
+ kal_bool reset_MD = KAL_FALSE;
+
+
+
+
+
+ switch (req->op)
+ {
+ case L4C_MCF_CONFIG_UPDATE_OPOTA_FILE:
+
+ /* If DSBP is busy when receive AT cmd, send AT cmd to ask AP retry */
+ if (pMcf->dsbp_cnf_cnt != 0 || pMcf->dsbp_ind_cnt != 0){
+ MD_TRC_MCF_TR_L4_UPDATE_OTA_DSBP_IS_ONGOING(pMcf->dsbp_cnf_cnt);
+ MD_TRC_MCF_TR_L4_UPDATE_OTA_DSBP_IS_ONGOING(pMcf->dsbp_ind_cnt);
+
+ local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+ if (!local_para_ptr1) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+
+ /* Send AT cmd back & send URC to ask AP retry */
+ local_para_ptr1->src_id = req->src_id;
+ local_para_ptr1->op = req->op;
+ local_para_ptr1->mcf_result = MCF_OTA_R_FAIL_MCF_DSBP_ONGOING;
+
+
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr1, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+ return ret;
+ }
+
+ ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+ ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ return ret;
+ }
+
+
+ MD_TRC_MCF_TR_L4_UPDATE_OPOTA_FILE_UPDATE_OTA();
+ ret = mcf_update_ota_file(req, local_para_ptr1, src_mod_id, &reset_MD);
+
+ if (ret == MCF_OTA_R_ALLOCATE_BUFFER_FAIL){
+ return ret;
+ }else if(ret == MCF_OTA_R_READ_OTA_FILE_FAIL || ret == MCF_OTA_R_READ_INI_FILE_FAIL){
+ local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+ if (!local_para_ptr1) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+
+ local_para_ptr1->src_id = req->src_id;
+ local_para_ptr1->op = req->op;
+ local_para_ptr1->mcf_result = ret;
+
+
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr1, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+ return ret;
+ }
+
+ ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+ ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ return ret;
+ }
+ if(reset_MD == KAL_TRUE){
+ //ret = MCF_OTA_R_SUCCESS;
+
+ local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+ if (!local_para_ptr1) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+
+ local_para_ptr1->src_id = req->src_id;
+ local_para_ptr1->op = req->op;
+ local_para_ptr1->mcf_result = ret;
+
+
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr1, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+ return ret;
+ }
+
+ ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+ ind_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ return ret;
+
+ }
+
+ if (pMcf->dsbp_cnf_cnt == 0){
+ local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+ if (!local_para_ptr1) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+
+
+ local_para_ptr1->src_id = req->src_id;
+ local_para_ptr1->op = req->op;
+ local_para_ptr1->mcf_result = ret;
+
+
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr1, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ if (ret == MCF_OTA_R_SUCCESS){
+
+ ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+ return ret;
+ }
+
+ ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+ ind_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ }
+ return ret;
+ }
+
+ break;
+
+ default:
+ MD_TRC_MCF_TR_L4_UPDATE_OPOTA_FILE_UNKNOWN_OP(req->op);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_config(ilm_struct *ilm)
+{
+ l4c_mcf_config_req_struct *req = (l4c_mcf_config_req_struct *)ilm->local_para_ptr;
+ l4c_mcf_config_cnf_struct *local_para_ptr = NULL;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ local_para_ptr = (l4c_mcf_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_cnf_struct), TD_RESET);
+ if (!local_para_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+
+
+ switch (req->op)
+ {
+ case L4C_MCF_CONFIG_INI_OPERATION:
+ ret = mcf_config_ini_info(req, local_para_ptr);
+ break;
+
+ default:
+ MD_TRC_MCF_TR_L4_CONFIG_UNKNOWN_OP(req->op);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ break;
+ }
+
+
+ local_para_ptr->src_id = req->src_id;
+ local_para_ptr->op = req->op;
+ local_para_ptr->mcf_result = ret;
+
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_CONFIG_CNF, /* msg_id */
+ (local_para_struct*)local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_query_lid(ilm_struct *ilm)
+{
+ l4c_mcf_config_lid_variable_operation_req_struct *req_ptr = (l4c_mcf_config_lid_variable_operation_req_struct *)ilm->local_para_ptr;
+ l4c_mcf_config_lid_variable_operation_cnf_struct *cnf_ptr = NULL;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ switch (req_ptr->op)
+ {
+ case L4C_MCF_CONFIG_LID_VARIABLE_OPERATION:
+ cnf_ptr = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+ if (!cnf_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+ ret = mcf_config_LID_variable(req_ptr, cnf_ptr);
+
+ cnf_ptr->src_id = req_ptr->src_id;
+ cnf_ptr->op = req_ptr->op;
+ cnf_ptr->action = req_ptr->action;
+ cnf_ptr->mcf_result = ret;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_CONFIG_LID_VARIABLE_OPERATION_CNF, /* msg_id */
+ (local_para_struct*)cnf_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+
+ break;
+
+ default:
+ MD_TRC_MCF_TR_L4_QUERY_LID_UNKNOWN_OP(req_ptr->op);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ return ret;
+}
+_STATIC mcf_ota_result_e mcf_l4_variable_operation(ilm_struct *ilm)
+{
+ l4c_mcf_variable_value_operation_req_struct *req_ptr = (l4c_mcf_variable_value_operation_req_struct *)ilm->local_para_ptr;
+ l4c_mcf_variable_value_operation_cnf_struct *cnf_ptr = NULL;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ switch (req_ptr->op)
+ {
+ case L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION:
+ cnf_ptr = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+ if (!cnf_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+ switch (req_ptr->action)
+ {
+ case L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA:
+ case L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA:
+ ret = mcf_query_variable_value(req_ptr, cnf_ptr);
+ break;
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ case L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA:
+ case L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA:
+ ret = mcf_set_variable_value(req_ptr, cnf_ptr);
+ break;
+#endif
+ default:
+ MD_TRC_MCF_TR_L4_VARIABLE_OPERATION_UNKOWN_ACTION(req_ptr->action);
+ break;
+ }
+
+
+ cnf_ptr->src_id = req_ptr->src_id;
+ cnf_ptr->op = req_ptr->op;
+ cnf_ptr->format = req_ptr->format;
+ cnf_ptr->action = req_ptr->action;
+ cnf_ptr->mcf_result = ret;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_VARIABLE_VALUE_OPERATION_CNF, /* msg_id */
+ (local_para_struct*)cnf_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+
+ break;
+
+ default:
+ MD_TRC_MCF_TR_L4_VARIABLE_OPERATION_UNKNOWN_OP(req_ptr->op);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ return ret;
+}
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+_STATIC mcf_ota_result_e mcf_l4_assign_combined_file_path(ilm_struct *ilm)
+{
+ l4c_mcf_set_config_req_struct *req_ptr = (l4c_mcf_set_config_req_struct *)ilm->local_para_ptr;
+ l4c_mcf_set_config_cnf_struct *cnf_ptr = NULL;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ switch (req_ptr->op)
+ {
+ case L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH:
+ cnf_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+ if (!cnf_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+ return ret;
+ }
+
+ ret = mcf_assign_combined_file_path(req_ptr);
+
+ cnf_ptr->src_id = req_ptr->src_id;
+ cnf_ptr->op = req_ptr->op;
+ cnf_ptr->mcf_result = ret;
+
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ilm->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_ASSIGN_COMBINED_FILE_PATH_CNF, /* msg_id */
+ (local_para_struct*)cnf_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+
+ break;
+
+ default:
+ MD_TRC_MCF_TR_L4_ASSIGN_COMBINED_FILE_PATH_UNKNOWN_OP(req_ptr->op);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ return ret;
+ }
+
+ return ret;
+}
+#endif
+_STATIC void mcf_respond_dsbp_result(local_para_struct *local_para_ptr)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_l4bsbp_trigger_dsbp_cnf_struct *cnf = (mcf_l4bsbp_trigger_dsbp_cnf_struct *)local_para_ptr;
+ l4c_mcf_set_config_cnf_struct *cnf_local_para_ptr = NULL;
+ l4c_mcf_update_ota_file_cnf_struct *cnf_update_ota_local_para_ptr = NULL;
+ mcf_l4c_report_state_ind_struct *ind_ptr = NULL;
+ mcf_ota_result_e write_ret = MCF_OTA_R_SUCCESS;
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+ kal_uint32 ret_sprintf;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(cnf->ps_id);
+ mcf_tlvota_file_t *tlvota_file;
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+
+
+ if (cnf->config_op == L4C_MCF_CONFIG_UPDATE_OPOTA_FILE){
+ pMcf->dsbp_cnf_cnt--;
+
+ if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS && cnf->result != MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
+ pMcf->dsbp_ind_cnt--;
+ pMcf->dsbp_ind_ret = KAL_FALSE;
+ pMcf->dsbp_cnf_ret = KAL_FALSE;
+ }
+ if (cnf->result == MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
+ pMcf->dsbp_ind_cnt--;
+ MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_NO_SIM(cnf->ps_id);
+ }
+
+ if (cnf->is_dsbp_retry == 0){
+ pMcf->is_critical = KAL_TRUE;
+ }
+
+
+ /* When critical OTA is fail to trigger DSBP, Send AT cmd response and send URC to reset MD */
+ if (pMcf->dsbp_cnf_cnt == 0)
+ {
+ if (pMcf->is_critical == KAL_TRUE){
+ cnf_update_ota_local_para_ptr = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+ if (!cnf_update_ota_local_para_ptr) {
+ ASSERT(0);
+
+ return;
+ }
+
+ cnf_update_ota_local_para_ptr->src_id = cnf->src_id;
+ cnf_update_ota_local_para_ptr->op = cnf->config_op;
+ if (pMcf->dsbp_cnf_ret == KAL_TRUE){
+ cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_SUCCESS;
+ }else{
+ cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_DSBP_FAIL;
+ }
+
+
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ cnf->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+ (local_para_struct*)cnf_update_ota_local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+
+
+ MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_CNT(pMcf->dsbp_ind_cnt);
+ if(pMcf->dsbp_ind_cnt == 0 && pMcf->dsbp_cnf_ret == KAL_FALSE){
+ ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+ return;
+ }
+
+
+ ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+ ind_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ cnf->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ }
+ }else{
+ cnf_update_ota_local_para_ptr = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+ if (!cnf_update_ota_local_para_ptr) {
+ ASSERT(0);
+
+ return;
+ }
+
+ cnf_update_ota_local_para_ptr->src_id = cnf->src_id;
+ cnf_update_ota_local_para_ptr->op = cnf->config_op;
+ if (pMcf->dsbp_cnf_ret == KAL_TRUE){
+ cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_SUCCESS;
+ }else{
+ cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_DSBP_FAIL;
+ }
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ cnf->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+ (local_para_struct*)cnf_update_ota_local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ if(pMcf->dsbp_ind_cnt == 0 && pMcf->dsbp_ind_ret == KAL_FALSE){
+ ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_ptr) {
+ ASSERT(0);
+
+ return;
+ }
+
+ ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+ ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ cnf->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ }
+ }
+
+ }
+ }else{
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_RESPOND_DSBP_INVALID_SIM_ID(cnf->ps_id, sim_id);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ goto out;
+ }
+
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS) {
+ /* Read last updated file */
+ if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_RESPOND_DSBP_INVALID_FILE_PATH(cnf->result, tlvota_file->last_file.path_type);
+ pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ goto out;
+ }
+
+ mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, tlvota_file->last_file.name, &apply_path_type, apply_filename, pMcf);
+
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_RESPOND_DSBP_READ_FILE_FAIL(cnf->result, mcf_ret);
+ }
+
+ pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+ }
+
+out:
+ if(pMcf->dsbp_cnf_cnt > 0){
+ pMcf->dsbp_cnf_cnt--;
+ }
+
+ if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS && cnf->result != MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
+ if(pMcf->dsbp_ind_cnt > 0){
+ pMcf->dsbp_ind_cnt--;
+ }
+ pMcf->dsbp_ind_ret = KAL_FALSE;
+ pMcf->dsbp_cnf_ret = KAL_FALSE;
+ dsbp_ret = cnf->result;
+ }
+ if (cnf->result == MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
+ if(pMcf->dsbp_ind_cnt > 0){
+ pMcf->dsbp_ind_cnt--;
+ }
+ MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_NO_SIM(cnf->ps_id);
+ }
+
+ if (pMcf->dsbp_cnf_cnt == 0)
+ {
+ cnf_local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+ if (!cnf_local_para_ptr) {
+ ASSERT(0);
+
+ return;
+ }
+
+ if (pMcf->dsbp_cnf_ret != KAL_TRUE){
+ mcf_ret = MCF_OTA_R_DSBP_FAIL;
+ }
+
+ cnf_local_para_ptr->src_id = cnf->src_id;
+ cnf_local_para_ptr->op = cnf->config_op;
+ cnf_local_para_ptr->mcf_result = mcf_ret;
+ cnf_local_para_ptr->dsbp_result = dsbp_ret;
+
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ cnf->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+ (local_para_struct*)cnf_local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ /* Support MCF Tool Send AT cmd - clear txt */
+ kal_mem_set(txt_buff, 0, 64);
+ write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, 0);
+ if (write_ret != MCF_OTA_R_SUCCESS) {
+ return;
+ }
+
+ /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
+ ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", cnf->config_op, mcf_ret, dsbp_ret, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > 64){
+ strncpy(txt_buff, "EMCFC unknown error", 63);
+ }
+ MD_TRC_MCF_TR_RESPOND_DSBP_CMD_RESULT(txt_buff);
+ write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+ if (write_ret != MCF_OTA_R_SUCCESS) {
+ return;
+ }
+ }
+ }
+ return;
+}
+
+_STATIC kal_bool mcf_report_dsbp_result(local_para_struct *local_para_ptr)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_l4bsbp_trigger_dsbp_result_ind_struct *ind = (mcf_l4bsbp_trigger_dsbp_result_ind_struct *)local_para_ptr;
+ kal_bool ret = KAL_TRUE;
+ kal_char urc_result[16];
+ kal_uint32 at_len;
+ kal_uint32 ret_sprintf;
+
+ switch (ind->config_op)
+ {
+ case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
+ {
+ mcf_l4c_report_state_ind_struct *ind_local_para_ptr = NULL;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ind->ps_id);
+ mcf_tlvota_file_t *tlvota_file;
+ kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_REPORT_STATE_INVALID_SIM_ID(ind->ps_id, sim_id);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ goto out;
+ }
+
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ if (ind->result == MCF_TRIGGER_DSBP_R_SUCCESS) {
+ /* Store last updated file informantion */
+ kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+ } else {
+ /* Read last updated file */
+ if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ } else {
+ MD_TRC_MCF_TR_REPORT_STATE_INVALID_FILE_PATH(ind->result, tlvota_file->last_file.path_type);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ goto out;
+ }
+
+ /* Read last updated file */
+ mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, tlvota_file->last_file.name, &apply_path_type, apply_filename, pMcf);
+
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_REPORT_STATE_READ_FILE_FAIL(ind->result, mcf_ret);
+ }
+ }
+
+out:
+ if (sim_id >= 0 && sim_id < MAX_SIM_NUM){
+ pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+ }
+
+ ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_local_para_ptr) {
+ ASSERT(0);
+ ret = KAL_FALSE;
+
+ return ret;
+ }
+
+ ind_local_para_ptr->type = MCF_L4C_REPORT_DSBP_RESULT_OF_MCF_DSBP_ACTIVE_MODE;
+ ind_local_para_ptr->result = ind->result;
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4C + ind->ps_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ /* Support MCF Tool Send AT cmd - Write Urc result in txt */
+ kal_mem_set(urc_result,0,16);
+ ret_sprintf = kal_snprintf(urc_result, 15, "%cEMCFRPT=%d,%d%c", '\n', MCF_L4C_REPORT_DSBP_RESULT_OF_MCF_DSBP_ACTIVE_MODE, ind->result, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > 16){
+ strncpy(urc_result, "EMCFRPT error", 15);
+ }
+ at_len = strlen(txt_buff);
+ strncat(txt_buff, urc_result, 15);
+ MD_TRC_MCF_TR_REPORT_STATE_CMD_RESULT(txt_buff);
+ ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, at_len+strlen(urc_result));
+ if (ret != KAL_TRUE) {
+ return ret;
+ }
+
+
+ break;
+ }
+
+ case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
+ {
+ mcf_l4c_report_state_ind_struct *ind_local_para_ptr = NULL;
+
+ if (pMcf->dsbp_ind_cnt > 0){
+ pMcf->dsbp_ind_cnt --;
+ }
+
+ if (ind->result != MCF_TRIGGER_DSBP_R_SUCCESS){
+ pMcf->dsbp_ind_ret = KAL_FALSE;
+ }
+
+
+ if(pMcf->dsbp_ind_cnt == 0){
+
+ ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_local_para_ptr) {
+ ASSERT(0);
+ ret = KAL_FALSE;
+
+ return ret;
+ }
+
+ ind_local_para_ptr->type = MCF_L4C_REPORT_MCF_DUMP_RESULT_OF_AUTO_SELECT_BIN;
+ ind_local_para_ptr->result = ind->result;
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ MOD_L4C + ind->ps_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+
+ /* Support MCF Tool Send AT cmd - Write Urc result in txt */
+ kal_mem_set(urc_result,0,16);
+ ret_sprintf = kal_snprintf(urc_result, 15, "%cEMCFRPT=%d,%d%c", '\n', MCF_L4C_REPORT_MCF_DUMP_RESULT_OF_AUTO_SELECT_BIN, ind->result, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > 16){
+ strncpy(urc_result, "EMCFRPT error", 15);
+ }
+ at_len = strlen(txt_buff);
+ strncat(txt_buff, urc_result, 15);
+ MD_TRC_MCF_TR_REPORT_STATE_CMD_RESULT(txt_buff);
+ ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, at_len+strlen(urc_result));
+ if (ret != KAL_TRUE) {
+ return ret;
+ }
+ }
+
+ break;
+ }
+ case L4C_MCF_CONFIG_UPDATE_OPOTA_FILE:
+ {
+ mcf_l4c_report_state_ind_struct *ind_local_para_ptr = NULL;
+ mcf_t *pMcf = mcf_get_instance();
+
+ pMcf->dsbp_ind_cnt --;
+
+ if (ind->result != MCF_TRIGGER_DSBP_R_SUCCESS){
+ pMcf->dsbp_ind_ret = KAL_FALSE;
+ }
+
+
+ if(pMcf->dsbp_ind_cnt == 0){
+ if (pMcf->is_critical == KAL_TRUE){
+ pMcf->is_critical = KAL_FALSE;
+ ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_local_para_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+ return ret;
+ }
+
+
+ ind_local_para_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+
+ if (pMcf->dsbp_ind_ret == KAL_TRUE){
+ ind_local_para_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
+ }else{
+ ind_local_para_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
+ }
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ind->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ }else{
+ ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+ if (!ind_local_para_ptr) {
+ ASSERT(0);
+ ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+ return ret;
+ }
+
+ ind_local_para_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+
+ if (pMcf->dsbp_ind_ret == KAL_TRUE){
+ ind_local_para_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
+ }else{
+ ind_local_para_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
+ }
+
+
+ /* Send process result to ATCI */
+ msg_send6(MOD_MCF, /* src_mod_id */
+ ind->src_mod_id, /* dest_mod_id */
+ MCF_SAP, /* sap_id */
+ MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+ (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
+ NULL); /* peer_buff_ptr */
+ }
+ }
+
+
+ break;
+ }
+
+ default:
+ MD_TRC_MCF_TR_REPORT_STATE_INVALID_OP(ind->config_op);
+ ret = KAL_FALSE;
+ break;
+ }
+
+ return ret;
+}
+
+_STATIC kal_bool mcf_em_update_req_hdlr(local_para_struct *local_para_ptr)
+{
+ l4cps_em_update_req_struct *req = (l4cps_em_update_req_struct *)local_para_ptr;
+ kal_bool ret = KAL_TRUE;
+
+ /*
+ * Only process Tool source, ignore AP.
+ */
+ if (req->em_src == EM_FROM_ELT) {
+ switch (req->info_request[MCF_EM_OTA_FILE_INFO]) {
+ case EM_ON:
+ com_Mcf.is_em_on = KAL_TRUE;
+ break;
+
+ case EM_OFF:
+ com_Mcf.is_em_on = KAL_FALSE;
+ break;
+
+ case EM_NC:
+ /* No change */
+ break;
+
+ default:
+ ret = KAL_FALSE;
+ MD_TRC_MCF_TR_EM_UPDATE_INVALID_INFO(req->info_request[MCF_EM_OTA_FILE_INFO]);
+ break;
+ }
+ } else {
+ ret = KAL_FALSE;
+ MD_TRC_MCF_TR_EM_UPDATE_INVALID_SOURCE(req->em_src);
+ }
+
+ return ret;
+}
+
+_STATIC void mcf_v1_do_ota_full(mcf_ota_file_t *ota_file)
+{
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_ota_file_item_t *pItem;
+ kal_uint16 item_cnt = 0;
+ nvram_errno_enum nvram_api_ret;
+ kal_bool is_read_nvram = KAL_FALSE;
+ nvram_ltable_entry_struct lid_info = {0};
+ kal_uint8 *lid_buffer = NULL;
+ nvram_ltable_entry_struct pre_lid_info = {0};
+ kal_uint16 pre_record_idx = 0xFFFF;
+ kal_uint8 *pre_lid_buffer = NULL;
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+ kal_uint32 item_size;
+ kal_int16 pos = -1;
+ kal_uint16 in_pos = 0;
+ mcf_tag_info_struct unuse = {0};
+ MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
+
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+ pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+
+ /* Read changed items from OTA file */
+ while (item_cnt < pFile->item_num) {
+ if ( (is_read_nvram == KAL_FALSE) || (pItem->lid != pre_lid_info.LID) || (pItem->record_idx != pre_record_idx) ) {
+ nvram_api_ret = nvram_external_get_lid_info(pItem->lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_LID_INFO_FAIL, pItem->lid, nvram_api_ret);
+ mcf_utfwk_printf("Fail to get LID information!! lid(%d), nvram_ret(%d)", pItem->lid, nvram_api_ret);
+ goto next;
+ }
+
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ /* Store last time modified LID */
+ if ( (pItem->lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+ && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+ if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid(pItem->lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, pItem->lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid(pItem->lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, in_pos) != KAL_TRUE){
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, pItem->lid);
+ mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)", pItem->lid);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, pItem->lid, in_pos);
+ }
+ nv_int_info.last_mod_lid.lid_cnt++;
+ }
+ }
+ }
+#else
+ /* Store last time modified LID */
+ if ( (pItem->lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+ && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+ if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid_struct(pItem->lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, pItem->lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid_struct(pItem->lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, in_pos, nv_int_info.not_reset_ota, KAL_FALSE) != KAL_TRUE){
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, pItem->lid);
+ mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)", pItem->lid);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, pItem->lid, in_pos);
+ }
+ nv_int_info.last_mod_lid.lid_cnt++;
+ }
+ }
+ }
+#endif
+
+ /* Do not update LID if OTA attribute is not set */
+ if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR, lid_info.LID, lid_info.attr);
+ mcf_utfwk_printf("OTA attribute is not set, do not write to NVRAM. lid(%d), attribute(%x)", lid_info.LID, lid_info.attr);
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE && (pItem->lid != pre_lid_info.LID)) {
+ if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+ if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+ mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+ }
+ } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+ } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+ }
+ mcf_utfwk_printf("OTA query attribute is set, do not write to NVRAM. lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+ }
+
+ is_read_nvram = KAL_FALSE;
+ goto next;
+ }
+
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE) {
+ if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+ if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+ mcf_utfwk_printf("Fail to write item LID(%d), record(%d)", pre_lid_info.LID, pre_record_idx);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+ }
+ } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+ } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
+ }
+
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+ is_read_nvram = KAL_FALSE;
+ }
+
+ /* Do not reset LID if same with previos one */
+ if (pItem->lid != pre_lid_info.LID) {
+ if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0 ) {
+ if ( !nvram_external_reset_data(pItem->lid, 1, lid_info.total_records) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_LID_FAIL, pItem->lid, lid_info.total_records);
+ mcf_utfwk_printf("Reset LID(%d) FAIL!!, total_record(%d)", pItem->lid, lid_info.total_records);
+ }
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_ATTR_NOT_SET, lid_info.LID, lid_info.attr);
+ mcf_utfwk_printf("OTA reset attribute is not set!! lid(%d), attribute(%x)", lid_info.LID, lid_info.attr);
+ }
+ }
+
+ lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info.size);
+
+ /* Read NVRAM LID */
+ if ( !nvram_external_read_data(pItem->lid, pItem->record_idx, lid_buffer, lid_info.size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_ITEM_LID_FAIL, pItem->lid, pItem->record_idx);
+ mcf_utfwk_printf("Fail to read item LID(%d), record(%d)", pItem->lid, pItem->record_idx);
+ is_read_nvram = KAL_FALSE;
+ free_ctrl_buffer_set_null(lid_buffer);
+
+ goto next;
+ } else {
+ is_read_nvram = KAL_TRUE;
+ }
+ }
+
+ /* Check if item_tag_len is valid */
+ if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_TAG_LEN, pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+ mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d)", pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+
+ goto next;
+ }
+
+ /* Update LID item */
+ if (pItem->is_bit_op == 0) {
+ strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ITEM_TAG, item_tag);
+ if (mcf_find_tag_offset(pItem->lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if (pItem->op.byte.value_len > item_size) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_LARGE_VAL_LEN, pItem->op.byte.value_len, item_size);
+ mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d)", pItem->op.byte.value_len, item_size);
+ goto next;
+ }
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BYTE_UPDATE, pItem->lid, item_byte_offset, pItem->op.byte.value_len);
+ mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+
+ kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
+
+ strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ITEM_TAG, item_tag);
+ if (mcf_find_tag_offset(pItem->lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+ mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d)", pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+ goto next;
+ }
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BIT_UPDATE, pItem->lid, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
+
+ if (pItem->op.bit.value_len == 1) {
+ kal_uint8 *val_tmp = (kal_uint8 *)(lid_buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 2) {
+ kal_uint16 *val_tmp = (kal_uint16 *)(lid_buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 4) {
+ kal_uint32 *val_tmp = (kal_uint32 *)(lid_buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ }
+ }
+
+
+next:
+ pre_lid_info = lid_info;
+ pre_record_idx = pItem->record_idx;
+ pre_lid_buffer = lid_buffer;
+ pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+
+ if (item_cnt > 0) {
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE) {
+ if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+ if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+ mcf_utfwk_printf("Fail to write item LID(%d), record(%d)", pre_lid_info.LID, pre_record_idx);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+ }
+ } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+ } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
+ }
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+
+ }
+ }
+
+
+ return;
+}
+_STATIC mcf_ota_result_e mcf_v1_do_ota_by_lid(mcf_ota_file_t *ota_file, nvram_lid_enum lid, kal_uint16 record_idx, kal_uint16 record_amount, nvram_ltable_entry_struct *lid_info)
+{
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_ota_file_item_t *pItem;
+ kal_bool is_read_nvram = KAL_FALSE;
+ kal_uint16 pre_record_idx = 0xFFFF;
+ kal_bool is_found_target = KAL_FALSE;
+ kal_uint8 *pre_lid_buffer = NULL;
+ kal_uint8 *lid_buffer = NULL;
+ kal_uint16 item_cnt = 0;
+ kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ mcf_tag_info_struct unuse = {0};
+ MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
+
+
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+ pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+ /* Read changed items from OTA file */
+ while (item_cnt < pFile->item_num) {
+ if ( (pItem->lid != lid) || (pItem->record_idx < record_idx) || (pItem->record_idx > (record_idx + record_amount - 1)) ) {
+ if (is_found_target == KAL_FALSE) {
+ goto next;
+ } else {
+ // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
+ break;
+ }
+ }
+
+ if ( (is_read_nvram == KAL_FALSE) || (pItem->record_idx != pre_record_idx) ) {
+ is_found_target = KAL_TRUE;
+
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE) {
+ if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
+ MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
+ } else {
+ MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
+ }
+
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+ is_read_nvram = KAL_FALSE;
+ }
+
+ lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info->size);
+
+ /* Read NVRAM LID */
+ if ( !nvram_external_read_data(pItem->lid, pItem->record_idx, lid_buffer, lid_info->size) ) {
+ MD_TRC_MCF_TR_LID_OTA_READ_ITEM_NVRAM_FAIL(lid, pItem->record_idx);
+ is_read_nvram = KAL_FALSE;
+ free_ctrl_buffer_set_null(lid_buffer);
+
+ goto next;
+ } else {
+ is_read_nvram = KAL_TRUE;
+ }
+ }
+
+ /* Check if item_tag_len is valid */
+ if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_LID_OTA_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+ goto next;
+ }
+
+ /* Update LID item */
+ if (pItem->is_bit_op == 0) {
+ strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if (pItem->op.byte.value_len > item_size) {
+ MD_TRC_MCF_TR_LID_OTA_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_LID_OTA_BYTE_UPDATE(lid, item_byte_offset, pItem->op.byte.value_len);
+ mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+
+ kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
+
+ strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+ MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_LID_OTA_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
+
+ if (pItem->op.bit.value_len == 1) {
+ kal_uint8 *val_tmp = (kal_uint8 *)(lid_buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 2) {
+ kal_uint16 *val_tmp = (kal_uint16 *)(lid_buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 4) {
+ kal_uint32 *val_tmp = (kal_uint32 *)(lid_buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ }
+ }
+
+next:
+ pre_record_idx = pItem->record_idx;
+ pre_lid_buffer = lid_buffer;
+ pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ if (item_cnt > 0) {
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE) {
+ if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
+ MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+ } else {
+ MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
+ }
+
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+ }
+ }
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+}
+_STATIC void mcf_v1_read_ota_buffer(mcf_ota_file_t *ota_file, nvram_lid_enum lid, kal_uint16 record_idx, kal_uint8 *buffer)
+{
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_ota_file_item_t *pItem;
+ kal_uint16 item_cnt = 0;
+ kal_bool is_found_target = KAL_FALSE;
+ kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ mcf_tag_info_struct unuse = {0};
+ MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
+
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+ pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+ /* Read changed items from OTA file */
+ while (item_cnt < pFile->item_num) {
+ if ( (pItem->lid != lid) || (pItem->record_idx != record_idx) ) {
+ if (is_found_target == KAL_FALSE) {
+ goto next;
+ } else {
+ // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
+ break;
+ }
+ }
+ is_found_target = KAL_TRUE;
+
+ /* Check if item_tag_len is valid */
+ if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+ mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d) \r\n", pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+ goto next;
+ }
+
+ /* Update LID item */
+ if (pItem->is_bit_op == 0) {
+ strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if (pItem->op.byte.value_len > item_size) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
+ mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->op.byte.value_len, item_size);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_BYTE_UPDATE(lid, item_byte_offset, pItem->op.byte.value_len);
+ mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+
+ kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
+
+ strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+ mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d) \r\n", pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
+
+ if (pItem->op.bit.value_len == 1) {
+ kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 2) {
+ kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 4) {
+ kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ }
+ }
+
+next:
+ pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+}
+_STATIC void mcf_v1_read_tlvota_buffer(mcf_tlvota_file_t *tlvota_file, mcf_tlvota_tag_t tag, nvram_lid_enum lid, kal_uint8 *buffer)
+{
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_tlvota_file_item_t *pItem;
+ kal_uint16 item_cnt = 0;
+ kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ mcf_tag_info_struct unuse = {0};
+ MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
+
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+ /* Read changed items from TLV-OTA file */
+ while (item_cnt < pFile->item_num) {
+ /* Check if LID and tag match */
+ if ( (pItem->lid != lid) || (pItem->tag_type != tag.tag_type) || (strncmp(&(pItem->buff_start), tag.tag, pItem->tag_len) != 0) ) {
+ goto next;
+ }
+
+
+ /* Check if item_tag_len is valid */
+ if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+ goto next;
+ }
+
+ /* Update LID item */
+ if (pItem->is_bit_op == 0) {
+ strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if (pItem->op.byte.value_len > item_size) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BYTE_UPDATE_USIR(lid, tag.tag, item_byte_offset, pItem->op.byte.value_len);
+ mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
+
+ kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.bit.value_len);
+
+ strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
+ item_tag[pItem->item_tag_len] = '\0';
+ if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+ goto next;
+ }
+
+ if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BIT_UPDATE_USIR(lid, tag.tag, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
+
+ if (pItem->op.bit.value_len == 1) {
+ kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 2) {
+ kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ } else if (pItem->op.bit.value_len == 4) {
+ kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
+
+ *val_tmp &= ~(bit_mask << item_bit_offset);
+ *val_tmp |= (bit_value << item_bit_offset);
+ }
+ }
+
+next:
+ pItem = (mcf_tool_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+}
+
+/*------------------------------------------------------------------------------
+ * Public fucntions.
+ *----------------------------------------------------------------------------*/
+void mcf_on_ilm(ilm_struct *ilm)
+{
+ switch (ilm->msg_id)
+ {
+ case MSG_ID_L4C_MCF_SET_CONFIG_REQ:
+ mcf_l4_set_config(ilm);
+ break;
+
+ case MSG_ID_L4C_MCF_GET_CONFIG_REQ:
+ mcf_l4_get_config(ilm);
+ break;
+
+ case MSG_ID_L4C_MCF_DUMP_DATA_REQ:
+ mcf_l4_dump_data(ilm);
+ break;
+
+ case MSG_ID_L4C_MCF_CONFIG_LID_VARIABLE_OPERATION_REQ:
+ mcf_l4_query_lid(ilm);
+ break;
+
+ case MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_CNF:
+ mcf_respond_dsbp_result(ilm->local_para_ptr);
+ break;
+
+ case MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_RESULT_IND:
+ mcf_report_dsbp_result(ilm->local_para_ptr);
+ break;
+
+ case MSG_ID_L4CPS_EM_UPDATE_REQ:
+ mcf_em_update_req_hdlr(ilm->local_para_ptr);
+ break;
+
+ case MSG_ID_TIMER_EXPIRY:
+ evshed_timer_handler(mcf_timer_es_g);
+ break;
+
+ case MSG_ID_L4C_MCF_UPDATE_OTA_FILE_REQ:
+ mcf_l4_update_ota(ilm);
+ break;
+
+ case MSG_ID_L4C_MCF_CONFIG_REQ:
+ mcf_l4_config(ilm);
+ break;
+
+ case MSG_ID_L4C_MCF_VARIABLE_VALUE_OPERATION_REQ:
+ mcf_l4_variable_operation(ilm);
+ break;
+
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ case MSG_ID_L4C_MCF_ASSIGN_COMBINED_FILE_PATH_REQ:
+ mcf_l4_assign_combined_file_path(ilm);
+ break;
+#endif
+
+#if defined(__MCF_UT_FRAMEWORK_SUPPORT__)
+ case MSG_ID_MCF_UTFWK_INITIAL_ENV_REQ:
+ mcf_utfwk_ilm_initial_env(ilm);
+ break;
+
+ case MSG_ID_MCF_UTFWK_INITIAL_DSBP_CALLBACK_REQ:
+ mcf_utfwk_ilm_initial_dsbp_callback(ilm);
+ break;
+
+ case MSG_ID_MCF_UTFWK_EXECUTE_REQ:
+ mcf_utfwk_ilm_execute(ilm);
+ break;
+
+ case MSG_ID_MCF_UTFWK_DUMP_RESULT_REQ:
+ mcf_utfwk_ilm_dump_result(ilm);
+ break;
+
+ case MSG_ID_MCF_UTFWK_RESET_REQ:
+ mcf_utfwk_ilm_reset(ilm);
+ break;
+
+#endif
+
+ default:
+ MD_TRC_MCF_TR_ILM_UNKNOWN_MSG(ilm->msg_id);
+ break;
+ }
+}
+
+mcf_ota_result_e mcf_do_ota_full(void)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_gid_ota_file_item_t *pItem;
+ mcf_ota_file_t *ota_file = &(pMcf->ota_file);
+ mcf_tlvota_file_t *tlvota_file;
+ kal_uint16 item_cnt = 0;
+ nvram_ef_mcf_ota_file_info_struct nv_ota_file;
+ nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
+ nvram_ef_mcf_sw_info_struct nv_sw_info;
+ nvram_ltable_entry_struct lid_info = {0};
+ em_mcf_read_ota_file_info_struct read_file_info;
+ kal_uint8 *lid_buffer = NULL;
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ l4c_mcf_path_type_enum apply_path_type;
+ kal_uint32 i;
+ nvram_errno_enum nvram_api_ret;
+ kal_bool is_read_nvram = KAL_FALSE;
+ kal_uint32 start_time;
+ kal_int16 pos = -1;
+ kal_uint16 in_pos = 0;
+ nvram_ltable_entry_struct pre_lid_info = {0};
+ kal_uint16 pre_record_idx = 0xFFFF;
+ kal_uint8 *pre_lid_buffer = NULL;
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_bool item_is_bit = KAL_FALSE;
+ kal_uint16 item_lid;
+ kal_char tool_version[MCF_FILE_MAX_TOOL_VERSION_LEN]={0};
+ kal_uint32 total_start_time = GET_CURRENT_TIME();
+ mcf_ota_result_e tlvota_ret;
+
+ /* This API can only be used by NVRAM while init */
+ MCF_UT_DUMMY_ASSERT(kal_query_systemInit() == KAL_TRUE);
+
+ mcf_create_custom_folder(pMcf);
+ kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+
+ /* Read MCF SW information in NVRAM */
+ 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_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_SW_INFO_LID, 1);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_SW_INFO_LID_FAIL;
+ mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_SW_INFO_LID, 1);
+ }
+ /* Read MCF Internal 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))) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_INT_INFO_LID_FAIL;
+ mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NOT_RESET, nv_int_info.not_reset_ota);
+ kal_mem_cpy(&mcf_general_tlvota_last_mod_lid_g, &nv_int_info.general_tlvota_last_mod_lid, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+ kal_mem_cpy(&mcf_tlvota_last_mod_lid_g, &nv_int_info.tlvota_last_mod_lid, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+
+ for (i = 0; i < MAX_SIM_NUM; i++) {
+ pMcf->is_ignore_dsbp[i] = nv_int_info.tlvota_is_ignore_dsbp[i];
+ }
+ pMcf->general_is_ignore_dsbp = nv_int_info.general_is_ignore_dsbp;
+
+ /* Read general TLV-OTA file into cache buffer */
+ apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+ kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
+
+ /* Read MCF general 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_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
+ mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1);
+ }
+
+ ret = mcf_read_general_tlvota_file(KAL_TRUE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+ // Set General OPOTA - Get tlvota result
+ if (pMcf->general_is_ignore_dsbp == KAL_TRUE){
+ for(i = 0; i < MAX_SIM_NUM; i++){
+ com_Mcf.tlvota_result[i] = ret;
+ }
+ /* Check if file type is TLV-OTA file */
+ 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);
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
+ for(i = 0; i < MAX_SIM_NUM; i++){
+ com_Mcf.tlvota_result[i] = MCF_OTA_R_INVALID_FILE;
+ }
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+ }
+ }
+ if (ret == MCF_OTA_R_SUCCESS) {
+ 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);
+
+ /* Store last updated file informantion */
+ tlvota_file->last_file.path_type = apply_path_type;
+ strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+ tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+ }
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+ tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+ }
+ /*
+ * No need to Update TLV-OTA information if
+ * 1. SW version and generated time in OTA file and NVRAM are same
+ * 2. Current SW version and build time are the same as last MCF OTA SW
+ */
+ if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
+ if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_general_tlvota_file.sw_version, pFile->sw_version_len) != 0) ||
+ (strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_general_tlvota_file.gen_time, pFile->gen_time_len) != 0) ||
+ (strncmp(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
+ (strncmp(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)) {
+ /* Write updated MCF TLV-OTA file information to NVRAM */
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
+ nv_sw_info.last_update_general_tlvota_file.sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+ }
+
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
+ nv_sw_info.last_update_general_tlvota_file.gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+ }
+ strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ for(i = 0; i < MAX_SIM_NUM; i++){
+ is_read_general_tlvota[i] = KAL_TRUE;
+ }
+ }
+ }else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_general_tlvota_file.sw_version, pFile->sw_version_len) != 0) ||
+ (strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_general_tlvota_file.gen_time, pFile->gen_time_len) != 0) ||
+ (strncmp(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
+ (strncmp(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)) {
+ /* Write updated MCF TLV-OTA file information to NVRAM */
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
+ nv_sw_info.last_update_general_tlvota_file.sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+ }
+
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
+ nv_sw_info.last_update_general_tlvota_file.gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+ }
+ strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ for(i = 0; i < MAX_SIM_NUM; i++){
+ is_read_general_tlvota[i] = KAL_TRUE;
+ }
+ }
+
+ }
+
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_GENERAL_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+ }
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_GENERAL_TLVOTA_FILE_INFO, apply_path_type, apply_filename);
+
+ }
+
+
+
+ /* Read TLV-OTA file into cache buffer */
+ for (i = 0; i < MAX_SIM_NUM; i++) {
+ apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+ kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
+ kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+ com_Mcf.update_tlvota[i] = KAL_FALSE;
+ com_Mcf.update_general_tlvota[i] = KAL_FALSE;
+
+ tlvota_file = &(pMcf->tlvota_file[i]);
+
+ read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_BOOT_UP;
+ read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+ read_file_info.ps_id = l4c_gemini_get_switched_sim_id(i);
+
+ /* Read MCF TLV-OTA file into cache buffer */
+ if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, i + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_TLVOTA_FILE_LID, i + 1);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
+ mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_TLVOTA_FILE_LID, i + 1);
+ }
+
+ read_file_info.start_time = kal_get_systicks();
+
+ ret = mcf_read_tlvota_file(KAL_TRUE, i, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+ tlvota_ret = ret;
+ if (ret == MCF_OTA_R_SUCCESS) {
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ /* Store last updated file informantion */
+ tlvota_file->last_file.path_type = apply_path_type;
+ strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+ tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+ }
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+ tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+ }
+ /*
+ * No need to Update TLV-OTA information if
+ * 1. SW version and generated time in OTA file and NVRAM are same
+ * 2. Current SW version and build time are the same as last MCF OTA SW
+ */
+ if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
+ if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, pFile->sw_version_len) != 0) ||
+ (strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, pFile->gen_time_len) != 0) ||
+ (strncmp(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
+ (strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)){
+
+ /* Write updated MCF TLV-OTA file information to NVRAM */
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(nv_sw_info.last_update_tlvota_file[i].sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
+ nv_sw_info.last_update_tlvota_file[i].sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+ }
+
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(nv_sw_info.last_update_tlvota_file[i].gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
+ nv_sw_info.last_update_tlvota_file[i].gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+ }
+ strncpy(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ is_read_tlvota[i] = KAL_TRUE;
+
+ }
+ }else if(apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME){
+ if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, pFile->sw_version_len) != 0) ||
+ (strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, pFile->gen_time_len) != 0) ||
+ (strncmp(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
+ (strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)){
+ /* Write updated MCF TLV-OTA file information to NVRAM */
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(nv_sw_info.last_update_tlvota_file[i].sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
+ nv_sw_info.last_update_tlvota_file[i].sw_version[pFile->sw_version_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+ }
+
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(nv_sw_info.last_update_tlvota_file[i].gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
+ nv_sw_info.last_update_tlvota_file[i].gen_time[pFile->gen_time_len] = '\0';
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+ }
+ strncpy(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ is_read_tlvota[i] = KAL_TRUE;
+
+ }
+
+ }
+
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+ }
+
+ read_file_info.path_type = apply_path_type;
+ strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_INFO, i, apply_path_type, apply_filename);
+ }else{
+ /* Copy last updated file informantion */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ if ((strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0)) {
+ tlvota_file->last_file.path_type = L4C_MCF_PATH_TYPE_OTA;
+ }else if ((strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0)) {
+ tlvota_file->last_file.path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+ }
+ strncpy(tlvota_file->last_file.name, nv_sw_info.last_update_tlvota_file[i].name, MCF_FILE_MAX_NAME_LEN - 1);
+ strncpy(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, MCF_FILE_MAX_SW_VERSION_LEN-1);
+ strncpy(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, MCF_FILE_MAX_GEN_TIME_LEN - 1);
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+ }
+
+ }
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ if (pMcf->is_ignore_dsbp[i] == KAL_TRUE){
+ set_op_read_ret[i] = tlvota_ret;
+ /* Check if file type is TLV-OTA file */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
+ com_Mcf.tlvota_result[i] = MCF_OTA_R_INVALID_FILE;
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+ }
+ }
+ }
+
+ kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+ read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_BOOT_UP;
+ read_file_info.config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+
+ /* Read MCF OTA file into cache buffer */
+ 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_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_OTA_FILE_LID, 1);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
+ mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_OTA_FILE_LID, 1);
+ }
+
+ nv_int_info.update_ota_result = KAL_FALSE;
+ apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+ kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
+ read_file_info.start_time = kal_get_systicks();
+
+ ret = mcf_read_ota_file(KAL_TRUE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
+
+ if (ret == MCF_OTA_R_SUCCESS) {
+ read_file_info.path_type = apply_path_type;
+ strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_OTA_FILE_INFO, apply_path_type, apply_filename);
+ } else {
+ /* Cannot do OTA if fail to read OTA file */
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_OTA_FILE_FAIL);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_FULL_OTA_FAIL;
+ mcf_utfwk_printf("Fail to read OTA file, cannot do full OTA!! \r\n");
+
+ return ret;
+ }
+
+
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+ /* Check if file type is OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+ ret = MCF_OTA_R_INVALID_FILE;
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_INVALID_FILE;
+ mcf_utfwk_printf("Invalid file type(%s)!! \r\n", str_tmp);
+
+ return ret;
+ }
+
+ /*
+ * No need to do OTA if
+ * 1. SW version and generated time in OTA file and NVRAM are same
+ * 2. Current SW version and build time are the same as last MCF OTA SW
+ */
+ if ( (strncmp(nv_sw_info.last_update_file.sw_version, &(pFile->buff_start), pFile->sw_version_len) == 0) &&
+ (strncmp(nv_sw_info.last_update_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len) == 0) &&
+ (strncmp(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN) == 0) &&
+ (strncmp(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN) == 0) ) {
+ if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
+ if ((strncmp(nv_sw_info.last_update_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0) &&
+ (strncmp(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) ) {
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED1);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED2, nv_sw_info.last_update_file.sw_version, nv_sw_info.last_update_file.gen_time);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED3, nv_sw_info.version, nv_sw_info.build_time);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
+ com_Mcf.boot_trace_flag |= (MCF_BOOT_TRACE_F_NO_NEED | MCF_BOOT_TRACE_F_FULL_OTA_SUCCESS);
+ mcf_utfwk_printf("MD version is not changed, no need to do full OTA!!\r\n");
+
+ return ret;
+ }
+ } else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ if ((strncmp(nv_sw_info.last_update_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0) &&
+ (strncmp(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) ) {
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED1);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED2, nv_sw_info.last_update_file.sw_version, nv_sw_info.last_update_file.gen_time);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED3, nv_sw_info.version, nv_sw_info.build_time);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
+ com_Mcf.boot_trace_flag |= (MCF_BOOT_TRACE_F_NO_NEED | MCF_BOOT_TRACE_F_FULL_OTA_SUCCESS);
+ mcf_utfwk_printf("MD version is not changed, no need to do full OTA!!\r\n");
+
+ return ret;
+ }
+ }
+ }
+
+
+ /* Reset LID to default value */
+ if((pFile->operation_mask & MCF_FILE_OP_NOT_RESET_LID) == 0) {
+ /* Copy last modified LID list to global variable */
+ kal_mem_cpy(&mcf_last_mod_lid_g, &nv_int_info.last_mod_lid, sizeof(nvram_mcf_lid_info_struct));
+
+ start_time = GET_CURRENT_TIME();
+ if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
+ nvram_api_ret = nvram_external_get_lid_info(MCF_LAST_MODIFIED_LID, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ mcf_utfwk_printf("is_reset_all(%d). Fail to get all LID information!! lid(%d), nvram_ret(%d)\r\n", 0, MCF_LAST_MODIFIED_LID, nvram_api_ret);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_ALL_LID_INFO_FAIL, 0, MCF_LAST_MODIFIED_LID, nvram_api_ret);
+ continue;
+ }
+ if((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) {
+ if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0) {
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ if(nv_int_info.not_reset_ota == KAL_FALSE || nv_int_info.last_mod_lid.lid_conf[i].not_reset == KAL_FALSE)
+#endif
+ {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID, 0, MCF_LAST_MODIFIED_LID);
+ if ( !nvram_external_reset_data(MCF_LAST_MODIFIED_LID, 1, lid_info.total_records) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID_FAIL, 0, MCF_LAST_MODIFIED_LID, lid_info.total_records);
+ mcf_utfwk_printf("is_reset_all(%d). Reset All LID(%d) FAIL!!, total_record(%d)\r\n", 0, MCF_LAST_MODIFIED_LID, lid_info.total_records);
+ }
+ }
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_ATTR_NOT_SET, 0, lid_info.LID, lid_info.attr);
+ mcf_utfwk_printf("is_reset_all(%d). OTA all reset LID attribute is not set!! lid(%d), attribute(%x)\r\n", 0, lid_info.LID, lid_info.attr);
+ }
+
+ }
+ }
+ }else{
+ for(i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++){
+ nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_ALL_LID_INFO_FAIL, 1, mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
+ mcf_utfwk_printf("is_reset_all(%d). Fail to get all LID information!! lid(%d), nvram_ret(%d)\r\n", 1, mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
+ continue;
+ }
+ if((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) {
+ if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID, 1, mcf_db_lid_mapping_tbl[i].lid_num);
+ if ( !nvram_external_reset_data(mcf_db_lid_mapping_tbl[i].lid_num, 1, lid_info.total_records) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID_FAIL, 1, mcf_db_lid_mapping_tbl[i].lid_num, lid_info.total_records);
+ mcf_utfwk_printf("is_reset_all(%d). Reset All LID(%d) FAIL!!, total_record(%d)\r\n", 1, mcf_db_lid_mapping_tbl[i].lid_num, lid_info.total_records);
+ }
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_ATTR_NOT_SET, 1, lid_info.LID, lid_info.attr);
+ mcf_utfwk_printf("is_reset_all(%d). OTA all reset LID attribute is not set!! lid(%d), attribute(%x)\r\n", 1, lid_info.LID, lid_info.attr);
+ }
+ }
+ }
+ }
+
+ kal_mem_set(&nv_int_info.last_mod_lid, 0, sizeof(nvram_mcf_lid_info_struct));
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_TIME, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+ }
+
+
+ /* Update MCF OTA file flow - MCF2.0 */
+ if (pFile->file_version == 3) {
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+ pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+
+ /* Read changed items from OTA file */
+ while (item_cnt < pFile->item_num) {
+ /* Check if array_tag_len is valid */
+ if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ARRAY_INDEX_LEN, pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ mcf_utfwk_printf("Invalid array_index_len(%d)!! max array_index_len(%d)\r\n", pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ goto next;
+ }
+ strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
+ array_tag[pItem->array_index_len] = '\0';
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);
+
+ /* Find GID corresponding LID */
+ item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+ if (item_lid == 65535){
+ //-1(65535) means not found
+ goto next;
+ }
+
+ if ( (is_read_nvram == KAL_FALSE) || (item_lid != pre_lid_info.LID) || (pItem->record_idx != pre_record_idx) ) {
+ nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_LID_INFO_FAIL, item_lid, nvram_api_ret);
+ mcf_utfwk_printf("Fail to get LID information!! lid(%d), nvram_ret(%d)\r\n", item_lid, nvram_api_ret);
+ goto next;
+ }
+
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ /* Store last time modified LID */
+ if ( (item_lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+ && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+ if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid(item_lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, item_lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid(item_lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, in_pos) != KAL_TRUE){
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, item_lid);
+ mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)\r\n", item_lid);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, item_lid, in_pos);
+ }
+ nv_int_info.last_mod_lid.lid_cnt++;
+ }
+ }
+ }
+#else
+ /* Store last time modified LID */
+ if ( (item_lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+ && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+ if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+ pos = mcf_binary_search_lid_struct(item_lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, item_lid, pos);
+ if (pos == -1) {
+ if(mcf_insert_lid_struct(item_lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, in_pos, nv_int_info.not_reset_ota, KAL_FALSE) != KAL_TRUE){
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, item_lid);
+ mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)\r\n", item_lid);
+ }else{
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, item_lid, in_pos);
+ }
+ nv_int_info.last_mod_lid.lid_cnt++;
+ }
+ }
+ }
+#endif
+
+ /* Do not update LID if OTA attribute is not set */
+ if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR, lid_info.LID, lid_info.attr);
+ mcf_utfwk_printf("OTA attribute is not set, do not write to NVRAM. lid(%d), attribute(%x)\r\n", lid_info.LID, lid_info.attr);
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE && (item_lid != pre_lid_info.LID)) {
+ if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+ if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+ mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+ }
+ } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+ } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+ }
+ mcf_utfwk_printf("OTA query attribute is set, do not write to NVRAM. lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+ }
+
+ is_read_nvram = KAL_FALSE;
+ goto next;
+ }
+
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE) {
+ if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+ if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+ mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+ }
+ } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+ } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+ }
+ mcf_utfwk_printf("OTA query attribute is set, do not write to NVRAM. lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+ is_read_nvram = KAL_FALSE;
+ }
+
+ /* Do not reset LID if same with previos one */
+ if (item_lid != pre_lid_info.LID) {
+ if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0 ) {
+ if(nv_int_info.not_reset_ota == KAL_FALSE){
+ if ( !nvram_external_reset_data(item_lid, 1, lid_info.total_records) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_LID_FAIL, item_lid, lid_info.total_records);
+ mcf_utfwk_printf("Reset LID(%d) FAIL!!, total_record(%d)\r\n", item_lid, lid_info.total_records);
+ }
+ }
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_ATTR_NOT_SET, lid_info.LID, lid_info.attr);
+ mcf_utfwk_printf("OTA reset attribute is not set!! lid(%d), attribute(%x)\r\n", lid_info.LID, lid_info.attr);
+ }
+ }
+
+ lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info.size);
+
+ /* Read NVRAM LID */
+ if ( !nvram_external_read_data(item_lid, pItem->record_idx, lid_buffer, lid_info.size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_ITEM_LID_FAIL, item_lid, pItem->record_idx);
+ mcf_utfwk_printf("Fail to read item LID(%d), record(%d)\r\n", item_lid, pItem->record_idx);
+ is_read_nvram = KAL_FALSE;
+ free_ctrl_buffer_set_null(lid_buffer);
+
+ goto next;
+ } else {
+ is_read_nvram = KAL_TRUE;
+ }
+ }
+
+ if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+ goto next;
+ }
+
+ /* Update LID item */
+ if (item_is_bit == 0) {
+ if (pItem->value_len > item_size) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_LARGE_VAL_LEN, pItem->value_len, item_size);
+ mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d)\r\n", pItem->value_len, item_size);
+ goto next;
+ }
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BYTE_UPDATE, item_lid, item_byte_offset, pItem->value_len);
+ mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+ kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+ nv_int_info.update_ota_result = KAL_TRUE;
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+ kal_uint32 offset = 0;
+ kal_uint32 var_size = 1;
+ kal_uint32 val_tmp = 0;
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+ if (pItem->value_len > 4) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, pItem->value_len, item_size, pItem->value_len);
+ mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d)\r\n", item_size, item_size, pItem->value_len);
+ goto next;
+ }
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BIT_UPDATE, item_lid, item_byte_offset, item_bit_offset, item_size, bit_value);
+
+ if (item_size > 8 && item_size <= 16) {
+ var_size = 2;
+ }else if (item_size > 16 && item_size <= 24) {
+ var_size = 3;
+ }else if (item_size > 24 && item_size <= 32) {
+ var_size = 4;
+ }
+
+ if (item_bit_offset > 0 && item_bit_offset < 8){
+ offset = 0;
+ }else if(item_bit_offset >= 8 && item_bit_offset < 16){
+ offset = 1;
+ }else if(item_bit_offset >= 16 && item_bit_offset < 24){
+ offset = 2;
+ }else if(item_bit_offset >= 24 && item_bit_offset < 32){
+ offset = 3;
+ }else if (item_bit_offset >= 32){
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_OFFSET, item_bit_offset, item_size, pItem->value_len);
+ mcf_utfwk_printf("Invalid item_bit_offset(%d)!! current item len(%d), bit_value_len(%d) \r\n", item_bit_offset, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset > 0) {
+ if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+ var_size+=((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+ }
+ }
+
+ if (var_size > 4) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, var_size, item_size, pItem->value_len);
+ mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d)\r\n", var_size, item_size, pItem->value_len);
+ goto next;
+ }
+
+ if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ item_bit_offset -= 8;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ item_bit_offset -= 16;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ item_bit_offset -= 24;
+ }
+
+
+ kal_mem_cpy(&val_tmp, lid_buffer + item_byte_offset + offset, var_size);
+ val_tmp &= ~(bit_mask << item_bit_offset);
+ val_tmp |= (bit_value << item_bit_offset);
+
+ kal_mem_cpy(lid_buffer + item_byte_offset + offset, &val_tmp, var_size);
+
+ nv_int_info.update_ota_result = KAL_TRUE;
+ }
+
+
+ next:
+ pre_lid_info = lid_info;
+ pre_record_idx = pItem->record_idx;
+ pre_lid_buffer = lid_buffer;
+ pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+
+ if (item_cnt > 0) {
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE) {
+ if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+ if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+ mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+ }
+ } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+ } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+ mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+ }
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+
+ }
+ }
+ if (ret != MCF_OTA_R_SUCCESS){
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ return ret;
+ }
+ }else if (pFile->file_version == 2){
+ mcf_v1_do_ota_full(ota_file);
+ }
+
+ /* Write updated MCF OTA file information to NVRAM */
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(nv_sw_info.last_update_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+ nv_sw_info.last_update_file.sw_version[pFile->sw_version_len] = '\0';
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_SW_VERSION, nv_sw_info.last_update_file.sw_version);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+ mcf_utfwk_printf("Invalid OTA file SW version!! file_version_len(%d)!!\r\n", pFile->sw_version_len);
+ }
+
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(nv_sw_info.last_update_file.gen_time, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len);
+ nv_sw_info.last_update_file.gen_time[pFile->gen_time_len] = '\0';
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_GEN_TIME, nv_sw_info.last_update_file.gen_time);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+ mcf_utfwk_printf("Invalid OTA file SW gen time!! file_gen_time_len(%d)!!\r\n", pFile->gen_time_len);
+ }
+
+ if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
+ strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
+ tool_version[pFile->tool_version_len] = '\0';
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_TOOL_VERSION, tool_version);
+ } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_INVALID_TOOL_VERSION, pFile->tool_version_len);
+ mcf_utfwk_printf("Invalid OTA file tool version!! file_tool_version_len(%d)!!\r\n", pFile->tool_version_len);
+ }
+
+ if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
+ strncpy(nv_sw_info.last_update_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ } else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+ strncpy(nv_sw_info.last_update_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ strncpy(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ }
+
+ 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_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_OTA_FILE_LID, 1);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_FILE_LID_FAIL;
+ mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_OTA_FILE_LID, 1);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ return ret;
+ }
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ } else {
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TAKE_READ_LOCK_FAIL);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_TAKE_READ_LOCK_FAIL;
+ mcf_utfwk_printf("Read OTA, Fail to take read lock!!\r\n");
+
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ return ret;
+ }
+
+ /* Copy current modified LID list to global variable */
+ kal_mem_cpy(&mcf_curr_mod_lid_g, &nv_int_info.last_mod_lid, sizeof(nvram_mcf_lid_info_struct));
+
+ /* Write updated MCF SW information in NVRAM */
+ strncpy(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN - 1);
+ strncpy(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN - 1);
+ 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_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_SW_INFO_LID, 1);
+ mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_SW_INFO_LID, 1);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_SW_INFO_LID_FAIL;
+ }
+ /* Write updated MCF internal information in NVRAM */
+ 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_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
+ mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
+ com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_INT_INFO_LID_FAIL;
+ }
+
+ read_file_info.result = ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
+
+ return ret;
+}
+
+mcf_ota_result_e mcf_do_ota_by_lid(
+ nvram_lid_enum lid,
+ kal_uint16 record_idx,
+ kal_uint16 record_amount,
+ nvram_ltable_entry_struct *lid_info)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_gid_ota_file_item_t *pItem;
+ mcf_ota_file_t *ota_file = &(pMcf->ota_file);
+ kal_bool is_read_nvram = KAL_FALSE;
+ kal_uint16 pre_record_idx = 0xFFFF;
+ kal_bool is_found_target = KAL_FALSE;
+ kal_uint8 *pre_lid_buffer = NULL;
+ kal_uint8 *lid_buffer = NULL;
+ kal_uint16 item_cnt = 0;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ kal_bool item_is_bit = KAL_FALSE;
+ kal_uint16 item_lid;
+
+ DEBUG_ASSERT(lid_info);
+ if (!lid_info) {
+ MD_TRC_MCF_TR_LID_OTA_LID_INVALID_PARA(lid, lid_info);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ MD_TRC_MCF_TR_LID_OTA_START(lid, record_idx, record_amount);
+
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+
+ /* Check if file type is OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_LID_OTA_LID_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ /* If NVRAM_ATTR_MCF_OTA is not set, do not OTA */
+ if ( (lid_info->attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
+ MD_TRC_MCF_TR_LID_OTA_INVALID_ATTR(lid, lid_info->attr);
+ ret = MCF_OTA_R_INVALID_ATTR;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ /* Not allow to set both NVRAM_ATTR_MCF_OTA and NVRAM_ATTR_MCF_OTA_FOR_QUERY */
+ if ( (lid_info->attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+ MD_TRC_MCF_TR_LID_OTA_DOUBLE_ATTR(lid, lid_info->attr);
+ ret = MCF_OTA_R_INVALID_ATTR;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ /* MCF 1.0 update flow */
+ if (pFile->file_version == 2){
+ ret = mcf_v1_do_ota_by_lid (ota_file, lid, record_idx, record_amount, lid_info);
+ if(ret != MCF_OTA_R_SUCCESS)
+ {
+ return ret;
+ }
+ }else if (pFile->file_version == 3){
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+ pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+ /* Read changed items from OTA file */
+ while (item_cnt < pFile->item_num) {
+ if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_LID_OTA_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ goto next;
+ }
+ strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
+ array_tag[pItem->array_index_len] = '\0';
+
+ /* Find GID corresponding LID */
+ item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+ if (item_lid == 65535){
+ //-1(65535) means not found
+ goto next;
+ }
+
+ if ( (item_lid != lid) || (pItem->record_idx < record_idx) || (pItem->record_idx > (record_idx + record_amount - 1)) ) {
+ if (is_found_target == KAL_FALSE) {
+ goto next;
+ } else {
+ // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
+ break;
+ }
+ }
+
+ if ( (is_read_nvram == KAL_FALSE) || (pItem->record_idx != pre_record_idx) ) {
+ is_found_target = KAL_TRUE;
+
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE) {
+ if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
+ MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
+ } else {
+ MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
+ }
+
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+ is_read_nvram = KAL_FALSE;
+ }
+
+ lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info->size);
+
+ /* Read NVRAM LID */
+ if ( !nvram_external_read_data(item_lid, pItem->record_idx, lid_buffer, lid_info->size) ) {
+ MD_TRC_MCF_TR_LID_OTA_READ_ITEM_NVRAM_FAIL(lid, pItem->record_idx);
+ is_read_nvram = KAL_FALSE;
+ free_ctrl_buffer_set_null(lid_buffer);
+
+ goto next;
+ } else {
+ is_read_nvram = KAL_TRUE;
+ }
+ }
+
+ if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+ goto next;
+ }
+
+ /* Update LID item */
+ if (item_is_bit == 0) {
+ if (pItem->value_len > item_size) {
+ MD_TRC_MCF_TR_LID_OTA_LARGE_VAL_LEN(pItem->value_len, item_size);
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_LID_OTA_BYTE_UPDATE(lid, item_byte_offset, pItem->value_len);
+ mcf_dump_data(KAL_FALSE, &(pItem->buff_start)+pItem->array_index_len, pItem->value_len);
+
+ kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+ kal_uint32 offset = 0;
+ kal_uint32 var_size = 1;
+ kal_uint32 val_tmp = 0;
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+ if (pItem->value_len > 4) {
+ MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_LID_OTA_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, item_size, bit_value);
+
+ if (item_size > 8 && item_size <= 16) {
+ var_size = 2;
+ }else if (item_size > 16 && item_size <= 24) {
+ var_size = 3;
+ }else if (item_size > 24 && item_size <= 32) {
+ var_size = 4;
+ }
+
+ if (item_bit_offset > 0 && item_bit_offset < 8) {
+ offset = 0;
+ }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ offset = 1;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ offset = 2;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ offset = 3;
+ }else if (item_bit_offset >= 32){
+ MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset > 0) {
+ if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+ var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+ }
+ }
+
+ if (var_size > 4) {
+ MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+ goto next;
+ }
+
+ if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ item_bit_offset -= 8;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ item_bit_offset -= 16;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ item_bit_offset -= 24;
+ }
+
+
+ kal_mem_cpy(&val_tmp, lid_buffer + item_byte_offset + offset, var_size);
+ val_tmp &= ~(bit_mask << item_bit_offset);
+ val_tmp |= (bit_value << item_bit_offset);
+
+ kal_mem_cpy(lid_buffer + item_byte_offset + offset, &val_tmp, var_size);
+ }
+
+ next:
+ pre_record_idx = pItem->record_idx;
+ pre_lid_buffer = lid_buffer;
+ pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ if (item_cnt > 0) {
+ /* Write previous LID record */
+ if (is_read_nvram == KAL_TRUE) {
+ if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
+ MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
+ ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+ } else {
+ MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
+ }
+
+ free_ctrl_buffer_set_null(pre_lid_buffer);
+ }
+ }
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ }
+ } else {
+ MD_TRC_MCF_TR_LID_OTA_TAKE_READ_LOCK_FAIL(lid);
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ }
+
+ return ret;
+}
+
+mcf_ota_result_e mcf_read_ota_buffer(
+ nvram_lid_enum lid,
+ kal_uint16 record_idx,
+ kal_uint8 *buffer,
+ kal_uint32 size)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ nvram_ltable_entry_struct lid_info = {0};
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_gid_ota_file_item_t *pItem;
+ mcf_ota_file_t *ota_file = &(pMcf->ota_file);
+ kal_uint16 item_cnt = 0;
+ nvram_errno_enum nvram_api_ret;
+ kal_bool is_found_target = KAL_FALSE;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ kal_bool item_is_bit = KAL_FALSE;
+ kal_uint16 item_lid;
+ kal_uint32 start_time = GET_CURRENT_TIME();
+
+ if (!(buffer && (size > 0))) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_PARA(lid, buffer, size);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_PARA, lid, buffer, size);
+ mcf_utfwk_printf("Invalid parameters!! LID(%d), buffer(%x), size(%d) \r\n", lid, buffer, size);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_START(lid, record_idx, buffer, size);
+
+ MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ if (ota_file) {
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+ /* Check if file type is OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_FILE, str_tmp);
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_GET_LID_INFO_FAIL, lid, nvram_api_ret);
+ mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if (size != lid_info.size) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_SIZE(size, lid_info.size);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_SIZE, size, lid_info.size);
+ mcf_utfwk_printf("Invalid buffer_size(%d)!! record_size(%d) \r\n", size, lid_info.size);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+#if 0 //Bypass attribute check because NVRAM_ATTR_MCF_OTA will also use this API
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ /*MCF 1.0 Read OTA buffer Update flow */
+ if (pFile->file_version == 2){
+ mcf_v1_read_ota_buffer(ota_file, lid, record_idx, buffer);
+ }
+ else if (pFile->file_version == 3){
+ pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+ pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+ /* Read changed items from OTA file */
+ while (item_cnt < pFile->item_num) {
+ if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_ARRAY_INDEX_LEN, pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ mcf_utfwk_printf("Invalid array_index_len(%d)!! max array_index_len(%d) \r\n", pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ goto next;
+ }
+ strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
+ array_tag[pItem->array_index_len] = '\0';
+
+ /* Find GID corresponding LID */
+ item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+ if (item_lid == 65535){
+ //-1(65535) means not found
+ goto next;
+ }
+
+ if ( (item_lid != lid) || (pItem->record_idx != record_idx) ) {
+ if (is_found_target == KAL_FALSE) {
+ goto next;
+ } else {
+ // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
+ break;
+ }
+ }
+ is_found_target = KAL_TRUE;
+
+ if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+ goto next;
+ }
+
+ /* Update LID item */
+ if (item_is_bit == 0) {
+ if (pItem->value_len > item_size) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_LARGE_VAL_LEN(pItem->value_len, item_size);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_LARGE_VAL_LEN, pItem->value_len, item_size);
+ mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->value_len, item_size);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_BYTE_UPDATE(lid, item_byte_offset, pItem->value_len);
+ if (kal_query_systemInit() == KAL_TRUE){
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_BYTE_UPDATE, lid, item_byte_offset, pItem->value_len);
+ mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+ }
+ mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+ kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+ nv_int_info.update_general_tlvota_result = KAL_TRUE;
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+ kal_uint32 offset = 0;
+ kal_uint32 var_size = 1;
+ kal_uint32 val_tmp = 0;
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+
+ if (pItem->value_len > 4) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_BIT_LEN, item_size, item_size, pItem->value_len);
+ mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d) \r\n", item_size, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, item_size, bit_value);
+ if (kal_query_systemInit() == KAL_TRUE){
+ MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_BIT_UPDATE, lid, item_byte_offset, item_bit_offset, item_size, bit_value);
+ }
+
+ if (item_size > 8 && item_size <= 16) {
+ var_size = 2;
+ }else if (item_size > 16 && item_size <= 24) {
+ var_size = 3;
+ }else if (item_size > 24 && item_size <= 32) {
+ var_size = 4;
+ }
+
+ if (item_bit_offset > 0 && item_bit_offset < 8) {
+ offset = 0;
+ }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ offset = 1;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ offset = 2;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ offset = 3;
+ }else if (item_bit_offset >= 32){
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+ mcf_utfwk_printf("Invalid item_bit_offset(%d)!! current item len(%d), bit_value_len(%d) \r\n", item_bit_offset, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset > 0) {
+ if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+ var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+ }
+ }
+
+ if (var_size > 4) {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+ mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d) \r\n", var_size, item_size, pItem->value_len);
+ goto next;
+ }
+
+ if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ item_bit_offset -= 8;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ item_bit_offset -= 16;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ item_bit_offset -= 24;
+ }
+
+
+ kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
+ val_tmp &= ~(bit_mask << item_bit_offset);
+ val_tmp |= (bit_value << item_bit_offset);
+
+ kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
+ nv_int_info.update_general_tlvota_result = KAL_TRUE;
+ }
+
+ next:
+ pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+ }
+ } else {
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_TAKE_READ_LOCK_FAIL(lid);
+ MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_TAKE_READ_LOCK_FAIL, lid);
+ mcf_utfwk_printf("Fail to take read lock!! LID(%d)!! \r\n", lid);
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ }
+
+ // calculate total duration when boot up
+ if (kal_query_systemInit() == KAL_TRUE){
+ com_Mcf.ota_api_duration += CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME());
+ }
+ MD_TRC_MCF_TR_READ_OTA_BUFFER_DURATION(lid, record_idx, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+
+ return ret;
+}
+
+mcf_ota_result_e mcf_read_tlvota_buffer(
+ kal_uint8 ps_id,
+ mcf_tlvota_tag_t tag,
+ nvram_lid_enum lid,
+ kal_uint8 *buffer,
+ kal_uint32 size)
+{
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_tool_file_info_t *pFile;
+ mcf_tool_gid_tlvota_file_item_t *pItem;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+ mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
+ nvram_ltable_entry_struct lid_info = {0};
+ nvram_errno_enum nvram_api_ret;
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+ kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+ kal_uint16 item_byte_offset;
+ kal_uint16 item_bit_offset;
+ kal_uint32 item_size;
+ kal_bool item_is_bit = KAL_FALSE;
+ kal_uint16 item_lid;
+ kal_uint16 item_cnt = 0;
+
+ if (!buffer || (size < 0) || !tag.tag) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_PARA(ps_id, lid, buffer, size, tag.tag);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_START_USIR(ps_id, sim_id, lid, buffer, size, tag.tag);
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_FILE(str_tmp);
+ ret = MCF_OTA_R_INVALID_FILE;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+ if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if (size != lid_info.size) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_SIZE(size, lid, lid_info.size);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+
+ if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_ATTR_NOT_SET(lid, lid_info.attr);
+ ret = MCF_OTA_R_INVALID_ATTR;
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ return ret;
+ }
+ /*MCF 1.0 read tlvota buffer update flow */
+ if (pFile->file_version == 2){
+ mcf_v1_read_tlvota_buffer(tlvota_file, tag, lid, buffer);
+ }
+ else if (pFile->file_version == 3){
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+ /* Read changed items from TLV-OTA file */
+ while (item_cnt < pFile->item_num) {
+ /* Check if array_index_len is valid */
+ if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+ goto next;
+ }
+ strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
+ array_tag[pItem->array_index_len] = '\0';
+
+ /* Find GID corresponding LID */
+ item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+ if (item_lid == 65535){
+ //-1(65535) means not found
+ goto next;
+ }
+
+ /* Check if LID and tag match */
+ if ( (item_lid != lid) || (pItem->tag_type != tag.tag_type) || (strncmp(&(pItem->buff_start), tag.tag, pItem->tag_len) != 0) ) {
+ goto next;
+ }
+
+
+ if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+ goto next;
+ }
+
+ /* Update LID item */
+ if (item_is_bit == 0) {
+ if (pItem->value_len > item_size) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_LARGE_VAL_LEN(pItem->value_len, item_size);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BYTE_UPDATE_USIR(lid, tag.tag, item_byte_offset, pItem->value_len);
+ mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+ kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+ } else {
+ kal_uint32 bit_value = 0;
+ kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+ kal_uint32 offset = 0;
+ kal_uint32 var_size = 1;
+ kal_uint32 val_tmp = 0;
+
+ kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+ if (pItem->value_len > 4) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BIT_UPDATE_USIR(lid, tag.tag, item_byte_offset, item_bit_offset, item_size, bit_value);
+
+ if (item_size > 8 && item_size <= 16) {
+ var_size = 2;
+ }else if (item_size > 16 && item_size <= 24) {
+ var_size = 3;
+ }else if (item_size > 24 && item_size <= 32) {
+ var_size = 4;
+ }
+
+ if (item_bit_offset > 0 && item_bit_offset < 8) {
+ offset = 0;
+ }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ offset = 1;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ offset = 2;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ offset = 3;
+ }else if (item_bit_offset >= 32){
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset > 0) {
+ if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+ var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+ }
+ }
+ if(var_size > 4){
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+
+ goto next;
+ }
+
+ if (item_bit_offset >= 8 && item_bit_offset < 16) {
+ item_bit_offset -= 8;
+ }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+ item_bit_offset -= 16;
+ }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+ item_bit_offset -= 24;
+ }
+
+
+ kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
+ val_tmp &= ~(bit_mask << item_bit_offset);
+ val_tmp |= (bit_value << item_bit_offset);
+
+ kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
+ }
+
+ next:
+ pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+ item_cnt++;
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ } else {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_TAKE_READ_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ }
+
+ return ret;
+}
+
+mcf_ota_result_e mcf_read_tlvota_buffer_sbp_tag(
+ kal_uint8 ps_id,
+ mcf_tlvota_sbp_tag_t sbp_tag,
+ nvram_lid_enum lid,
+ kal_uint8 *buffer,
+ kal_uint32 size)
+{
+ mcf_ota_result_e tlvota_ret = MCF_OTA_R_MAX;
+ mcf_ota_result_e ret = MCF_OTA_R_MAX;
+ mcf_tlvota_tag_t tag_entry[6];
+ kal_uint32 tag_num = 0;
+ kal_char tag[6][MCF_MAX_TAG_LEN];
+ mcf_t *pMcf = mcf_get_instance();
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+ mcf_tlvota_file_t *tlvota_file = &(pMcf->tlvota_file[sim_id]);
+ mcf_tlvota_tag_t iccid_tag;
+ kal_char iccid[21];
+ kal_int32 ret_snprintf;
+ kal_uint32 start_time = GET_CURRENT_TIME();
+
+ kal_mem_set(tag, 0, sizeof(kal_char) * 6 * MCF_MAX_TAG_LEN);
+
+ if (!(buffer && (size > 0))) {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_PARA(ps_id, lid, buffer, size);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+ mcf_utfwk_printf("Invalid parameters!! ps_id(%d), LID(%d), buffer(%x), size(%d) \r\n", ps_id, lid, buffer, size);
+
+ return ret;
+ }
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_START(ps_id, lid, buffer, size, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+
+ /* Fill tag entry */
+ if (sbp_tag.sbp_id != SBP_ID_INVALID) {
+ if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
+ if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // sbpid_mcc_mnc case
+ /* NA_NA_NA, NA_mcc_NA and NA_mcc_mnc case should be updated first */
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* NA_mcc_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* NA_mcc_mnc */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+ /* Reuse tag_entry */
+ tag_num = 0;
+
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* sbpid_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* sbpid_mcc_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* sbpid_mcc_mnc */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_%s", sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+ } else { // sbpid_mcc_NA case
+ /* NA_NA_NA and NA_mcc_NA case should be updated first */
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* NA_mcc_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+ /* Reuse tag_entry */
+ tag_num = 0;
+
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* sbpid_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* sbpid_mcc_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+ }
+ } else {
+ if (strcmp((kal_char *)sbp_tag.mnc, "") == 0) { // sbpid_NA_NA case
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+ /* Reuse tag_entry */
+ tag_num = 0;
+
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* sbpid_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+ } else { // sbpid_NA_mnc case is not allowed!!
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ ret = MCF_OTA_R_INVALID_SBP_TAG;
+
+ return ret;
+ }
+ }
+ } else {
+ if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
+ if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // NA_mcc_mnc case
+ /* NA_NA_NA, NA_mcc_NA and NA_mcc_mnc case should be updated first */
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* NA_mcc_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ /* NA_mcc_mnc */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+ /* Reuse tag_entry */
+ tag_num = 0;
+
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+ } else { // NA_mcc_NA case
+ /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
+ /* NA_mcc_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+
+ /* NA_mcc_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+
+ tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+ /* Reuse tag_entry */
+ tag_num = 0;
+
+ /* NA_NA_NA */
+ tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+ ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+ if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+ strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ }
+ tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+ tag_entry[tag_num].tag = tag[tag_num];
+ tag_num++;
+ }
+ } else { // NA_NA_mnc cases is not allowed!!
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ mcf_utfwk_printf("Invalid SBP tag!! sbp_id(%d), mcc(%s), mnc(%d) \r\n", sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ ret = MCF_OTA_R_INVALID_SBP_TAG;
+
+ return ret;
+ }
+ }
+
+ ret = mcf_read_tlvota_buffer_sbp_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+ /*If general TLV-OTA is iccid tag, need to call read_tlv_ota_buffer to update OTA file with iccid tag*/
+
+ if (com_Mcf.is_iccid == KAL_TRUE){
+ kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
+ iccid_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ kal_mem_cpy(&iccid, tlvota_file->iccid, 21);
+ iccid_tag.tag = iccid;
+ iccid_tag.tag_len = strlen((kal_char *)tlvota_file->iccid);
+
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else {
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_TAKE_READ_LOCK_FAIL();
+ ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+ return ret;
+ }
+ ret = mcf_read_tlvota_buffer(ps_id, iccid_tag, lid, buffer, size);
+ }
+
+ if ( (tlvota_ret == MCF_OTA_R_SUCCESS) || (ret == MCF_OTA_R_SUCCESS) ) {
+ ret = MCF_OTA_R_SUCCESS;
+ }
+
+ MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_DURATION(lid, ps_id, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+
+ return ret;
+}
+
+mcf_ota_result_e mcf_read_nvram_and_tlvota_buffer_sbp_tag(
+ kal_uint8 ps_id,
+ mcf_tlvota_sbp_tag_t sbp_tag,
+ nvram_lid_enum lid,
+ kal_uint16 record_idx,
+ kal_uint8 *buffer,
+ kal_uint32 size)
+{
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ if (!(buffer && (size > 0))) {
+ MD_TRC_MCF_TR_READ_NVRAM_TLVOTA_BUFFER_SBP_INVALID_PARA(ps_id, lid, buffer, size);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ MD_TRC_MCF_TR_READ_NVRAM_TLVOTA_BUFFER_SBP_START(ps_id, lid, record_idx, buffer, size, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+
+ if ( !nvram_external_read_data(lid, record_idx, buffer, size)) {
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+ return ret;
+ }
+
+ ret = mcf_read_tlvota_buffer_sbp_tag(ps_id, sbp_tag, lid, buffer, size);
+
+ return ret;
+}
+
+kal_bool mcf_custom_dump_mcf_data(mcf_custom_dump_param_struct *param_ptr)
+{
+ kal_bool ret = KAL_TRUE;
+ sim_interface_enum sim_slot_id = 0;
+
+ switch (param_ptr->lid)
+ {
+ case NVRAM_EF_MCF_TEST_OTA_LID:
+ {
+ mcf_tlvota_sbp_tag_t sbp_tag = {0};
+ mcf_ota_result_e mcf_ret;
+
+ if (param_ptr->type == MCF_TYPE_OTA_BY_OP) {
+ *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
+ sbp_tag.sbp_id = param_ptr->sbp_id;
+ kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
+ kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
+
+ /* Record_id = sim_id + 1 */
+ sim_slot_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
+
+ if (!nvram_external_read_data(param_ptr->lid, sim_slot_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
+ MD_TRC_MCF_TR_DUMP_MCF_LID_READ_NVRAM_FAIL(param_ptr->lid, sim_slot_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ ret = KAL_FALSE;
+ return ret;
+ }
+
+ mcf_ret = mcf_read_tlvota_buffer_sbp_tag(param_ptr->ps_id, sbp_tag, param_ptr->lid, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_DUMP_MCF_LID_FAIL(param_ptr->lid, mcf_ret);
+ }
+ } else {
+ MD_TRC_MCF_TR_DUMP_MCF_LID_INVALID_TYPE(param_ptr->lid, param_ptr->type);
+ ret = KAL_FALSE;
+ }
+ break;
+ }
+
+ case NVRAM_EF_MCF_TEST_OTA_QUERY_LID:
+ {
+ mcf_tlvota_sbp_tag_t sbp_tag = {0};
+ mcf_ota_result_e mcf_ret;
+
+ switch (param_ptr->type)
+ {
+ case MCF_TYPE_OTA:
+ *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
+ if (!nvram_external_read_data(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
+ MD_TRC_MCF_TR_DUMP_MCF_LID_READ_NVRAM_FAIL(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ ret = KAL_FALSE;
+ return ret;
+ }
+
+ mcf_ret = mcf_read_ota_buffer(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_DUMP_MCF_LID_QUERY_MCF_FAIL(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ }
+
+ break;
+
+ case MCF_TYPE_OTA_BY_OP:
+ *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
+ sbp_tag.sbp_id = param_ptr->sbp_id;
+ kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
+ kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
+
+ if (!nvram_external_read_data(param_ptr->lid, param_ptr->ps_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
+ MD_TRC_MCF_TR_DUMP_MCF_LID_READ_NVRAM_FAIL(param_ptr->lid, param_ptr->ps_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ ret = KAL_FALSE;
+ return ret;
+ }
+ /* Record_id = sim_id + 1 */
+ sim_slot_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
+ mcf_ret = mcf_read_ota_buffer(param_ptr->lid, sim_slot_id+1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_DUMP_MCF_LID_QUERY_MCF_FAIL(param_ptr->lid, sim_slot_id+1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ }
+
+ mcf_ret = mcf_read_tlvota_buffer_sbp_tag(param_ptr->ps_id, sbp_tag, param_ptr->lid, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+ if (mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_DUMP_MCF_LID_FAIL(param_ptr->lid, mcf_ret);
+ }
+
+ break;
+
+ default:
+ MD_TRC_MCF_TR_DUMP_MCF_LID_INVALID_TYPE(param_ptr->lid, param_ptr->type);
+ ret = KAL_FALSE;
+ break;
+ }
+ break;
+ }
+
+ default:
+ MD_TRC_MCF_TR_DUMP_MCF_LID_UNKNOWN_LID(param_ptr->lid);
+ ret = KAL_FALSE;
+ break;
+ }
+
+ return ret;
+}
+
+kal_bool mcf_auto_select_tlvota_file(sbp_reconfig_custom_param_struct *param_ptr)
+{
+ mcf_t *pMcf = &mcf_inst_g;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
+ mcf_tlvota_file_t *tlvota_file;
+ kal_char file_name[MCF_FILE_MAX_NAME_LEN];
+ kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
+ kal_wchar fs_filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+ kal_char file_path[MCF_FILE_MAX_MD_PATH_LEN];
+ l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+ em_mcf_read_ota_file_info_struct read_file_info = {0};
+ FS_FileDetail fs_file_detail[L4C_MCF_PATH_TYPE_MAX] = {0};
+ mcf_ota_result_e mcf_ret;
+ mcf_ota_result_e gen_mcf_ret;
+ kal_bool ret = KAL_TRUE;
+ kal_bool gen_ret = KAL_TRUE;
+ kal_int32 fs_api_ret[L4C_MCF_PATH_TYPE_MAX];
+ kal_uint32 i;
+ kal_uint32 ret_sprintf;
+ mcf_tool_file_info_t *pFile;
+ mcf_tlvota_sbp_tag_t sbp_tag;
+ kal_bool is_read_nvram = KAL_FALSE;
+ kal_char tool_version[MCF_FILE_MAX_TOOL_VERSION_LEN]={0};
+ mcf_ota_result_e tlvota_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+ kal_uint64 last_mod_time = 0;
+ kal_uint32 start_time = GET_CURRENT_TIME();
+
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_START(param_ptr->ps_id, sim_id, param_ptr->sbp_id, param_ptr->mcc, param_ptr->mnc);
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_INVALID_SIM_ID(param_ptr->ps_id, sim_id);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ ret = KAL_FALSE;
+
+ return ret;
+ }
+
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ sbp_tag.sbp_id = param_ptr->sbp_id;
+ kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
+ kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
+
+ kal_mem_set(&mcf_tlvota_last_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
+ kal_mem_set(&mcf_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
+ kal_mem_set(&mcf_general_tlvota_last_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
+ kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
+
+
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+ /* Read MCF General TLV-OTA info into cache buffer */
+ if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = KAL_FALSE;
+ }
+ is_read_nvram = KAL_TRUE;
+
+ if(is_read_tlvota[sim_id] == KAL_TRUE){
+ kal_mem_cpy(&mcf_tlvota_last_mod_lid_g[sim_id], &nv_int_info.tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE) != MCF_OTA_R_SUCCESS){
+ ret = KAL_FALSE;
+ }
+#else
+ if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE, nv_int_info.not_reset_tlvota[sim_id], KAL_FALSE) != MCF_OTA_R_SUCCESS){
+ ret = KAL_FALSE;
+ }
+#endif
+ is_update_tlvota[sim_id] = KAL_TRUE;
+ }
+ }
+
+ if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
+ /* Read MCF General TLV-OTA info into cache buffer */
+ if(is_read_nvram == KAL_FALSE){
+ if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = KAL_FALSE;
+ }
+ is_read_nvram = KAL_TRUE;
+ }
+
+ if(is_read_general_tlvota[sim_id] == KAL_TRUE){
+ kal_mem_cpy(&mcf_general_tlvota_last_mod_lid_g[sim_id], &nv_int_info.general_tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE) != MCF_OTA_R_SUCCESS){
+ ret = KAL_FALSE;
+ }
+#else
+ if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE, nv_int_info.not_reset_general_tlvota, KAL_FALSE) != MCF_OTA_R_SUCCESS){
+ ret = KAL_FALSE;
+ }
+#endif
+ is_update_tlvota[sim_id] = KAL_TRUE;
+ }
+ }
+
+
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ tlvota_file->sbp_id = param_ptr->sbp_id;
+ tlvota_file->ps_id = param_ptr->ps_id;
+ kal_mem_cpy(tlvota_file->mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
+ kal_mem_cpy(tlvota_file->mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
+ kal_mem_cpy(tlvota_file->iccid, param_ptr->iccid, 21);
+
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+ // Check if need to auto select TLV-OTA file
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_NO_NEED(pMcf->is_ignore_dsbp[sim_id]);
+ com_Mcf.tlvota_result[sim_id] = set_op_read_ret[sim_id];
+ goto read_gengeral_opota;
+ }
+ }else {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_TLVOTA_FILE_TAKE_WRITE_LOCK_FAIL();
+ ret = KAL_FALSE;
+
+ // Check if need to auto select TLV-OTA file
+ if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_NO_NEED(pMcf->is_ignore_dsbp[sim_id]);
+ com_Mcf.tlvota_result[sim_id] = set_op_read_ret[sim_id];
+ goto read_gengeral_opota;
+ }
+
+ goto read_gengeral_opota;
+ }
+
+ ret_sprintf = kal_snprintf(file_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, tlvota_file->sbp_id, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_TLVOTA_FILE_FILENAME_ERROR(tlvota_file->sbp_id, ret_sprintf);
+ ret = KAL_FALSE;
+ return ret;
+ }
+
+ /* Compare modified time of OP-OTA file to select which file to be applied */
+ kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, file_name);
+ fs_api_ret[L4C_MCF_PATH_TYPE_OTA] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_OTA]);
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_MODIFIED_TIME(tlvota_file->sbp_id, L4C_MCF_PATH_TYPE_OTA, fs_api_ret[L4C_MCF_PATH_TYPE_OTA],
+ (kal_uint32)((fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime >> 32) & 0xFFFFFFFF), (kal_uint32)(fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime & 0xFFFFFFFF));
+ if (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] != FS_NO_ERROR) {
+ kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_OTA], 0, sizeof(FS_FileDetail));
+ }
+
+ kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, file_name);
+ fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME]);
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_MODIFIED_TIME(tlvota_file->sbp_id, L4C_MCF_PATH_TYPE_RUNTIME, fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME],
+ (kal_uint32)((fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime >> 32) & 0xFFFFFFFF), (kal_uint32)(fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime & 0xFFFFFFFF));
+ if (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] != FS_NO_ERROR) {
+ kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME], 0, sizeof(FS_FileDetail));
+ }
+
+ if ( (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] == FS_NO_ERROR) || (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] == FS_NO_ERROR) ) {
+ if (fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime > fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
+ ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_DEFAULT_FOLDER_PATH, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
+ file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
+ }
+ last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime;
+ } else {
+ ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_CUSTOM_FOLDER_PATH, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
+ file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
+ }
+ last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime;
+ }
+ } else {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_COMPARE_FAIL();
+ ret = KAL_FALSE;
+ tlvota_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+ goto read_gengeral_opota;
+ }
+
+ read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_SIM;
+ read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+ read_file_info.ps_id = tlvota_file->ps_id;
+ read_file_info.start_time = kal_get_systicks();
+
+ // last updated file information
+ mcf_make_file_info(&old_file_info, tlvota_file->last_file.path_type, tlvota_file->last_file.name, tlvota_file->last_file.sw_version, tlvota_file->last_file.sw_version_len, tlvota_file->last_file.gen_time, tlvota_file->last_file.gen_time_len, tlvota_file->last_file.last_mod_time, tlvota_file->last_file.checksum);
+
+ mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, file_path, file_name, &apply_path_type, apply_filename, pMcf);
+ tlvota_ret = mcf_ret;
+
+
+ if (mcf_ret == MCF_OTA_R_SUCCESS) {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ // current updated file information
+ mcf_make_file_info(&new_file_info, apply_path_type, apply_filename, &(pFile->buff_start), pFile->sw_version_len, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len, last_mod_time, pFile->checksum);
+ /* Check TLV-OTA is need update */
+ if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
+ // Need to update TLV-OTA file
+ com_Mcf.update_tlvota[sim_id] = KAL_TRUE;
+
+ /* Do not reset LIDs if the same file as last one */
+ is_read_tlvota[sim_id] = KAL_TRUE;
+
+ /* Store last updated file informantion */
+ /* Store TLV-OTA file information */
+ tlvota_file->last_file.path_type = apply_path_type;
+ strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+ tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+ tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_SW_VERSION(tlvota_file->last_file.sw_version);
+ } else {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_SW_VERSION(pFile->sw_version_len);
+ }
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+ tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+ tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_GEN_TIME(tlvota_file->last_file.gen_time);
+ } else {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_GEN_TIME(pFile->gen_time_len);
+ }
+ if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
+ strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
+ tool_version[pFile->tool_version_len] = '\0';
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_TOOL_VERSION(tool_version);
+ } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_TOOL_VERSION(pFile->tool_version_len);
+ }
+
+ tlvota_file->last_file.checksum = pFile->checksum;
+ tlvota_file->last_file.last_mod_time = last_mod_time;
+ tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
+ tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
+ }else{
+ if (com_Mcf.update_tlvota[sim_id] != KAL_TRUE){
+ tlvota_ret = mcf_ret;
+
+ //TLV-OTA file does not change. No need to trigger dsbp.
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_TLVOTA_FILE_NOT_CHANGE(apply_path_type, com_Mcf.update_tlvota[sim_id]);
+ }
+ }
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_FILE(str_tmp);
+ tlvota_ret = MCF_OTA_R_INVALID_FILE;
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ read_file_info.path_type = apply_path_type;
+ strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ } else {
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ /* Store last updated file informantion */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ mcf_make_file_info(&new_file_info, apply_path_type, apply_filename, &(pFile->buff_start), pFile->sw_version_len, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len, last_mod_time, pFile->checksum);
+ /* Check TLV-OTA is need update */
+ if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
+ com_Mcf.update_tlvota[sim_id] = KAL_TRUE;
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_FAIL(mcf_ret);
+ ret = KAL_FALSE;
+ }
+
+ read_file_info.result = mcf_ret;
+ read_file_info.end_time = kal_get_systicks();
+
+ mcf_em_send_ota_file_info(&read_file_info);
+
+ com_Mcf.tlvota_result[sim_id] = tlvota_ret;
+
+read_gengeral_opota:
+ // TODO: general OP-OTA file CHR implementation
+
+ // Check if need to auto select TLV-OTA file
+ if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_GENERAL_TLVOTA_FILE_NO_NEED(pMcf->general_is_ignore_dsbp);
+ return ret;
+ }
+ tlvota_file = &(pMcf->general_tlvota_file);
+ ret_sprintf = kal_snprintf(file_name, MCF_FILE_MAX_NAME_LEN - 1, "%s%c", MCF_FS_GENERAL_TLVOTA_FILE_NAME, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+ strncpy(file_name, MCF_FS_GENERAL_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN-1);
+ file_name[MCF_FILE_MAX_NAME_LEN-1] = '\0';
+ }
+
+ /* Compare modified time of general OP-OTA file to select which file to be applied */
+ kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, file_name);
+ fs_api_ret[L4C_MCF_PATH_TYPE_OTA] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_OTA]);
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_MODIFIED_TIME(L4C_MCF_PATH_TYPE_OTA, fs_api_ret[L4C_MCF_PATH_TYPE_OTA],
+ (kal_uint32)((fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime >> 32) & 0xFFFFFFFF), (kal_uint32)(fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime & 0xFFFFFFFF));
+ if (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] != FS_NO_ERROR) {
+ kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_OTA], 0, sizeof(FS_FileDetail));
+ }
+
+ kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, file_name);
+ fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME]);
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_MODIFIED_TIME(L4C_MCF_PATH_TYPE_RUNTIME, fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME],
+ (kal_uint32)((fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime >> 32) & 0xFFFFFFFF), (kal_uint32)(fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime & 0xFFFFFFFF));
+ if (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] != FS_NO_ERROR) {
+ kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME], 0, sizeof(FS_FileDetail));
+ }
+
+ if ( (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] == FS_NO_ERROR) || (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] == FS_NO_ERROR) ) {
+ if (fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime > fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
+ if (tlvota_file->last_mod_time == fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime) {
+ // General TLV-OTA file does not change. No need to read again.
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(L4C_MCF_PATH_TYPE_OTA);
+ goto out;
+ } else {
+ ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_DEFAULT_FOLDER_PATH, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
+ file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
+ }
+ last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime;
+ }
+ } else {
+ if (tlvota_file->last_mod_time == fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
+ // General TLV-OTA file does not change. No need to read again.
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(L4C_MCF_PATH_TYPE_RUNTIME);
+ goto out;
+ } else {
+ ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_CUSTOM_FOLDER_PATH, '\0');
+ if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+ strncpy(file_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
+ file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
+ }
+ last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime;
+ }
+ }
+ } else {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_COMPARE_FAIL();
+ gen_ret = KAL_FALSE;
+
+ goto out;
+ }
+
+ mcf_make_file_info(&old_file_info, tlvota_file->last_file.path_type, tlvota_file->last_file.name, tlvota_file->last_file.sw_version, tlvota_file->last_file.sw_version_len, tlvota_file->last_file.gen_time, tlvota_file->last_file.gen_time_len, tlvota_file->last_file.last_mod_time, tlvota_file->last_file.checksum);
+ gen_mcf_ret = mcf_read_general_tlvota_file(KAL_FALSE, file_path, file_name, &apply_path_type, apply_filename, pMcf);
+
+ if (gen_mcf_ret != MCF_OTA_R_SUCCESS) {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_FAIL(gen_mcf_ret);
+ gen_ret = KAL_FALSE;
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ /* Store last updated file informantion */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ mcf_make_file_info(&new_file_info, apply_path_type, apply_filename, &(pFile->buff_start), pFile->sw_version_len, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len, last_mod_time, pFile->checksum);
+ if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
+ //If General TLV-OTA update, every SIM need to update
+ for (i = 0; i < MAX_SIM_NUM; i++){
+ is_read_general_tlvota[i] = KAL_TRUE;
+ com_Mcf.update_general_tlvota[i] = KAL_TRUE;
+ }
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+ }else{
+ pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+ /* Store last updated file informantion */
+ MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file){
+ mcf_make_file_info(&new_file_info, apply_path_type, apply_filename, &(pFile->buff_start), pFile->sw_version_len, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len, last_mod_time, pFile->checksum);
+
+ /* Check TLV-OTA is need update */
+ if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
+ //If General TLV-OTA update, every SIM need to update
+ for (i = 0; i < MAX_SIM_NUM; i++){
+ is_read_general_tlvota[i] = KAL_TRUE;
+ com_Mcf.update_general_tlvota[i] = KAL_TRUE;
+ }
+ //Store file information
+ tlvota_file->last_file.path_type = apply_path_type;
+ strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+ if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+ strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+ tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_SW_VERSION(tlvota_file->last_file.sw_version);
+ } else {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_SW_VERSION(pFile->sw_version_len);
+ }
+ if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+ strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+ tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_GEN_TIME(tlvota_file->last_file.gen_time);
+ } else {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_GEN_TIME(pFile->gen_time_len);
+ }
+ if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
+ strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
+ tool_version[pFile->tool_version_len] = '\0';
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_TOOL_VERSION(tool_version);
+ } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_TOOL_VERSION(pFile->tool_version_len);
+ }
+ tlvota_file->last_file.checksum = pFile->checksum;
+ tlvota_file->last_file.last_mod_time = last_mod_time;
+ tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
+ tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
+ }else{
+ //General TLV-OTA file does not change. No need to read again.
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(apply_path_type);
+ }
+ /* Check if file type is TLV-OTA file */
+ if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+ kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+ mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_FILE(str_tmp);
+ gen_mcf_ret = MCF_OTA_R_INVALID_FILE;
+ }
+ MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }
+
+ }
+
+out:
+ if ( (ret == KAL_TRUE) || (gen_ret == KAL_TRUE) ) {
+ ret = KAL_TRUE;
+ } else {
+ ret = KAL_FALSE;
+ }
+
+
+ /* If have updated, store modified LIDs */
+ if (com_Mcf.update_tlvota[sim_id] == KAL_TRUE){
+ nv_int_info.update_tlvota_result[sim_id] = KAL_FALSE;
+ if(is_read_nvram == KAL_FALSE){
+ /* Read MCF TLV-OTA file info into cache buffer */
+ if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = KAL_FALSE;
+ }
+ is_read_nvram = KAL_TRUE;
+ }
+
+ kal_mem_cpy(&mcf_tlvota_last_mod_lid_g[sim_id], &nv_int_info.tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE) != MCF_OTA_R_SUCCESS){
+ ret = KAL_FALSE;
+ }
+#else
+ if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE, nv_int_info.not_reset_tlvota[sim_id], KAL_FALSE) != MCF_OTA_R_SUCCESS){
+ ret = KAL_FALSE;
+ }
+#endif
+ is_update_tlvota[sim_id] = KAL_TRUE;
+ }
+ if (is_read_general_tlvota[sim_id] == KAL_TRUE){
+ nv_int_info.update_general_tlvota_result = KAL_FALSE;
+ if(is_read_nvram == KAL_FALSE){
+ /* Read MCF TLV-OTA file info into cache buffer */
+ if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = KAL_FALSE;
+ }
+ is_read_nvram = KAL_TRUE;
+ }
+ kal_mem_cpy(&mcf_general_tlvota_last_mod_lid_g[sim_id], &nv_int_info.general_tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE) != MCF_OTA_R_SUCCESS){
+ ret = KAL_FALSE;
+ }
+#else
+ if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE, nv_int_info.not_reset_general_tlvota, KAL_FALSE) != MCF_OTA_R_SUCCESS){
+ ret = KAL_FALSE;
+ }
+#endif
+
+ is_update_tlvota[sim_id] = KAL_TRUE;
+ }
+ MD_TRC_MCF_TR_AUTO_SELECT_BIN_DURATION(CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+
+ return ret;
+}
+
+kal_bool mcf_set_config_after_dsbp(protocol_id_enum ps_id)
+{
+ kal_bool ret = KAL_TRUE;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+ nvram_ef_mcf_sw_info_struct nv_sw_info;
+ mcf_t *pMcf = mcf_get_instance();
+ mcf_tlvota_file_t *tlvota_file;
+ kal_uint32 start_time = GET_CURRENT_TIME();
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_INVALID_SIM_ID(ps_id, sim_id);
+
+ return KAL_FALSE;
+ }
+
+ tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_START(ps_id, is_update_tlvota[sim_id]);
+
+
+
+ // When SIM have updated, need to reset to FALSE
+ if(com_Mcf.update_tlvota[sim_id] == KAL_TRUE){
+ com_Mcf.update_tlvota[sim_id] = KAL_FALSE;
+ }
+
+ if (com_Mcf.update_general_tlvota[sim_id] == KAL_TRUE){
+ com_Mcf.update_general_tlvota[sim_id] = KAL_FALSE;
+ }
+
+ if (is_update_tlvota[sim_id] == KAL_TRUE){
+ kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+ /* Read MCF internal info into cache buffer */
+ if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = KAL_FALSE;
+ return ret;
+ }
+ /* Read MCF sw info into cache buffer */
+ if ( !nvram_external_read_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_READ_LID_FAIL(NVRAM_EF_MCF_SW_INFO_LID);
+ ret = KAL_FALSE;
+ return ret;
+ }
+
+ if(is_read_tlvota[sim_id] == KAL_TRUE){
+ kal_mem_cpy(&nv_int_info.tlvota_last_mod_lid[sim_id], &mcf_tlvota_curr_mod_lid_g[sim_id], sizeof(nvram_mcf_lid_info_struct));
+ is_read_tlvota[sim_id] = KAL_FALSE;
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ /* Write updated MCF TLV-OTA file information to NVRAM */
+ strncpy(nv_sw_info.last_update_tlvota_file[sim_id].sw_version, tlvota_file->last_file.sw_version, MCF_FILE_MAX_SW_VERSION_LEN - 1);
+ strncpy(nv_sw_info.last_update_tlvota_file[sim_id].gen_time, tlvota_file->last_file.gen_time, MCF_FILE_MAX_GEN_TIME_LEN - 1);
+ strncpy(nv_sw_info.last_update_tlvota_file[sim_id].name, tlvota_file->last_file.name, MCF_FILE_MAX_NAME_LEN - 1);
+ if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA){
+ strncpy(nv_sw_info.last_update_tlvota_file[sim_id].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }else if(tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME){
+ strncpy(nv_sw_info.last_update_tlvota_file[sim_id].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_TAKE_READ_LOCK_FAIL();
+ }
+ }
+
+ if (is_read_general_tlvota[sim_id] == KAL_TRUE){
+ kal_mem_cpy(&nv_int_info.general_tlvota_last_mod_lid[sim_id], &mcf_general_tlvota_curr_mod_lid_g[sim_id], sizeof(nvram_mcf_lid_info_struct));
+ is_read_general_tlvota[sim_id] = KAL_FALSE;
+ tlvota_file = &(pMcf->general_tlvota_file);
+ MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ if (tlvota_file) {
+ /* Write updated MCF TLV-OTA file information to NVRAM */
+ strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, MCF_FILE_MAX_SW_VERSION_LEN - 1);
+ strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, MCF_FILE_MAX_GEN_TIME_LEN - 1);
+ strncpy(nv_sw_info.last_update_general_tlvota_file.name, tlvota_file->last_file.name, MCF_FILE_MAX_NAME_LEN - 1);
+ if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA){
+ strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }else if(tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME){
+ strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+ }
+ MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+ }else{
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_TAKE_READ_LOCK_FAIL();
+ }
+ }
+
+ /* Write MCF internal info into NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_WRITE_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+ ret = KAL_FALSE;
+ return ret;
+ }
+ /* Write MCF sw info into NVRAM */
+ if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_WRITE_LID_FAIL(NVRAM_EF_MCF_SW_INFO_LID);
+ ret = KAL_FALSE;
+ return ret;
+ }
+
+ is_update_tlvota[sim_id] = KAL_FALSE;
+
+ }
+
+ MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_DURATION(CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+
+ return ret;
+}
+
+kal_bool mcf_check_lid_need_reset(nvram_lid_enum lid)
+{
+ kal_int16 pos1 = -1;
+ kal_int16 pos2 = -1;
+ kal_uint16 new_pos = 0;
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ kal_bool reset = KAL_FALSE;
+#endif
+ MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_START(lid);
+
+ /* Search last modified LID list */
+ if (mcf_last_mod_lid_g.lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+ /* If last modified LID list is full, all LIDs are needed to be reset */
+ return KAL_TRUE;
+ }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ pos1 = mcf_binary_search_lid(lid, mcf_last_mod_lid_g.lid, mcf_last_mod_lid_g.lid_cnt, &new_pos);
+#else
+ pos1 = mcf_binary_search_lid_struct(lid, mcf_last_mod_lid_g.lid_conf, mcf_last_mod_lid_g.lid_cnt, &new_pos);
+ if(pos1 != -1 && pos1 >= 0){
+ if(nv_int_info.not_reset_ota == KAL_FALSE || mcf_last_mod_lid_g.lid_conf[pos1].not_reset == KAL_FALSE){
+ reset = KAL_TRUE;
+ }
+ }
+#endif
+
+ /* Search current modified LID list */
+ if (mcf_curr_mod_lid_g.lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+ /* If current modified LID list is full, all LIDs are needed to be reset */
+ return KAL_TRUE;
+ }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ pos2 = mcf_binary_search_lid(lid, mcf_curr_mod_lid_g.lid, mcf_curr_mod_lid_g.lid_cnt, &new_pos);
+#else
+ pos2 = mcf_binary_search_lid_struct(lid, mcf_curr_mod_lid_g.lid_conf, mcf_curr_mod_lid_g.lid_cnt, &new_pos);
+ if(pos2 != -1 && pos2 >= 0){
+ if(nv_int_info.not_reset_ota == KAL_FALSE || mcf_curr_mod_lid_g.lid_conf[pos2].not_reset == KAL_FALSE){
+ reset = KAL_TRUE;
+ }
+ }
+#endif
+
+ if ( (pos1 != -1) || (pos2 != -1) ) {
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ if (reset == KAL_TRUE)
+#endif
+ {
+ MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_FOUND(pos1, pos2);
+ return KAL_TRUE;
+ }
+ }
+
+ MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_NOT_FOUND(lid, pos1, pos2);
+
+ return KAL_FALSE;
+}
+
+kal_bool mcf_check_lid_need_reset_by_psid(nvram_lid_enum lid, kal_uint8 ps_id)
+{
+ kal_int16 pos1 = -1;
+ kal_int16 pos2 = -1;
+ kal_uint16 new_pos = 0;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ kal_bool reset = KAL_FALSE;
+#endif
+
+ MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_START(lid, ps_id);
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_INVALID_SIM_ID(ps_id, sim_id);
+
+ return KAL_FALSE;
+ }
+
+ /* Search tlvota last modified LID list */
+ if (mcf_tlvota_last_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+ /* If last modified LID list is full, all LIDs are needed to be reset */
+ return KAL_TRUE;
+ }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ pos1 = mcf_binary_search_lid(lid, mcf_tlvota_last_mod_lid_g[sim_id].lid, mcf_tlvota_last_mod_lid_g[sim_id].lid_cnt, &new_pos);
+#else
+ pos1 = mcf_binary_search_lid_struct(lid, mcf_tlvota_last_mod_lid_g[sim_id].lid_conf, mcf_tlvota_last_mod_lid_g[sim_id].lid_cnt, &new_pos);
+ if(pos1 != -1 && pos1 >= 0){
+ if(nv_int_info.not_reset_tlvota[sim_id] == KAL_FALSE || mcf_tlvota_last_mod_lid_g[sim_id].lid_conf[pos1].not_reset == KAL_FALSE){
+ reset = KAL_TRUE;
+ }
+ }
+#endif
+
+ /* Search tlvota current modified LID list */
+ if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+ /* If current modified LID list is full, all LIDs are needed to be reset */
+ return KAL_TRUE;
+ }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ pos2 = mcf_binary_search_lid(lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &new_pos);
+#else
+ pos2 = mcf_binary_search_lid_struct(lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &new_pos);
+ if(pos2 != -1 && pos2 >= 0){
+ if(nv_int_info.not_reset_tlvota[sim_id] == KAL_FALSE || mcf_tlvota_curr_mod_lid_g[sim_id].lid_conf[pos2].not_reset == KAL_FALSE){
+ reset = KAL_TRUE;
+ }
+ }
+#endif
+
+ if ( (pos1 != -1) || (pos2 != -1) ) {
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ if (reset == KAL_TRUE)
+#endif
+ {
+ MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_TLVOTA_FOUND(lid);
+ return KAL_TRUE;
+ }
+ }
+
+ pos1 = -1;
+ pos2 = -1;
+
+ /* Search general tlvota last modified LID list */
+ if (mcf_general_tlvota_last_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+ /* If last modified LID list is full, all LIDs are needed to be reset */
+ return KAL_TRUE;
+ }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ pos1 = mcf_binary_search_lid(lid, mcf_general_tlvota_last_mod_lid_g[sim_id].lid, mcf_general_tlvota_last_mod_lid_g[sim_id].lid_cnt, &new_pos);
+#else
+ pos1 = mcf_binary_search_lid_struct(lid, mcf_general_tlvota_last_mod_lid_g[sim_id].lid_conf, mcf_general_tlvota_last_mod_lid_g[sim_id].lid_cnt, &new_pos);
+ if(pos1 != -1 && pos1 >= 0){
+ if(nv_int_info.not_reset_general_tlvota == KAL_FALSE || mcf_general_tlvota_last_mod_lid_g[sim_id].lid_conf[pos1].not_reset == KAL_FALSE){
+ reset = KAL_TRUE;
+ }
+ }
+#endif
+
+ /* Search general tlvota current modified LID list */
+ if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+ /* If current modified LID list is full, all LIDs are needed to be reset */
+ return KAL_TRUE;
+ }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+ pos2 = mcf_binary_search_lid(lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &new_pos);
+#else
+ pos2 = mcf_binary_search_lid_struct(lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &new_pos);
+ if(pos2 != -1 && pos2 >= 0){
+ if(nv_int_info.not_reset_general_tlvota == KAL_FALSE || mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_conf[pos2].not_reset == KAL_FALSE){
+ reset = KAL_TRUE;
+ }
+ }
+#endif
+
+ if ( (pos1 != -1) || (pos2 != -1) ) {
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+ if (reset == KAL_TRUE)
+#endif
+ {
+ MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_GENERAL_TLVOTA_FOUND(lid);
+ return KAL_TRUE;
+ }
+ }
+
+ MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_NOT_FOUND(lid);
+
+ return KAL_FALSE;
+}
+
+
+mcf_ota_result_e mcf_check_reset_and_tlvota_buffer_sbp_tag(kal_uint8 ps_id, mcf_tlvota_sbp_tag_t sbp_tag, nvram_lid_enum lid , kal_uint8 *buffer, kal_uint32 size, kal_uint16 record_idx)
+{
+ mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
+
+ if (!(buffer && (size > 0))) {
+ MD_TRC_MCF_TR_CHECK_RESET_AND_TLVOTA_BUFFER_SBP_TAG_INVALID_PARA(ps_id, lid, buffer, size);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+ if(mcf_check_lid_need_reset_by_psid(lid, ps_id) == KAL_TRUE){
+ if (NVRAM_DEFAULT_VALUE_POINT != nvram_get_default_value(lid, ps_id, &buffer))
+ {
+ MD_TRC_MCF_TR_CHECK_RESET_AND_TLVOTA_BUFFER_SBP_TAG_GET_DEFAULT_VALUE_FAIL(lid);
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+ return ret;
+ }
+ }else{
+ if ( !nvram_external_read_data(lid, record_idx, buffer, size)) {
+ ret = MCF_OTA_R_READ_NVRAM_FAIL;
+ return ret;
+ }
+ }
+
+ ret = mcf_read_ota_buffer(lid, record_idx, buffer, size);
+ if (ret != MCF_OTA_R_SUCCESS){
+ return ret;
+ }
+ ret = mcf_read_tlvota_buffer_sbp_tag(ps_id, sbp_tag, lid, buffer, size);
+
+ return ret;
+}
+
+kal_bool mcf_check_ota_need_update(protocol_id_enum ps_id, mcf_tlvota_sbp_tag_t sbp_tag, kal_uint8* iccid)
+{
+ kal_bool is_need_update = KAL_FALSE;
+ kal_bool ret = KAL_FALSE;
+ sbp_reconfig_custom_param_struct param_ptr;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_INVALID_SIM_ID(ps_id, sim_id);
+ ret = MCF_OTA_R_INVALID_PARAMETER;
+
+ return ret;
+ }
+
+ MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_START(ps_id, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+ param_ptr.ps_id = ps_id;
+ param_ptr.sbp_id = sbp_tag.sbp_id;
+ 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_cpy(param_ptr.iccid, iccid, 21);
+
+
+ ret = mcf_auto_select_tlvota_file(¶m_ptr);
+ if (ret == KAL_FALSE){
+ is_need_update = KAL_FALSE;
+ MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_FAIL(ps_id, ret);
+ }
+
+ if (com_Mcf.update_tlvota[sim_id] == KAL_TRUE || com_Mcf.update_general_tlvota[sim_id] == KAL_TRUE){
+ is_need_update = KAL_TRUE;
+ }
+ MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_RESULT(ps_id, is_need_update);
+
+ return is_need_update;
+}
+
+mcf_ota_result_e mcf_get_tlvota_file_result(protocol_id_enum ps_id){
+ mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
+ sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+
+ MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_START(ps_id);
+
+ if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+ MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_INVALID_SIM_ID(ps_id, sim_id);
+ mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+ return mcf_ret;
+ }
+
+ mcf_ret = com_Mcf.tlvota_result[sim_id];
+ com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_PARAMETER;
+
+ MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_RETURN_RESULT(ps_id, mcf_ret);
+
+ return mcf_ret;
+}