oal_void dmac_11w_set_protectframe(dmac_vap_stru *pst_dmac_vap, wlan_security_txop_params_stru *pst_security, oal_netbuf_stru *pst_netbuf) { oal_bool_enum_uint8 en_MFPC = OAL_FALSE; oal_bool_enum_uint8 en_pmf_active = OAL_FALSE; oal_uint8 auc_addr1[6] = {0}; dmac_user_stru *pst_dmac_user = OAL_PTR_NULL; oal_uint16 us_user_idx; oal_uint8 *puc_frame_hdr = oal_netbuf_header(pst_netbuf); mac_get_address1(puc_frame_hdr, auc_addr1); /* 查找用户:auth帧情况下不会有用户,找不到用户属于正常情况 */ if (OAL_SUCC != mac_vap_find_user_by_macaddr(&pst_dmac_vap->st_vap_base_info, auc_addr1, &us_user_idx)) { return; } pst_dmac_user = (dmac_user_stru *)mac_res_get_dmac_user(us_user_idx); if (OAL_PTR_NULL == pst_dmac_user) { return; } /* 能力检查 */ en_MFPC = mac_mib_get_dot11RSNAMFPC(&(pst_dmac_vap->st_vap_base_info)); en_pmf_active = pst_dmac_user->st_user_base_info.st_cap_info.bit_pmf_active; if ((OAL_FALSE == en_MFPC) || (OAL_FALSE == en_pmf_active) || (OAL_TRUE == ETHER_IS_MULTICAST(auc_addr1))) { return; } if (OAL_TRUE == dmac_11w_robust_frame(pst_netbuf)) { mac_set_protectedframe(puc_frame_hdr); pst_security->en_cipher_key_type = pst_dmac_user->st_user_base_info.st_user_tx_info.st_security.en_cipher_key_type; pst_security->en_cipher_protocol_type = pst_dmac_user->st_user_base_info.st_user_tx_info.st_security.en_cipher_protocol_type; return; } }
/***************************************************************************** 函 数 名 : hmac_smps_update_status 功能描述 : AP侧接收到对应STA的关联请求消息 输入参数 : 无 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2014年4月16日 作 者 : zhangyu 修改内容 : 新生成函数 *****************************************************************************/ oal_uint32 hmac_smps_update_status(mac_vap_stru *pst_mac_vap, mac_user_stru *pst_mac_user, oal_bool_enum_uint8 en_plus_user) { mac_device_stru *pst_mac_device; wlan_mib_mimo_power_save_enum_uint8 en_user_smps_mode; frw_event_mem_stru *pst_event_mem; frw_event_stru *pst_event; oal_uint32 ul_ret; oal_bool_enum_uint8 en_ht_cap; mac_cfg_smps_mode_stru st_smps_mode = {0}; if ((OAL_PTR_NULL == pst_mac_vap) || (OAL_PTR_NULL == pst_mac_user)) { OAM_ERROR_LOG2(0, OAM_SF_SMPS, "{hmac_smps_update_status: NULL PTR pst_mac_vap is [%d] and pst_mac_user is [%d].}", pst_mac_vap, pst_mac_user); return OAL_ERR_CODE_PTR_NULL; } if (OAL_FALSE == mac_mib_get_HighThroughputOptionImplemented(pst_mac_vap)) { OAM_INFO_LOG0(pst_mac_vap->uc_vap_id, OAM_SF_SMPS, "{hmac_smps_update_status: pst_mac_vap is mimo.}"); return OAL_SUCC; } pst_mac_device = mac_res_get_dev(pst_mac_vap->uc_device_id); if (OAL_PTR_NULL == pst_mac_device) { OAM_ERROR_LOG0(pst_mac_vap->uc_vap_id, OAM_SF_SMPS, "{hmac_smps_update_status: pst_mac_device is null.}"); return OAL_ERR_CODE_PTR_NULL; } st_smps_mode.uc_smps_mode = WLAN_MIB_MIMO_POWER_SAVE_BUTT; st_smps_mode.us_user_idx = 0; en_user_smps_mode = (wlan_mib_mimo_power_save_enum_uint8)pst_mac_user->st_ht_hdl.bit_sm_power_save; en_ht_cap = (oal_bool_enum_uint8)pst_mac_user->st_ht_hdl.en_ht_capable; if (OAL_TRUE == en_plus_user) { if ((OAL_TRUE == en_ht_cap) && (WLAN_MIB_MIMO_POWER_SAVE_MIMO != en_user_smps_mode)) { /* 如果不是第一个用户,则直接返回 */ if (1 < pst_mac_device->uc_asoc_user_cnt) { return OAL_SUCC; } /* 如果是第一个用户,则进入SMPS模式 */ /* 设置SMPS模式信息 mib值 */ st_smps_mode.uc_smps_mode = (oal_uint8)pst_mac_vap->st_cap_flag.bit_smps; } else { pst_mac_device->uc_no_smps_user_cnt++; if (OAL_FALSE == pst_mac_device->en_smps) { return OAL_SUCC; } /* 设置SMPS模式disable */ st_smps_mode.uc_smps_mode = WLAN_MIB_MIMO_POWER_SAVE_MIMO; hmac_smps_all_vap_update(pst_mac_device, WLAN_MIB_MIMO_POWER_SAVE_MIMO); } } else { if ((OAL_TRUE == en_ht_cap) && (WLAN_MIB_MIMO_POWER_SAVE_MIMO != en_user_smps_mode)) { return OAL_SUCC; } if (0 < pst_mac_device->uc_no_smps_user_cnt) { pst_mac_device->uc_no_smps_user_cnt--; } if ((0 == pst_mac_device->uc_no_smps_user_cnt) && (OAL_FALSE == pst_mac_device->en_smps)) { /* 设置SMPS模式信息 mib值 */ st_smps_mode.uc_smps_mode = mac_mib_get_smps(pst_mac_vap); hmac_smps_all_vap_update(pst_mac_device, mac_mib_get_smps(pst_mac_vap)); } else { return OAL_SUCC; } } /* 抛事件到DMAC, 申请事件内存 */ pst_event_mem = FRW_EVENT_ALLOC(OAL_SIZEOF(st_smps_mode)); if (OAL_PTR_NULL == pst_event_mem) { OAM_ERROR_LOG0(pst_mac_vap->uc_vap_id, OAM_SF_SMPS, "{hmac_smps_update_status: FRW_EVENT_ALLOC fail.}"); return OAL_ERR_CODE_PTR_NULL; } ul_ret = mac_vap_find_user_by_macaddr(pst_mac_vap, pst_mac_user->auc_user_mac_addr, &(st_smps_mode.us_user_idx)); /* 查找用户失败或没有找到对应的用户 */ if (OAL_SUCC != ul_ret) { OAM_WARNING_LOG1(pst_mac_vap->uc_vap_id, OAM_SF_SMPS, "{hmac_smps_update_status::mac_vap_find_user_by_macaddr failed[%d].}", ul_ret); return ul_ret; } /* 填写事件 */ pst_event = (frw_event_stru *)pst_event_mem->puc_data; FRW_EVENT_HDR_INIT(&(pst_event->st_event_hdr), FRW_EVENT_TYPE_WLAN_CTX, DMAC_WLAN_CTX_EVENT_SUB_TYPE_SET_SMPS, OAL_SIZEOF(st_smps_mode), FRW_EVENT_PIPELINE_STAGE_1, pst_mac_vap->uc_chip_id, pst_mac_vap->uc_device_id, pst_mac_vap->uc_vap_id); /* 拷贝参数 */ oal_memcopy(pst_event->auc_event_data, (oal_void *)&st_smps_mode, OAL_SIZEOF(st_smps_mode)); /* 分发事件 */ ul_ret = frw_event_dispatch_event(pst_event_mem); if (OAL_SUCC != ul_ret) { FRW_EVENT_FREE(pst_event_mem); return OAL_FAIL; } FRW_EVENT_FREE(pst_event_mem); return OAL_SUCC; }