oal_void dmac_data_acq_workqueue(oal_work_stru *pst_work) { oal_uint32 ul_ret; oal_netbuf_stru *pst_netbuf; dmac_data_acq_info_stru *pst_daq_info; oal_uint8 *puc_daq_addr; oal_uint32 ul_len; pst_netbuf = oal_netbuf_delist(&g_st_data_acq.st_daq_workqueue.rx_daq_dbg_seq); while (OAL_PTR_NULL != pst_netbuf) { pst_daq_info = (dmac_data_acq_info_stru *)oal_netbuf_data(pst_netbuf); puc_daq_addr = (oal_uint8 *)pst_daq_info->ul_daq_addr; ul_len = pst_daq_info->ul_data_len; /* 发送数据信息给APP,若app出现错误则回复FAIL 等待APP的确认信号 */ ul_ret = dmac_data_acq_report_data_info(puc_daq_addr, ul_len, pst_netbuf); if (OAL_SUCC == ul_ret) { dmac_data_acq_report_data(puc_daq_addr, ul_len, pst_netbuf); } oal_netbuf_free(pst_netbuf); pst_netbuf = oal_netbuf_delist(&g_st_data_acq.st_daq_workqueue.rx_daq_dbg_seq); } }
oal_int32 oam_rx_post_action_function(oal_uint8 stype, hcc_netbuf_stru* pst_hcc_netbuf, oal_uint8 *pst_context) { oal_uint8 *puc_data; OAL_REFERENCE(pst_context); OAL_BUG_ON(NULL == pst_hcc_netbuf); puc_data = oal_netbuf_data(pst_hcc_netbuf->pst_netbuf); if((DUMP_REG == stype) || (DUMP_MEM == stype)) { //AL_IO_PRINT("receive dump msg = %d\n", stype); exception_bcpu_dump_recv(puc_data,pst_hcc_netbuf->pst_netbuf); oal_netbuf_free(pst_hcc_netbuf->pst_netbuf); return OAL_SUCC; } /* 调用OAM接口*/ oam_send_device_data2sdt(puc_data, (oal_uint16)pst_hcc_netbuf->len); oal_netbuf_free(pst_hcc_netbuf->pst_netbuf); return OAL_SUCC; }
oal_uint32 hmac_defrag_timeout_fn(oal_void *p_arg) { hmac_user_stru *pst_hmac_user; oal_netbuf_stru *pst_netbuf = OAL_PTR_NULL; pst_hmac_user = (hmac_user_stru *)p_arg; /* 超时后释放正在重组的分片报文 */ if (pst_hmac_user->pst_defrag_netbuf) { pst_netbuf = pst_hmac_user->pst_defrag_netbuf; OAL_MEM_NETBUF_TRACE(pst_netbuf, OAL_FALSE); oal_netbuf_free(pst_netbuf); pst_hmac_user->pst_defrag_netbuf = OAL_PTR_NULL; } return OAL_SUCC; }
OAL_STATIC oal_uint32 host_test_get_chip_msg(oal_void) { oal_uint32 ul_return; mac_chip_stru *pst_chip; frw_event_mem_stru *pst_event_mem; frw_event_stru *pst_event; /* 事件结构体 */ oal_uint32 ul_dev_id; oal_netbuf_stru *pst_netbuf; dmac_tx_event_stru *pst_ctx_event; oal_uint8 *pst_mac_rates_11g; /** 待补充 ***/ pst_event_mem = FRW_EVENT_ALLOC(OAL_SIZEOF(dmac_tx_event_stru)); if (OAL_UNLIKELY(OAL_PTR_NULL == pst_event_mem)) { OAL_IO_PRINT("host_test_get_chip_msg: hmac_init_event_process FRW_EVENT_ALLOC result = OAL_PTR_NULL.\n"); return OAL_FAIL; } /* 申请netbuf内存 */ pst_netbuf = OAL_MEM_NETBUF_ALLOC(OAL_NORMAL_NETBUF, WLAN_MEM_NETBUF_SIZE2, OAL_NETBUF_PRIORITY_MID); if (OAL_UNLIKELY(OAL_PTR_NULL == pst_netbuf)) { OAL_IO_PRINT("host_test_get_chip_msg: hmac_init_event_process OAL_MEM_NETBUF_ALLOC result = OAL_PTR_NULL.\n"); return OAL_FAIL; } pst_event = (frw_event_stru *)pst_event_mem->puc_data; pst_ctx_event = (dmac_tx_event_stru *)pst_event->auc_event_data; pst_ctx_event->pst_netbuf = pst_netbuf; pst_mac_rates_11g = (oal_uint8*)oal_netbuf_data(pst_ctx_event->pst_netbuf); pst_chip = (mac_chip_stru *)(pst_mac_rates_11g + sizeof(mac_data_rate_stru) * MAC_DATARATES_PHY_80211G_NUM); ul_dev_id = (oal_uint32) oal_queue_dequeue(&(g_st_mac_res.st_dev_res.st_queue)); /* 0为无效值 */ if (0 == ul_dev_id) { OAL_IO_PRINT("host_test_get_chip_msg:oal_queue_dequeue return 0!"); FRW_EVENT_FREE(pst_event_mem); return OAL_FAIL; } pst_chip->auc_device_id[0] = (oal_uint8)(ul_dev_id - 1); /* 根据ul_chip_ver,通过hal_chip_init_by_version函数获得 */ pst_chip->uc_device_nums = 1; pst_chip->uc_chip_id = 0; pst_chip->en_chip_state = OAL_TRUE; /* 由hal_chip_get_version函数得到,1102 02需要SOC提供寄存器后实现 */ pst_chip->ul_chip_ver = WLAN_CHIP_VERSION_HI1151V100H; pst_chip->pst_chip_stru = OAL_PTR_NULL; ul_return = hmac_init_event_process(pst_event_mem); if(OAL_UNLIKELY(ul_return != OAL_SUCC)) { OAL_IO_PRINT("host_test_get_chip_msg: hmac_init_event_process ul_return != OAL_SUCC\n"); FRW_EVENT_FREE(pst_event_mem); oal_netbuf_free(pst_netbuf); return OAL_FAIL; } return OAL_SUCC; }
oal_netbuf_stru* hmac_defrag_process(hmac_user_stru *pst_hmac_user, oal_netbuf_stru *pst_netbuf, oal_uint32 ul_hrdsize) { mac_ieee80211_frame_stru *pst_mac_hdr = OAL_PTR_NULL; mac_ieee80211_frame_stru *pst_last_hdr = OAL_PTR_NULL; oal_uint16 us_rx_seq = 0; oal_uint16 us_last_seq = 0; oal_uint8 uc_frag_num = 0; oal_uint8 uc_last_frag_num = 0; oal_bool_enum_uint8 en_more_frag = OAL_FALSE; oal_netbuf_stru *pst_new_buf = OAL_PTR_NULL; mac_rx_ctl_stru *pst_rx_ctl; oal_uint32 ul_ret; oal_uint8 uc_device_id; mac_device_stru *pst_mac_device; oal_uint32 ul_core_id; pst_mac_hdr = (mac_ieee80211_frame_stru *)oal_netbuf_data(pst_netbuf); us_rx_seq = pst_mac_hdr->bit_seq_num; uc_frag_num = (oal_uint8)pst_mac_hdr->bit_frag_num; en_more_frag = (oal_bool_enum_uint8)pst_mac_hdr->st_frame_control.bit_more_frag; /* 如果没有什么可以去分片的则直接返回 */ if (!en_more_frag && 0 == uc_frag_num && OAL_PTR_NULL == pst_hmac_user->pst_defrag_netbuf) { return pst_netbuf; } OAL_MEM_NETBUF_TRACE(pst_netbuf, OAL_FALSE); /* 首先检查到来的分片报文是不是属于正在重组的分片报文 */ if (pst_hmac_user->pst_defrag_netbuf) { frw_timer_restart_timer(&pst_hmac_user->st_defrag_timer, HMAC_FRAG_TIMEOUT, OAL_FALSE); pst_last_hdr = (mac_ieee80211_frame_stru *)oal_netbuf_data(pst_hmac_user->pst_defrag_netbuf); us_last_seq = pst_last_hdr->bit_seq_num; uc_last_frag_num = (oal_uint8)pst_last_hdr->bit_frag_num; /* 如果地址不匹配,序列号不匹配,分片号不匹配则释放现在正在重组的报文 */ if (us_rx_seq != us_last_seq || uc_frag_num != (uc_last_frag_num + 1) || oal_compare_mac_addr(pst_last_hdr->auc_address1, pst_mac_hdr->auc_address1) || oal_compare_mac_addr(pst_last_hdr->auc_address2, pst_mac_hdr->auc_address2)) { oal_netbuf_free(pst_hmac_user->pst_defrag_netbuf); FRW_TIMER_IMMEDIATE_DESTROY_TIMER(&pst_hmac_user->st_defrag_timer); pst_hmac_user->pst_defrag_netbuf = OAL_PTR_NULL; } } /* 判断到来的分片报文是否是第一个分片 */ if (OAL_PTR_NULL == pst_hmac_user->pst_defrag_netbuf) { /* 首片分片的分片号不为0则释放 */ if (uc_frag_num != 0) { oal_netbuf_free(pst_netbuf); OAM_STAT_VAP_INCR(pst_hmac_user->st_user_base_info.uc_vap_id, rx_defrag_process_dropped, 1); OAM_INFO_LOG3(pst_hmac_user->st_user_base_info.uc_vap_id, OAM_SF_ANY, "{hmac_defrag_process::The first frag_num is not Zero(%d), seq_num[%d], mor_frag[%d].}", uc_frag_num, us_rx_seq, en_more_frag); return OAL_PTR_NULL; } /* 没有分片,直接返回 */ if (0 == en_more_frag && 0 == uc_frag_num) { return pst_netbuf; } uc_device_id = pst_hmac_user->st_user_base_info.uc_device_id; pst_mac_device = mac_res_get_dev((oal_uint32)uc_device_id); if (OAL_PTR_NULL == pst_mac_device) { OAM_ERROR_LOG4(pst_hmac_user->st_user_base_info.uc_vap_id, OAM_SF_ANY, "{hmac_defrag_process::user index[%d] user mac:XX:XX:XX:%02X:%02X:%02X}", pst_hmac_user->st_user_base_info.us_assoc_id, pst_hmac_user->st_user_base_info.auc_user_mac_addr[3], pst_hmac_user->st_user_base_info.auc_user_mac_addr[4], pst_hmac_user->st_user_base_info.auc_user_mac_addr[5]); /* user异常,丢弃报文 */ oal_netbuf_free(pst_netbuf); OAM_STAT_VAP_INCR(pst_hmac_user->st_user_base_info.uc_vap_id, rx_defrag_process_dropped, 1); return OAL_PTR_NULL; } ul_core_id = pst_mac_device->ul_core_id; /* 启动超时定时器,超时释放重组报文 */ FRW_TIMER_CREATE_TIMER(&pst_hmac_user->st_defrag_timer, hmac_defrag_timeout_fn, HMAC_FRAG_TIMEOUT, pst_hmac_user, OAL_FALSE, OAM_MODULE_ID_HMAC, ul_core_id); /* 内存池netbuf只有1600 可能不够,参照A公司申请2500操作系统原生态报文 */ pst_new_buf = OAL_MEM_NETBUF_ALLOC(OAL_NORMAL_NETBUF, HMAC_MAX_FRAG_SIZE, OAL_NETBUF_PRIORITY_MID); if (OAL_PTR_NULL == pst_new_buf) { OAM_ERROR_LOG1(pst_hmac_user->st_user_base_info.uc_vap_id, OAM_SF_ANY, "{hmac_defrag_process::Alloc new_buf null,size[%d].}", HMAC_MAX_FRAG_SIZE); return OAL_PTR_NULL; } OAL_MEM_NETBUF_TRACE(pst_new_buf, OAL_FALSE); /* 将分片报文拷贝到新申请的报文中并挂接到用户结构体下,释放原有的报文 */ oal_netbuf_init(pst_new_buf, OAL_NETBUF_LEN(pst_netbuf)); oal_netbuf_copydata(pst_netbuf, 0, oal_netbuf_data(pst_new_buf), OAL_NETBUF_LEN(pst_netbuf)); oal_memcopy(OAL_NETBUF_CB(pst_new_buf), OAL_NETBUF_CB(pst_netbuf), MAC_TX_CTL_SIZE); pst_rx_ctl = (mac_rx_ctl_stru *)OAL_NETBUF_CB(pst_new_buf); pst_rx_ctl->pul_mac_hdr_start_addr = (oal_uint32 *)OAL_NETBUF_HEADER(pst_new_buf); pst_hmac_user->pst_defrag_netbuf = pst_new_buf; oal_netbuf_free(pst_netbuf); pst_netbuf = pst_new_buf; } else { if (OAL_UNLIKELY(OAL_PTR_NULL == pst_last_hdr)) { OAM_ERROR_LOG0(pst_hmac_user->st_user_base_info.uc_vap_id, OAM_SF_ANY, "{hmac_defrag_process::pst_last_hdr is NULL.}"); return OAL_PTR_NULL; } /* 此分片是期望的到来的分片,重启定时器,并进行重组 */ frw_timer_restart_timer(&pst_hmac_user->st_defrag_timer, HMAC_FRAG_TIMEOUT, OAL_FALSE); oal_netbuf_pull(pst_netbuf, ul_hrdsize); /* 记录最新分片报文的分片号 */ pst_last_hdr->bit_seq_num = pst_mac_hdr->bit_seq_num; pst_last_hdr->bit_frag_num = pst_mac_hdr->bit_frag_num; /*此接口内会调用dev_kfree_skb*/ oal_netbuf_concat(pst_hmac_user->pst_defrag_netbuf, pst_netbuf); } /* 判断是否重组完毕,存在更多报文返回空指针,重组完毕返回组好的报文 */ if (en_more_frag) { pst_netbuf = OAL_PTR_NULL; } else { if (OAL_UNLIKELY(OAL_PTR_NULL == pst_last_hdr)) { OAM_ERROR_LOG0(pst_hmac_user->st_user_base_info.uc_vap_id, OAM_SF_ANY, "{hmac_defrag_process::pst_last_hdr is NULL.}"); oal_netbuf_free(pst_netbuf); pst_hmac_user->pst_defrag_netbuf = OAL_PTR_NULL; return OAL_PTR_NULL; } pst_netbuf = pst_hmac_user->pst_defrag_netbuf; /* 对重组好的报文进行mic检查 */ ul_ret = hmac_de_mic(pst_hmac_user, pst_netbuf); if (OAL_SUCC != ul_ret) { oal_netbuf_free(pst_netbuf); OAM_STAT_VAP_INCR(pst_hmac_user->st_user_base_info.uc_vap_id, rx_de_mic_fail_dropped, 1); pst_netbuf = OAL_PTR_NULL; OAM_INFO_LOG1(pst_hmac_user->st_user_base_info.uc_vap_id, OAM_SF_ANY, "{hmac_defrag_process::hmac_de_mic failed[%d].}", ul_ret); } pst_hmac_user->pst_defrag_netbuf = OAL_PTR_NULL; pst_last_hdr->bit_frag_num = 0; FRW_TIMER_IMMEDIATE_DESTROY_TIMER(&pst_hmac_user->st_defrag_timer); } return pst_netbuf; }
/***************************************************************************** 函 数 名 : oam_netlink_kernel_recv 功能描述 : netlink消息接收函数(方向: host app -> 内核) 输入参数 : pst_buf: 输入数据 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2013年10月15日 作 者 : mayuan 修改内容 : 新生成函数 *****************************************************************************/ oal_void oam_netlink_kernel_recv(oal_netbuf_stru *pst_buf) { oal_netbuf_stru *pst_netbuf; oal_nlmsghdr_stru *pst_nlmsghdr; if (OAL_PTR_NULL == pst_buf) { OAL_IO_PRINT("oam_netlink_kernel_recv, pst_buf is null."); return; } pst_netbuf = oal_netbuf_get(pst_buf); while (OAL_NETBUF_LEN(pst_netbuf) >= OAL_NLMSG_SPACE(0)) { pst_nlmsghdr = oal_nlmsg_hdr(pst_netbuf); g_st_netlink.ul_pid = pst_nlmsghdr->nlmsg_pid; switch (pst_nlmsghdr->nlmsg_type) { case OAM_NL_CMD_SDT: if (OAL_PTR_NULL != g_st_netlink_ops.p_oam_sdt_func) { g_st_netlink_ops.p_oam_sdt_func(OAL_NLMSG_DATA(pst_nlmsghdr), OAL_NLMSG_PAYLOAD(pst_nlmsghdr, 0)); } break; case OAM_NL_CMD_HUT: if (OAL_PTR_NULL != g_st_netlink_ops.p_oam_hut_func) { g_st_netlink_ops.p_oam_hut_func(OAL_NLMSG_DATA(pst_nlmsghdr), OAL_NLMSG_PAYLOAD(pst_nlmsghdr, 0)); } break; case OAM_NL_CMD_ALG: if (OAL_PTR_NULL != g_st_netlink_ops.p_oam_alg_func) { g_st_netlink_ops.p_oam_alg_func(OAL_NLMSG_DATA(pst_nlmsghdr), OAL_NLMSG_PAYLOAD(pst_nlmsghdr, 0)); } break; case OAM_NL_CMD_DAQ: if (OAL_PTR_NULL != g_st_netlink_ops.p_oam_daq_func) { g_st_netlink_ops.p_oam_daq_func(OAL_NLMSG_DATA(pst_nlmsghdr), OAL_NLMSG_PAYLOAD(pst_nlmsghdr, 0)); } break; case OAM_NL_CMD_REG: if (OAL_PTR_NULL != g_st_netlink_ops.p_oam_reg_func) { g_st_netlink_ops.p_oam_reg_func(OAL_NLMSG_DATA(pst_nlmsghdr), OAL_NLMSG_PAYLOAD(pst_nlmsghdr, 0)); } break; case OAM_NL_CMD_ACS: if (OAL_PTR_NULL != g_st_netlink_ops.p_oam_acs_func) { g_st_netlink_ops.p_oam_acs_func(OAL_NLMSG_DATA(pst_nlmsghdr), OAL_NLMSG_PAYLOAD(pst_nlmsghdr, 0)); } break; default: // OAL_IO_PRINT("oam_netlink_kernel_recv, error nlmsg_type = %d.\n", pst_nlmsghdr->nlmsg_type); break; } oal_netbuf_pull(pst_netbuf, OAL_NLMSG_ALIGN(pst_nlmsghdr->nlmsg_len)); } oal_netbuf_free(pst_netbuf); }