rework overly deep if statement in wtp_dfa_run

This commit is contained in:
Andreas Schultz 2016-03-26 20:28:32 +01:00
parent 73afba9a6d
commit 7eddb74767
1 changed files with 172 additions and 153 deletions

View File

@ -63,42 +63,51 @@ static int receive_echo_response(struct capwap_parsed_packet* packet) {
static void receive_reset_request(struct capwap_parsed_packet* packet) static void receive_reset_request(struct capwap_parsed_packet* packet)
{ {
unsigned short binding; unsigned short binding;
struct capwap_header_data capwapheader;
struct capwap_packet_txmng* txmngpacket;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_SUCCESS };
ASSERT(packet != NULL); ASSERT(packet != NULL);
/* */ /* */
binding = GET_WBID_HEADER(packet->rxmngpacket->header); binding = GET_WBID_HEADER(packet->rxmngpacket->header);
if ((binding == g_wtp.binding) && IS_SEQUENCE_SMALLER(g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq)) { if (binding != g_wtp.binding) {
struct capwap_header_data capwapheader; capwap_logging_debug("Reset Request for invalid binding");
struct capwap_packet_txmng* txmngpacket; return;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_SUCCESS }; }
/* Build packet */ if (!IS_SEQUENCE_SMALLER(g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq)) {
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, g_wtp.binding); capwap_logging_debug("Reset Request with invalid sequence (%d < %d)",
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_RESET_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, g_wtp.mtu); g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq);
return;
}
/* Add message element */ /* Build packet */
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode); capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, g_wtp.binding);
/* CAPWAP_ELEMENT_VENDORPAYLOAD */ /* TODO */ txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader,
CAPWAP_RESET_RESPONSE,
packet->rxmngpacket->ctrlmsg.seq, g_wtp.mtu);
/* Reset response complete, get fragment packets */ /* Add message element */
wtp_free_reference_last_response(); capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
capwap_packet_txmng_get_fragment_packets(txmngpacket, g_wtp.responsefragmentpacket, g_wtp.fragmentid); /* CAPWAP_ELEMENT_VENDORPAYLOAD */ /* TODO */
if (g_wtp.responsefragmentpacket->count > 1) {
g_wtp.fragmentid++;
}
/* Free packets manager */ /* Reset response complete, get fragment packets */
capwap_packet_txmng_free(txmngpacket); wtp_free_reference_last_response();
capwap_packet_txmng_get_fragment_packets(txmngpacket, g_wtp.responsefragmentpacket, g_wtp.fragmentid);
if (g_wtp.responsefragmentpacket->count > 1)
g_wtp.fragmentid++;
/* Save remote sequence number */ /* Free packets manager */
g_wtp.remotetype = packet->rxmngpacket->ctrlmsg.type; capwap_packet_txmng_free(txmngpacket);
g_wtp.remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
/* Send Reset response to AC */ /* Save remote sequence number */
if (!capwap_crypt_sendto_fragmentpacket(&g_wtp.dtls, g_wtp.responsefragmentpacket)) { g_wtp.remotetype = packet->rxmngpacket->ctrlmsg.type;
capwap_logging_debug("Warning: error to send reset response packet"); g_wtp.remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
}
/* Send Reset response to AC */
if (!capwap_crypt_sendto_fragmentpacket(&g_wtp.dtls, g_wtp.responsefragmentpacket)) {
capwap_logging_debug("Warning: error to send reset response packet");
} }
} }
@ -106,49 +115,58 @@ static void receive_reset_request(struct capwap_parsed_packet* packet)
static void receive_station_configuration_request(struct capwap_parsed_packet* packet) static void receive_station_configuration_request(struct capwap_parsed_packet* packet)
{ {
unsigned short binding; unsigned short binding;
struct capwap_header_data capwapheader;
struct capwap_packet_txmng* txmngpacket;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE };
ASSERT(packet != NULL); ASSERT(packet != NULL);
/* */ /* */
binding = GET_WBID_HEADER(packet->rxmngpacket->header); binding = GET_WBID_HEADER(packet->rxmngpacket->header);
if ((binding == g_wtp.binding) && IS_SEQUENCE_SMALLER(g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq)) { if (binding != g_wtp.binding) {
struct capwap_header_data capwapheader; capwap_logging_debug("Station Configuration Request for invalid binding");
struct capwap_packet_txmng* txmngpacket; return;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE }; }
/* Parsing request message */ if (!IS_SEQUENCE_SMALLER(g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq)) {
if (capwap_get_message_element(packet, CAPWAP_ELEMENT_ADDSTATION)) { capwap_logging_debug("Station Configuration Request with invalid sequence (%d < %d)",
resultcode.code = wtp_radio_add_station(packet); g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq);
} else if (capwap_get_message_element(packet, CAPWAP_ELEMENT_DELETESTATION)) { return;
resultcode.code = wtp_radio_delete_station(packet); }
}
/* Build packet */ /* Parsing request message */
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, g_wtp.binding); if (capwap_get_message_element(packet, CAPWAP_ELEMENT_ADDSTATION)) {
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_STATION_CONFIGURATION_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, g_wtp.mtu); resultcode.code = wtp_radio_add_station(packet);
} else if (capwap_get_message_element(packet, CAPWAP_ELEMENT_DELETESTATION)) {
resultcode.code = wtp_radio_delete_station(packet);
}
/* Add message element */ /* Build packet */
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode); capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, g_wtp.binding);
/* CAPWAP_ELEMENT_VENDORPAYLOAD */ /* TODO */ txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader,
CAPWAP_STATION_CONFIGURATION_RESPONSE,
packet->rxmngpacket->ctrlmsg.seq, g_wtp.mtu);
/* Station Configuration response complete, get fragment packets */ /* Add message element */
wtp_free_reference_last_response(); capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
capwap_packet_txmng_get_fragment_packets(txmngpacket, g_wtp.responsefragmentpacket, g_wtp.fragmentid); /* CAPWAP_ELEMENT_VENDORPAYLOAD */ /* TODO */
if (g_wtp.responsefragmentpacket->count > 1) {
g_wtp.fragmentid++;
}
/* Free packets manager */ /* Station Configuration response complete, get fragment packets */
capwap_packet_txmng_free(txmngpacket); wtp_free_reference_last_response();
capwap_packet_txmng_get_fragment_packets(txmngpacket, g_wtp.responsefragmentpacket, g_wtp.fragmentid);
if (g_wtp.responsefragmentpacket->count > 1)
g_wtp.fragmentid++;
/* Save remote sequence number */ /* Free packets manager */
g_wtp.remotetype = packet->rxmngpacket->ctrlmsg.type; capwap_packet_txmng_free(txmngpacket);
g_wtp.remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
/* Send Station Configuration response to AC */ /* Save remote sequence number */
if (!capwap_crypt_sendto_fragmentpacket(&g_wtp.dtls, g_wtp.responsefragmentpacket)) { g_wtp.remotetype = packet->rxmngpacket->ctrlmsg.type;
capwap_logging_debug("Warning: error to send Station Configuration response packet"); g_wtp.remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
}
/* Send Station Configuration response to AC */
if (!capwap_crypt_sendto_fragmentpacket(&g_wtp.dtls, g_wtp.responsefragmentpacket)) {
capwap_logging_debug("Warning: error to send Station Configuration response packet");
} }
} }
@ -156,60 +174,69 @@ static void receive_station_configuration_request(struct capwap_parsed_packet* p
static void receive_ieee80211_wlan_configuration_request(struct capwap_parsed_packet* packet) static void receive_ieee80211_wlan_configuration_request(struct capwap_parsed_packet* packet)
{ {
unsigned short binding; unsigned short binding;
struct capwap_message_element_id action = {0, 0};
struct capwap_header_data capwapheader;
struct capwap_packet_txmng* txmngpacket;
struct capwap_80211_assignbssid_element bssid;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE };
ASSERT(packet != NULL); ASSERT(packet != NULL);
/* */ /* */
binding = GET_WBID_HEADER(packet->rxmngpacket->header); binding = GET_WBID_HEADER(packet->rxmngpacket->header);
if ((binding == g_wtp.binding) && IS_SEQUENCE_SMALLER(g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq)) { if (binding != g_wtp.binding) {
struct capwap_message_element_id action = {0, 0}; capwap_logging_debug("IEEE 802.11 WLAN Configuration Request for invalid binding");
struct capwap_header_data capwapheader; return;
struct capwap_packet_txmng* txmngpacket; }
struct capwap_80211_assignbssid_element bssid;
struct capwap_resultcode_element resultcode = { .code = CAPWAP_RESULTCODE_FAILURE };
/* Parsing request message */ if (!IS_SEQUENCE_SMALLER(g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq)) {
if (capwap_get_message_element(packet, CAPWAP_ELEMENT_80211_ADD_WLAN)) { capwap_logging_debug("IEEE 802.11 WLAN Configuration Request with invalid sequence (%d < %d)",
action = CAPWAP_ELEMENT_80211_ADD_WLAN; g_wtp.remoteseqnumber, packet->rxmngpacket->ctrlmsg.seq);
resultcode.code = wtp_radio_create_wlan(packet, &bssid); return;
} else if (capwap_get_message_element(packet, CAPWAP_ELEMENT_80211_UPDATE_WLAN)) { }
action = CAPWAP_ELEMENT_80211_UPDATE_WLAN;
resultcode.code = wtp_radio_update_wlan(packet);
} else if (capwap_get_message_element(packet, CAPWAP_ELEMENT_80211_DELETE_WLAN)) {
action = CAPWAP_ELEMENT_80211_DELETE_WLAN;
resultcode.code = wtp_radio_delete_wlan(packet);
}
/* Build packet */ /* Parsing request message */
capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, g_wtp.binding); if (capwap_get_message_element(packet, CAPWAP_ELEMENT_80211_ADD_WLAN)) {
txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader, CAPWAP_IEEE80211_WLAN_CONFIGURATION_RESPONSE, packet->rxmngpacket->ctrlmsg.seq, g_wtp.mtu); action = CAPWAP_ELEMENT_80211_ADD_WLAN;
resultcode.code = wtp_radio_create_wlan(packet, &bssid);
} else if (capwap_get_message_element(packet, CAPWAP_ELEMENT_80211_UPDATE_WLAN)) {
action = CAPWAP_ELEMENT_80211_UPDATE_WLAN;
resultcode.code = wtp_radio_update_wlan(packet);
} else if (capwap_get_message_element(packet, CAPWAP_ELEMENT_80211_DELETE_WLAN)) {
action = CAPWAP_ELEMENT_80211_DELETE_WLAN;
resultcode.code = wtp_radio_delete_wlan(packet);
}
/* Add message element */ /* Build packet */
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode); capwap_header_init(&capwapheader, CAPWAP_RADIOID_NONE, g_wtp.binding);
if (resultcode.code == CAPWAP_RESULTCODE_SUCCESS && txmngpacket = capwap_packet_txmng_create_ctrl_message(&capwapheader,
memcmp(&action, &CAPWAP_ELEMENT_80211_ADD_WLAN, sizeof(CAPWAP_ELEMENT_80211_ADD_WLAN)) == 0) CAPWAP_IEEE80211_WLAN_CONFIGURATION_RESPONSE,
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_ASSIGN_BSSID, &bssid); packet->rxmngpacket->ctrlmsg.seq, g_wtp.mtu);
/* CAPWAP_ELEMENT_VENDORPAYLOAD */ /* TODO */ /* Add message element */
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_RESULTCODE, &resultcode);
if (resultcode.code == CAPWAP_RESULTCODE_SUCCESS &&
memcmp(&action, &CAPWAP_ELEMENT_80211_ADD_WLAN, sizeof(CAPWAP_ELEMENT_80211_ADD_WLAN)) == 0)
capwap_packet_txmng_add_message_element(txmngpacket, CAPWAP_ELEMENT_80211_ASSIGN_BSSID, &bssid);
/* IEEE802.11 WLAN Configuration response complete, get fragment packets */ /* CAPWAP_ELEMENT_VENDORPAYLOAD */ /* TODO */
wtp_free_reference_last_response();
capwap_packet_txmng_get_fragment_packets(txmngpacket, g_wtp.responsefragmentpacket, g_wtp.fragmentid);
if (g_wtp.responsefragmentpacket->count > 1) {
g_wtp.fragmentid++;
}
/* Free packets manager */ /* IEEE802.11 WLAN Configuration response complete, get fragment packets */
capwap_packet_txmng_free(txmngpacket); wtp_free_reference_last_response();
capwap_packet_txmng_get_fragment_packets(txmngpacket, g_wtp.responsefragmentpacket, g_wtp.fragmentid);
if (g_wtp.responsefragmentpacket->count > 1)
g_wtp.fragmentid++;
/* Save remote sequence number */ /* Free packets manager */
g_wtp.remotetype = packet->rxmngpacket->ctrlmsg.type; capwap_packet_txmng_free(txmngpacket);
g_wtp.remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
/* Send IEEE802.11 WLAN Configuration response to AC */ /* Save remote sequence number */
if (!capwap_crypt_sendto_fragmentpacket(&g_wtp.dtls, g_wtp.responsefragmentpacket)) { g_wtp.remotetype = packet->rxmngpacket->ctrlmsg.type;
capwap_logging_debug("Warning: error to send IEEE802.11 WLAN Configuration response packet"); g_wtp.remoteseqnumber = packet->rxmngpacket->ctrlmsg.seq;
}
/* Send IEEE802.11 WLAN Configuration response to AC */
if (!capwap_crypt_sendto_fragmentpacket(&g_wtp.dtls, g_wtp.responsefragmentpacket)) {
capwap_logging_debug("Warning: error to send IEEE802.11 WLAN Configuration response packet");
} }
} }
@ -285,70 +312,62 @@ void wtp_dfa_state_run(struct capwap_parsed_packet* packet)
{ {
ASSERT(packet != NULL); ASSERT(packet != NULL);
if (capwap_is_request_type(packet->rxmngpacket->ctrlmsg.type) || (g_wtp.localseqnumber == packet->rxmngpacket->ctrlmsg.seq)) { if (!capwap_is_request_type(packet->rxmngpacket->ctrlmsg.type) &&
/* Update sequence */ g_wtp.localseqnumber != packet->rxmngpacket->ctrlmsg.seq)
if (!capwap_is_request_type(packet->rxmngpacket->ctrlmsg.type)) { return;
g_wtp.localseqnumber++;
/* Update sequence */
if (!capwap_is_request_type(packet->rxmngpacket->ctrlmsg.type))
g_wtp.localseqnumber++;
/* Parsing message */
switch (packet->rxmngpacket->ctrlmsg.type) {
case CAPWAP_CONFIGURATION_UPDATE_REQUEST:
/* TODO */
break;
case CAPWAP_CHANGE_STATE_EVENT_RESPONSE:
/* TODO */
break;
case CAPWAP_ECHO_RESPONSE:
if (!receive_echo_response(packet)) {
capwap_logging_debug("Receive Echo Response");
capwap_timeout_unset(g_wtp.timeout, g_wtp.idtimercontrol);
capwap_timeout_set(g_wtp.timeout, g_wtp.idtimerecho, g_wtp.echointerval,
wtp_dfa_state_run_echo_timeout, NULL, NULL);
} }
/* Parsing message */ break;
switch (packet->rxmngpacket->ctrlmsg.type) {
case CAPWAP_CONFIGURATION_UPDATE_REQUEST: {
/* TODO */
break;
}
case CAPWAP_CHANGE_STATE_EVENT_RESPONSE: { case CAPWAP_CLEAR_CONFIGURATION_REQUEST:
/* TODO */ /* TODO */
break; break;
}
case CAPWAP_ECHO_RESPONSE: { case CAPWAP_WTP_EVENT_RESPONSE:
if (!receive_echo_response(packet)) { /* TODO */
capwap_logging_debug("Receive Echo Response"); break;
capwap_timeout_unset(g_wtp.timeout, g_wtp.idtimercontrol);
capwap_timeout_set(g_wtp.timeout, g_wtp.idtimerecho, g_wtp.echointerval, wtp_dfa_state_run_echo_timeout, NULL, NULL);
}
break; case CAPWAP_DATA_TRANSFER_REQUEST:
} /* TODO */
break;
case CAPWAP_CLEAR_CONFIGURATION_REQUEST: { case CAPWAP_DATA_TRANSFER_RESPONSE:
/* TODO */ /* TODO */
break; break;
}
case CAPWAP_WTP_EVENT_RESPONSE: { case CAPWAP_STATION_CONFIGURATION_REQUEST:
/* TODO */ receive_station_configuration_request(packet);
break; break;
}
case CAPWAP_DATA_TRANSFER_REQUEST: { case CAPWAP_RESET_REQUEST:
/* TODO */ receive_reset_request(packet);
break; wtp_dfa_change_state(CAPWAP_RESET_STATE);
} wtp_dfa_state_reset();
break;
case CAPWAP_DATA_TRANSFER_RESPONSE: { case CAPWAP_IEEE80211_WLAN_CONFIGURATION_REQUEST:
/* TODO */ receive_ieee80211_wlan_configuration_request(packet);
break; break;
}
case CAPWAP_STATION_CONFIGURATION_REQUEST: {
receive_station_configuration_request(packet);
break;
}
case CAPWAP_RESET_REQUEST: {
receive_reset_request(packet);
wtp_dfa_change_state(CAPWAP_RESET_STATE);
wtp_dfa_state_reset();
break;
}
case CAPWAP_IEEE80211_WLAN_CONFIGURATION_REQUEST: {
receive_ieee80211_wlan_configuration_request(packet);
break;
}
}
} }
} }