/***************************************************************************** 函 数 名 : oam_print_to_file 功能描述 : 打印信息到文件中 输入参数 : pc_string : 需要打印到文件中的字符串,以\0结束。 输出参数 : 无 返 回 值 : OAL_SUCC或其他错误码。 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年10月15日 作 者 : c59720 修改内容 : 新生成函数 *****************************************************************************/ oal_uint32 oam_print_to_file(oal_int8 *pc_string) { #ifdef _PRE_WIFI_DMT oal_file_stru *f_file_ret; /* 用于保存写文件后的返回值 */ oal_file_stru *f_event_file; oal_int32 l_rslt; if (OAL_UNLIKELY(OAL_PTR_NULL == pc_string)) { OAM_IO_PRINTK("null param. \r\n"); return OAL_ERR_CODE_PTR_NULL; } f_event_file = oal_file_open_append(g_st_oam_mng_ctx.ac_file_path); if (OAL_UNLIKELY(OAL_FILE_FAIL == f_event_file)) { OAM_IO_PRINTK("open file failed. \r\n"); return OAL_ERR_CODE_OPEN_FILE_FAIL; } f_file_ret = oal_file_write(f_event_file, pc_string, (OAL_STRLEN(pc_string) + 1)); if (OAL_FILE_FAIL == f_file_ret) { l_rslt = oal_file_close(f_event_file); if (0 != l_rslt) { OAM_IO_PRINTK("close file failed. \r\n"); return OAL_ERR_CODE_CLOSE_FILE_FAIL; } OAM_IO_PRINTK("write file failed. \r\n"); return OAL_ERR_CODE_WRITE_FILE_FAIL; } l_rslt = oal_file_close(f_event_file); if (0 != l_rslt) { OAM_IO_PRINTK("close file failed. \r\n"); return OAL_ERR_CODE_CLOSE_FILE_FAIL; } #endif return OAL_SUCC; }
/***************************************************************************** 函 数 名 : 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; }
/***************************************************************************** 函 数 名 : oam_print_to_sdt 功能描述 : 打印信息到PC侧可维可测工具平台中 输入参数 : pc_string : 需要打印到可维可测工具平台中的字符串,以\0结束。 输出参数 : 无 返 回 值 : OAL_SUCC或其他错误码。 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2012年10月15日 作 者 : c59720 修改内容 : 新生成函数 *****************************************************************************/ oal_uint32 oam_print_to_sdt(oal_int8 *pc_string) { oal_netbuf_stru *pst_skb; oal_uint32 ul_ret = OAL_SUCC; oal_uint16 us_strlen; if (OAL_UNLIKELY(OAL_PTR_NULL == pc_string)) { return OAL_ERR_CODE_PTR_NULL; } if (OAL_UNLIKELY(OAL_PTR_NULL == g_st_oam_sdt_func_hook.p_sdt_report_data_func)) { return OAL_ERR_CODE_PTR_NULL; } /* 上报sdt字符串以'0'结束 */ us_strlen = (oal_uint16)OAL_STRLEN(pc_string); us_strlen = (us_strlen > OAM_REPORT_MAX_STRING_LEN) ? OAM_REPORT_MAX_STRING_LEN : us_strlen; pst_skb = oam_alloc_data2sdt(us_strlen); if (OAL_PTR_NULL == pst_skb) { return OAL_ERR_CODE_PTR_NULL; } /* COPY打印的内容 */ oal_memset(oal_netbuf_data(pst_skb), 0, us_strlen); oal_memcopy(oal_netbuf_data(pst_skb), pc_string, (oal_uint32)us_strlen); /* 下发至sdt接收队列,若队列满则串口输出 */ ul_ret = oam_report_data2sdt(pst_skb, OAM_DATA_TYPE_STRING, OAM_PRIMID_TYPE_OUTPUT_CONTENT); return ul_ret; }
/***************************************************************************** 函 数 名 : 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; }
/***************************************************************************** 函 数 名 : oam_main_init 功能描述 : OAM模块初始化总入口,包含OAM模块内部所有特性的初始化。 输入参数 : 无 输出参数 : 无 返 回 值 : 初始化返回值,成功或失败原因 调用函数 : 无 被调函数 : 无 修改历史 : 1.日 期 : 2012年9月18日 作 者 : 康国昌 修改内容 : 新生成函数 *****************************************************************************/ oal_int32 oam_main_init(oal_void) { oal_uint32 ul_rslt; /* 初始化可维可测试FILE路径 */ ul_rslt = oam_set_file_path(WLAN_OAM_FILE_PATH, (OAL_STRLEN(WLAN_OAM_FILE_PATH) + 1)); if (OAL_SUCC != ul_rslt) { OAL_IO_PRINT("oam_main_init call oam_set_file_path fail %d\n",ul_rslt); OAL_BUG_ON(1); return -OAL_EFAIL; } /* 初始化可维可测输出方式 */ ul_rslt = oam_set_output_type(OAM_OUTPUT_TYPE_SDT); if (OAL_SUCC != ul_rslt) { OAL_IO_PRINT("oam_main_init call oam_set_output_type fail %d\n",ul_rslt); OAL_BUG_ON(1); return -OAL_EFAIL; } /* 完成LOG模块的初始化操作 */ ul_rslt = oam_log_init(); if (OAL_SUCC != ul_rslt) { OAL_IO_PRINT("oam_main_init call oam_log_init fail %d\n",ul_rslt); OAL_BUG_ON(1); return -OAL_EFAIL; } /* 完成EVENT模块的初始化操作 */ ul_rslt = oam_event_init(); if (OAL_SUCC != ul_rslt) { OAL_IO_PRINT("oam_main_init call oam_event_init fail %d\n",ul_rslt); OAL_BUG_ON(1); return -OAL_EFAIL; } /* 初始化5115timer,用于代码中获取高精度时间戳 */ oal_5115timer_init(); #ifdef _PRE_PROFILING_MODE /* 完成PROFILING模块的初始化操作 */ ul_rslt = oam_profiling_init(); if (OAL_SUCC != ul_rslt) { OAL_IO_PRINT("oam_main_init call oam_profiling_init fail %d\n",ul_rslt); OAL_BUG_ON(1); return -OAL_EFAIL; } #endif /* 初始化oam模块的钩子函数 */ oam_drv_func_hook_init(); /* 统计模块初始化 */ oam_statistics_init(); /*TBD,待命令触发定制化初始操作*/ #if 0 /* 从配置文件中获取配置信息,保存到OAM内部结构中 */ for (ul_counter= 0; ul_counter < OM_MODULEID_BUTT; ul_counter++) { if (OAL_PTR_NULL != g_oam_customize.customize_init[ul_counter]) { g_oam_customize.customize_init[ul_counter](); } } #endif #ifdef _PRE_WLAN_DFT_REG oam_reg_init(); #endif #if ((_PRE_OS_VERSION_RAW != _PRE_OS_VERSION) && (_PRE_OS_VERSION_WIN32_RAW != _PRE_OS_VERSION)) /* ??netlink */ #if (_PRE_PRODUCT_ID == _PRE_PRODUCT_ID_HI1151) /* 所用的端口号在系统中已被占用,02无法使用这个接口,需要修改 TBD */ ul_rslt = oam_netlink_kernel_create(); if (OAL_SUCC != ul_rslt) { OAL_IO_PRINT("oam_main_init call oam_netlink_kernel_create fail %d\n",ul_rslt); OAL_BUG_ON(1); return -OAL_EFAIL; } #endif #endif #if (_PRE_PRODUCT_ID == _PRE_PRODUCT_ID_HI1102_HOST) hcc_rx_register(hcc_get_default_handler(),HCC_ACTION_TYPE_OAM,oam_rx_post_action_function,NULL); #endif return OAL_SUCC; }
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; }