oal_uint32 dmac_data_acq_report_data_info(oal_uint8 *puc_daq_addr, oal_uint32 ul_len, oal_netbuf_stru *pst_netbuf) { dmac_data_acq_info_stru *pst_daq_data_info = OAL_PTR_NULL; dmac_data_acq_data_head_stru *pst_daq_data_head = OAL_PTR_NULL; oal_int32 l_bytes = 0; oal_uint32 ul_time = 0; /***** 发送数采基本信息给app 填写消息头 *****/ pst_daq_data_head = (dmac_data_acq_data_head_stru *)oal_netbuf_data(pst_netbuf); pst_daq_data_head->en_send_type = DMAC_DATA_ACQ_SEND_TYPE_INFO; pst_daq_data_head->ul_msg_sn = 0; pst_daq_data_head->ul_data_len = OAL_SIZEOF(dmac_data_acq_info_stru); /***** 发送数采基本信息给app 填写消息内容 *****/ pst_daq_data_info = (dmac_data_acq_info_stru *)(oal_netbuf_data(pst_netbuf) + DMAC_DATA_ACQ_DATA_HEAD_LEN); pst_daq_data_info->ul_daq_addr = (oal_uint32)puc_daq_addr; pst_daq_data_info->ul_data_len = ul_len; pst_daq_data_info->ul_unit_len = DMAC_DATA_ACQ_UNIT_DATA_LEN; /***** 将daq info通知app侧 *****/ l_bytes = oam_netlink_kernel_send(oal_netbuf_data(pst_netbuf), OAL_SIZEOF(dmac_data_acq_info_stru) + DMAC_DATA_ACQ_DATA_HEAD_LEN, OAM_NL_CMD_DAQ); if (l_bytes <= 0) { OAM_ERROR_LOG1(0, OAM_SF_ANY, "{dmac_data_acq_report_data_info::invalid l_bytes[%d].}", l_bytes); return OAL_FAIL; } g_st_data_acq.uc_ack_flag = OAL_FALSE; while(!g_st_data_acq.uc_ack_flag) { oal_msleep(1000); if (DMAC_DATA_ACQ_MAX_WAIT_TIME <= ul_time) { OAM_ERROR_LOG0(0, OAM_SF_ANY, "{dmac_data_acq_report_data_info::wait app ack timeout. Try again.}"); return OAL_FAIL; } ul_time++; } return OAL_SUCC; }
/***************************************************************************** 函 数 名 : sdt_drv_netlink_send 功能描述 : SDT驱动侧通过netlink向SDT APP发送数据 记录待发送的数据与发送失败的数据;通过序列号记录 输入参数 : 无 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2014年1月27日 作 者 : z00237171 修改内容 : 新生成函数 *****************************************************************************/ oal_uint32 sdt_drv_netlink_send(oal_netbuf_stru *pst_netbuf, oal_uint32 ul_len) { #if (_PRE_OS_VERSION_RAW != _PRE_OS_VERSION) #if((_PRE_TARGET_PRODUCT_TYPE_5610DMB == _PRE_CONFIG_TARGET_PRODUCT)\ ||(_PRE_TARGET_PRODUCT_TYPE_VSPM310DMB == _PRE_CONFIG_TARGET_PRODUCT)\ ||(_PRE_TARGET_PRODUCT_TYPE_WS835DMB == _PRE_CONFIG_TARGET_PRODUCT)) oal_int32 l_ret_len = 0; sdt_drv_pkt_hdr_stru *p_sdt_hdr; #endif oal_netbuf_stru *pst_copy_netbuf; oal_nlmsghdr_stru *pst_nlhdr; oal_uint32 ul_nlmsg_len; oal_int32 l_unicast_bytes = 0; /* 由上层保证参数非空 */ /* 如果没有与app建立连接,则直接返回,每500次打印一次提示信息 */ if (0 == g_st_sdt_drv_mng_entry.ul_usepid) { if (0 == (oal_atomic_read(&g_st_sdt_drv_mng_entry.ul_unconnect_cnt) % SDT_DRV_REPORT_NO_CONNECT_FREQUENCE)) { OAL_IO_PRINT("Info:waitting app_sdt start...\r\n"); oal_atomic_inc(&g_st_sdt_drv_mng_entry.ul_unconnect_cnt); } oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE); //oal_netbuf_free(pst_netbuf); return OAL_FAIL; } #if ((_PRE_TARGET_PRODUCT_TYPE_5610DMB == _PRE_CONFIG_TARGET_PRODUCT)\ ||(_PRE_TARGET_PRODUCT_TYPE_VSPM310DMB == _PRE_CONFIG_TARGET_PRODUCT)\ ||(_PRE_TARGET_PRODUCT_TYPE_WS835DMB == _PRE_CONFIG_TARGET_PRODUCT)) // 数据包分析 p_sdt_hdr = (sdt_drv_pkt_hdr_stru*)oal_netbuf_data(pst_netbuf); if (OAM_DATA_TYPE_LOG == p_sdt_hdr->en_msg_type || OAM_DATA_TYPE_OTA == p_sdt_hdr->en_msg_type) { if (0 == g_st_count) { ul_nlmsg_len = OAL_NLMSG_LENGTH(MAX_NLMSG_LEN); g_pst_copy_netbuf = oal_netbuf_alloc(ul_nlmsg_len, 0, WLAN_MEM_NETBUF_ALIGN); if (OAL_UNLIKELY(OAL_PTR_NULL == g_pst_copy_netbuf)) { oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE); //oal_netbuf_free(pst_netbuf); OAL_IO_PRINT("oal_netbuf_alloc failed. \r\n"); return OAL_FAIL; } g_pst_nlhdr = oal_nlmsg_put(g_pst_copy_netbuf, 0, 0, 0, (oal_int32)MAX_NLMSG_LEN, 0); } if (NULL != g_pst_nlhdr) { l_ret_len = MAX_NLMSG_LEN - g_buf_offset - ul_len; if (l_ret_len > 0) { oal_memcopy((oal_void *)OAL_NLMSG_DATA(g_pst_nlhdr) + g_buf_offset, (const oal_void *)oal_netbuf_data(pst_netbuf), ul_len); g_st_count++; g_buf_offset += ul_len; } } if (MAX_QUEUE_COUNT == g_st_count || g_buf_offset > MAX_CO_SIZE || l_ret_len < 0) { g_st_count = 0; g_buf_offset = 0; l_unicast_bytes = oal_netlink_unicast(g_st_sdt_drv_mng_entry.pst_nlsk, g_pst_copy_netbuf, g_st_sdt_drv_mng_entry.ul_usepid, 0); oal_msleep(300); OAM_SDT_STAT_INCR(ul_nlk_sd_cnt); if (l_unicast_bytes <= 0) { oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE); //oal_netbuf_free(pst_netbuf); oal_msleep(500); OAM_SDT_STAT_INCR(ul_nlk_sd_fail); return OAL_FAIL; } } oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE); return OAL_SUCC; } #endif /* 填写netlink消息头 */ ul_nlmsg_len = OAL_NLMSG_SPACE(ul_len); pst_copy_netbuf = oal_netbuf_alloc(ul_nlmsg_len, 0, WLAN_MEM_NETBUF_ALIGN); if (OAL_UNLIKELY(OAL_PTR_NULL == pst_copy_netbuf)) { oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE); //oal_netbuf_free(pst_netbuf); OAL_IO_PRINT("oal_netbuf_alloc failed. \r\n"); return OAL_FAIL; } pst_nlhdr = oal_nlmsg_put(pst_copy_netbuf, 0, 0, 0, (oal_int32)ul_len, 0); oal_memcopy((oal_void *)OAL_NLMSG_DATA(pst_nlhdr), (const oal_void *)oal_netbuf_data(pst_netbuf), ul_len); l_unicast_bytes = oal_netlink_unicast(g_st_sdt_drv_mng_entry.pst_nlsk, pst_copy_netbuf, g_st_sdt_drv_mng_entry.ul_usepid, OAL_MSG_DONTWAIT); oal_mem_sdt_netbuf_free(pst_netbuf, OAL_TRUE); //oal_netbuf_free(pst_netbuf); OAM_SDT_STAT_INCR(ul_nlk_sd_cnt); if (l_unicast_bytes <= 0) { OAM_SDT_STAT_INCR(ul_nlk_sd_fail); return OAL_FAIL; } #endif return OAL_SUCC; }
oal_uint32 dmac_data_acq_report_data(oal_uint8 *puc_daq_addr, oal_uint32 ul_len, oal_netbuf_stru *pst_netbuf) { oal_uint8 *puc_data_offset = OAL_PTR_NULL; oal_uint32 ul_trans_remainder_len = 0; oal_uint32 ul_unit_len; oal_uint32 ul_ret; oal_uint32 ul_time = 0; ul_trans_remainder_len = ul_len; ul_unit_len = DMAC_DATA_ACQ_UNIT_DATA_LEN; puc_data_offset = puc_daq_addr; g_st_data_acq.ul_daq_sn = 0; dmac_data_acq_set_send_flag(OAL_TRUE); /* 发送daq 数据信息 */ while (ul_trans_remainder_len >= ul_unit_len) { if (OAL_FALSE == g_st_data_acq.en_daq_app_error) { if (OAL_TRUE == dmac_data_acq_get_send_flag()) { ul_ret = dmac_data_acq_report_data_unit(puc_data_offset, ul_unit_len, pst_netbuf); if (ul_ret != OAL_SUCC) { /* 释放内存 */ OAM_ERROR_LOG1(0, OAM_SF_ANY, "{dmac_data_acq_report_data::dmac_data_acq_report_data_unit failed[%d].}", ul_ret); return ul_ret; } ul_trans_remainder_len -= ul_unit_len; puc_data_offset += ul_unit_len; } else { oal_msleep(1000); if (DMAC_DATA_ACQ_MAX_WAIT_TIME <= ul_time) { OAM_ERROR_LOG0(0, OAM_SF_ANY, "{dmac_report_data_acq_record::send data uint failed. Try again.}"); return OAL_FAIL; } ul_time++; } } else { OAM_ERROR_LOG0(0, OAM_SF_ANY, "{dmac_report_data_acq_record::send data uint failed. app error, Try again.}"); return OAL_FAIL; } } /* 最后一片数据采集长度 */ if ((ul_trans_remainder_len != 0) && (OAL_FALSE == g_st_data_acq.en_daq_app_error)) { ul_ret = dmac_data_acq_report_data_unit(puc_data_offset, ul_trans_remainder_len,pst_netbuf); if (ul_ret != OAL_SUCC) { OAM_ERROR_LOG1(0, OAM_SF_ANY, "{dmac_report_data_acq_record::dmac_data_acq_report_data_unit failed[%d].}", ul_ret); return ul_ret; } } g_st_data_acq.uc_ack_flag = OAL_FALSE; while(!g_st_data_acq.uc_ack_flag) { oal_msleep(1000); if ((OAL_TRUE == g_st_data_acq.en_daq_app_error) || (DMAC_DATA_ACQ_MAX_WAIT_TIME <= ul_time)) { OAM_ERROR_LOG0(0, OAM_SF_ANY, "{dmac_data_acq_report_data::wait app ack timeout or app error. Try again.}"); return OAL_FAIL; } ul_time++; } return OAL_SUCC; }