diff --git a/src/agent_map.c b/src/agent_map.c index 70c3c0893587c4e7d29cffbc71ea9db9bed80466..6465cefd8117b2a781d04263c5712058010a9f83 100644 --- a/src/agent_map.c +++ b/src/agent_map.c @@ -6033,6 +6033,7 @@ int handle_cac_request(void *agent, struct cmdu_buff *cmdu, struct node *n) for (i = 0; i < cac_request->num_radio; i++) { enum wifi_cac_method method; + int ctrl_channel; enum wifi_bw bw; uint32_t cac_time; int cac_method; @@ -6063,11 +6064,9 @@ int handle_cac_request(void *agent, struct cmdu_buff *cmdu, struct node *n) } /* Check if CAC ongoing */ - if (re->cac_request.channel) { - /* Already ongoing */ - if (re->cac_request.channel == channel && - re->cac_request.opclass == opclass) - continue; + if (re->cac_request.channel && + (re->cac_request.channel != channel || + re->cac_request.opclass != opclass)) { /* Controller should first stop ongoing request */ re->cac_request.report_failed = true; @@ -6087,19 +6086,20 @@ int handle_cac_request(void *agent, struct cmdu_buff *cmdu, struct node *n) switch (opclass) { case 128: case 130: - channel -= 6; + ctrl_channel = channel - 6; break; case 129: - channel -= 14; + ctrl_channel = channel - 14; break; default: + ctrl_channel = channel; break; } - re->cac_request.ctrl_channel = channel; + re->cac_request.ctrl_channel = ctrl_channel; /* Check if CAC required */ - if (!wifi_opclass_cac_required(&re->opclass, channel, get_op_class_bw(opclass), &cac_time)) { + if (!wifi_opclass_cac_required(&re->opclass, ctrl_channel, get_op_class_bw(opclass), &cac_time)) { re->cac_request.report_failed = true; re->cac_request.report_failed_channel = channel; re->cac_request.report_failed_opclass = opclass; @@ -6111,7 +6111,7 @@ int handle_cac_request(void *agent, struct cmdu_buff *cmdu, struct node *n) } /* Finally run CAC */ - ret = wifi_start_cac(re->name, channel, bw, method); + ret = wifi_start_cac(re->name, ctrl_channel, bw, method); if (ret) { re->cac_request.report_failed = true; re->cac_request.report_failed_channel = channel; @@ -6120,6 +6120,7 @@ int handle_cac_request(void *agent, struct cmdu_buff *cmdu, struct node *n) re->cac_request.channel = 0; re->cac_request.opclass = 0; timer_set(&re->preference_report_timer, 0); + continue; } /* Check cac time */ diff --git a/src/agent_tlv.c b/src/agent_tlv.c index 808efee469aa96225eca8c3da6dadee617eea1b8..a45236950d24a7c87b0125e0d9b9ac27f810bfaf 100644 --- a/src/agent_tlv.c +++ b/src/agent_tlv.c @@ -944,8 +944,8 @@ int agent_gen_cac_complete_report(struct agent *a, struct cmdu_buff *frm) if (re->cac_request.report_failed) { memcpy(&t->data[offset], re->macaddr, 6); /* radio id */ offset += 6; - t->data[offset++] = re->cac_request.report_failed_channel; t->data[offset++] = re->cac_request.report_failed_opclass; + t->data[offset++] = re->cac_request.report_failed_channel; t->data[offset++] = re->cac_request.report_failed_status; t->data[offset++] = 0; @@ -962,8 +962,8 @@ int agent_gen_cac_complete_report(struct agent *a, struct cmdu_buff *frm) if (WARN_ON(!channel)) { memcpy(&t->data[offset], re->macaddr, 6); /* radio id */ offset += 6; - t->data[offset++] = re->cac_request.channel; t->data[offset++] = re->cac_request.opclass; + t->data[offset++] = re->cac_request.channel; t->data[offset++] = CAC_COMP_REPORT_STATUS_NON_CONFORMANT; t->data[offset++] = 0; @@ -987,8 +987,8 @@ int agent_gen_cac_complete_report(struct agent *a, struct cmdu_buff *frm) case WIFI_RADIO_OPCLASS_CHANNEL_DFS_AVAILABLE: memcpy(&t->data[offset], re->macaddr, 6); /* radio id */ offset += 6; - t->data[offset++] = re->cac_request.channel; t->data[offset++] = re->cac_request.opclass; + t->data[offset++] = re->cac_request.channel; t->data[offset++] = CAC_COMP_REPORT_STATUS_SUCCESSFUL; t->data[offset++] = 0; @@ -1000,8 +1000,8 @@ int agent_gen_cac_complete_report(struct agent *a, struct cmdu_buff *frm) case WIFI_RADIO_OPCLASS_CHANNEL_DFS_NOP: memcpy(&t->data[offset], re->macaddr, 6); /* radio id */ offset += 6; - t->data[offset++] = re->cac_request.channel; t->data[offset++] = re->cac_request.opclass; + t->data[offset++] = re->cac_request.channel; t->data[offset++] = CAC_COMP_REPORT_STATUS_RADAR_DETECTED;