From df6ce963ee23b300432c935fe7ef9a3c40b133e7 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Fri, 9 Mar 2018 14:38:21 +0000 Subject: [PATCH] cw_process_elem is good now FossilOrigin-Name: 71fd059171a96310ba664dfe7b34ea5940eaf7f57837751d443d5f4335f38b76 --- libcw.project | 1 + src/ac/wtpman.c | 2 +- src/cw/capwap.h | 2 +- src/cw/capwap_inline.c | 4 ++-- src/cw/conn_process_packet.c | 35 +++++++++++++------------------ src/cw/cw.h | 1 + src/cw/cw_in_check_generic_resp.c | 2 +- src/cw/cw_in_check_join_resp.c | 2 +- src/cw/cw_process_element.c | 23 ++++++++++++++++---- src/cw/cw_result_is_ok.c | 8 +++++++ src/cw/mavl.h | 5 ++++- src/cw/mlist.h | 4 ++++ src/wtp/changestate.c | 2 +- src/wtp/configure.c | 2 +- src/wtp/join.c | 2 +- src/wtp/run.c | 8 +++---- 16 files changed, 64 insertions(+), 39 deletions(-) create mode 100644 src/cw/cw_result_is_ok.c diff --git a/libcw.project b/libcw.project index 73f67ab4..a2e12868 100644 --- a/libcw.project +++ b/libcw.project @@ -324,6 +324,7 @@ + diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index db968e39..ca0fd796 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -546,7 +546,7 @@ static void wtpman_run(void *arg) } } - if (!cw_rcok(rc)) { + if (!cw_result_is_ok(rc)) { cw_dbg(DBG_INFO, "WTP Problem: %s", cw_strrc(rc)); wtpman_remove(wtpman); return; diff --git a/src/cw/capwap.h b/src/cw/capwap.h index 8ecd80df..cfee0ab0 100644 --- a/src/cw/capwap.h +++ b/src/cw/capwap.h @@ -637,7 +637,7 @@ extern struct cw_strlist_elem mbag_item_strings[]; const char * cw_strerror(int rc); -int cw_rcok(int rc); +int cw_result_is_ok(int rc); const char *cw_strelemp_(cw_strheap_t h, int msg_id); diff --git a/src/cw/capwap_inline.c b/src/cw/capwap_inline.c index 6b0a6ae1..624007c4 100644 --- a/src/cw/capwap_inline.c +++ b/src/cw/capwap_inline.c @@ -11,7 +11,7 @@ const char * cw_strerror(int rc) { return cw_strresult(rc); } - +/*( int cw_rcok(int rc) { @@ -20,7 +20,7 @@ int cw_rcok(int rc) } return 0; } - +*/ /** *@defgroup CW CW diff --git a/src/cw/conn_process_packet.c b/src/cw/conn_process_packet.c index f61e1e05..5125843b 100644 --- a/src/cw/conn_process_packet.c +++ b/src/cw/conn_process_packet.c @@ -307,7 +307,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, if (!message){ /* Message is unknown */ - cw_dbg(DBG_MSG_ERR, "Message type %d (%s) unknown.", + cw_dbg(DBG_MSG_ERR, + "Message type %d (%s) unrecognized, sending response.", search.type, cw_strmsg(search.type), cw_strstate(conn->capwap_state)); result_code = CAPWAP_RESULT_MSG_UNRECOGNIZED; @@ -339,8 +340,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, if (!*i){ /* Message found, but it was in wrong state */ cw_dbg(DBG_MSG_ERR, - "Message type %d (%s) not allowed in %s State.", search.type, - cw_strmsg(search.type), cw_strstate(conn->capwap_state)); + "Message type %d (%s) not allowed in %s State, sending response.", + search.type,cw_strmsg(search.type), cw_strstate(conn->capwap_state)); result_code = CAPWAP_RESULT_MSG_INVALID_IN_CURRENT_STATE; cw_send_error_response(conn, rawmsg, result_code); errno = EAGAIN; @@ -367,7 +368,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, /* Create an avltree to catch the found mandatory elements */ conn->mand = stravltree_create(); - int unrecognized = 0; + /* iterate through message elements */ cw_foreach_elem(elem, elems_ptr, elems_len) { @@ -394,9 +395,15 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, params.from=from; params.msgdata=message; - result_code = cw_process_element(¶ms,0,0,elem_id,elem_data,elem_len); //elems_len-(elem-elems_ptr)); + result_code = cw_process_element(¶ms,0,0,elem_id,elem_data,elem_len); + if (cw_result_is_ok(result_code)) + continue; + + + + /* elem_id = cw_get_elem_id(elem); @@ -435,20 +442,6 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, continue; exit(0); - - - as.elem_id = cw_get_elem_id(elem); - /* int elem_len = cw_get_elem_len(elem);*/ - -/* - //cw_elem_handler_t search_eh; - //memset(&search_eh,0,sizeof(search_eh)); -// struct cw_ElemDef search_elem; -// search_elem.handler=&search_eh; - -// search_eh.id = cw_get_elem_id(elem); -*/ - struct cw_ElemDef * elem; @@ -462,7 +455,7 @@ exit(0); af = 0; if (!af) { - unrecognized++; + //unrecognized++; /* cw_dbg(DBG_ELEM_ERR, @@ -530,7 +523,7 @@ exit(0); //int result_code = 0; - +int unrecognized =3; int rct = cw_in_check_generic(conn, afm, rawmsg, len, from); diff --git a/src/cw/cw.h b/src/cw/cw.h index 3dc60380..03736cb3 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -456,6 +456,7 @@ uint8_t *cw_init_data_keep_alive_msg(uint8_t * buffer,uint8_t *rmac); int cw_out_radio_generic(struct conn *conn, struct cw_action_out *a, uint8_t * dst); int cw_put_elem_session_id(uint8_t *dst, uint8_t *session_id, int len); +int cw_result_is_ok( int rc ); /** * @} diff --git a/src/cw/cw_in_check_generic_resp.c b/src/cw/cw_in_check_generic_resp.c index 1581c634..1f98beb1 100644 --- a/src/cw/cw_in_check_generic_resp.c +++ b/src/cw/cw_in_check_generic_resp.c @@ -17,7 +17,7 @@ int cw_in_check_generic_resp(struct conn *conn, struct cw_action_in *a, uint8_t mbag_item_t * result = mbag_get(conn->incomming,CW_ITEM_RESULT_CODE); if (result ) { - if (!cw_rcok(result->u2.dword)){ + if (!cw_result_is_ok(result->u2.dword)){ return result->u2.dword; } } diff --git a/src/cw/cw_in_check_join_resp.c b/src/cw/cw_in_check_join_resp.c index c43fbf60..f06c5e52 100644 --- a/src/cw/cw_in_check_join_resp.c +++ b/src/cw/cw_in_check_join_resp.c @@ -15,7 +15,7 @@ int cw_in_check_join_resp(struct conn *conn, struct cw_action_in *a, uint8_t * d mbag_item_t * jresult = mbag_get(conn->incomming,CW_ITEM_RESULT_CODE); if (jresult ) { - if (!cw_rcok(jresult->u2.dword)){ + if (!cw_result_is_ok(jresult->u2.dword)){ return jresult->u2.dword; } } diff --git a/src/cw/cw_process_element.c b/src/cw/cw_process_element.c index e46b21da..fd163e50 100644 --- a/src/cw/cw_process_element.c +++ b/src/cw/cw_process_element.c @@ -17,7 +17,8 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo struct cw_ElemHandler * handler; struct cw_ElemData * elem_data, elem_data_search; - + + /* try to retrieve a handler for this message element */ handler = cw_msgset_get_elemhandler(params->conn->msgset,0, 0, elem_id); if (!handler) { cw_dbg(DBG_ELEM_ERR, "Unrecognized message element: %d, ignoring", @@ -25,18 +26,32 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT; } + /* check if this message element in the current message allowed */ elem_data_search.id=elem_id; elem_data_search.proto=0; elem_data_search.vendor=0; - elem_data = mavl_find_ptr(params->msgdata->elements_tree,&elem_data_search); - if (!elem_data){ cw_dbg(DBG_ELEM_ERR, "Element %d - %s, not allowed here", elem_id, handler->name); - return 0; + return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT; } + /* check the length of the message */ + if (len < handler->min_len) { + cw_dbg(DBG_ELEM_ERR, + "%d (%s) message element too short, len=%d, min len=%d", + handler->id, handler->name, len, + handler->min_len); + return -1; + } + if (len > handler->max_len && handler->max_len) { + cw_dbg(DBG_ELEM_ERR, + "%d (%s) message element too big, len=%d, max len=%d", handler->id, + handler->name, len, handler->max_len); + /* TODO XXX truncate the element instead of return */ + return -1; + } cw_dbg_elem(DBG_ELEM, params->conn, params->msgdata->type, handler, data,len); diff --git a/src/cw/cw_result_is_ok.c b/src/cw/cw_result_is_ok.c new file mode 100644 index 00000000..68eb5274 --- /dev/null +++ b/src/cw/cw_result_is_ok.c @@ -0,0 +1,8 @@ +#include "capwap.h" +#include "cw.h" + +int cw_result_is_ok( int rc ) { + if(rc == CAPWAP_RESULT_SUCCESS || rc == CAPWAP_RESULT_SUCCESS_NAT) + return 1; + return 0; +} diff --git a/src/cw/mavl.h b/src/cw/mavl.h index 0d2ffbc2..290d98bd 100644 --- a/src/cw/mavl.h +++ b/src/cw/mavl.h @@ -81,7 +81,8 @@ typedef union mavldata mavldata_t; struct mavlnode { /** Pointer to data, that belongs to the node */ - union mavldata data; + union mavldata data; + /** Pointer to left son*/ struct mavlnode *left; /** Pointer to right son*/ @@ -102,6 +103,8 @@ struct mavl { void (*del) (union mavldata *); /** Number of elements currently stored in the tree */ int count; + + size_t data_size; }; /** diff --git a/src/cw/mlist.h b/src/cw/mlist.h index 7d1fe196..6d98ba7b 100644 --- a/src/cw/mlist.h +++ b/src/cw/mlist.h @@ -42,12 +42,16 @@ struct mlist_elem { * The last element is determined by a NULL pointer * */ struct mlist_elem *next; + struct mlist_elem *prev; }; struct mlist { void *data; int (*cmp) (const void *d1, const void *d2); struct mlist_elem *first; + struct mlist_elem *last; + int count; + //size_t elem_size; }; typedef struct mlist * mlist_t; diff --git a/src/wtp/changestate.c b/src/wtp/changestate.c index 1e7d3f1e..4b4b3141 100644 --- a/src/wtp/changestate.c +++ b/src/wtp/changestate.c @@ -21,7 +21,7 @@ int changestate() /* Change State ... */ int rc = cw_send_request(conn,CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST); - if ( !cw_rcok(rc) ) { + if ( !cw_result_is_ok(rc) ) { cw_strresult(rc); return 0; } diff --git a/src/wtp/configure.c b/src/wtp/configure.c index 529cfb09..3a455e63 100644 --- a/src/wtp/configure.c +++ b/src/wtp/configure.c @@ -28,7 +28,7 @@ int configure() int rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST); conn->radios_upd=radios_upd; - if (!cw_rcok(rc)) { + if (!cw_result_is_ok(rc)) { if (rc > 0) { cw_log(LOG_ERR, "Error sending Configuration Status Request to AC at %s, AC said: %d - %s.", diff --git a/src/wtp/join.c b/src/wtp/join.c index c6f27c5f..ffb1c35b 100644 --- a/src/wtp/join.c +++ b/src/wtp/join.c @@ -188,7 +188,7 @@ int run_join(struct conn *conn) int rc = cw_send_request(conn, CAPWAP_MSG_JOIN_REQUEST); - if (!cw_rcok(rc)) { + if (!cw_result_is_ok(rc)) { if (rc > 0) { cw_log(LOG_ERR, "Can't Join AC at %s, AC said: %d - %s.", sock_addr2str(&conn->addr), rc, cw_strerror(rc)); diff --git a/src/wtp/run.c b/src/wtp/run.c index 29ae421d..b16baeaa 100644 --- a/src/wtp/run.c +++ b/src/wtp/run.c @@ -95,7 +95,7 @@ static void do_update(struct conn * conn) cfg_to_json(); /* Change State ... */ int rc = cw_send_request(conn,CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST); - if ( !cw_rcok(rc) ) { + if ( !cw_result_is_ok(rc) ) { cw_strresult(rc); return ; } @@ -131,7 +131,7 @@ int run() continue; } - if ( !cw_rcok(rc)) + if ( !cw_result_is_ok(rc)) break; @@ -144,14 +144,14 @@ int run() if (rc<0 && errno == EAGAIN){ rc = cw_send_request(conn,CAPWAP_MSG_ECHO_REQUEST); - if (!cw_rcok(rc)) { + if (!cw_result_is_ok(rc)) { cw_log(LOG_ERR,"Error in run state: %d %s",rc,cw_strrc(rc)); break; } continue; } - if (!cw_rcok(rc)) { + if (!cw_result_is_ok(rc)) { cw_log(LOG_ERR,"Error in run state: %d %s",rc,cw_strrc(rc)); break; }