Added the code that handles the result code of a request.

This commit is contained in:
vemax78
2013-08-11 18:38:23 +02:00
parent b15e0148b2
commit 7ddb32d217
16 changed files with 448 additions and 133 deletions

View File

@ -208,32 +208,32 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
/* Get type and length */
rxmngpacket->readerpacketallowed = sizeof(struct capwap_message_element);
if (rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &type) != sizeof(uint16_t)) {
/* TODO */
return 1;
return INVALID_MESSAGE_ELEMENT;
}
if (rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &msglength) != sizeof(uint16_t)) {
/* TODO */
return 1;
}
/* Check length */
if (msglength > bodylength) {
/* TODO */
return 1;
/* Check type */
if (!IS_VALID_MESSAGE_ELEMENTS(type)) {
return UNRECOGNIZED_MESSAGE_ELEMENT;
}
/* Check binding */
if (IS_80211_MESSAGE_ELEMENTS(type) && (binding != CAPWAP_WIRELESS_BINDING_IEEE80211)) {
/* TODO */
return 1;
return UNRECOGNIZED_MESSAGE_ELEMENT;
}
if (rxmngpacket->read_ops.read_u16((capwap_message_elements_handle)rxmngpacket, &msglength) != sizeof(uint16_t)) {
return INVALID_MESSAGE_ELEMENT;
}
/* Check length */
if (msglength > bodylength) {
return INVALID_MESSAGE_ELEMENT;
}
/* Reader function */
read_ops = capwap_get_message_element_ops(type);
if (!read_ops) {
/* TODO */
return 1;
return INVALID_MESSAGE_ELEMENT;
}
/* Allowed to parsing only the size of message element */
@ -245,7 +245,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
if (category == CAPWAP_MESSAGE_ELEMENT_SINGLE) {
/* Check for multiple message element */
if (itemlist) {
return 1;
return INVALID_MESSAGE_ELEMENT;
}
/* Create new message element */
@ -256,7 +256,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
messageelement->data = read_ops->parsing_message_element((capwap_message_elements_handle)rxmngpacket, &rxmngpacket->read_ops);
if (!messageelement->data) {
capwap_itemlist_free(itemlist);
return 1;
return INVALID_MESSAGE_ELEMENT;
}
/* */
@ -285,7 +285,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
/* Get message element */
datamsgelement = read_ops->parsing_message_element((capwap_message_elements_handle)rxmngpacket, &rxmngpacket->read_ops);
if (!datamsgelement) {
return 1;
return INVALID_MESSAGE_ELEMENT;
}
/* */
@ -294,8 +294,7 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
/* Check if read all data of message element */
if (rxmngpacket->readerpacketallowed) {
/* TODO */
return 1;
return INVALID_MESSAGE_ELEMENT;
}
/* */
@ -316,15 +315,13 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
/* Check length */
if ((msglength + sizeof(struct capwap_message_element)) != bodylength) {
/* TODO */
return 1;
return INVALID_MESSAGE_ELEMENT;
}
/* Allowed to parsing only the size of message element */
rxmngpacket->readerpacketallowed = msglength;
if (type != CAPWAP_ELEMENT_SESSIONID) {
/* TODO */
return 1;
return UNRECOGNIZED_MESSAGE_ELEMENT;
}
/* Retrieve session id */
@ -336,19 +333,20 @@ int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap
messageelement->data = read_ops->parsing_message_element((capwap_message_elements_handle)rxmngpacket, &rxmngpacket->read_ops);
if (!messageelement->data) {
capwap_itemlist_free(itemlist);
return 1;
return INVALID_MESSAGE_ELEMENT;
}
/* */
capwap_itemlist_insert_after(packet->messages, NULL, itemlist);
}
return 0;
return PARSING_COMPLETE;
}
/* */
int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct capwap_array* returnedmessage) {
unsigned short binding;
struct capwap_resultcode_element* resultcode;
ASSERT(packet != NULL);
ASSERT(packet->rxmngpacket != NULL);
@ -390,6 +388,12 @@ int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct ca
}
}
/* Check if packet contains Result Code with Error Message */
resultcode = (struct capwap_resultcode_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_RESULTCODE);
if (resultcode && !CAPWAP_RESULTCODE_OK(resultcode->code)) {
return 0;
}
break;
}
@ -433,6 +437,12 @@ int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct ca
}
}
/* Check if packet contains Result Code with Error Message */
resultcode = (struct capwap_resultcode_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_RESULTCODE);
if (resultcode && !CAPWAP_RESULTCODE_OK(resultcode->code)) {
return 0;
}
break;
}
@ -464,6 +474,12 @@ int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct ca
return 0;
}
/* Check if packet contains Result Code with Error Message */
resultcode = (struct capwap_resultcode_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_RESULTCODE);
if (resultcode && !CAPWAP_RESULTCODE_OK(resultcode->code)) {
return 0;
}
break;
}
@ -592,6 +608,12 @@ int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct ca
}
}
/* Check if packet contains Result Code with Error Message */
resultcode = (struct capwap_resultcode_element*)capwap_get_message_element_data(packet, CAPWAP_ELEMENT_RESULTCODE);
if (resultcode && !CAPWAP_RESULTCODE_OK(resultcode->code)) {
return 0;
}
break;
}

View File

@ -129,6 +129,11 @@ struct capwap_parsed_packet {
struct capwap_list* messages;
};
/* */
#define PARSING_COMPLETE 0
#define UNRECOGNIZED_MESSAGE_ELEMENT 1
#define INVALID_MESSAGE_ELEMENT 2
int capwap_parsing_packet(struct capwap_packet_rxmng* rxmngpacket, struct capwap_connection* connection, struct capwap_parsed_packet* packet);
int capwap_validate_parsed_packet(struct capwap_parsed_packet* packet, struct capwap_array* returnedmessage);
void capwap_free_parsed_packet(struct capwap_parsed_packet* packet);

View File

@ -28,7 +28,9 @@
#define CAPWAP_RESULTCODE_FAILURE_UNRECOGNIZED_MESSAGE_ELEMENT 21
#define CAPWAP_RESULTCODE_DATA_TRANSFER_ERROR 22
#define CAPWAP_RESULTCODE_LAST 22
#define CAPWAP_RESULTCODE_OK(x) (((x) == CAPWAP_RESULTCODE_SUCCESS) || ((x) == CAPWAP_RESULTCODE_SUCCESS_NAT_DETECTED))
struct capwap_resultcode_element {
uint32_t code;
};

View File

@ -210,4 +210,7 @@ struct capwap_macaddress_eui64 {
#define CAPWAP_80211_MESSAGE_ELEMENTS_COUNT ((CAPWAP_80211_MESSAGE_ELEMENTS_STOP - CAPWAP_80211_MESSAGE_ELEMENTS_START) + 1)
#define IS_80211_MESSAGE_ELEMENTS(x) (((x >= CAPWAP_80211_MESSAGE_ELEMENTS_START) && (x <= CAPWAP_80211_MESSAGE_ELEMENTS_STOP)) ? 1 : 0)
/* */
#define IS_VALID_MESSAGE_ELEMENTS(x) (IS_MESSAGE_ELEMENTS(x) || IS_80211_MESSAGE_ELEMENTS(x))
#endif /* __CAPWAP_RFC_HEADER__ */