diff --git a/actube.workspace b/actube.workspace index b21adfd1..b8870938 100644 --- a/actube.workspace +++ b/actube.workspace @@ -1,9 +1,9 @@ - + - + diff --git a/libcw.project b/libcw.project index f5be68e1..73be1e58 100644 --- a/libcw.project +++ b/libcw.project @@ -93,7 +93,6 @@ - @@ -257,7 +256,6 @@ - @@ -322,10 +320,14 @@ + + + + @@ -342,7 +344,7 @@ - + @@ -413,6 +415,4 @@ - - diff --git a/mod_capwap.project b/mod_capwap.project index f6f63feb..1b486fde 100644 --- a/mod_capwap.project +++ b/mod_capwap.project @@ -19,6 +19,7 @@ + diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c index 3d19a22d..c7d1ed1f 100644 --- a/src/ac/ac_main.c +++ b/src/ac/ac_main.c @@ -153,11 +153,48 @@ int stcmp (const void * sa1, const void *sa2) int main (int argc, char *argv[]) { - mavl_t tree; +/* mavl_t tree; int i; mavliter_t it; + mlist_t list; + struct mlistelem * elem; + + int x; + + list = mlist_create(NULL,sizeof(int)); + + x=8; + mlist_append(list,&x); + + x=13; + mlist_append(list,&x); + + x=11; + mlist_append(list,&x); + + for(i=0; i<100000000; i++){ + int val; + val = i; + mlistelem_t * result; + result = mlist_append(list,&val); + if (result == NULL){ + printf("error\n"); + } + + } + + printf("Count %d\n",list->count); + mlist_foreach(elem,list){ + int * data = mlistelem_dataptr(elem); + printf("Here is %d\n",*data); + } + + + exit(0); +*/ + /*tree = mavl_create_ptr( (int(*)(const void*,const void*))strcmp,free); */ diff --git a/src/ac/db.c b/src/ac/db.c index bea8addf..2194cb95 100644 --- a/src/ac/db.c +++ b/src/ac/db.c @@ -307,7 +307,7 @@ errX: } // TODO XXXX -mavl_conststr_t db_get_update_tasks(struct conn * conn,const char * wtpid) +mavl_t db_get_update_tasks(struct conn * conn,const char * wtpid) { /* sqlite3_reset(get_tasks_stmt); @@ -391,7 +391,7 @@ errX: -mavl_conststr_t db_get_radio_tasks(struct conn * conn,const char * wtpid) +mavl_t db_get_radio_tasks(struct conn * conn,const char * wtpid) { /* //cw_dbg(DBG_X,"Get Radio Tasks for %s",wtpid); diff --git a/src/ac/db.h b/src/ac/db.h index 60b21f72..e13b621c 100644 --- a/src/ac/db.h +++ b/src/ac/db.h @@ -10,10 +10,10 @@ extern int db_init(); int db_start(); int db_get_tasks(struct conn * conn,const char * wtpid); void db_put_wtp_prop(const char *wtp_id,const char * id,const char *sub_id,const char * val); -mavl_conststr_t db_get_update_tasks(struct conn * conn,const char * wtpid); +mavl_t db_get_update_tasks(struct conn * conn,const char * wtpid); void db_put_radio_prop(const char *wtp_id,const char *rid, const char * key,const char *sub_key,const char * val); -extern mavl_conststr_t db_get_radio_tasks(struct conn * conn,const char * wtpid); +extern mavl_t db_get_radio_tasks(struct conn * conn,const char * wtpid); #endif diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index bdb62b07..371942db 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -598,7 +598,7 @@ static void wtpman_run(void *arg) - mavl_conststr_t r; + mavl_t r; r = db_get_update_tasks(conn, sock_addr2str(&conn->addr,sock_buf)); if (r) { diff --git a/src/cw/action.c b/src/cw/action.c index 5a1fe94c..21496268 100644 --- a/src/cw/action.c +++ b/src/cw/action.c @@ -168,7 +168,7 @@ static int mout_cmp(void *elem1,void *elem2) struct outelem * cw_actionlist_mout_create(int msg_id) { - struct outelem * o = malloc(sizeof(struct outelem)); +/* struct outelem * o = malloc(sizeof(struct outelem)); if (!o) return NULL; @@ -179,6 +179,7 @@ struct outelem * cw_actionlist_mout_create(int msg_id) } o->msg_id=msg_id; return o; +*/ } static struct outelem * cw_actionlist_out_get_outelem(cw_actionlist_out_t t, int msg_id) @@ -220,7 +221,7 @@ cw_action_out_t *cw_actionlist_out_add(cw_actionlist_out_t t, struct cw_action_o mavl_add(t,o,NULL); } - struct mlist_elem * e = mlist_replace(o->mlist,NULL,a); + struct mlistelem * e = mlist_replace(o->mlist,NULL,a); if (!e) e = mlist_append(o->mlist,a); diff --git a/src/cw/capwap.h b/src/cw/capwap.h index cfee0ab0..08fb1b47 100644 --- a/src/cw/capwap.h +++ b/src/cw/capwap.h @@ -238,7 +238,7 @@ #define CW_ELEM_INITIATE_DOWNLOAD 27 #define CW_ELEM_LOCATION_DATA 28 #define CW_ELEM_MAXIMUM_MESSAGE_LENGTH 29 -#define CW_ELEM_MTU_DISCOVERY_PADDING 52 +#define CAPWAP_ELEM_MTU_DISCOVERY_PADDING 52 #define CW_ELEM_RADIO_ADMINISTRATIVE_STATE 31 #define CW_ELEM_RADIO_OPERATIONAL_STATE 32 #define CW_ELEM_RESULT_CODE 33 @@ -469,7 +469,7 @@ extern int cw_readelem_statistics_timer(uint16_t * timer, int type, uint8_t * ms int len); extern int cw_readelem_result_code(uint32_t * result_code, int type, uint8_t * msgelem, int len); -extern int cw_readelem_mtu_discovery_padding(int type, uint8_t * msgelem, int len); + extern int cw_readelem_vendor_specific_payload(void *data, int msgtype, int elemtype, uint8_t * msgelem, int len); diff --git a/src/cw/capwap_strings_elem.c b/src/cw/capwap_strings_elem.c index e8702f74..732b2037 100644 --- a/src/cw/capwap_strings_elem.c +++ b/src/cw/capwap_strings_elem.c @@ -37,7 +37,7 @@ struct cw_strlist_elem capwap_strings_elem[] = { {CW_ELEM_INITIATE_DOWNLOAD, "Initiate Download"}, {CW_ELEM_LOCATION_DATA, "Location Data"}, {CW_ELEM_MAXIMUM_MESSAGE_LENGTH, "Maximum Message Length"}, - {CW_ELEM_MTU_DISCOVERY_PADDING, "MTU Discovery Padding"}, + {CAPWAP_ELEM_MTU_DISCOVERY_PADDING, "MTU Discovery Padding"}, {CW_ELEM_RADIO_ADMINISTRATIVE_STATE, "Radio Administrative State"}, {CW_ELEM_RADIO_OPERATIONAL_STATE, "Radio Operational State"}, {CW_ELEM_RESULT_CODE, "Result Code"}, diff --git a/src/cw/conn_process_packet.c b/src/cw/conn_process_packet.c index cba6b54d..1dc7c7f0 100644 --- a/src/cw/conn_process_packet.c +++ b/src/cw/conn_process_packet.c @@ -233,6 +233,10 @@ void cw_read_elem(struct cw_ElemHandler * handler, struct conn * conn, static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, struct sockaddr *from) { + mavl_t mand_found; + mlist_t unrecognized; + + char sock_buf[SOCK_ADDR_BUFSIZE]; /**< to hold str from sockaddr2str */ struct cw_action_in as, *af, *afm; @@ -365,9 +369,10 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, uint8_t *elem; /* Create an avltree to catch the found mandatory elements */ - conn->mand = stravltree_create(); + //conn->mand = stravltree_create(); - + mand_found = mavl_create_conststr(); + unrecognized = mlist_create(NULL,NULL,sizeof(uint8_t*)); /* iterate through message elements */ cw_foreach_elem(elem, elems_ptr, elems_len) { @@ -393,6 +398,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, params.conn=conn; params.from=from; params.msgdata=message; + params.mand_found=mand_found; result_code = cw_process_element(¶ms,0,0,elem_id,elem_data,elem_len); @@ -400,7 +406,10 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, if (cw_result_is_ok(result_code)) continue; + if (result_code == CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT){ + mlist_append(unrecognized,&elem); + } /* @@ -517,12 +526,27 @@ exit(0); } - + mavliter_init(&it,mand_found); + mavliter_foreach(&it){ + printf("MAnd found: %s\n", mavliter_get_str(&it)); + } + + { + mlistelem_t *e; + mlist_foreach(e,unrecognized){ + uint8_t * elem = *(uint8_t**)mlistelem_dataptr(e); + int elem_len = cw_get_elem_len(elem); + //int elem_data=cw_get_elem_data(elem); + int elem_id = cw_get_elem_id(elem); + printf("Unrecognized: %d %d\n",elem_id,elem_len); + } + } + mavl_destroy(mand_found); } //int result_code = 0; -int unrecognized =3; +//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 5c134f2e..5def2b8d 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -341,9 +341,6 @@ extern int cw_in_check_generic_resp(struct conn *conn, struct cw_action_in *a, extern int cw_in_check_generic_req(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, struct sockaddr *from); -extern int cw_in_mtu_discovery_padding(struct conn *conn, struct cw_action_in *a, - uint8_t * data, int len, struct sockaddr *from); - /** diff --git a/src/cw/cw_process_element.c b/src/cw/cw_process_element.c index 7349afe6..8e0a669d 100644 --- a/src/cw/cw_process_element.c +++ b/src/cw/cw_process_element.c @@ -37,6 +37,10 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT; } + if (elem_data->mand){ + mavl_add_str(params->mand_found,handler->key); + } + /* check the length of the message */ if (len < handler->min_len) { cw_dbg(DBG_ELEM_ERR, diff --git a/src/cw/cw_put_msg.c b/src/cw/cw_put_msg.c index 8d5a6792..05979a76 100644 --- a/src/cw/cw_put_msg.c +++ b/src/cw/cw_put_msg.c @@ -68,12 +68,12 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout) } - struct mlist_elem *e; + struct mlistelem *e; int len = 0; for (e=m->first; e; e=e->next) { - cw_action_out_t *ae=(cw_action_out_t*)e->data; + cw_action_out_t *ae=(cw_action_out_t*)e; //printf("Put %d %i %s\n",ae->msg_id,ae->elem_id,ae->item_id); if ( ae->item_id ) { @@ -123,17 +123,21 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout) * alread initilaized in buffer * Message alements are taken fom actiondef in #conn->action */ -int cw_put_custom_msg(struct conn *conn, uint8_t * rawout, mavl_conststr_t elems) + + +int cw_put_custom_msg(struct conn *conn, uint8_t * rawout, /*mavl_conststr_t elems*/ t) { - /* rawout is already initialized, so we can get - msg type from buffer */ + + /* + // rawout is already initialized, so we can get + //msg type from buffer uint8_t *msgptr = rawout + cw_get_hdr_msg_offset(rawout); int msg_id = cw_get_msg_type(msgptr); MAVLITER_DEFINE(it,elems); mavliter_foreach(&it){ const char *i= mavliter_get(&it); - /* preapare action search */ + // preapare action search cw_action_out_t as; as.msg_id=msg_id; as.item_id=i; @@ -147,7 +151,7 @@ int cw_put_custom_msg(struct conn *conn, uint8_t * rawout, mavl_conststr_t elems - /* create search paramaters */ + cw_action_out_t as; as.item_id = CW_ITEM_NONE; @@ -182,7 +186,7 @@ MAVLITER_DEFINE(i,0); } if (ae->msg_id != as.msg_id) { - /* Element is from next msg, close action */ + // Element is from next msg, close action break; } int l=0; @@ -206,15 +210,15 @@ MAVLITER_DEFINE(i,0); cw_set_msg_elems_len(msgptr, len); if (as.msg_id & 1) { - /* It's a request, so we have to set seqnum */ + /// It's a request, so we have to set seqnum int s = conn_get_next_seqnum(conn); cw_set_msg_seqnum(msgptr,s); // printf("Set seqnum to : %d\n",s); } +*/ - - return len; + return 0; //len } diff --git a/src/cw/cwmsg_addelem_mtu_discovery_padding.c b/src/cw/cwmsg_addelem_mtu_discovery_padding.c index 3303efac..1cc1bac3 100644 --- a/src/cw/cwmsg_addelem_mtu_discovery_padding.c +++ b/src/cw/cwmsg_addelem_mtu_discovery_padding.c @@ -34,7 +34,7 @@ printf("MTU discovery len %d %d and pos %d:\n",conn->mtu,len,msg->pos); if (len < 0 ) return; - uint32_t val = CW_ELEM_MTU_DISCOVERY_PADDING<<16|len; + uint32_t val = CAPWAP_ELEM_MTU_DISCOVERY_PADDING<<16|len; *((uint32_t*)(msg->msgelems+msg->pos))=htonl(val); memset(msg->msgelems+4+msg->pos,0xff,len); msg->pos+=4+len; diff --git a/src/cw/mavl.h b/src/cw/mavl.h index da4633e6..ff6b7553 100644 --- a/src/cw/mavl.h +++ b/src/cw/mavl.h @@ -241,8 +241,10 @@ extern union mavldata * mavliter_seek ( mavliter_t *i, void *d ); */ #define mavl_get_count(m) (m->count) -typedef mavl_t mavl_conststr_t; -extern mavl_conststr_t mavl_create_conststr(); +/* +#typedef mavl_t mavl_conststr_t; +#extern mavl_conststr_t mavl_create_conststr(); +*/ /* //int mavl_cmp_str ( const union mavldata *e1, const union mavldata *e2 ); @@ -276,6 +278,7 @@ void mavl_freeptr(void *ptr); mavl_create(cmp,del,sizeof(void*)) int mavl_cmpstr(const void *p1, const void *p2); #define mavl_create_str() mavl_create_ptr(mavl_cmpstr,mavl_freeptr) +#define mavl_create_conststr() mavl_create_ptr(mavl_cmpstr,NULL) void * mavl_get_ptr ( mavl_t tree, void * search ); void * mavl_add_ptr ( mavl_t tree, void *ptr ); diff --git a/src/cw/mavl_create_conststr.c b/src/cw/mavl_create_conststr.c deleted file mode 100644 index e7d9bf52..00000000 --- a/src/cw/mavl_create_conststr.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - This file is part of actube. - - actube is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - libcapwap is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . - -*/ - -/** - * @file - * @brief Implementation of mavl_create_conststr - */ - - -#include "mavl.h" - -static int cmp(const void *v1,const void*v2) -{ - return strcmp( (char*)v1,(char*)v2); -} - -/** - * Create a mavl object which holds pointers to strings. - * These strings have to be constant. So there is no - * free method called, when the mavl object is destroyed - * @return The created mavl object or NULL if an error - * has occured. - */ - -mavl_conststr_t mavl_create_conststr() -{ - return mavl_create(cmp,NULL,1312); -} diff --git a/src/cw/mlist.c b/src/cw/mlist.c index 6a30d3b7..82e0827c 100644 --- a/src/cw/mlist.c +++ b/src/cw/mlist.c @@ -3,42 +3,19 @@ #include "mlist.h" -mlist_t mlist_create(int (*cmp) (const void *v1, const void *v2)) -{ - struct mlist * l = malloc(sizeof(struct mlist)); - if (!l) - return NULL; - memset(l, 0, sizeof(struct mlist)); - l->cmp = cmp; - return l; -} -struct mlist_elem * mlist_append(mlist_t l, void *data) -{ - - struct mlist_elem **n = &l->first; - while (*n != NULL) - n = &(*n)->next; - *n = malloc(sizeof(struct mlist_elem)); - if (!*n) - return NULL; - (*n)->data = data; - (*n)->next = NULL; - - return *n; -} - -struct mlist_elem * mlist_prepend(mlist_t l, void *data){ +struct mlistelem * mlist_prepend(mlist_t l, void *data){ } -struct mlist_elem *mlist_find(mlist_t l, struct mlist_elem *start, void *data) +struct mlistelem *mlist_find(mlist_t l, struct mlistelem *start, void *data) { - struct mlist_elem *e; + /* + struct mlistelem *e; if (start) e = start; else @@ -51,22 +28,24 @@ struct mlist_elem *mlist_find(mlist_t l, struct mlist_elem *start, void *data) } return NULL; + */ } -struct mlist_elem * mlist_replace(mlist_t l, struct mlist_elem *start, void *data) +struct mlistelem * mlist_replace(mlist_t l, struct mlistelem *start, void *data) { - struct mlist_elem *e; +/* + struct mlistelem *e; if (start) e = start; else e = l->first; - struct mlist_elem * f = mlist_find(l,e,data); + struct mlistelem * f = mlist_find(l,e,data); if (!f) return NULL; f->data = data; return f; +*/ } - diff --git a/src/cw/mlist.h b/src/cw/mlist.h index c0ac9f9d..54a7ba9b 100644 --- a/src/cw/mlist.h +++ b/src/cw/mlist.h @@ -24,6 +24,10 @@ * @brief Mlist Mini list */ +#include +#include + + /** * @defgroup MLIST MLIST * @{ @@ -34,51 +38,43 @@ * It's a simple connected list, just with pone connection to the * next element. */ -struct mlist_elem { - /** Pointer to data */ - void *data; - /** - * Pointer to next element - * The last element is determined by a NULL pointer - * */ - struct mlist_elem *next; - struct mlist_elem *prev; +struct mlistelem { + struct mlistelem *next; + struct mlistelem *prev; }; +typedef struct mlistelem mlistelem_t; struct mlist { - void *data; +/* void *data;*/ int (*cmp) (const void *d1, const void *d2); - struct mlist_elem *first; - struct mlist_elem *last; + void (*del) (void *data); + struct mlistelem *first; + struct mlistelem *last; int count; -/* //size_t elem_size;*/ + size_t data_size; }; - typedef struct mlist * mlist_t; +#define mlistelem_dataptr(elem) ((void*)(((uint8_t*)(elem))+sizeof(struct mlistelem))) /** * defgroup MLIST_FUNCTIONS * @{ */ -extern mlist_t mlist_create(int (*cmp) (const void *v1, const void *v2)); -extern struct mlist_elem *mlist_append(mlist_t l, void *data); -extern struct mlist_elem *mlist_find(mlist_t l, struct mlist_elem *start, void *data); -extern struct mlist_elem *mlist_replace(mlist_t l, struct mlist_elem *start, void *data); +mlist_t mlist_create(int (*cmp) (const void *v1, const void *v2), void (*del)(void *), size_t data_size); + +struct mlistelem *mlist_append(mlist_t l, void *data); + +extern struct mlistelem *mlist_find(mlist_t l, struct mlistelem *start, void *data); +extern struct mlistelem *mlist_replace(mlist_t l, struct mlistelem *start, void *data); #define mlist_add mlist_append /** * @} */ - - - -#define mlist_foreach(i,l)\ - for (i=l->first; i; i=i->next) - - - +#define mlist_foreach(elem,list)\ + for (elem=list->first; elem; elem=elem->next) /** * @} diff --git a/src/cw/mlist_append.c b/src/cw/mlist_append.c new file mode 100644 index 00000000..f0709ffe --- /dev/null +++ b/src/cw/mlist_append.c @@ -0,0 +1,31 @@ +#include + +#include "mlist.h" + +struct mlistelem *mlist_append(mlist_t l, void *data) +{ + struct mlistelem *e; + + e = malloc(sizeof(struct mlistelem) + l->data_size); + + if (e == NULL) + return NULL; + + memcpy(mlistelem_dataptr(e), data, l->data_size); + + if (l->first == NULL) { + l->first = e; + l->last = e; + e->prev=NULL; + e->next=NULL; + l->count++; + return e; + } + + l->last->next=e; + e->prev=l->last; + e->next=NULL; + l->last=e; + l->count++; + return e; +} diff --git a/src/cw/mlist_create.c b/src/cw/mlist_create.c new file mode 100644 index 00000000..9497cb0c --- /dev/null +++ b/src/cw/mlist_create.c @@ -0,0 +1,18 @@ +#include "mlist.h" + +mlist_t mlist_create(int (*cmp) (const void *v1, const void *v2), + void (*del)(void*), + size_t data_size) +{ + struct mlist * l = malloc(sizeof(struct mlist)); + if (!l) + return NULL; + /*memset(l, 0, sizeof(struct mlist));*/ + + l->cmp = cmp; + l->data_size=data_size; + l->first=NULL; + l->last=NULL; + l->count=0; + return l; +} diff --git a/src/cw/mod.c b/src/cw/mod.c index 91ed60d3..d6b09e77 100644 --- a/src/cw/mod.c +++ b/src/cw/mod.c @@ -264,18 +264,25 @@ errX: } - static struct mlist * mods_list = NULL; struct cw_Mod * cw_mod_add_to_list(struct cw_Mod * mod ){ + mlistelem_t *elem; if (!mods_list){ - mods_list = mlist_create(mod_cmp_mlist); + mods_list = mlist_create(mod_cmp_mlist,NULL,sizeof(struct cw_Mod *)); if (!mods_list){ cw_log(LOG_ERROR,"Can't init mods_list"); return 0; } } - return mlist_append(mods_list,mod)->data; + + elem = mlist_append(mods_list,&mod); +printf("Append mod %p\n",mod); + if (elem == NULL) + return NULL; + return mlistelem_dataptr(elem); + + /*return mlist_append(mods_list,mod)->data;*/ } struct cw_Mod * cw_mod_detect(struct conn *conn, @@ -283,16 +290,18 @@ struct cw_Mod * cw_mod_detect(struct conn *conn, int elems_len, struct sockaddr *from, int mode){ - struct mlist_elem * e; + struct mlistelem * e; if (mods_list==NULL) return MOD_NULL; mlist_foreach(e,mods_list){ - struct cw_Mod * mod = e->data; + /// 1312 + struct cw_Mod * mod = *(struct cw_Mod**)(mlistelem_dataptr(e)); /* = e->data;*/ cw_dbg(DBG_MOD,"Checking mod: %s",mod->name); - + +printf("Got the mod %p\n",mod); /* if there is no detect method, skip */ if (!mod->detect) continue; diff --git a/src/cw/msget.h b/src/cw/msget.h index 258d3b3d..1266f15b 100644 --- a/src/cw/msget.h +++ b/src/cw/msget.h @@ -32,6 +32,7 @@ struct cw_ElemHandlerParams { struct conn * conn; struct cw_MsgData * msgdata; struct sockaddr *from; + mavl_t mand_found; }; struct cw_ElemHandler { diff --git a/src/cw/msgset.c b/src/cw/msgset.c index 61824511..01887ecc 100644 --- a/src/cw/msgset.c +++ b/src/cw/msgset.c @@ -8,66 +8,70 @@ #include "msget.h" -static int cmp_cw_elemhandler_by_id(const void * elem1, const void *elem2){ - const struct cw_ElemHandler * e1 = elem1; - const struct cw_ElemHandler * e2 = elem2; +static int cmp_cw_elemhandler_by_id(const void *elem1, const void *elem2) +{ + const struct cw_ElemHandler *e1 = elem1; + const struct cw_ElemHandler *e2 = elem2; int r; r = e1->id - e2->id; - if (r!=0) + if (r != 0) return r; r = e1->vendor - e2->vendor; - if (r!=0) + if (r != 0) + return r; + r = e1->proto - e2->proto; + if (r != 0) return r; - r = e1->proto - e2->proto; - if (r != 0) - return r; return 0; } -static int cmp_cw_elemhandler_by_key(const void *elem1, const void *elem2){ - const struct cw_ElemHandler * e1 = elem1; - const struct cw_ElemHandler * e2 = elem2; - return strcmp(e1->key,e2->key); +static int cmp_cw_elemhandler_by_key(const void *elem1, const void *elem2) +{ + const struct cw_ElemHandler *e1 = elem1; + const struct cw_ElemHandler *e2 = elem2; + return strcmp(e1->key, e2->key); } -static int cmp_msgdata(const void * elem1, const void *elem2) -{ - const struct cw_MsgData * e1 = elem1; - const struct cw_MsgData * e2 = elem2; +static int cmp_msgdata(const void *elem1, const void *elem2) +{ + const struct cw_MsgData *e1 = elem1; + const struct cw_MsgData *e2 = elem2; return e1->type - e2->type; } -static int cmp_elemdata(const void * elem1, const void *elem2) +static int cmp_elemdata(const void *elem1, const void *elem2) { - const struct cw_ElemData * e1 = elem1; - const struct cw_ElemData * e2 = elem2; + const struct cw_ElemData *e1 = elem1; + const struct cw_ElemData *e2 = elem2; int r; r = e1->id - e2->id; - if (r!=0) + if (r != 0) return r; r = e1->vendor - e2->vendor; - if (r!=0) + if (r != 0) + return r; + r = e1->proto - e2->proto; + if (r != 0) return r; - r = e1->proto - e2->proto; - if (r != 0) - return r; return 0; } -static void msgdata_destroy(struct cw_MsgData *data){ +static void msgdata_destroy(struct cw_MsgData *data) +{ if (!data) return; /* if (data->elements_list) mlist_destroy(data->elements_list); */ if (data->elements_tree) - mavl_destroy( data->elements_tree ); + mavl_destroy(data->elements_tree); free(data); } -static void del_mavl_msdgdata( void * d ){ +static void del_mavl_msdgdata(void *d) +{ msgdata_destroy(d); } @@ -76,7 +80,8 @@ static void del_mavl_msdgdata( void * d ){ * @brief Destroy a message set * @param set Message set to destroy */ -void cw_msgset_destroy(struct cw_MsgSet * set){ +void cw_msgset_destroy(struct cw_MsgSet *set) +{ if (set->msgdata) mavl_destroy(set->msgdata); if (set->handlers_by_id) @@ -91,35 +96,36 @@ void cw_msgset_destroy(struct cw_MsgSet * set){ * @brief Create a message set * @return Message set create, NULL if an error has occured */ -struct cw_MsgSet * cw_msgset_create(){ +struct cw_MsgSet *cw_msgset_create() +{ /* allocate memory for a message_set */ - struct cw_MsgSet * set = malloc(sizeof(struct cw_MsgSet )); - if (set==NULL) + struct cw_MsgSet *set = malloc(sizeof(struct cw_MsgSet)); + if (set == NULL) return NULL; - memset(set,0,sizeof(struct cw_MsgSet)); + memset(set, 0, sizeof(struct cw_MsgSet)); /* create mavl for all_elems by id */ - set->handlers_by_id = mavl_create(cmp_cw_elemhandler_by_id,NULL, - sizeof(struct cw_ElemHandler)); - if (set->handlers_by_id==NULL){ + set->handlers_by_id = mavl_create(cmp_cw_elemhandler_by_id, NULL, + sizeof(struct cw_ElemHandler)); + if (set->handlers_by_id == NULL) { cw_msgset_destroy(set); return NULL; } /* create mavl for all_elems by key */ - set->handlers_by_key = mavl_create(cmp_cw_elemhandler_by_key,NULL, - sizeof(struct cw_ElemHandler)); - if (set->handlers_by_key==NULL){ + set->handlers_by_key = mavl_create(cmp_cw_elemhandler_by_key, NULL, + sizeof(struct cw_ElemHandler)); + if (set->handlers_by_key == NULL) { cw_msgset_destroy(set); return NULL; } /* create mavl for messages */ - set->msgdata = mavl_create(cmp_msgdata,del_mavl_msdgdata, - sizeof(struct cw_MsgData)); - if (set->msgdata==NULL){ + set->msgdata = mavl_create(cmp_msgdata, del_mavl_msdgdata, + sizeof(struct cw_MsgData)); + if (set->msgdata == NULL) { cw_msgset_destroy(set); return NULL; } @@ -127,120 +133,107 @@ struct cw_MsgSet * cw_msgset_create(){ return set; } -struct cw_ElemHandler * cw_msgset_get_elemhandler(struct cw_MsgSet * set, - int proto, int vendor, int id) +struct cw_ElemHandler *cw_msgset_get_elemhandler(struct cw_MsgSet *set, + int proto, int vendor, int id) { struct cw_ElemHandler search; - search.proto=proto; - search.vendor=vendor; - search.id=id; - return mavl_find(set->handlers_by_id,&search); + search.proto = proto; + search.vendor = vendor; + search.id = id; + return mavl_find(set->handlers_by_id, &search); } -static int update_msgdata(struct cw_MsgSet * set, struct cw_MsgData * msgdata, - struct cw_MsgDef * msgdef) +static int update_msgdata(struct cw_MsgSet *set, struct cw_MsgData *msgdata, + struct cw_MsgDef *msgdef) { - struct cw_ElemDef * elemdef; + struct cw_ElemDef *elemdef; struct cw_ElemData ed, *result; - + /* iterate through all defined elements */ - for(elemdef = msgdef->elements; elemdef->id; elemdef++){ - struct cw_ElemHandler * handler; + for (elemdef = msgdef->elements; elemdef->id; elemdef++) { + struct cw_ElemHandler *handler; int replaced; - + handler = cw_msgset_get_elemhandler(set, - elemdef->proto, - elemdef->vendor, - elemdef->id); + elemdef->proto, + elemdef->vendor, elemdef->id); /* check if a handler for our element already exists */ - if (!handler){ + if (!handler) { cw_log(LOG_ERR, "No handler for message element: %d %d %d", - elemdef->proto, - elemdef->vendor, - elemdef->id); + elemdef->proto, elemdef->vendor, elemdef->id); continue; } - - ed.id=elemdef->id; - ed.proto=elemdef->proto; - ed.vendor=elemdef->vendor; - ed.mand=elemdef->mand; - - - result = mavl_replace(msgdata->elements_tree, &ed, &replaced); - - if (!replaced){ - cw_dbg(DBG_MOD, " adding message element %d %d %d - %s", - elemdef->proto, - elemdef->vendor, - elemdef->id, - handler->name); - } - else{ - cw_dbg(DBG_MOD, " replacing message element %d %d %d - %s", - elemdef->proto, - elemdef->vendor, - elemdef->id, - handler->name); - } + ed.id = elemdef->id; + ed.proto = elemdef->proto; + ed.vendor = elemdef->vendor; + ed.mand = elemdef->mand; + + result = mavl_replace(msgdata->elements_tree, &ed, &replaced); + + if (!replaced) { + cw_dbg(DBG_MOD, " adding message element %d %d %d - %s", + elemdef->proto, + elemdef->vendor, elemdef->id, handler->name); + } else { + cw_dbg(DBG_MOD, " replacing message element %d %d %d - %s", + elemdef->proto, + elemdef->vendor, elemdef->id, handler->name); + } } - + return 0; } -int cw_msgset_add(struct cw_MsgSet * set, - struct cw_MsgDef messages[], - struct cw_ElemHandler handlers[] - ){ +int cw_msgset_add(struct cw_MsgSet *set, + struct cw_MsgDef messages[], struct cw_ElemHandler handlers[] + ) +{ - struct cw_ElemHandler * handler; - struct cw_MsgDef * msgdef; + struct cw_ElemHandler *handler; + struct cw_MsgDef *msgdef; /* Create mavl for all handlers */ - for(handler = handlers; handler->id; handler++){ - cw_dbg(DBG_MOD,"Adding handler for element %d - %s - with key: %s", - handler->id, - handler->name, - handler->key); - mavl_replace(set->handlers_by_id,handler,NULL); - mavl_replace(set->handlers_by_key,handler,NULL); + for (handler = handlers; handler->id; handler++) { + cw_dbg(DBG_MOD, "Adding handler for element %d - %s - with key: %s", + handler->id, handler->name, handler->key); + mavl_replace(set->handlers_by_id, handler, NULL); + mavl_replace(set->handlers_by_key, handler, NULL); } - - for (msgdef=messages; msgdef->type !=0; msgdef++){ + for (msgdef = messages; msgdef->type != 0; msgdef++) { struct cw_MsgData search; struct cw_MsgData *msg; int exists; - - /* Look if message already exists */ - search.type=msgdef->type; - msg = mavl_add(set->msgdata,&search,&exists); - if (msg == NULL){ - cw_log(LOG_ERR,"Can't create messae"); - return 0; + /* Look if message already exists */ + search.type = msgdef->type; + msg = mavl_add(set->msgdata, &search, &exists); + + if (msg == NULL) { + cw_log(LOG_ERR, "Can't create messae"); + return 0; } - - if (!exists){ - msg->elements_tree = mavl_create(cmp_elemdata,NULL, - sizeof(struct cw_ElemData)); + + if (!exists) { + msg->elements_tree = mavl_create(cmp_elemdata, NULL, + sizeof(struct cw_ElemData)); } /* Overwrite the found message */ if (msgdef->name) - msg->name=msgdef->name; + msg->name = msgdef->name; if (msgdef->states) - msg->states=msgdef->states; - msg->receiver=msgdef->receiver; + msg->states = msgdef->states; + msg->receiver = msgdef->receiver; - cw_dbg(DBG_MOD, "Add message Type:%d - %s ",msgdef->type,msgdef->name); + cw_dbg(DBG_MOD, "Add message Type:%d - %s ", msgdef->type, msgdef->name); - - update_msgdata(set,msg,msgdef); + + update_msgdata(set, msg, msgdef); } return 0; @@ -252,8 +245,9 @@ int cw_msgset_add(struct cw_MsgSet * set, * @param type message type to search for * @return message data or NULL if not found */ -struct cw_MsgData * cw_msgset_get_msgdata(struct cw_MsgSet *set,int type){ +struct cw_MsgData *cw_msgset_get_msgdata(struct cw_MsgSet *set, int type) +{ struct cw_MsgData search; - search.type=type; - return mavl_find_ptr(set->msgdata,&search); + search.type = type; + return mavl_find_ptr(set->msgdata, &search); } diff --git a/src/mod/capwap/Makefile b/src/mod/capwap/Makefile index 8baa0de1..6362b27e 100644 --- a/src/mod/capwap/Makefile +++ b/src/mod/capwap/Makefile @@ -16,6 +16,7 @@ OBJS=\ capwap_out_ac_ip_list.o \ capwap_in_session_id.o \ capwap_in_vendor_specific_payload.o \ + capwap_in_mtu_discovery_padding.o LIBDIR := ../../../lib diff --git a/src/mod/capwap/capwap_actions_ac.c b/src/mod/capwap/capwap_actions_ac.c index 66f819d6..17679cbd 100644 --- a/src/mod/capwap/capwap_actions_ac.c +++ b/src/mod/capwap/capwap_actions_ac.c @@ -88,6 +88,18 @@ static struct cw_ElemHandler handlers[] = { capwap_in_vendor_specific_payload /* get */ } , + + { + "MTU Discovery Padding", /* name */ + CAPWAP_ELEM_MTU_DISCOVERY_PADDING, /* Element ID */ + 0,0, /* Vendor / Proto */ + 0,0, /* min/max length */ + NULL, /* type */ + NULL, /* Key */ + capwap_in_mtu_discovery_padding /* get */ + } + , + {0,0,0,0,0,0,0,0} @@ -97,10 +109,11 @@ static struct cw_ElemHandler handlers[] = { static int discovery_request_states[] = {CAPWAP_STATE_DISCOVERY,0}; static struct cw_ElemDef discovery_request_elements[] ={ {0,0,CAPWAP_ELEM_DISCOVERY_TYPE, 1, 0}, - {0,0,CAPWAP_ELEM_WTP_MAC_TYPE, 1, 0}, {0,0,CAPWAP_ELEM_WTP_BOARD_DATA, 1, 0}, - {0,0,CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0}, + {0,0,CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0}, {0,0,CAPWAP_ELEM_WTP_FRAME_TUNNEL_MODE, 1, 0}, + {0,0,CAPWAP_ELEM_WTP_MAC_TYPE, 1, 0}, + {0,0,CAPWAP_ELEM_MTU_DISCOVERY_PADDING, 0, 0}, {0,0,CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD, 0, 0}, {0,0,0,0,0} diff --git a/src/cw/cw_in_mtu_discovery_padding.c b/src/mod/capwap/capwap_in_mtu_discovery_padding.c similarity index 72% rename from src/cw/cw_in_mtu_discovery_padding.c rename to src/mod/capwap/capwap_in_mtu_discovery_padding.c index f32ea966..11e3cfb7 100644 --- a/src/cw/cw_in_mtu_discovery_padding.c +++ b/src/mod/capwap/capwap_in_mtu_discovery_padding.c @@ -16,16 +16,18 @@ */ - -#include "cw.h" -#include "dbg.h" +#include "cw/capwap.h" +#include "cw/msget.h" +#include "cw/dbg.h" -int cw_in_mtu_discovery_padding(struct conn *conn, struct cw_action_in *a, - uint8_t * data, int len,struct sockaddr *from) +int capwap_in_mtu_discovery_padding(struct cw_ElemHandler *eh, + struct cw_ElemHandlerParams *params, uint8_t * data, + int len) { - int i, n = 0; + int i, n; + n = 0; for (i = 0; i < len; i++) { if (data[i] != 0xff) n++; @@ -34,8 +36,8 @@ int cw_in_mtu_discovery_padding(struct conn *conn, struct cw_action_in *a, cw_dbg(DBG_RFC, "MTU discovery padding msg elem contains %d non-0xFF byte(s) out of %d, See RFC 5415.", n, len); - if (conn->strict_capwap) - return 0; + if (params->conn->strict_capwap) + return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT; } - return 1; + return CAPWAP_RESULT_SUCCESS; } diff --git a/src/mod/capwap/mod_capwap.h b/src/mod/capwap/mod_capwap.h index db887a80..8cd32528 100644 --- a/src/mod/capwap/mod_capwap.h +++ b/src/mod/capwap/mod_capwap.h @@ -25,6 +25,10 @@ int capwap_in_vendor_specific_payload(struct cw_ElemHandler *handler, struct cw_ElemHandlerParams *params, uint8_t * data, int len); +int capwap_in_mtu_discovery_padding(struct cw_ElemHandler *eh, + struct cw_ElemHandlerParams *params, uint8_t * data, + int len); + /* extern int capwap_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t * dst);