blob: 068c57a0c40aea25e198c0cedb1cf5052f2d8d0d [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2018
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 * Filename:
38 * ---------
39 * mcf_if.c
40 *
41 * Project:
42 * --------
43 * UMOLYA
44 *
45 * Description:
46 * ------------
47 * MD Configuration Framework public interface implementation.
48 *
49 * Author:
50 * -------
51 * -------
52 *
53 *==============================================================================
54 * HISTORY
55 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
56 *------------------------------------------------------------------------------
57 * removed!
58 *
59 * removed!
60 * removed!
61 * removed!
62 * removed!
63 *
64 * removed!
65 * removed!
66 * removed!
67 * removed!
68 *
69 * removed!
70 * removed!
71 * removed!
72 * removed!
73 *
74 * removed!
75 * removed!
76 * removed!
77 * removed!
78 *
79 * removed!
80 * removed!
81 * removed!
82 *
83 * removed!
84 * removed!
85 * removed!
86 * removed!
87 *
88 *
89 * removed!
90 * removed!
91 * removed!
92 *
93 *
94 * removed!
95 * removed!
96 * removed!
97 *
98 * removed!
99 * removed!
100 * removed!
101 *
102 * removed!
103 *
104 * removed!
105 *
106 * removed!
107 *
108 * removed!
109 *
110 * removed!
111 *
112 * removed!
113 *
114 * removed!
115 * removed!
116 * removed!
117 * removed!
118 *
119 * removed!
120 * removed!
121 * removed!
122 * removed!
123 *
124 * removed!
125 * removed!
126 * removed!
127 * removed!
128 *
129 *
130 *
131 * removed!
132 * removed!
133 * removed!
134 * removed!
135 *
136 * removed!
137 * removed!
138 * removed!
139 * removed!
140 *
141 * removed!
142 * removed!
143 * removed!
144 *
145 * removed!
146 * removed!
147 * removed!
148 * removed!
149 * removed!
150 * removed!
151 *
152 * removed!
153 * removed!
154 * removed!
155 * removed!
156 *
157 * removed!
158 * removed!
159 * removed!
160 *
161 * removed!
162 * removed!
163 * removed!
164 *
165 * removed!
166 * removed!
167 * removed!
168 *
169 * removed!
170 * removed!
171 * removed!
172 *
173 * removed!
174 * removed!
175 * removed!
176 *
177 * removed!
178 * removed!
179 * removed!
180 *
181 * removed!
182 * removed!
183 * removed!
184 * removed!
185 * removed!
186 * removed!
187 *
188 * removed!
189 * removed!
190 * removed!
191 *
192 * removed!
193 * removed!
194 * removed!
195 *
196 * removed!
197 * removed!
198 * removed!
199 *
200 * removed!
201 * removed!
202 * removed!
203 * removed!
204 *
205 * removed!
206 * removed!
207 * removed!
208 *
209 * removed!
210 * removed!
211 * removed!
212 *
213 * removed!
214 * removed!
215 * removed!
216 *
217 * removed!
218 * removed!
219 * removed!
220 * removed!
221 *
222 * removed!
223 * removed!
224 * removed!
225 *
226 * removed!
227 * removed!
228 * removed!
229 * removed!
230 * removed!
231 * removed!
232 *
233 * removed!
234 * removed!
235 * removed!
236 *
237 * removed!
238 * removed!
239 * removed!
240 *
241 * removed!
242 * removed!
243 * removed!
244 *
245 * removed!
246 * removed!
247 * removed!
248 *
249 * removed!
250 * removed!
251 * removed!
252 *
253 * removed!
254 * removed!
255 * removed!
256 *
257 * removed!
258 * removed!
259 * removed!
260 * removed!
261 * removed!
262 * removed!
263 *
264 * removed!
265 * removed!
266 * removed!
267 * removed!
268 *
269 * removed!
270 * removed!
271 * removed!
272 *
273 * removed!
274 * removed!
275 * removed!
276 * removed!
277 *
278 * removed!
279 * removed!
280 * removed!
281 *
282 * removed!
283 * removed!
284 * removed!
285 *
286 * removed!
287 * removed!
288 *
289 * removed!
290 * removed!
291 * removed!
292 *
293 * removed!
294 * removed!
295 * removed!
296 *
297 * removed!
298 * removed!
299 * removed!
300 *
301 * removed!
302 * removed!
303 * removed!
304 *
305 * removed!
306 * removed!
307 * removed!
308 * removed!
309 *
310 * removed!
311 * removed!
312 * removed!
313 *
314 * removed!
315 * removed!
316 * removed!
317 *
318 * removed!
319 * removed!
320 * removed!
321 *
322 * removed!
323 * removed!
324 * removed!
325 *
326 * removed!
327 * removed!
328 * removed!
329 *
330 * removed!
331 * removed!
332 * removed!
333 *
334 * removed!
335 * removed!
336 * removed!
337 *
338 * removed!
339 * removed!
340 * removed!
341 * removed!
342 *
343 * removed!
344 * removed!
345 * removed!
346 * removed!
347 *
348 * removed!
349 * removed!
350 * removed!
351 *
352 * removed!
353 * removed!
354 * removed!
355 *
356 *------------------------------------------------------------------------------
357 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
358 *==============================================================================
359 *******************************************************************************/
360
361#include "kal_public_api.h"
362#include "fs_general_api.h"
363#include <math.h>
364
365#include "md_sap.h"
366#include "md_svc_sap.h"
367#include "em_msgid.h"
368#include "em_l4_common_public_struct.h"
369#include "em_mcf_public_struct.h"
370#include "nvram_interface.h"
371
372#include "mcf_nvram_editor.h"
373#include "mcf_msgid.h"
374#include "mcf_custom.h"
375#include "mcf_defs.h"
376#include "mcf_if.h"
377#include "mcf_debug.h"
378#include "mcf_util.h"
379#include "mcf_object.h"
380#include "mcf_utfwk.h"
381
382/*------------------------------------------------------------------------------
383 * Global variables.
384 *----------------------------------------------------------------------------*/
385extern MCF_DB_LID_MAPPING mcf_db_lid_mapping_tbl[];
386extern mcf_dump_param_struct mcf_dump_param_tbl[];
387extern kal_uint32 mcf_dump_param_tbl_num;
388
389kal_uint8 mcf_dump_buffer[MCF_MAX_DUMP_SIZE + MCF_MAX_RECORD_CNT * MCF_DUMP_LID_HEADER_SIZE];
390nvram_mcf_lid_info_struct mcf_last_mod_lid_g = {0};
391nvram_mcf_lid_info_struct mcf_curr_mod_lid_g = {0};
392nvram_mcf_lid_info_struct mcf_tlvota_last_mod_lid_g[MAX_SIM_NUM] = {0};
393nvram_mcf_lid_info_struct mcf_tlvota_curr_mod_lid_g[MAX_SIM_NUM] = {0};
394nvram_mcf_lid_info_struct mcf_general_tlvota_last_mod_lid_g[MAX_SIM_NUM] = {0};
395nvram_mcf_lid_info_struct mcf_general_tlvota_curr_mod_lid_g[MAX_SIM_NUM] = {0};
396kal_char txt_buff[64];
397kal_bool is_read_tlvota[MAX_SIM_NUM] = {0};
398kal_bool is_read_general_tlvota[MAX_SIM_NUM] = {0};
399kal_bool is_update_tlvota[MAX_SIM_NUM];
400nvram_ef_mcf_internal_info_struct nv_int_info;
401kal_char mcf_gid_buff[256];
402mcf_ota_result_e set_op_read_ret[MAX_SIM_NUM];
403
404#ifdef __MCF_COMBINE_FILE_SUPPORT__
405kal_uint8 mcf_merge_buffer[MCF_MAX_FILE_SIZE];
406kal_uint8 mcf_file_buffer[MCF_MAX_FILE_SIZE];
407kal_wchar merge_ota_name[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
408#endif
409
410kal_uint8 dsbp_ret = 0;
411
412/*------------------------------------------------------------------------------
413 * Helper macro.
414 *----------------------------------------------------------------------------*/
415
416
417/*------------------------------------------------------------------------------
418 * Private data structure.
419 *----------------------------------------------------------------------------*/
420typedef struct tm MCF_TIME_STRUCT;
421
422/*------------------------------------------------------------------------------
423 * Private variables.
424 *----------------------------------------------------------------------------*/
425
426/*------------------------------------------------------------------------------
427 * Extern fucntions.
428 *----------------------------------------------------------------------------*/
429extern kal_char* release_verno(void);
430extern kal_char* build_date_time(void);
431extern sim_interface_enum l4c_gemini_get_actual_sim_id(sim_interface_enum simId);
432extern sim_interface_enum l4c_gemini_get_switched_sim_id(sim_interface_enum simId);
433extern void mcf_merge_make_ota_file_header(mcf_tool_file_info_t *output_header, mcf_tool_file_info_t *copy_header);
434
435/*------------------------------------------------------------------------------
436 * Private fucntions.
437 *----------------------------------------------------------------------------*/
438_STATIC kal_bool mcf_check_tag_match(
439 mcf_tool_tlvota_file_item_t *pItem,
440 mcf_tlvota_tag_t *tag_entry,
441 kal_uint32 tag_num,
442 kal_uint32 *match_idx)
443{
444 kal_uint32 tag_cnt = 0;
445
446 ASSERT(pItem);
447 ASSERT(tag_entry);
448 ASSERT(tag_num >= 0);
449
450 while(tag_cnt < tag_num) {
451 if ( (pItem->tag_type == tag_entry[tag_cnt].tag_type) && (strncmp(&(pItem->buff_start), tag_entry[tag_cnt].tag, pItem->tag_len) == 0) ) {
452 *match_idx = tag_cnt;
453
454 return KAL_TRUE;
455 }
456
457 tag_cnt++;
458 }
459
460 return KAL_FALSE;
461}
462
463_STATIC kal_bool mcf_v2_check_tag_match(
464 mcf_tool_gid_tlvota_file_item_t *pItem,
465 mcf_tlvota_tag_t *tag_entry,
466 kal_uint32 tag_num,
467 kal_uint32 *match_idx)
468{
469 kal_uint32 tag_cnt = 0;
470
471 ASSERT(pItem);
472 ASSERT(tag_entry);
473 ASSERT(tag_num >= 0);
474
475 while(tag_cnt < tag_num) {
476 if ( (pItem->tag_type == tag_entry[tag_cnt].tag_type) && (strncmp(&(pItem->buff_start), tag_entry[tag_cnt].tag, pItem->tag_len) == 0) ) {
477 *match_idx = tag_cnt;
478
479 return KAL_TRUE;
480 }
481
482 tag_cnt++;
483 }
484
485 return KAL_FALSE;
486}
487
488_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)
489{
490 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
491 static kal_char tag[4][MCF_MAX_TAG_LEN];
492 kal_int32 ret_snprintf;
493
494 kal_mem_set(tag, 0, sizeof(kal_char) * 4 * MCF_MAX_TAG_LEN);
495 *tag_num = 0;
496 /* Fill tag entry */
497 if (sbp_tag.sbp_id != SBP_ID_INVALID) {
498 if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
499 if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // sbpid_mcc_mnc case
500 /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
501 if (is_general == KAL_TRUE){
502 /* NA_mcc_NA */
503 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
504 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
505 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
506 strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
507 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
508 }
509 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
510 tag_entry[*tag_num].tag = tag[*tag_num];
511 *tag_num = *tag_num +1;
512
513 /* NA_mcc_mnc */
514 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
515 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
516 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
517 strncpy(tag[*tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
518 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
519 }
520 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
521 tag_entry[*tag_num].tag = tag[*tag_num];
522 *tag_num = *tag_num +1;
523 }else{
524 /* Reuse tag_entry */
525 *tag_num = 0;
526 /* NA_NA_NA */
527 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
528 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
529 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
530 strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
531 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
532 }
533 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
534 tag_entry[*tag_num].tag = tag[*tag_num];
535 *tag_num = *tag_num +1;
536
537 /* sbpid_NA_NA */
538 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
539 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
540 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
541 strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
542 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
543 }
544 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
545 tag_entry[*tag_num].tag = tag[*tag_num];
546 *tag_num = *tag_num +1;
547
548 /* sbpid_mcc_NA */
549 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
550 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
551 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
552 strncpy(tag[*tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
553 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
554 }
555 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
556 tag_entry[*tag_num].tag = tag[*tag_num];
557 *tag_num = *tag_num +1;
558
559 /* sbpid_mcc_mnc */
560 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
561 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_%s", sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
562 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
563 strncpy(tag[*tag_num], "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
564 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
565 }
566 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
567 tag_entry[*tag_num].tag = tag[*tag_num];
568 *tag_num = *tag_num +1;
569 }
570 } else { // sbpid_mcc_NA case
571 /* NA_mcc_NA case should be updated first */
572 if (is_general == KAL_TRUE){
573 /* NA_mcc_NA */
574 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
575 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
576 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
577 strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
578 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
579 }
580 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
581 tag_entry[*tag_num].tag = tag[*tag_num];
582 *tag_num = *tag_num +1;
583 }else{
584 /* Reuse tag_entry */
585 *tag_num = 0;
586 /* NA_NA_NA */
587 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
588 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
589 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
590 strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
591 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
592 }
593 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
594 tag_entry[*tag_num].tag = tag[*tag_num];
595 *tag_num = *tag_num +1;
596
597 /* sbpid_NA_NA */
598 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
599 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
600 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
601 strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
602 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
603 }
604 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
605 tag_entry[*tag_num].tag = tag[*tag_num];
606 *tag_num = *tag_num +1;
607
608 /* sbpid_mcc_NA */
609 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
610 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
611 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
612 strncpy(tag[*tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
613 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
614 }
615 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
616 tag_entry[*tag_num].tag = tag[*tag_num];
617 *tag_num = *tag_num +1;
618 }
619 }
620 } else {
621 if (strcmp((kal_char *)sbp_tag.mnc, "") == 0) { // sbpid_NA_NA case
622 if (is_general == KAL_FALSE){
623 /* NA_NA_NA */
624 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
625 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
626 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
627 strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
628 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
629 }
630 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
631 tag_entry[*tag_num].tag = tag[*tag_num];
632 *tag_num = *tag_num +1;
633
634 /* sbpid_NA_NA */
635 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
636 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
637 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
638 strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
639 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
640 }
641 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
642 tag_entry[*tag_num].tag = tag[*tag_num];
643 *tag_num = *tag_num +1;
644 }
645 } else { // sbpid_NA_mnc case is not allowed!!
646 MD_TRC_MCF_TR_FILL_TAG_ENTRY_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
647 ret = MCF_OTA_R_INVALID_SBP_TAG;
648
649 return ret;
650 }
651 }
652 } else {
653 if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
654 if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // NA_mcc_mnc case
655 /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
656 if (is_general == KAL_TRUE){
657 /* NA_mcc_NA */
658 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
659 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
660 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
661 strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
662 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
663 }
664 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
665 tag_entry[*tag_num].tag = tag[*tag_num];
666 *tag_num = *tag_num +1;
667
668 /* NA_mcc_mnc */
669 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
670 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
671 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
672 strncpy(tag[*tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
673 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
674 }
675 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
676 tag_entry[*tag_num].tag = tag[*tag_num];
677 *tag_num = *tag_num +1;
678 }else{
679 /* Reuse tag_entry */
680 *tag_num = 0;
681 /* NA_NA_NA */
682 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
683 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
684 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
685 strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
686 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
687 }
688 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
689 tag_entry[*tag_num].tag = tag[*tag_num];
690 *tag_num = *tag_num +1;
691 }
692 } else { // NA_mcc_NA case
693 /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
694 if (is_general == KAL_TRUE){
695 /* NA_mcc_NA */
696 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
697 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
698 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
699 strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
700 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
701 }
702 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
703 tag_entry[*tag_num].tag = tag[*tag_num];
704 *tag_num = *tag_num +1;
705
706 }else{
707 /* Reuse tag_entry */
708 *tag_num = 0;
709 /* NA_NA_NA */
710 tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
711 ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
712 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
713 strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
714 MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
715 }
716 tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
717 tag_entry[*tag_num].tag = tag[*tag_num];
718 *tag_num = *tag_num +1;
719 }
720 }
721 } else { // NA_NA_mnc cases is not allowed!!
722 MD_TRC_MCF_TR_FILL_TAG_ENTRY_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
723 ret = MCF_OTA_R_INVALID_SBP_TAG;
724
725 return ret;
726 }
727 }
728 return ret;
729}
730_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)
731{
732 mcf_tool_file_info_t *pFile;
733 mcf_tool_tlvota_file_item_t *pItem;
734 kal_uint16 item_cnt = 0;
735 kal_uint16 item_byte_offset;
736 kal_uint16 item_bit_offset;
737 kal_uint32 item_size;
738 kal_uint32 match_idx;
739 kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
740 mcf_tag_info_struct unuse = {0};
741 MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
742
743 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
744 pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
745 /* Read changed items from TLV-OTA file */
746 while (item_cnt < pFile->item_num) {
747 /* Check if LID and tag match */
748 if ( (pItem->lid != lid) || (mcf_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
749 goto next;
750 }
751
752 /* Check if item_tag_len is valid */
753 if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
754 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
755 mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d) \r\n", pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
756 goto next;
757 }
758
759 /* Update LID item */
760 if (pItem->is_bit_op == 0) {
761 strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
762 item_tag[pItem->item_tag_len] = '\0';
763 if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
764 goto next;
765 }
766
767 if (pItem->op.byte.value_len > item_size) {
768 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
769 mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->op.byte.value_len, item_size);
770
771 goto next;
772 }
773
774 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);
775 mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
776
777 kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
778 } else {
779 kal_uint32 bit_value = 0;
780 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
781
782 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.bit.value_len);
783
784 strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
785 item_tag[pItem->item_tag_len] = '\0';
786 if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
787 goto next;
788 }
789
790 if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
791 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
792
793 goto next;
794 }
795
796 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);
797
798 if (pItem->op.bit.value_len == 1) {
799 kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
800
801 *val_tmp &= ~(bit_mask << item_bit_offset);
802 *val_tmp |= (bit_value << item_bit_offset);
803 } else if (pItem->op.bit.value_len == 2) {
804 kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
805
806 *val_tmp &= ~(bit_mask << item_bit_offset);
807 *val_tmp |= (bit_value << item_bit_offset);
808 } else if (pItem->op.bit.value_len == 4) {
809 kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
810
811 *val_tmp &= ~(bit_mask << item_bit_offset);
812 *val_tmp |= (bit_value << item_bit_offset);
813 }
814 }
815
816next:
817 pItem = (mcf_tool_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
818 item_cnt++;
819 }
820 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
821}
822
823_STATIC mcf_ota_result_e mcf_read_tlvota_buffer_multi_tag(
824 kal_uint8 ps_id,
825 mcf_tlvota_tag_t *tag_entry,
826 kal_uint32 tag_num,
827 nvram_lid_enum lid,
828 kal_uint8 *buffer,
829 kal_uint32 size)
830{
831 mcf_t *pMcf = mcf_get_instance();
832 mcf_tool_file_info_t *pFile;
833 mcf_tool_gid_tlvota_file_item_t *pItem;
834 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
835 mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
836 nvram_ltable_entry_struct lid_info;
837 kal_uint16 item_cnt = 0;
838 kal_uint32 match_idx;
839 nvram_errno_enum nvram_api_ret;
840 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
841 kal_uint16 item_byte_offset;
842 kal_uint16 item_bit_offset;
843 kal_uint32 item_size;
844 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
845 kal_bool item_is_bit = KAL_FALSE;
846 kal_uint16 item_lid;
847
848 ASSERT(buffer);
849 ASSERT(size > 0);
850 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_START(ps_id, sim_id, tag_num);
851
852 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
853 if (tlvota_file) {
854 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
855
856 /* Check if file type is TLV-OTA file */
857 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
858 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
859
860 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
861 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_FILE(str_tmp);
862 ret = MCF_OTA_R_INVALID_FILE;
863 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
864
865 return ret;
866 }
867
868 nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
869 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
870 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_GET_LID_INFO_FAIL(lid, nvram_api_ret);
871 mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
872 ret = MCF_OTA_R_INVALID_PARAMETER;
873 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
874
875 return ret;
876 }
877
878 if (size != lid_info.size) {
879 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_SIZE(size, lid, lid_info.size);
880 mcf_utfwk_printf("Invalid buffer_size(%d)!! LID(%d), record_size(%d) \r\n", size, lid, lid_info.size);
881 ret = MCF_OTA_R_INVALID_PARAMETER;
882 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
883
884 return ret;
885 }
886
887 if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
888 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_ATTR_NOT_SET(lid, lid_info.attr);
889 mcf_utfwk_printf("ERROR!! OTA by op attribute is not set! LID(%d), attribute(%x) \r\n", lid, lid_info.attr);
890 ret = MCF_OTA_R_INVALID_ATTR;
891 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
892
893 return ret;
894 }
895 if (pFile->file_version == 2){
896 mcf_v1_read_tlvota_buffer_tag_update_flow(tlvota_file, tag_entry, tag_num, lid, buffer);
897 }else if (pFile->file_version == 3){
898 pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
899 /* Read changed items from TLV-OTA file */
900 while (item_cnt < pFile->item_num) {
901 /* Check if array_index_len is valid */
902 if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
903 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
904 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);
905 goto next;
906 }
907 strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
908 array_tag[pItem->array_index_len] = '\0';
909
910 /* Find GID corresponding LID */
911 item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
912 if (item_lid == 65535){
913 //-1(65535) means not found
914 goto next;
915 }
916
917 /* Check if LID and tag match */
918 if ( (item_lid != lid) || (mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
919 goto next;
920 }
921
922
923 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){
924 goto next;
925 }
926
927 /* Update LID item */
928 if (item_is_bit == 0) {
929 if (pItem->value_len > item_size) {
930 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_LARGE_VAL_LEN(pItem->value_len, item_size);
931 mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->value_len, item_size);
932
933 goto next;
934 }
935
936 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BYTE_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, pItem->value_len);
937 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);
938 mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
939
940 kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
941 nv_int_info.update_general_tlvota_result = KAL_TRUE;
942 } else {
943 kal_uint32 bit_value = 0;
944 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
945 kal_uint32 offset = 0;
946 kal_uint32 var_size = 1;
947 kal_uint32 val_tmp = 0;
948
949 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
950
951 if (pItem->value_len > 4) {
952 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
953
954 goto next;
955 }
956
957 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);
958 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);
959
960 if (item_size > 8 && item_size <= 16) {
961 var_size = 2;
962 }else if (item_size > 16 && item_size <= 24) {
963 var_size = 3;
964 }else if (item_size > 24 && item_size <= 32) {
965 var_size = 4;
966 }
967
968 if (item_bit_offset > 0 && item_bit_offset < 8) {
969 offset = 0;
970 }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
971 offset = 1;
972 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
973 offset = 2;
974 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
975 offset = 3;
976 }else if (item_bit_offset >= 32){
977 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
978
979 goto next;
980 }
981
982 if (item_bit_offset > 0) {
983 if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
984 var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
985 }
986 }
987 if(var_size > 4){
988 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
989
990 goto next;
991 }
992
993 if (item_bit_offset >= 8 && item_bit_offset < 16) {
994 item_bit_offset -= 8;
995 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
996 item_bit_offset -= 16;
997 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
998 item_bit_offset -= 24;
999 }
1000
1001
1002 kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
1003 val_tmp &= ~(bit_mask << item_bit_offset);
1004 val_tmp |= (bit_value << item_bit_offset);
1005
1006 kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
1007 nv_int_info.update_general_tlvota_result = KAL_TRUE;
1008 }
1009
1010 next:
1011 pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
1012 item_cnt++;
1013 }
1014 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1015 }
1016 } else {
1017 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_TAKE_READ_LOCK_FAIL();
1018 mcf_utfwk_printf("Fail to take read lock!! \r\n");
1019 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
1020 }
1021
1022 return ret;
1023}
1024
1025_STATIC mcf_ota_result_e mcf_read_tlvota_buffer_sbp_multi_tag(
1026 kal_uint8 ps_id,
1027 mcf_tlvota_tag_t *tag_entry,
1028 kal_uint32 tag_num,
1029 nvram_lid_enum lid,
1030 kal_uint8 *buffer,
1031 kal_uint32 size)
1032{
1033 mcf_t *pMcf = mcf_get_instance();
1034 mcf_tool_file_info_t *pFile;
1035 mcf_tool_gid_tlvota_file_item_t *pItem;
1036 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
1037 mcf_tlvota_file_t *tlvota_file;
1038 nvram_ltable_entry_struct lid_info;
1039 kal_uint16 item_cnt = 0;
1040 kal_uint32 match_idx;
1041 nvram_errno_enum nvram_api_ret;
1042 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
1043 kal_uint16 item_byte_offset;
1044 kal_uint16 item_bit_offset;
1045 kal_uint32 item_size;
1046 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
1047 kal_bool item_is_bit = KAL_FALSE;
1048 kal_uint16 item_lid;
1049
1050 ASSERT(buffer);
1051 ASSERT(size > 0);
1052 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_START(ps_id, sim_id, tag_num);
1053
1054 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
1055 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_SIM_ID(ps_id, sim_id);
1056 ret = MCF_OTA_R_INVALID_PARAMETER;
1057
1058 return ret;
1059 }
1060 tlvota_file = &(pMcf->tlvota_file[sim_id]);
1061
1062 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1063 if (tlvota_file) {
1064 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
1065
1066 /* Check if file type is TLV-OTA file */
1067 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
1068 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
1069
1070 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
1071 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_FILE(str_tmp);
1072 ret = MCF_OTA_R_INVALID_FILE;
1073 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1074
1075 return ret;
1076 }
1077
1078 nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
1079 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
1080 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_GET_LID_INFO_FAIL(lid, nvram_api_ret);
1081 mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
1082 ret = MCF_OTA_R_INVALID_PARAMETER;
1083 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1084
1085 return ret;
1086 }
1087
1088 if (size != lid_info.size) {
1089 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_SIZE(size, lid, lid_info.size);
1090 mcf_utfwk_printf("Invalid buffer_size(%d)!! LID(%d), record_size(%d) \r\n", size, lid, lid_info.size);
1091 ret = MCF_OTA_R_INVALID_PARAMETER;
1092 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1093
1094 return ret;
1095 }
1096
1097 if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
1098 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_ATTR_NOT_SET(lid, lid_info.attr);
1099 mcf_utfwk_printf("ERROR!! OTA by op attribute is not set! LID(%d), attribute(%x) \r\n", lid, lid_info.attr);
1100 ret = MCF_OTA_R_INVALID_ATTR;
1101 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1102
1103 return ret;
1104 }
1105 if (pFile->file_version == 2){
1106 mcf_v1_read_tlvota_buffer_tag_update_flow(tlvota_file, tag_entry, tag_num, lid, buffer);
1107 }else if (pFile->file_version == 3){
1108 pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
1109 /* Read changed items from TLV-OTA file */
1110 while (item_cnt < pFile->item_num) {
1111 /* Check if array_index_len is valid */
1112 if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
1113 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
1114 goto next;
1115 }
1116 strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
1117 array_tag[pItem->array_index_len] = '\0';
1118
1119 /* Find GID corresponding LID */
1120 item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
1121 if (item_lid == 65535){
1122 //-1(65535) means not found
1123 goto next;
1124 }
1125
1126 /* Check if LID and tag match */
1127 if ( (item_lid != lid) || (mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
1128 goto next;
1129 }
1130
1131 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){
1132 goto next;
1133 }
1134
1135 /* Update LID item */
1136 if (item_is_bit == 0) {
1137 if (pItem->value_len > item_size) {
1138 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_LARGE_VAL_LEN(pItem->value_len, item_size);
1139 mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->value_len, item_size);
1140
1141 goto next;
1142 }
1143
1144 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_BYTE_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, pItem->value_len);
1145 mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
1146
1147 kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
1148 nv_int_info.update_tlvota_result[sim_id] = KAL_TRUE;
1149 } else {
1150 kal_uint32 bit_value = 0;
1151 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
1152 kal_uint32 offset = 0;
1153 kal_uint32 var_size = 1;
1154 kal_uint32 val_tmp = 0;
1155
1156 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
1157
1158 if (pItem->value_len > 4) {
1159 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
1160
1161 goto next;
1162 }
1163
1164 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);
1165
1166 if (item_size > 8 && item_size <= 16) {
1167 var_size = 2;
1168 }else if (item_size > 16 && item_size <= 24) {
1169 var_size = 3;
1170 }else if (item_size > 24 && item_size <= 32) {
1171 var_size = 4;
1172 }
1173
1174 if (item_bit_offset > 0 && item_bit_offset < 8) {
1175 offset = 0;
1176 }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
1177 offset = 1;
1178 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
1179 offset = 2;
1180 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
1181 offset = 3;
1182 }else if (item_bit_offset >= 32){
1183 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
1184
1185 goto next;
1186 }
1187
1188 if (item_bit_offset > 0) {
1189 if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
1190 var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
1191 }
1192 }
1193 if(var_size > 4){
1194 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
1195
1196 goto next;
1197 }
1198
1199 if (item_bit_offset >= 8 && item_bit_offset < 16) {
1200 item_bit_offset -= 8;
1201 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
1202 item_bit_offset -= 16;
1203 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
1204 item_bit_offset -= 24;
1205 }
1206
1207
1208 kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
1209 val_tmp &= ~(bit_mask << item_bit_offset);
1210 val_tmp |= (bit_value << item_bit_offset);
1211
1212 kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
1213 nv_int_info.update_tlvota_result[sim_id] = KAL_TRUE;
1214 }
1215
1216 next:
1217 pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
1218 item_cnt++;
1219 }
1220 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1221 }
1222 } else {
1223 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_TAKE_READ_LOCK_FAIL();
1224 mcf_utfwk_printf("Fail to take read lock!! \r\n");
1225 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
1226 }
1227
1228 return ret;
1229}
1230
1231_STATIC mcf_ota_result_e mcf_set_dsbp_mode(kal_bool is_ignore_dsbp, kal_bool is_general, sim_interface_enum sim_id)
1232{
1233 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
1234
1235 MD_TRC_MCF_TR_SET_DSBP_MODE_START(is_ignore_dsbp, is_general, sim_id);
1236
1237 if(sim_id < 0 || sim_id >= MAX_SIM_NUM){
1238 MD_TRC_MCF_TR_SET_DSBP_MODE_INVALID_SIM_ID(sim_id);
1239 }
1240
1241 kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
1242 /* Read MCF SW information in NVRAM */
1243 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
1244 MD_TRC_MCF_TR_SET_DSBP_MODE_READ_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1245 ret = MCF_OTA_R_READ_NVRAM_FAIL;
1246
1247 return ret;
1248 }
1249
1250 if (is_general == KAL_FALSE){
1251 if(sim_id >= 0 && sim_id < MAX_SIM_NUM){
1252 nv_int_info.tlvota_is_ignore_dsbp[sim_id] = is_ignore_dsbp;
1253 }
1254 }else{
1255 nv_int_info.general_is_ignore_dsbp = is_ignore_dsbp;
1256 }
1257
1258 /* Write MCF SW information in NVRAM */
1259 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
1260 MD_TRC_MCF_TR_SET_DSBP_MODE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1261 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
1262
1263 return ret;
1264 }
1265
1266 return ret;
1267}
1268
1269_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)
1270{
1271 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
1272
1273 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
1274 MD_TRC_MCF_TR_SET_NOT_RESET_INVALID_SIM_ID(sim_id);
1275 ret = MCF_OTA_R_INVALID_PARAMETER;
1276
1277 return ret;
1278 }
1279
1280 kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
1281 /* Read MCF SW information in NVRAM */
1282 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
1283 MD_TRC_MCF_TR_SET_NOT_RESET_READ_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1284 ret = MCF_OTA_R_READ_NVRAM_FAIL;
1285
1286 return ret;
1287 }
1288
1289 switch (config_type)
1290 {
1291 case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
1292 nv_int_info.not_reset_ota = not_reset;
1293 break;
1294 case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
1295 nv_int_info.not_reset_tlvota[sim_id] = not_reset;
1296 break;
1297 case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
1298 nv_int_info.not_reset_general_tlvota = not_reset;
1299 break;
1300 default:
1301 MD_TRC_MCF_TR_SET_NOT_RESET_INVALID_CONFIG_TYPE(config_type);
1302 ret = KAL_FALSE;
1303 break;
1304 }
1305
1306 /* Write MCF SW information in NVRAM */
1307 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
1308 MD_TRC_MCF_TR_SET_NOT_RESET_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1309 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
1310
1311 return ret;
1312 }
1313
1314 return ret;
1315}
1316
1317#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
1318_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)
1319#else
1320_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)
1321#endif
1322{
1323 mcf_t *pMcf = mcf_get_instance();
1324 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
1325 mcf_tlvota_tag_t tag_entry[4];
1326 kal_uint32 tag_num = 0;
1327 kal_uint16 pre_LID = 0;
1328 kal_int16 pos = -1;
1329 kal_uint16 in_pos = 0;
1330 mcf_tool_file_info_t *pFile;
1331 mcf_tool_gid_tlvota_file_item_t *pItem;
1332 nvram_ltable_entry_struct lid_info;
1333 kal_uint16 item_cnt = 0;
1334 kal_uint32 match_idx;
1335 nvram_errno_enum nvram_api_ret;
1336 kal_uint16 dummy_byte_offset;
1337 kal_uint16 dummy_bit_offset;
1338 kal_uint32 dummy_size;
1339 kal_bool dummy_is_bit;
1340 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
1341 kal_uint16 item_lid = 65535;
1342 mcf_tlvota_file_t *tlvota_file;
1343 mcf_tlvota_tag_t iccid_tag;
1344 kal_char iccid[21];
1345
1346 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_START(sim_id, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc, is_general);
1347
1348 #if defined(__MCF_COMBINE_FILE_SUPPORT__)
1349 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_NOT_RESET(not_reset);
1350#endif
1351
1352 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
1353 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_SIM_ID(sim_id);
1354 ret = MCF_OTA_R_INVALID_PARAMETER;
1355
1356 return ret;
1357 }
1358
1359 kal_mem_set(tag_entry, 0, sizeof(mcf_tlvota_tag_t) * 4);
1360 kal_mem_set(&mcf_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
1361 kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
1362 kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
1363
1364 ret = mcf_fill_tag_entry(sbp_tag, is_general, tag_entry, &tag_num);
1365 if (ret != MCF_OTA_R_SUCCESS){
1366 return ret;
1367 }
1368 tlvota_file = &(pMcf->tlvota_file[sim_id]);
1369 if (is_general == KAL_TRUE){
1370 if (com_Mcf.is_iccid == KAL_TRUE){
1371 kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
1372 iccid_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
1373
1374 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1375 if (tlvota_file){
1376 kal_mem_cpy(&iccid, tlvota_file->iccid, 21);
1377 iccid_tag.tag = iccid;
1378 iccid_tag.tag_len = strlen((kal_char *)tlvota_file->iccid);
1379
1380 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1381 }else {
1382 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_TAKE_READ_LOCK_FAIL();
1383 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
1384 return ret;
1385 }
1386 }
1387
1388 tlvota_file = &(pMcf->general_tlvota_file);
1389 }
1390
1391 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1392 if (tlvota_file) {
1393 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
1394
1395 /* Check if file type is TLV-OTA file */
1396 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
1397 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
1398
1399 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
1400 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_FILE(str_tmp);
1401 ret = MCF_OTA_R_INVALID_FILE;
1402 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1403 }else{
1404 if (pFile->file_version == 3){
1405 pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
1406 /* Read changed LID from TLV-OTA file */
1407 while (item_cnt < pFile->item_num) {
1408 /* Check if array_index_len is valid */
1409 if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
1410 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
1411 goto next;
1412 }
1413 strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
1414 array_tag[pItem->array_index_len] = '\0';
1415
1416 /* Find GID corresponding LID */
1417 item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
1418 if (item_lid == 65535){
1419 //-1(65535) means not found
1420 goto next;
1421 }
1422
1423 if ( (item_lid == pre_LID)){
1424 goto next;
1425 }
1426
1427 /* Check if LID and tag match */
1428 if ((mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
1429 if (com_Mcf.is_iccid == KAL_TRUE){
1430 if ((pItem->tag_type != iccid_tag.tag_type) || (strncmp(&(pItem->buff_start), iccid_tag.tag, pItem->tag_len) != 0) ) {
1431 goto next;
1432 }
1433 }else{
1434 goto next;
1435 }
1436 }
1437
1438 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){
1439 goto next;
1440 }
1441
1442 /* Store last time modified LID */
1443 nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
1444 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
1445 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_GET_LID_INFO_FAIL(item_lid, nvram_api_ret);
1446 ret = KAL_FALSE;
1447 goto next;
1448 }
1449 if ( ((lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) != 0)) {
1450 if (((lid_info.attr & NVRAM_ATTR_OTA_RESET) == 0)){
1451 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_RESET_ATTR_NOT_SET(item_lid, lid_info.attr);
1452 }
1453#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
1454 if (is_general == KAL_FALSE){
1455 if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
1456 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);
1457 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
1458 if (pos == -1) {
1459 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){
1460 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
1461 }else{
1462 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
1463 }
1464 mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
1465 }
1466 }
1467 }else{
1468 if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
1469 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);
1470 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
1471 if (pos == -1) {
1472 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){
1473 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
1474 }else{
1475 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
1476 }
1477 mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
1478 }
1479 }
1480 }
1481#else
1482 if (is_general == KAL_FALSE){
1483 if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
1484 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);
1485 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
1486 if (pos == -1) {
1487 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){
1488 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
1489 }else{
1490 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
1491 }
1492 mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
1493 }
1494 }
1495 }else{
1496 if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
1497 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);
1498 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
1499 if (pos == -1) {
1500 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){
1501 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
1502 }else{
1503 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
1504 }
1505 mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
1506 }
1507 }
1508 }
1509#endif
1510
1511 }
1512
1513 next:
1514 pre_LID = item_lid;
1515 pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
1516 item_cnt++;
1517 }
1518
1519 }else{
1520 //File version is not 3
1521 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_FILE_VERSION(pFile->file_version);
1522 }
1523 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1524 }
1525 } else {
1526 MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_TAKE_READ_LOCK_FAIL();
1527 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
1528 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1529 }
1530
1531
1532 return ret;
1533}
1534
1535_STATIC void mcf_em_send_ota_file_info(em_mcf_read_ota_file_info_struct *read_file_info)
1536{
1537 ilm_struct ilm;
1538 em_mcf_ota_file_info_ind_struct *em_para_ptr = NULL;
1539
1540 if (com_Mcf.is_em_on == KAL_TRUE) {
1541 em_para_ptr = (em_mcf_ota_file_info_ind_struct *)construct_local_para(sizeof(em_mcf_ota_file_info_ind_struct), TD_RESET);
1542
1543 em_para_ptr->em_info = MCF_EM_OTA_FILE_INFO;
1544 kal_mem_cpy(&(em_para_ptr->read_file_info), read_file_info, sizeof(em_mcf_read_ota_file_info_struct));
1545
1546 ilm.src_mod_id = MOD_MCF;
1547 ilm.dest_mod_id = MOD_DHL;
1548 ilm.msg_id = MSG_ID_EM_MCF_OTA_FILE_INFO_IND;
1549 ilm.sap_id = EM_PS_SAP;
1550 ilm.local_para_ptr = (local_para_struct *)em_para_ptr;
1551 ilm.peer_buff_ptr = NULL;
1552
1553 dhl_EM_logger(&ilm);
1554 destroy_ilm(&ilm);
1555 } else {
1556#ifdef __MT_FRAMEWORK_SUPPORT__
1557 if (kal_query_systemInit() == KAL_TRUE) {
1558 /* EM switch may not be ON in init stage */
1559 em_para_ptr = (em_mcf_ota_file_info_ind_struct *)construct_local_para(sizeof(em_mcf_ota_file_info_ind_struct), TD_RESET);
1560
1561 em_para_ptr->em_info = MCF_EM_OTA_FILE_INFO;
1562 kal_mem_cpy(&(em_para_ptr->read_file_info), read_file_info, sizeof(em_mcf_read_ota_file_info_struct));
1563
1564 msg_send6(MOD_MCF, /* src_mod_id */
1565 MOD_MT, /* dest_mod_id */
1566 MCF_SAP, /* sap_id */
1567 MSG_ID_EM_MCF_OTA_FILE_INFO_IND, /* msg_id */
1568 (local_para_struct*)em_para_ptr, /* local_para_ptr */
1569 NULL); /* peer_buff_ptr */
1570 }
1571#endif
1572 }
1573}
1574#ifdef __MCF_COMBINE_FILE_SUPPORT__
1575_STATIC mcf_ota_result_e mcf_combined_ota_file(l4c_mcf_set_config_req_struct *req)
1576{
1577 mcf_t *pMcf = mcf_get_instance();
1578 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
1579 kal_uint32 i;
1580 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
1581 mcf_tool_file_info_t *pFile;
1582 kal_int32 fs_ret = FS_NO_ERROR;
1583 static nvram_ef_mcf_ota_file_info_struct nv_ota_file;
1584 static nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
1585 static kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
1586 static kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
1587 static kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
1588 kal_int32 fs_api_ret;
1589 static kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
1590 l4c_mcf_path_type_enum apply_path_type;
1591 em_mcf_read_ota_file_info_struct read_file_info;
1592 kal_bool read_file_fail = KAL_FALSE;
1593
1594 kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
1595 kal_mem_set(mcf_merge_buffer, 0, MCF_MAX_FILE_SIZE);
1596 kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
1597 kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
1598
1599 switch (req->config_type)
1600 {
1601 case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
1602 {
1603 mcf_ota_file_t *ota_file = &(pMcf->ota_file);
1604 kal_uint16 pre_LID = 0;
1605 kal_int16 pos = -1;
1606 kal_uint16 in_pos = 0;
1607 mcf_tool_gid_ota_file_item_t *pItem;
1608 nvram_ltable_entry_struct lid_info;
1609 kal_uint16 item_cnt = 0;
1610 nvram_errno_enum nvram_api_ret;
1611 kal_uint16 dummy_byte_offset;
1612 kal_uint16 dummy_bit_offset;
1613 kal_uint32 dummy_size;
1614 kal_bool dummy_is_bit;
1615 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
1616 kal_uint16 item_lid;
1617
1618 if (strcmp((kal_char *)req->config1, "") != 0) {
1619 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
1620 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
1621 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
1622 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
1623 } else {
1624 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_TYPE(req->path_type);
1625 ret = MCF_OTA_R_INVALID_PARAMETER;
1626
1627 return ret;
1628 }
1629 strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
1630
1631 /* Check if file is existed */
1632 kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
1633
1634 fs_api_ret = FS_GetAttributes(filename);
1635 if (fs_api_ret < FS_NO_ERROR) {
1636 MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
1637 ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
1638
1639 return ret;
1640 }
1641
1642 /* Read MCF Internal information in NVRAM */
1643 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
1644 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1645 ret = MCF_OTA_R_READ_NVRAM_FAIL;
1646 }
1647
1648 /* Write MCF OTA file information to NVRAM */
1649 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))) {
1650 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
1651 ret = MCF_OTA_R_READ_NVRAM_FAIL;
1652
1653 return ret;
1654 }
1655
1656 if(req->reset == KAL_TRUE){
1657 //Need to reset LID
1658 nv_int_info.not_reset_ota = KAL_FALSE;
1659
1660 //Clear LIDs which is add due to combine
1661 if(mcf_clear_last_modified_lid(nv_int_info.last_mod_lid.lid_conf, &nv_int_info.last_mod_lid.lid_cnt) != KAL_TRUE){
1662 ret = MCF_OTA_R_INVALID_PARAMETER;
1663 return ret;
1664 }
1665
1666 /* Combine OTA file - Only apply one OTA file */
1667 ret = mcf_read_ota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
1668 if(ret != MCF_OTA_R_SUCCESS){
1669 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
1670 return ret;
1671 }
1672
1673 /*Store LID which need to reset into last modified buffer*/
1674 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
1675 if (ota_file) {
1676 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
1677
1678 /* Check if file type is OTA file */
1679 if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
1680 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
1681
1682 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
1683 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
1684 ret = MCF_OTA_R_INVALID_FILE;
1685 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
1686
1687 return ret;
1688 }
1689
1690 if (pFile->file_version == 3){
1691 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
1692 pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
1693 /* Read changed items from OTA file */
1694 while (item_cnt < pFile->item_num) {
1695 if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
1696 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
1697 goto next;
1698 }
1699 strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
1700 array_tag[pItem->array_index_len] = '\0';
1701
1702 /* Find GID corresponding LID */
1703 item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
1704 if (item_lid == 65535){
1705 //-1(65535) means not found
1706 goto next;
1707 }
1708
1709 if ( (item_lid == pre_LID)){
1710 goto next;
1711 }
1712
1713 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){
1714 goto next;
1715 }
1716
1717 /* Store last time modified LID */
1718 nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
1719 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
1720 MD_TRC_MCF_TR_COMBINED_OTA_FILE_GET_LID_INFO_FAIL(item_lid, nvram_api_ret);
1721 ret = MCF_OTA_R_INVALID_PARAMETER;
1722 goto next;
1723 }
1724 /* Store reset LIDs into last time modified LID */
1725 if ( ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
1726 && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
1727 if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
1728 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);
1729 MD_TRC_MCF_TR_COMBINED_OTA_FILE_SEARCH_STORE_LID(item_lid, pos);
1730 if (pos == -1) {
1731 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){
1732 MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LID_FAIL(item_lid);
1733 }else{
1734 MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LID(item_lid, in_pos);
1735 }
1736 nv_int_info.last_mod_lid.lid_cnt++;
1737 }
1738 }
1739 }
1740
1741 next:
1742 pre_LID = item_lid;
1743 pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
1744 item_cnt++;
1745
1746 }
1747 }
1748 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
1749
1750 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
1751 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1752 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
1753
1754 return ret;
1755 }
1756 }
1757
1758 }else{
1759 //Do not Need to reset LID
1760 nv_int_info.not_reset_ota = KAL_TRUE;
1761
1762 /* Combine OTA file - Append OTA file*/
1763 for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
1764 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){
1765 nv_int_info.last_mod_lid.lid_conf[i].not_reset = KAL_TRUE;
1766 }
1767 }
1768 ret = mcf_read_ota_file(KAL_FALSE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
1769 if(ret != MCF_OTA_R_SUCCESS){
1770 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_ota_file.path, nv_ota_file.name);
1771 read_file_fail = KAL_TRUE;
1772 }
1773 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
1774 if (ota_file) {
1775 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
1776
1777 /* Check if file type is OTA file */ //If not OTA file, Construct empty file header
1778 if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
1779 mcf_tool_file_info_t copy_header = {0};
1780 mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
1781
1782 MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
1783
1784 kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
1785 copy_header.file_version = 3;
1786 copy_header.operation_mask = 0;
1787 mcf_merge_make_ota_file_header(output_header, &copy_header); // copy first header to output header
1788 kal_mem_set(output_header->file_type, 0, 8);
1789 strncpy(output_header->file_type, MCF_FILE_TYPE_OTA, 7);
1790 output_header->item_num = 0;
1791 output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
1792
1793 }else{
1794 kal_mem_cpy(mcf_file_buffer, ota_file->buff, MCF_MAX_OTA_FILE_SIZE);
1795 }
1796 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
1797 }
1798 ret = mcf_read_ota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
1799 if(ret != MCF_OTA_R_SUCCESS){
1800 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
1801 return ret;
1802 }
1803 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
1804 if (ota_file) {
1805 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
1806
1807 /* Check if file type is OTA file */
1808 if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
1809 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
1810 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
1811 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
1812 ret = MCF_OTA_R_INVALID_FILE;
1813 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
1814
1815 return ret;
1816 }
1817
1818 if(mcf_merge_ota_buffer(mcf_file_buffer, ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
1819 MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
1820 ret = MCF_OTA_R_INVALID_PARAMETER;
1821 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
1822 return ret;
1823 }
1824
1825 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
1826 }
1827 strncpy(fs_root_path, nv_ota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
1828 strncpy(curr_filename, nv_ota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
1829
1830 /* Before create merged OTA file, need to delete last time merged OTA file */
1831 kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
1832 fs_ret = FS_Delete(merge_ota_name);
1833
1834 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
1835 MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
1836 ret = MCF_OTA_R_WRITE_DISK_FAIL;
1837 return ret;
1838 }
1839 pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
1840 if(pFile->file_size > MCF_MAX_OTA_FILE_SIZE){
1841 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_OTA_FILE_SIZE);
1842 ret = MCF_OTA_R_INVALID_PARAMETER;
1843 return ret;
1844 }
1845 ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
1846 if (ret != MCF_OTA_R_SUCCESS) {
1847 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
1848 return ret;
1849 }
1850
1851 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
1852 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1853 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
1854
1855 return ret;
1856 }
1857
1858 }
1859 strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
1860 strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
1861 }else{
1862 /*Deactivate Combine OTA setting */
1863
1864 kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
1865 kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
1866 kal_mem_set(nv_ota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
1867 kal_mem_set(nv_ota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
1868
1869 kal_mem_set(nv_ota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
1870 kal_mem_set(nv_ota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
1871
1872 nv_int_info.is_combined_ota = KAL_FALSE;
1873
1874 //Need to reset LID
1875 nv_int_info.not_reset_ota = KAL_FALSE;
1876
1877 for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
1878 if(nv_int_info.last_mod_lid.lid_conf[i].not_reset == KAL_TRUE){
1879 nv_int_info.last_mod_lid.lid_conf[i].not_reset = KAL_FALSE;
1880 }
1881 }
1882
1883 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
1884 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1885 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
1886
1887 return ret;
1888 }
1889
1890 }
1891
1892
1893 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)) ) {
1894 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
1895 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
1896
1897 return ret;
1898 }
1899
1900 break;
1901 }
1902
1903 case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
1904 {
1905 mcf_tlvota_file_t *tlvota_file;
1906 mcf_tlvota_sbp_tag_t sbp_tag;
1907
1908 MD_TRC_MCF_TR_COMBINED_OTA_FILE_TLVOTA_START(sim_id);
1909
1910 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
1911 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_SIM_ID(req->ps_id, sim_id);
1912 ret = MCF_OTA_R_INVALID_PARAMETER;
1913 return ret;
1914 }
1915
1916 tlvota_file = &(pMcf->tlvota_file[sim_id]);
1917
1918 if (strcmp((kal_char *)req->config1, "") != 0) {
1919 if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
1920 /* If MCF is in DSBP passive mode, change to DSBP active mode */
1921 ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
1922 if (ret != MCF_OTA_R_SUCCESS) {
1923 return ret;
1924 }
1925 pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
1926 }
1927 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
1928 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
1929 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
1930 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
1931 } else {
1932 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(req->path_type);
1933 ret = MCF_OTA_R_INVALID_PARAMETER;
1934
1935 return ret;
1936 }
1937 strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
1938
1939 /* Check if file is existed */
1940 kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
1941
1942 fs_api_ret = FS_GetAttributes(filename);
1943 if (fs_api_ret < FS_NO_ERROR) {
1944 MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
1945 ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
1946
1947 return ret;
1948 }
1949
1950 /* Read MCF Internal information in NVRAM */
1951 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
1952 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
1953 ret = MCF_OTA_R_READ_NVRAM_FAIL;
1954 }
1955
1956 /* Read MCF TLV-OTA file information in NVRAM */
1957 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))) {
1958 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
1959 ret = MCF_OTA_R_READ_NVRAM_FAIL;
1960
1961 return ret;
1962 }
1963
1964 if(req->reset == KAL_TRUE){
1965 //Need to reset LID
1966 nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
1967
1968 //Clear LIDs which is add due to combine
1969 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){
1970 ret = MCF_OTA_R_INVALID_PARAMETER;
1971 return ret;
1972 }
1973
1974 /* Combine OTA file - Only apply one OTA file */
1975 ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
1976 if(ret != MCF_OTA_R_SUCCESS){
1977 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
1978 return ret;
1979 }
1980
1981 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1982 if (tlvota_file){
1983 sbp_tag.sbp_id = tlvota_file->sbp_id;
1984 kal_mem_cpy(sbp_tag.mcc, tlvota_file->mcc, MAX_MCC_STR_LEN);
1985 kal_mem_cpy(sbp_tag.mnc, tlvota_file->mnc, MAX_MNC_STR_LEN);
1986
1987 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1988
1989 }else {
1990 MD_TRC_MCF_TR_COMBINED_OTA_FILE_TAKE_READ_LOCK_FAIL();
1991 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
1992 }
1993
1994 ret = mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE, KAL_FALSE, KAL_TRUE);
1995
1996 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));
1997
1998 if(ret != MCF_OTA_R_SUCCESS){
1999 MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LAST_LID_FAIL();
2000 return ret;
2001 }
2002
2003 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
2004 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
2005 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2006
2007 return ret;
2008 }
2009
2010 }else{
2011 //Do not need to reset LID
2012 nv_int_info.not_reset_tlvota[sim_id] = KAL_TRUE;
2013
2014 /* Combine OTA file - Append OTA file*/
2015 for(i = 0; i < nv_int_info.tlvota_last_mod_lid[sim_id].lid_cnt; i++){
2016 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){
2017 nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_TRUE;
2018 }
2019 }
2020 ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
2021 if(ret != MCF_OTA_R_SUCCESS){
2022 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name);
2023 read_file_fail = KAL_TRUE;
2024 }
2025 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2026 if (tlvota_file) {
2027 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
2028 /* Check if file type is TLV-OTA file */ //If not TLVOTA file, Construct empty file header
2029 if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
2030 mcf_tool_file_info_t copy_header = {0};
2031 mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
2032
2033 MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
2034
2035 kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
2036 copy_header.file_version = 3;
2037 copy_header.operation_mask = 0;
2038 mcf_merge_make_ota_file_header(output_header, &copy_header); // copy first header to output header
2039 kal_mem_set(output_header->file_type, 0, 8);
2040 strncpy(output_header->file_type, MCF_FILE_TYPE_TLVOTA, 7);
2041 output_header->item_num = 0;
2042 output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
2043
2044 }else{
2045 kal_mem_cpy(mcf_file_buffer, tlvota_file->buff, MCF_MAX_TLVOTA_FILE_SIZE);
2046 }
2047 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2048 }
2049 ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
2050 if(ret != MCF_OTA_R_SUCCESS){
2051 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
2052 return ret;
2053 }
2054 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2055 if (tlvota_file) {
2056 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
2057 /* Check if file type is TLV-OTA file */
2058 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
2059 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
2060 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
2061 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
2062 ret = MCF_OTA_R_INVALID_FILE;
2063 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2064
2065 return ret;
2066 }
2067
2068 if(mcf_merge_ota_buffer(mcf_file_buffer, tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
2069 MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
2070 ret = MCF_OTA_R_INVALID_PARAMETER;
2071 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2072 return ret;
2073 }
2074
2075 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2076 }
2077 strncpy(fs_root_path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
2078 strncpy(curr_filename, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
2079
2080 /* Before create merged OTA file, need to delete last time merged OTA file */
2081 kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
2082 fs_ret = FS_Delete(merge_ota_name);
2083
2084 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
2085 MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
2086 ret = MCF_OTA_R_WRITE_DISK_FAIL;
2087 return ret;
2088 }
2089
2090 pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
2091 if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
2092 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
2093 ret = MCF_OTA_R_INVALID_PARAMETER;
2094 return ret;
2095 }
2096
2097 ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
2098 if (ret != MCF_OTA_R_SUCCESS) {
2099 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
2100 return ret;
2101 }
2102
2103 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
2104 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
2105 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2106
2107 return ret;
2108 }
2109
2110 }
2111
2112 if (req->trigger_dsbp == 1) {
2113 /* Read TLV-OTA file */
2114 kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
2115 read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
2116 read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
2117 read_file_info.ps_id = req->ps_id;
2118 read_file_info.start_time = kal_get_systicks();
2119
2120 ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
2121 // Store Read TLV-OTA file result for dsbp urc use
2122 set_op_read_ret[sim_id] = ret;
2123 if (ret == MCF_OTA_R_SUCCESS) {
2124 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2125 if (tlvota_file) {
2126 read_file_info.path_type = tlvota_file->path_type;
2127 strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
2128 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2129 }
2130 is_read_tlvota[sim_id] = KAL_TRUE;
2131 } else {
2132 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
2133 }
2134
2135 read_file_info.result = ret;
2136 read_file_info.end_time = kal_get_systicks();
2137
2138 mcf_em_send_ota_file_info(&read_file_info);
2139 }
2140
2141 strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
2142 strncpy(nv_tlvota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
2143
2144 }else{
2145 /*Deactivate Combine OTA setting */
2146 if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
2147 /* If MCF is in DSBP passive mode, change to DSBP active mode */
2148 ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
2149 if (ret != MCF_OTA_R_SUCCESS) {
2150 return ret;
2151 }
2152 pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
2153 }
2154
2155 kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
2156 kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
2157 kal_mem_set(nv_tlvota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
2158 kal_mem_set(nv_tlvota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
2159
2160 /* Deactivate TLV-OTA setting, reset combined setting */
2161 nv_int_info.is_combined_tlvota[sim_id] = KAL_FALSE;
2162 kal_mem_set(nv_tlvota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
2163 kal_mem_set(nv_tlvota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
2164
2165 //Need to reset LID
2166 nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
2167
2168 for(i = 0; i < nv_int_info.tlvota_last_mod_lid[sim_id].lid_cnt; i++){
2169 if(nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_TRUE){
2170 nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_FALSE;
2171 }
2172 }
2173
2174 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
2175 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
2176 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2177
2178 return ret;
2179 }
2180
2181 if (req->trigger_dsbp == 1) {
2182 /* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
2183 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2184 if (tlvota_file) {
2185 kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
2186 tlvota_file->path_type = req->path_type;
2187 strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
2188 kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
2189 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2190 } else {
2191 MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
2192 }
2193 is_read_tlvota[sim_id] = KAL_TRUE;
2194 }
2195
2196 }
2197
2198
2199 /* Write MCF TLV-OTA file information in NVRAM */
2200 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)) ) {
2201 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2202 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2203
2204 return ret;
2205 }
2206
2207 break;
2208 }
2209 case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
2210 {
2211 mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
2212 mcf_tlvota_sbp_tag_t sbp_tag;
2213
2214 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
2215 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_SIM_ID(req->ps_id, sim_id);
2216 ret = MCF_OTA_R_INVALID_PARAMETER;
2217 return ret;
2218 }
2219
2220 if (strcmp((kal_char *)req->config1, "") != 0) {
2221 if (pMcf->general_is_ignore_dsbp == KAL_FALSE) {
2222 /* If MCF is in DSBP passive mode, change to DSBP active mode */
2223 ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_TRUE, sim_id);
2224 if (ret != MCF_OTA_R_SUCCESS) {
2225 return ret;
2226 }
2227 pMcf->general_is_ignore_dsbp = KAL_TRUE;
2228 }
2229 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
2230 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2231 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
2232 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2233 } else {
2234 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_TYPE(req->path_type);
2235 ret = MCF_OTA_R_INVALID_PARAMETER;
2236
2237 return ret;
2238 }
2239 strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
2240
2241 /* Check if file is existed */
2242 kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
2243
2244 fs_api_ret = FS_GetAttributes(filename);
2245 if (fs_api_ret < FS_NO_ERROR) {
2246 MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
2247 ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
2248
2249 return ret;
2250 }
2251
2252 /* Read MCF Internal information in NVRAM */
2253 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
2254 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
2255 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2256 }
2257
2258 /* Read MCF TLV-OTA file information in NVRAM */
2259 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))) {
2260 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
2261 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2262
2263 return ret;
2264 }
2265
2266 if(req->reset == KAL_TRUE){
2267 //Need to reset LID
2268 nv_int_info.not_reset_general_tlvota = KAL_FALSE;
2269
2270 //Clear LIDs which is add due to combine
2271 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){
2272 ret = MCF_OTA_R_INVALID_PARAMETER;
2273 return ret;
2274 }
2275
2276 /* Combine OTA file - Only apply one OTA file */
2277 ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
2278 if(ret != MCF_OTA_R_SUCCESS){
2279 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
2280 return ret;
2281 }
2282 tlvota_file = &(pMcf->tlvota_file[sim_id]);
2283 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2284 if (tlvota_file){
2285 sbp_tag.sbp_id = tlvota_file->sbp_id;
2286 kal_mem_cpy(sbp_tag.mcc, tlvota_file->mcc, MAX_MCC_STR_LEN);
2287 kal_mem_cpy(sbp_tag.mnc, tlvota_file->mnc, MAX_MNC_STR_LEN);
2288
2289 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2290
2291 }else {
2292 MD_TRC_MCF_TR_COMBINED_OTA_FILE_TAKE_READ_LOCK_FAIL();
2293 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2294 }
2295 tlvota_file = &(pMcf->general_tlvota_file);
2296 ret = mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE, KAL_FALSE, KAL_TRUE);
2297
2298 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));
2299
2300 if(ret != MCF_OTA_R_SUCCESS){
2301 MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LAST_LID_FAIL();
2302 return ret;
2303 }
2304
2305 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
2306 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
2307 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2308
2309 return ret;
2310 }
2311
2312
2313 }else{
2314 //Do not need to reset LID
2315 nv_int_info.not_reset_general_tlvota = KAL_TRUE;
2316
2317 /* Combine OTA file - Append OTA file*/
2318 for(i = 0; i < nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_cnt; i++){
2319 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){
2320 nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_TRUE;
2321 }
2322 }
2323 ret = mcf_read_general_tlvota_file(KAL_FALSE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
2324 if(ret != MCF_OTA_R_SUCCESS){
2325 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name);
2326 read_file_fail = KAL_TRUE;
2327 }
2328 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2329 if (tlvota_file) {
2330 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
2331 /* Check if file type is TLV-OTA file */ //If not TLVOTA file, Construct empty file header
2332 if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
2333 mcf_tool_file_info_t copy_header = {0};
2334 mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
2335
2336 MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
2337
2338 kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
2339 copy_header.file_version = 3;
2340 copy_header.operation_mask = 0;
2341 mcf_merge_make_ota_file_header(output_header, &copy_header); // copy first header to output header
2342 kal_mem_set(output_header->file_type, 0, 8);
2343 strncpy(output_header->file_type, MCF_FILE_TYPE_TLVOTA, 7);
2344 output_header->item_num = 0;
2345 output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
2346
2347 }else{
2348 kal_mem_cpy(mcf_file_buffer, tlvota_file->buff, MCF_MAX_TLVOTA_FILE_SIZE);
2349 }
2350
2351 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2352 }
2353 ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
2354 if(ret != MCF_OTA_R_SUCCESS){
2355 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
2356 return ret;
2357 }
2358 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2359 if (tlvota_file) {
2360 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
2361 /* Check if file type is TLV-OTA file */
2362 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
2363 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
2364 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
2365 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
2366 ret = MCF_OTA_R_INVALID_FILE;
2367 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2368
2369 return ret;
2370 }
2371
2372 if(mcf_merge_ota_buffer(mcf_file_buffer, tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
2373 MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
2374 ret = MCF_OTA_R_INVALID_PARAMETER;
2375 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2376 return ret;
2377 }
2378
2379 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2380 }
2381 strncpy(fs_root_path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
2382 strncpy(curr_filename, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
2383
2384 /* Before create merged OTA file, need to delete last time merged OTA file */
2385 kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
2386 fs_ret = FS_Delete(merge_ota_name);
2387
2388 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
2389 MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
2390 ret = MCF_OTA_R_WRITE_DISK_FAIL;
2391 return ret;
2392 }
2393
2394 pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
2395 if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
2396 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
2397 ret = MCF_OTA_R_INVALID_PARAMETER;
2398 return ret;
2399 }
2400
2401 ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
2402 if (ret != MCF_OTA_R_SUCCESS) {
2403 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
2404 return ret;
2405 }
2406 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
2407 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
2408 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2409
2410 return ret;
2411 }
2412
2413 }
2414
2415 if (req->trigger_dsbp == 1) {
2416 /* Read general TLV-OTA file */
2417 kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
2418 read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
2419 read_file_info.config_type = L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN;
2420 read_file_info.ps_id = req->ps_id;
2421 read_file_info.start_time = kal_get_systicks();
2422
2423 ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
2424 if (ret == MCF_OTA_R_SUCCESS) {
2425 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2426 if (tlvota_file) {
2427 read_file_info.path_type = tlvota_file->path_type;
2428 strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
2429 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2430 }
2431 for(i = 0; i < MAX_SIM_NUM; i++){
2432 is_read_general_tlvota[i] = KAL_TRUE;
2433 }
2434 } else {
2435 MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
2436 }
2437
2438 read_file_info.result = ret;
2439 read_file_info.end_time = kal_get_systicks();
2440
2441 mcf_em_send_ota_file_info(&read_file_info);
2442 }
2443
2444 strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
2445 strncpy(nv_tlvota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
2446
2447 }else{
2448 /*Deactivate Combine OTA setting */
2449 if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
2450 /* If MCF is in DSBP active mode, change to DSBP passive mode */
2451 ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_TRUE, sim_id);
2452 if (ret != MCF_OTA_R_SUCCESS) {
2453 return ret;
2454 }
2455 pMcf->general_is_ignore_dsbp = KAL_FALSE;
2456 }
2457
2458 kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
2459 kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
2460 kal_mem_set(nv_tlvota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
2461 kal_mem_set(nv_tlvota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
2462
2463 /* Deactivate TLV-OTA setting, reset combined setting */
2464 nv_int_info.is_combined_general_tlvota = KAL_FALSE;
2465 kal_mem_set(nv_tlvota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
2466 kal_mem_set(nv_tlvota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
2467
2468 //Need to reset LID
2469 nv_int_info.not_reset_general_tlvota = KAL_FALSE;
2470
2471 for(i = 0; i < nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_cnt; i++){
2472 if(nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_TRUE){
2473 nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_FALSE;
2474 }
2475 }
2476
2477 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
2478 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
2479 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2480
2481 return ret;
2482 }
2483
2484 if (req->trigger_dsbp == 1) {
2485 /* Deactivate general TLV-OTA setting, reset general TLV-OTA buffer */
2486 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2487 if (tlvota_file) {
2488 kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
2489 tlvota_file->path_type = req->path_type;
2490 strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
2491 tlvota_file->last_mod_time = 0;
2492 kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
2493 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2494 } else {
2495 MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
2496 }
2497 for(i = 0; i < MAX_SIM_NUM; i++){
2498 is_read_general_tlvota[i] = KAL_TRUE;
2499 }
2500 }
2501
2502 }
2503
2504 /* Write MCF TLV-OTA file information in NVRAM */
2505 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)) ) {
2506 MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
2507 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2508
2509 return ret;
2510 }
2511 break;
2512 }
2513
2514 default:
2515 {
2516 MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_CONFIG_TYPE(req->config_type);
2517 ret = MCF_OTA_R_INVALID_PARAMETER;
2518 break;
2519 }
2520
2521 }
2522
2523
2524 return ret;
2525}
2526#endif
2527_STATIC mcf_ota_result_e mcf_set_file_path(l4c_mcf_set_config_req_struct *req)
2528{
2529 mcf_t *pMcf = mcf_get_instance();
2530 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
2531 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
2532 mcf_tool_file_info_t *pFile;
2533 kal_uint32 i = 0;
2534
2535 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
2536 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
2537 ret = MCF_OTA_R_INVALID_PARAMETER;
2538 return ret;
2539 }
2540
2541 switch (req->op)
2542 {
2543 case L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH:
2544 {
2545 nvram_ef_mcf_ota_file_info_struct nv_ota_file;
2546 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
2547
2548 if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
2549 /* If MCF is in DSBP active mode, change to DSBP passive mode */
2550 ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
2551 if (ret != MCF_OTA_R_SUCCESS) {
2552 return ret;
2553 }
2554 pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
2555 }
2556
2557 /* Read MCF OTA file information in NVRAM */
2558 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))) {
2559 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
2560 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2561
2562 return ret;
2563 }
2564
2565 MD_TRC_MCF_TR_SET_OTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2);
2566 if (strcmp((kal_char *)req->config1, "") != 0) {
2567 strncpy(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2568 strncpy(nv_ota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
2569 } else {
2570 strncpy(nv_ota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
2571 strncpy(nv_ota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
2572 }
2573 MD_TRC_MCF_TR_SET_OTA_FILE_PATH_MD((kal_char *)nv_ota_file.path, (kal_char *)nv_ota_file.name);
2574
2575 /* Write MCF OTA file information in NVRAM */
2576 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)) ) {
2577 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
2578 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2579
2580 return ret;
2581 }
2582
2583 /* Read MCF TLV-OTA file information in NVRAM */
2584 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))) {
2585 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2586 ret = KAL_FALSE;
2587
2588 return MCF_OTA_R_READ_NVRAM_FAIL;
2589 }
2590
2591 MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_AP((kal_char *)req->config3, (kal_char *)req->config4, req->ps_id);
2592 if (strcmp((kal_char *)req->config3, "") != 0) {
2593 strncpy(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2594 strncpy(nv_tlvota_file.name, (kal_char *)req->config4, MCF_FILE_MAX_NAME_LEN - 1);
2595 } else {
2596 strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
2597 strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
2598 }
2599 MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_MD((kal_char *)nv_tlvota_file.path, (kal_char *)nv_tlvota_file.name, sim_id);
2600
2601 /* Write MCF TLV-OTA file information in NVRAM */
2602 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)) ) {
2603 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2604 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2605
2606 return ret;
2607 }
2608
2609 break;
2610 }
2611
2612 case L4C_MCF_CONFIG_SET_OTA_FILE_PATH:
2613 {
2614 nvram_ef_mcf_ota_file_info_struct nv_ota_file;
2615
2616 if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
2617 /* If MCF is in DSBP active mode, change to DSBP passive mode */
2618 ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
2619 if (ret != MCF_OTA_R_SUCCESS) {
2620 return ret;
2621 }
2622 pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
2623 }
2624
2625 /* Read MCF OTA file information in NVRAM */
2626 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))) {
2627 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
2628 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2629
2630 return ret;
2631 }
2632
2633 MD_TRC_MCF_TR_SET_OTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2);
2634 if (strcmp((kal_char *)req->config1, "") != 0) {
2635 strncpy(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2636 strncpy(nv_ota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
2637 } else {
2638 strncpy(nv_ota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
2639 strncpy(nv_ota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
2640 }
2641 MD_TRC_MCF_TR_SET_OTA_FILE_PATH_MD((kal_char *)nv_ota_file.path, (kal_char *)nv_ota_file.name);
2642
2643 /* Write MCF OTA file information in NVRAM */
2644 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)) ) {
2645 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
2646 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2647
2648 return ret;
2649 }
2650
2651 break;
2652 }
2653
2654 case L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH:
2655 {
2656 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
2657
2658 if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
2659 /* If MCF is in DSBP active mode, change to DSBP passive mode */
2660 ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
2661 if (ret != MCF_OTA_R_SUCCESS) {
2662 return ret;
2663 }
2664 pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
2665 }
2666
2667 /* Read MCF TLV-OTA file information in NVRAM */
2668 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))) {
2669 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2670 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2671
2672 return ret;
2673 }
2674
2675 MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2, req->ps_id);
2676 if (strcmp((kal_char *)req->config1, "") != 0) {
2677 strncpy(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2678 strncpy(nv_tlvota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
2679 } else {
2680 strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
2681 strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
2682 }
2683 MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_MD((kal_char *)nv_tlvota_file.path, (kal_char *)nv_tlvota_file.name, sim_id);
2684
2685 /* Write MCF TLV-OTA file information in NVRAM */
2686 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)) ) {
2687 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2688 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2689
2690 return ret;
2691 }
2692
2693 break;
2694 }
2695
2696 case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
2697 {
2698 if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
2699 /* If MCF is in DSBP passive mode, change to DSBP active mode */
2700 ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
2701 if (ret != MCF_OTA_R_SUCCESS) {
2702 return ret;
2703 }
2704 pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
2705 }
2706 pMcf->dsbp_cnf_ret = KAL_TRUE;
2707 pMcf->dsbp_ind_ret = KAL_TRUE;
2708
2709 switch (req->config_type)
2710 {
2711 case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
2712 {
2713 nvram_ef_mcf_ota_file_info_struct nv_ota_file;
2714 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
2715 kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
2716 kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
2717 kal_bool is_get_custom_filename = KAL_FALSE;
2718 kal_int32 fs_api_ret;
2719 kal_uint8 path_type;
2720
2721 if (nv_int_info.not_reset_ota == KAL_TRUE) {
2722 /* If MCF is in not reset mode, change to reset mode */
2723 ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
2724 if (ret != MCF_OTA_R_SUCCESS) {
2725 return ret;
2726 }
2727 nv_int_info.not_reset_ota = KAL_FALSE;
2728 }
2729
2730 if (strcmp((kal_char *)req->config1, "") != 0) {
2731 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
2732 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2733 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
2734 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2735 } else {
2736 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
2737 ret = MCF_OTA_R_INVALID_PARAMETER;
2738
2739 return ret;
2740 }
2741 strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
2742 } else {
2743 is_get_custom_filename = mcf_get_custom_file_path_name(&path_type, curr_filename);
2744 if (is_get_custom_filename == KAL_TRUE) {
2745 if (path_type >= L4C_MCF_PATH_TYPE_MAX) {
2746 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
2747 ret = MCF_OTA_R_INVALID_PARAMETER;
2748
2749 return ret;
2750 }
2751
2752 if (path_type == L4C_MCF_PATH_TYPE_OTA) {
2753 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2754 } else if (path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
2755 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2756 }
2757 } else {
2758 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2759 strncpy(curr_filename, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_MD_PATH_LEN - 1);
2760 }
2761 }
2762
2763 /* Check if file is existed */
2764 kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
2765
2766 fs_api_ret = FS_GetAttributes(filename);
2767 if (fs_api_ret < FS_NO_ERROR) {
2768 MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, curr_filename);
2769 ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
2770
2771 return ret;
2772 }
2773
2774 /* Write MCF OTA file information to NVRAM */
2775 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))) {
2776 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
2777 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2778
2779 return ret;
2780 }
2781
2782 strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
2783 strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
2784
2785 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)) ) {
2786 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
2787 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2788
2789 return ret;
2790 }
2791
2792 break;
2793 }
2794
2795 case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
2796 {
2797 mcf_tlvota_file_t *tlvota_file;
2798 mcf_tool_file_info_t *pFile;
2799 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
2800 em_mcf_read_ota_file_info_struct read_file_info;
2801 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
2802 kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
2803 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
2804 l4c_mcf_path_type_enum apply_path_type;
2805 kal_int32 fs_api_ret;
2806
2807 if (nv_int_info.not_reset_tlvota[sim_id] == KAL_TRUE) {
2808 /* If MCF is in DSBP active mode, change to DSBP passive mode */
2809 ret = mcf_set_not_reset(KAL_FALSE, req->config_type, sim_id);
2810 if (ret != MCF_OTA_R_SUCCESS) {
2811 return ret;
2812 }
2813 nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
2814 }
2815
2816 tlvota_file = &(pMcf->tlvota_file[sim_id]);
2817
2818 if (strcmp((kal_char *)req->config1, "") != 0) {
2819 /* Check if file is existed */
2820 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
2821 kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
2822 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2823 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
2824 kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
2825 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
2826 } else {
2827 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
2828 ret = MCF_OTA_R_INVALID_PARAMETER;
2829
2830 return ret;
2831 }
2832
2833 fs_api_ret = FS_GetAttributes(filename);
2834 if (fs_api_ret < FS_NO_ERROR) {
2835 MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
2836 ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
2837
2838 return ret;
2839 }
2840
2841 /* Read MCF TLV-OTA file information in NVRAM */
2842 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))) {
2843 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2844 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2845
2846 return ret;
2847 }
2848
2849 strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
2850 strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
2851
2852 /* Write MCF TLV-OTA file information in NVRAM */
2853 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)) ) {
2854 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2855 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2856
2857 return ret;
2858 }
2859
2860 kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
2861 read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
2862 read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
2863 read_file_info.ps_id = req->ps_id;
2864 read_file_info.start_time = kal_get_systicks();
2865
2866 /* Read TLV-OTA file */
2867 ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
2868 // Store Read TLV-OTA file result for dsbp urc use
2869 set_op_read_ret[sim_id] = ret;
2870 if (ret == MCF_OTA_R_SUCCESS) {
2871 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2872 if (tlvota_file) {
2873 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
2874
2875 /* Do not trigger DSBP if the same file as last one */
2876 if ( (tlvota_file->last_file.path_type == apply_path_type) &&
2877 (strncmp(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) &&
2878 (strncmp(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len) == 0) &&
2879 (strncmp(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len) == 0) ) {
2880 MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_CHANGE(0, tlvota_file->last_file.path_type);
2881 dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.name);
2882 dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.sw_version);
2883 dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.gen_time);
2884 ret = MCF_OTA_R_FILE_NOT_CHANGE;
2885 } else {
2886 /* Store temp updated file informantion */
2887 kal_mem_set(&(tlvota_file->temp_file), 0, sizeof(mcf_file_info_t));
2888 tlvota_file->temp_file.path_type = apply_path_type;
2889 strncpy(tlvota_file->temp_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
2890 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
2891 strncpy(tlvota_file->temp_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
2892 tlvota_file->temp_file.sw_version[pFile->sw_version_len] = '\0';
2893 } else {
2894 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_VERSION(pFile->sw_version_len);
2895 }
2896 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
2897 strncpy(tlvota_file->temp_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
2898 tlvota_file->temp_file.gen_time[pFile->gen_time_len] = '\0';
2899 } else {
2900 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_GEN_TIME(pFile->gen_time_len);
2901 }
2902
2903 read_file_info.path_type = tlvota_file->path_type;
2904 strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
2905 }
2906 /* Check if file type is TLV-OTA file */
2907 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
2908 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
2909 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
2910 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
2911 com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_FILE;
2912 }
2913 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2914 }else{
2915 MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
2916 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
2917 return ret;
2918 }
2919 is_read_tlvota[sim_id] = KAL_TRUE;
2920 } else {
2921 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
2922 }
2923
2924 read_file_info.result = ret;
2925 read_file_info.end_time = kal_get_systicks();
2926
2927 mcf_em_send_ota_file_info(&read_file_info);
2928 } else {
2929 /* Read MCF TLV-OTA file information in NVRAM */
2930 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))) {
2931 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2932 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2933
2934 return ret;
2935 }
2936
2937 strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
2938 strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
2939
2940 /* Write MCF TLV-OTA file information in NVRAM */
2941 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)) ) {
2942 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
2943 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
2944
2945 return ret;
2946 }
2947
2948 /* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
2949 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2950 if (tlvota_file) {
2951 kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
2952 tlvota_file->path_type = req->path_type;
2953 strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
2954 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2955 } else {
2956 MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
2957 }
2958
2959 /* Do not trigger DSBP if no last file */
2960 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2961 if (tlvota_file) {
2962 if (strncmp(tlvota_file->last_file.name, "", MCF_FILE_MAX_NAME_LEN) == 0) {
2963 MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_CHANGE(1, tlvota_file->last_file.path_type);
2964 ret = MCF_OTA_R_FILE_NOT_CHANGE;
2965 } else {
2966 /* Clear last updated file informantion */
2967 kal_mem_set(&(tlvota_file->temp_file), 0, sizeof(mcf_file_info_t));
2968 }
2969 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
2970 } else {
2971 MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
2972 }
2973 is_read_tlvota[sim_id] = KAL_TRUE;
2974 }
2975
2976 break;
2977 }
2978
2979 default:
2980 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
2981 ret = MCF_OTA_R_INVALID_PARAMETER;
2982 break;
2983 }
2984
2985 break;
2986 }
2987
2988 case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
2989 {
2990 kal_bool is_combine = KAL_FALSE;
2991
2992 /* Read MCF Internal information in NVRAM */
2993 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
2994 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
2995 ret = MCF_OTA_R_READ_NVRAM_FAIL;
2996
2997 return ret;
2998 }
2999 pMcf->dsbp_cnf_ret = KAL_TRUE;
3000 pMcf->dsbp_ind_ret = KAL_TRUE;
3001
3002 switch (req->config_type)
3003 {
3004 case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
3005 {
3006 nvram_ef_mcf_ota_file_info_struct nv_ota_file;
3007 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
3008 kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
3009 kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
3010 kal_int32 fs_api_ret;
3011
3012 is_combine = nv_int_info.is_combined_ota;
3013
3014 if(is_combine == KAL_FALSE){
3015 if (nv_int_info.not_reset_ota == KAL_TRUE) {
3016 /* If MCF is in DSBP active mode, change to DSBP passive mode */
3017 ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
3018 if (ret != MCF_OTA_R_SUCCESS) {
3019 return ret;
3020 }
3021 nv_int_info.not_reset_ota = KAL_FALSE;
3022 }
3023 if (strcmp((kal_char *)req->config1, "") != 0) {
3024 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
3025 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
3026 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
3027 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
3028 } else {
3029 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
3030 ret = MCF_OTA_R_INVALID_PARAMETER;
3031
3032 return ret;
3033 }
3034 strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
3035 /* Check if file is existed */
3036 kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
3037
3038 fs_api_ret = FS_GetAttributes(filename);
3039 if (fs_api_ret < FS_NO_ERROR) {
3040 MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, curr_filename);
3041 ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
3042
3043 return ret;
3044 }
3045
3046 /* Write MCF OTA file information to NVRAM */
3047 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))) {
3048 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
3049 ret = MCF_OTA_R_READ_NVRAM_FAIL;
3050
3051 return ret;
3052 }
3053
3054 strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
3055 strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
3056
3057 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)) ) {
3058 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
3059 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
3060
3061 return ret;
3062 }
3063 } else {
3064 /* Write MCF OTA file information to NVRAM */
3065 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))) {
3066 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
3067 ret = MCF_OTA_R_READ_NVRAM_FAIL;
3068
3069 return ret;
3070 }
3071
3072 kal_mem_set(nv_ota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN - 1);
3073 kal_mem_set(nv_ota_file.name, 0, MCF_FILE_MAX_NAME_LEN - 1);
3074
3075 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)) ) {
3076 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
3077 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
3078
3079 return ret;
3080 }
3081 }
3082 }else{
3083#ifdef __MCF_COMBINE_FILE_SUPPORT__
3084 ret = mcf_combined_ota_file(req);
3085 if(ret != MCF_OTA_R_SUCCESS){
3086 return ret;
3087 }
3088#else
3089 ret = MCF_OTA_R_MCF_NOT_SUPPORT;
3090 return ret;
3091#endif
3092 }
3093
3094 break;
3095 }
3096
3097 case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
3098 {
3099 mcf_tlvota_file_t *tlvota_file;
3100 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
3101 em_mcf_read_ota_file_info_struct read_file_info;
3102 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
3103 kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
3104 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
3105 l4c_mcf_path_type_enum apply_path_type;
3106 kal_int32 fs_api_ret;
3107
3108 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
3109 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
3110 ret = MCF_OTA_R_INVALID_PARAMETER;
3111
3112 return ret;
3113 }
3114
3115 tlvota_file = &(pMcf->tlvota_file[sim_id]);
3116
3117 is_combine = nv_int_info.is_combined_tlvota[sim_id];
3118 if(is_combine == KAL_FALSE){
3119 if (nv_int_info.not_reset_tlvota[sim_id] == KAL_TRUE) {
3120 /* If MCF is in DSBP active mode, change to DSBP passive mode */
3121 ret = mcf_set_not_reset(KAL_FALSE, req->config_type, sim_id);
3122 if (ret != MCF_OTA_R_SUCCESS) {
3123 return ret;
3124 }
3125 nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
3126 }
3127 if (strcmp((kal_char *)req->config1, "") != 0) {
3128 if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
3129 /* If MCF is in DSBP passive mode, change to DSBP active mode */
3130 ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
3131 if (ret != MCF_OTA_R_SUCCESS) {
3132 return ret;
3133 }
3134 pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
3135 }
3136
3137 /* Check if file is existed */
3138 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
3139 kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
3140 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
3141 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
3142 kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
3143 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
3144 } else {
3145 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
3146 ret = MCF_OTA_R_INVALID_PARAMETER;
3147
3148 return ret;
3149 }
3150
3151 fs_api_ret = FS_GetAttributes(filename);
3152 if (fs_api_ret < FS_NO_ERROR) {
3153 MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
3154 ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
3155
3156 return ret;
3157 }
3158
3159 /* Read MCF TLV-OTA file information in NVRAM */
3160 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))) {
3161 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
3162 ret = MCF_OTA_R_READ_NVRAM_FAIL;
3163
3164 return ret;
3165 }
3166
3167 strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
3168 strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
3169
3170 /* Write MCF TLV-OTA file information in NVRAM */
3171 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)) ) {
3172 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
3173 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
3174
3175 return ret;
3176 }
3177
3178 if (req->trigger_dsbp == 1) {
3179 /* Read TLV-OTA file */
3180 kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
3181 read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
3182 read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
3183 read_file_info.ps_id = req->ps_id;
3184 read_file_info.start_time = kal_get_systicks();
3185
3186 ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
3187 // Store Read TLV-OTA file result for dsbp urc use
3188 set_op_read_ret[sim_id] = ret;
3189 if (ret == MCF_OTA_R_SUCCESS) {
3190 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3191 if (tlvota_file) {
3192 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
3193
3194 /* Store last updated file informantion */
3195 tlvota_file->last_file.path_type = apply_path_type;
3196 strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
3197 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
3198 strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
3199 tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
3200 } else {
3201 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_VERSION(pFile->sw_version_len);
3202 }
3203 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
3204 strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
3205 tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
3206 } else {
3207 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_GEN_TIME(pFile->gen_time_len);
3208 }
3209 /* Check if file type is TLV-OTA file */
3210 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
3211 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
3212 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
3213 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
3214 com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_FILE;
3215 }
3216 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3217 }else{
3218 MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
3219 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
3220 return ret;
3221 }
3222 read_file_info.path_type = tlvota_file->path_type;
3223 strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
3224 is_read_tlvota[sim_id] = KAL_TRUE;
3225 } else {
3226 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
3227 }
3228
3229 read_file_info.result = ret;
3230 read_file_info.end_time = kal_get_systicks();
3231
3232 mcf_em_send_ota_file_info(&read_file_info);
3233
3234 }
3235 } else {
3236 if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
3237 /* If MCF is in DSBP active mode, change to DSBP passive mode */
3238 ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
3239 if (ret != MCF_OTA_R_SUCCESS) {
3240 return ret;
3241 }
3242 pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
3243 }
3244
3245 /* Read MCF TLV-OTA file information in NVRAM */
3246 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))) {
3247 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
3248 ret = MCF_OTA_R_READ_NVRAM_FAIL;
3249
3250 return ret;
3251 }
3252
3253 strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
3254 strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
3255
3256 /* Write MCF TLV-OTA file information in NVRAM */
3257 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)) ) {
3258 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
3259 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
3260
3261 return ret;
3262 }
3263
3264 if (req->trigger_dsbp == 1) {
3265 /* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
3266 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3267 if (tlvota_file) {
3268 kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
3269 tlvota_file->path_type = req->path_type;
3270 strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
3271 tlvota_file->last_mod_time = 0;
3272 /* Clear last updated file informantion */
3273 kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
3274 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3275 } else {
3276 MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
3277 }
3278 is_read_tlvota[sim_id] = KAL_TRUE;
3279 }
3280 }
3281 }else{
3282#ifdef __MCF_COMBINE_FILE_SUPPORT__
3283 ret = mcf_combined_ota_file(req);
3284 if(ret != MCF_OTA_R_SUCCESS){
3285 return ret;
3286 }
3287#else
3288 ret = MCF_OTA_R_MCF_NOT_SUPPORT;
3289 return ret;
3290#endif
3291 }
3292
3293 break;
3294 }
3295
3296 case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
3297 {
3298 mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
3299 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
3300 em_mcf_read_ota_file_info_struct read_file_info;
3301 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
3302 kal_wchar filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
3303 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
3304 l4c_mcf_path_type_enum apply_path_type;
3305 kal_int32 fs_api_ret;
3306
3307 is_combine = nv_int_info.is_combined_general_tlvota;
3308 if(is_combine == KAL_FALSE){
3309 if (nv_int_info.not_reset_general_tlvota == KAL_TRUE) {
3310 /* If MCF is in DSBP active mode, change to DSBP passive mode */
3311 ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
3312 if (ret != MCF_OTA_R_SUCCESS) {
3313 return ret;
3314 }
3315 nv_int_info.not_reset_general_tlvota = KAL_FALSE;
3316 }
3317 if (strcmp((kal_char *)req->config1, "") != 0) {
3318 if (pMcf->general_is_ignore_dsbp == KAL_FALSE) {
3319 /* If MCF is in DSBP passive mode, change to DSBP active mode */
3320 ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_TRUE, sim_id);
3321 if (ret != MCF_OTA_R_SUCCESS) {
3322 return ret;
3323 }
3324 pMcf->general_is_ignore_dsbp = KAL_TRUE;
3325 }
3326 /* Check if file is existed */
3327 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
3328 kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
3329 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
3330 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
3331 kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
3332 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
3333 } else {
3334 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
3335 ret = MCF_OTA_R_INVALID_PARAMETER;
3336
3337 return ret;
3338 }
3339
3340 fs_api_ret = FS_GetAttributes(filename);
3341 if (fs_api_ret < FS_NO_ERROR) {
3342 MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
3343 ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
3344
3345 return ret;
3346 }
3347
3348 /* Read MCF general TLV-OTA file information in NVRAM */
3349 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))) {
3350 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
3351 ret = MCF_OTA_R_READ_NVRAM_FAIL;
3352
3353 return ret;
3354 }
3355
3356 strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
3357 strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
3358
3359 /* Write MCF general TLV-OTA file information in NVRAM */
3360 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)) ) {
3361 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
3362 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
3363
3364 return ret;
3365 }
3366
3367 if (req->trigger_dsbp == 1) {
3368 /* Read general TLV-OTA file */
3369 kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
3370 read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
3371 read_file_info.config_type = L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN;
3372 read_file_info.ps_id = req->ps_id;
3373 read_file_info.start_time = kal_get_systicks();
3374
3375 ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
3376 if (ret == MCF_OTA_R_SUCCESS) {
3377 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3378 if (tlvota_file) {
3379 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
3380
3381 /* Store last updated file informantion */
3382 tlvota_file->last_file.path_type = apply_path_type;
3383 strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
3384 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
3385 strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
3386 tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
3387 } else {
3388 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
3389 }
3390 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
3391 strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
3392 tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
3393 } else {
3394 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
3395 }
3396 /* Check if file type is TLV-OTA file */
3397 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
3398 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
3399 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
3400 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
3401 }
3402 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3403 }else{
3404 MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
3405 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
3406 return ret;
3407 }
3408 read_file_info.path_type = tlvota_file->path_type;
3409 strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
3410 for(i = 0; i < MAX_SIM_NUM; i++){
3411 is_read_general_tlvota[i] = KAL_TRUE;
3412 }
3413 } else {
3414 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
3415 }
3416
3417 read_file_info.result = ret;
3418 read_file_info.end_time = kal_get_systicks();
3419
3420 mcf_em_send_ota_file_info(&read_file_info);
3421 }
3422 } else {
3423 if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
3424 /* If MCF is in DSBP passive mode, change to DSBP active mode */
3425 ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_TRUE, sim_id);
3426 if (ret != MCF_OTA_R_SUCCESS) {
3427 return ret;
3428 }
3429 pMcf->general_is_ignore_dsbp = KAL_FALSE;
3430 }
3431 /* Read MCF general TLV-OTA file information in NVRAM */
3432 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))) {
3433 MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
3434 ret = MCF_OTA_R_READ_NVRAM_FAIL;
3435
3436 return ret;
3437 }
3438
3439 strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
3440 strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
3441
3442 /* Write MCF general TLV-OTA file information in NVRAM */
3443 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)) ) {
3444 MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
3445 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
3446
3447 return ret;
3448 }
3449
3450 if (req->trigger_dsbp == 1) {
3451 /* Deactivate general TLV-OTA setting, reset general TLV-OTA buffer */
3452 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3453 if (tlvota_file) {
3454 kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
3455 tlvota_file->path_type = req->path_type;
3456 strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
3457 tlvota_file->last_mod_time = 0;
3458 /* Clear last updated file informantion */
3459 kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
3460 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3461 } else {
3462 MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
3463 }
3464 for(i = 0; i < MAX_SIM_NUM; i++){
3465 is_read_general_tlvota[i] = KAL_TRUE;
3466 }
3467 }
3468 }
3469 }else{
3470#ifdef __MCF_COMBINE_FILE_SUPPORT__
3471 ret = mcf_combined_ota_file(req);
3472 if(ret != MCF_OTA_R_SUCCESS){
3473 return ret;
3474 }
3475#else
3476 ret = MCF_OTA_R_MCF_NOT_SUPPORT;
3477 return ret;
3478#endif
3479 }
3480
3481 break;
3482 }
3483
3484 default:
3485 MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
3486 ret = MCF_OTA_R_INVALID_PARAMETER;
3487 break;
3488 }
3489
3490 break;
3491 }
3492
3493 default:
3494 ASSERT(0);
3495 ret = MCF_OTA_R_INVALID_PARAMETER;
3496 }
3497
3498 return ret;
3499}
3500
3501_STATIC mcf_ota_result_e mcf_get_applied_file_path(
3502 l4c_mcf_get_config_req_struct *req,
3503 l4c_mcf_get_config_cnf_struct *resp)
3504{
3505 mcf_t *pMcf = mcf_get_instance();
3506 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
3507 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
3508
3509 switch (req->op)
3510 {
3511 case L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH:
3512 switch (req->config_type)
3513 {
3514 case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
3515 {
3516 mcf_ota_file_t *ota_file = &(pMcf->ota_file);
3517
3518 resp->config_type = req->config_type;
3519
3520 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
3521 if (ota_file) {
3522 resp->path_type = ota_file->path_type;
3523 strncpy((kal_char *)resp->config1, ota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
3524 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
3525 } else {
3526 MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
3527 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
3528 }
3529 break;
3530 }
3531
3532 case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
3533 {
3534 mcf_tlvota_file_t *tlvota_file = &(pMcf->tlvota_file[sim_id]);
3535
3536 resp->config_type = req->config_type;
3537
3538 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3539 if (tlvota_file) {
3540 resp->path_type = tlvota_file->path_type;
3541 strncpy((kal_char *)resp->config1, tlvota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
3542 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3543 } else {
3544 MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
3545 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
3546 }
3547 break;
3548 }
3549
3550 case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
3551 {
3552 mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
3553
3554 resp->config_type = req->config_type;
3555
3556 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3557 if (tlvota_file) {
3558 resp->path_type = tlvota_file->path_type;
3559 strncpy((kal_char *)resp->config1, tlvota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
3560 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
3561 } else {
3562 MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
3563 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
3564 }
3565 break;
3566 }
3567
3568 default:
3569 MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_UNSUPPORTED_CONFIG_TYPE(req->config_type);
3570 ret = MCF_OTA_R_INVALID_PARAMETER;
3571 break;
3572 }
3573 MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH(ret, req->ps_id, sim_id, req->config_type, resp->path_type, resp->config1);
3574 break;
3575
3576 default:
3577 ASSERT(0);
3578 ret = MCF_OTA_R_INVALID_PARAMETER;
3579 }
3580
3581 return ret;
3582}
3583
3584_STATIC mcf_ota_result_e mcf_dump_all_lid_data(l4c_mcf_dump_data_req_struct *req_ptr)
3585{
3586 mcf_t *pMcf = mcf_get_instance();
3587 mcf_custom_dump_param_struct dump_para[MAX_SIM_NUM];
3588 mcf_dump_lid_header_struct dump_lid_header;
3589 mcf_dump_lid_header_struct *dump_header_ptr = NULL;
3590 nvram_ltable_entry_struct lid_info = {0};
3591 time_t time_sec;
3592 MCF_TIME_STRUCT curr_time;
3593 kal_wchar foldername[MCF_FILE_MAX_MD_PATH_LEN];
3594 kal_char folder_path[MCF_FILE_MAX_MD_PATH_LEN];
3595 kal_char file_name[MCF_FILE_MAX_MD_PATH_LEN];
3596 kal_uint32 total_size;
3597 kal_uint32 lid_size;
3598 kal_uint32 padding;
3599 kal_uint32 i, j, k;
3600 kal_bool is_found = KAL_FALSE;
3601 kal_bool ret;
3602 nvram_errno_enum nvram_api_ret;
3603 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
3604 kal_uint32 dump_lid_cnt = 0;
3605 kal_uint32 m;
3606 kal_char last_dump_folder_name[MCF_FILE_MAX_MD_PATH_LEN];
3607 kal_int32 fs_ret = FS_NO_ERROR;
3608 kal_wchar pathname[MCF_FILE_MAX_MD_PATH_LEN];
3609 kal_int32 ret_snprintf;
3610 kal_int32 ret_sprintf;
3611 time_t time_ret;
3612
3613 /* Create dump folder */
3614 time_ret = time(&time_sec);
3615 if (time_ret == (time_t)(-1)){
3616 time_sec = 0;
3617 }
3618#if __MTK_TARGET__
3619 localtime_r(&time_sec, &curr_time);
3620#else
3621 curr_time.tm_year = 12;
3622 curr_time.tm_mon = 3;
3623 curr_time.tm_mday = 4;
3624 curr_time.tm_hour = 5;
3625 curr_time.tm_min = 6;
3626 curr_time.tm_sec = 7;
3627#endif
3628 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');
3629
3630 kal_wsprintf(foldername, "%s\0", folder_path);
3631 FS_CreateDir(foldername);
3632
3633 /* Support MCF Tool Read/Write - Delete txt */
3634
3635 kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_DUMP_FOLDER_NAME);
3636 fs_ret = FS_Delete(pathname);
3637
3638 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
3639 MD_TRC_MCF_TR_DUMP_ALL_LID_DELETE_FILE_FAIL(fs_ret);
3640 mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
3641 return mcf_ret;
3642 }
3643
3644 MD_TRC_MCF_TR_DUMP_ALL_LID_START(folder_path);
3645
3646 kal_mem_set(dump_para, 0, sizeof(mcf_custom_dump_param_struct) * MAX_SIM_NUM);
3647 for (k = 0; k < MAX_SIM_NUM; k++) {
3648 dump_para[k].ps_id = l4c_gemini_get_switched_sim_id(k);
3649 dump_para[k].sbp_id = pMcf->tlvota_file[k].sbp_id;
3650 kal_mem_cpy(&(dump_para[k].mcc), &(pMcf->tlvota_file[k].mcc), MAX_MCC_STR_LEN);
3651 kal_mem_cpy(&(dump_para[k].mnc), &(pMcf->tlvota_file[k].mnc), MAX_MNC_STR_LEN);
3652 kal_mem_cpy(&(dump_para[k].iccid), &(pMcf->tlvota_file[k].iccid), 21);
3653 dump_para[k].size = &lid_size;
3654 }
3655
3656 dump_lid_cnt = req_ptr->lid_cnt;
3657 MD_TRC_MCF_TR_DUMP_ALL_LID_NUMBER(dump_lid_cnt);
3658
3659 /* Dump all LIDs */
3660 if(dump_lid_cnt == 0){
3661 for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
3662 is_found = KAL_FALSE;
3663
3664 nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
3665 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
3666 MD_TRC_MCF_TR_DUMP_ALL_LID_GET_LID_INFO_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
3667 continue;
3668 }
3669
3670 if ((lid_info.size % 4) == 0) {
3671 padding = 0;
3672 } else {
3673 padding = 4 - (lid_info.size % 4);
3674 MD_TRC_MCF_TR_DUMP_ALL_LID_SIZE_NOT_ALIGNMENT(lid_info.LID, lid_info.size, padding);
3675 }
3676
3677 for (j = 0; j < mcf_dump_param_tbl_num; j++) {
3678 if ( (mcf_dump_param_tbl[j].lid == mcf_db_lid_mapping_tbl[i].lid_num) ) {
3679 is_found = KAL_TRUE;
3680
3681 if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
3682 total_size = 0;
3683
3684 if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
3685 for (k = 0; k < lid_info.total_records; k++) {
3686 dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
3687 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
3688
3689 dump_para[0].lid = mcf_dump_param_tbl[j].lid;
3690 dump_para[0].type = MCF_TYPE_OTA;
3691 dump_para[0].record_idx = k + 1;
3692 dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
3693 *(dump_para[0].size) = 0;
3694
3695 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);
3696
3697 ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[0]);
3698 if ( (ret == KAL_FALSE) || (*(dump_para[0].size) != lid_info.size) ) {
3699 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));
3700 break;
3701 }
3702
3703 /* Add header */
3704 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
3705 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
3706 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
3707 dump_lid_header.content_type = MCF_TYPE_OTA;
3708 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
3709 dump_lid_header.content_len = lid_info.size;
3710 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
3711 dump_lid_header.record_idx = k + 1;
3712 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
3713 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
3714 dump_lid_header.checksum = 0; /* unused */
3715 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
3716
3717 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
3718 }
3719 } else {
3720 /* If not register callback */
3721 for (k = 0; k < lid_info.total_records; k++) {
3722 dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
3723 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
3724
3725 dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
3726
3727 if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
3728 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);
3729 break;
3730 }
3731
3732 /* Add header */
3733 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
3734 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
3735 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
3736 dump_lid_header.content_type = MCF_TYPE_OTA;
3737 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
3738 dump_lid_header.content_len = lid_info.size;
3739 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
3740 dump_lid_header.record_idx = k + 1;
3741 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
3742 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
3743 dump_lid_header.checksum = 0; /* unused */
3744 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
3745
3746 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
3747 }
3748 }
3749
3750 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');
3751 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
3752 strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
3753 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
3754 }
3755 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
3756 if (mcf_ret != MCF_OTA_R_SUCCESS) {
3757 return mcf_ret;
3758 }
3759 }
3760
3761 if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
3762 if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
3763 for (k = 0; k < MAX_SIM_NUM; k++) {
3764 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) ) {
3765 MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
3766 continue;
3767 }
3768
3769 total_size = 0;
3770
3771 dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
3772 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
3773
3774 dump_para[k].lid = mcf_dump_param_tbl[j].lid;
3775 dump_para[k].type = MCF_TYPE_OTA_BY_OP;
3776 dump_para[k].record_idx = 1;
3777 dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
3778 *(dump_para[k].size) = 0;
3779
3780 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);
3781 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);
3782
3783 ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[k]);
3784 if ( (ret == KAL_FALSE) || (*(dump_para[k].size) != lid_info.size) ) {
3785 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));
3786 break;
3787 }
3788
3789 /* Add header */
3790 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
3791 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
3792 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
3793 dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
3794 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
3795 dump_lid_header.content_len = lid_info.size;
3796 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
3797 dump_lid_header.record_idx = 1;
3798 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
3799 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
3800 dump_lid_header.checksum = 0; /* unused */
3801 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
3802
3803 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
3804
3805 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');
3806 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
3807 strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
3808 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
3809 }
3810 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
3811 if (mcf_ret != MCF_OTA_R_SUCCESS) {
3812 return mcf_ret;
3813 }
3814 }
3815 } else {
3816 /* If not register callback */
3817 for (k = 0; k < MAX_SIM_NUM; k++) {
3818 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) ) {
3819 MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
3820 continue;
3821 }
3822
3823 total_size = 0;
3824
3825 dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
3826 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
3827
3828 dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
3829
3830 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) ) {
3831 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);
3832 break;
3833 }
3834
3835 /* Add header */
3836 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
3837 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
3838 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
3839 dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
3840 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
3841 dump_lid_header.content_len = lid_info.size;
3842 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
3843 dump_lid_header.record_idx = 1;
3844 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
3845 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
3846 dump_lid_header.checksum = 0; /* unused */
3847 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
3848
3849 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
3850
3851 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');
3852 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
3853 strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
3854 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
3855 }
3856 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
3857 if (mcf_ret != MCF_OTA_R_SUCCESS) {
3858 return mcf_ret;
3859 }
3860 }
3861 }
3862 }
3863
3864 break;
3865 }
3866 }
3867
3868 /* If not register callback */
3869 if (is_found == KAL_FALSE) {
3870 if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
3871 total_size = 0;
3872
3873 for (k = 0; k < lid_info.total_records; k++) {
3874 dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
3875 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
3876
3877 dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
3878
3879 if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
3880 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);
3881 break;
3882 }
3883
3884 /* Add header */
3885 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
3886 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
3887 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
3888 dump_lid_header.content_type = MCF_TYPE_OTA;
3889 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
3890 dump_lid_header.content_len = lid_info.size;
3891 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
3892 dump_lid_header.record_idx = k + 1;
3893 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
3894 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
3895 dump_lid_header.checksum = 0; /* unused */
3896 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
3897
3898 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
3899 }
3900
3901 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');
3902 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
3903 strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
3904 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
3905 }
3906 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
3907 if (mcf_ret != MCF_OTA_R_SUCCESS) {
3908 return mcf_ret;
3909 }
3910 }
3911
3912 if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
3913 for (k = 0; k < MAX_SIM_NUM; k++) {
3914 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) ) {
3915 MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
3916 continue;
3917 }
3918
3919 total_size = 0;
3920
3921 dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
3922 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
3923
3924 dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
3925
3926 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) ) {
3927 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);
3928 break;
3929 }
3930
3931 /* Add header */
3932 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
3933 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
3934 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
3935 dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
3936 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
3937 dump_lid_header.content_len = lid_info.size;
3938 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
3939 dump_lid_header.record_idx = 1;
3940 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
3941 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
3942 dump_lid_header.checksum = 0; /* unused */
3943 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
3944
3945 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
3946
3947 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');
3948 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
3949 strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
3950 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
3951 }
3952 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
3953 if (mcf_ret != MCF_OTA_R_SUCCESS) {
3954 return mcf_ret;
3955 }
3956 }
3957 }
3958 }
3959 }
3960 }else if (dump_lid_cnt > 0)
3961 {
3962 /* Only dump dump_lid_cnt LIDs */
3963 for(m = 0; m < dump_lid_cnt; m++){
3964 is_found = KAL_FALSE;
3965 for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
3966 if (req_ptr->lid[m] == mcf_db_lid_mapping_tbl[i].lid_num){
3967 is_found = KAL_TRUE;
3968 }
3969
3970 }
3971 if (is_found == KAL_FALSE)
3972 {
3973 MD_TRC_MCF_TR_DUMP_ALL_LID_CANNOT_FIND_LID(req_ptr->lid[m]);
3974 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
3975 return mcf_ret;
3976 }
3977 }
3978
3979 for(m = 0; m < dump_lid_cnt; m++){
3980 is_found = KAL_FALSE;
3981 for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
3982 if (req_ptr->lid[m] == mcf_db_lid_mapping_tbl[i].lid_num){
3983 is_found = KAL_FALSE;
3984
3985 nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
3986 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
3987 MD_TRC_MCF_TR_DUMP_ALL_LID_GET_LID_INFO_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
3988 continue;
3989 }
3990
3991 if ((lid_info.size % 4) == 0) {
3992 padding = 0;
3993 } else {
3994 padding = 4 - (lid_info.size % 4);
3995 MD_TRC_MCF_TR_DUMP_ALL_LID_SIZE_NOT_ALIGNMENT(lid_info.LID, lid_info.size, padding);
3996 }
3997
3998 for (j = 0; j < mcf_dump_param_tbl_num; j++) {
3999 if ( (mcf_dump_param_tbl[j].lid == mcf_db_lid_mapping_tbl[i].lid_num) ) {
4000 is_found = KAL_TRUE;
4001
4002 if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
4003 total_size = 0;
4004
4005 if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
4006 for (k = 0; k < lid_info.total_records; k++) {
4007 dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
4008 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
4009
4010 dump_para[0].lid = mcf_dump_param_tbl[j].lid;
4011 dump_para[0].type = MCF_TYPE_OTA;
4012 dump_para[0].record_idx = k + 1;
4013 dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
4014 *(dump_para[0].size) = 0;
4015
4016 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);
4017
4018 ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[0]);
4019 if ( (ret == KAL_FALSE) || (*(dump_para[0].size) != lid_info.size) ) {
4020 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));
4021 break;
4022 }
4023
4024 /* Add header */
4025 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
4026 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
4027 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
4028 dump_lid_header.content_type = MCF_TYPE_OTA;
4029 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
4030 dump_lid_header.content_len = lid_info.size;
4031 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
4032 dump_lid_header.record_idx = k + 1;
4033 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
4034 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
4035 dump_lid_header.checksum = 0; /* unused */
4036 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
4037
4038 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
4039 }
4040 } else {
4041 /* If not register callback */
4042 for (k = 0; k < lid_info.total_records; k++) {
4043 dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
4044 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
4045
4046 dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
4047
4048 if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
4049 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);
4050 break;
4051 }
4052
4053 /* Add header */
4054 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
4055 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
4056 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
4057 dump_lid_header.content_type = MCF_TYPE_OTA;
4058 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
4059 dump_lid_header.content_len = lid_info.size;
4060 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
4061 dump_lid_header.record_idx = k + 1;
4062 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
4063 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
4064 dump_lid_header.checksum = 0; /* unused */
4065 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
4066
4067 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
4068 }
4069 }
4070
4071 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');
4072 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
4073 strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
4074 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
4075 }
4076 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
4077 if (mcf_ret != MCF_OTA_R_SUCCESS) {
4078 return mcf_ret;
4079 }
4080 }
4081
4082 if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
4083 if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
4084 for (k = 0; k < MAX_SIM_NUM; k++) {
4085 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) ) {
4086 MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
4087 continue;
4088 }
4089
4090 total_size = 0;
4091
4092 dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
4093 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
4094
4095 dump_para[k].lid = mcf_dump_param_tbl[j].lid;
4096 dump_para[k].type = MCF_TYPE_OTA_BY_OP;
4097 dump_para[k].record_idx = 1;
4098 dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
4099 *(dump_para[k].size) = 0;
4100
4101 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);
4102 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);
4103
4104 ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[k]);
4105 if ( (ret == KAL_FALSE) || (*(dump_para[k].size) != lid_info.size) ) {
4106 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));
4107 break;
4108 }
4109
4110 /* Add header */
4111 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
4112 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
4113 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
4114 dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
4115 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
4116 dump_lid_header.content_len = lid_info.size;
4117 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
4118 dump_lid_header.record_idx = 1;
4119 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
4120 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
4121 dump_lid_header.checksum = 0; /* unused */
4122 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
4123
4124 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
4125
4126 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');
4127 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
4128 strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
4129 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
4130 }
4131 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
4132 if (mcf_ret != MCF_OTA_R_SUCCESS) {
4133 return mcf_ret;
4134 }
4135 }
4136 } else {
4137 /* If not register callback */
4138 for (k = 0; k < MAX_SIM_NUM; k++) {
4139 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) ) {
4140 MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
4141 continue;
4142 }
4143
4144 total_size = 0;
4145
4146 dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
4147 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
4148
4149 dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
4150
4151 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) ) {
4152 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);
4153 break;
4154 }
4155
4156 /* Add header */
4157 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
4158 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
4159 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
4160 dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
4161 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
4162 dump_lid_header.content_len = lid_info.size;
4163 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
4164 dump_lid_header.record_idx = 1;
4165 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
4166 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
4167 dump_lid_header.checksum = 0; /* unused */
4168 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
4169
4170 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
4171
4172 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');
4173 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
4174 strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
4175 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
4176 }
4177 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
4178 if (mcf_ret != MCF_OTA_R_SUCCESS) {
4179 return mcf_ret;
4180 }
4181 }
4182 }
4183 }
4184
4185 break;
4186 }
4187 }
4188
4189 /* If not register callback */
4190 if (is_found == KAL_FALSE) {
4191 if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
4192 total_size = 0;
4193
4194 for (k = 0; k < lid_info.total_records; k++) {
4195 dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
4196 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
4197
4198 dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
4199
4200 if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
4201 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);
4202 break;
4203 }
4204
4205 /* Add header */
4206 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
4207 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
4208 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
4209 dump_lid_header.content_type = MCF_TYPE_OTA;
4210 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
4211 dump_lid_header.content_len = lid_info.size;
4212 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
4213 dump_lid_header.record_idx = k + 1;
4214 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
4215 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
4216 dump_lid_header.checksum = 0; /* unused */
4217 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
4218
4219 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
4220 }
4221
4222 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');
4223 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
4224 strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
4225 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
4226 }
4227 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
4228 if (mcf_ret != MCF_OTA_R_SUCCESS) {
4229 return mcf_ret;
4230 }
4231 }
4232
4233 if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
4234 for (k = 0; k < MAX_SIM_NUM; k++) {
4235 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) ) {
4236 MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
4237 continue;
4238 }
4239
4240 total_size = 0;
4241
4242 dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
4243 kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
4244
4245 dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
4246
4247 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) ) {
4248 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);
4249 break;
4250 }
4251
4252 /* Add header */
4253 kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
4254 strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
4255 dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
4256 dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
4257 dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
4258 dump_lid_header.content_len = lid_info.size;
4259 dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
4260 dump_lid_header.record_idx = 1;
4261 strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
4262 dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
4263 dump_lid_header.checksum = 0; /* unused */
4264 kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
4265
4266 total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
4267
4268 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');
4269 if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
4270 strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
4271 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
4272 }
4273 mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
4274 if (mcf_ret != MCF_OTA_R_SUCCESS) {
4275 return mcf_ret;
4276 }
4277 }
4278 }
4279 }
4280
4281 }
4282 }
4283 }
4284 }
4285
4286 /* Support MCF Tool Read/Write - Write dump folder name into txt */
4287 kal_mem_set(last_dump_folder_name, 0, MCF_FILE_MAX_MD_PATH_LEN);
4288 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');
4289 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
4290 strncpy(last_dump_folder_name, "unknown_error", MCF_FILE_MAX_MD_PATH_LEN - 1);
4291 }
4292 MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_FOLDER_NAME(last_dump_folder_name);
4293 if(mcf_ret == MCF_OTA_R_SUCCESS){
4294 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));
4295 if (mcf_ret != MCF_OTA_R_SUCCESS) {
4296 return mcf_ret;
4297 }
4298 }
4299
4300 return mcf_ret;
4301}
4302
4303_STATIC mcf_ota_result_e mcf_config_ini_info(
4304 l4c_mcf_config_req_struct *req,
4305 l4c_mcf_config_cnf_struct *resp)
4306{
4307 mcf_t *pMcf = mcf_get_instance();
4308 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
4309 l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_RUNTIME;
4310 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
4311 mcf_ini_file_t *ini_file = &(pMcf->ini_file);
4312 kal_char *buffer = (kal_char *)ini_file->tmp_buff;
4313 kal_char orign_value[MCF_MAX_INI_ITEM_VALUE_LEN];
4314 kal_uint64 ini_path_ota_file_last_mod_time = 0;
4315 kal_uint64 ini_path_runtime_file_last_mod_time = 0;
4316 kal_uint64 ini_last_read_mod_time = 0;
4317 kal_char ini_root_path[20];
4318
4319 if(strcmp((kal_char *)req->item,"") == 0){
4320 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
4321 return mcf_ret;
4322 }
4323 if(strlen((kal_char *)req->item) > 63){
4324 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
4325 return mcf_ret;
4326 }
4327
4328 kal_mem_set((kal_char *)resp->item,0,MCF_MAX_INI_ITEM_LEN);
4329 kal_mem_set((kal_char *)resp->value,0,MCF_MAX_INI_ITEM_VALUE_LEN);
4330 strncpy((kal_char *)resp->item, (kal_char *)req->item, MCF_MAX_INI_ITEM_LEN-1);
4331
4332 switch (req->mode)
4333 {
4334 case L4C_MCF_CONFIG_MODE_READ:
4335
4336 ini_last_read_mod_time = ini_file->last_mod_time;
4337
4338 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){
4339 ini_path_ota_file_last_mod_time = 0;
4340 MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4341
4342 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){
4343 ini_path_runtime_file_last_mod_time = 0;
4344 MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4345 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4346 return mcf_ret;
4347 }
4348 }
4349
4350
4351 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){
4352 ini_path_runtime_file_last_mod_time = 0;
4353 MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4354
4355 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){
4356 ini_path_ota_file_last_mod_time = 0;
4357 MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4358 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4359 return mcf_ret;
4360 }
4361 }
4362
4363 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);
4364 kal_mem_set(ini_root_path,0,20);
4365 if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
4366 strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
4367 }else{
4368 strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
4369 }
4370
4371 MD_TRC_MCF_TR_CONFIG_INI_READ(ini_root_path);
4372 if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) == MCF_OTA_R_SUCCESS) {
4373
4374 } else {
4375 /* Cannot do OTA if fail to read ini file */
4376 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4377 return mcf_ret;
4378 }
4379
4380 if (mcf_find_ini_item((kal_char *)ini_file->buff, (kal_char *)resp->item, (kal_char *)resp->value, pMcf) == KAL_TRUE) {
4381
4382
4383
4384 } else {
4385 /* Cannot do OTA if fail to read ini file */
4386 mcf_ret = MCF_OTA_R_INVALID_INI_ITEM;
4387 return mcf_ret;
4388 }
4389
4390
4391 break;
4392
4393 case L4C_MCF_CONFIG_MODE_WRITE:
4394
4395 strncpy((kal_char *)resp->value, (kal_char *)req->value, MCF_MAX_INI_ITEM_VALUE_LEN-1);
4396
4397
4398 ini_last_read_mod_time = ini_file->last_mod_time;
4399
4400
4401 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){
4402 ini_path_ota_file_last_mod_time = 0;
4403 MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4404
4405 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){
4406 ini_path_runtime_file_last_mod_time = 0;
4407 MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4408 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4409 return mcf_ret;
4410 }
4411 }
4412
4413
4414 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){
4415 ini_path_runtime_file_last_mod_time = 0;
4416 MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4417
4418 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){
4419 ini_path_ota_file_last_mod_time = 0;
4420 MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4421 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4422 return mcf_ret;
4423 }
4424 }
4425
4426 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);
4427 kal_mem_set(ini_root_path,0,20);
4428 if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
4429 strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
4430 }else{
4431 strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
4432 }
4433
4434
4435 MD_TRC_MCF_TR_CONFIG_INI_READ(ini_root_path);
4436 if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) == MCF_OTA_R_SUCCESS) {
4437
4438 } else {
4439 /* Cannot do OTA if fail to read ini file */
4440 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4441 return mcf_ret;
4442 }
4443 kal_mem_set(orign_value, 0, MCF_MAX_INI_ITEM_VALUE_LEN);
4444 kal_mem_set((kal_char *)resp->value, 0, MCF_MAX_INI_ITEM_VALUE_LEN);
4445 mcf_find_ini_item((kal_char *)ini_file->buff, (kal_char *)resp->item, orign_value, pMcf);
4446
4447 kal_mem_set(buffer,0,MCF_MAX_INI_FILE_SIZE);
4448 if (mcf_compose_ini_item((kal_char *)ini_file->buff, buffer, (kal_char *)resp->item, orign_value, (kal_char *)resp->value) == KAL_TRUE) {
4449 mcf_ret = mcf_write_buffer(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, (kal_uint8 *)buffer, strlen(buffer));
4450 if (mcf_ret != MCF_OTA_R_SUCCESS){
4451 return mcf_ret;
4452 }
4453
4454 } else {
4455 /* Cannot do OTA if fail to read ini file */
4456 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
4457 return mcf_ret;
4458 }
4459
4460 break;
4461
4462 default:
4463 ASSERT(0);
4464 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
4465
4466 }
4467
4468
4469 return mcf_ret;
4470}
4471
4472_STATIC mcf_ota_result_e mcf_update_ota_file(
4473 l4c_mcf_update_ota_file_req_struct *req,
4474 l4c_mcf_update_ota_file_cnf_struct *resp,
4475 module_type src_mod_id,
4476 kal_bool *reset_MD)
4477{
4478 mcf_t *pMcf = mcf_get_instance();
4479 //sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
4480 //nvram_ef_mcf_ini_file_info_struct ini_file;
4481 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
4482 l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_RUNTIME;
4483 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
4484 mcf_ini_file_t *ini_file = &(pMcf->ini_file);
4485 kal_uint32 sbp_id_arr[MCF_MAX_TAG_NUM];
4486 kal_char tag_str[MCF_MAX_INI_ITEM_VALUE_LEN];
4487 kal_uint16 sbp_id_num = 0;
4488 mcf_ota_file_t *ota_file = &(pMcf->ota_file);
4489 mcf_tlvota_file_t *tlvota_file;
4490 kal_int32 i = 0;
4491 kal_int32 j = 0;
4492 kal_char ota_path_name[MCF_FILE_MAX_NAME_LEN];
4493 kal_uint64 ota_last_read_mod_time = 0;
4494 kal_uint64 ota_path_ota_file_last_mod_time = 0;
4495 kal_uint64 ota_path_runtime_file_last_mod_time = 0;
4496 kal_uint32 sbp_id = SBP_ID_INVALID;
4497 protocol_id_enum ps_id = 0;
4498 kal_char tlvota_path_name[MCF_FILE_MAX_NAME_LEN];
4499 kal_uint64 tlvota_last_read_mod_time = 0;
4500 kal_uint64 tlvota_path_ota_file_last_mod_time = 0;
4501 kal_uint64 tlvota_path_runtime_file_last_mod_time = 0;
4502 mcf_l4bsbp_trigger_dsbp_ind_struct *ind_ptr = NULL;
4503 kal_bool apply_general_tlv;
4504 kal_char tag_name[10];
4505 kal_bool trigger_ps_id[MAX_SIM_NUM];
4506 kal_uint64 ini_last_read_mod_time = 0;
4507 kal_uint64 ini_path_ota_file_last_mod_time = 0;
4508 kal_uint64 ini_path_runtime_file_last_mod_time = 0;
4509 kal_char ini_root_path[20];
4510 kal_uint32 ret_sprintf;
4511
4512
4513 MD_TRC_MCF_TR_UPDATE_OTA_START();
4514
4515
4516 pMcf->dsbp_cnf_ret = KAL_TRUE;
4517 pMcf->dsbp_ind_ret = KAL_TRUE;
4518 apply_general_tlv = KAL_FALSE;
4519 kal_mem_set(trigger_ps_id,0,MAX_SIM_NUM);
4520 /* Compare modified time of OTA file to know whether update OTA file */
4521
4522 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
4523 if (ota_file) {
4524 kal_mem_set(ota_path_name,0,MCF_FILE_MAX_NAME_LEN);
4525 strncpy(ota_path_name, ota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
4526 ota_last_read_mod_time = ota_file->last_mod_time;
4527 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
4528 } else {
4529 MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_TAKE_READ_LOCK_FAIL();
4530 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
4531 return mcf_ret;
4532 }
4533
4534
4535
4536 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){
4537 ota_path_ota_file_last_mod_time = 0;
4538 MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4539
4540 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){
4541 ota_path_runtime_file_last_mod_time = 0;
4542 MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4543 mcf_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
4544 //return mcf_ret;
4545 }
4546 }
4547
4548
4549 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){
4550 ota_path_runtime_file_last_mod_time = 0;
4551 MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4552
4553 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){
4554 ota_path_ota_file_last_mod_time = 0;
4555 MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4556 mcf_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
4557 //return mcf_ret;
4558 }
4559 }
4560
4561 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);
4562
4563 if (ota_path_ota_file_last_mod_time > ota_path_runtime_file_last_mod_time){
4564 if(ota_path_ota_file_last_mod_time > ota_last_read_mod_time){
4565 /* If OTA file is updated, need to reset MD to apply OTA */
4566 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),
4567 (kal_uint32)((ota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_last_read_mod_time & 0xFFFFFFFF));
4568 mcf_ret = MCF_OTA_R_SUCCESS;
4569 *reset_MD = KAL_TRUE;
4570
4571 return mcf_ret;
4572 }
4573 }else{
4574 if(ota_path_runtime_file_last_mod_time > ota_last_read_mod_time){
4575 /* If OTA file is updated, need to reset MD to apply OTA */
4576 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),
4577 (kal_uint32)((ota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_last_read_mod_time & 0xFFFFFFFF));
4578 mcf_ret = MCF_OTA_R_SUCCESS;
4579 *reset_MD = KAL_TRUE;
4580 return mcf_ret;
4581 }
4582 }
4583
4584 MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_OTA();
4585
4586 switch (req->action)
4587 {
4588 case L4C_MCF_CONFIG_ACT_NO_READ_INI:
4589 /* Update OTA file without reading ini file */
4590 MD_TRC_MCF_TR_UPDATE_OTA_NO_READ_INI();
4591
4592 /* If general_tlvota_file update, every sim card should apply */
4593 tlvota_file = &(pMcf->general_tlvota_file);
4594 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
4595 if (tlvota_file){
4596 tlvota_last_read_mod_time = tlvota_file->last_mod_time;
4597 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
4598 }else {
4599 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
4600 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
4601 return mcf_ret;
4602 }
4603
4604 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){
4605 tlvota_path_ota_file_last_mod_time = 0;
4606 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4607
4608 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){
4609 tlvota_path_runtime_file_last_mod_time = 0;
4610 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4611 //return mcf_ret;
4612 }
4613
4614 }
4615
4616
4617 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){
4618 tlvota_path_runtime_file_last_mod_time = 0;
4619 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4620
4621 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){
4622 tlvota_path_ota_file_last_mod_time = 0;
4623 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4624 //return mcf_ret;
4625 }
4626 }
4627
4628 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);
4629 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){
4630
4631 /* If TLV OTA file is updated, trigger DSBP with retry */
4632 if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
4633 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),
4634 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
4635 }else{
4636 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),
4637 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
4638 }
4639
4640
4641 /*
4642 * Trigger DSBP and do not respond to AP immediately.
4643 * Wait DSBP response, and then respond to AP.
4644 */
4645
4646 for (i = 0; i < MAX_SIM_NUM; i++){
4647 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
4648 if (!ind_ptr) {
4649 ASSERT(0);
4650 mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
4651
4652 return mcf_ret;
4653 }
4654
4655 ind_ptr->src_id = req->src_id;
4656 ind_ptr->src_mod_id = src_mod_id;
4657 ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
4658 ind_ptr->is_dsbp_retry = 1;
4659
4660 msg_send6(MOD_MCF, /* src_mod_id */
4661 MOD_L4BSBP + i, /* dest_mod_id */
4662 MCF_SAP, /* sap_id */
4663 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
4664 (local_para_struct*)ind_ptr, /* local_para_ptr */
4665 NULL); /* peer_buff_ptr */
4666 pMcf->dsbp_cnf_cnt ++;
4667 pMcf->dsbp_ind_cnt ++;
4668 mcf_ret = MCF_OTA_R_SUCCESS;
4669 }
4670
4671 MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
4672 apply_general_tlv = KAL_TRUE;
4673 return mcf_ret;
4674
4675 }
4676
4677 MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
4678
4679 tlvota_path_ota_file_last_mod_time = 0;
4680 tlvota_path_runtime_file_last_mod_time = 0;
4681 tlvota_last_read_mod_time = 0;
4682
4683 /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
4684
4685 for (i = 0; i < MAX_SIM_NUM; i++){
4686 tlvota_file = &(pMcf->tlvota_file[i]);
4687 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
4688 if (tlvota_file){
4689 sbp_id = tlvota_file->sbp_id;
4690 ps_id = tlvota_file->ps_id;
4691 tlvota_last_read_mod_time = tlvota_file->last_mod_time;
4692 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
4693 }else {
4694 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
4695 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
4696 return mcf_ret;
4697 }
4698 tlvota_path_ota_file_last_mod_time = 0;
4699 tlvota_path_runtime_file_last_mod_time = 0;
4700
4701 if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
4702 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
4703 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
4704 return mcf_ret;
4705 }
4706
4707 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
4708 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_SBP_ID(sbp_id);
4709
4710 /* If have not read tlv ota file, trigger DSBP */
4711 if(sbp_id == SBP_ID_INVALID){
4712 mcf_ret = MCF_OTA_R_SUCCESS;
4713 }else{
4714 kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
4715 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');
4716 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
4717 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
4718 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
4719 return mcf_ret;
4720 }
4721
4722 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
4723
4724 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){
4725 tlvota_path_runtime_file_last_mod_time = 0;
4726 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4727
4728 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){
4729 tlvota_path_ota_file_last_mod_time = 0;
4730 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4731 //return mcf_ret;
4732 }
4733 }
4734
4735 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){
4736 tlvota_path_ota_file_last_mod_time = 0;
4737 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4738
4739 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){
4740 tlvota_path_runtime_file_last_mod_time = 0;
4741 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4742 //return mcf_ret;
4743 }
4744 }
4745
4746
4747 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);
4748
4749 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){
4750
4751 /* If TLV OTA file is updated, trigger DSBP with retry */
4752 if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
4753 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),
4754 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
4755 }else{
4756 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),
4757 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
4758 }
4759
4760 /*
4761 * Trigger DSBP and do not respond to AP immediately.
4762 * Wait DSBP response, and then respond to AP.
4763 */
4764 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
4765 if (!ind_ptr) {
4766 ASSERT(0);
4767 mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
4768
4769 return mcf_ret;
4770 }
4771
4772 ind_ptr->src_id = req->src_id;
4773 ind_ptr->src_mod_id = src_mod_id;
4774 ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
4775 ind_ptr->is_dsbp_retry = 1;
4776
4777 msg_send6(MOD_MCF, /* src_mod_id */
4778 MOD_L4BSBP + ps_id, /* dest_mod_id */
4779 MCF_SAP, /* sap_id */
4780 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
4781 (local_para_struct*)ind_ptr, /* local_para_ptr */
4782 NULL); /* peer_buff_ptr */
4783 pMcf->dsbp_cnf_cnt ++;
4784 pMcf->dsbp_ind_cnt ++;
4785 mcf_ret = MCF_OTA_R_SUCCESS;
4786
4787
4788
4789 }
4790
4791 }
4792 }
4793
4794
4795 break;
4796
4797 case L4C_MCF_CONFIG_ACT_READ_INI:
4798 MD_TRC_MCF_TR_UPDATE_OTA_READ_INI();
4799 /* Update OTA file with reading ini file */
4800 ini_last_read_mod_time = ini_file->last_mod_time;
4801 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){
4802 ini_path_ota_file_last_mod_time = 0;
4803 MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4804
4805 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){
4806 ini_path_runtime_file_last_mod_time = 0;
4807 MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4808 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4809 return mcf_ret;
4810 }
4811 }
4812
4813
4814 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){
4815 ini_path_runtime_file_last_mod_time = 0;
4816 MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4817
4818 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){
4819 ini_path_ota_file_last_mod_time = 0;
4820 MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4821 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4822 return mcf_ret;
4823 }
4824 }
4825
4826 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);
4827 kal_mem_set(ini_root_path,0,20);
4828 if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
4829 strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
4830 }else{
4831 strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
4832 }
4833
4834
4835 MD_TRC_MCF_TR_UPDATE_OTA_INI_READ(ini_root_path);
4836 if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) != MCF_OTA_R_SUCCESS) {
4837 mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
4838 return mcf_ret;
4839 }
4840
4841 kal_mem_set(tag_name,0,10);
4842 strncpy(tag_name,"TagName", 9);
4843 mcf_find_ini_item((kal_char *)ini_file->buff, tag_name, tag_str, pMcf);
4844 if(strcmp(tag_str,"") == 0){
4845 /* Normal TLV OTA apply */
4846 /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
4847 MD_TRC_MCF_TR_UPDATE_OTA_FIND_INI_TAGNAME_NULL();
4848 /* If general_tlvota_file update, every sim card should apply */
4849
4850 tlvota_file = &(pMcf->general_tlvota_file);
4851 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
4852 if (tlvota_file){
4853 tlvota_last_read_mod_time = tlvota_file->last_mod_time;
4854 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
4855 }else {
4856 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
4857 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
4858 return mcf_ret;
4859 }
4860
4861 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){
4862 tlvota_path_ota_file_last_mod_time = 0;
4863 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4864
4865 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){
4866 tlvota_path_runtime_file_last_mod_time = 0;
4867 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4868 //return mcf_ret;
4869 }
4870
4871 }
4872
4873
4874 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){
4875 tlvota_path_runtime_file_last_mod_time = 0;
4876 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4877
4878 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){
4879 tlvota_path_ota_file_last_mod_time = 0;
4880 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4881 //return mcf_ret;
4882 }
4883 }
4884
4885 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);
4886 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){
4887
4888 /* If TLV OTA file is updated, trigger DSBP with retry */
4889 if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
4890 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),
4891 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
4892 }else{
4893 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),
4894 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
4895 }
4896
4897 /*
4898 * Trigger DSBP and do not respond to AP immediately.
4899 * Wait DSBP response, and then respond to AP.
4900 */
4901
4902 for (i = 0; i < MAX_SIM_NUM; i++){
4903 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
4904 if (!ind_ptr) {
4905 ASSERT(0);
4906 mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
4907
4908 return mcf_ret;
4909 }
4910
4911 ind_ptr->src_id = req->src_id;
4912 ind_ptr->src_mod_id = src_mod_id;
4913 ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
4914 ind_ptr->is_dsbp_retry = 1;
4915
4916 msg_send6(MOD_MCF, /* src_mod_id */
4917 MOD_L4BSBP + i, /* dest_mod_id */
4918 MCF_SAP, /* sap_id */
4919 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
4920 (local_para_struct*)ind_ptr, /* local_para_ptr */
4921 NULL); /* peer_buff_ptr */
4922 pMcf->dsbp_cnf_cnt ++;
4923 pMcf->dsbp_ind_cnt ++;
4924 mcf_ret = MCF_OTA_R_SUCCESS;
4925 }
4926 MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
4927 apply_general_tlv = KAL_TRUE;
4928 return mcf_ret;
4929
4930
4931 }
4932
4933 tlvota_path_ota_file_last_mod_time = 0;
4934 tlvota_path_runtime_file_last_mod_time = 0;
4935 tlvota_last_read_mod_time = 0;
4936
4937 /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
4938 MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
4939 for (i = 0; i < MAX_SIM_NUM; i++){
4940 tlvota_file = &(pMcf->tlvota_file[i]);
4941 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
4942 if (tlvota_file){
4943 sbp_id = tlvota_file->sbp_id;
4944 ps_id = tlvota_file->ps_id;
4945 tlvota_last_read_mod_time = tlvota_file->last_mod_time;
4946 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
4947 }else {
4948 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
4949 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
4950 return mcf_ret;
4951 }
4952 if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
4953 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
4954 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
4955 return mcf_ret;
4956 }
4957
4958 tlvota_path_ota_file_last_mod_time = 0;
4959 tlvota_path_runtime_file_last_mod_time = 0;
4960
4961 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
4962 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
4963 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_SBP_ID(sbp_id);
4964 /* If have not read tlv ota file, trigger DSBP */
4965 if(sbp_id == SBP_ID_INVALID){
4966 mcf_ret = MCF_OTA_R_SUCCESS;
4967 }else{
4968 kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
4969 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');
4970 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
4971 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
4972 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
4973 return mcf_ret;
4974 }
4975
4976 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){
4977 tlvota_path_runtime_file_last_mod_time = 0;
4978 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4979
4980 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){
4981 tlvota_path_ota_file_last_mod_time = 0;
4982 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4983 //return mcf_ret;
4984 }
4985 }
4986
4987 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){
4988 tlvota_path_ota_file_last_mod_time = 0;
4989 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
4990
4991 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){
4992 tlvota_path_runtime_file_last_mod_time = 0;
4993 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
4994 //return mcf_ret;
4995 }
4996 }
4997
4998 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);
4999 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){
5000
5001 /* If TLV OTA file is updated, trigger DSBP with retry */
5002 if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
5003 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),
5004 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5005 }else{
5006 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),
5007 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5008 }
5009
5010 /*
5011 * Trigger DSBP and do not respond to AP immediately.
5012 * Wait DSBP response, and then respond to AP.
5013 */
5014 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
5015 if (!ind_ptr) {
5016 ASSERT(0);
5017 mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
5018
5019 return mcf_ret;
5020 }
5021
5022 ind_ptr->src_id = req->src_id;
5023 ind_ptr->src_mod_id = src_mod_id;
5024 ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
5025 ind_ptr->is_dsbp_retry = 1;
5026
5027 msg_send6(MOD_MCF, /* src_mod_id */
5028 MOD_L4BSBP + ps_id, /* dest_mod_id */
5029 MCF_SAP, /* sap_id */
5030 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
5031 (local_para_struct*)ind_ptr, /* local_para_ptr */
5032 NULL); /* peer_buff_ptr */
5033 pMcf->dsbp_cnf_cnt ++;
5034 pMcf->dsbp_ind_cnt ++;
5035 mcf_ret = MCF_OTA_R_SUCCESS;
5036
5037
5038
5039 }
5040
5041 }
5042 }
5043 }else{
5044 /* If critical tag is not null */
5045 MD_TRC_MCF_TR_UPDATE_OTA_FIND_INI_TAGNAME(tag_str);
5046 if(mcf_find_ini_sbp_id (tag_str,sbp_id_arr,&sbp_id_num,&apply_general_tlv) == KAL_TRUE){
5047 /*If general tlvota case is critical, every sim card need to apply general tlv ota */
5048 if (apply_general_tlv == KAL_TRUE){
5049
5050 tlvota_file = &(pMcf->general_tlvota_file);
5051 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
5052 if (tlvota_file){
5053 tlvota_last_read_mod_time = tlvota_file->last_mod_time;
5054 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
5055 }else {
5056 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
5057 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
5058 return mcf_ret;
5059 }
5060
5061 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){
5062 tlvota_path_ota_file_last_mod_time = 0;
5063 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
5064
5065 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){
5066 tlvota_path_runtime_file_last_mod_time = 0;
5067 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
5068 //return mcf_ret;
5069 }
5070
5071 }
5072
5073
5074 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){
5075 tlvota_path_runtime_file_last_mod_time = 0;
5076 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
5077
5078 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){
5079 tlvota_path_ota_file_last_mod_time = 0;
5080 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
5081 //return mcf_ret;
5082 }
5083 }
5084
5085 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);
5086 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){
5087
5088 /* If TLV OTA file is updated, trigger DSBP with retry */
5089 if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
5090 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),
5091 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5092 }else{
5093 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),
5094 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5095 }
5096
5097 /*
5098 * Trigger DSBP and do not respond to AP immediately.
5099 * Wait DSBP response, and then respond to AP.
5100 */
5101
5102 for (i = 0; i < MAX_SIM_NUM; i++){
5103
5104 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
5105 if (!ind_ptr) {
5106 ASSERT(0);
5107 mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
5108
5109 return mcf_ret;
5110 }
5111
5112 ind_ptr->src_id = req->src_id;
5113 ind_ptr->src_mod_id = src_mod_id;
5114 ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
5115 ind_ptr->is_dsbp_retry = 0;
5116
5117 msg_send6(MOD_MCF, /* src_mod_id */
5118 MOD_L4BSBP + i, /* dest_mod_id */
5119 MCF_SAP, /* sap_id */
5120 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
5121 (local_para_struct*)ind_ptr, /* local_para_ptr */
5122 NULL); /* peer_buff_ptr */
5123 pMcf->dsbp_cnf_cnt ++;
5124 pMcf->dsbp_ind_cnt ++;
5125 mcf_ret = MCF_OTA_R_SUCCESS;
5126 }
5127 MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
5128 return mcf_ret;
5129
5130
5131 }
5132
5133 tlvota_path_ota_file_last_mod_time = 0;
5134 tlvota_path_runtime_file_last_mod_time = 0;
5135 tlvota_last_read_mod_time = 0;
5136 }
5137
5138 MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
5139
5140 for (i = 0; i < MAX_SIM_NUM; i++){
5141 tlvota_file = &(pMcf->tlvota_file[i]);
5142 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
5143 if (tlvota_file){
5144 sbp_id = tlvota_file->sbp_id;
5145 ps_id = tlvota_file->ps_id;
5146 tlvota_last_read_mod_time = tlvota_file->last_mod_time;
5147 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
5148 }else {
5149 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
5150 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
5151 return mcf_ret;
5152 }
5153 if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
5154 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
5155 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5156 return mcf_ret;
5157 }
5158 tlvota_path_ota_file_last_mod_time = 0;
5159 tlvota_path_runtime_file_last_mod_time = 0;
5160 kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
5161 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');
5162 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
5163 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
5164 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5165 return mcf_ret;
5166 }
5167 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
5168 for (j = 0; j < sbp_id_num; j++){
5169 if (sbp_id == sbp_id_arr[j]){
5170
5171 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){
5172 tlvota_path_runtime_file_last_mod_time = 0;
5173 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
5174
5175 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){
5176 tlvota_path_ota_file_last_mod_time = 0;
5177 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
5178 //return mcf_ret;
5179 }
5180 }
5181
5182 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){
5183 tlvota_path_ota_file_last_mod_time = 0;
5184 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
5185
5186 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){
5187 tlvota_path_runtime_file_last_mod_time = 0;
5188 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
5189 //return mcf_ret;
5190 }
5191 }
5192
5193 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);
5194 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){
5195
5196 /* If TLV OTA file is updated, trigger DSBP without retry */
5197 if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
5198 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),
5199 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5200 }else{
5201 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),
5202 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5203 }
5204
5205 /*
5206 * Trigger DSBP and do not respond to AP immediately.
5207 * Wait DSBP response, and then respond to AP.
5208 */
5209 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
5210 if (!ind_ptr) {
5211 ASSERT(0);
5212 mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
5213
5214
5215 return mcf_ret;
5216 }
5217
5218 ind_ptr->src_id = req->src_id;
5219 ind_ptr->src_mod_id = src_mod_id;
5220 ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
5221 ind_ptr->is_dsbp_retry = 0;
5222 msg_send6(MOD_MCF, /* src_mod_id */
5223 MOD_L4BSBP + ps_id, /* dest_mod_id */
5224 MCF_SAP, /* sap_id */
5225 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
5226 (local_para_struct*)ind_ptr, /* local_para_ptr */
5227 NULL); /* peer_buff_ptr */
5228 pMcf->dsbp_cnf_cnt ++;
5229 pMcf->dsbp_ind_cnt ++;
5230 mcf_ret = MCF_OTA_R_SUCCESS;
5231 trigger_ps_id[ps_id] = KAL_TRUE;
5232
5233
5234
5235 }
5236 }
5237 }
5238
5239 }
5240
5241 /* If no critical OP OTA trigger DSBP, check if general OTA whether updated */
5242
5243 if(pMcf->dsbp_cnf_cnt < MAX_SIM_NUM){
5244
5245 MD_TRC_MCF_TR_UPDATE_OTA_NO_CRITICAL_CASE();
5246
5247 /* If general_tlvota_file update, every sim card should apply */
5248 tlvota_file = &(pMcf->general_tlvota_file);
5249 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
5250 if (tlvota_file){
5251 tlvota_last_read_mod_time = tlvota_file->last_mod_time;
5252 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
5253 }else {
5254 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
5255 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
5256 return mcf_ret;
5257 }
5258
5259 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){
5260 tlvota_path_ota_file_last_mod_time = 0;
5261 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
5262
5263 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){
5264 tlvota_path_runtime_file_last_mod_time = 0;
5265 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
5266 //return mcf_ret;
5267 }
5268
5269 }
5270
5271
5272 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){
5273 tlvota_path_runtime_file_last_mod_time = 0;
5274 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
5275
5276 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){
5277 tlvota_path_ota_file_last_mod_time = 0;
5278 MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
5279 //return mcf_ret;
5280 }
5281 }
5282
5283 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);
5284 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){
5285
5286 /* If TLV OTA file is updated, trigger DSBP with retry */
5287 if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
5288 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),
5289 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5290 }else{
5291 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),
5292 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5293 }
5294
5295 /*
5296 * Trigger DSBP and do not respond to AP immediately.
5297 * Wait DSBP response, and then respond to AP.
5298 */
5299
5300
5301
5302 for (i = 0; i < MAX_SIM_NUM; i++){
5303
5304 if (trigger_ps_id[i] != KAL_TRUE){
5305 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
5306 if (!ind_ptr) {
5307 ASSERT(0);
5308 mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
5309
5310 return mcf_ret;
5311 }
5312
5313 ind_ptr->src_id = req->src_id;
5314 ind_ptr->src_mod_id = src_mod_id;
5315 ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
5316 ind_ptr->is_dsbp_retry = 1;
5317
5318 msg_send6(MOD_MCF, /* src_mod_id */
5319 MOD_L4BSBP + i, /* dest_mod_id */
5320 MCF_SAP, /* sap_id */
5321 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
5322 (local_para_struct*)ind_ptr, /* local_para_ptr */
5323 NULL); /* peer_buff_ptr */
5324 pMcf->dsbp_cnf_cnt ++;
5325 pMcf->dsbp_ind_cnt ++;
5326 mcf_ret = MCF_OTA_R_SUCCESS;
5327 }
5328
5329 }
5330 apply_general_tlv = KAL_TRUE;
5331 MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
5332 return mcf_ret;
5333
5334
5335 }
5336
5337 tlvota_path_ota_file_last_mod_time = 0;
5338 tlvota_path_runtime_file_last_mod_time = 0;
5339 tlvota_last_read_mod_time = 0;
5340
5341 /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
5342 MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
5343 for (i = 0; i < MAX_SIM_NUM; i++){
5344 tlvota_file = &(pMcf->tlvota_file[i]);
5345 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
5346 if (tlvota_file){
5347 sbp_id = tlvota_file->sbp_id;
5348 ps_id = tlvota_file->ps_id;
5349 tlvota_last_read_mod_time = tlvota_file->last_mod_time;
5350 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
5351 }else {
5352 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
5353 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
5354 return mcf_ret;
5355 }
5356
5357 if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
5358 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
5359 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5360 return mcf_ret;
5361 }
5362
5363 tlvota_path_ota_file_last_mod_time = 0;
5364 tlvota_path_runtime_file_last_mod_time = 0;
5365
5366 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
5367 MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
5368 /* If have not read tlv ota file, trigger DSBP */
5369 if(sbp_id == SBP_ID_INVALID){
5370 mcf_ret = MCF_OTA_R_SUCCESS;
5371 }else{
5372 kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
5373 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');
5374 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
5375 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
5376 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5377 return mcf_ret;
5378 }
5379
5380 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){
5381 tlvota_path_runtime_file_last_mod_time = 0;
5382 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
5383
5384 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){
5385 tlvota_path_ota_file_last_mod_time = 0;
5386 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
5387 //return mcf_ret;
5388 }
5389 }
5390
5391 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){
5392 tlvota_path_ota_file_last_mod_time = 0;
5393 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
5394
5395 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){
5396 tlvota_path_runtime_file_last_mod_time = 0;
5397 MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
5398 //return mcf_ret;
5399 }
5400 }
5401
5402 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);
5403 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){
5404
5405 /* If TLV OTA file is updated, trigger DSBP with retry */
5406 if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
5407 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),
5408 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5409 }else{
5410 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),
5411 (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
5412 }
5413
5414 /*
5415 * Trigger DSBP and do not respond to AP immediately.
5416 * Wait DSBP response, and then respond to AP.
5417 */
5418 if(trigger_ps_id[ps_id] != KAL_TRUE){
5419
5420 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
5421 if (!ind_ptr) {
5422 ASSERT(0);
5423 mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
5424
5425 return mcf_ret;
5426 }
5427
5428 ind_ptr->src_id = req->src_id;
5429 ind_ptr->src_mod_id = src_mod_id;
5430 ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
5431 ind_ptr->is_dsbp_retry = 1;
5432
5433 msg_send6(MOD_MCF, /* src_mod_id */
5434 MOD_L4BSBP + ps_id, /* dest_mod_id */
5435 MCF_SAP, /* sap_id */
5436 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
5437 (local_para_struct*)ind_ptr, /* local_para_ptr */
5438 NULL); /* peer_buff_ptr */
5439 pMcf->dsbp_cnf_cnt ++;
5440 pMcf->dsbp_ind_cnt ++;
5441 mcf_ret = MCF_OTA_R_SUCCESS;
5442
5443 }
5444
5445 }
5446
5447 }
5448 }
5449 }
5450 }
5451 }
5452
5453
5454
5455
5456 break;
5457
5458 default:
5459 ASSERT(0);
5460 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5461
5462 }
5463
5464 MD_TRC_MCF_TR_UPDATE_OTA_RETURN_VALUE(pMcf->dsbp_cnf_cnt);
5465 return mcf_ret;
5466}
5467
5468_STATIC mcf_ota_result_e mcf_config_LID_variable(
5469 l4c_mcf_config_lid_variable_operation_req_struct *req,
5470 l4c_mcf_config_lid_variable_operation_cnf_struct *resp)
5471{
5472 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
5473#ifdef __MCF_FIND_TAG_SUPPORT__
5474 mcf_t *pMcf = mcf_get_instance();
5475 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
5476 kal_bool ret = KAL_TRUE;
5477 nvram_ltable_entry_struct lid_info = {0};
5478 nvram_errno_enum nvram_api_ret;
5479 kal_uint16 item_byte_offset;
5480 kal_uint16 item_bit_offset;
5481 kal_uint32 item_size;
5482 mcf_custom_dump_param_struct dump_para;
5483 kal_uint32 lid_size;
5484 kal_uint32 i;
5485 mcf_tag_info_struct query_tag = {0};
5486 kal_uint8 lid_value[512];
5487 kal_uint32 j = 0;
5488 kal_uint32 n = 1;
5489 MCF_DB_STRUCT_VARIABLE const *db_ptr = NULL;
5490 kal_uint32 read_len = 0;
5491 kal_bool invalid_arr_size = KAL_FALSE;
5492 kal_bool next_level_array = KAL_FALSE;
5493 kal_bool is_found = KAL_FALSE;
5494 kal_uint8 hex_value[512];
5495
5496 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_START(req->lid_num, req->rec_id, req->tag_name);
5497 kal_mem_set(&dump_para, 0, sizeof(mcf_custom_dump_param_struct));
5498 kal_mem_set(hex_value, 0, 512);
5499
5500 resp->len = req->len;
5501
5502 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
5503 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_SIM_ID(req->ps_id, sim_id);
5504 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5505
5506 return mcf_ret;
5507 }
5508
5509 nvram_api_ret = nvram_external_get_lid_info(req->lid_num, &lid_info);
5510 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
5511 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_GET_LID_INFO_FAIL(req->lid_num, nvram_api_ret);
5512 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5513
5514 return mcf_ret;
5515 }
5516
5517
5518 kal_mem_set(mcf_dump_buffer, 0, lid_info.size);
5519
5520 if(req->rec_id > lid_info.total_records){
5521 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
5522 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5523
5524 return mcf_ret;
5525 }else if (req->rec_id == 0){
5526 req->rec_id = 1;
5527 }
5528
5529 dump_para.ps_id = req->ps_id;
5530 dump_para.sbp_id = pMcf->tlvota_file[sim_id].sbp_id;
5531 kal_mem_cpy(&(dump_para.mcc), &(pMcf->tlvota_file[sim_id].mcc), MAX_MCC_STR_LEN);
5532 kal_mem_cpy(&(dump_para.mnc), &(pMcf->tlvota_file[sim_id].mnc), MAX_MNC_STR_LEN);
5533 kal_mem_cpy(&(dump_para.iccid), &(pMcf->tlvota_file[sim_id].iccid), 21);
5534 dump_para.size = &lid_size;
5535
5536
5537
5538
5539 for (i = 0; i < mcf_dump_param_tbl_num; i++) {
5540 if ( (mcf_dump_param_tbl[i].lid == req->lid_num) ) {
5541 is_found = KAL_TRUE;
5542 if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
5543
5544 dump_para.type = MCF_TYPE_OTA;
5545 dump_para.record_idx = req->rec_id;
5546
5547 if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
5548
5549 dump_para.lid = mcf_dump_param_tbl[i].lid;
5550 dump_para.buffer = mcf_dump_buffer;
5551 *(dump_para.size) = 0;
5552
5553 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_CALLBACK(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
5554
5555 ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
5556 if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
5557 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_DUMP_ERROR(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
5558 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5559 break;
5560 }
5561 } else {
5562 /* If not register callback */
5563 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM(lid_info.LID, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
5564 dump_para.buffer = mcf_dump_buffer;
5565 if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
5566 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
5567 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5568 break;
5569 }
5570 }
5571 }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
5572 dump_para.type = MCF_TYPE_OTA_BY_OP;
5573 dump_para.record_idx = 1;
5574
5575 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);
5576
5577 if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
5578 dump_para.lid = mcf_dump_param_tbl[i].lid;
5579 dump_para.buffer = mcf_dump_buffer;
5580 *(dump_para.size) = 0;
5581
5582 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);
5583
5584 ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
5585 if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
5586 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_DUMP_FAIL(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
5587 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5588 break;
5589 }
5590 } else {
5591 /* If not register callback */
5592 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type);
5593 dump_para.buffer = mcf_dump_buffer;
5594 if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
5595 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
5596 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5597 break;
5598 }
5599 }
5600 }
5601 break;
5602 }
5603 }
5604
5605 if (is_found == KAL_FALSE){
5606 /* If not register callback */
5607 if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
5608
5609 dump_para.type = MCF_TYPE_OTA;
5610 dump_para.record_idx = req->rec_id;
5611
5612 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM_NOT_CALLBACK(req->lid_num, req->rec_id);
5613 dump_para.buffer = mcf_dump_buffer;
5614 if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
5615 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);
5616 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5617 return mcf_ret;
5618 }
5619
5620 }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
5621 dump_para.type = MCF_TYPE_OTA_BY_OP;
5622 dump_para.record_idx = 1;
5623
5624 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);
5625 dump_para.buffer = mcf_dump_buffer;
5626 if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
5627 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);
5628 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5629 return mcf_ret;
5630 }
5631
5632 }
5633
5634 }
5635
5636 if (mcf_ret == MCF_OTA_R_INVALID_PARAMETER){
5637 return mcf_ret;
5638 }
5639
5640 mcf_toupper((char *)req->tag_name);
5641 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) {
5642 //Cannot find the tag
5643 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_FIND_TAG_FAIL(req->lid_num, req->tag_name);
5644 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5645
5646 return mcf_ret;
5647
5648 }
5649
5650 for(i = 0; i < query_tag.arr_cnt; i++){
5651 if (db_ptr->array_size[i]-1 < query_tag.array_size[i])
5652 {
5653 invalid_arr_size = KAL_TRUE;
5654 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_ARR_SIZE(db_ptr->array_size[i]-1, query_tag.array_size[i]);
5655 break;
5656 }
5657 }
5658
5659 if (invalid_arr_size == KAL_TRUE){
5660 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5661 return mcf_ret;
5662 }
5663 resp->len = req->len;
5664
5665 read_len = req->len * db_ptr->variable_size;
5666
5667 if (read_len == 0)
5668 {
5669 read_len = 1 * db_ptr->variable_size;
5670 }
5671
5672 if (read_len > db_ptr->total_size){
5673 read_len = db_ptr->total_size;
5674 }
5675 if (read_len > 255){
5676 read_len = 255;
5677 }
5678
5679 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_LENGTH(read_len, db_ptr->variable_size, db_ptr->total_size);
5680 kal_mem_set(lid_value, 0, 512);
5681
5682 if (query_tag.is_bit == KAL_FALSE){
5683
5684 j = query_tag.arr_cnt;
5685
5686 while(db_ptr->array_size[j] != 0){
5687 n *= (db_ptr->array_size[j]);
5688
5689
5690 j++;
5691 next_level_array = KAL_TRUE;
5692 }
5693
5694 if(req->len == 0)
5695 {
5696 read_len *= n;
5697 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_TOTAL_ARRAY_SIZE(n, db_ptr->variable_size);
5698 }
5699
5700 if(next_level_array == KAL_FALSE && read_len > item_size){
5701 read_len = item_size;
5702 }
5703 if(next_level_array == KAL_TRUE && read_len > n*db_ptr->variable_size){
5704 read_len = n*db_ptr->variable_size;
5705 }
5706
5707
5708 if (read_len > 255){
5709 read_len = 255;
5710 }
5711
5712 kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
5713 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BYTE(lid_value, read_len);
5714 mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
5715 strncpy((kal_char *)(resp->value), hex_value, 512);
5716 if (db_ptr->variable_size <= read_len){
5717 resp->len = read_len / db_ptr->variable_size;
5718 }else{
5719 resp->len = read_len;
5720 }
5721 }else{
5722
5723 if (query_tag.upper_vsize == 1){
5724 resp->len = 1;
5725 }else if(query_tag.upper_vsize == 2){
5726 resp->len = 2;
5727 }else if(query_tag.upper_vsize == 4){
5728 resp->len = 4;
5729 }else{
5730 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_INVALID_BIT_LEN(query_tag.upper_vsize);
5731 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5732
5733 return mcf_ret;
5734 }
5735 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_SIZE(query_tag.upper_vsize, resp->len);
5736
5737 if (db_ptr->is_bit == KAL_TRUE){
5738
5739 kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), resp->len);
5740 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_WHOLE(lid_value, resp->len);
5741
5742 mcf_bytes_to_hex(lid_value, resp->len, KAL_TRUE, hex_value);
5743 strncpy((kal_char *)(resp->value), hex_value, 512);
5744 }else{
5745
5746 if (query_tag.upper_vsize == 1){
5747 kal_uint8 bit_value = *(mcf_dump_buffer + item_byte_offset);
5748 kal_uint8 bit_mask = (kal_uint8)MCF_GEN_BIT_MASK(item_size);
5749 bit_value &= (bit_mask << item_bit_offset);
5750 bit_value = ((kal_uint8)bit_value >> item_bit_offset);
5751
5752 resp->len = item_size/8+1;
5753
5754 mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
5755 strncpy((kal_char *)(resp->value), hex_value, 512);
5756 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
5757 }else if(query_tag.upper_vsize == 2){
5758 kal_uint16 bit_value = 0;
5759 kal_uint16 bit_mask = (kal_uint16)MCF_GEN_BIT_MASK(item_size);
5760
5761 kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),2);
5762
5763 bit_value &= (bit_mask << item_bit_offset);
5764 bit_value = ((kal_uint16)bit_value >> item_bit_offset);
5765
5766 resp->len = item_size/8+1;
5767
5768 mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
5769 strncpy((kal_char *)(resp->value), hex_value, 512);
5770 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
5771 }else if(query_tag.upper_vsize == 4){
5772 kal_uint32 bit_value = 0;
5773 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
5774
5775 kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),4);
5776
5777 bit_value &= (bit_mask << item_bit_offset);
5778 bit_value = ((kal_uint32)bit_value >> item_bit_offset);
5779
5780 resp->len = item_size/8+1;
5781
5782 mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
5783 strncpy((kal_char *)(resp->value), hex_value, 512);
5784 MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
5785 }
5786
5787 }
5788 }
5789
5790#else
5791 resp->len = req->len;
5792 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5793#endif
5794
5795 return mcf_ret;
5796
5797}
5798_STATIC mcf_ota_result_e mcf_query_variable_value(
5799 l4c_mcf_variable_value_operation_req_struct *req,
5800 l4c_mcf_variable_value_operation_cnf_struct *resp)
5801{
5802 mcf_t *pMcf = mcf_get_instance();
5803 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
5804 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
5805 kal_bool ret = KAL_TRUE;
5806 nvram_ltable_entry_struct lid_info = {0};
5807 nvram_errno_enum nvram_api_ret;
5808 kal_uint16 item_byte_offset;
5809 kal_uint16 item_bit_offset;
5810 kal_uint32 item_size;
5811 mcf_custom_dump_param_struct dump_para;
5812 kal_uint32 lid_size;
5813 kal_uint32 i;
5814 kal_uint8 lid_value[512];
5815 kal_uint32 read_len = 0;
5816 kal_bool is_found = KAL_FALSE;
5817 kal_uint16 lid = 0;
5818 kal_bool is_bit;
5819 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
5820 kal_char hex_value[512];
5821#if defined(__MCF_FIND_TAG_SUPPORT__)
5822 kal_bool invalid_arr_size = KAL_FALSE;
5823 kal_bool next_level_array = KAL_FALSE;
5824 kal_uint32 j = 0;
5825 kal_uint32 n = 1;
5826 MCF_DB_STRUCT_VARIABLE const *db_ptr = NULL;
5827 mcf_tag_info_struct query_tag = {0};
5828#endif
5829
5830 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_START(req->format, req->action, req->num, req->rec_id);
5831 kal_mem_set(&dump_para, 0, sizeof(mcf_custom_dump_param_struct));
5832
5833
5834 resp->len = req->len;
5835
5836 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
5837 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_SIM_ID(req->ps_id, sim_id);
5838 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5839
5840 return mcf_ret;
5841 }
5842
5843 if (req->format == L4C_MCF_QUERY_VARIABLE_FORM_PATH){
5844 lid = req->num;
5845 }else if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
5846 lid = mcf_find_gid_return_lid_num(req->num);
5847 if (lid == 65535){
5848 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_GET_LID_NUM_FAIL(req->num);
5849 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5850 return mcf_ret;
5851 }
5852 }
5853 nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
5854 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
5855 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_GET_LID_INFO_FAIL(lid, nvram_api_ret);
5856 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5857
5858 return mcf_ret;
5859 }
5860
5861
5862 kal_mem_set(mcf_dump_buffer, 0, lid_info.size);
5863
5864 if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
5865 if(req->rec_id > lid_info.total_records || req->rec_id == 0){
5866 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
5867 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5868
5869 return mcf_ret;
5870 }
5871 }
5872
5873 dump_para.ps_id = req->ps_id;
5874 dump_para.sbp_id = pMcf->tlvota_file[sim_id].sbp_id;
5875 kal_mem_cpy(&(dump_para.mcc), &(pMcf->tlvota_file[sim_id].mcc), MAX_MCC_STR_LEN);
5876 kal_mem_cpy(&(dump_para.mnc), &(pMcf->tlvota_file[sim_id].mnc), MAX_MNC_STR_LEN);
5877 kal_mem_cpy(&(dump_para.iccid), &(pMcf->tlvota_file[sim_id].iccid), 21);
5878 dump_para.size = &lid_size;
5879
5880 for (i = 0; i < mcf_dump_param_tbl_num; i++) {
5881 if ( (mcf_dump_param_tbl[i].lid == lid) ) {
5882 is_found = KAL_TRUE;
5883 if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
5884
5885 dump_para.type = MCF_TYPE_OTA;
5886 dump_para.record_idx = req->rec_id;
5887
5888 if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
5889
5890 dump_para.lid = mcf_dump_param_tbl[i].lid;
5891 dump_para.buffer = mcf_dump_buffer;
5892 *(dump_para.size) = 0;
5893
5894 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_CALLBACK(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
5895
5896 ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
5897 if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
5898 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_DUMP_ERROR(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
5899 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5900 break;
5901 }
5902 } else {
5903 /* If not register callback */
5904 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM(lid_info.LID, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
5905 dump_para.buffer = mcf_dump_buffer;
5906 if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
5907 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
5908 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5909 break;
5910 }
5911 }
5912 }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
5913 dump_para.type = MCF_TYPE_OTA_BY_OP;
5914 dump_para.record_idx = 1;
5915
5916 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);
5917
5918 if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
5919 dump_para.lid = mcf_dump_param_tbl[i].lid;
5920 dump_para.buffer = mcf_dump_buffer;
5921 *(dump_para.size) = 0;
5922
5923 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);
5924
5925 ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
5926 if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
5927 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_DUMP_FAIL(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
5928 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5929 break;
5930 }
5931 } else {
5932 /* If not register callback */
5933 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type);
5934 dump_para.buffer = mcf_dump_buffer;
5935 if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
5936 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
5937 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5938 break;
5939 }
5940 }
5941 }
5942 break;
5943 }
5944 }
5945
5946 if (is_found == KAL_FALSE){
5947 /* If not register callback */
5948 if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
5949
5950 dump_para.type = MCF_TYPE_OTA;
5951 dump_para.record_idx = req->rec_id;
5952
5953 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM_NOT_CALLBACK(lid, req->rec_id);
5954 dump_para.buffer = mcf_dump_buffer;
5955 if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
5956 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);
5957 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5958 return mcf_ret;
5959 }
5960
5961 }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
5962 dump_para.type = MCF_TYPE_OTA_BY_OP;
5963 dump_para.record_idx = 1;
5964
5965 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);
5966 dump_para.buffer = mcf_dump_buffer;
5967 if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
5968 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);
5969 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5970 return mcf_ret;
5971 }
5972
5973 }
5974
5975 }
5976
5977 if (mcf_ret == MCF_OTA_R_INVALID_PARAMETER){
5978 return mcf_ret;
5979 }
5980
5981 if (req->format == L4C_MCF_QUERY_VARIABLE_FORM_PATH){
5982#if defined(__MCF_FIND_TAG_SUPPORT__)
5983 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_TAG(req->config);
5984 mcf_toupper((char *)req->config);
5985 if (mcf_find_tag_offset(lid, (char *)req->config, &item_byte_offset, &item_bit_offset, &item_size, &db_ptr, &query_tag) == KAL_FALSE) {
5986 //Cannot find the tag
5987 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_FIND_TAG_FAIL(lid, req->config);
5988 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
5989
5990 return mcf_ret;
5991
5992 }
5993
5994 for(i = 0; i < query_tag.arr_cnt; i++){
5995 if (db_ptr->array_size[i]-1 < query_tag.array_size[i])
5996 {
5997 invalid_arr_size = KAL_TRUE;
5998 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_ARR_SIZE(db_ptr->array_size[i]-1, query_tag.array_size[i]);
5999 break;
6000 }
6001 }
6002
6003 if (invalid_arr_size == KAL_TRUE){
6004 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6005 return mcf_ret;
6006 }
6007 resp->len = req->len;
6008
6009 read_len = req->len * db_ptr->variable_size;
6010
6011 if (read_len == 0)
6012 {
6013 read_len = 1 * db_ptr->variable_size;
6014 }
6015
6016 if (read_len > db_ptr->total_size){
6017 read_len = db_ptr->total_size;
6018 }
6019 if (read_len > 255){
6020 read_len = 255;
6021 }
6022
6023 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_LENGTH(read_len, db_ptr->variable_size, db_ptr->total_size);
6024 kal_mem_set(lid_value, 0, 512);
6025
6026 if (query_tag.is_bit == KAL_FALSE){
6027
6028 j = query_tag.arr_cnt;
6029
6030 while(db_ptr->array_size[j] != 0){
6031 n *= (db_ptr->array_size[j]);
6032 j++;
6033 next_level_array = KAL_TRUE;
6034 }
6035
6036 if(req->len == 0)
6037 {
6038 read_len *= n;
6039 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_TOTAL_ARRAY_SIZE(n, db_ptr->variable_size);
6040 }
6041
6042 if(next_level_array == KAL_FALSE && read_len > item_size){
6043 read_len = item_size;
6044 }
6045 if(next_level_array == KAL_TRUE && read_len > n*db_ptr->variable_size){
6046 read_len = n*db_ptr->variable_size;
6047 }
6048
6049
6050 if (read_len > 255){
6051 read_len = 255;
6052 }
6053
6054 kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
6055 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BYTE(lid_value, read_len);
6056 mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
6057 strncpy((kal_char *)(resp->value), hex_value, 511);
6058 if (db_ptr->variable_size <= read_len){
6059 resp->len = read_len / db_ptr->variable_size;
6060 }else{
6061 resp->len = read_len;
6062 }
6063 }else{
6064
6065 if (query_tag.upper_vsize == 1){
6066 resp->len = 1;
6067 }else if(query_tag.upper_vsize == 2){
6068 resp->len = 2;
6069 }else if(query_tag.upper_vsize == 4){
6070 resp->len = 4;
6071 }else{
6072 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_INVALID_BIT_LEN(query_tag.upper_vsize);
6073 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6074
6075 return mcf_ret;
6076 }
6077 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_SIZE(query_tag.upper_vsize, resp->len);
6078
6079 if (db_ptr->is_bit == KAL_TRUE){
6080
6081 kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), resp->len);
6082 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_WHOLE(lid_value, resp->len);
6083
6084 mcf_bytes_to_hex(lid_value, resp->len, KAL_TRUE, hex_value);
6085 strncpy((kal_char *)(resp->value), hex_value, 511);
6086 }else{
6087
6088 if (query_tag.upper_vsize == 1){
6089 kal_uint8 bit_value = *(mcf_dump_buffer + item_byte_offset);
6090 kal_uint8 bit_mask = (kal_uint8)MCF_GEN_BIT_MASK(item_size);
6091 bit_value &= (bit_mask << item_bit_offset);
6092 bit_value = ((kal_uint8)bit_value >> item_bit_offset);
6093
6094 resp->len = item_size/8+1;
6095
6096 mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
6097 strncpy((kal_char *)(resp->value), hex_value, 511);
6098 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
6099 }else if(query_tag.upper_vsize == 2){
6100 kal_uint16 bit_value = 0;
6101 kal_uint16 bit_mask = (kal_uint16)MCF_GEN_BIT_MASK(item_size);
6102
6103 kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),2);
6104
6105 bit_value &= (bit_mask << item_bit_offset);
6106 bit_value = ((kal_uint16)bit_value >> item_bit_offset);
6107
6108 resp->len = item_size/8+1;
6109
6110 mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
6111 strncpy((kal_char *)(resp->value), hex_value, 511);
6112 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
6113 }else if(query_tag.upper_vsize == 4){
6114 kal_uint32 bit_value = 0;
6115 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
6116
6117 kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),4);
6118
6119 bit_value &= (bit_mask << item_bit_offset);
6120 bit_value = ((kal_uint32)bit_value >> item_bit_offset);
6121
6122 resp->len = item_size/8+1;
6123
6124 mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
6125 strncpy((kal_char *)(kal_char *)(resp->value), hex_value, 511);
6126 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
6127 }
6128
6129 }
6130 }
6131#else
6132 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6133 return mcf_ret;
6134#endif
6135 }else if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
6136
6137 kal_mem_set(array_tag, 0, MCF_FILE_MAX_ARRAY_TAG_LEN);
6138 if(strcmp((kal_char *)req->config, "") != 0){
6139 strncpy(array_tag, (kal_char *)req->config, MCF_FILE_MAX_ARRAY_TAG_LEN-1);
6140 array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN-1] = '\0';
6141 if (strlen((kal_char *)req->config) >= MCF_FILE_MAX_ARRAY_TAG_LEN){
6142 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, strlen((kal_char *)req->config));
6143 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6144 return mcf_ret;
6145 }
6146 mcf_replace_char(array_tag, ',', '$');
6147 if (strlen(array_tag) != 0 && array_tag[strlen(array_tag)] != '$'){
6148 array_tag[strlen(array_tag)] = '$';
6149 }
6150 }
6151 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_ARRAY_INDEX(req->num, array_tag);
6152 if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
6153 //Cannot find the gid
6154 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
6155 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6156
6157 return mcf_ret;
6158
6159 }
6160 if(req->len == 0){
6161 read_len = item_size;
6162 }else{
6163 read_len = req->len;
6164 }
6165 if(read_len > (lid_info.size-item_byte_offset)){
6166 read_len = lid_info.size-item_byte_offset;
6167 }
6168 if(read_len > 255){
6169 read_len = 255;
6170 }
6171
6172 if (is_bit == KAL_FALSE){
6173 kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
6174 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BYTE(lid_value, read_len);
6175 mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
6176 strncpy((kal_char *)(resp->value), hex_value, 511);
6177 resp->len = read_len;
6178 }else{
6179 kal_uint32 align_addr;
6180 kal_uint32 bit_value;
6181 kal_uint32 *ptr = 0;
6182 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
6183 MCF_READ_ADDR_GET_ALIGN((kal_uint32)(mcf_dump_buffer + item_byte_offset),align_addr);
6184 ptr = (kal_uint32 *)align_addr;
6185 bit_value = *(ptr);
6186 bit_value = bit_value >> ((((kal_uint32)(mcf_dump_buffer + item_byte_offset))-align_addr)*8);
6187 bit_value = (bit_value >> item_bit_offset);
6188 bit_value &= bit_mask;
6189 if (item_size <= 8){
6190 resp->len = 1;
6191 }else if(item_size > 8 && item_size <= 16){
6192 resp->len = 2;
6193 }else if(item_size > 16 && item_size <= 32){
6194 if (item_size % 8 == 0){
6195 resp->len = item_size/8;
6196 }else{
6197 resp->len = item_size/8+1;
6198 }
6199 }else if (item_size > 32){
6200 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_INVALID_BIT_LEN(item_size);
6201 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6202 return mcf_ret;
6203 }
6204 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
6205 mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
6206 strncpy((kal_char *)(resp->value), hex_value, 511);
6207 }
6208
6209 }
6210
6211 return mcf_ret;
6212
6213}
6214#ifdef __MCF_COMBINE_FILE_SUPPORT__
6215_STATIC mcf_ota_result_e mcf_set_variable_value(
6216 l4c_mcf_variable_value_operation_req_struct *req,
6217 l4c_mcf_variable_value_operation_cnf_struct *resp)
6218{
6219 mcf_t *pMcf = mcf_get_instance();
6220 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
6221 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
6222 kal_uint16 item_byte_offset;
6223 kal_uint16 item_bit_offset;
6224 kal_uint32 item_size;
6225 kal_uint16 lid = 0;
6226 static kal_char lid_value[512];
6227 kal_bool is_bit;
6228 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
6229 kal_int32 value_len;
6230 kal_uint32 operation_mask = 0;
6231 mcf_tool_file_info_t *pFile;
6232 kal_uint32 align_len = 0;
6233 kal_int32 fs_ret = FS_NO_ERROR;
6234 static kal_char hex_value[512];
6235 nvram_ltable_entry_struct lid_info = {0};
6236 nvram_errno_enum nvram_api_ret;
6237 static kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
6238 l4c_mcf_path_type_enum apply_path_type;
6239 kal_bool read_file_fail = KAL_FALSE;
6240 kal_int32 ret_snprintf;
6241
6242 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_START(req->format, req->action, req->num, req->rec_id);
6243
6244 resp->len = req->len;
6245
6246 if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
6247
6248 kal_mem_set(array_tag, 0, MCF_FILE_MAX_ARRAY_TAG_LEN);
6249 if(strcmp((kal_char *)req->config, "") != 0){
6250 strncpy(array_tag, (kal_char *)req->config, MCF_FILE_MAX_ARRAY_TAG_LEN-1);
6251 array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN-1] = '\0';
6252 if (strlen((kal_char *)req->config) >= MCF_FILE_MAX_ARRAY_TAG_LEN){
6253 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, strlen((kal_char *)req->config));
6254 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6255 return mcf_ret;
6256 }
6257 mcf_replace_char(array_tag, ',', '$');
6258 if (strlen(array_tag) != 0 && array_tag[strlen(array_tag)] != '$'){
6259 array_tag[strlen(array_tag)] = '$';
6260 }
6261 }
6262 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_ARRAY_INDEX(req->num, array_tag);
6263
6264
6265 kal_mem_set(lid_value, 0, 512);
6266 kal_mem_set(hex_value, 0, 512);
6267 kal_mem_cpy(hex_value, req->value, 511);
6268
6269 /* If value length is odd, need to add '0'*/
6270 kal_mem_cpy(hex_value, req->value, 511);
6271 value_len = strlen(hex_value);
6272
6273 if(strlen(hex_value) % 2 != 0){
6274 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VALUE_LEN(strlen(hex_value));
6275 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6276 return mcf_ret;
6277 }
6278
6279 mcf_hex_to_bytes(hex_value, &value_len, lid_value);
6280
6281
6282 if(req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA){
6283 mcf_tool_gid_ota_file_item_t pItem;
6284 mcf_ota_file_t *ota_file = &(pMcf->ota_file);
6285 nvram_ef_mcf_ota_file_info_struct nv_ota_file;
6286
6287 kal_mem_set(&pItem, 0, sizeof(mcf_tool_gid_ota_file_item_t));
6288
6289 /*Compose a file content*/
6290 pItem.global_id = req->num;
6291 pItem.record_idx = req->rec_id;
6292 pItem.array_index_len = strlen(array_tag);
6293
6294 if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
6295 //Cannot find the gid
6296 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
6297 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6298
6299 return mcf_ret;
6300
6301 }
6302
6303 nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
6304 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
6305 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_GET_LID_INFO_FAIL(lid, nvram_api_ret);
6306 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6307
6308 return mcf_ret;
6309 }
6310
6311 if(req->rec_id > lid_info.total_records || req->rec_id == 0){
6312 MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
6313 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6314
6315 return mcf_ret;
6316 }
6317
6318 if (pItem.array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1){
6319 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, pItem.array_index_len);
6320 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6321 return mcf_ret;
6322 }
6323 if(value_len > item_size){
6324 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VAL_LEN(value_len, item_size);
6325 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6326 return mcf_ret;
6327 }
6328
6329 pItem.total_len = 16;
6330
6331 if(is_bit == KAL_TRUE){
6332 pItem.value_len = item_size/8+1;
6333 item_size = item_size/8+1;
6334 }else{
6335 pItem.value_len = item_size;
6336 }
6337 pItem.total_len += item_size;
6338 pItem.total_len += pItem.array_index_len;
6339
6340 if (pItem.total_len % 4 != 0){
6341 align_len = (4-(pItem.total_len % 4));
6342 pItem.total_len += align_len;
6343 }
6344
6345 resp->len = pItem.value_len;
6346
6347 if (pItem.array_index_len > 0){
6348 strncpy(&(pItem.buff_start), array_tag, 1);
6349 }else{
6350 strncpy(&(pItem.buff_start), lid_value, 1);
6351 }
6352
6353 kal_mem_set(mcf_gid_buff, 0, 128);
6354 kal_mem_cpy(mcf_gid_buff, &pItem, pItem.total_len);
6355 strncpy(mcf_gid_buff+16, array_tag, strlen(array_tag));
6356 kal_mem_cpy(mcf_gid_buff+16+strlen(array_tag), lid_value, value_len);
6357 kal_mem_set(mcf_gid_buff+16+strlen(array_tag)+value_len, 0, item_size-value_len);
6358 kal_mem_set(mcf_gid_buff+16+strlen(array_tag)+item_size, 0, align_len);
6359 operation_mask |= MCF_FILE_OP_CHECKSUM;
6360
6361 kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
6362
6363 /* Read MCF OTA file information to NVRAM */
6364 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))) {
6365 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
6366 mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
6367 return mcf_ret;
6368 }
6369
6370 if (strcmp(nv_ota_file.merged_path,"") == 0){
6371 strncpy(nv_ota_file.merged_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
6372 }
6373
6374 if (strcmp(nv_ota_file.merged_name,"") == 0){
6375 strncpy(nv_ota_file.merged_name, MCF_FS_DEFAULT_OTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
6376 }
6377
6378 if(mcf_merge_one_gid(mcf_gid_buff, MCF_TYPE_OTA, mcf_file_buffer, MCF_MAX_OTA_FILE_SIZE, operation_mask) != KAL_TRUE){
6379 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_GID_TO_FILE_FAIL(MCF_TYPE_OTA);
6380 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6381 return mcf_ret;
6382 }
6383
6384 mcf_ret = mcf_read_ota_file(KAL_FALSE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
6385 //Read fail return fail
6386 if(mcf_ret != MCF_OTA_R_SUCCESS){
6387 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_ota_file.path, nv_ota_file.name, mcf_ret);
6388 read_file_fail = KAL_TRUE;
6389 }
6390 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
6391 if (ota_file) {
6392 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
6393 /* Check if file type is OTA file */
6394 if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
6395
6396 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_FILE();
6397 kal_mem_cpy(mcf_merge_buffer, mcf_file_buffer, MCF_MAX_OTA_FILE_SIZE);
6398 }else{
6399 if (mcf_merge_ota_buffer(ota_file->buff, mcf_file_buffer, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
6400 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_OTA_FILE_FAIL();
6401 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6402 return mcf_ret;
6403 }
6404 }
6405
6406
6407 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
6408 }else{
6409 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
6410 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
6411 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
6412 return mcf_ret;
6413 }
6414
6415 /* Before create merged OTA file, need to delete last time merged OTA file */
6416 kal_wsprintf(merge_ota_name, "%s\\%s\0", nv_ota_file.merged_path, nv_ota_file.merged_name);
6417 fs_ret = FS_Delete(merge_ota_name);
6418
6419 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
6420 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_DELETE_FILE_FAIL(fs_ret);
6421 mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
6422 return mcf_ret;
6423 }
6424
6425 pFile = (mcf_tool_file_info_t *)mcf_merge_buffer;
6426
6427 if(pFile->file_size > MCF_MAX_OTA_FILE_SIZE){
6428 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_OTA_FILE_SIZE);
6429 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6430 return mcf_ret;
6431 }
6432 /*Write Merged OTA file*/
6433 mcf_ret = mcf_write_buffer(nv_ota_file.merged_path, nv_ota_file.merged_name, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
6434 if (mcf_ret != MCF_OTA_R_SUCCESS) {
6435 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_FILE_FAIL(nv_ota_file.merged_path, nv_ota_file.merged_name);
6436 return mcf_ret;
6437 }
6438
6439 strncpy(nv_ota_file.path, nv_ota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
6440 strncpy(nv_ota_file.name, nv_ota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
6441
6442 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)) ) {
6443 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
6444 mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
6445
6446 return mcf_ret;
6447 }
6448
6449 }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA){
6450 mcf_tool_gid_tlvota_file_item_t pItem_op;
6451 mcf_tlvota_file_t *tlvota_file;
6452 kal_char tag[MCF_MAX_TAG_LEN];
6453 kal_bool is_general = KAL_FALSE;
6454 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
6455
6456 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
6457 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_SIM_ID(req->ps_id, sim_id);
6458
6459 return KAL_FALSE;
6460 }
6461
6462 tlvota_file = &(pMcf->tlvota_file[sim_id]);
6463 /*Compose a file content*/
6464 pItem_op.global_id = req->num;
6465 pItem_op.array_index_len = strlen(array_tag);
6466
6467 if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
6468 //Cannot find the gid
6469 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
6470 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6471
6472 return mcf_ret;
6473
6474 }
6475 if (pItem_op.array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1){
6476 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, pItem_op.array_index_len);
6477 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6478 return mcf_ret;
6479 }
6480 if(value_len > item_size){
6481 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VAL_LEN(value_len, item_size);
6482 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6483 return mcf_ret;
6484 }
6485
6486 pItem_op.tag_type = MCF_TLVOTA_TAG_SBPID;
6487 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
6488 if (tlvota_file) {
6489 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TLVOTA_SBPID(tlvota_file->sbp_id, tlvota_file->mcc, tlvota_file->mnc);
6490 if (tlvota_file->sbp_id != SBP_ID_INVALID) {
6491 is_general = KAL_FALSE;
6492 if (strcmp((kal_char *)tlvota_file->mcc, "") != 0) {
6493 if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
6494 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');
6495 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
6496 strncpy(tag, "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
6497 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);
6498 }
6499 }else{
6500 ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_%s_NA%c", tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, '\0');
6501 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
6502 strncpy(tag, "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
6503 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);
6504 }
6505 }
6506 }else{
6507 if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
6508 ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_NA_%s%c", tlvota_file->sbp_id, (kal_char *)tlvota_file->mnc, '\0');
6509 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
6510 strncpy(tag, "SBP_NA_mnc", MCF_MAX_TAG_LEN - 1);
6511 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);
6512 }
6513 }else{
6514 ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_NA_NA%c", tlvota_file->sbp_id, '\0');
6515 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
6516 strncpy(tag, "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
6517 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);
6518 }
6519 }
6520 }
6521 }else{
6522 is_general = KAL_TRUE;
6523 if (strcmp((kal_char *)tlvota_file->mcc, "") != 0) {
6524 if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
6525 ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_%s_%s%c", (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc, '\0');
6526 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
6527 strncpy(tag, "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
6528 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);
6529 }
6530 }else{
6531 ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_%s_NA%c", (kal_char *)tlvota_file->mcc, '\0');
6532 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
6533 strncpy(tag, "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
6534 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);
6535 }
6536 }
6537 }else{
6538 if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
6539 ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_NA_%s%c", (kal_char *)tlvota_file->mnc, '\0');
6540 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
6541 strncpy(tag, "NA_NA_mnc", MCF_MAX_TAG_LEN - 1);
6542 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);
6543 }
6544 }else{
6545 is_general = KAL_FALSE;
6546 ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_NA_NA%c", '\0');
6547 if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
6548 strncpy(tag, "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
6549 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);
6550 }
6551 }
6552 }
6553 }
6554 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
6555 }else{
6556 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
6557 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
6558 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
6559 return mcf_ret;
6560 }
6561
6562 if(is_general == KAL_TRUE){
6563 tlvota_file = &(pMcf->general_tlvota_file);
6564 }
6565
6566 pItem_op.tag_len = strlen(tag);
6567
6568 pItem_op.total_len = 16;
6569
6570 if(is_bit == KAL_TRUE){
6571 pItem_op.value_len = item_size/8+1;
6572 item_size = item_size/8+1;
6573 }else{
6574 pItem_op.value_len = item_size;
6575 }
6576 pItem_op.total_len += pItem_op.value_len;
6577 pItem_op.total_len += pItem_op.array_index_len;
6578 pItem_op.total_len += pItem_op.tag_len;
6579 if (pItem_op.total_len % 4 != 0){
6580 align_len = (4-(pItem_op.total_len % 4));
6581 pItem_op.total_len += align_len;
6582 }
6583 resp->len = pItem_op.value_len;
6584
6585 strncpy(&(pItem_op.buff_start), tag, 1);
6586
6587 kal_mem_set(mcf_gid_buff, 0, 128);
6588 kal_mem_cpy(mcf_gid_buff, &pItem_op, pItem_op.total_len);
6589 strncpy(mcf_gid_buff+16, tag, strlen(tag));
6590 strncpy(mcf_gid_buff+16+strlen(tag), array_tag, strlen(array_tag));
6591 kal_mem_cpy(mcf_gid_buff+16+strlen(tag)+strlen(array_tag), lid_value, value_len);
6592 kal_mem_set(mcf_gid_buff+16+strlen(tag)+strlen(array_tag)+value_len, 0, item_size-value_len);
6593 kal_mem_set(mcf_gid_buff+16+strlen(tag)+strlen(array_tag)+item_size, 0, align_len);
6594
6595 operation_mask |= MCF_FILE_OP_CHECKSUM;
6596
6597 kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
6598
6599 if(is_general == KAL_FALSE){
6600 /* Read MCF TLV-OTA file information in NVRAM */
6601 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))) {
6602 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
6603 mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
6604
6605 return mcf_ret;
6606 }
6607 mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
6608 if(mcf_ret != MCF_OTA_R_SUCCESS){
6609 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name, mcf_ret);
6610 read_file_fail = KAL_TRUE;
6611 }
6612 }else{
6613 /* Read MCF general TLV-OTA file into cache buffer */
6614 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))) {
6615 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
6616 mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
6617
6618 return mcf_ret;
6619 }
6620 mcf_ret = mcf_read_general_tlvota_file(KAL_FALSE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
6621 if(mcf_ret != MCF_OTA_R_SUCCESS){
6622 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name, mcf_ret);
6623 read_file_fail = KAL_TRUE;
6624 }
6625 }
6626
6627 if (strcmp(nv_tlvota_file.merged_path,"") == 0){
6628 strncpy(nv_tlvota_file.merged_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
6629 }
6630
6631 if (strcmp(nv_tlvota_file.merged_name,"") == 0){
6632 if(is_general == KAL_FALSE){
6633 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');
6634 }else{
6635 strncpy(nv_tlvota_file.merged_name, MCF_FS_GENERAL_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
6636 }
6637 }
6638
6639 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){
6640 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_GID_TO_FILE_FAIL(MCF_TYPE_OTA_BY_OP);
6641 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6642 return mcf_ret;
6643 }
6644
6645 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
6646 if (tlvota_file) {
6647 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
6648 /* Check if file type is OTA file */
6649 if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
6650 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_FILE();
6651 kal_mem_cpy(mcf_merge_buffer, mcf_file_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
6652 }else{
6653 if(mcf_merge_ota_buffer(tlvota_file->buff, mcf_file_buffer, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
6654 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_OTA_FILE_FAIL();
6655 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6656 return mcf_ret;
6657 }
6658 }
6659
6660
6661 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
6662 }else{
6663 mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
6664 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
6665 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
6666 return mcf_ret;
6667 }
6668
6669 /* Before create merged OTA file, need to delete last time merged OTA file */
6670 kal_wsprintf(merge_ota_name, "%s\\%s\0", nv_tlvota_file.merged_path, nv_tlvota_file.merged_name);
6671 fs_ret = FS_Delete(merge_ota_name);
6672
6673 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
6674 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_DELETE_FILE_FAIL(fs_ret);
6675 mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
6676 return mcf_ret;
6677 }
6678
6679 pFile = (mcf_tool_file_info_t *)mcf_merge_buffer;
6680
6681 if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
6682 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
6683 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
6684 return mcf_ret;
6685 }
6686
6687 /*Write Merged OTA file*/
6688 mcf_ret = mcf_write_buffer(nv_tlvota_file.merged_path, nv_tlvota_file.merged_name, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
6689 if (mcf_ret != MCF_OTA_R_SUCCESS) {
6690 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_FILE_FAIL(nv_tlvota_file.merged_path, nv_tlvota_file.merged_name);
6691 return mcf_ret;
6692 }
6693
6694 strncpy(nv_tlvota_file.path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
6695 strncpy(nv_tlvota_file.name, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
6696
6697 if(is_general == KAL_FALSE){
6698 /* Write MCF TLV-OTA file information in NVRAM */
6699 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)) ) {
6700 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
6701 mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
6702
6703 return mcf_ret;
6704 }
6705 }else{
6706 /* Write MCF TLV-OTA file information in NVRAM */
6707 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)) ) {
6708 MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
6709 mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
6710
6711 return mcf_ret;
6712 }
6713 }
6714
6715 if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
6716 /* If MCF is in DSBP passive mode, change to DSBP active mode */
6717 mcf_ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
6718 if (mcf_ret != MCF_OTA_R_SUCCESS) {
6719 return mcf_ret;
6720 }
6721 pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
6722 }
6723 }
6724
6725 }
6726
6727 return mcf_ret;
6728
6729}
6730#endif
6731#ifdef __MCF_COMBINE_FILE_SUPPORT__
6732_STATIC mcf_ota_result_e mcf_assign_combined_file_path(l4c_mcf_set_config_req_struct *req)
6733{
6734 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
6735
6736 switch (req->config_type)
6737 {
6738 case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
6739 {
6740 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
6741 kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
6742 kal_char *file_extension1 = NULL;
6743 kal_char *file_extension2 = NULL;
6744 nvram_ef_mcf_ota_file_info_struct nv_ota_file;
6745
6746 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
6747 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
6748 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
6749 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
6750 } else {
6751 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
6752 ret = MCF_OTA_R_INVALID_PARAMETER;
6753
6754 return ret;
6755 }
6756
6757 if (strcmp((kal_char *)req->config1, "") != 0) {
6758 file_extension1 = strstr((kal_char *)req->config1, ".mcfota");
6759 if (file_extension1 == NULL){
6760 file_extension2 = strstr((kal_char *)req->config1, ".bin");
6761 if (file_extension2 == NULL) {
6762 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
6763 ret = MCF_OTA_R_INVALID_PARAMETER;
6764 return ret;
6765 }
6766 }
6767 strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
6768 } else {
6769 strncpy(curr_filename, MCF_FS_DEFAULT_OTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
6770 }
6771
6772 /* Read MCF OTA file information in NVRAM */
6773 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))) {
6774 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
6775 ret = MCF_OTA_R_READ_NVRAM_FAIL;
6776
6777 return ret;
6778 }
6779
6780 /* Read MCF Internal information in NVRAM */
6781 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
6782 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
6783 ret = MCF_OTA_R_READ_NVRAM_FAIL;
6784
6785 return ret;
6786 }
6787
6788 strncpy(nv_ota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
6789 strncpy(nv_ota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
6790 nv_int_info.is_combined_ota = KAL_TRUE;
6791
6792 /* Write MCF OTA file information in NVRAM */
6793 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)) ) {
6794 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
6795 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
6796
6797 return ret;
6798 }
6799
6800 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
6801 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
6802 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
6803
6804 return ret;
6805 }
6806
6807 break;
6808 }
6809
6810 case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
6811 {
6812 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
6813 kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
6814 kal_char *file_extension1 = NULL;
6815 kal_char *file_extension2 = NULL;
6816 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
6817 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
6818
6819 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
6820 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
6821 ret = MCF_OTA_R_INVALID_PARAMETER;
6822
6823 return ret;
6824 }
6825
6826 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
6827 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
6828 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
6829 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
6830 } else {
6831 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
6832 ret = MCF_OTA_R_INVALID_PARAMETER;
6833
6834 return ret;
6835 }
6836
6837 if (strcmp((kal_char *)req->config1, "") != 0) {
6838 file_extension1 = strstr((kal_char *)req->config1, ".mcfopota");
6839 if (file_extension1 == NULL){
6840 file_extension2 = strstr((kal_char *)req->config1, ".bin");
6841 if (file_extension2 == NULL) {
6842 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
6843 ret = MCF_OTA_R_INVALID_PARAMETER;
6844 return ret;
6845 }
6846 }
6847 strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
6848 } else {
6849 strncpy(curr_filename, MCF_FS_DEFAULT_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
6850 }
6851
6852 /* Read MCF Internal information in NVRAM */
6853 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
6854 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
6855 ret = MCF_OTA_R_READ_NVRAM_FAIL;
6856
6857 return ret;
6858 }
6859
6860 /* Read MCF TLV-OTA file information in NVRAM */
6861 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))) {
6862 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
6863 ret = KAL_FALSE;
6864
6865 return MCF_OTA_R_READ_NVRAM_FAIL;
6866 }
6867
6868 strncpy(nv_tlvota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
6869 strncpy(nv_tlvota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
6870 nv_int_info.is_combined_tlvota[sim_id] = KAL_TRUE;
6871
6872 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
6873 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
6874 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
6875
6876 return ret;
6877 }
6878
6879 /* Write MCF TLV-OTA file information in NVRAM */
6880 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)) ) {
6881 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
6882 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
6883
6884 return ret;
6885 }
6886
6887 break;
6888 }
6889 case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
6890 {
6891 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
6892 kal_char curr_filename[MCF_FILE_MAX_NAME_LEN];
6893 kal_char *file_extension1 = NULL;
6894 kal_char *file_extension2 = NULL;
6895 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
6896
6897 if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
6898 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
6899 } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
6900 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
6901 } else {
6902 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
6903 ret = MCF_OTA_R_INVALID_PARAMETER;
6904
6905 return ret;
6906 }
6907
6908 if (strcmp((kal_char *)req->config1, "") != 0) {
6909 file_extension1 = strstr((kal_char *)req->config1, ".mcfopota");
6910 if (file_extension1 == NULL){
6911 file_extension2 = strstr((kal_char *)req->config1, ".bin");
6912 if (file_extension2 == NULL) {
6913 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
6914 ret = MCF_OTA_R_INVALID_PARAMETER;
6915 return ret;
6916 }
6917 }
6918 strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
6919 } else {
6920 strncpy(curr_filename, MCF_FS_GENERAL_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
6921 }
6922
6923 /* Read MCF Internal information in NVRAM */
6924 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
6925 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
6926 ret = MCF_OTA_R_READ_NVRAM_FAIL;
6927
6928 return ret;
6929 }
6930
6931 /* Read MCF general TLV-OTA file into cache buffer */
6932 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))) {
6933 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
6934 ret = MCF_OTA_R_READ_NVRAM_FAIL;
6935
6936 return ret;
6937 }
6938
6939 strncpy(nv_tlvota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
6940 strncpy(nv_tlvota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
6941 nv_int_info.is_combined_general_tlvota = KAL_TRUE;
6942
6943 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
6944 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
6945 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
6946
6947 return ret;
6948 }
6949 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))) {
6950 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
6951 ret = MCF_OTA_R_READ_NVRAM_FAIL;
6952
6953 return ret;
6954 }
6955
6956 break;
6957 }
6958
6959 default:
6960 {
6961 MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
6962 ret = MCF_OTA_R_INVALID_PARAMETER;
6963 break;
6964 }
6965
6966 }
6967
6968
6969 return ret;
6970}
6971#endif
6972_STATIC mcf_ota_result_e mcf_l4_set_config(ilm_struct *ilm)
6973{
6974 l4c_mcf_set_config_req_struct *req = (l4c_mcf_set_config_req_struct *)ilm->local_para_ptr;
6975 l4c_mcf_set_config_cnf_struct *local_para_ptr = NULL;
6976 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
6977 mcf_ota_result_e write_ret;
6978 kal_int32 fs_ret = FS_NO_ERROR;
6979 kal_wchar pathname[MCF_FILE_MAX_MD_PATH_LEN];
6980 kal_uint32 ret_sprintf;
6981
6982 switch (req->op)
6983 {
6984 case L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH:
6985 case L4C_MCF_CONFIG_SET_OTA_FILE_PATH:
6986 case L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH:
6987 ret = mcf_set_file_path(req);
6988 break;
6989
6990 case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
6991 {
6992 mcf_t *pMcf = mcf_get_instance();
6993 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
6994 mcf_l4bsbp_trigger_dsbp_ind_struct *ind_ptr = NULL;
6995
6996 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
6997 MD_TRC_MCF_TR_L4_SET_CONFIG_INVALID_SIM_ID(req->ps_id, sim_id);
6998 ret = MCF_OTA_R_INVALID_PARAMETER;
6999
7000 return ret;
7001 }
7002
7003 if (pMcf->is_dsbp_ongoing[sim_id] == KAL_TRUE) {
7004 MD_TRC_MCF_TR_L4_SET_CONFIG_DSBP_ONGOING(req->ps_id, sim_id);
7005
7006 /* Send process result to ATCI */
7007 local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
7008 if (!local_para_ptr) {
7009 ASSERT(0);
7010 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7011
7012 return ret;
7013 }
7014 local_para_ptr->src_id = req->src_id;
7015 local_para_ptr->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
7016 local_para_ptr->dsbp_result = MCF_TRIGGER_DSBP_R_FAIL_MCF_DSBP_ONGOING;
7017
7018 msg_send6(MOD_MCF, /* src_mod_id */
7019 ilm->src_mod_id, /* dest_mod_id */
7020 MCF_SAP, /* sap_id */
7021 MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
7022 (local_para_struct*)local_para_ptr, /* local_para_ptr */
7023 NULL); /* peer_buff_ptr */
7024
7025 goto out;
7026 }
7027
7028 ret = mcf_set_file_path(req);
7029 if (ret == MCF_OTA_R_SUCCESS) {
7030 /*
7031 * Trigger DSBP and do not respond to AP immediately.
7032 * Wait DSBP response, and then respond to AP.
7033 */
7034 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
7035 if (!ind_ptr) {
7036 ASSERT(0);
7037 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7038
7039 return ret;
7040 }
7041
7042 ind_ptr->src_id = req->src_id;
7043 ind_ptr->config_op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
7044 ind_ptr->src_mod_id = ilm->src_mod_id;
7045
7046 msg_send6(MOD_MCF, /* src_mod_id */
7047 MOD_L4BSBP + req->ps_id, /* dest_mod_id */
7048 MCF_SAP, /* sap_id */
7049 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
7050 (local_para_struct*)ind_ptr, /* local_para_ptr */
7051 NULL); /* peer_buff_ptr */
7052
7053 pMcf->is_dsbp_ongoing[sim_id] = KAL_TRUE;
7054
7055 /* Support MCF Tool Send AT cmd - delete txt */
7056 kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
7057 fs_ret = FS_Delete(pathname);
7058
7059 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
7060 MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
7061 ret = MCF_OTA_R_WRITE_DISK_FAIL;
7062 return ret;
7063 }
7064
7065 /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
7066 kal_mem_set(txt_buff, 0, 64);
7067 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');
7068 if (ret_sprintf < 0 || ret_sprintf > 64){
7069 strncpy(txt_buff, "EMCFC unknown error", 63);
7070 }
7071 MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
7072 write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
7073 if (write_ret != MCF_OTA_R_SUCCESS) {
7074 return write_ret;
7075 }
7076
7077
7078 goto out;
7079 }else {
7080 /* Send process result to ATCI */
7081 local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
7082 if (!local_para_ptr) {
7083 ASSERT(0);
7084 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7085
7086 return ret;
7087 }
7088 local_para_ptr->src_id = req->src_id;
7089 local_para_ptr->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
7090 local_para_ptr->mcf_result = ret;
7091
7092 msg_send6(MOD_MCF, /* src_mod_id */
7093 ilm->src_mod_id, /* dest_mod_id */
7094 MCF_SAP, /* sap_id */
7095 MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
7096 (local_para_struct*)local_para_ptr, /* local_para_ptr */
7097 NULL); /* peer_buff_ptr */
7098
7099 goto out;
7100 }
7101 break;
7102 }
7103
7104 case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
7105 {
7106 mcf_l4bsbp_trigger_dsbp_ind_struct *ind_ptr = NULL;
7107 kal_uint32 i = 0;
7108 mcf_t *pMcf = mcf_get_instance();
7109
7110 ret = mcf_set_file_path(req);
7111 if ( (req->trigger_dsbp == 1) && (ret == MCF_OTA_R_SUCCESS) ) {
7112 /*
7113 * Trigger DSBP and do not respond to AP immediately.
7114 * Wait DSBP response, and then respond to AP.
7115 */
7116 if (req->config_type == L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN){
7117 //General OP-OTA need to trigger dsbp all sims
7118 dsbp_ret = 0;
7119
7120 for (i = 0; i < MAX_SIM_NUM; i++){
7121 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
7122 if (!ind_ptr) {
7123 ASSERT(0);
7124 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7125
7126 return ret;
7127 }
7128
7129 ind_ptr->src_id = req->src_id;
7130 ind_ptr->config_op = req->op;
7131 ind_ptr->src_mod_id = ilm->src_mod_id;
7132
7133 msg_send6(MOD_MCF, /* src_mod_id */
7134 MOD_L4BSBP + i, /* dest_mod_id */
7135 MCF_SAP, /* sap_id */
7136 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
7137 (local_para_struct*)ind_ptr, /* local_para_ptr */
7138 NULL); /* peer_buff_ptr */
7139 pMcf->dsbp_cnf_cnt ++;
7140 pMcf->dsbp_ind_cnt ++;
7141 pMcf->dsbp_cnf_ret = KAL_TRUE;
7142 ret = MCF_OTA_R_SUCCESS;
7143 }
7144
7145 }else{
7146 //OTA and OP-OTA only need to by sim trigger dsbp
7147
7148 ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
7149 if (!ind_ptr) {
7150 ASSERT(0);
7151 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7152
7153 return ret;
7154 }
7155
7156 ind_ptr->src_id = req->src_id;
7157 ind_ptr->config_op = req->op;
7158 ind_ptr->src_mod_id = ilm->src_mod_id;
7159
7160 msg_send6(MOD_MCF, /* src_mod_id */
7161 MOD_L4BSBP + req->ps_id, /* dest_mod_id */
7162 MCF_SAP, /* sap_id */
7163 MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
7164 (local_para_struct*)ind_ptr, /* local_para_ptr */
7165 NULL); /* peer_buff_ptr */
7166
7167 }
7168
7169 /* Support MCF Tool Send AT cmd - delete txt */
7170 kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
7171 fs_ret = FS_Delete(pathname);
7172
7173 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
7174 MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
7175 ret = MCF_OTA_R_WRITE_DISK_FAIL;
7176 return ret;
7177 }
7178
7179 /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
7180 kal_mem_set(txt_buff, 0, 64);
7181 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');
7182 if (ret_sprintf < 0 || ret_sprintf > 64){
7183 strncpy(txt_buff, "EMCFC unknown error", 63);
7184 }
7185 MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
7186 write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
7187 if (write_ret != MCF_OTA_R_SUCCESS) {
7188 return write_ret;
7189 }
7190
7191 goto out;
7192 } else {
7193 /* Send process result to ATCI */
7194 local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
7195 if (!local_para_ptr) {
7196 ASSERT(0);
7197 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7198
7199 return ret;
7200 }
7201 local_para_ptr->src_id = req->src_id;
7202 local_para_ptr->op = req->op;
7203 local_para_ptr->mcf_result = ret;
7204 local_para_ptr->dsbp_result = 0;
7205
7206 msg_send6(MOD_MCF, /* src_mod_id */
7207 ilm->src_mod_id, /* dest_mod_id */
7208 MCF_SAP, /* sap_id */
7209 MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
7210 (local_para_struct*)local_para_ptr, /* local_para_ptr */
7211 NULL); /* peer_buff_ptr */
7212
7213 /* Support MCF Tool Send AT cmd - delete txt */
7214 kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
7215 fs_ret = FS_Delete(pathname);
7216
7217 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
7218 MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
7219 ret = MCF_OTA_R_WRITE_DISK_FAIL;
7220 return ret;
7221 }
7222
7223 /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
7224 kal_mem_set(txt_buff, 0, 64);
7225 ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN, ret, 0, '\0');
7226 if (ret_sprintf < 0 || ret_sprintf > 64){
7227 strncpy(txt_buff, "EMCFC unknown error", 63);
7228 }
7229 MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
7230 write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
7231 if (write_ret != MCF_OTA_R_SUCCESS) {
7232 return write_ret;
7233 }
7234
7235 goto out;
7236 }
7237 break;
7238 }
7239
7240 default:
7241 MD_TRC_MCF_TR_L4_SET_CONFIG_UNKNOWN_OP(req->op);
7242 ret = MCF_OTA_R_INVALID_PARAMETER;
7243 break;
7244 }
7245
7246 /* Send process result to ATCI */
7247 local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
7248 if (!local_para_ptr) {
7249 ASSERT(0);
7250 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7251
7252 return ret;
7253 }
7254 local_para_ptr->src_id = req->src_id;
7255 if (ret == MCF_OTA_R_SUCCESS) {
7256 local_para_ptr->result = KAL_TRUE;
7257 } else {
7258 local_para_ptr->result = KAL_FALSE;
7259 }
7260
7261 msg_send6(MOD_MCF, /* src_mod_id */
7262 ilm->src_mod_id, /* dest_mod_id */
7263 MCF_SAP, /* sap_id */
7264 MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
7265 (local_para_struct*)local_para_ptr, /* local_para_ptr */
7266 NULL); /* peer_buff_ptr */
7267
7268out:
7269 return ret;
7270}
7271
7272_STATIC mcf_ota_result_e mcf_l4_get_config(ilm_struct *ilm)
7273{
7274 l4c_mcf_get_config_req_struct *req = (l4c_mcf_get_config_req_struct *)ilm->local_para_ptr;
7275 l4c_mcf_get_config_cnf_struct *local_para_ptr = NULL;
7276 mcf_ota_result_e ret;
7277
7278 local_para_ptr = (l4c_mcf_get_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_get_config_cnf_struct), TD_RESET);
7279 if (!local_para_ptr) {
7280 ASSERT(0);
7281 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7282
7283 return ret;
7284 }
7285
7286 switch (req->op)
7287 {
7288 case L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH:
7289 ret = mcf_get_applied_file_path(req, local_para_ptr);
7290 break;
7291
7292 default:
7293 MD_TRC_MCF_TR_L4_GET_CONFIG_UNKNOWN_OP(req->op);
7294 ret = MCF_OTA_R_INVALID_PARAMETER;
7295 break;
7296 }
7297 local_para_ptr->src_id = req->src_id;
7298 if (ret == MCF_OTA_R_SUCCESS) {
7299 local_para_ptr->result = KAL_TRUE;
7300 } else {
7301 local_para_ptr->result = KAL_FALSE;
7302 }
7303
7304 /* Send process result to ATCI */
7305 msg_send6(MOD_MCF, /* src_mod_id */
7306 ilm->src_mod_id, /* dest_mod_id */
7307 MCF_SAP, /* sap_id */
7308 MSG_ID_L4C_MCF_GET_CONFIG_CNF, /* msg_id */
7309 (local_para_struct*)local_para_ptr, /* local_para_ptr */
7310 NULL); /* peer_buff_ptr */
7311
7312 return ret;
7313}
7314
7315_STATIC mcf_ota_result_e mcf_l4_dump_data(ilm_struct *ilm)
7316{
7317 l4c_mcf_dump_data_req_struct *req_ptr = (l4c_mcf_dump_data_req_struct *)ilm->local_para_ptr;
7318 l4c_mcf_dump_data_cnf_struct *cnf_ptr = NULL;
7319 mcf_l4c_report_state_ind_struct *ind_ptr = NULL;
7320 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
7321 mcf_ota_result_e write_ret = MCF_OTA_R_SUCCESS;
7322 kal_char urc_result[16];
7323 kal_uint32 at_len;
7324 kal_int32 fs_ret = FS_NO_ERROR;
7325 kal_wchar pathname[MCF_FILE_MAX_MD_PATH_LEN];
7326 kal_uint32 ret_sprintf;
7327
7328 switch (req_ptr->op)
7329 {
7330 case L4C_MCF_CONFIG_DUMP_LID_DATA:
7331 cnf_ptr = (l4c_mcf_dump_data_cnf_struct *)construct_local_para(sizeof(l4c_mcf_dump_data_cnf_struct), TD_RESET);
7332 if (!cnf_ptr) {
7333 ASSERT(0);
7334 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7335
7336 return ret;
7337 }
7338
7339 cnf_ptr->src_id = req_ptr->src_id;
7340 cnf_ptr->op = req_ptr->op;
7341 cnf_ptr->result = ret;
7342
7343 msg_send6(MOD_MCF, /* src_mod_id */
7344 ilm->src_mod_id, /* dest_mod_id */
7345 MCF_SAP, /* sap_id */
7346 MSG_ID_L4C_MCF_DUMP_DATA_CNF, /* msg_id */
7347 (local_para_struct*)cnf_ptr, /* local_para_ptr */
7348 NULL); /* peer_buff_ptr */
7349
7350 /* Support MCF Tool Open Dump File - delete txt */
7351 kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
7352 fs_ret = FS_Delete(pathname);
7353
7354 if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
7355 MD_TRC_MCF_TR_L4_DUMP_DATA_DELETE_FILE_FAIL(fs_ret);
7356 ret = MCF_OTA_R_WRITE_DISK_FAIL;
7357 return ret;
7358 }
7359
7360
7361 /* Support MCF Tool Open Dump File - Write AT cmd result in txt */
7362 kal_mem_set(txt_buff, 0, 64);
7363 ret_sprintf = kal_snprintf(txt_buff, 63, "EMCFC=%d,%d%c", req_ptr->op, ret, '\0');
7364 if (ret_sprintf < 0 || ret_sprintf > 64){
7365 strncpy(txt_buff, "EMCFC unknown error", 63);
7366 }
7367 MD_TRC_MCF_TR_L4_DUMP_DATA_CMD_RESULT(txt_buff);
7368 write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
7369 if (write_ret != MCF_OTA_R_SUCCESS) {
7370 return write_ret;
7371 }
7372
7373 ret = mcf_dump_all_lid_data(req_ptr);
7374 break;
7375
7376 default:
7377 MD_TRC_MCF_TR_L4_DUMP_DATA_UNKNOWN_OP(req_ptr->op);
7378 ret = MCF_OTA_R_INVALID_PARAMETER;
7379 return ret;
7380 }
7381
7382 ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
7383 if (!ind_ptr) {
7384 ASSERT(0);
7385 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7386
7387 return ret;
7388 }
7389
7390 ind_ptr->type = MCF_L4C_REPORT_MCF_DUMP_RESULT;
7391 ind_ptr->result = ret;
7392
7393 msg_send6(MOD_MCF, /* src_mod_id */
7394 ilm->src_mod_id, /* dest_mod_id */
7395 MCF_SAP, /* sap_id */
7396 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
7397 (local_para_struct*)ind_ptr, /* local_para_ptr */
7398 NULL); /* peer_buff_ptr */
7399
7400 /* Support MCF Tool Open Dump File - Write Urc result in txt */
7401 kal_mem_set(urc_result,0,16);
7402 ret_sprintf = kal_snprintf(urc_result, 15, "%cEMCFRPT=%d,%d%c", '\n', ind_ptr->type, ret, '\0');
7403 if (ret_sprintf < 0 || ret_sprintf > 16){
7404 strncpy(urc_result, "EMCFRPT error", 15);
7405 }
7406 at_len = strlen(txt_buff);
7407 strncat(txt_buff, urc_result, 15);
7408 MD_TRC_MCF_TR_L4_DUMP_DATA_CMD_RESULT(txt_buff);
7409 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));
7410 if (write_ret != MCF_OTA_R_SUCCESS) {
7411 return write_ret;
7412 }
7413
7414 return ret;
7415}
7416
7417_STATIC mcf_ota_result_e mcf_l4_update_ota(ilm_struct *ilm)
7418{
7419 l4c_mcf_update_ota_file_req_struct *req = (l4c_mcf_update_ota_file_req_struct *)ilm->local_para_ptr;
7420 l4c_mcf_update_ota_file_cnf_struct *local_para_ptr1 = NULL;
7421 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
7422 mcf_l4c_report_state_ind_struct *ind_ptr = NULL;
7423 mcf_t *pMcf = mcf_get_instance();
7424 module_type src_mod_id = ilm->src_mod_id;
7425 kal_bool reset_MD = KAL_FALSE;
7426
7427
7428
7429
7430
7431 switch (req->op)
7432 {
7433 case L4C_MCF_CONFIG_UPDATE_OPOTA_FILE:
7434
7435 /* If DSBP is busy when receive AT cmd, send AT cmd to ask AP retry */
7436 if (pMcf->dsbp_cnf_cnt != 0 || pMcf->dsbp_ind_cnt != 0){
7437 MD_TRC_MCF_TR_L4_UPDATE_OTA_DSBP_IS_ONGOING(pMcf->dsbp_cnf_cnt);
7438 MD_TRC_MCF_TR_L4_UPDATE_OTA_DSBP_IS_ONGOING(pMcf->dsbp_ind_cnt);
7439
7440 local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
7441 if (!local_para_ptr1) {
7442 ASSERT(0);
7443 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7444
7445 return ret;
7446 }
7447
7448
7449 /* Send AT cmd back & send URC to ask AP retry */
7450 local_para_ptr1->src_id = req->src_id;
7451 local_para_ptr1->op = req->op;
7452 local_para_ptr1->mcf_result = MCF_OTA_R_FAIL_MCF_DSBP_ONGOING;
7453
7454
7455
7456 /* Send process result to ATCI */
7457 msg_send6(MOD_MCF, /* src_mod_id */
7458 ilm->src_mod_id, /* dest_mod_id */
7459 MCF_SAP, /* sap_id */
7460 MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
7461 (local_para_struct*)local_para_ptr1, /* local_para_ptr */
7462 NULL); /* peer_buff_ptr */
7463
7464 ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
7465 if (!ind_ptr) {
7466 ASSERT(0);
7467 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7468 return ret;
7469 }
7470
7471 ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
7472 ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
7473
7474 msg_send6(MOD_MCF, /* src_mod_id */
7475 ilm->src_mod_id, /* dest_mod_id */
7476 MCF_SAP, /* sap_id */
7477 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
7478 (local_para_struct*)ind_ptr, /* local_para_ptr */
7479 NULL); /* peer_buff_ptr */
7480 return ret;
7481 }
7482
7483
7484 MD_TRC_MCF_TR_L4_UPDATE_OPOTA_FILE_UPDATE_OTA();
7485 ret = mcf_update_ota_file(req, local_para_ptr1, src_mod_id, &reset_MD);
7486
7487 if (ret == MCF_OTA_R_ALLOCATE_BUFFER_FAIL){
7488 return ret;
7489 }else if(ret == MCF_OTA_R_READ_OTA_FILE_FAIL || ret == MCF_OTA_R_READ_INI_FILE_FAIL){
7490 local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
7491 if (!local_para_ptr1) {
7492 ASSERT(0);
7493 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7494
7495 return ret;
7496 }
7497
7498
7499 local_para_ptr1->src_id = req->src_id;
7500 local_para_ptr1->op = req->op;
7501 local_para_ptr1->mcf_result = ret;
7502
7503
7504
7505 /* Send process result to ATCI */
7506 msg_send6(MOD_MCF, /* src_mod_id */
7507 ilm->src_mod_id, /* dest_mod_id */
7508 MCF_SAP, /* sap_id */
7509 MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
7510 (local_para_struct*)local_para_ptr1, /* local_para_ptr */
7511 NULL); /* peer_buff_ptr */
7512
7513 ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
7514 if (!ind_ptr) {
7515 ASSERT(0);
7516 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7517 return ret;
7518 }
7519
7520 ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
7521 ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
7522
7523 msg_send6(MOD_MCF, /* src_mod_id */
7524 ilm->src_mod_id, /* dest_mod_id */
7525 MCF_SAP, /* sap_id */
7526 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
7527 (local_para_struct*)ind_ptr, /* local_para_ptr */
7528 NULL); /* peer_buff_ptr */
7529
7530 return ret;
7531 }
7532 if(reset_MD == KAL_TRUE){
7533 //ret = MCF_OTA_R_SUCCESS;
7534
7535 local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
7536 if (!local_para_ptr1) {
7537 ASSERT(0);
7538 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7539
7540 return ret;
7541 }
7542
7543
7544 local_para_ptr1->src_id = req->src_id;
7545 local_para_ptr1->op = req->op;
7546 local_para_ptr1->mcf_result = ret;
7547
7548
7549
7550 /* Send process result to ATCI */
7551 msg_send6(MOD_MCF, /* src_mod_id */
7552 ilm->src_mod_id, /* dest_mod_id */
7553 MCF_SAP, /* sap_id */
7554 MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
7555 (local_para_struct*)local_para_ptr1, /* local_para_ptr */
7556 NULL); /* peer_buff_ptr */
7557
7558 ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
7559 if (!ind_ptr) {
7560 ASSERT(0);
7561 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7562 return ret;
7563 }
7564
7565 ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
7566 ind_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
7567
7568 msg_send6(MOD_MCF, /* src_mod_id */
7569 ilm->src_mod_id, /* dest_mod_id */
7570 MCF_SAP, /* sap_id */
7571 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
7572 (local_para_struct*)ind_ptr, /* local_para_ptr */
7573 NULL); /* peer_buff_ptr */
7574
7575 return ret;
7576
7577 }
7578
7579 if (pMcf->dsbp_cnf_cnt == 0){
7580 local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
7581 if (!local_para_ptr1) {
7582 ASSERT(0);
7583 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7584
7585 return ret;
7586 }
7587
7588
7589
7590 local_para_ptr1->src_id = req->src_id;
7591 local_para_ptr1->op = req->op;
7592 local_para_ptr1->mcf_result = ret;
7593
7594
7595
7596 /* Send process result to ATCI */
7597 msg_send6(MOD_MCF, /* src_mod_id */
7598 ilm->src_mod_id, /* dest_mod_id */
7599 MCF_SAP, /* sap_id */
7600 MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
7601 (local_para_struct*)local_para_ptr1, /* local_para_ptr */
7602 NULL); /* peer_buff_ptr */
7603
7604 if (ret == MCF_OTA_R_SUCCESS){
7605
7606 ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
7607 if (!ind_ptr) {
7608 ASSERT(0);
7609 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7610 return ret;
7611 }
7612
7613 ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
7614 ind_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
7615
7616 msg_send6(MOD_MCF, /* src_mod_id */
7617 ilm->src_mod_id, /* dest_mod_id */
7618 MCF_SAP, /* sap_id */
7619 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
7620 (local_para_struct*)ind_ptr, /* local_para_ptr */
7621 NULL); /* peer_buff_ptr */
7622 }
7623 return ret;
7624 }
7625
7626 break;
7627
7628 default:
7629 MD_TRC_MCF_TR_L4_UPDATE_OPOTA_FILE_UNKNOWN_OP(req->op);
7630 ret = MCF_OTA_R_INVALID_PARAMETER;
7631 break;
7632 }
7633
7634
7635 return ret;
7636}
7637
7638_STATIC mcf_ota_result_e mcf_l4_config(ilm_struct *ilm)
7639{
7640 l4c_mcf_config_req_struct *req = (l4c_mcf_config_req_struct *)ilm->local_para_ptr;
7641 l4c_mcf_config_cnf_struct *local_para_ptr = NULL;
7642 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
7643
7644 local_para_ptr = (l4c_mcf_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_cnf_struct), TD_RESET);
7645 if (!local_para_ptr) {
7646 ASSERT(0);
7647 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7648
7649 return ret;
7650 }
7651
7652
7653
7654 switch (req->op)
7655 {
7656 case L4C_MCF_CONFIG_INI_OPERATION:
7657 ret = mcf_config_ini_info(req, local_para_ptr);
7658 break;
7659
7660 default:
7661 MD_TRC_MCF_TR_L4_CONFIG_UNKNOWN_OP(req->op);
7662 ret = MCF_OTA_R_INVALID_PARAMETER;
7663 break;
7664 }
7665
7666
7667 local_para_ptr->src_id = req->src_id;
7668 local_para_ptr->op = req->op;
7669 local_para_ptr->mcf_result = ret;
7670
7671
7672 /* Send process result to ATCI */
7673 msg_send6(MOD_MCF, /* src_mod_id */
7674 ilm->src_mod_id, /* dest_mod_id */
7675 MCF_SAP, /* sap_id */
7676 MSG_ID_L4C_MCF_CONFIG_CNF, /* msg_id */
7677 (local_para_struct*)local_para_ptr, /* local_para_ptr */
7678 NULL); /* peer_buff_ptr */
7679
7680 return ret;
7681}
7682
7683_STATIC mcf_ota_result_e mcf_l4_query_lid(ilm_struct *ilm)
7684{
7685 l4c_mcf_config_lid_variable_operation_req_struct *req_ptr = (l4c_mcf_config_lid_variable_operation_req_struct *)ilm->local_para_ptr;
7686 l4c_mcf_config_lid_variable_operation_cnf_struct *cnf_ptr = NULL;
7687 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
7688
7689 switch (req_ptr->op)
7690 {
7691 case L4C_MCF_CONFIG_LID_VARIABLE_OPERATION:
7692 cnf_ptr = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
7693 if (!cnf_ptr) {
7694 ASSERT(0);
7695 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7696
7697 return ret;
7698 }
7699
7700 ret = mcf_config_LID_variable(req_ptr, cnf_ptr);
7701
7702 cnf_ptr->src_id = req_ptr->src_id;
7703 cnf_ptr->op = req_ptr->op;
7704 cnf_ptr->action = req_ptr->action;
7705 cnf_ptr->mcf_result = ret;
7706
7707 msg_send6(MOD_MCF, /* src_mod_id */
7708 ilm->src_mod_id, /* dest_mod_id */
7709 MCF_SAP, /* sap_id */
7710 MSG_ID_L4C_MCF_CONFIG_LID_VARIABLE_OPERATION_CNF, /* msg_id */
7711 (local_para_struct*)cnf_ptr, /* local_para_ptr */
7712 NULL); /* peer_buff_ptr */
7713
7714
7715 break;
7716
7717 default:
7718 MD_TRC_MCF_TR_L4_QUERY_LID_UNKNOWN_OP(req_ptr->op);
7719 ret = MCF_OTA_R_INVALID_PARAMETER;
7720 return ret;
7721 }
7722
7723 return ret;
7724}
7725_STATIC mcf_ota_result_e mcf_l4_variable_operation(ilm_struct *ilm)
7726{
7727 l4c_mcf_variable_value_operation_req_struct *req_ptr = (l4c_mcf_variable_value_operation_req_struct *)ilm->local_para_ptr;
7728 l4c_mcf_variable_value_operation_cnf_struct *cnf_ptr = NULL;
7729 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
7730
7731 switch (req_ptr->op)
7732 {
7733 case L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION:
7734 cnf_ptr = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
7735 if (!cnf_ptr) {
7736 ASSERT(0);
7737 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7738
7739 return ret;
7740 }
7741 switch (req_ptr->action)
7742 {
7743 case L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA:
7744 case L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA:
7745 ret = mcf_query_variable_value(req_ptr, cnf_ptr);
7746 break;
7747#ifdef __MCF_COMBINE_FILE_SUPPORT__
7748 case L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA:
7749 case L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA:
7750 ret = mcf_set_variable_value(req_ptr, cnf_ptr);
7751 break;
7752#endif
7753 default:
7754 MD_TRC_MCF_TR_L4_VARIABLE_OPERATION_UNKOWN_ACTION(req_ptr->action);
7755 break;
7756 }
7757
7758
7759 cnf_ptr->src_id = req_ptr->src_id;
7760 cnf_ptr->op = req_ptr->op;
7761 cnf_ptr->format = req_ptr->format;
7762 cnf_ptr->action = req_ptr->action;
7763 cnf_ptr->mcf_result = ret;
7764
7765 msg_send6(MOD_MCF, /* src_mod_id */
7766 ilm->src_mod_id, /* dest_mod_id */
7767 MCF_SAP, /* sap_id */
7768 MSG_ID_L4C_MCF_VARIABLE_VALUE_OPERATION_CNF, /* msg_id */
7769 (local_para_struct*)cnf_ptr, /* local_para_ptr */
7770 NULL); /* peer_buff_ptr */
7771
7772
7773 break;
7774
7775 default:
7776 MD_TRC_MCF_TR_L4_VARIABLE_OPERATION_UNKNOWN_OP(req_ptr->op);
7777 ret = MCF_OTA_R_INVALID_PARAMETER;
7778 return ret;
7779 }
7780
7781 return ret;
7782}
7783#ifdef __MCF_COMBINE_FILE_SUPPORT__
7784_STATIC mcf_ota_result_e mcf_l4_assign_combined_file_path(ilm_struct *ilm)
7785{
7786 l4c_mcf_set_config_req_struct *req_ptr = (l4c_mcf_set_config_req_struct *)ilm->local_para_ptr;
7787 l4c_mcf_set_config_cnf_struct *cnf_ptr = NULL;
7788 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
7789
7790 switch (req_ptr->op)
7791 {
7792 case L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH:
7793 cnf_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
7794 if (!cnf_ptr) {
7795 ASSERT(0);
7796 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
7797
7798 return ret;
7799 }
7800
7801 ret = mcf_assign_combined_file_path(req_ptr);
7802
7803 cnf_ptr->src_id = req_ptr->src_id;
7804 cnf_ptr->op = req_ptr->op;
7805 cnf_ptr->mcf_result = ret;
7806
7807 msg_send6(MOD_MCF, /* src_mod_id */
7808 ilm->src_mod_id, /* dest_mod_id */
7809 MCF_SAP, /* sap_id */
7810 MSG_ID_L4C_MCF_ASSIGN_COMBINED_FILE_PATH_CNF, /* msg_id */
7811 (local_para_struct*)cnf_ptr, /* local_para_ptr */
7812 NULL); /* peer_buff_ptr */
7813
7814
7815 break;
7816
7817 default:
7818 MD_TRC_MCF_TR_L4_ASSIGN_COMBINED_FILE_PATH_UNKNOWN_OP(req_ptr->op);
7819 ret = MCF_OTA_R_INVALID_PARAMETER;
7820 return ret;
7821 }
7822
7823 return ret;
7824}
7825#endif
7826_STATIC void mcf_respond_dsbp_result(local_para_struct *local_para_ptr)
7827{
7828 mcf_t *pMcf = mcf_get_instance();
7829 mcf_l4bsbp_trigger_dsbp_cnf_struct *cnf = (mcf_l4bsbp_trigger_dsbp_cnf_struct *)local_para_ptr;
7830 l4c_mcf_set_config_cnf_struct *cnf_local_para_ptr = NULL;
7831 l4c_mcf_update_ota_file_cnf_struct *cnf_update_ota_local_para_ptr = NULL;
7832 mcf_l4c_report_state_ind_struct *ind_ptr = NULL;
7833 mcf_ota_result_e write_ret = MCF_OTA_R_SUCCESS;
7834 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
7835 kal_uint32 ret_sprintf;
7836 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(cnf->ps_id);
7837 mcf_tlvota_file_t *tlvota_file;
7838 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
7839 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
7840 l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_OTA;
7841
7842
7843 if (cnf->config_op == L4C_MCF_CONFIG_UPDATE_OPOTA_FILE){
7844 pMcf->dsbp_cnf_cnt--;
7845
7846 if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS && cnf->result != MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
7847 pMcf->dsbp_ind_cnt--;
7848 pMcf->dsbp_ind_ret = KAL_FALSE;
7849 pMcf->dsbp_cnf_ret = KAL_FALSE;
7850 }
7851 if (cnf->result == MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
7852 pMcf->dsbp_ind_cnt--;
7853 MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_NO_SIM(cnf->ps_id);
7854 }
7855
7856 if (cnf->is_dsbp_retry == 0){
7857 pMcf->is_critical = KAL_TRUE;
7858 }
7859
7860
7861 /* When critical OTA is fail to trigger DSBP, Send AT cmd response and send URC to reset MD */
7862 if (pMcf->dsbp_cnf_cnt == 0)
7863 {
7864 if (pMcf->is_critical == KAL_TRUE){
7865 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);
7866 if (!cnf_update_ota_local_para_ptr) {
7867 ASSERT(0);
7868
7869 return;
7870 }
7871
7872 cnf_update_ota_local_para_ptr->src_id = cnf->src_id;
7873 cnf_update_ota_local_para_ptr->op = cnf->config_op;
7874 if (pMcf->dsbp_cnf_ret == KAL_TRUE){
7875 cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_SUCCESS;
7876 }else{
7877 cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_DSBP_FAIL;
7878 }
7879
7880
7881
7882 /* Send process result to ATCI */
7883 msg_send6(MOD_MCF, /* src_mod_id */
7884 cnf->src_mod_id, /* dest_mod_id */
7885 MCF_SAP, /* sap_id */
7886 MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
7887 (local_para_struct*)cnf_update_ota_local_para_ptr, /* local_para_ptr */
7888 NULL); /* peer_buff_ptr */
7889
7890
7891
7892 MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_CNT(pMcf->dsbp_ind_cnt);
7893 if(pMcf->dsbp_ind_cnt == 0 && pMcf->dsbp_cnf_ret == KAL_FALSE){
7894 ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
7895 if (!ind_ptr) {
7896 ASSERT(0);
7897 return;
7898 }
7899
7900
7901 ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
7902 ind_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
7903
7904 /* Send process result to ATCI */
7905 msg_send6(MOD_MCF, /* src_mod_id */
7906 cnf->src_mod_id, /* dest_mod_id */
7907 MCF_SAP, /* sap_id */
7908 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
7909 (local_para_struct*)ind_ptr, /* local_para_ptr */
7910 NULL); /* peer_buff_ptr */
7911 }
7912 }else{
7913 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);
7914 if (!cnf_update_ota_local_para_ptr) {
7915 ASSERT(0);
7916
7917 return;
7918 }
7919
7920 cnf_update_ota_local_para_ptr->src_id = cnf->src_id;
7921 cnf_update_ota_local_para_ptr->op = cnf->config_op;
7922 if (pMcf->dsbp_cnf_ret == KAL_TRUE){
7923 cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_SUCCESS;
7924 }else{
7925 cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_DSBP_FAIL;
7926 }
7927
7928 /* Send process result to ATCI */
7929 msg_send6(MOD_MCF, /* src_mod_id */
7930 cnf->src_mod_id, /* dest_mod_id */
7931 MCF_SAP, /* sap_id */
7932 MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
7933 (local_para_struct*)cnf_update_ota_local_para_ptr, /* local_para_ptr */
7934 NULL); /* peer_buff_ptr */
7935 if(pMcf->dsbp_ind_cnt == 0 && pMcf->dsbp_ind_ret == KAL_FALSE){
7936 ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
7937 if (!ind_ptr) {
7938 ASSERT(0);
7939
7940 return;
7941 }
7942
7943 ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
7944 ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
7945
7946 /* Send process result to ATCI */
7947 msg_send6(MOD_MCF, /* src_mod_id */
7948 cnf->src_mod_id, /* dest_mod_id */
7949 MCF_SAP, /* sap_id */
7950 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
7951 (local_para_struct*)ind_ptr, /* local_para_ptr */
7952 NULL); /* peer_buff_ptr */
7953 }
7954 }
7955
7956 }
7957 }else{
7958
7959 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
7960 MD_TRC_MCF_TR_RESPOND_DSBP_INVALID_SIM_ID(cnf->ps_id, sim_id);
7961 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
7962 goto out;
7963 }
7964
7965 tlvota_file = &(pMcf->tlvota_file[sim_id]);
7966
7967 if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS) {
7968 /* Read last updated file */
7969 if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA) {
7970 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
7971 } else if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
7972 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
7973 } else {
7974 MD_TRC_MCF_TR_RESPOND_DSBP_INVALID_FILE_PATH(cnf->result, tlvota_file->last_file.path_type);
7975 pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
7976 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
7977
7978 goto out;
7979 }
7980
7981 mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, tlvota_file->last_file.name, &apply_path_type, apply_filename, pMcf);
7982
7983 if (mcf_ret != MCF_OTA_R_SUCCESS) {
7984 MD_TRC_MCF_TR_RESPOND_DSBP_READ_FILE_FAIL(cnf->result, mcf_ret);
7985 }
7986
7987 pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
7988 }
7989
7990out:
7991 if(pMcf->dsbp_cnf_cnt > 0){
7992 pMcf->dsbp_cnf_cnt--;
7993 }
7994
7995 if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS && cnf->result != MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
7996 if(pMcf->dsbp_ind_cnt > 0){
7997 pMcf->dsbp_ind_cnt--;
7998 }
7999 pMcf->dsbp_ind_ret = KAL_FALSE;
8000 pMcf->dsbp_cnf_ret = KAL_FALSE;
8001 dsbp_ret = cnf->result;
8002 }
8003 if (cnf->result == MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
8004 if(pMcf->dsbp_ind_cnt > 0){
8005 pMcf->dsbp_ind_cnt--;
8006 }
8007 MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_NO_SIM(cnf->ps_id);
8008 }
8009
8010 if (pMcf->dsbp_cnf_cnt == 0)
8011 {
8012 cnf_local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
8013 if (!cnf_local_para_ptr) {
8014 ASSERT(0);
8015
8016 return;
8017 }
8018
8019 if (pMcf->dsbp_cnf_ret != KAL_TRUE){
8020 mcf_ret = MCF_OTA_R_DSBP_FAIL;
8021 }
8022
8023 cnf_local_para_ptr->src_id = cnf->src_id;
8024 cnf_local_para_ptr->op = cnf->config_op;
8025 cnf_local_para_ptr->mcf_result = mcf_ret;
8026 cnf_local_para_ptr->dsbp_result = dsbp_ret;
8027
8028
8029 /* Send process result to ATCI */
8030 msg_send6(MOD_MCF, /* src_mod_id */
8031 cnf->src_mod_id, /* dest_mod_id */
8032 MCF_SAP, /* sap_id */
8033 MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
8034 (local_para_struct*)cnf_local_para_ptr, /* local_para_ptr */
8035 NULL); /* peer_buff_ptr */
8036
8037 /* Support MCF Tool Send AT cmd - clear txt */
8038 kal_mem_set(txt_buff, 0, 64);
8039 write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, 0);
8040 if (write_ret != MCF_OTA_R_SUCCESS) {
8041 return;
8042 }
8043
8044 /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
8045 ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", cnf->config_op, mcf_ret, dsbp_ret, '\0');
8046 if (ret_sprintf < 0 || ret_sprintf > 64){
8047 strncpy(txt_buff, "EMCFC unknown error", 63);
8048 }
8049 MD_TRC_MCF_TR_RESPOND_DSBP_CMD_RESULT(txt_buff);
8050 write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
8051 if (write_ret != MCF_OTA_R_SUCCESS) {
8052 return;
8053 }
8054 }
8055 }
8056 return;
8057}
8058
8059_STATIC kal_bool mcf_report_dsbp_result(local_para_struct *local_para_ptr)
8060{
8061 mcf_t *pMcf = mcf_get_instance();
8062 mcf_l4bsbp_trigger_dsbp_result_ind_struct *ind = (mcf_l4bsbp_trigger_dsbp_result_ind_struct *)local_para_ptr;
8063 kal_bool ret = KAL_TRUE;
8064 kal_char urc_result[16];
8065 kal_uint32 at_len;
8066 kal_uint32 ret_sprintf;
8067
8068 switch (ind->config_op)
8069 {
8070 case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
8071 {
8072 mcf_l4c_report_state_ind_struct *ind_local_para_ptr = NULL;
8073 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ind->ps_id);
8074 mcf_tlvota_file_t *tlvota_file;
8075 kal_char fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
8076 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
8077 l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_OTA;
8078 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
8079
8080 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
8081 MD_TRC_MCF_TR_REPORT_STATE_INVALID_SIM_ID(ind->ps_id, sim_id);
8082 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
8083
8084 goto out;
8085 }
8086
8087 tlvota_file = &(pMcf->tlvota_file[sim_id]);
8088
8089 if (ind->result == MCF_TRIGGER_DSBP_R_SUCCESS) {
8090 /* Store last updated file informantion */
8091 kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
8092 } else {
8093 /* Read last updated file */
8094 if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA) {
8095 strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
8096 } else if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
8097 strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
8098 } else {
8099 MD_TRC_MCF_TR_REPORT_STATE_INVALID_FILE_PATH(ind->result, tlvota_file->last_file.path_type);
8100 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
8101
8102 goto out;
8103 }
8104
8105 /* Read last updated file */
8106 mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, tlvota_file->last_file.name, &apply_path_type, apply_filename, pMcf);
8107
8108 if (mcf_ret != MCF_OTA_R_SUCCESS) {
8109 MD_TRC_MCF_TR_REPORT_STATE_READ_FILE_FAIL(ind->result, mcf_ret);
8110 }
8111 }
8112
8113out:
8114 if (sim_id >= 0 && sim_id < MAX_SIM_NUM){
8115 pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
8116 }
8117
8118 ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
8119 if (!ind_local_para_ptr) {
8120 ASSERT(0);
8121 ret = KAL_FALSE;
8122
8123 return ret;
8124 }
8125
8126 ind_local_para_ptr->type = MCF_L4C_REPORT_DSBP_RESULT_OF_MCF_DSBP_ACTIVE_MODE;
8127 ind_local_para_ptr->result = ind->result;
8128
8129 /* Send process result to ATCI */
8130 msg_send6(MOD_MCF, /* src_mod_id */
8131 MOD_L4C + ind->ps_id, /* dest_mod_id */
8132 MCF_SAP, /* sap_id */
8133 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
8134 (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
8135 NULL); /* peer_buff_ptr */
8136
8137 /* Support MCF Tool Send AT cmd - Write Urc result in txt */
8138 kal_mem_set(urc_result,0,16);
8139 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');
8140 if (ret_sprintf < 0 || ret_sprintf > 16){
8141 strncpy(urc_result, "EMCFRPT error", 15);
8142 }
8143 at_len = strlen(txt_buff);
8144 strncat(txt_buff, urc_result, 15);
8145 MD_TRC_MCF_TR_REPORT_STATE_CMD_RESULT(txt_buff);
8146 ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, at_len+strlen(urc_result));
8147 if (ret != KAL_TRUE) {
8148 return ret;
8149 }
8150
8151
8152 break;
8153 }
8154
8155 case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
8156 {
8157 mcf_l4c_report_state_ind_struct *ind_local_para_ptr = NULL;
8158
8159 if (pMcf->dsbp_ind_cnt > 0){
8160 pMcf->dsbp_ind_cnt --;
8161 }
8162
8163 if (ind->result != MCF_TRIGGER_DSBP_R_SUCCESS){
8164 pMcf->dsbp_ind_ret = KAL_FALSE;
8165 }
8166
8167
8168 if(pMcf->dsbp_ind_cnt == 0){
8169
8170 ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
8171 if (!ind_local_para_ptr) {
8172 ASSERT(0);
8173 ret = KAL_FALSE;
8174
8175 return ret;
8176 }
8177
8178 ind_local_para_ptr->type = MCF_L4C_REPORT_MCF_DUMP_RESULT_OF_AUTO_SELECT_BIN;
8179 ind_local_para_ptr->result = ind->result;
8180
8181 /* Send process result to ATCI */
8182 msg_send6(MOD_MCF, /* src_mod_id */
8183 MOD_L4C + ind->ps_id, /* dest_mod_id */
8184 MCF_SAP, /* sap_id */
8185 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
8186 (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
8187 NULL); /* peer_buff_ptr */
8188
8189 /* Support MCF Tool Send AT cmd - Write Urc result in txt */
8190 kal_mem_set(urc_result,0,16);
8191 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');
8192 if (ret_sprintf < 0 || ret_sprintf > 16){
8193 strncpy(urc_result, "EMCFRPT error", 15);
8194 }
8195 at_len = strlen(txt_buff);
8196 strncat(txt_buff, urc_result, 15);
8197 MD_TRC_MCF_TR_REPORT_STATE_CMD_RESULT(txt_buff);
8198 ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, at_len+strlen(urc_result));
8199 if (ret != KAL_TRUE) {
8200 return ret;
8201 }
8202 }
8203
8204 break;
8205 }
8206 case L4C_MCF_CONFIG_UPDATE_OPOTA_FILE:
8207 {
8208 mcf_l4c_report_state_ind_struct *ind_local_para_ptr = NULL;
8209 mcf_t *pMcf = mcf_get_instance();
8210
8211 pMcf->dsbp_ind_cnt --;
8212
8213 if (ind->result != MCF_TRIGGER_DSBP_R_SUCCESS){
8214 pMcf->dsbp_ind_ret = KAL_FALSE;
8215 }
8216
8217
8218 if(pMcf->dsbp_ind_cnt == 0){
8219 if (pMcf->is_critical == KAL_TRUE){
8220 pMcf->is_critical = KAL_FALSE;
8221 ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
8222 if (!ind_local_para_ptr) {
8223 ASSERT(0);
8224 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
8225 return ret;
8226 }
8227
8228
8229 ind_local_para_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
8230
8231 if (pMcf->dsbp_ind_ret == KAL_TRUE){
8232 ind_local_para_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
8233 }else{
8234 ind_local_para_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
8235 }
8236 /* Send process result to ATCI */
8237 msg_send6(MOD_MCF, /* src_mod_id */
8238 ind->src_mod_id, /* dest_mod_id */
8239 MCF_SAP, /* sap_id */
8240 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
8241 (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
8242 NULL); /* peer_buff_ptr */
8243 }else{
8244 ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
8245 if (!ind_local_para_ptr) {
8246 ASSERT(0);
8247 ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
8248 return ret;
8249 }
8250
8251 ind_local_para_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
8252
8253 if (pMcf->dsbp_ind_ret == KAL_TRUE){
8254 ind_local_para_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
8255 }else{
8256 ind_local_para_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
8257 }
8258
8259
8260 /* Send process result to ATCI */
8261 msg_send6(MOD_MCF, /* src_mod_id */
8262 ind->src_mod_id, /* dest_mod_id */
8263 MCF_SAP, /* sap_id */
8264 MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
8265 (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
8266 NULL); /* peer_buff_ptr */
8267 }
8268 }
8269
8270
8271 break;
8272 }
8273
8274 default:
8275 MD_TRC_MCF_TR_REPORT_STATE_INVALID_OP(ind->config_op);
8276 ret = KAL_FALSE;
8277 break;
8278 }
8279
8280 return ret;
8281}
8282
8283_STATIC kal_bool mcf_em_update_req_hdlr(local_para_struct *local_para_ptr)
8284{
8285 l4cps_em_update_req_struct *req = (l4cps_em_update_req_struct *)local_para_ptr;
8286 kal_bool ret = KAL_TRUE;
8287
8288 /*
8289 * Only process Tool source, ignore AP.
8290 */
8291 if (req->em_src == EM_FROM_ELT) {
8292 switch (req->info_request[MCF_EM_OTA_FILE_INFO]) {
8293 case EM_ON:
8294 com_Mcf.is_em_on = KAL_TRUE;
8295 break;
8296
8297 case EM_OFF:
8298 com_Mcf.is_em_on = KAL_FALSE;
8299 break;
8300
8301 case EM_NC:
8302 /* No change */
8303 break;
8304
8305 default:
8306 ret = KAL_FALSE;
8307 MD_TRC_MCF_TR_EM_UPDATE_INVALID_INFO(req->info_request[MCF_EM_OTA_FILE_INFO]);
8308 break;
8309 }
8310 } else {
8311 ret = KAL_FALSE;
8312 MD_TRC_MCF_TR_EM_UPDATE_INVALID_SOURCE(req->em_src);
8313 }
8314
8315 return ret;
8316}
8317
8318_STATIC void mcf_v1_do_ota_full(mcf_ota_file_t *ota_file)
8319{
8320 mcf_tool_file_info_t *pFile;
8321 mcf_tool_ota_file_item_t *pItem;
8322 kal_uint16 item_cnt = 0;
8323 nvram_errno_enum nvram_api_ret;
8324 kal_bool is_read_nvram = KAL_FALSE;
8325 nvram_ltable_entry_struct lid_info = {0};
8326 kal_uint8 *lid_buffer = NULL;
8327 nvram_ltable_entry_struct pre_lid_info = {0};
8328 kal_uint16 pre_record_idx = 0xFFFF;
8329 kal_uint8 *pre_lid_buffer = NULL;
8330 kal_uint16 item_byte_offset;
8331 kal_uint16 item_bit_offset;
8332 kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
8333 kal_uint32 item_size;
8334 kal_int16 pos = -1;
8335 kal_uint16 in_pos = 0;
8336 mcf_tag_info_struct unuse = {0};
8337 MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
8338
8339 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
8340 pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
8341
8342 /* Read changed items from OTA file */
8343 while (item_cnt < pFile->item_num) {
8344 if ( (is_read_nvram == KAL_FALSE) || (pItem->lid != pre_lid_info.LID) || (pItem->record_idx != pre_record_idx) ) {
8345 nvram_api_ret = nvram_external_get_lid_info(pItem->lid, &lid_info);
8346 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
8347 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_LID_INFO_FAIL, pItem->lid, nvram_api_ret);
8348 mcf_utfwk_printf("Fail to get LID information!! lid(%d), nvram_ret(%d)", pItem->lid, nvram_api_ret);
8349 goto next;
8350 }
8351
8352#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
8353 /* Store last time modified LID */
8354 if ( (pItem->lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
8355 && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
8356 if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
8357 pos = mcf_binary_search_lid(pItem->lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
8358 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, pItem->lid, pos);
8359 if (pos == -1) {
8360 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){
8361 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, pItem->lid);
8362 mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)", pItem->lid);
8363 }else{
8364 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, pItem->lid, in_pos);
8365 }
8366 nv_int_info.last_mod_lid.lid_cnt++;
8367 }
8368 }
8369 }
8370#else
8371 /* Store last time modified LID */
8372 if ( (pItem->lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
8373 && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
8374 if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
8375 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);
8376 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, pItem->lid, pos);
8377 if (pos == -1) {
8378 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){
8379 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, pItem->lid);
8380 mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)", pItem->lid);
8381 }else{
8382 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, pItem->lid, in_pos);
8383 }
8384 nv_int_info.last_mod_lid.lid_cnt++;
8385 }
8386 }
8387 }
8388#endif
8389
8390 /* Do not update LID if OTA attribute is not set */
8391 if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
8392 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR, lid_info.LID, lid_info.attr);
8393 mcf_utfwk_printf("OTA attribute is not set, do not write to NVRAM. lid(%d), attribute(%x)", lid_info.LID, lid_info.attr);
8394 /* Write previous LID record */
8395 if (is_read_nvram == KAL_TRUE && (pItem->lid != pre_lid_info.LID)) {
8396 if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
8397 if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
8398 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
8399 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
8400 mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
8401 } else {
8402 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
8403 }
8404 } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
8405 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
8406 } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
8407 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
8408 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);
8409 } else {
8410 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
8411 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);
8412 }
8413 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);
8414
8415 free_ctrl_buffer_set_null(pre_lid_buffer);
8416 }
8417
8418 is_read_nvram = KAL_FALSE;
8419 goto next;
8420 }
8421
8422 /* Write previous LID record */
8423 if (is_read_nvram == KAL_TRUE) {
8424 if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
8425 if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
8426 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
8427 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
8428 mcf_utfwk_printf("Fail to write item LID(%d), record(%d)", pre_lid_info.LID, pre_record_idx);
8429 } else {
8430 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
8431 }
8432 } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
8433 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
8434 } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
8435 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
8436 mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
8437 } else {
8438 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
8439 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);
8440 }
8441
8442 free_ctrl_buffer_set_null(pre_lid_buffer);
8443 is_read_nvram = KAL_FALSE;
8444 }
8445
8446 /* Do not reset LID if same with previos one */
8447 if (pItem->lid != pre_lid_info.LID) {
8448 if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0 ) {
8449 if ( !nvram_external_reset_data(pItem->lid, 1, lid_info.total_records) ) {
8450 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_LID_FAIL, pItem->lid, lid_info.total_records);
8451 mcf_utfwk_printf("Reset LID(%d) FAIL!!, total_record(%d)", pItem->lid, lid_info.total_records);
8452 }
8453 } else {
8454 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_ATTR_NOT_SET, lid_info.LID, lid_info.attr);
8455 mcf_utfwk_printf("OTA reset attribute is not set!! lid(%d), attribute(%x)", lid_info.LID, lid_info.attr);
8456 }
8457 }
8458
8459 lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info.size);
8460
8461 /* Read NVRAM LID */
8462 if ( !nvram_external_read_data(pItem->lid, pItem->record_idx, lid_buffer, lid_info.size) ) {
8463 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_ITEM_LID_FAIL, pItem->lid, pItem->record_idx);
8464 mcf_utfwk_printf("Fail to read item LID(%d), record(%d)", pItem->lid, pItem->record_idx);
8465 is_read_nvram = KAL_FALSE;
8466 free_ctrl_buffer_set_null(lid_buffer);
8467
8468 goto next;
8469 } else {
8470 is_read_nvram = KAL_TRUE;
8471 }
8472 }
8473
8474 /* Check if item_tag_len is valid */
8475 if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
8476 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_TAG_LEN, pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
8477 mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d)", pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
8478
8479 goto next;
8480 }
8481
8482 /* Update LID item */
8483 if (pItem->is_bit_op == 0) {
8484 strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
8485 item_tag[pItem->item_tag_len] = '\0';
8486 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ITEM_TAG, item_tag);
8487 if (mcf_find_tag_offset(pItem->lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
8488 goto next;
8489 }
8490
8491 if (pItem->op.byte.value_len > item_size) {
8492 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_LARGE_VAL_LEN, pItem->op.byte.value_len, item_size);
8493 mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d)", pItem->op.byte.value_len, item_size);
8494 goto next;
8495 }
8496
8497 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BYTE_UPDATE, pItem->lid, item_byte_offset, pItem->op.byte.value_len);
8498 mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
8499
8500 kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
8501 } else {
8502 kal_uint32 bit_value = 0;
8503 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
8504
8505 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
8506
8507 strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
8508 item_tag[pItem->item_tag_len] = '\0';
8509 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ITEM_TAG, item_tag);
8510 if (mcf_find_tag_offset(pItem->lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
8511 goto next;
8512 }
8513
8514 if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
8515 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, pItem->op.bit.len, item_size, pItem->op.bit.value_len);
8516 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);
8517 goto next;
8518 }
8519
8520 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);
8521
8522 if (pItem->op.bit.value_len == 1) {
8523 kal_uint8 *val_tmp = (kal_uint8 *)(lid_buffer + item_byte_offset);
8524
8525 *val_tmp &= ~(bit_mask << item_bit_offset);
8526 *val_tmp |= (bit_value << item_bit_offset);
8527 } else if (pItem->op.bit.value_len == 2) {
8528 kal_uint16 *val_tmp = (kal_uint16 *)(lid_buffer + item_byte_offset);
8529
8530 *val_tmp &= ~(bit_mask << item_bit_offset);
8531 *val_tmp |= (bit_value << item_bit_offset);
8532 } else if (pItem->op.bit.value_len == 4) {
8533 kal_uint32 *val_tmp = (kal_uint32 *)(lid_buffer + item_byte_offset);
8534
8535 *val_tmp &= ~(bit_mask << item_bit_offset);
8536 *val_tmp |= (bit_value << item_bit_offset);
8537 }
8538 }
8539
8540
8541next:
8542 pre_lid_info = lid_info;
8543 pre_record_idx = pItem->record_idx;
8544 pre_lid_buffer = lid_buffer;
8545 pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
8546 item_cnt++;
8547 }
8548
8549 if (item_cnt > 0) {
8550 /* Write previous LID record */
8551 if (is_read_nvram == KAL_TRUE) {
8552 if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
8553 if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
8554 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
8555 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
8556 mcf_utfwk_printf("Fail to write item LID(%d), record(%d)", pre_lid_info.LID, pre_record_idx);
8557 } else {
8558 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
8559 }
8560 } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
8561 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
8562 } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
8563 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
8564 mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
8565 } else {
8566 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
8567 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);
8568 }
8569 free_ctrl_buffer_set_null(pre_lid_buffer);
8570
8571 }
8572 }
8573
8574
8575 return;
8576}
8577_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)
8578{
8579 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
8580 mcf_tool_file_info_t *pFile;
8581 mcf_tool_ota_file_item_t *pItem;
8582 kal_bool is_read_nvram = KAL_FALSE;
8583 kal_uint16 pre_record_idx = 0xFFFF;
8584 kal_bool is_found_target = KAL_FALSE;
8585 kal_uint8 *pre_lid_buffer = NULL;
8586 kal_uint8 *lid_buffer = NULL;
8587 kal_uint16 item_cnt = 0;
8588 kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
8589 kal_uint16 item_byte_offset;
8590 kal_uint16 item_bit_offset;
8591 kal_uint32 item_size;
8592 mcf_tag_info_struct unuse = {0};
8593 MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
8594
8595
8596 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
8597 pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
8598 /* Read changed items from OTA file */
8599 while (item_cnt < pFile->item_num) {
8600 if ( (pItem->lid != lid) || (pItem->record_idx < record_idx) || (pItem->record_idx > (record_idx + record_amount - 1)) ) {
8601 if (is_found_target == KAL_FALSE) {
8602 goto next;
8603 } else {
8604 // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
8605 break;
8606 }
8607 }
8608
8609 if ( (is_read_nvram == KAL_FALSE) || (pItem->record_idx != pre_record_idx) ) {
8610 is_found_target = KAL_TRUE;
8611
8612 /* Write previous LID record */
8613 if (is_read_nvram == KAL_TRUE) {
8614 if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
8615 MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
8616 } else {
8617 MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
8618 }
8619
8620 free_ctrl_buffer_set_null(pre_lid_buffer);
8621 is_read_nvram = KAL_FALSE;
8622 }
8623
8624 lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info->size);
8625
8626 /* Read NVRAM LID */
8627 if ( !nvram_external_read_data(pItem->lid, pItem->record_idx, lid_buffer, lid_info->size) ) {
8628 MD_TRC_MCF_TR_LID_OTA_READ_ITEM_NVRAM_FAIL(lid, pItem->record_idx);
8629 is_read_nvram = KAL_FALSE;
8630 free_ctrl_buffer_set_null(lid_buffer);
8631
8632 goto next;
8633 } else {
8634 is_read_nvram = KAL_TRUE;
8635 }
8636 }
8637
8638 /* Check if item_tag_len is valid */
8639 if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
8640 MD_TRC_MCF_TR_LID_OTA_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
8641 goto next;
8642 }
8643
8644 /* Update LID item */
8645 if (pItem->is_bit_op == 0) {
8646 strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
8647 item_tag[pItem->item_tag_len] = '\0';
8648 if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
8649 goto next;
8650 }
8651
8652 if (pItem->op.byte.value_len > item_size) {
8653 MD_TRC_MCF_TR_LID_OTA_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
8654 goto next;
8655 }
8656
8657 MD_TRC_MCF_TR_LID_OTA_BYTE_UPDATE(lid, item_byte_offset, pItem->op.byte.value_len);
8658 mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
8659
8660 kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
8661 } else {
8662 kal_uint32 bit_value = 0;
8663 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
8664
8665 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
8666
8667 strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
8668 item_tag[pItem->item_tag_len] = '\0';
8669 if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
8670 goto next;
8671 }
8672
8673 if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
8674 MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
8675
8676 goto next;
8677 }
8678
8679 MD_TRC_MCF_TR_LID_OTA_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
8680
8681 if (pItem->op.bit.value_len == 1) {
8682 kal_uint8 *val_tmp = (kal_uint8 *)(lid_buffer + item_byte_offset);
8683
8684 *val_tmp &= ~(bit_mask << item_bit_offset);
8685 *val_tmp |= (bit_value << item_bit_offset);
8686 } else if (pItem->op.bit.value_len == 2) {
8687 kal_uint16 *val_tmp = (kal_uint16 *)(lid_buffer + item_byte_offset);
8688
8689 *val_tmp &= ~(bit_mask << item_bit_offset);
8690 *val_tmp |= (bit_value << item_bit_offset);
8691 } else if (pItem->op.bit.value_len == 4) {
8692 kal_uint32 *val_tmp = (kal_uint32 *)(lid_buffer + item_byte_offset);
8693
8694 *val_tmp &= ~(bit_mask << item_bit_offset);
8695 *val_tmp |= (bit_value << item_bit_offset);
8696 }
8697 }
8698
8699next:
8700 pre_record_idx = pItem->record_idx;
8701 pre_lid_buffer = lid_buffer;
8702 pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
8703 item_cnt++;
8704 }
8705 if (item_cnt > 0) {
8706 /* Write previous LID record */
8707 if (is_read_nvram == KAL_TRUE) {
8708 if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
8709 MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
8710 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
8711 } else {
8712 MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
8713 }
8714
8715 free_ctrl_buffer_set_null(pre_lid_buffer);
8716 }
8717 }
8718 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
8719
8720 return ret;
8721}
8722_STATIC void mcf_v1_read_ota_buffer(mcf_ota_file_t *ota_file, nvram_lid_enum lid, kal_uint16 record_idx, kal_uint8 *buffer)
8723{
8724 mcf_tool_file_info_t *pFile;
8725 mcf_tool_ota_file_item_t *pItem;
8726 kal_uint16 item_cnt = 0;
8727 kal_bool is_found_target = KAL_FALSE;
8728 kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
8729 kal_uint16 item_byte_offset;
8730 kal_uint16 item_bit_offset;
8731 kal_uint32 item_size;
8732 mcf_tag_info_struct unuse = {0};
8733 MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
8734
8735 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
8736 pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
8737 /* Read changed items from OTA file */
8738 while (item_cnt < pFile->item_num) {
8739 if ( (pItem->lid != lid) || (pItem->record_idx != record_idx) ) {
8740 if (is_found_target == KAL_FALSE) {
8741 goto next;
8742 } else {
8743 // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
8744 break;
8745 }
8746 }
8747 is_found_target = KAL_TRUE;
8748
8749 /* Check if item_tag_len is valid */
8750 if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
8751 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
8752 mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d) \r\n", pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
8753 goto next;
8754 }
8755
8756 /* Update LID item */
8757 if (pItem->is_bit_op == 0) {
8758 strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
8759 item_tag[pItem->item_tag_len] = '\0';
8760 if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
8761 goto next;
8762 }
8763
8764 if (pItem->op.byte.value_len > item_size) {
8765 MD_TRC_MCF_TR_READ_OTA_BUFFER_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
8766 mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->op.byte.value_len, item_size);
8767
8768 goto next;
8769 }
8770
8771 MD_TRC_MCF_TR_READ_OTA_BUFFER_BYTE_UPDATE(lid, item_byte_offset, pItem->op.byte.value_len);
8772 mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
8773
8774 kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
8775 } else {
8776 kal_uint32 bit_value = 0;
8777 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
8778
8779 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
8780
8781 strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
8782 item_tag[pItem->item_tag_len] = '\0';
8783 if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
8784 goto next;
8785 }
8786
8787 if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
8788 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
8789 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);
8790
8791 goto next;
8792 }
8793
8794 MD_TRC_MCF_TR_READ_OTA_BUFFER_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
8795
8796 if (pItem->op.bit.value_len == 1) {
8797 kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
8798
8799 *val_tmp &= ~(bit_mask << item_bit_offset);
8800 *val_tmp |= (bit_value << item_bit_offset);
8801 } else if (pItem->op.bit.value_len == 2) {
8802 kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
8803
8804 *val_tmp &= ~(bit_mask << item_bit_offset);
8805 *val_tmp |= (bit_value << item_bit_offset);
8806 } else if (pItem->op.bit.value_len == 4) {
8807 kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
8808
8809 *val_tmp &= ~(bit_mask << item_bit_offset);
8810 *val_tmp |= (bit_value << item_bit_offset);
8811 }
8812 }
8813
8814next:
8815 pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
8816 item_cnt++;
8817 }
8818 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
8819}
8820_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)
8821{
8822 mcf_tool_file_info_t *pFile;
8823 mcf_tool_tlvota_file_item_t *pItem;
8824 kal_uint16 item_cnt = 0;
8825 kal_char item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
8826 kal_uint16 item_byte_offset;
8827 kal_uint16 item_bit_offset;
8828 kal_uint32 item_size;
8829 mcf_tag_info_struct unuse = {0};
8830 MCF_DB_STRUCT_VARIABLE const *unuse_db_ptr = NULL;
8831
8832 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
8833 pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
8834 /* Read changed items from TLV-OTA file */
8835 while (item_cnt < pFile->item_num) {
8836 /* Check if LID and tag match */
8837 if ( (pItem->lid != lid) || (pItem->tag_type != tag.tag_type) || (strncmp(&(pItem->buff_start), tag.tag, pItem->tag_len) != 0) ) {
8838 goto next;
8839 }
8840
8841
8842 /* Check if item_tag_len is valid */
8843 if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
8844 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
8845 goto next;
8846 }
8847
8848 /* Update LID item */
8849 if (pItem->is_bit_op == 0) {
8850 strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
8851 item_tag[pItem->item_tag_len] = '\0';
8852 if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
8853 goto next;
8854 }
8855
8856 if (pItem->op.byte.value_len > item_size) {
8857 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
8858
8859 goto next;
8860 }
8861
8862 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BYTE_UPDATE_USIR(lid, tag.tag, item_byte_offset, pItem->op.byte.value_len);
8863 mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
8864
8865 kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
8866 } else {
8867 kal_uint32 bit_value = 0;
8868 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
8869
8870 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.bit.value_len);
8871
8872 strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
8873 item_tag[pItem->item_tag_len] = '\0';
8874 if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
8875 goto next;
8876 }
8877
8878 if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
8879 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
8880
8881 goto next;
8882 }
8883
8884 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);
8885
8886 if (pItem->op.bit.value_len == 1) {
8887 kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
8888
8889 *val_tmp &= ~(bit_mask << item_bit_offset);
8890 *val_tmp |= (bit_value << item_bit_offset);
8891 } else if (pItem->op.bit.value_len == 2) {
8892 kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
8893
8894 *val_tmp &= ~(bit_mask << item_bit_offset);
8895 *val_tmp |= (bit_value << item_bit_offset);
8896 } else if (pItem->op.bit.value_len == 4) {
8897 kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
8898
8899 *val_tmp &= ~(bit_mask << item_bit_offset);
8900 *val_tmp |= (bit_value << item_bit_offset);
8901 }
8902 }
8903
8904next:
8905 pItem = (mcf_tool_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
8906 item_cnt++;
8907 }
8908 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
8909}
8910
8911/*------------------------------------------------------------------------------
8912 * Public fucntions.
8913 *----------------------------------------------------------------------------*/
8914void mcf_on_ilm(ilm_struct *ilm)
8915{
8916 switch (ilm->msg_id)
8917 {
8918 case MSG_ID_L4C_MCF_SET_CONFIG_REQ:
8919 mcf_l4_set_config(ilm);
8920 break;
8921
8922 case MSG_ID_L4C_MCF_GET_CONFIG_REQ:
8923 mcf_l4_get_config(ilm);
8924 break;
8925
8926 case MSG_ID_L4C_MCF_DUMP_DATA_REQ:
8927 mcf_l4_dump_data(ilm);
8928 break;
8929
8930 case MSG_ID_L4C_MCF_CONFIG_LID_VARIABLE_OPERATION_REQ:
8931 mcf_l4_query_lid(ilm);
8932 break;
8933
8934 case MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_CNF:
8935 mcf_respond_dsbp_result(ilm->local_para_ptr);
8936 break;
8937
8938 case MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_RESULT_IND:
8939 mcf_report_dsbp_result(ilm->local_para_ptr);
8940 break;
8941
8942 case MSG_ID_L4CPS_EM_UPDATE_REQ:
8943 mcf_em_update_req_hdlr(ilm->local_para_ptr);
8944 break;
8945
8946 case MSG_ID_TIMER_EXPIRY:
8947 evshed_timer_handler(mcf_timer_es_g);
8948 break;
8949
8950 case MSG_ID_L4C_MCF_UPDATE_OTA_FILE_REQ:
8951 mcf_l4_update_ota(ilm);
8952 break;
8953
8954 case MSG_ID_L4C_MCF_CONFIG_REQ:
8955 mcf_l4_config(ilm);
8956 break;
8957
8958 case MSG_ID_L4C_MCF_VARIABLE_VALUE_OPERATION_REQ:
8959 mcf_l4_variable_operation(ilm);
8960 break;
8961
8962#ifdef __MCF_COMBINE_FILE_SUPPORT__
8963 case MSG_ID_L4C_MCF_ASSIGN_COMBINED_FILE_PATH_REQ:
8964 mcf_l4_assign_combined_file_path(ilm);
8965 break;
8966#endif
8967
8968#if defined(__MCF_UT_FRAMEWORK_SUPPORT__)
8969 case MSG_ID_MCF_UTFWK_INITIAL_ENV_REQ:
8970 mcf_utfwk_ilm_initial_env(ilm);
8971 break;
8972
8973 case MSG_ID_MCF_UTFWK_INITIAL_DSBP_CALLBACK_REQ:
8974 mcf_utfwk_ilm_initial_dsbp_callback(ilm);
8975 break;
8976
8977 case MSG_ID_MCF_UTFWK_EXECUTE_REQ:
8978 mcf_utfwk_ilm_execute(ilm);
8979 break;
8980
8981 case MSG_ID_MCF_UTFWK_DUMP_RESULT_REQ:
8982 mcf_utfwk_ilm_dump_result(ilm);
8983 break;
8984
8985 case MSG_ID_MCF_UTFWK_RESET_REQ:
8986 mcf_utfwk_ilm_reset(ilm);
8987 break;
8988
8989#endif
8990
8991 default:
8992 MD_TRC_MCF_TR_ILM_UNKNOWN_MSG(ilm->msg_id);
8993 break;
8994 }
8995}
8996
8997mcf_ota_result_e mcf_do_ota_full(void)
8998{
8999 mcf_t *pMcf = mcf_get_instance();
9000 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
9001 mcf_tool_file_info_t *pFile;
9002 mcf_tool_gid_ota_file_item_t *pItem;
9003 mcf_ota_file_t *ota_file = &(pMcf->ota_file);
9004 mcf_tlvota_file_t *tlvota_file;
9005 kal_uint16 item_cnt = 0;
9006 nvram_ef_mcf_ota_file_info_struct nv_ota_file;
9007 nvram_ef_mcf_tlvota_file_info_struct nv_tlvota_file;
9008 nvram_ef_mcf_sw_info_struct nv_sw_info;
9009 nvram_ltable_entry_struct lid_info = {0};
9010 em_mcf_read_ota_file_info_struct read_file_info;
9011 kal_uint8 *lid_buffer = NULL;
9012 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
9013 l4c_mcf_path_type_enum apply_path_type;
9014 kal_uint32 i;
9015 nvram_errno_enum nvram_api_ret;
9016 kal_bool is_read_nvram = KAL_FALSE;
9017 kal_uint32 start_time;
9018 kal_int16 pos = -1;
9019 kal_uint16 in_pos = 0;
9020 nvram_ltable_entry_struct pre_lid_info = {0};
9021 kal_uint16 pre_record_idx = 0xFFFF;
9022 kal_uint8 *pre_lid_buffer = NULL;
9023 kal_uint16 item_byte_offset;
9024 kal_uint16 item_bit_offset;
9025 kal_uint32 item_size;
9026 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
9027 kal_bool item_is_bit = KAL_FALSE;
9028 kal_uint16 item_lid;
9029 kal_char tool_version[MCF_FILE_MAX_TOOL_VERSION_LEN]={0};
9030 kal_uint32 total_start_time = GET_CURRENT_TIME();
9031 mcf_ota_result_e tlvota_ret;
9032
9033 /* This API can only be used by NVRAM while init */
9034 MCF_UT_DUMMY_ASSERT(kal_query_systemInit() == KAL_TRUE);
9035
9036 mcf_create_custom_folder(pMcf);
9037 kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
9038
9039 /* Read MCF SW information in NVRAM */
9040 if ( !nvram_external_read_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
9041 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_SW_INFO_LID, 1);
9042 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_SW_INFO_LID_FAIL;
9043 mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_SW_INFO_LID, 1);
9044 }
9045 /* Read MCF Internal information in NVRAM */
9046 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
9047 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
9048 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_INT_INFO_LID_FAIL;
9049 mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
9050 ret = MCF_OTA_R_READ_NVRAM_FAIL;
9051
9052 return ret;
9053 }
9054
9055 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NOT_RESET, nv_int_info.not_reset_ota);
9056 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);
9057 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);
9058
9059 for (i = 0; i < MAX_SIM_NUM; i++) {
9060 pMcf->is_ignore_dsbp[i] = nv_int_info.tlvota_is_ignore_dsbp[i];
9061 }
9062 pMcf->general_is_ignore_dsbp = nv_int_info.general_is_ignore_dsbp;
9063
9064 /* Read general TLV-OTA file into cache buffer */
9065 apply_path_type = L4C_MCF_PATH_TYPE_OTA;
9066 kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
9067
9068 /* Read MCF general TLV-OTA file into cache buffer */
9069 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))) {
9070 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1);
9071 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
9072 mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1);
9073 }
9074
9075 ret = mcf_read_general_tlvota_file(KAL_TRUE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
9076 // Set General OPOTA - Get tlvota result
9077 if (pMcf->general_is_ignore_dsbp == KAL_TRUE){
9078 for(i = 0; i < MAX_SIM_NUM; i++){
9079 com_Mcf.tlvota_result[i] = ret;
9080 }
9081 /* Check if file type is TLV-OTA file */
9082 tlvota_file = &(pMcf->general_tlvota_file);
9083 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9084 if (tlvota_file) {
9085 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
9086 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
9087 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
9088 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
9089 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
9090 for(i = 0; i < MAX_SIM_NUM; i++){
9091 com_Mcf.tlvota_result[i] = MCF_OTA_R_INVALID_FILE;
9092 }
9093 }
9094 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9095 }else{
9096 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
9097 }
9098 }
9099 if (ret == MCF_OTA_R_SUCCESS) {
9100 tlvota_file = &(pMcf->general_tlvota_file);
9101 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9102 if (tlvota_file) {
9103 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
9104
9105 /* Store last updated file informantion */
9106 tlvota_file->last_file.path_type = apply_path_type;
9107 strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9108 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
9109 strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
9110 tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
9111 } else {
9112 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
9113 }
9114 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
9115 strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
9116 tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
9117 } else {
9118 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
9119 }
9120 /*
9121 * No need to Update TLV-OTA information if
9122 * 1. SW version and generated time in OTA file and NVRAM are same
9123 * 2. Current SW version and build time are the same as last MCF OTA SW
9124 */
9125 if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
9126 if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_general_tlvota_file.sw_version, pFile->sw_version_len) != 0) ||
9127 (strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_general_tlvota_file.gen_time, pFile->gen_time_len) != 0) ||
9128 (strncmp(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
9129 (strncmp(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)) {
9130 /* Write updated MCF TLV-OTA file information to NVRAM */
9131 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
9132 strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
9133 nv_sw_info.last_update_general_tlvota_file.sw_version[pFile->sw_version_len] = '\0';
9134 } else {
9135 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
9136 }
9137
9138 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
9139 strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
9140 nv_sw_info.last_update_general_tlvota_file.gen_time[pFile->gen_time_len] = '\0';
9141 } else {
9142 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
9143 }
9144 strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
9145 strncpy(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9146 for(i = 0; i < MAX_SIM_NUM; i++){
9147 is_read_general_tlvota[i] = KAL_TRUE;
9148 }
9149 }
9150 }else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
9151 if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_general_tlvota_file.sw_version, pFile->sw_version_len) != 0) ||
9152 (strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_general_tlvota_file.gen_time, pFile->gen_time_len) != 0) ||
9153 (strncmp(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
9154 (strncmp(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)) {
9155 /* Write updated MCF TLV-OTA file information to NVRAM */
9156 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
9157 strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
9158 nv_sw_info.last_update_general_tlvota_file.sw_version[pFile->sw_version_len] = '\0';
9159 } else {
9160 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
9161 }
9162
9163 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
9164 strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
9165 nv_sw_info.last_update_general_tlvota_file.gen_time[pFile->gen_time_len] = '\0';
9166 } else {
9167 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
9168 }
9169 strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
9170 strncpy(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9171 for(i = 0; i < MAX_SIM_NUM; i++){
9172 is_read_general_tlvota[i] = KAL_TRUE;
9173 }
9174 }
9175
9176 }
9177
9178 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9179 }else{
9180 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_GENERAL_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
9181 }
9182 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_GENERAL_TLVOTA_FILE_INFO, apply_path_type, apply_filename);
9183
9184 }
9185
9186
9187
9188 /* Read TLV-OTA file into cache buffer */
9189 for (i = 0; i < MAX_SIM_NUM; i++) {
9190 apply_path_type = L4C_MCF_PATH_TYPE_OTA;
9191 kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
9192 kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
9193 com_Mcf.update_tlvota[i] = KAL_FALSE;
9194 com_Mcf.update_general_tlvota[i] = KAL_FALSE;
9195
9196 tlvota_file = &(pMcf->tlvota_file[i]);
9197
9198 read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_BOOT_UP;
9199 read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
9200 read_file_info.ps_id = l4c_gemini_get_switched_sim_id(i);
9201
9202 /* Read MCF TLV-OTA file into cache buffer */
9203 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))) {
9204 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_TLVOTA_FILE_LID, i + 1);
9205 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
9206 mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_TLVOTA_FILE_LID, i + 1);
9207 }
9208
9209 read_file_info.start_time = kal_get_systicks();
9210
9211 ret = mcf_read_tlvota_file(KAL_TRUE, i, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
9212 tlvota_ret = ret;
9213 if (ret == MCF_OTA_R_SUCCESS) {
9214 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9215 if (tlvota_file) {
9216 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
9217
9218 /* Store last updated file informantion */
9219 tlvota_file->last_file.path_type = apply_path_type;
9220 strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9221 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
9222 strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
9223 tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
9224 } else {
9225 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
9226 }
9227 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
9228 strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
9229 tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
9230 } else {
9231 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
9232 }
9233 /*
9234 * No need to Update TLV-OTA information if
9235 * 1. SW version and generated time in OTA file and NVRAM are same
9236 * 2. Current SW version and build time are the same as last MCF OTA SW
9237 */
9238 if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
9239 if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, pFile->sw_version_len) != 0) ||
9240 (strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, pFile->gen_time_len) != 0) ||
9241 (strncmp(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
9242 (strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)){
9243
9244 /* Write updated MCF TLV-OTA file information to NVRAM */
9245 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
9246 strncpy(nv_sw_info.last_update_tlvota_file[i].sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
9247 nv_sw_info.last_update_tlvota_file[i].sw_version[pFile->sw_version_len] = '\0';
9248 } else {
9249 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
9250 }
9251
9252 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
9253 strncpy(nv_sw_info.last_update_tlvota_file[i].gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
9254 nv_sw_info.last_update_tlvota_file[i].gen_time[pFile->gen_time_len] = '\0';
9255 } else {
9256 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
9257 }
9258 strncpy(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
9259 strncpy(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9260 is_read_tlvota[i] = KAL_TRUE;
9261
9262 }
9263 }else if(apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME){
9264 if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, pFile->sw_version_len) != 0) ||
9265 (strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, pFile->gen_time_len) != 0) ||
9266 (strncmp(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
9267 (strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)){
9268 /* Write updated MCF TLV-OTA file information to NVRAM */
9269 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
9270 strncpy(nv_sw_info.last_update_tlvota_file[i].sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
9271 nv_sw_info.last_update_tlvota_file[i].sw_version[pFile->sw_version_len] = '\0';
9272 } else {
9273 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
9274 }
9275
9276 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
9277 strncpy(nv_sw_info.last_update_tlvota_file[i].gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
9278 nv_sw_info.last_update_tlvota_file[i].gen_time[pFile->gen_time_len] = '\0';
9279 } else {
9280 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
9281 }
9282 strncpy(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
9283 strncpy(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9284 is_read_tlvota[i] = KAL_TRUE;
9285
9286 }
9287
9288 }
9289
9290 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9291 }else{
9292 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
9293 }
9294
9295 read_file_info.path_type = apply_path_type;
9296 strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9297 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_INFO, i, apply_path_type, apply_filename);
9298 }else{
9299 /* Copy last updated file informantion */
9300 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9301 if (tlvota_file) {
9302 if ((strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0)) {
9303 tlvota_file->last_file.path_type = L4C_MCF_PATH_TYPE_OTA;
9304 }else if ((strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0)) {
9305 tlvota_file->last_file.path_type = L4C_MCF_PATH_TYPE_RUNTIME;
9306 }
9307 strncpy(tlvota_file->last_file.name, nv_sw_info.last_update_tlvota_file[i].name, MCF_FILE_MAX_NAME_LEN - 1);
9308 strncpy(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, MCF_FILE_MAX_SW_VERSION_LEN-1);
9309 strncpy(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, MCF_FILE_MAX_GEN_TIME_LEN - 1);
9310 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9311 }else{
9312 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
9313 }
9314
9315 }
9316 read_file_info.result = ret;
9317 read_file_info.end_time = kal_get_systicks();
9318
9319 mcf_em_send_ota_file_info(&read_file_info);
9320
9321 if (pMcf->is_ignore_dsbp[i] == KAL_TRUE){
9322 set_op_read_ret[i] = tlvota_ret;
9323 /* Check if file type is TLV-OTA file */
9324 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9325 if (tlvota_file) {
9326 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
9327 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
9328 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
9329 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
9330 com_Mcf.tlvota_result[i] = MCF_OTA_R_INVALID_FILE;
9331 }
9332 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
9333 }else{
9334 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
9335 }
9336 }
9337 }
9338
9339 kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
9340 read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_BOOT_UP;
9341 read_file_info.config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
9342
9343 /* Read MCF OTA file into cache buffer */
9344 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))) {
9345 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_OTA_FILE_LID, 1);
9346 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
9347 mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_OTA_FILE_LID, 1);
9348 }
9349
9350 nv_int_info.update_ota_result = KAL_FALSE;
9351 apply_path_type = L4C_MCF_PATH_TYPE_OTA;
9352 kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
9353 read_file_info.start_time = kal_get_systicks();
9354
9355 ret = mcf_read_ota_file(KAL_TRUE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
9356
9357 if (ret == MCF_OTA_R_SUCCESS) {
9358 read_file_info.path_type = apply_path_type;
9359 strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9360 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_OTA_FILE_INFO, apply_path_type, apply_filename);
9361 } else {
9362 /* Cannot do OTA if fail to read OTA file */
9363 read_file_info.result = ret;
9364 read_file_info.end_time = kal_get_systicks();
9365
9366 mcf_em_send_ota_file_info(&read_file_info);
9367
9368 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_OTA_FILE_FAIL);
9369 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_FULL_OTA_FAIL;
9370 mcf_utfwk_printf("Fail to read OTA file, cannot do full OTA!! \r\n");
9371
9372 return ret;
9373 }
9374
9375
9376 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
9377 if (ota_file) {
9378 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
9379
9380 /* Check if file type is OTA file */
9381 if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
9382 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
9383
9384 ret = MCF_OTA_R_INVALID_FILE;
9385 read_file_info.result = ret;
9386 read_file_info.end_time = kal_get_systicks();
9387
9388 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
9389 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
9390
9391 mcf_em_send_ota_file_info(&read_file_info);
9392
9393 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
9394 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_INVALID_FILE;
9395 mcf_utfwk_printf("Invalid file type(%s)!! \r\n", str_tmp);
9396
9397 return ret;
9398 }
9399
9400 /*
9401 * No need to do OTA if
9402 * 1. SW version and generated time in OTA file and NVRAM are same
9403 * 2. Current SW version and build time are the same as last MCF OTA SW
9404 */
9405 if ( (strncmp(nv_sw_info.last_update_file.sw_version, &(pFile->buff_start), pFile->sw_version_len) == 0) &&
9406 (strncmp(nv_sw_info.last_update_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len) == 0) &&
9407 (strncmp(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN) == 0) &&
9408 (strncmp(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN) == 0) ) {
9409 if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
9410 if ((strncmp(nv_sw_info.last_update_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0) &&
9411 (strncmp(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) ) {
9412 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
9413
9414 read_file_info.result = ret;
9415 read_file_info.end_time = kal_get_systicks();
9416
9417 mcf_em_send_ota_file_info(&read_file_info);
9418
9419 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED1);
9420 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);
9421 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED3, nv_sw_info.version, nv_sw_info.build_time);
9422 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
9423 com_Mcf.boot_trace_flag |= (MCF_BOOT_TRACE_F_NO_NEED | MCF_BOOT_TRACE_F_FULL_OTA_SUCCESS);
9424 mcf_utfwk_printf("MD version is not changed, no need to do full OTA!!\r\n");
9425
9426 return ret;
9427 }
9428 } else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
9429 if ((strncmp(nv_sw_info.last_update_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0) &&
9430 (strncmp(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) ) {
9431 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
9432
9433 read_file_info.result = ret;
9434 read_file_info.end_time = kal_get_systicks();
9435
9436 mcf_em_send_ota_file_info(&read_file_info);
9437
9438 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED1);
9439 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);
9440 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED3, nv_sw_info.version, nv_sw_info.build_time);
9441 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
9442 com_Mcf.boot_trace_flag |= (MCF_BOOT_TRACE_F_NO_NEED | MCF_BOOT_TRACE_F_FULL_OTA_SUCCESS);
9443 mcf_utfwk_printf("MD version is not changed, no need to do full OTA!!\r\n");
9444
9445 return ret;
9446 }
9447 }
9448 }
9449
9450
9451 /* Reset LID to default value */
9452 if((pFile->operation_mask & MCF_FILE_OP_NOT_RESET_LID) == 0) {
9453 /* Copy last modified LID list to global variable */
9454 kal_mem_cpy(&mcf_last_mod_lid_g, &nv_int_info.last_mod_lid, sizeof(nvram_mcf_lid_info_struct));
9455
9456 start_time = GET_CURRENT_TIME();
9457 if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
9458 for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
9459 nvram_api_ret = nvram_external_get_lid_info(MCF_LAST_MODIFIED_LID, &lid_info);
9460 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
9461 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);
9462 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_ALL_LID_INFO_FAIL, 0, MCF_LAST_MODIFIED_LID, nvram_api_ret);
9463 continue;
9464 }
9465 if((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) {
9466 if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0) {
9467#ifdef __MCF_COMBINE_FILE_SUPPORT__
9468 if(nv_int_info.not_reset_ota == KAL_FALSE || nv_int_info.last_mod_lid.lid_conf[i].not_reset == KAL_FALSE)
9469#endif
9470 {
9471 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID, 0, MCF_LAST_MODIFIED_LID);
9472 if ( !nvram_external_reset_data(MCF_LAST_MODIFIED_LID, 1, lid_info.total_records) ) {
9473 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID_FAIL, 0, MCF_LAST_MODIFIED_LID, lid_info.total_records);
9474 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);
9475 }
9476 }
9477 } else {
9478 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_ATTR_NOT_SET, 0, lid_info.LID, lid_info.attr);
9479 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);
9480 }
9481
9482 }
9483 }
9484 }else{
9485 for(i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++){
9486 nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
9487 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
9488 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);
9489 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);
9490 continue;
9491 }
9492 if((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) {
9493 if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0) {
9494 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID, 1, mcf_db_lid_mapping_tbl[i].lid_num);
9495 if ( !nvram_external_reset_data(mcf_db_lid_mapping_tbl[i].lid_num, 1, lid_info.total_records) ) {
9496 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);
9497 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);
9498 }
9499 } else {
9500 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_ATTR_NOT_SET, 1, lid_info.LID, lid_info.attr);
9501 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);
9502 }
9503 }
9504 }
9505 }
9506
9507 kal_mem_set(&nv_int_info.last_mod_lid, 0, sizeof(nvram_mcf_lid_info_struct));
9508
9509 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_TIME, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
9510 }
9511
9512
9513 /* Update MCF OTA file flow - MCF2.0 */
9514 if (pFile->file_version == 3) {
9515 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
9516 pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
9517
9518 /* Read changed items from OTA file */
9519 while (item_cnt < pFile->item_num) {
9520 /* Check if array_tag_len is valid */
9521 if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
9522 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ARRAY_INDEX_LEN, pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
9523 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);
9524 goto next;
9525 }
9526 strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
9527 array_tag[pItem->array_index_len] = '\0';
9528 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);
9529
9530 /* Find GID corresponding LID */
9531 item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
9532 if (item_lid == 65535){
9533 //-1(65535) means not found
9534 goto next;
9535 }
9536
9537 if ( (is_read_nvram == KAL_FALSE) || (item_lid != pre_lid_info.LID) || (pItem->record_idx != pre_record_idx) ) {
9538 nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
9539 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
9540 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_LID_INFO_FAIL, item_lid, nvram_api_ret);
9541 mcf_utfwk_printf("Fail to get LID information!! lid(%d), nvram_ret(%d)\r\n", item_lid, nvram_api_ret);
9542 goto next;
9543 }
9544
9545#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
9546 /* Store last time modified LID */
9547 if ( (item_lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
9548 && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
9549 if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
9550 pos = mcf_binary_search_lid(item_lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
9551 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, item_lid, pos);
9552 if (pos == -1) {
9553 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){
9554 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, item_lid);
9555 mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)\r\n", item_lid);
9556 }else{
9557 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, item_lid, in_pos);
9558 }
9559 nv_int_info.last_mod_lid.lid_cnt++;
9560 }
9561 }
9562 }
9563#else
9564 /* Store last time modified LID */
9565 if ( (item_lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
9566 && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
9567 if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
9568 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);
9569 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, item_lid, pos);
9570 if (pos == -1) {
9571 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){
9572 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, item_lid);
9573 mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)\r\n", item_lid);
9574 }else{
9575 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, item_lid, in_pos);
9576 }
9577 nv_int_info.last_mod_lid.lid_cnt++;
9578 }
9579 }
9580 }
9581#endif
9582
9583 /* Do not update LID if OTA attribute is not set */
9584 if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
9585 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR, lid_info.LID, lid_info.attr);
9586 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);
9587 /* Write previous LID record */
9588 if (is_read_nvram == KAL_TRUE && (item_lid != pre_lid_info.LID)) {
9589 if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
9590 if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
9591 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
9592 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
9593 mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
9594 } else {
9595 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
9596 }
9597 } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
9598 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
9599 } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
9600 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
9601 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);
9602 } else {
9603 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
9604 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);
9605 }
9606 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);
9607
9608 free_ctrl_buffer_set_null(pre_lid_buffer);
9609 }
9610
9611 is_read_nvram = KAL_FALSE;
9612 goto next;
9613 }
9614
9615 /* Write previous LID record */
9616 if (is_read_nvram == KAL_TRUE) {
9617 if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
9618 if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
9619 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
9620 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
9621 mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
9622 } else {
9623 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
9624 }
9625 } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
9626 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
9627 } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
9628 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
9629 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);
9630 } else {
9631 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
9632 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);
9633 }
9634 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);
9635
9636 free_ctrl_buffer_set_null(pre_lid_buffer);
9637 is_read_nvram = KAL_FALSE;
9638 }
9639
9640 /* Do not reset LID if same with previos one */
9641 if (item_lid != pre_lid_info.LID) {
9642 if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0 ) {
9643 if(nv_int_info.not_reset_ota == KAL_FALSE){
9644 if ( !nvram_external_reset_data(item_lid, 1, lid_info.total_records) ) {
9645 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_LID_FAIL, item_lid, lid_info.total_records);
9646 mcf_utfwk_printf("Reset LID(%d) FAIL!!, total_record(%d)\r\n", item_lid, lid_info.total_records);
9647 }
9648 }
9649 } else {
9650 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_ATTR_NOT_SET, lid_info.LID, lid_info.attr);
9651 mcf_utfwk_printf("OTA reset attribute is not set!! lid(%d), attribute(%x)\r\n", lid_info.LID, lid_info.attr);
9652 }
9653 }
9654
9655 lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info.size);
9656
9657 /* Read NVRAM LID */
9658 if ( !nvram_external_read_data(item_lid, pItem->record_idx, lid_buffer, lid_info.size) ) {
9659 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_ITEM_LID_FAIL, item_lid, pItem->record_idx);
9660 mcf_utfwk_printf("Fail to read item LID(%d), record(%d)\r\n", item_lid, pItem->record_idx);
9661 is_read_nvram = KAL_FALSE;
9662 free_ctrl_buffer_set_null(lid_buffer);
9663
9664 goto next;
9665 } else {
9666 is_read_nvram = KAL_TRUE;
9667 }
9668 }
9669
9670 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){
9671 goto next;
9672 }
9673
9674 /* Update LID item */
9675 if (item_is_bit == 0) {
9676 if (pItem->value_len > item_size) {
9677 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_LARGE_VAL_LEN, pItem->value_len, item_size);
9678 mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d)\r\n", pItem->value_len, item_size);
9679 goto next;
9680 }
9681
9682 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BYTE_UPDATE, item_lid, item_byte_offset, pItem->value_len);
9683 mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
9684
9685 kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
9686 nv_int_info.update_ota_result = KAL_TRUE;
9687 } else {
9688 kal_uint32 bit_value = 0;
9689 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
9690 kal_uint32 offset = 0;
9691 kal_uint32 var_size = 1;
9692 kal_uint32 val_tmp = 0;
9693
9694 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
9695
9696 if (pItem->value_len > 4) {
9697 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, pItem->value_len, item_size, pItem->value_len);
9698 mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d)\r\n", item_size, item_size, pItem->value_len);
9699 goto next;
9700 }
9701
9702 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BIT_UPDATE, item_lid, item_byte_offset, item_bit_offset, item_size, bit_value);
9703
9704 if (item_size > 8 && item_size <= 16) {
9705 var_size = 2;
9706 }else if (item_size > 16 && item_size <= 24) {
9707 var_size = 3;
9708 }else if (item_size > 24 && item_size <= 32) {
9709 var_size = 4;
9710 }
9711
9712 if (item_bit_offset > 0 && item_bit_offset < 8){
9713 offset = 0;
9714 }else if(item_bit_offset >= 8 && item_bit_offset < 16){
9715 offset = 1;
9716 }else if(item_bit_offset >= 16 && item_bit_offset < 24){
9717 offset = 2;
9718 }else if(item_bit_offset >= 24 && item_bit_offset < 32){
9719 offset = 3;
9720 }else if (item_bit_offset >= 32){
9721 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_OFFSET, item_bit_offset, item_size, pItem->value_len);
9722 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);
9723
9724 goto next;
9725 }
9726
9727 if (item_bit_offset > 0) {
9728 if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
9729 var_size+=((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
9730 }
9731 }
9732
9733 if (var_size > 4) {
9734 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, var_size, item_size, pItem->value_len);
9735 mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d)\r\n", var_size, item_size, pItem->value_len);
9736 goto next;
9737 }
9738
9739 if (item_bit_offset >= 8 && item_bit_offset < 16) {
9740 item_bit_offset -= 8;
9741 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
9742 item_bit_offset -= 16;
9743 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
9744 item_bit_offset -= 24;
9745 }
9746
9747
9748 kal_mem_cpy(&val_tmp, lid_buffer + item_byte_offset + offset, var_size);
9749 val_tmp &= ~(bit_mask << item_bit_offset);
9750 val_tmp |= (bit_value << item_bit_offset);
9751
9752 kal_mem_cpy(lid_buffer + item_byte_offset + offset, &val_tmp, var_size);
9753
9754 nv_int_info.update_ota_result = KAL_TRUE;
9755 }
9756
9757
9758 next:
9759 pre_lid_info = lid_info;
9760 pre_record_idx = pItem->record_idx;
9761 pre_lid_buffer = lid_buffer;
9762 pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
9763 item_cnt++;
9764 }
9765
9766 if (item_cnt > 0) {
9767 /* Write previous LID record */
9768 if (is_read_nvram == KAL_TRUE) {
9769 if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
9770 if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
9771 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
9772 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
9773 mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
9774 } else {
9775 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
9776 }
9777 } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
9778 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
9779 } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
9780 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
9781 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);
9782 } else {
9783 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
9784 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);
9785 }
9786 free_ctrl_buffer_set_null(pre_lid_buffer);
9787
9788 }
9789 }
9790 if (ret != MCF_OTA_R_SUCCESS){
9791 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
9792 return ret;
9793 }
9794 }else if (pFile->file_version == 2){
9795 mcf_v1_do_ota_full(ota_file);
9796 }
9797
9798 /* Write updated MCF OTA file information to NVRAM */
9799 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
9800 strncpy(nv_sw_info.last_update_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
9801 nv_sw_info.last_update_file.sw_version[pFile->sw_version_len] = '\0';
9802 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_SW_VERSION, nv_sw_info.last_update_file.sw_version);
9803 } else {
9804 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
9805 mcf_utfwk_printf("Invalid OTA file SW version!! file_version_len(%d)!!\r\n", pFile->sw_version_len);
9806 }
9807
9808 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
9809 strncpy(nv_sw_info.last_update_file.gen_time, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len);
9810 nv_sw_info.last_update_file.gen_time[pFile->gen_time_len] = '\0';
9811 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_GEN_TIME, nv_sw_info.last_update_file.gen_time);
9812 } else {
9813 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
9814 mcf_utfwk_printf("Invalid OTA file SW gen time!! file_gen_time_len(%d)!!\r\n", pFile->gen_time_len);
9815 }
9816
9817 if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
9818 strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
9819 tool_version[pFile->tool_version_len] = '\0';
9820 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_TOOL_VERSION, tool_version);
9821 } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
9822 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_INVALID_TOOL_VERSION, pFile->tool_version_len);
9823 mcf_utfwk_printf("Invalid OTA file tool version!! file_tool_version_len(%d)!!\r\n", pFile->tool_version_len);
9824 }
9825
9826 if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
9827 strncpy(nv_sw_info.last_update_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
9828 strncpy(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9829 } else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
9830 strncpy(nv_sw_info.last_update_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
9831 strncpy(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
9832 }
9833
9834 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)) ) {
9835 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_OTA_FILE_LID, 1);
9836 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_FILE_LID_FAIL;
9837 mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_OTA_FILE_LID, 1);
9838 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
9839
9840 read_file_info.result = ret;
9841 read_file_info.end_time = kal_get_systicks();
9842
9843 mcf_em_send_ota_file_info(&read_file_info);
9844
9845 return ret;
9846 }
9847 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
9848 } else {
9849 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TAKE_READ_LOCK_FAIL);
9850 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_TAKE_READ_LOCK_FAIL;
9851 mcf_utfwk_printf("Read OTA, Fail to take read lock!!\r\n");
9852
9853 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
9854 read_file_info.result = ret;
9855 read_file_info.end_time = kal_get_systicks();
9856
9857 mcf_em_send_ota_file_info(&read_file_info);
9858
9859 return ret;
9860 }
9861
9862 /* Copy current modified LID list to global variable */
9863 kal_mem_cpy(&mcf_curr_mod_lid_g, &nv_int_info.last_mod_lid, sizeof(nvram_mcf_lid_info_struct));
9864
9865 /* Write updated MCF SW information in NVRAM */
9866 strncpy(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN - 1);
9867 strncpy(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN - 1);
9868 if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
9869 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_SW_INFO_LID, 1);
9870 mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_SW_INFO_LID, 1);
9871 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_SW_INFO_LID_FAIL;
9872 }
9873 /* Write updated MCF internal information in NVRAM */
9874 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
9875 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
9876 mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
9877 com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_INT_INFO_LID_FAIL;
9878 }
9879
9880 read_file_info.result = ret;
9881 read_file_info.end_time = kal_get_systicks();
9882
9883 mcf_em_send_ota_file_info(&read_file_info);
9884
9885 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
9886
9887 return ret;
9888}
9889
9890mcf_ota_result_e mcf_do_ota_by_lid(
9891 nvram_lid_enum lid,
9892 kal_uint16 record_idx,
9893 kal_uint16 record_amount,
9894 nvram_ltable_entry_struct *lid_info)
9895{
9896 mcf_t *pMcf = mcf_get_instance();
9897 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
9898 mcf_tool_file_info_t *pFile;
9899 mcf_tool_gid_ota_file_item_t *pItem;
9900 mcf_ota_file_t *ota_file = &(pMcf->ota_file);
9901 kal_bool is_read_nvram = KAL_FALSE;
9902 kal_uint16 pre_record_idx = 0xFFFF;
9903 kal_bool is_found_target = KAL_FALSE;
9904 kal_uint8 *pre_lid_buffer = NULL;
9905 kal_uint8 *lid_buffer = NULL;
9906 kal_uint16 item_cnt = 0;
9907 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
9908 kal_uint16 item_byte_offset;
9909 kal_uint16 item_bit_offset;
9910 kal_uint32 item_size;
9911 kal_bool item_is_bit = KAL_FALSE;
9912 kal_uint16 item_lid;
9913
9914 DEBUG_ASSERT(lid_info);
9915 if (!lid_info) {
9916 MD_TRC_MCF_TR_LID_OTA_LID_INVALID_PARA(lid, lid_info);
9917 ret = MCF_OTA_R_INVALID_PARAMETER;
9918
9919 return ret;
9920 }
9921 MD_TRC_MCF_TR_LID_OTA_START(lid, record_idx, record_amount);
9922
9923 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
9924 if (ota_file) {
9925 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
9926
9927
9928 /* Check if file type is OTA file */
9929 if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
9930 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
9931 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
9932 MD_TRC_MCF_TR_LID_OTA_LID_INVALID_FILE(str_tmp);
9933 ret = MCF_OTA_R_INVALID_FILE;
9934 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
9935
9936 return ret;
9937 }
9938
9939 /* If NVRAM_ATTR_MCF_OTA is not set, do not OTA */
9940 if ( (lid_info->attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
9941 MD_TRC_MCF_TR_LID_OTA_INVALID_ATTR(lid, lid_info->attr);
9942 ret = MCF_OTA_R_INVALID_ATTR;
9943 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
9944
9945 return ret;
9946 }
9947
9948 /* Not allow to set both NVRAM_ATTR_MCF_OTA and NVRAM_ATTR_MCF_OTA_FOR_QUERY */
9949 if ( (lid_info->attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
9950 MD_TRC_MCF_TR_LID_OTA_DOUBLE_ATTR(lid, lid_info->attr);
9951 ret = MCF_OTA_R_INVALID_ATTR;
9952 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
9953
9954 return ret;
9955 }
9956
9957 /* MCF 1.0 update flow */
9958 if (pFile->file_version == 2){
9959 ret = mcf_v1_do_ota_by_lid (ota_file, lid, record_idx, record_amount, lid_info);
9960 if(ret != MCF_OTA_R_SUCCESS)
9961 {
9962 return ret;
9963 }
9964 }else if (pFile->file_version == 3){
9965 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
9966 pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
9967 /* Read changed items from OTA file */
9968 while (item_cnt < pFile->item_num) {
9969 if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
9970 MD_TRC_MCF_TR_LID_OTA_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
9971 goto next;
9972 }
9973 strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
9974 array_tag[pItem->array_index_len] = '\0';
9975
9976 /* Find GID corresponding LID */
9977 item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
9978 if (item_lid == 65535){
9979 //-1(65535) means not found
9980 goto next;
9981 }
9982
9983 if ( (item_lid != lid) || (pItem->record_idx < record_idx) || (pItem->record_idx > (record_idx + record_amount - 1)) ) {
9984 if (is_found_target == KAL_FALSE) {
9985 goto next;
9986 } else {
9987 // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
9988 break;
9989 }
9990 }
9991
9992 if ( (is_read_nvram == KAL_FALSE) || (pItem->record_idx != pre_record_idx) ) {
9993 is_found_target = KAL_TRUE;
9994
9995 /* Write previous LID record */
9996 if (is_read_nvram == KAL_TRUE) {
9997 if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
9998 MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
9999 } else {
10000 MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
10001 }
10002
10003 free_ctrl_buffer_set_null(pre_lid_buffer);
10004 is_read_nvram = KAL_FALSE;
10005 }
10006
10007 lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info->size);
10008
10009 /* Read NVRAM LID */
10010 if ( !nvram_external_read_data(item_lid, pItem->record_idx, lid_buffer, lid_info->size) ) {
10011 MD_TRC_MCF_TR_LID_OTA_READ_ITEM_NVRAM_FAIL(lid, pItem->record_idx);
10012 is_read_nvram = KAL_FALSE;
10013 free_ctrl_buffer_set_null(lid_buffer);
10014
10015 goto next;
10016 } else {
10017 is_read_nvram = KAL_TRUE;
10018 }
10019 }
10020
10021 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){
10022 goto next;
10023 }
10024
10025 /* Update LID item */
10026 if (item_is_bit == 0) {
10027 if (pItem->value_len > item_size) {
10028 MD_TRC_MCF_TR_LID_OTA_LARGE_VAL_LEN(pItem->value_len, item_size);
10029 goto next;
10030 }
10031
10032 MD_TRC_MCF_TR_LID_OTA_BYTE_UPDATE(lid, item_byte_offset, pItem->value_len);
10033 mcf_dump_data(KAL_FALSE, &(pItem->buff_start)+pItem->array_index_len, pItem->value_len);
10034
10035 kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
10036 } else {
10037 kal_uint32 bit_value = 0;
10038 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
10039 kal_uint32 offset = 0;
10040 kal_uint32 var_size = 1;
10041 kal_uint32 val_tmp = 0;
10042
10043 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
10044
10045 if (pItem->value_len > 4) {
10046 MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
10047
10048 goto next;
10049 }
10050
10051 MD_TRC_MCF_TR_LID_OTA_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, item_size, bit_value);
10052
10053 if (item_size > 8 && item_size <= 16) {
10054 var_size = 2;
10055 }else if (item_size > 16 && item_size <= 24) {
10056 var_size = 3;
10057 }else if (item_size > 24 && item_size <= 32) {
10058 var_size = 4;
10059 }
10060
10061 if (item_bit_offset > 0 && item_bit_offset < 8) {
10062 offset = 0;
10063 }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
10064 offset = 1;
10065 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
10066 offset = 2;
10067 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
10068 offset = 3;
10069 }else if (item_bit_offset >= 32){
10070 MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
10071
10072 goto next;
10073 }
10074
10075 if (item_bit_offset > 0) {
10076 if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
10077 var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
10078 }
10079 }
10080
10081 if (var_size > 4) {
10082 MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
10083 goto next;
10084 }
10085
10086 if (item_bit_offset >= 8 && item_bit_offset < 16) {
10087 item_bit_offset -= 8;
10088 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
10089 item_bit_offset -= 16;
10090 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
10091 item_bit_offset -= 24;
10092 }
10093
10094
10095 kal_mem_cpy(&val_tmp, lid_buffer + item_byte_offset + offset, var_size);
10096 val_tmp &= ~(bit_mask << item_bit_offset);
10097 val_tmp |= (bit_value << item_bit_offset);
10098
10099 kal_mem_cpy(lid_buffer + item_byte_offset + offset, &val_tmp, var_size);
10100 }
10101
10102 next:
10103 pre_record_idx = pItem->record_idx;
10104 pre_lid_buffer = lid_buffer;
10105 pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
10106 item_cnt++;
10107 }
10108 if (item_cnt > 0) {
10109 /* Write previous LID record */
10110 if (is_read_nvram == KAL_TRUE) {
10111 if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
10112 MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
10113 ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
10114 } else {
10115 MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
10116 }
10117
10118 free_ctrl_buffer_set_null(pre_lid_buffer);
10119 }
10120 }
10121 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
10122 }
10123 } else {
10124 MD_TRC_MCF_TR_LID_OTA_TAKE_READ_LOCK_FAIL(lid);
10125 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
10126 }
10127
10128 return ret;
10129}
10130
10131mcf_ota_result_e mcf_read_ota_buffer(
10132 nvram_lid_enum lid,
10133 kal_uint16 record_idx,
10134 kal_uint8 *buffer,
10135 kal_uint32 size)
10136{
10137 mcf_t *pMcf = mcf_get_instance();
10138 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
10139 nvram_ltable_entry_struct lid_info = {0};
10140 mcf_tool_file_info_t *pFile;
10141 mcf_tool_gid_ota_file_item_t *pItem;
10142 mcf_ota_file_t *ota_file = &(pMcf->ota_file);
10143 kal_uint16 item_cnt = 0;
10144 nvram_errno_enum nvram_api_ret;
10145 kal_bool is_found_target = KAL_FALSE;
10146 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
10147 kal_uint16 item_byte_offset;
10148 kal_uint16 item_bit_offset;
10149 kal_uint32 item_size;
10150 kal_bool item_is_bit = KAL_FALSE;
10151 kal_uint16 item_lid;
10152 kal_uint32 start_time = GET_CURRENT_TIME();
10153
10154 if (!(buffer && (size > 0))) {
10155 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_PARA(lid, buffer, size);
10156 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_PARA, lid, buffer, size);
10157 mcf_utfwk_printf("Invalid parameters!! LID(%d), buffer(%x), size(%d) \r\n", lid, buffer, size);
10158 ret = MCF_OTA_R_INVALID_PARAMETER;
10159
10160 return ret;
10161 }
10162 MD_TRC_MCF_TR_READ_OTA_BUFFER_START(lid, record_idx, buffer, size);
10163
10164 MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
10165 if (ota_file) {
10166 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
10167
10168 /* Check if file type is OTA file */
10169 if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
10170 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
10171 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
10172 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_FILE, str_tmp);
10173 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_FILE(str_tmp);
10174 ret = MCF_OTA_R_INVALID_FILE;
10175 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
10176
10177 return ret;
10178 }
10179
10180 nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
10181 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
10182 MD_TRC_MCF_TR_READ_OTA_BUFFER_GET_LID_INFO_FAIL(lid, nvram_api_ret);
10183 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_GET_LID_INFO_FAIL, lid, nvram_api_ret);
10184 mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
10185 ret = MCF_OTA_R_INVALID_PARAMETER;
10186 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
10187
10188 return ret;
10189 }
10190
10191 if (size != lid_info.size) {
10192 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_SIZE(size, lid_info.size);
10193 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_SIZE, size, lid_info.size);
10194 mcf_utfwk_printf("Invalid buffer_size(%d)!! record_size(%d) \r\n", size, lid_info.size);
10195 ret = MCF_OTA_R_INVALID_PARAMETER;
10196 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
10197
10198 return ret;
10199 }
10200
10201#if 0 //Bypass attribute check because NVRAM_ATTR_MCF_OTA will also use this API
10202/* under construction !*/
10203/* under construction !*/
10204/* under construction !*/
10205/* under construction !*/
10206/* under construction !*/
10207/* under construction !*/
10208/* under construction !*/
10209/* under construction !*/
10210/* under construction !*/
10211/* under construction !*/
10212#endif
10213 /*MCF 1.0 Read OTA buffer Update flow */
10214 if (pFile->file_version == 2){
10215 mcf_v1_read_ota_buffer(ota_file, lid, record_idx, buffer);
10216 }
10217 else if (pFile->file_version == 3){
10218 pFile = (mcf_tool_file_info_t *)(ota_file->buff);
10219 pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
10220 /* Read changed items from OTA file */
10221 while (item_cnt < pFile->item_num) {
10222 if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
10223 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
10224 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_ARRAY_INDEX_LEN, pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
10225 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);
10226 goto next;
10227 }
10228 strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
10229 array_tag[pItem->array_index_len] = '\0';
10230
10231 /* Find GID corresponding LID */
10232 item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
10233 if (item_lid == 65535){
10234 //-1(65535) means not found
10235 goto next;
10236 }
10237
10238 if ( (item_lid != lid) || (pItem->record_idx != record_idx) ) {
10239 if (is_found_target == KAL_FALSE) {
10240 goto next;
10241 } else {
10242 // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
10243 break;
10244 }
10245 }
10246 is_found_target = KAL_TRUE;
10247
10248 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){
10249 goto next;
10250 }
10251
10252 /* Update LID item */
10253 if (item_is_bit == 0) {
10254 if (pItem->value_len > item_size) {
10255 MD_TRC_MCF_TR_READ_OTA_BUFFER_LARGE_VAL_LEN(pItem->value_len, item_size);
10256 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_LARGE_VAL_LEN, pItem->value_len, item_size);
10257 mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->value_len, item_size);
10258
10259 goto next;
10260 }
10261
10262 MD_TRC_MCF_TR_READ_OTA_BUFFER_BYTE_UPDATE(lid, item_byte_offset, pItem->value_len);
10263 if (kal_query_systemInit() == KAL_TRUE){
10264 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);
10265 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_BYTE_UPDATE, lid, item_byte_offset, pItem->value_len);
10266 mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
10267 }
10268 mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
10269
10270 kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
10271 nv_int_info.update_general_tlvota_result = KAL_TRUE;
10272 } else {
10273 kal_uint32 bit_value = 0;
10274 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
10275 kal_uint32 offset = 0;
10276 kal_uint32 var_size = 1;
10277 kal_uint32 val_tmp = 0;
10278
10279 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
10280
10281
10282 if (pItem->value_len > 4) {
10283 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
10284 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_BIT_LEN, item_size, item_size, pItem->value_len);
10285 mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d) \r\n", item_size, item_size, pItem->value_len);
10286
10287 goto next;
10288 }
10289
10290 MD_TRC_MCF_TR_READ_OTA_BUFFER_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, item_size, bit_value);
10291 if (kal_query_systemInit() == KAL_TRUE){
10292 MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);
10293 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_BIT_UPDATE, lid, item_byte_offset, item_bit_offset, item_size, bit_value);
10294 }
10295
10296 if (item_size > 8 && item_size <= 16) {
10297 var_size = 2;
10298 }else if (item_size > 16 && item_size <= 24) {
10299 var_size = 3;
10300 }else if (item_size > 24 && item_size <= 32) {
10301 var_size = 4;
10302 }
10303
10304 if (item_bit_offset > 0 && item_bit_offset < 8) {
10305 offset = 0;
10306 }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
10307 offset = 1;
10308 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
10309 offset = 2;
10310 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
10311 offset = 3;
10312 }else if (item_bit_offset >= 32){
10313 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
10314 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);
10315
10316 goto next;
10317 }
10318
10319 if (item_bit_offset > 0) {
10320 if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
10321 var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
10322 }
10323 }
10324
10325 if (var_size > 4) {
10326 MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
10327 mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d) \r\n", var_size, item_size, pItem->value_len);
10328 goto next;
10329 }
10330
10331 if (item_bit_offset >= 8 && item_bit_offset < 16) {
10332 item_bit_offset -= 8;
10333 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
10334 item_bit_offset -= 16;
10335 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
10336 item_bit_offset -= 24;
10337 }
10338
10339
10340 kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
10341 val_tmp &= ~(bit_mask << item_bit_offset);
10342 val_tmp |= (bit_value << item_bit_offset);
10343
10344 kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
10345 nv_int_info.update_general_tlvota_result = KAL_TRUE;
10346 }
10347
10348 next:
10349 pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
10350 item_cnt++;
10351 }
10352 MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
10353 }
10354 } else {
10355 MD_TRC_MCF_TR_READ_OTA_BUFFER_TAKE_READ_LOCK_FAIL(lid);
10356 MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_TAKE_READ_LOCK_FAIL, lid);
10357 mcf_utfwk_printf("Fail to take read lock!! LID(%d)!! \r\n", lid);
10358 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
10359 }
10360
10361 // calculate total duration when boot up
10362 if (kal_query_systemInit() == KAL_TRUE){
10363 com_Mcf.ota_api_duration += CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME());
10364 }
10365 MD_TRC_MCF_TR_READ_OTA_BUFFER_DURATION(lid, record_idx, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
10366
10367 return ret;
10368}
10369
10370mcf_ota_result_e mcf_read_tlvota_buffer(
10371 kal_uint8 ps_id,
10372 mcf_tlvota_tag_t tag,
10373 nvram_lid_enum lid,
10374 kal_uint8 *buffer,
10375 kal_uint32 size)
10376{
10377 mcf_t *pMcf = mcf_get_instance();
10378 mcf_tool_file_info_t *pFile;
10379 mcf_tool_gid_tlvota_file_item_t *pItem;
10380 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
10381 mcf_tlvota_file_t *tlvota_file = &(pMcf->general_tlvota_file);
10382 nvram_ltable_entry_struct lid_info = {0};
10383 nvram_errno_enum nvram_api_ret;
10384 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
10385 kal_char array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
10386 kal_uint16 item_byte_offset;
10387 kal_uint16 item_bit_offset;
10388 kal_uint32 item_size;
10389 kal_bool item_is_bit = KAL_FALSE;
10390 kal_uint16 item_lid;
10391 kal_uint16 item_cnt = 0;
10392
10393 if (!buffer || (size < 0) || !tag.tag) {
10394 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_PARA(ps_id, lid, buffer, size, tag.tag);
10395 ret = MCF_OTA_R_INVALID_PARAMETER;
10396
10397 return ret;
10398 }
10399 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_START_USIR(ps_id, sim_id, lid, buffer, size, tag.tag);
10400
10401 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
10402 if (tlvota_file) {
10403 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
10404
10405 /* Check if file type is TLV-OTA file */
10406 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
10407 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
10408 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
10409 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_FILE(str_tmp);
10410 ret = MCF_OTA_R_INVALID_FILE;
10411 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
10412
10413 return ret;
10414 }
10415
10416 nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
10417 if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
10418 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_GET_LID_INFO_FAIL(lid, nvram_api_ret);
10419 ret = MCF_OTA_R_INVALID_PARAMETER;
10420 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
10421
10422 return ret;
10423 }
10424
10425 if (size != lid_info.size) {
10426 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_SIZE(size, lid, lid_info.size);
10427 ret = MCF_OTA_R_INVALID_PARAMETER;
10428 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
10429
10430 return ret;
10431 }
10432
10433 if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
10434 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_ATTR_NOT_SET(lid, lid_info.attr);
10435 ret = MCF_OTA_R_INVALID_ATTR;
10436 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
10437
10438 return ret;
10439 }
10440 /*MCF 1.0 read tlvota buffer update flow */
10441 if (pFile->file_version == 2){
10442 mcf_v1_read_tlvota_buffer(tlvota_file, tag, lid, buffer);
10443 }
10444 else if (pFile->file_version == 3){
10445 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
10446 pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
10447 /* Read changed items from TLV-OTA file */
10448 while (item_cnt < pFile->item_num) {
10449 /* Check if array_index_len is valid */
10450 if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
10451 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
10452 goto next;
10453 }
10454 strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
10455 array_tag[pItem->array_index_len] = '\0';
10456
10457 /* Find GID corresponding LID */
10458 item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
10459 if (item_lid == 65535){
10460 //-1(65535) means not found
10461 goto next;
10462 }
10463
10464 /* Check if LID and tag match */
10465 if ( (item_lid != lid) || (pItem->tag_type != tag.tag_type) || (strncmp(&(pItem->buff_start), tag.tag, pItem->tag_len) != 0) ) {
10466 goto next;
10467 }
10468
10469
10470 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){
10471 goto next;
10472 }
10473
10474 /* Update LID item */
10475 if (item_is_bit == 0) {
10476 if (pItem->value_len > item_size) {
10477 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_LARGE_VAL_LEN(pItem->value_len, item_size);
10478
10479 goto next;
10480 }
10481
10482 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BYTE_UPDATE_USIR(lid, tag.tag, item_byte_offset, pItem->value_len);
10483 mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
10484
10485 kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
10486 } else {
10487 kal_uint32 bit_value = 0;
10488 kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
10489 kal_uint32 offset = 0;
10490 kal_uint32 var_size = 1;
10491 kal_uint32 val_tmp = 0;
10492
10493 kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
10494
10495 if (pItem->value_len > 4) {
10496 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
10497
10498 goto next;
10499 }
10500
10501 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BIT_UPDATE_USIR(lid, tag.tag, item_byte_offset, item_bit_offset, item_size, bit_value);
10502
10503 if (item_size > 8 && item_size <= 16) {
10504 var_size = 2;
10505 }else if (item_size > 16 && item_size <= 24) {
10506 var_size = 3;
10507 }else if (item_size > 24 && item_size <= 32) {
10508 var_size = 4;
10509 }
10510
10511 if (item_bit_offset > 0 && item_bit_offset < 8) {
10512 offset = 0;
10513 }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
10514 offset = 1;
10515 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
10516 offset = 2;
10517 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
10518 offset = 3;
10519 }else if (item_bit_offset >= 32){
10520 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
10521
10522 goto next;
10523 }
10524
10525 if (item_bit_offset > 0) {
10526 if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
10527 var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
10528 }
10529 }
10530 if(var_size > 4){
10531 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
10532
10533 goto next;
10534 }
10535
10536 if (item_bit_offset >= 8 && item_bit_offset < 16) {
10537 item_bit_offset -= 8;
10538 }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
10539 item_bit_offset -= 16;
10540 }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
10541 item_bit_offset -= 24;
10542 }
10543
10544
10545 kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
10546 val_tmp &= ~(bit_mask << item_bit_offset);
10547 val_tmp |= (bit_value << item_bit_offset);
10548
10549 kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
10550 }
10551
10552 next:
10553 pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
10554 item_cnt++;
10555 }
10556 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
10557 }
10558 } else {
10559 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_TAKE_READ_LOCK_FAIL();
10560 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
10561 }
10562
10563 return ret;
10564}
10565
10566mcf_ota_result_e mcf_read_tlvota_buffer_sbp_tag(
10567 kal_uint8 ps_id,
10568 mcf_tlvota_sbp_tag_t sbp_tag,
10569 nvram_lid_enum lid,
10570 kal_uint8 *buffer,
10571 kal_uint32 size)
10572{
10573 mcf_ota_result_e tlvota_ret = MCF_OTA_R_MAX;
10574 mcf_ota_result_e ret = MCF_OTA_R_MAX;
10575 mcf_tlvota_tag_t tag_entry[6];
10576 kal_uint32 tag_num = 0;
10577 kal_char tag[6][MCF_MAX_TAG_LEN];
10578 mcf_t *pMcf = mcf_get_instance();
10579 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
10580 mcf_tlvota_file_t *tlvota_file = &(pMcf->tlvota_file[sim_id]);
10581 mcf_tlvota_tag_t iccid_tag;
10582 kal_char iccid[21];
10583 kal_int32 ret_snprintf;
10584 kal_uint32 start_time = GET_CURRENT_TIME();
10585
10586 kal_mem_set(tag, 0, sizeof(kal_char) * 6 * MCF_MAX_TAG_LEN);
10587
10588 if (!(buffer && (size > 0))) {
10589 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_PARA(ps_id, lid, buffer, size);
10590 ret = MCF_OTA_R_INVALID_PARAMETER;
10591 mcf_utfwk_printf("Invalid parameters!! ps_id(%d), LID(%d), buffer(%x), size(%d) \r\n", ps_id, lid, buffer, size);
10592
10593 return ret;
10594 }
10595 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_START(ps_id, lid, buffer, size, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10596
10597 /* Fill tag entry */
10598 if (sbp_tag.sbp_id != SBP_ID_INVALID) {
10599 if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
10600 if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // sbpid_mcc_mnc case
10601 /* NA_NA_NA, NA_mcc_NA and NA_mcc_mnc case should be updated first */
10602 /* NA_NA_NA */
10603 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10604 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10605 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10606 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10607 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10608 }
10609 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10610 tag_entry[tag_num].tag = tag[tag_num];
10611 tag_num++;
10612
10613 /* NA_mcc_NA */
10614 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10615 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
10616 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10617 strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
10618 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10619 }
10620 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10621 tag_entry[tag_num].tag = tag[tag_num];
10622 tag_num++;
10623
10624 /* NA_mcc_mnc */
10625 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10626 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
10627 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10628 strncpy(tag[tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
10629 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10630 }
10631 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10632 tag_entry[tag_num].tag = tag[tag_num];
10633 tag_num++;
10634
10635 tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
10636
10637 /* Reuse tag_entry */
10638 tag_num = 0;
10639
10640 /* NA_NA_NA */
10641 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10642 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10643 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10644 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10645 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10646 }
10647 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10648 tag_entry[tag_num].tag = tag[tag_num];
10649 tag_num++;
10650
10651 /* sbpid_NA_NA */
10652 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10653 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
10654 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10655 strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
10656 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10657 }
10658 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10659 tag_entry[tag_num].tag = tag[tag_num];
10660 tag_num++;
10661
10662 /* sbpid_mcc_NA */
10663 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10664 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
10665 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10666 strncpy(tag[tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
10667 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10668 }
10669 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10670 tag_entry[tag_num].tag = tag[tag_num];
10671 tag_num++;
10672
10673 /* sbpid_mcc_mnc */
10674 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10675 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_%s", sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10676 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10677 strncpy(tag[tag_num], "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
10678 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10679 }
10680 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10681 tag_entry[tag_num].tag = tag[tag_num];
10682 tag_num++;
10683 } else { // sbpid_mcc_NA case
10684 /* NA_NA_NA and NA_mcc_NA case should be updated first */
10685 /* NA_NA_NA */
10686 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10687 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10688 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10689 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10690 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10691 }
10692 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10693 tag_entry[tag_num].tag = tag[tag_num];
10694 tag_num++;
10695
10696 /* NA_mcc_NA */
10697 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10698 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
10699 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10700 strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
10701 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10702 }
10703 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10704 tag_entry[tag_num].tag = tag[tag_num];
10705 tag_num++;
10706
10707 tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
10708
10709 /* Reuse tag_entry */
10710 tag_num = 0;
10711
10712 /* NA_NA_NA */
10713 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10714 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10715 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10716 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10717 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10718 }
10719 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10720 tag_entry[tag_num].tag = tag[tag_num];
10721 tag_num++;
10722
10723 /* sbpid_NA_NA */
10724 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10725 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
10726 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10727 strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
10728 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10729 }
10730 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10731 tag_entry[tag_num].tag = tag[tag_num];
10732 tag_num++;
10733
10734 /* sbpid_mcc_NA */
10735 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10736 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
10737 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10738 strncpy(tag[tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
10739 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10740 }
10741 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10742 tag_entry[tag_num].tag = tag[tag_num];
10743 tag_num++;
10744 }
10745 } else {
10746 if (strcmp((kal_char *)sbp_tag.mnc, "") == 0) { // sbpid_NA_NA case
10747 /* NA_NA_NA */
10748 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10749 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10750 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10751 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10752 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10753 }
10754 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10755 tag_entry[tag_num].tag = tag[tag_num];
10756 tag_num++;
10757
10758 tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
10759
10760 /* Reuse tag_entry */
10761 tag_num = 0;
10762
10763 /* NA_NA_NA */
10764 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10765 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10766 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10767 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10768 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10769 }
10770 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10771 tag_entry[tag_num].tag = tag[tag_num];
10772 tag_num++;
10773
10774 /* sbpid_NA_NA */
10775 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10776 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
10777 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10778 strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
10779 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10780 }
10781 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10782 tag_entry[tag_num].tag = tag[tag_num];
10783 tag_num++;
10784 } else { // sbpid_NA_mnc case is not allowed!!
10785 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10786 ret = MCF_OTA_R_INVALID_SBP_TAG;
10787
10788 return ret;
10789 }
10790 }
10791 } else {
10792 if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
10793 if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // NA_mcc_mnc case
10794 /* NA_NA_NA, NA_mcc_NA and NA_mcc_mnc case should be updated first */
10795 /* NA_NA_NA */
10796 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10797 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10798 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10799 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10800 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10801 }
10802 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10803 tag_entry[tag_num].tag = tag[tag_num];
10804 tag_num++;
10805
10806 /* NA_mcc_NA */
10807 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10808 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
10809 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10810 strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
10811 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10812 }
10813 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10814 tag_entry[tag_num].tag = tag[tag_num];
10815 tag_num++;
10816
10817 /* NA_mcc_mnc */
10818 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10819 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
10820 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10821 strncpy(tag[tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
10822 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10823 }
10824 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10825 tag_entry[tag_num].tag = tag[tag_num];
10826 tag_num++;
10827
10828 tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
10829
10830 /* Reuse tag_entry */
10831 tag_num = 0;
10832
10833 /* NA_NA_NA */
10834 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10835 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10836 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10837 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10838 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10839 }
10840 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10841 tag_entry[tag_num].tag = tag[tag_num];
10842 tag_num++;
10843 } else { // NA_mcc_NA case
10844 /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
10845 /* NA_mcc_NA */
10846 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10847 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
10848 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10849 strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
10850 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10851 }
10852 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10853 tag_entry[tag_num].tag = tag[tag_num];
10854 tag_num++;
10855
10856
10857 /* NA_mcc_NA */
10858 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10859 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
10860 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10861 strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
10862 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10863 }
10864 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10865 tag_entry[tag_num].tag = tag[tag_num];
10866 tag_num++;
10867
10868 tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
10869
10870 /* Reuse tag_entry */
10871 tag_num = 0;
10872
10873 /* NA_NA_NA */
10874 tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
10875 ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
10876 if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
10877 strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
10878 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10879 }
10880 tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
10881 tag_entry[tag_num].tag = tag[tag_num];
10882 tag_num++;
10883 }
10884 } else { // NA_NA_mnc cases is not allowed!!
10885 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
10886 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);
10887 ret = MCF_OTA_R_INVALID_SBP_TAG;
10888
10889 return ret;
10890 }
10891 }
10892
10893 ret = mcf_read_tlvota_buffer_sbp_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
10894
10895 /*If general TLV-OTA is iccid tag, need to call read_tlv_ota_buffer to update OTA file with iccid tag*/
10896
10897 if (com_Mcf.is_iccid == KAL_TRUE){
10898 kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
10899 iccid_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
10900
10901 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
10902 if (tlvota_file){
10903 kal_mem_cpy(&iccid, tlvota_file->iccid, 21);
10904 iccid_tag.tag = iccid;
10905 iccid_tag.tag_len = strlen((kal_char *)tlvota_file->iccid);
10906
10907 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
10908 }else {
10909 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_TAKE_READ_LOCK_FAIL();
10910 ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
10911 return ret;
10912 }
10913 ret = mcf_read_tlvota_buffer(ps_id, iccid_tag, lid, buffer, size);
10914 }
10915
10916 if ( (tlvota_ret == MCF_OTA_R_SUCCESS) || (ret == MCF_OTA_R_SUCCESS) ) {
10917 ret = MCF_OTA_R_SUCCESS;
10918 }
10919
10920 MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_DURATION(lid, ps_id, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
10921
10922 return ret;
10923}
10924
10925mcf_ota_result_e mcf_read_nvram_and_tlvota_buffer_sbp_tag(
10926 kal_uint8 ps_id,
10927 mcf_tlvota_sbp_tag_t sbp_tag,
10928 nvram_lid_enum lid,
10929 kal_uint16 record_idx,
10930 kal_uint8 *buffer,
10931 kal_uint32 size)
10932{
10933 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
10934
10935 if (!(buffer && (size > 0))) {
10936 MD_TRC_MCF_TR_READ_NVRAM_TLVOTA_BUFFER_SBP_INVALID_PARA(ps_id, lid, buffer, size);
10937 ret = MCF_OTA_R_INVALID_PARAMETER;
10938
10939 return ret;
10940 }
10941 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);
10942
10943 if ( !nvram_external_read_data(lid, record_idx, buffer, size)) {
10944 ret = MCF_OTA_R_READ_NVRAM_FAIL;
10945
10946 return ret;
10947 }
10948
10949 ret = mcf_read_tlvota_buffer_sbp_tag(ps_id, sbp_tag, lid, buffer, size);
10950
10951 return ret;
10952}
10953
10954kal_bool mcf_custom_dump_mcf_data(mcf_custom_dump_param_struct *param_ptr)
10955{
10956 kal_bool ret = KAL_TRUE;
10957 sim_interface_enum sim_slot_id = 0;
10958
10959 switch (param_ptr->lid)
10960 {
10961 case NVRAM_EF_MCF_TEST_OTA_LID:
10962 {
10963 mcf_tlvota_sbp_tag_t sbp_tag = {0};
10964 mcf_ota_result_e mcf_ret;
10965
10966 if (param_ptr->type == MCF_TYPE_OTA_BY_OP) {
10967 *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
10968 sbp_tag.sbp_id = param_ptr->sbp_id;
10969 kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
10970 kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
10971
10972 /* Record_id = sim_id + 1 */
10973 sim_slot_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
10974
10975 if (!nvram_external_read_data(param_ptr->lid, sim_slot_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
10976 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));
10977 ret = KAL_FALSE;
10978 return ret;
10979 }
10980
10981 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));
10982 if (mcf_ret != MCF_OTA_R_SUCCESS) {
10983 MD_TRC_MCF_TR_DUMP_MCF_LID_FAIL(param_ptr->lid, mcf_ret);
10984 }
10985 } else {
10986 MD_TRC_MCF_TR_DUMP_MCF_LID_INVALID_TYPE(param_ptr->lid, param_ptr->type);
10987 ret = KAL_FALSE;
10988 }
10989 break;
10990 }
10991
10992 case NVRAM_EF_MCF_TEST_OTA_QUERY_LID:
10993 {
10994 mcf_tlvota_sbp_tag_t sbp_tag = {0};
10995 mcf_ota_result_e mcf_ret;
10996
10997 switch (param_ptr->type)
10998 {
10999 case MCF_TYPE_OTA:
11000 *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
11001 if (!nvram_external_read_data(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
11002 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));
11003 ret = KAL_FALSE;
11004 return ret;
11005 }
11006
11007 mcf_ret = mcf_read_ota_buffer(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
11008 if (mcf_ret != MCF_OTA_R_SUCCESS) {
11009 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));
11010 }
11011
11012 break;
11013
11014 case MCF_TYPE_OTA_BY_OP:
11015 *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
11016 sbp_tag.sbp_id = param_ptr->sbp_id;
11017 kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
11018 kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
11019
11020 if (!nvram_external_read_data(param_ptr->lid, param_ptr->ps_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
11021 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));
11022 ret = KAL_FALSE;
11023 return ret;
11024 }
11025 /* Record_id = sim_id + 1 */
11026 sim_slot_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
11027 mcf_ret = mcf_read_ota_buffer(param_ptr->lid, sim_slot_id+1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
11028 if (mcf_ret != MCF_OTA_R_SUCCESS) {
11029 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));
11030 }
11031
11032 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));
11033 if (mcf_ret != MCF_OTA_R_SUCCESS) {
11034 MD_TRC_MCF_TR_DUMP_MCF_LID_FAIL(param_ptr->lid, mcf_ret);
11035 }
11036
11037 break;
11038
11039 default:
11040 MD_TRC_MCF_TR_DUMP_MCF_LID_INVALID_TYPE(param_ptr->lid, param_ptr->type);
11041 ret = KAL_FALSE;
11042 break;
11043 }
11044 break;
11045 }
11046
11047 default:
11048 MD_TRC_MCF_TR_DUMP_MCF_LID_UNKNOWN_LID(param_ptr->lid);
11049 ret = KAL_FALSE;
11050 break;
11051 }
11052
11053 return ret;
11054}
11055
11056kal_bool mcf_auto_select_tlvota_file(sbp_reconfig_custom_param_struct *param_ptr)
11057{
11058 mcf_t *pMcf = &mcf_inst_g;
11059 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
11060 mcf_tlvota_file_t *tlvota_file;
11061 kal_char file_name[MCF_FILE_MAX_NAME_LEN];
11062 kal_char apply_filename[MCF_FILE_MAX_NAME_LEN];
11063 kal_wchar fs_filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
11064 kal_char file_path[MCF_FILE_MAX_MD_PATH_LEN];
11065 l4c_mcf_path_type_enum apply_path_type = L4C_MCF_PATH_TYPE_OTA;
11066 em_mcf_read_ota_file_info_struct read_file_info = {0};
11067 FS_FileDetail fs_file_detail[L4C_MCF_PATH_TYPE_MAX] = {0};
11068 mcf_ota_result_e mcf_ret;
11069 mcf_ota_result_e gen_mcf_ret;
11070 kal_bool ret = KAL_TRUE;
11071 kal_bool gen_ret = KAL_TRUE;
11072 kal_int32 fs_api_ret[L4C_MCF_PATH_TYPE_MAX];
11073 kal_uint32 i;
11074 kal_uint32 ret_sprintf;
11075 mcf_tool_file_info_t *pFile;
11076 mcf_tlvota_sbp_tag_t sbp_tag;
11077 kal_bool is_read_nvram = KAL_FALSE;
11078 kal_char tool_version[MCF_FILE_MAX_TOOL_VERSION_LEN]={0};
11079 mcf_ota_result_e tlvota_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
11080 kal_uint64 last_mod_time = 0;
11081 kal_uint32 start_time = GET_CURRENT_TIME();
11082
11083 MD_TRC_MCF_TR_AUTO_SELECT_BIN_START(param_ptr->ps_id, sim_id, param_ptr->sbp_id, param_ptr->mcc, param_ptr->mnc);
11084
11085 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
11086 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_INVALID_SIM_ID(param_ptr->ps_id, sim_id);
11087 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
11088 ret = KAL_FALSE;
11089
11090 return ret;
11091 }
11092
11093 tlvota_file = &(pMcf->tlvota_file[sim_id]);
11094
11095 sbp_tag.sbp_id = param_ptr->sbp_id;
11096 kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
11097 kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
11098
11099 kal_mem_set(&mcf_tlvota_last_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
11100 kal_mem_set(&mcf_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
11101 kal_mem_set(&mcf_general_tlvota_last_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
11102 kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
11103
11104
11105 if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
11106 /* Read MCF General TLV-OTA info into cache buffer */
11107 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
11108 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
11109 ret = KAL_FALSE;
11110 }
11111 is_read_nvram = KAL_TRUE;
11112
11113 if(is_read_tlvota[sim_id] == KAL_TRUE){
11114 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));
11115#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11116 if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE) != MCF_OTA_R_SUCCESS){
11117 ret = KAL_FALSE;
11118 }
11119#else
11120 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){
11121 ret = KAL_FALSE;
11122 }
11123#endif
11124 is_update_tlvota[sim_id] = KAL_TRUE;
11125 }
11126 }
11127
11128 if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
11129 /* Read MCF General TLV-OTA info into cache buffer */
11130 if(is_read_nvram == KAL_FALSE){
11131 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
11132 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
11133 ret = KAL_FALSE;
11134 }
11135 is_read_nvram = KAL_TRUE;
11136 }
11137
11138 if(is_read_general_tlvota[sim_id] == KAL_TRUE){
11139 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));
11140#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11141 if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE) != MCF_OTA_R_SUCCESS){
11142 ret = KAL_FALSE;
11143 }
11144#else
11145 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){
11146 ret = KAL_FALSE;
11147 }
11148#endif
11149 is_update_tlvota[sim_id] = KAL_TRUE;
11150 }
11151 }
11152
11153
11154 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11155 if (tlvota_file){
11156 tlvota_file->sbp_id = param_ptr->sbp_id;
11157 tlvota_file->ps_id = param_ptr->ps_id;
11158 kal_mem_cpy(tlvota_file->mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
11159 kal_mem_cpy(tlvota_file->mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
11160 kal_mem_cpy(tlvota_file->iccid, param_ptr->iccid, 21);
11161
11162 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11163
11164 // Check if need to auto select TLV-OTA file
11165 if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
11166 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_NO_NEED(pMcf->is_ignore_dsbp[sim_id]);
11167 com_Mcf.tlvota_result[sim_id] = set_op_read_ret[sim_id];
11168 goto read_gengeral_opota;
11169 }
11170 }else {
11171 MD_TRC_MCF_TR_AUTO_SELECT_BIN_TLVOTA_FILE_TAKE_WRITE_LOCK_FAIL();
11172 ret = KAL_FALSE;
11173
11174 // Check if need to auto select TLV-OTA file
11175 if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
11176 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_NO_NEED(pMcf->is_ignore_dsbp[sim_id]);
11177 com_Mcf.tlvota_result[sim_id] = set_op_read_ret[sim_id];
11178 goto read_gengeral_opota;
11179 }
11180
11181 goto read_gengeral_opota;
11182 }
11183
11184 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');
11185 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
11186 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_TLVOTA_FILE_FILENAME_ERROR(tlvota_file->sbp_id, ret_sprintf);
11187 ret = KAL_FALSE;
11188 return ret;
11189 }
11190
11191 /* Compare modified time of OP-OTA file to select which file to be applied */
11192 kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, file_name);
11193 fs_api_ret[L4C_MCF_PATH_TYPE_OTA] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_OTA]);
11194 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],
11195 (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));
11196 if (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] != FS_NO_ERROR) {
11197 kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_OTA], 0, sizeof(FS_FileDetail));
11198 }
11199
11200 kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, file_name);
11201 fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME]);
11202 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],
11203 (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));
11204 if (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] != FS_NO_ERROR) {
11205 kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME], 0, sizeof(FS_FileDetail));
11206 }
11207
11208 if ( (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] == FS_NO_ERROR) || (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] == FS_NO_ERROR) ) {
11209 if (fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime > fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
11210 ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_DEFAULT_FOLDER_PATH, '\0');
11211 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
11212 strncpy(file_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
11213 file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
11214 }
11215 last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime;
11216 } else {
11217 ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_CUSTOM_FOLDER_PATH, '\0');
11218 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
11219 strncpy(file_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
11220 file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
11221 }
11222 last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime;
11223 }
11224 } else {
11225 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_COMPARE_FAIL();
11226 ret = KAL_FALSE;
11227 tlvota_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
11228
11229 goto read_gengeral_opota;
11230 }
11231
11232 read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_SIM;
11233 read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
11234 read_file_info.ps_id = tlvota_file->ps_id;
11235 read_file_info.start_time = kal_get_systicks();
11236
11237 // last updated file information
11238 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);
11239
11240 mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, file_path, file_name, &apply_path_type, apply_filename, pMcf);
11241 tlvota_ret = mcf_ret;
11242
11243
11244 if (mcf_ret == MCF_OTA_R_SUCCESS) {
11245 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
11246
11247 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11248 if (tlvota_file){
11249 // current updated file information
11250 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);
11251 /* Check TLV-OTA is need update */
11252 if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
11253 // Need to update TLV-OTA file
11254 com_Mcf.update_tlvota[sim_id] = KAL_TRUE;
11255
11256 /* Do not reset LIDs if the same file as last one */
11257 is_read_tlvota[sim_id] = KAL_TRUE;
11258
11259 /* Store last updated file informantion */
11260 /* Store TLV-OTA file information */
11261 tlvota_file->last_file.path_type = apply_path_type;
11262 strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
11263 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
11264 strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
11265 tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
11266 tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
11267 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_SW_VERSION(tlvota_file->last_file.sw_version);
11268 } else {
11269 MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_SW_VERSION(pFile->sw_version_len);
11270 }
11271 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
11272 strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
11273 tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
11274 tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
11275 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_GEN_TIME(tlvota_file->last_file.gen_time);
11276 } else {
11277 MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_GEN_TIME(pFile->gen_time_len);
11278 }
11279 if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
11280 strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
11281 tool_version[pFile->tool_version_len] = '\0';
11282 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_TOOL_VERSION(tool_version);
11283 } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
11284 MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_TOOL_VERSION(pFile->tool_version_len);
11285 }
11286
11287 tlvota_file->last_file.checksum = pFile->checksum;
11288 tlvota_file->last_file.last_mod_time = last_mod_time;
11289 tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
11290 tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
11291 }else{
11292 if (com_Mcf.update_tlvota[sim_id] != KAL_TRUE){
11293 tlvota_ret = mcf_ret;
11294
11295 //TLV-OTA file does not change. No need to trigger dsbp.
11296 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_TLVOTA_FILE_NOT_CHANGE(apply_path_type, com_Mcf.update_tlvota[sim_id]);
11297 }
11298 }
11299 /* Check if file type is TLV-OTA file */
11300 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
11301 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
11302 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
11303 MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_FILE(str_tmp);
11304 tlvota_ret = MCF_OTA_R_INVALID_FILE;
11305 }
11306 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11307 }
11308 read_file_info.path_type = apply_path_type;
11309 strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
11310 } else {
11311 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
11312 /* Store last updated file informantion */
11313 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11314 if (tlvota_file){
11315 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);
11316 /* Check TLV-OTA is need update */
11317 if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
11318 com_Mcf.update_tlvota[sim_id] = KAL_TRUE;
11319 }
11320 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11321 }
11322 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_FAIL(mcf_ret);
11323 ret = KAL_FALSE;
11324 }
11325
11326 read_file_info.result = mcf_ret;
11327 read_file_info.end_time = kal_get_systicks();
11328
11329 mcf_em_send_ota_file_info(&read_file_info);
11330
11331 com_Mcf.tlvota_result[sim_id] = tlvota_ret;
11332
11333read_gengeral_opota:
11334 // TODO: general OP-OTA file CHR implementation
11335
11336 // Check if need to auto select TLV-OTA file
11337 if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
11338 MD_TRC_MCF_TR_AUTO_SELECT_BIN_GENERAL_TLVOTA_FILE_NO_NEED(pMcf->general_is_ignore_dsbp);
11339 return ret;
11340 }
11341 tlvota_file = &(pMcf->general_tlvota_file);
11342 ret_sprintf = kal_snprintf(file_name, MCF_FILE_MAX_NAME_LEN - 1, "%s%c", MCF_FS_GENERAL_TLVOTA_FILE_NAME, '\0');
11343 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
11344 strncpy(file_name, MCF_FS_GENERAL_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN-1);
11345 file_name[MCF_FILE_MAX_NAME_LEN-1] = '\0';
11346 }
11347
11348 /* Compare modified time of general OP-OTA file to select which file to be applied */
11349 kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, file_name);
11350 fs_api_ret[L4C_MCF_PATH_TYPE_OTA] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_OTA]);
11351 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],
11352 (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));
11353 if (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] != FS_NO_ERROR) {
11354 kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_OTA], 0, sizeof(FS_FileDetail));
11355 }
11356
11357 kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, file_name);
11358 fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME]);
11359 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],
11360 (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));
11361 if (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] != FS_NO_ERROR) {
11362 kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME], 0, sizeof(FS_FileDetail));
11363 }
11364
11365 if ( (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] == FS_NO_ERROR) || (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] == FS_NO_ERROR) ) {
11366 if (fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime > fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
11367 if (tlvota_file->last_mod_time == fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime) {
11368 // General TLV-OTA file does not change. No need to read again.
11369 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(L4C_MCF_PATH_TYPE_OTA);
11370 goto out;
11371 } else {
11372 ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_DEFAULT_FOLDER_PATH, '\0');
11373 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
11374 strncpy(file_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
11375 file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
11376 }
11377 last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime;
11378 }
11379 } else {
11380 if (tlvota_file->last_mod_time == fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
11381 // General TLV-OTA file does not change. No need to read again.
11382 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(L4C_MCF_PATH_TYPE_RUNTIME);
11383 goto out;
11384 } else {
11385 ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_CUSTOM_FOLDER_PATH, '\0');
11386 if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
11387 strncpy(file_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
11388 file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
11389 }
11390 last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime;
11391 }
11392 }
11393 } else {
11394 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_COMPARE_FAIL();
11395 gen_ret = KAL_FALSE;
11396
11397 goto out;
11398 }
11399
11400 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);
11401 gen_mcf_ret = mcf_read_general_tlvota_file(KAL_FALSE, file_path, file_name, &apply_path_type, apply_filename, pMcf);
11402
11403 if (gen_mcf_ret != MCF_OTA_R_SUCCESS) {
11404 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_FAIL(gen_mcf_ret);
11405 gen_ret = KAL_FALSE;
11406 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
11407 /* Store last updated file informantion */
11408 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11409 if (tlvota_file){
11410 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);
11411 if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
11412 //If General TLV-OTA update, every SIM need to update
11413 for (i = 0; i < MAX_SIM_NUM; i++){
11414 is_read_general_tlvota[i] = KAL_TRUE;
11415 com_Mcf.update_general_tlvota[i] = KAL_TRUE;
11416 }
11417 }
11418 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11419 }
11420 }else{
11421 pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
11422 /* Store last updated file informantion */
11423 MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11424 if (tlvota_file){
11425 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);
11426
11427 /* Check TLV-OTA is need update */
11428 if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
11429 //If General TLV-OTA update, every SIM need to update
11430 for (i = 0; i < MAX_SIM_NUM; i++){
11431 is_read_general_tlvota[i] = KAL_TRUE;
11432 com_Mcf.update_general_tlvota[i] = KAL_TRUE;
11433 }
11434 //Store file information
11435 tlvota_file->last_file.path_type = apply_path_type;
11436 strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
11437 if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
11438 strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
11439 tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
11440 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_SW_VERSION(tlvota_file->last_file.sw_version);
11441 } else {
11442 MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_SW_VERSION(pFile->sw_version_len);
11443 }
11444 if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
11445 strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
11446 tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
11447 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_GEN_TIME(tlvota_file->last_file.gen_time);
11448 } else {
11449 MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_GEN_TIME(pFile->gen_time_len);
11450 }
11451 if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
11452 strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
11453 tool_version[pFile->tool_version_len] = '\0';
11454 MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_TOOL_VERSION(tool_version);
11455 } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
11456 MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_TOOL_VERSION(pFile->tool_version_len);
11457 }
11458 tlvota_file->last_file.checksum = pFile->checksum;
11459 tlvota_file->last_file.last_mod_time = last_mod_time;
11460 tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
11461 tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
11462 }else{
11463 //General TLV-OTA file does not change. No need to read again.
11464 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(apply_path_type);
11465 }
11466 /* Check if file type is TLV-OTA file */
11467 if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
11468 kal_char str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
11469 mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
11470 MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_FILE(str_tmp);
11471 gen_mcf_ret = MCF_OTA_R_INVALID_FILE;
11472 }
11473 MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11474 }
11475
11476 }
11477
11478out:
11479 if ( (ret == KAL_TRUE) || (gen_ret == KAL_TRUE) ) {
11480 ret = KAL_TRUE;
11481 } else {
11482 ret = KAL_FALSE;
11483 }
11484
11485
11486 /* If have updated, store modified LIDs */
11487 if (com_Mcf.update_tlvota[sim_id] == KAL_TRUE){
11488 nv_int_info.update_tlvota_result[sim_id] = KAL_FALSE;
11489 if(is_read_nvram == KAL_FALSE){
11490 /* Read MCF TLV-OTA file info into cache buffer */
11491 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
11492 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
11493 ret = KAL_FALSE;
11494 }
11495 is_read_nvram = KAL_TRUE;
11496 }
11497
11498 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));
11499#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11500 if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE) != MCF_OTA_R_SUCCESS){
11501 ret = KAL_FALSE;
11502 }
11503#else
11504 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){
11505 ret = KAL_FALSE;
11506 }
11507#endif
11508 is_update_tlvota[sim_id] = KAL_TRUE;
11509 }
11510 if (is_read_general_tlvota[sim_id] == KAL_TRUE){
11511 nv_int_info.update_general_tlvota_result = KAL_FALSE;
11512 if(is_read_nvram == KAL_FALSE){
11513 /* Read MCF TLV-OTA file info into cache buffer */
11514 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
11515 MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
11516 ret = KAL_FALSE;
11517 }
11518 is_read_nvram = KAL_TRUE;
11519 }
11520 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));
11521#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11522 if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE) != MCF_OTA_R_SUCCESS){
11523 ret = KAL_FALSE;
11524 }
11525#else
11526 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){
11527 ret = KAL_FALSE;
11528 }
11529#endif
11530
11531 is_update_tlvota[sim_id] = KAL_TRUE;
11532 }
11533 MD_TRC_MCF_TR_AUTO_SELECT_BIN_DURATION(CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
11534
11535 return ret;
11536}
11537
11538kal_bool mcf_set_config_after_dsbp(protocol_id_enum ps_id)
11539{
11540 kal_bool ret = KAL_TRUE;
11541 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
11542 nvram_ef_mcf_sw_info_struct nv_sw_info;
11543 mcf_t *pMcf = mcf_get_instance();
11544 mcf_tlvota_file_t *tlvota_file;
11545 kal_uint32 start_time = GET_CURRENT_TIME();
11546
11547 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
11548 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_INVALID_SIM_ID(ps_id, sim_id);
11549
11550 return KAL_FALSE;
11551 }
11552
11553 tlvota_file = &(pMcf->tlvota_file[sim_id]);
11554
11555 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_START(ps_id, is_update_tlvota[sim_id]);
11556
11557
11558
11559 // When SIM have updated, need to reset to FALSE
11560 if(com_Mcf.update_tlvota[sim_id] == KAL_TRUE){
11561 com_Mcf.update_tlvota[sim_id] = KAL_FALSE;
11562 }
11563
11564 if (com_Mcf.update_general_tlvota[sim_id] == KAL_TRUE){
11565 com_Mcf.update_general_tlvota[sim_id] = KAL_FALSE;
11566 }
11567
11568 if (is_update_tlvota[sim_id] == KAL_TRUE){
11569 kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
11570 /* Read MCF internal info into cache buffer */
11571 if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
11572 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
11573 ret = KAL_FALSE;
11574 return ret;
11575 }
11576 /* Read MCF sw info into cache buffer */
11577 if ( !nvram_external_read_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
11578 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_READ_LID_FAIL(NVRAM_EF_MCF_SW_INFO_LID);
11579 ret = KAL_FALSE;
11580 return ret;
11581 }
11582
11583 if(is_read_tlvota[sim_id] == KAL_TRUE){
11584 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));
11585 is_read_tlvota[sim_id] = KAL_FALSE;
11586 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11587 if (tlvota_file) {
11588 /* Write updated MCF TLV-OTA file information to NVRAM */
11589 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);
11590 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);
11591 strncpy(nv_sw_info.last_update_tlvota_file[sim_id].name, tlvota_file->last_file.name, MCF_FILE_MAX_NAME_LEN - 1);
11592 if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA){
11593 strncpy(nv_sw_info.last_update_tlvota_file[sim_id].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
11594 }else if(tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME){
11595 strncpy(nv_sw_info.last_update_tlvota_file[sim_id].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
11596 }
11597 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11598 }else{
11599 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_TAKE_READ_LOCK_FAIL();
11600 }
11601 }
11602
11603 if (is_read_general_tlvota[sim_id] == KAL_TRUE){
11604 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));
11605 is_read_general_tlvota[sim_id] = KAL_FALSE;
11606 tlvota_file = &(pMcf->general_tlvota_file);
11607 MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11608 if (tlvota_file) {
11609 /* Write updated MCF TLV-OTA file information to NVRAM */
11610 strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, MCF_FILE_MAX_SW_VERSION_LEN - 1);
11611 strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, MCF_FILE_MAX_GEN_TIME_LEN - 1);
11612 strncpy(nv_sw_info.last_update_general_tlvota_file.name, tlvota_file->last_file.name, MCF_FILE_MAX_NAME_LEN - 1);
11613 if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA){
11614 strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
11615 }else if(tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME){
11616 strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
11617 }
11618 MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
11619 }else{
11620 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_TAKE_READ_LOCK_FAIL();
11621 }
11622 }
11623
11624 /* Write MCF internal info into NVRAM */
11625 if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
11626 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_WRITE_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
11627 ret = KAL_FALSE;
11628 return ret;
11629 }
11630 /* Write MCF sw info into NVRAM */
11631 if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
11632 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_WRITE_LID_FAIL(NVRAM_EF_MCF_SW_INFO_LID);
11633 ret = KAL_FALSE;
11634 return ret;
11635 }
11636
11637 is_update_tlvota[sim_id] = KAL_FALSE;
11638
11639 }
11640
11641 MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_DURATION(CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
11642
11643 return ret;
11644}
11645
11646kal_bool mcf_check_lid_need_reset(nvram_lid_enum lid)
11647{
11648 kal_int16 pos1 = -1;
11649 kal_int16 pos2 = -1;
11650 kal_uint16 new_pos = 0;
11651#ifdef __MCF_COMBINE_FILE_SUPPORT__
11652 kal_bool reset = KAL_FALSE;
11653#endif
11654 MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_START(lid);
11655
11656 /* Search last modified LID list */
11657 if (mcf_last_mod_lid_g.lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
11658 /* If last modified LID list is full, all LIDs are needed to be reset */
11659 return KAL_TRUE;
11660 }
11661#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11662 pos1 = mcf_binary_search_lid(lid, mcf_last_mod_lid_g.lid, mcf_last_mod_lid_g.lid_cnt, &new_pos);
11663#else
11664 pos1 = mcf_binary_search_lid_struct(lid, mcf_last_mod_lid_g.lid_conf, mcf_last_mod_lid_g.lid_cnt, &new_pos);
11665 if(pos1 != -1 && pos1 >= 0){
11666 if(nv_int_info.not_reset_ota == KAL_FALSE || mcf_last_mod_lid_g.lid_conf[pos1].not_reset == KAL_FALSE){
11667 reset = KAL_TRUE;
11668 }
11669 }
11670#endif
11671
11672 /* Search current modified LID list */
11673 if (mcf_curr_mod_lid_g.lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
11674 /* If current modified LID list is full, all LIDs are needed to be reset */
11675 return KAL_TRUE;
11676 }
11677#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11678 pos2 = mcf_binary_search_lid(lid, mcf_curr_mod_lid_g.lid, mcf_curr_mod_lid_g.lid_cnt, &new_pos);
11679#else
11680 pos2 = mcf_binary_search_lid_struct(lid, mcf_curr_mod_lid_g.lid_conf, mcf_curr_mod_lid_g.lid_cnt, &new_pos);
11681 if(pos2 != -1 && pos2 >= 0){
11682 if(nv_int_info.not_reset_ota == KAL_FALSE || mcf_curr_mod_lid_g.lid_conf[pos2].not_reset == KAL_FALSE){
11683 reset = KAL_TRUE;
11684 }
11685 }
11686#endif
11687
11688 if ( (pos1 != -1) || (pos2 != -1) ) {
11689#ifdef __MCF_COMBINE_FILE_SUPPORT__
11690 if (reset == KAL_TRUE)
11691#endif
11692 {
11693 MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_FOUND(pos1, pos2);
11694 return KAL_TRUE;
11695 }
11696 }
11697
11698 MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_NOT_FOUND(lid, pos1, pos2);
11699
11700 return KAL_FALSE;
11701}
11702
11703kal_bool mcf_check_lid_need_reset_by_psid(nvram_lid_enum lid, kal_uint8 ps_id)
11704{
11705 kal_int16 pos1 = -1;
11706 kal_int16 pos2 = -1;
11707 kal_uint16 new_pos = 0;
11708 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
11709#ifdef __MCF_COMBINE_FILE_SUPPORT__
11710 kal_bool reset = KAL_FALSE;
11711#endif
11712
11713 MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_START(lid, ps_id);
11714
11715 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
11716 MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_INVALID_SIM_ID(ps_id, sim_id);
11717
11718 return KAL_FALSE;
11719 }
11720
11721 /* Search tlvota last modified LID list */
11722 if (mcf_tlvota_last_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
11723 /* If last modified LID list is full, all LIDs are needed to be reset */
11724 return KAL_TRUE;
11725 }
11726#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11727 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);
11728#else
11729 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);
11730 if(pos1 != -1 && pos1 >= 0){
11731 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){
11732 reset = KAL_TRUE;
11733 }
11734 }
11735#endif
11736
11737 /* Search tlvota current modified LID list */
11738 if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
11739 /* If current modified LID list is full, all LIDs are needed to be reset */
11740 return KAL_TRUE;
11741 }
11742#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11743 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);
11744#else
11745 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);
11746 if(pos2 != -1 && pos2 >= 0){
11747 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){
11748 reset = KAL_TRUE;
11749 }
11750 }
11751#endif
11752
11753 if ( (pos1 != -1) || (pos2 != -1) ) {
11754#ifdef __MCF_COMBINE_FILE_SUPPORT__
11755 if (reset == KAL_TRUE)
11756#endif
11757 {
11758 MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_TLVOTA_FOUND(lid);
11759 return KAL_TRUE;
11760 }
11761 }
11762
11763 pos1 = -1;
11764 pos2 = -1;
11765
11766 /* Search general tlvota last modified LID list */
11767 if (mcf_general_tlvota_last_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
11768 /* If last modified LID list is full, all LIDs are needed to be reset */
11769 return KAL_TRUE;
11770 }
11771#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11772 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);
11773#else
11774 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);
11775 if(pos1 != -1 && pos1 >= 0){
11776 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){
11777 reset = KAL_TRUE;
11778 }
11779 }
11780#endif
11781
11782 /* Search general tlvota current modified LID list */
11783 if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
11784 /* If current modified LID list is full, all LIDs are needed to be reset */
11785 return KAL_TRUE;
11786 }
11787#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
11788 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);
11789#else
11790 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);
11791 if(pos2 != -1 && pos2 >= 0){
11792 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){
11793 reset = KAL_TRUE;
11794 }
11795 }
11796#endif
11797
11798 if ( (pos1 != -1) || (pos2 != -1) ) {
11799#ifdef __MCF_COMBINE_FILE_SUPPORT__
11800 if (reset == KAL_TRUE)
11801#endif
11802 {
11803 MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_GENERAL_TLVOTA_FOUND(lid);
11804 return KAL_TRUE;
11805 }
11806 }
11807
11808 MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_NOT_FOUND(lid);
11809
11810 return KAL_FALSE;
11811}
11812
11813
11814mcf_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)
11815{
11816 mcf_ota_result_e ret = MCF_OTA_R_SUCCESS;
11817
11818 if (!(buffer && (size > 0))) {
11819 MD_TRC_MCF_TR_CHECK_RESET_AND_TLVOTA_BUFFER_SBP_TAG_INVALID_PARA(ps_id, lid, buffer, size);
11820 ret = MCF_OTA_R_INVALID_PARAMETER;
11821
11822 return ret;
11823 }
11824 if(mcf_check_lid_need_reset_by_psid(lid, ps_id) == KAL_TRUE){
11825 if (NVRAM_DEFAULT_VALUE_POINT != nvram_get_default_value(lid, ps_id, &buffer))
11826 {
11827 MD_TRC_MCF_TR_CHECK_RESET_AND_TLVOTA_BUFFER_SBP_TAG_GET_DEFAULT_VALUE_FAIL(lid);
11828 ret = MCF_OTA_R_READ_NVRAM_FAIL;
11829 return ret;
11830 }
11831 }else{
11832 if ( !nvram_external_read_data(lid, record_idx, buffer, size)) {
11833 ret = MCF_OTA_R_READ_NVRAM_FAIL;
11834 return ret;
11835 }
11836 }
11837
11838 ret = mcf_read_ota_buffer(lid, record_idx, buffer, size);
11839 if (ret != MCF_OTA_R_SUCCESS){
11840 return ret;
11841 }
11842 ret = mcf_read_tlvota_buffer_sbp_tag(ps_id, sbp_tag, lid, buffer, size);
11843
11844 return ret;
11845}
11846
11847kal_bool mcf_check_ota_need_update(protocol_id_enum ps_id, mcf_tlvota_sbp_tag_t sbp_tag, kal_uint8* iccid)
11848{
11849 kal_bool is_need_update = KAL_FALSE;
11850 kal_bool ret = KAL_FALSE;
11851 sbp_reconfig_custom_param_struct param_ptr;
11852 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
11853
11854 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
11855 MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_INVALID_SIM_ID(ps_id, sim_id);
11856 ret = MCF_OTA_R_INVALID_PARAMETER;
11857
11858 return ret;
11859 }
11860
11861 MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_START(ps_id, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
11862 param_ptr.ps_id = ps_id;
11863 param_ptr.sbp_id = sbp_tag.sbp_id;
11864 kal_mem_cpy(param_ptr.mcc, sbp_tag.mcc, MAX_MCC_STR_LEN);
11865 kal_mem_cpy(param_ptr.mnc, sbp_tag.mnc, MAX_MNC_STR_LEN);
11866 kal_mem_cpy(param_ptr.iccid, iccid, 21);
11867
11868
11869 ret = mcf_auto_select_tlvota_file(&param_ptr);
11870 if (ret == KAL_FALSE){
11871 is_need_update = KAL_FALSE;
11872 MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_FAIL(ps_id, ret);
11873 }
11874
11875 if (com_Mcf.update_tlvota[sim_id] == KAL_TRUE || com_Mcf.update_general_tlvota[sim_id] == KAL_TRUE){
11876 is_need_update = KAL_TRUE;
11877 }
11878 MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_RESULT(ps_id, is_need_update);
11879
11880 return is_need_update;
11881}
11882
11883mcf_ota_result_e mcf_get_tlvota_file_result(protocol_id_enum ps_id){
11884 mcf_ota_result_e mcf_ret = MCF_OTA_R_SUCCESS;
11885 sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
11886
11887 MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_START(ps_id);
11888
11889 if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
11890 MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_INVALID_SIM_ID(ps_id, sim_id);
11891 mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
11892 return mcf_ret;
11893 }
11894
11895 mcf_ret = com_Mcf.tlvota_result[sim_id];
11896 com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_PARAMETER;
11897
11898 MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_RETURN_RESULT(ps_id, mcf_ret);
11899
11900 return mcf_ret;
11901}