while (switch_retry_num < SWITCH_RETRY && p1p2) // 最大尝试次数为3
{
// 打印各信道对应index
MON_CHAN_UTIL check_data = {0};
best_chan_idx = cap_indices_prim[switch_ch_num];
best_chan_num = radio_region_chanIndex2Num(rid, best_chan_idx + 1);
max_capacity_prim = channel_capacity_prim[best_chan_idx];
/*
if ((wkChanNum_idx / chan_flag) == (best_chan_idx / chan_flag) || is_dfs_ch(best_chan_num)) // 次信道和dfs信道不做切换考虑
{
switch_ch_num++;
continue;
}
*/
if ((wkChanNum_idx) == (best_chan_idx) || is_dfs_ch(rid,best_chan_num)) // 本信道和dfs信道不做切换考虑
{
dfs_flag++;
switch_ch_num++;
continue;
}
CH_DEPLOY_TEST("最佳信道:%d (容量:%f)", best_chan_num, max_capacity_prim);
CH_DEPLOY_TEST("第%d次切换尝试,从信道%d执行信道切换到%d", switch_retry_num + 1, wkChanNum, best_chan_num);
// max_capacity = max_capacity * probability_decision(work_capacity)*using_probability_decision(work_using_20s);
if (switch_decision(best_chan_idx, max_capacity_prim, work_capacity, switch_threshold * switch_param))
{
api_widsWipsSetScan(rid, best_chan_num, &check_data);
double refresh_cap = compute_instant_capacity_bk(check_data);
channel_capacity[best_chan_idx] = cap_calculate(channel_capacity[best_chan_idx], refresh_cap); // 更新20Mhz信道扫描结果
for (int i = 0; i < chan_flag; i++) // 更新大带宽信道扫描结果
{
channel_capacity_prim[best_chan_idx / chan_flag * chan_flag + i] = primary_cap_calculate(channel_capacity, chan_flag, best_chan_idx / chan_flag * chan_flag + i); // 邻居信道如何更新?
}
max_capacity_prim = channel_capacity_prim[best_chan_idx];
/* 是否需要重新排序?现有的这个逻辑无法避开自身信道
qsort(cap_indices_prim, CH_NUM, sizeof(int), compare_cap);
best_chan_idx = cap_indices_prim[0];
max_capacity_prim = channel_capacity_prim[best_chan_idx];
*/
if (switch_decision(best_chan_idx, max_capacity_prim, work_capacity, switch_threshold * switch_param))
{
int max_capacity = 0;
for (int i = 0; i < chan_flag; i++) // 选择宽带内最优20Mhz信道
{
if (channel_capacity[best_chan_idx / chan_flag * chan_flag + i] > max_capacity)
{
max_capacity = channel_capacity[best_chan_idx / chan_flag * chan_flag + i];
best_chan_idx = best_chan_idx / chan_flag * chan_flag + i;
CH_DEPLOY_TEST("信道%d容量:%f", best_chan_num, channel_capacity[best_chan_idx]);
}
}
CH_DEPLOY_TEST("信道%d背景扫描结果符合切换预期", best_chan_num);
//api_wlan_setChannelAndWidthForCSA_CHDP(rid, best_chan_num,width);
// usleep(SWITCHING_TIMEOUT);
last_switch_time = time(NULL);
// current_working_ch = best_chan_idx;
switch_flag = 1;
break;
}
else
{
// CH_DEPLOY_TEST("信道%d背景扫描偏差较大,信道切换终止",radio_region_chanIndex2Num(rid,channel_index));
CH_DEPLOY_TEST("信道%d背景扫描结果不符合切换预期,信道切换终止,刷新背景信道结果", best_chan_num);
}
}
else
{
CH_DEPLOY_TEST("未触发信道切换。");
break;
}
switch_ch_num++;
switch_retry_num++;
}
//触发DFS信道选择条件:5Ghz;未触发信道切换;有剩余重评估次数;有高容量DFS信道;工作容量低
switch_ch_num = 0;
while((1 == rid) && switch_retry_num < SWITCH_RETRY && p1p2 && dfs_flag && !switch_flag && work_capacity < 50)
{
// 打印各信道对应index
CH_DEPLOY_TEST("有高容量DFS信道,进入切换备选");
dfs_flag --;
MON_CHAN_UTIL dfs_check_data = {0};
best_chan_idx = cap_indices_prim[switch_ch_num];
best_chan_num = radio_region_chanIndex2Num(rid, best_chan_idx + 1);
max_capacity_prim = channel_capacity_prim[best_chan_idx];
if ((wkChanNum_idx) == (best_chan_idx) || !is_dfs_ch(rid,best_chan_num) || is_wradar_ch(rid,best_chan_num)) // 过滤非dfs信道和天气雷达信道
{
switch_ch_num++;
continue;
}
CH_DEPLOY_TEST("最佳dfs信道:%d (容量:%f)", best_chan_num, max_capacity_prim);
CH_DEPLOY_TEST("第%d次切换尝试,从信道%d执行信道切换到DFS信道%d", switch_retry_num + 1, wkChanNum, best_chan_num);
// max_capacity = max_capacity * probability_decision(work_capacity)*using_probability_decision(work_using_20s);
if (switch_decision(best_chan_idx, max_capacity_prim, work_capacity, switch_threshold * switch_param))
{
api_widsWipsSetScan(rid, best_chan_num, &dfs_check_data);
double refresh_cap = compute_instant_capacity_bk(dfs_check_data);
channel_capacity[best_chan_idx] = cap_calculate(channel_capacity[best_chan_idx], refresh_cap); // 更新20Mhz信道扫描结果
for (int i = 0; i < chan_flag; i++) // 更新大带宽信道扫描结果
{
channel_capacity_prim[best_chan_idx / chan_flag * chan_flag + i] = primary_cap_calculate(channel_capacity, chan_flag, best_chan_idx / chan_flag * chan_flag + i); // 邻居信道如何更新?
}
max_capacity_prim = channel_capacity_prim[best_chan_idx];
if (switch_decision(best_chan_idx, max_capacity_prim, work_capacity, switch_threshold * switch_param))
{
int max_capacity = 0;
for (int i = 0; i < chan_flag; i++) // 选择宽带内最优20Mhz信道
{
if (channel_capacity[best_chan_idx / chan_flag * chan_flag + i] > max_capacity)
{
max_capacity = channel_capacity[best_chan_idx / chan_flag * chan_flag + i];
best_chan_idx = best_chan_idx / chan_flag * chan_flag + i;
CH_DEPLOY_TEST("信道%d容量:%f", best_chan_num, channel_capacity[best_chan_idx]);
}
}
CH_DEPLOY_TEST("DFS信道%d背景扫描结果符合切换预期", best_chan_num);
api_wlan_setChannelAndWidthForCSA_CHDP(rid, best_chan_num,width);
// usleep(SWITCHING_TIMEOUT);
last_switch_time = time(NULL);
// current_working_ch = best_chan_idx;
switch_flag = 1;
break;
}
else
{
// CH_DEPLOY_TEST("信道%d背景扫描偏差较大,信道切换终止",radio_region_chanIndex2Num(rid,channel_index));
CH_DEPLOY_TEST("DFS信道%d背景扫描结果不符合切换预期,信道切换终止,刷新背景信道结果", best_chan_num);
}
}
else
{
CH_DEPLOY_TEST("未触发dfs信道切换。");
break;
}
switch_ch_num++;
switch_retry_num++;
}
}
else
{
CH_DEPLOY_TEST("未触发切换决策");
}
这段代码由两个非常相似的部分组成,能否合为一个?
最新发布