/***************************************************************************** 函 数 名 : hmac_roam_find_in_blacklist 功能描述 : 检查列表中是否存在该bssid 输入参数 : 输出参数 : 无 返 回 值 : OAL_SUCC 或 失败错误码 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2015年7月8日 作 者 : g00260350 修改内容 : 新生成函数 *****************************************************************************/ OAL_STATIC oal_bool_enum_uint8 hmac_roam_alg_find_in_bsslist(hmac_roam_bss_list_stru *pst_roam_bss_list, oal_uint8 *puc_bssid) { hmac_roam_bss_info_stru *pst_cur_bss; oal_uint32 ul_current_index; oal_uint32 ul_now; oal_uint32 ul_timeout; oal_uint32 ul_delta_time; oal_uint16 us_count_limit; ul_now = (oal_uint32)OAL_TIME_GET_STAMP_MS(); for (ul_current_index = 0; ul_current_index < ROAM_LIST_MAX; ul_current_index++) { pst_cur_bss = &pst_roam_bss_list->ast_bss[ul_current_index]; ul_timeout = pst_cur_bss->ul_timeout; us_count_limit = pst_cur_bss->us_count_limit; if (0 == oal_compare_mac_addr(pst_cur_bss->auc_bssid, puc_bssid)) { /* 如果在超时时间内出现count_limit次以上记录 */ ul_delta_time = OAL_TIME_GET_RUNTIME(pst_cur_bss->ul_time_stamp, ul_now); if ((ul_delta_time <= ul_timeout) && (pst_cur_bss->us_count >= us_count_limit)) { return OAL_TRUE; } return OAL_FALSE; } } return OAL_FALSE; }
/***************************************************************************** 函 数 名 : hmac_roam_alg_bss_check 功能描述 : 输入参数 : 输出参数 : 无 返 回 值 : OAL_SUCC 或 失败错误码 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2015年7月10日 作 者 : g00260350 修改内容 : 新生成函数 *****************************************************************************/ mac_bss_dscr_stru *hmac_roam_alg_select_bss(hmac_roam_info_stru *pst_roam_info) { hmac_vap_stru *pst_hmac_vap; mac_vap_stru *pst_mac_vap; mac_bss_dscr_stru *pst_bss_dscr; hmac_roam_alg_stru *pst_roam_alg; oal_int8 c_delta_rssi; if (OAL_PTR_NULL == pst_roam_info) { return OAL_PTR_NULL; } pst_hmac_vap = pst_roam_info->pst_hmac_vap; if (OAL_PTR_NULL == pst_hmac_vap) { return OAL_PTR_NULL; } pst_mac_vap = &(pst_hmac_vap->st_vap_base_info); pst_roam_alg = &(pst_roam_info->st_alg); /* 取得最大 rssi 的 bss */ pst_bss_dscr = pst_roam_alg->pst_max_rssi_bss; if ((OAL_PTR_NULL != pst_roam_alg->pst_max_capacity_bss) && (pst_roam_alg->ul_max_capacity >= ROAM_THROUGHPUT_THRESHOLD)) { /* 取得最大 capacity 的 bss*/ pst_bss_dscr = pst_roam_alg->pst_max_capacity_bss; } if(OAL_PTR_NULL == pst_bss_dscr) { /* should not be here */ return OAL_PTR_NULL; } /* 过滤当前关联的 bss */ if (0 == oal_compare_mac_addr(pst_mac_vap->auc_bssid, pst_bss_dscr->auc_bssid)) { return OAL_PTR_NULL; } /* rssi增益处理 */ c_delta_rssi = hmac_roam_alg_adjust_rssi_increase(pst_roam_info, pst_bss_dscr); if (c_delta_rssi <= 0) { return OAL_PTR_NULL; } return pst_bss_dscr; }
/***************************************************************************** 函 数 名 : hmac_roam_alg_bss_in_ess 功能描述 : 输入参数 : 输出参数 : 无 返 回 值 : OAL_SUCC 或 失败错误码 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2015年11月25日 作 者 : g00260350 修改内容 : 新生成函数 *****************************************************************************/ oal_uint32 hmac_roam_alg_bss_in_ess(hmac_roam_info_stru *pst_roam_info, mac_bss_dscr_stru *pst_bss_dscr) { hmac_vap_stru *pst_hmac_vap; mac_vap_stru *pst_mac_vap; hmac_roam_alg_stru *pst_roam_alg; mac_cfg_ssid_param_stru st_cfg_ssid; oal_uint8 uc_stru_len; if ((OAL_PTR_NULL == pst_roam_info) || (OAL_PTR_NULL == pst_bss_dscr)) { OAM_ERROR_LOG0(0, OAM_SF_ROAM, "{hmac_roam_alg_bss_in_ess::param null.}"); return OAL_ERR_CODE_PTR_NULL; } pst_hmac_vap = pst_roam_info->pst_hmac_vap; if (OAL_PTR_NULL == pst_hmac_vap) { return OAL_ERR_CODE_ROAM_INVALID_VAP; } pst_mac_vap = &(pst_hmac_vap->st_vap_base_info); mac_mib_get_ssid(pst_mac_vap, &uc_stru_len, (oal_uint8 *)(&st_cfg_ssid)); if ((OAL_STRLEN(pst_bss_dscr->ac_ssid) != st_cfg_ssid.uc_ssid_len) || (0 != oal_memcmp(st_cfg_ssid.ac_ssid, pst_bss_dscr->ac_ssid, st_cfg_ssid.uc_ssid_len))) { return OAL_SUCC; } pst_roam_alg = &(pst_roam_info->st_alg); /* 是否扫描到了当前关联的 bss, 仅置位,不过滤 */ if (0 != oal_compare_mac_addr(pst_mac_vap->auc_bssid, pst_bss_dscr->auc_bssid)) { pst_roam_alg->uc_another_bss_scaned = 1; hmac_roam_ignore_rssi_trigger(pst_hmac_vap, OAL_FALSE); } 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; }
/***************************************************************************** 函 数 名 : hmac_roam_alg_bss_check 功能描述 : 输入参数 : 输出参数 : 无 返 回 值 : OAL_SUCC 或 失败错误码 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2015年3月18日 作 者 : g00260350 修改内容 : 新生成函数 *****************************************************************************/ oal_uint32 hmac_roam_alg_bss_check(hmac_roam_info_stru *pst_roam_info, mac_bss_dscr_stru *pst_bss_dscr) { hmac_vap_stru *pst_hmac_vap; mac_vap_stru *pst_mac_vap; hmac_roam_alg_stru *pst_roam_alg; mac_cap_info_stru *pst_cap_info; oal_uint8 *puc_pmkid; mac_cfg_ssid_param_stru st_cfg_ssid; oal_uint32 ul_ret; oal_uint32 ul_avail_channel_capacity; oal_uint8 uc_stru_len; oal_int8 c_delta_rssi; oal_int8 c_tmp_rssi; if ((OAL_PTR_NULL == pst_roam_info) || (OAL_PTR_NULL == pst_bss_dscr)) { OAM_ERROR_LOG0(0, OAM_SF_ROAM, "{hmac_roam_alg_bss_check::param null.}"); return OAL_ERR_CODE_PTR_NULL; } pst_hmac_vap = pst_roam_info->pst_hmac_vap; if (OAL_PTR_NULL == pst_hmac_vap) { return OAL_ERR_CODE_ROAM_INVALID_VAP; } pst_mac_vap = &(pst_hmac_vap->st_vap_base_info); mac_mib_get_ssid(pst_mac_vap, &uc_stru_len, (oal_uint8 *)(&st_cfg_ssid)); if ((OAL_STRLEN(pst_bss_dscr->ac_ssid) != st_cfg_ssid.uc_ssid_len) || (0 != oal_memcmp(st_cfg_ssid.ac_ssid, pst_bss_dscr->ac_ssid, st_cfg_ssid.uc_ssid_len))) { return OAL_SUCC; } pst_roam_alg = &(pst_roam_info->st_alg); /* 挑选HMAC_SCAN_MAX_VALID_SCANNED_BSS_EXPIRE时间以内的有效bss */ if (oal_time_after((oal_uint32)OAL_TIME_GET_STAMP_MS(),(pst_bss_dscr->ul_timestamp + HMAC_SCAN_MAX_VALID_SCANNED_BSS_EXPIRE))) { return OAL_SUCC; } /* 检查黑名单 */ ul_ret = hmac_roam_alg_find_in_blacklist(pst_roam_info, pst_bss_dscr->auc_bssid); if (OAL_TRUE == ul_ret) { OAM_WARNING_LOG3(0, OAM_SF_ROAM,"{hmac_roam_alg_bss_check:: [%02X:XX:XX:XX:%02X:%02X] in blacklist!}", pst_bss_dscr->auc_bssid[0], pst_bss_dscr->auc_bssid[4], pst_bss_dscr->auc_bssid[5]); return OAL_SUCC; } /* 排除当前bss的rssi值计算,本地已经保存了dmac上报的rssi */ if (0 == oal_compare_mac_addr(pst_mac_vap->auc_bssid, pst_bss_dscr->auc_bssid)) { return OAL_SUCC; } /* wep的bss直接过滤掉 */ pst_cap_info = (mac_cap_info_stru *)&pst_bss_dscr->us_cap_info; if ((0 == pst_bss_dscr->st_bss_sec_info.uc_bss_80211i_mode) && (0 != pst_cap_info->bit_privacy)) { return OAL_SUCC; } /* open加密方式到wpa/wpa2直接过滤掉 */ /*lint -e731*/ if ((0 == pst_cap_info->bit_privacy) != (OAL_TRUE != mac_mib_get_privacyinvoked(&pst_hmac_vap->st_vap_base_info))) { return OAL_SUCC; } /*lint +e731*/ /* c_current_rssi为0时,表示linkloss上报的触发,不需要考虑rssi增益 */ c_delta_rssi = hmac_roam_alg_adjust_rssi_increase(pst_roam_info, pst_bss_dscr); if (c_delta_rssi <= 0) { return OAL_SUCC; } ul_avail_channel_capacity = hmac_roam_alg_calc_avail_channel_capacity(pst_bss_dscr); if ((0 != ul_avail_channel_capacity) && ((OAL_PTR_NULL == pst_roam_alg->pst_max_capacity_bss) || (ul_avail_channel_capacity > pst_roam_alg->ul_max_capacity))) { //暂时不考虑容量 //pst_roam_alg->ul_max_capacity = ul_avail_channel_capacity; //pst_roam_alg->pst_max_capacity_bss = pst_bss_dscr; } c_tmp_rssi = pst_bss_dscr->c_rssi; /* 对于已存在pmk缓存的bss进行加分处理 */ puc_pmkid = hmac_vap_get_pmksa(pst_hmac_vap, pst_bss_dscr->auc_bssid); if (OAL_PTR_NULL != puc_pmkid) { c_tmp_rssi += ROAM_RSSI_DIFF_4_DB; } if ((OAL_PTR_NULL == pst_roam_alg->pst_max_rssi_bss) || (c_tmp_rssi > pst_roam_alg->c_max_rssi)) { pst_roam_alg->c_max_rssi = c_tmp_rssi; pst_roam_alg->pst_max_rssi_bss = pst_bss_dscr; } return OAL_SUCC; }
/***************************************************************************** 函 数 名 : hmac_roam_alg_add_list 功能描述 : 将bssid添加到列表中 输入参数 : 输出参数 : 无 返 回 值 : OAL_SUCC 或 失败错误码 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2015年7月8日 作 者 : g00260350 修改内容 : 新生成函数 *****************************************************************************/ OAL_STATIC oal_uint32 hmac_roam_alg_add_bsslist(hmac_roam_bss_list_stru *pst_roam_bss_list, oal_uint8 *puc_bssid, roam_blacklist_type_enum_uint8 list_type) { hmac_roam_bss_info_stru *pst_cur_bss; hmac_roam_bss_info_stru *pst_oldest_bss; hmac_roam_bss_info_stru *pst_zero_bss; oal_uint8 auc_mac_zero[WLAN_MAC_ADDR_LEN] = {0}; oal_uint32 ul_current_index; oal_uint32 ul_now; oal_uint32 ul_timeout; pst_oldest_bss = OAL_PTR_NULL; pst_zero_bss = OAL_PTR_NULL; ul_now = (oal_uint32)OAL_TIME_GET_STAMP_MS(); for (ul_current_index = 0; ul_current_index < ROAM_LIST_MAX; ul_current_index++) { pst_cur_bss = &pst_roam_bss_list->ast_bss[ul_current_index]; ul_timeout = (oal_uint32)pst_cur_bss->ul_timeout; if (0 == oal_compare_mac_addr(pst_cur_bss->auc_bssid, puc_bssid)) { /* 优先查找已存在的记录,如果名单超时更新时间戳,否则更新count */ if (OAL_TIME_GET_RUNTIME(pst_cur_bss->ul_time_stamp, ul_now) > ul_timeout) { pst_cur_bss->ul_time_stamp = ul_now; pst_cur_bss->us_count = 1; } else { pst_cur_bss->us_count++; if(pst_cur_bss->us_count == pst_cur_bss->us_count_limit) { pst_cur_bss->ul_time_stamp = ul_now; } } return OAL_SUCC; } /* 记录第一个空记录 */ if (OAL_PTR_NULL != pst_zero_bss) { continue; } if (0 == oal_compare_mac_addr(pst_cur_bss->auc_bssid, auc_mac_zero)) { pst_zero_bss = pst_cur_bss; continue; } /* 记录一个非空最老记录 */ if (OAL_PTR_NULL == pst_oldest_bss) { pst_oldest_bss = pst_cur_bss; } else { if (OAL_TIME_GET_RUNTIME(pst_cur_bss->ul_time_stamp, ul_now) > OAL_TIME_GET_RUNTIME(pst_oldest_bss->ul_time_stamp, ul_now)) { pst_oldest_bss = pst_cur_bss; } } } if (OAL_PTR_NULL == pst_zero_bss) { pst_zero_bss = pst_oldest_bss; } if (OAL_PTR_NULL != pst_zero_bss) { oal_set_mac_addr(pst_zero_bss->auc_bssid, puc_bssid); pst_zero_bss->ul_time_stamp = ul_now; pst_zero_bss->us_count = 1; return OAL_SUCC; } return OAL_FAIL; }
oal_uint32 hmac_roam_alg_bss_check(hmac_roam_info_stru *pst_roam_info, mac_bss_dscr_stru *pst_bss_dscr) { hmac_vap_stru *pst_hmac_vap; mac_vap_stru *pst_mac_vap; hmac_roam_alg_stru *pst_roam_alg; mac_cap_info_stru *pst_cap_info; mac_cfg_ssid_param_stru st_cfg_ssid; oal_uint32 ul_ret; oal_uint32 ul_avail_channel_capacity; oal_uint8 uc_stru_len; oal_int8 c_delta_rssi; if ((OAL_PTR_NULL == pst_roam_info) || (OAL_PTR_NULL == pst_bss_dscr)) { OAM_ERROR_LOG0(0, OAM_SF_ROAM, "{hmac_roam_alg_bss_check::param null.}"); return OAL_ERR_CODE_PTR_NULL; } pst_hmac_vap = pst_roam_info->pst_hmac_vap; if (OAL_PTR_NULL == pst_hmac_vap) { return OAL_ERR_CODE_ROAM_INVALID_VAP; } pst_mac_vap = &(pst_hmac_vap->st_vap_base_info); mac_mib_get_ssid(pst_mac_vap, &uc_stru_len, (oal_uint8 *)(&st_cfg_ssid)); if ((OAL_STRLEN(pst_bss_dscr->ac_ssid) != st_cfg_ssid.uc_ssid_len) || (0 != oal_memcmp(st_cfg_ssid.ac_ssid, pst_bss_dscr->ac_ssid, st_cfg_ssid.uc_ssid_len))) { return OAL_SUCC; } pst_roam_alg = &(pst_roam_info->st_alg); /* 检查黑名单 */ ul_ret = hmac_roam_alg_find_in_blacklist(pst_roam_info, pst_bss_dscr->auc_bssid); if (OAL_TRUE == ul_ret) { return OAL_SUCC; } /* 排除当前bss的rssi值计算,本地已经保存了dmac上报的rssi */ if (0 == oal_compare_mac_addr(pst_mac_vap->auc_bssid, pst_bss_dscr->auc_bssid)) { return OAL_SUCC; } /* wep的bss直接过滤掉 */ pst_cap_info = (mac_cap_info_stru *)&pst_bss_dscr->us_cap_info; if ((0 == pst_bss_dscr->st_bss_sec_info.uc_bss_80211i_mode) && (0 != pst_cap_info->bit_privacy)) { return OAL_SUCC; } /* open加密方式到wpa/wpa2直接过滤掉 */ /*lint -e731*/ if ((0 == pst_cap_info->bit_privacy) != (OAL_TRUE != mac_mib_get_privacyinvoked(&pst_hmac_vap->st_vap_base_info))) { return OAL_SUCC; } /*lint +e731*/ /* c_current_rssi为0时,表示linkloss上报的触发,不需要考虑rssi增益 */ c_delta_rssi = hmac_roam_alg_adjust_rssi_increase(pst_roam_info, pst_bss_dscr); if (c_delta_rssi <= 0) { return OAL_SUCC; } ul_avail_channel_capacity = hmac_roam_alg_calc_avail_channel_capacity(pst_bss_dscr); if ((0 != ul_avail_channel_capacity) && ((OAL_PTR_NULL == pst_roam_alg->pst_max_capacity_bss) || (ul_avail_channel_capacity > pst_roam_alg->ul_max_capacity))) { //暂时不考虑容量 //pst_roam_alg->ul_max_capacity = ul_avail_channel_capacity; //pst_roam_alg->pst_max_capacity_bss = pst_bss_dscr; } if ((OAL_PTR_NULL == pst_roam_alg->pst_max_rssi_bss) || (pst_bss_dscr->c_rssi > pst_roam_alg->c_max_rssi)) { pst_roam_alg->c_max_rssi = pst_bss_dscr->c_rssi; pst_roam_alg->pst_max_rssi_bss = pst_bss_dscr; } return OAL_SUCC; }
OAL_STATIC oal_uint32 hmac_roam_alg_add_bsslist(hmac_roam_bss_list_stru *pst_roam_bss_list, oal_uint8 *puc_bssid, roam_blacklist_type_enum_uint8 list_type) { hmac_roam_bss_info_stru *pst_cur_bss; hmac_roam_bss_info_stru *pst_oldest_bss; hmac_roam_bss_info_stru *pst_zero_bss; oal_uint8 auc_mac_zero[WLAN_MAC_ADDR_LEN] = {0}; oal_uint32 ul_current_index; oal_uint32 ul_now; oal_uint32 ul_timeout; pst_oldest_bss = OAL_PTR_NULL; pst_zero_bss = OAL_PTR_NULL; ul_now = (oal_uint32)OAL_TIME_GET_STAMP_MS(); for (ul_current_index = 0; ul_current_index < ROAM_LIST_MAX; ul_current_index++) { pst_cur_bss = &pst_roam_bss_list->ast_bss[ul_current_index]; ul_timeout = (oal_uint32)pst_cur_bss->ul_timeout; if (0 == oal_compare_mac_addr(pst_cur_bss->auc_bssid, puc_bssid)) { /* 优先查找已存在的记录,如果名单超时更新时间戳,否则更新count */ if (OAL_TIME_GET_RUNTIME(pst_cur_bss->ul_time_stamp, ul_now) > ul_timeout) { pst_cur_bss->ul_time_stamp = ul_now; pst_cur_bss->us_count = 1; /*漫游黑名单,以后有用*/ if(ROAM_BLACKLIST_TYPE_REJECT_AP == list_type) { pst_cur_bss->ul_timeout = ROAM_BLACKLIST_REJECT_AP_TIME_OUT; } } else { pst_cur_bss->us_count++; if(pst_cur_bss->us_count == pst_cur_bss->us_count_limit) { pst_cur_bss->ul_time_stamp = ul_now; OAM_WARNING_LOG4(0, OAM_SF_ROAM,"{hmac_roam_alg_add_bsslist:: add new, [%02X:XX:XX:%02X:%02X:%02X]}", pst_cur_bss->auc_bssid[0],pst_cur_bss->auc_bssid[3],pst_cur_bss->auc_bssid[4],pst_cur_bss->auc_bssid[5]); } } return OAL_SUCC; } /* 记录第一个空记录 */ if (OAL_PTR_NULL != pst_zero_bss) { continue; } if (0 == oal_compare_mac_addr(pst_cur_bss->auc_bssid, auc_mac_zero)) { pst_zero_bss = pst_cur_bss; continue; } /* 记录一个非空最老记录 */ if (OAL_PTR_NULL == pst_oldest_bss) { pst_oldest_bss = pst_cur_bss; } else { if (OAL_TIME_GET_RUNTIME(pst_cur_bss->ul_time_stamp, ul_now) > OAL_TIME_GET_RUNTIME(pst_oldest_bss->ul_time_stamp, ul_now)) { pst_oldest_bss = pst_cur_bss; } } } if (OAL_PTR_NULL == pst_zero_bss) { pst_zero_bss = pst_oldest_bss; } if (OAL_PTR_NULL != pst_zero_bss) { oal_set_mac_addr(pst_zero_bss->auc_bssid, puc_bssid); pst_zero_bss->ul_time_stamp = ul_now; pst_zero_bss->us_count = 1; return OAL_SUCC; } return OAL_FAIL; }