/**************************************************************************** Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT be copied by any method or incorporated into another program without the express written consent of Aerospace C.Power. This Information or any portion thereof remains the property of Aerospace C.Power. The Information contained herein is believed to be accurate and Aerospace C.Power assumes no responsibility or liability for its use in any way and conveys no license or title under any patent or copyright and makes no representation or warranty that this Information is free from patent or copyright infringement. ****************************************************************************/ /* smart grid internal header files */ #include "proto_645_fj.h" #include "iot_oem_api.h" #include "iot_errno_api.h" #include "iot_version_api.h" #include "iot_sg_drv_api.h" /* iot common header files */ #include "iot_io_api.h" #if (IOT_SMART_GRID_ENABLE) iot_pkt_t *proto_645_fj_build_mr_msg(uint8_t *addr, uint8_t *data, uint8_t len, uint32_t di, uint8_t fn) { return proto_645_build_msg(addr, data, len, di, PROTO_645_DIR_MASTER, PROTO_645_ACK_NORMAL, fn, PROTO_645_2007_ID, PROTO_645_FOLLOW_INVALID); } iot_pkt_t *proto_645_fj_build_msg(uint8_t *addr, uint8_t *data, uint8_t len, uint32_t di, uint8_t fn) { return proto_645_build_msg(addr, data, len, di, PROTO_645_DIR_SLAVE, PROTO_645_ACK_NORMAL, fn, PROTO_645_2007_ID, PROTO_645_FOLLOW_INVALID); } iot_pkt_t *proto_645_fj_build_muilt_mr_msg(uint8_t *addr, uint32_t *di_list, uint8_t di_cnt) { iot_pkt_t *buff = NULL, *pkt = NULL; uint8_t buff_len, separatorm_len, i, *buff_data; uint32_t di; if (!di_cnt || di_cnt > PROTO_645_FJ_METER_MULTI_DI_CNT_MAX) { goto out; } separatorm_len = di_cnt - 1; buff_len = di_cnt * PROTO_645_2007_DI_LEN + separatorm_len; buff = iot_pkt_alloc(buff_len, IOT_SMART_GRID_MID); if (!buff) { goto out; } buff_data = iot_pkt_put(buff, buff_len); for (i = 0; i < di_cnt; i++) { os_mem_cpy(buff_data, di_list + i, PROTO_645_2007_DI_LEN); buff_data += PROTO_645_2007_DI_LEN; if (i < di_cnt - 1) { /* fill separator */ *buff_data = 0xbb; buff_data += 1; } } di = PROTO_645_FJ_METER_MULTI_DI_READ + di_cnt; pkt = proto_645_build_msg(addr, iot_pkt_data(buff), buff_len, di, PROTO_645_DIR_MASTER, PROTO_645_ACK_NORMAL, PROTO_645_2007_FN_READ_DATA, PROTO_645_2007_ID, PROTO_645_FOLLOW_INVALID); out: if (buff) { iot_pkt_free(buff); } return pkt; } iot_pkt_t *proto_645_fj_build_query_chip_id(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_CHIP_ID, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_query_mod_id(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_MOD_ID, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_query_mod_ver(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_MOD_VER, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_opposite_phase_info(uint8_t *addr, uint8_t fn, uint8_t opposite) { proto_645_fj_opposite_phase_t rpt_info = { 0 }; rpt_info.opposite_phase = opposite; return proto_645_fj_build_msg(addr, (uint8_t *)&rpt_info, sizeof(rpt_info), PROTO_645_FJ_DI_OPPOSITE_PHASE, fn); } iot_pkt_t *proto_645_fj_build_qr_phase_info(uint8_t *addr, uint8_t phase) { proto_645_fj_phase_info_t rpt_info = { 0 }; rpt_info.phase = phase; return proto_645_fj_build_msg(addr, (uint8_t *)&rpt_info, sizeof(rpt_info), PROTO_645_FJ_DI_QR_PHASE_INFO, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_tsfm_enable_resp(uint8_t *addr, uint8_t tsfm_detect_way, uint16_t timeout) { proto_645_fj_tsfm_enable_t tsfm_enable = { 0 }; tsfm_enable.tsfm_detect_way = tsfm_detect_way; tsfm_enable.timeout = timeout; return proto_645_fj_build_msg(addr, (uint8_t *)&tsfm_enable, sizeof(tsfm_enable), PROTO_645_FJ_DI_TSFM_DETECT_START, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_node_reg_enable_resp(uint8_t *addr, uint16_t timeout) { proto_645_fj_node_reg_enable_t reg_enable = { 0 }; reg_enable.timeout = timeout; return proto_645_fj_build_msg(addr, (uint8_t *)®_enable, sizeof(reg_enable), PROTO_645_FJ_DI_NODE_REG_START, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_topo_resp(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_TOPO, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_diff_tsfm_node(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_DIFF_TSFM_NODE, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_not_reg_node(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_NOT_REG_NODE, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_nb_nw_info_resp(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_NB_NW_INFO, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_freq_band_resp(uint8_t *addr, uint8_t freq_band) { proto_645_fj_query_freq_band_t rsp; rsp.freq_band = freq_band; return proto_645_fj_build_msg(addr, (uint8_t *)&rsp, sizeof(rsp), PROTO_645_FJ_DI_QR_FREQ_BAND, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_chip_id_f112_resp(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_CHIP_ID_F112, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_wl_resp(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_OP_WL, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_upgrade_send_file_ack(uint8_t *addr, uint32_t segment_index) { proto_645_fj_send_file_ul_t rsp; rsp.segment_index = segment_index; return proto_645_fj_build_msg(addr, (uint8_t *)&rsp, sizeof(rsp), PROTO_645_FJ_DI_UPGRADE_SEND_FILE, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_upgrade_query_file_ack(uint8_t *addr, uint16_t array_index, uint8_t *bitmap) { proto_645_fj_query_file_ul_t rsp; rsp.array_index = array_index; os_mem_cpy(rsp.array_bitmap, bitmap, PROTO_645_FJ_FILE_SEGMENT_ARRAY_LEN); return proto_645_fj_build_msg(addr, (uint8_t *)&rsp, sizeof(rsp), PROTO_645_FJ_DI_UPGRADE_REQ_FILE, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_major_node_mac(uint8_t *addr) { return proto_645_fj_build_msg(addr, addr, IOT_MAC_ADDR_LEN, PROTO_645_FJ_DI_QR_MAJOR_NODE_MAC, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_list_abnormal_node_rpt(uint8_t *addr, uint8_t err_type, uint8_t *tsfm_addr) { proto_645_fj_list_abnormal_node_rpt_t rpt_info = { 0 }; rpt_info.err_type = err_type; rpt_info.success_rate = 100; iot_mac_addr_cpy(rpt_info.tsfm_addr, tsfm_addr); return proto_645_fj_build_msg(addr, (uint8_t *)&rpt_info, sizeof(rpt_info), PROTO_645_FJ_DI_TSFM_ERR_NODE_RPT, PROTO_645_FJ_FN_ACTIVE_RPT); } iot_pkt_t *proto_645_fj_build_tsfm_detect_result(uint8_t *addr, uint8_t fn, uint16_t used_time, uint16_t same_tsfm_cnt, uint16_t diff_tsfm_cnt) { proto_645_fj_tsfm_result_rpt_t rpt_info = { 0 }; rpt_info.used_time = used_time; rpt_info.same_tsfm_cnt = same_tsfm_cnt; rpt_info.diff_tsfm_cnt = diff_tsfm_cnt; return proto_645_fj_build_msg(addr, (uint8_t *)&rpt_info, sizeof(rpt_info), PROTO_645_FJ_DI_TSFM_RESULT_RPT, fn); } iot_pkt_t *proto_645_fj_build_power_evt_rpt(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_POWER_EVT_RPT, PROTO_645_FJ_FN_ACTIVE_RPT); } iot_pkt_t *proto_645_fj_build_module_reset_cnt(uint8_t *addr, uint16_t reset_cnt) { proto_645_fj_module_reset_cnt_t rpt_info = { 0 }; rpt_info.reset_cnt = reset_cnt; return proto_645_fj_build_msg(addr, (uint8_t *)&rpt_info, sizeof(rpt_info), PROTO_645_FJ_DI_QR_MODULE_RESET_CNT, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_module_pd_cnt(uint8_t *addr, uint16_t pd_cnt) { proto_645_fj_pd_cnt_t rpt_info = { 0 }; rpt_info.pd_cnt = pd_cnt; return proto_645_fj_build_msg(addr, (uint8_t *)&rpt_info, sizeof(rpt_info), PROTO_645_FJ_DI_QR_PD_CNT, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_pd_valid_time(uint8_t *addr, uint8_t valid_time) { proto_645_fj_pd_valid_time_t rpt_info = { 0 }; rpt_info.pd_valid_time = valid_time; return proto_645_fj_build_msg(addr, (uint8_t *)&rpt_info, sizeof(rpt_info), PROTO_645_FJ_DI_PD_EVT_VALID_TIME, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_work_power_rpt(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_MOD_WORK_V, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_multi_di_rpt(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_MULTI_DI_READ, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_ctrl_evt_rpt(uint8_t *addr, uint8_t connect_state) { proto_645_fj_ctrl_connect_evt_rpt_t ctrl_rpt; if (connect_state) { ctrl_rpt.state = PROTO_645_FJ_CTRL_STATE_CONNECTED; } else { ctrl_rpt.state = PROTO_645_FJ_CTRL_STATE_DISCONNECTED; } iot_mac_addr_cpy(ctrl_rpt.ctrl_mac, addr); return proto_645_fj_build_msg(addr, (uint8_t *)&ctrl_rpt, sizeof(ctrl_rpt), PROTO_645_FJ_DI_CTRL_CONNECT_RPT, PROTO_645_FJ_FN_ACTIVE_RPT); } iot_pkt_t *proto_645_fj_build_qr_tm_soc(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_MOD_TM_SOC, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_query_ct_rec(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_MOD_LAST_CT_REC, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_query_ct_dur(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_MOD_CT_DUR, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_query_mod_tm(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_MOD_TM, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_evt_rpt_cfg(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_EVT_RPT_CFG, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_event_pin_report(uint8_t *addr, uint8_t state) { proto_645_fj_evt_rpt_t rpt = { 0 }; rpt.state = state; return proto_645_fj_build_msg(addr, (uint8_t *)&rpt, sizeof(rpt), PROTO_645_FJ_DI_EVT_RPT, PROTO_645_FJ_FN_ACTIVE_RPT); } iot_pkt_t *proto_645_fj_build_qr_rst_cnt(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_MODULE_RESET_CNT, PROTO_645_2007_FN_READ_DATA); } iot_pkt_t *proto_645_fj_build_qr_pd_cnt(uint8_t *addr, uint8_t *data, uint8_t data_len) { return proto_645_fj_build_msg(addr, data, data_len, PROTO_645_FJ_DI_QR_PD_CNT, PROTO_645_2007_FN_READ_DATA); } uint32_t proto_645_fj_task_cycle_to_sec(proto_645_fj_task_cycle_t *cycle) { uint32_t cycle_time = 0; switch (cycle->unit) { case PROTO_645_FJ_TASK_CYCLE_UNIT_TYPE_SEC: { if (cycle->value == 2 || cycle->value == 3 || cycle->value == 4 || cycle->value == 5 || cycle->value == 10 || cycle->value == 15 || cycle->value == 20 || cycle->value == 30 || cycle->value == 60) { cycle_time = cycle->value; } break; } case PROTO_645_FJ_TASK_CYCLE_UNIT_TYPE_MIN: { if (cycle->value == 1 || cycle->value == 2 || cycle->value == 3 || cycle->value == 4 || cycle->value == 5 || cycle->value == 10 || cycle->value == 15 || cycle->value == 20 || cycle->value == 30 || cycle->value == 60) { cycle_time = cycle->value * 60; } break; } case PROTO_645_FJ_TASK_CYCLE_UNIT_TYPE_HOUR: { if (cycle->value == 1 || cycle->value == 2 || cycle->value == 3 || cycle->value == 4 || cycle->value == 6 || cycle->value == 8 || cycle->value == 12 || cycle->value == 24) { cycle_time = cycle->value * 60 * 60; } break; } case PROTO_645_FJ_TASK_CYCLE_UNIT_TYPE_DAY: { if (cycle->value == 1) { cycle_time = cycle->value * 60 * 60 * 24; } break; } default: break; } return cycle_time; } uint32_t proto_645_fj_task_time_domain_to_sec( proto_645_fj_task_time_domain_t* domain, uint32_t* sec) { uint32_t ret = ERR_FAIL; static const uint8_t unit_list[2][11] = { {0, 1, 2, 3, 4, 5, 10, 15, 20, 30, 60}, {0, 1, 2, 3, 4, 6, 8, 12, 24} }; if (!domain) { return ret; } for (int i = 0; i < sizeof(unit_list[domain->unit]); i++) { if (unit_list[domain->unit][i] == domain->value) { ret = ERR_OK; if (sec) { *sec = (uint32_t)domain->value * (domain->unit ? 60 * 60 : 60); } break; } } return ret; } uint32_t proto_645_fj_task_info_desc_check(uint8_t task_type, uint8_t *desc, uint8_t desc_len, uint8_t group) { uint8_t reason = 0, *data, len, i; uint32_t ret = ERR_FAIL; proto_645_fj_task_set_freeze_hdr_t *freeze_hdr; proto_645_fj_freeze_data_desc_hdr_t *freeze_des_hdr; proto_645_fj_task_set_incon_rpt_hdr_t *incon_hdr; proto_645_fj_task_set_flw_rpt_hdr_t *flw_tail; proto_645_fj_task_set_cross_rpt_t *cross_hdr; proto_645_fj_task_set_change_rpt_hdr_t *change_hdr; proto_645_fj_task_time_domain_t* time_domain; switch (task_type) { case PROTO_645_FJ_TASK_TYPE_FREEZE: { if (desc_len < sizeof(*freeze_hdr)) { reason = 1; goto out; } freeze_hdr = (proto_645_fj_task_set_freeze_hdr_t*)desc; if ((freeze_hdr->data_cnt > PROTO_645_FJ_TASK_DESC_FREEZE_MAX_CNT) || !freeze_hdr->data_cnt) { reason = 2; goto out; } data = freeze_hdr->data_desc; len = desc_len - sizeof(*freeze_hdr); for (i = 0; i < freeze_hdr->data_cnt; i++) { if (len < sizeof(*freeze_des_hdr)) { reason = 3; goto out; } freeze_des_hdr = (proto_645_fj_freeze_data_desc_hdr_t*)data; switch (freeze_des_hdr->format_type) { case PROTO_645_FJ_FREEZE_DATA_FORMAT_NO_TS: { if (group == PROTO_645_FJ_TASK_GROUP_698 && freeze_des_hdr->data_len != PROTO_645_2007_DI_LEN) { reason = 4; goto out; } if ((freeze_des_hdr->data_len < PROTO_645_2007_DI_LEN) || (freeze_des_hdr->data_len > PROTO_645_FJ_TASK_DESC_FREEZE_MAX_LEN)) { reason = 5; goto out; } break; } case PROTO_645_FJ_FREEZE_DATA_FORMAT_WITH_TS: { if (group == PROTO_645_FJ_TASK_GROUP_698) { reason = 6; goto out; } if ((freeze_des_hdr->data_len < (PROTO_645_2007_DI_LEN + sizeof(proto_645_fj_freeze_data_desc_tail_t))) || (freeze_des_hdr->data_len > PROTO_645_FJ_TASK_DESC_FREEZE_MAX_LEN)) { reason = 7; goto out; } break; } case PROTO_645_FJ_FREEZE_DATA_FORMAT_WITH_TSR: { if (group == PROTO_645_FJ_TASK_GROUP_698) { reason = 8; goto out; } if ((freeze_des_hdr->data_len < (PROTO_645_2007_DI_LEN + sizeof(proto_645_fj_freeze_data_desc_tail_t) + sizeof(proto_645_fj_task_time_domain_t))) || (freeze_des_hdr->data_len > PROTO_645_FJ_TASK_DESC_FREEZE_MAX_LEN)) { reason = 9; goto out; } time_domain = (proto_645_fj_task_time_domain_t*) (freeze_des_hdr->data + (freeze_des_hdr->data_len - sizeof(*time_domain))); if (proto_645_fj_task_time_domain_to_sec(time_domain, NULL)) { reason = 10; goto out; } break; } default: reason = 11; goto out; } if (len < (sizeof(*freeze_des_hdr) + freeze_des_hdr->data_len)) { reason = 12; goto out; } len = len - sizeof(*freeze_des_hdr) - freeze_des_hdr->data_len; data = data + sizeof(*freeze_des_hdr) + freeze_des_hdr->data_len; } ret = ERR_OK; break; } case PROTO_645_FJ_TASK_TYPE_INCON_RPT: { if (desc_len < sizeof(*incon_hdr)) { reason = 13; goto out; } incon_hdr = (proto_645_fj_task_set_incon_rpt_hdr_t*)desc; if (!incon_hdr->triger_cnt) { reason = 14; goto out; } if (!incon_hdr->di_cnt) { reason = 15; goto out; } data = (uint8_t*)incon_hdr->di; len = desc_len - sizeof(*incon_hdr); if (len < (incon_hdr->di_cnt * PROTO_645_2007_DI_LEN)) { reason = 16; goto out; } len = len - incon_hdr->di_cnt * PROTO_645_2007_DI_LEN; data = data + incon_hdr->di_cnt * PROTO_645_2007_DI_LEN; if (len < sizeof(*flw_tail)) { reason = 17; goto out; } len = len - sizeof(*flw_tail); flw_tail = (proto_645_fj_task_set_flw_rpt_hdr_t*)data; if ((flw_tail->follow_di_cnt * PROTO_645_2007_DI_LEN) > len) { reason = 18; goto out; } ret = ERR_OK; break; } case PROTO_645_FJ_TASK_TYPE_CROSS_RPT: { if (desc_len < sizeof(*cross_hdr)) { reason = 19; goto out; } cross_hdr = (proto_645_fj_task_set_cross_rpt_t*)desc; if (!cross_hdr->triger_cnt) { reason = 20; goto out; } if (cross_hdr->value_len > PROTO_645_FJ_TASK_DESC_CROSS_VALUE_MAX_LEN || !cross_hdr->value_len) { reason = 21; goto out; } if (cross_hdr->cnt < PROTO_645_FJ_TASK_DESC_CROSS_VALUE_MIN_CNT || cross_hdr->cnt > PROTO_645_FJ_TASK_DESC_CROSS_VALUE_MAX_CNT) { reason = 22; goto out; } data = cross_hdr->value_list; len = desc_len - sizeof(*cross_hdr); if (len < cross_hdr->value_len * cross_hdr->cnt) { reason = 23; goto out; } len = len - (cross_hdr->value_len * cross_hdr->cnt); data = data + (cross_hdr->value_len * cross_hdr->cnt); if (len < sizeof(*flw_tail)) { reason = 24; goto out; } len = len - sizeof(*flw_tail); flw_tail = (proto_645_fj_task_set_flw_rpt_hdr_t*)data; if ((flw_tail->follow_di_cnt * PROTO_645_2007_DI_LEN) > len) { reason = 25; goto out; } ret = ERR_OK; break; } case PROTO_645_FJ_TASK_TYPE_CHG_RPT: { if (desc_len < sizeof(*change_hdr)) { reason = 26; goto out; } change_hdr = (proto_645_fj_task_set_change_rpt_hdr_t*)desc; if (!change_hdr->triger_cnt) { reason = 27; goto out; } if (change_hdr->value_len > PROTO_645_FJ_TASK_DESC_CHANGE_VALUE_MAX_LEN || !change_hdr->value_len) { reason = 28; goto out; } data = change_hdr->value_list; len = desc_len - sizeof(*change_hdr); if (len < change_hdr->value_len) { reason = 29; goto out; } len = len - change_hdr->value_len; data = data + change_hdr->value_len; if (len < sizeof(*flw_tail)) { reason = 30; goto out; } len = len - sizeof(*flw_tail); flw_tail = (proto_645_fj_task_set_flw_rpt_hdr_t*)data; if ((flw_tail->follow_di_cnt * PROTO_645_2007_DI_LEN) > len) { reason = 31; goto out; } ret = ERR_OK; break; } default: break; } out: if (ret) { iot_printf("%s fail, reason %lu\n", __FUNCTION__, reason); } return ret; } uint32_t proto_645_fj_task_set_msg_check(proto_645_fj_task_set_hdr_t *set, uint8_t len, uint8_t group) { uint8_t reason = 0, desc_len; uint32_t ret = ERR_FAIL, cycle_sec; if (!set || !len) { reason = 1; goto out; } if (set->type != PROTO_645_FJ_TASK_TYPE_FREEZE && set->type != PROTO_645_FJ_TASK_TYPE_CROSS_RPT && set->type != PROTO_645_FJ_TASK_TYPE_INCON_RPT && set->type != PROTO_645_FJ_TASK_TYPE_CHG_RPT) { reason = 2; goto out; } cycle_sec = proto_645_fj_task_cycle_to_sec(&set->cycle); if (cycle_sec == 0) { reason = 3; goto out; } if (set->delay >= cycle_sec) { reason = 4; goto out; } if (!set->save_cnt) { reason = 5; goto out; } if (!set->exe_cnt) { reason = 6; goto out; } desc_len = len - sizeof(*set); if (desc_len > PROTO_645_FJ_FREEZE_TASK_CFG_MAX_LEN) { reason = 7; goto out; } if (proto_645_fj_task_info_desc_check(set->type, set->task_info_desc, desc_len, group)) { reason = 8; goto out; } ret = ERR_OK; out: if (ret) { iot_printf("%s fail, reason %lu\n", __FUNCTION__, reason); } return ret; } #endif /* IOT_SMART_GRID_ENABLE */