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;