From 257f1189b07bd8aa58944e60887bc67b36551755 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sat, 24 Mar 2018 06:56:05 +0000 Subject: [PATCH] ac descriptor works FossilOrigin-Name: 8e68ed51a2c8ee448474ab13ef8d0edbd8cfda5b5384684e2ed9ffa1fca4e799 --- actube.workspace | 4 +- libcw.project | 4 +- mod_capwap.project | 1 + src/ac/ac_main.c | 8 +- src/cw/cw.h | 8 ++ src/cw/cw_ktv_add_from_str.c | 3 +- src/cw/cw_ktv_dump.c | 3 - src/cw/cw_ktv_idx_get.c | 71 +++++++++++++++++- src/cw/cw_ktv_mavlcmp.c | 27 ++++++- src/cw/cw_out_generic.c | 14 ++-- src/cw/cw_process_element.c | 5 ++ src/cw/cw_put_msg.c | 6 +- src/cw/cw_read_ac_descriptor.c | 31 ++++---- src/cw/cw_type_byte.c | 4 +- src/cw/cw_type_ipaddress.c | 2 +- src/cw/ktv.h | 2 +- src/cw/lw.h | 2 +- src/cw/lw_elem_id_to_str.c | 8 +- src/cw/lw_inline.c | 10 --- src/cw/lw_put_bstr.c | 12 +++ src/cw/lw_put_image_data.c | 2 +- src/cw/lw_readelem_wtp_name.c | 2 +- src/cw/lwapp.h | 20 ++--- src/cw/mavl.h | 7 +- src/cw/mavl_get.c | 1 - src/cw/mavl_get_node.c | 5 +- src/cw/mavl_get_node_cmp..c | 18 +++++ src/cw/mavl_merge.c | 2 +- src/mod/Mod.mak | 4 +- src/mod/capwap/Makefile | 3 +- src/mod/capwap/capwap_actions_ac.c | 72 +++++++++--------- .../capwap_in_capwap_control_ip_address.c} | 60 ++++++--------- .../capwap_out_capwap_control_ip_address.c | 73 ++++++++++++------- src/mod/capwap/capwap_out_wtp_descriptor.c | 7 +- src/mod/capwap/mod_capwap.h | 4 +- src/mod/cisco/cisco_actions_ac.c | 5 +- src/wtp/discovery.c | 14 ++-- src/wtp/wtp_main.c | 11 ++- wtp.project | 1 + 39 files changed, 337 insertions(+), 199 deletions(-) delete mode 100644 src/cw/cw_ktv_dump.c create mode 100644 src/cw/lw_put_bstr.c create mode 100644 src/cw/mavl_get_node_cmp..c rename src/{cw/cw_in_capwap_control_ip_address.c => mod/capwap/capwap_in_capwap_control_ip_address.c} (63%) diff --git a/actube.workspace b/actube.workspace index b8870938..e0162c79 100644 --- a/actube.workspace +++ b/actube.workspace @@ -3,9 +3,9 @@ - + - + diff --git a/libcw.project b/libcw.project index bf601779..0ac641bc 100644 --- a/libcw.project +++ b/libcw.project @@ -38,7 +38,6 @@ - @@ -289,7 +288,6 @@ - @@ -300,6 +298,8 @@ + + diff --git a/mod_capwap.project b/mod_capwap.project index 94872f52..dd61a7b6 100644 --- a/mod_capwap.project +++ b/mod_capwap.project @@ -22,6 +22,7 @@ + diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c index e93b7b79..1602ece0 100644 --- a/src/ac/ac_main.c +++ b/src/ac/ac_main.c @@ -233,7 +233,13 @@ int main (int argc, char *argv[]) cw_dbg_ktv_dump(global_cfg,DBG_INFO,NULL,"CFG:",NULL); - + +/* int idx; + idx = cw_ktv_idx_get(global_cfg,"capwap-control-ip-address/address",0,CW_TYPE_IPADDRESS); + printf("IDX: %d\n"); + +exit(0); +*/ cw_log_name = "AC-Tube"; if (!read_config ("ac.conf")) diff --git a/src/cw/cw.h b/src/cw/cw.h index 724dd968..9c811e55 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -66,7 +66,15 @@ #define cw_get_word lw_get_word #define cw_get_dword lw_get_dword + +#define cw_set_byte lw_set_byte +#define cw_set_word lw_set_word +#define cw_set_dword lw_set_dword + + +/* #define cw_get_str(data, maxlen) (strndup((char*)(data),maxlen)) +*/ /** * Macro to isolate bits from a dword diff --git a/src/cw/cw_ktv_add_from_str.c b/src/cw/cw_ktv_add_from_str.c index 0921acb4..407b742b 100644 --- a/src/cw/cw_ktv_add_from_str.c +++ b/src/cw/cw_ktv_add_from_str.c @@ -4,7 +4,8 @@ #include "log.h" #include "dbg.h" -const char * cw_ktv_add_from_str(mavl_t kvtstore, const char *key, const struct cw_Type *type, +const char * cw_ktv_add_from_str(mavl_t kvtstore, const char *key, + const struct cw_Type *type, const char * str) { cw_KTV_t mdata, *mresult; diff --git a/src/cw/cw_ktv_dump.c b/src/cw/cw_ktv_dump.c deleted file mode 100644 index 1935e302..00000000 --- a/src/cw/cw_ktv_dump.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "ktv.h" -#include "dbg.h" - diff --git a/src/cw/cw_ktv_idx_get.c b/src/cw/cw_ktv_idx_get.c index 741ef5e8..8c1dcbf1 100644 --- a/src/cw/cw_ktv_idx_get.c +++ b/src/cw/cw_ktv_idx_get.c @@ -1,8 +1,73 @@ #include "ktv.h" -cw_KTV_t * cw_ktv_idx_get(mavl_t ktv, const char *key, int idx, const cw_Type_t * type) +void * ktvn(struct mavl *t ,const void *search) +{ + + struct mavlnode *n,*lastl,*lastb; + lastb = NULL; lastl=NULL; + n = t->root; + while(n){ + int rc; + const cw_KTV_t *c1,*c2; + c1=search; + c2=mavlnode_dataptr(n); + + + rc = t->cmp(search,mavlnode_dataptr(n)); + + /*printf("Compare: %s %s = %d\n",c1->key,c2->key, rc);*/ + + if (rc==0){ + return NULL; + + } + + if (rc<0){ + lastl = n; + if (n->left==NULL){ + return mavlnode_dataptr(lastb); + + } + n=n->left; + } + else{ + lastb=n; + if(n->right==NULL){ + return mavlnode_dataptr(lastb); + + } + n=n->right; + } + } + return NULL; + +} + + + + +int cw_ktv_idx_get(mavl_t ktv, const char *key, int idx, const cw_Type_t * type) { char ikey[CW_KTV_MAX_KEY_LEN]; - sprintf(ikey,"%s.%d",key,idx); - return cw_ktv_get(ktv,ikey,type); + cw_KTV_t search, * result; + char *d; + + sprintf(ikey,"%s.%d",key,65536); + + search.key=ikey; + result = ktvn(ktv,&search); + + if (result == NULL){ + return -1; + } + + d = strchr(result->key,'.'); + if (d==NULL){ + return -1; + } + + if (strncmp(result->key,ikey,d-result->key)!=0) + return -1; + + return atoi(d+1); } diff --git a/src/cw/cw_ktv_mavlcmp.c b/src/cw/cw_ktv_mavlcmp.c index 0f663e34..460b2b3a 100644 --- a/src/cw/cw_ktv_mavlcmp.c +++ b/src/cw/cw_ktv_mavlcmp.c @@ -2,5 +2,30 @@ int cw_ktv_mavlcmp(const void *v1, const void *v2) { - return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key); + char *d1,*d2; + int l1,l2,rc,i1,i2; + + + d1 = strchr(((cw_KTV_t *) v1)->key,'.'); + d2 = strchr(((cw_KTV_t *) v2)->key,'.'); + + if (d1==NULL || d2==NULL) + return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key); + + l1=d1-((cw_KTV_t *) v1)->key; + l2=d2-((cw_KTV_t *) v2)->key; + + if (l1!=l2){ + return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key); + } + + rc = strncmp(((cw_KTV_t *) v1)->key,((cw_KTV_t *) v2)->key,l1); + if (rc!=0){ + return rc; + } + + i1 = atoi(d1+1); + i2 = atoi(d2+1); + + return i1-i2; } diff --git a/src/cw/cw_out_generic.c b/src/cw/cw_out_generic.c index 29870186..0a55a10b 100644 --- a/src/cw/cw_out_generic.c +++ b/src/cw/cw_out_generic.c @@ -13,7 +13,7 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams { char detail[128]; struct cw_KTV * elem, search; - int start, len; + int start, len, l; /* Get the element to put */ search.key=(char*)handler->key; @@ -50,16 +50,18 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams handler->type->to_str(elem,detail,120); sprintf(params->debug_details, " Value = %s", detail); - - params->elem = elem; - /*(cw_put_mbag_item(dst + start, item);*/ - if (handler->vendor) return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len); - return len + cw_put_elem_hdr(dst, handler->id, len); + + + l = len + cw_put_elem_hdr(dst, handler->id, len); + + cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,handler,dst,l); + + return l; } diff --git a/src/cw/cw_process_element.c b/src/cw/cw_process_element.c index cd37e10d..d3d1b450 100644 --- a/src/cw/cw_process_element.c +++ b/src/cw/cw_process_element.c @@ -2,6 +2,7 @@ #include "cw.h" #include "dbg.h" +#include "log.h" /** * @brief Process a CAPWAP message element @@ -66,6 +67,10 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo cw_dbg_elem(DBG_ELEM_IN, params->conn, params->msgdata->type, handler, data,len); + if (handler->get == NULL){ + cw_log(LOG_ERR,"No get method defined for %d %s",handler->id,handler->name); + return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT; + } rc = handler->get(handler, params, data, len); diff --git a/src/cw/cw_put_msg.c b/src/cw/cw_put_msg.c index 1b7a243d..55ede4c6 100644 --- a/src/cw/cw_put_msg.c +++ b/src/cw/cw_put_msg.c @@ -94,12 +94,12 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout) l = handler->put(handler,¶ms,dst+len); - if(l>0) + /* if(l>0) cw_dbg_elem(DBG_ELEM_OUT,conn,type,handler,dst+len,l); if (strlen(details)){ cw_dbg(DBG_ELEM_DETAIL," %s",params.debug_details); } - len += l; + */ len += l; } cw_set_msg_elems_len(msgptr, len); @@ -111,7 +111,7 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout) cw_set_msg_seqnum(msgptr,s); } - return len; + return CAPWAP_RESULT_SUCCESS; } diff --git a/src/cw/cw_read_ac_descriptor.c b/src/cw/cw_read_ac_descriptor.c index ee4620be..5e2cf20a 100644 --- a/src/cw/cw_read_ac_descriptor.c +++ b/src/cw/cw_read_ac_descriptor.c @@ -1,16 +1,24 @@ #include "cw.h" #include "dbg.h" +#include "ktv.h" -/* -int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len, +static struct cw_DescriptorSubelemDef allowed_default[] = { + {0,CW_SUBELEM_AC_HARDWARE_VERSION, "ac_hardware_versision", 1024,1}, + {0,CW_SUBELEM_AC_SOFTWARE_VERSION, "ac_software_version", 1024,1}, + {0,0, NULL,0, 0} +}; + + +int cw_read_ac_descriptor(mavl_t store, uint8_t *data, int len, struct cw_DescriptorSubelemDef *allowed) { - struct cw_ac_status *status = malloc(sizeof(struct cw_ac_status)); - if (!status) - return 0; + char key[CW_KTV_MAX_KEY_LEN]; + cw_KTV_t * stations, *limit; - status->stations = cw_get_word(data); + stations = cw_ktv_add(store,"ac-descriptor/stations",CW_TYPE_WORD,data,4); + +/* status->stations = cw_get_word(data); status->limit = cw_get_word(data + 2); status->active_wtps = cw_get_word(data + 4); status->max_wtps = cw_get_word(data + 6); @@ -22,14 +30,9 @@ int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len, "AC Descriptor: WTPs:%d/%d, Stations:%d/%d, Security:%d, Rmac:%d, DTLS-Policy:%d", status->active_wtps, status->max_wtps, status->stations, status->limit, status->security, status->rmac_field, status->dtls_policy); +*/ +/* mbag_set_ptr(store, CW_ITEM_AC_STATUS, status);*/ - mbag_set_ptr(store, CW_ITEM_AC_STATUS, status); - - static struct cw_DescriptorSubelemDef allowed_default[] = { - {0,CW_SUBELEM_AC_HARDWARE_VERSION, "ac_hardware_versision", 1024,1}, - {0,CW_SUBELEM_AC_SOFTWARE_VERSION, "ac_software_version", 1024,1}, - {0,0, NULL,0, 0} - }; if (!allowed) allowed=allowed_default; @@ -38,4 +41,4 @@ int cw_read_ac_descriptor(mbag_t store, uint8_t *data, int len, } -*/ + diff --git a/src/cw/cw_type_byte.c b/src/cw/cw_type_byte.c index 06b86cf7..192ff92f 100644 --- a/src/cw/cw_type_byte.c +++ b/src/cw/cw_type_byte.c @@ -35,9 +35,9 @@ static int put(const cw_KTV_t *data, uint8_t * dst) static int to_str(const cw_KTV_t *data, char *dst, int max_len) { - if (max_len<3){ + /*if (max_len<3){ return 0; - } + }*/ return sprintf(dst, "%d", data->val.byte); } diff --git a/src/cw/cw_type_ipaddress.c b/src/cw/cw_type_ipaddress.c index f383d967..624770f8 100644 --- a/src/cw/cw_type_ipaddress.c +++ b/src/cw/cw_type_ipaddress.c @@ -94,7 +94,7 @@ static struct cw_KTV *from_str ( struct cw_KTV * data, const char *src ) } static int len ( struct cw_KTV * data ){ - return bstr16_len(data->val.ptr); + return bstr_len(data->val.ptr); } diff --git a/src/cw/ktv.h b/src/cw/ktv.h index 9f9c28e1..3b181230 100644 --- a/src/cw/ktv.h +++ b/src/cw/ktv.h @@ -114,7 +114,7 @@ cw_KTV_t * cw_ktv_get(mavl_t ktv, const char *key, const cw_Type_t * type); uint8_t cw_ktv_get_byte(mavl_t ktv,const char *key, uint8_t def); uint16_t cw_ktv_get_word(mavl_t ktv,const char *key, uint16_t def); -cw_KTV_t * cw_ktv_idx_get(mavl_t ktv, const char *key, int idx, const cw_Type_t * type); +int cw_ktv_idx_get(mavl_t ktv, const char *key, int idx, const cw_Type_t * type); extern const cw_Type_t * cw_ktv_std_types[]; diff --git a/src/cw/lw.h b/src/cw/lw.h index be356b28..fda98fb6 100644 --- a/src/cw/lw.h +++ b/src/cw/lw.h @@ -55,7 +55,7 @@ /** * Same as #lw_set_word, but no return value */ -#define lw_set_word(dst,b) \ +#define lw_set_word(dst,w) \ (*((uint16_t*)(dst)) = htons(w)) /** diff --git a/src/cw/lw_elem_id_to_str.c b/src/cw/lw_elem_id_to_str.c index 8d5d0439..d77d9493 100644 --- a/src/cw/lw_elem_id_to_str.c +++ b/src/cw/lw_elem_id_to_str.c @@ -7,16 +7,16 @@ const char * lw_elem_id_to_str(int elem_id) { switch (elem_id){ - case LW_ELEM_AC_ADDRESS: + case LWAPP_ELEM_AC_ADDRESS: return "AC Address"; - case LW_ELEM_WTP_DESCRIPTOR: + case LWAPP_ELEM_WTP_DESCRIPTOR: return "WTP Descriptor"; - case LW_ELEM_WTP_NAME: + case LWAPP_ELEM_WTP_NAME: return "WTP Name"; - case LW_ELEM_AC_DESCRIPTOR: + case LWAPP_ELEM_AC_DESCRIPTOR: return "AC Descriptor"; case LW_ELEM_AC_NAME: diff --git a/src/cw/lw_inline.c b/src/cw/lw_inline.c index 3ea0ece4..b88d7765 100644 --- a/src/cw/lw_inline.c +++ b/src/cw/lw_inline.c @@ -14,16 +14,6 @@ int lw_put_data(uint8_t*dst,const uint8_t*data,uint16_t len) return len; } -/** - * Put a #bstr_t to an output buffer - * @param dst Destination - * @param b bstr to put - * @return The number of bytes put - */ -int lw_put_bstr(uint8_t * dst, const bstr_t b){ - lw_put_data(dst,bstr_data(b),bstr_len(b)); - return bstr_len(b); -} /** * Put a #bstr16_t to an output buffer diff --git a/src/cw/lw_put_bstr.c b/src/cw/lw_put_bstr.c new file mode 100644 index 00000000..6911a002 --- /dev/null +++ b/src/cw/lw_put_bstr.c @@ -0,0 +1,12 @@ +#include "lw.h" + +/** + * Put a #bstr_t to an output buffer + * @param dst Destination + * @param b bstr to put + * @return The number of bytes put + */ +int lw_put_bstr(uint8_t * dst, const bstr_t b){ + lw_put_data(dst,bstr_data(b),bstr_len(b)); + return bstr_len(b); +} diff --git a/src/cw/lw_put_image_data.c b/src/cw/lw_put_image_data.c index 28ed287e..24a83f85 100644 --- a/src/cw/lw_put_image_data.c +++ b/src/cw/lw_put_image_data.c @@ -9,7 +9,7 @@ int lw_put_image_data(uint8_t *dst,FILE *infile) return 1; } - int bytes = fread(dst+3,1,LW_BLOCKSIZE_IMAGE_DATA,infile); + int bytes = fread(dst+3,1,LWAPP_BLOCKSIZE_IMAGE_DATA,infile); if ( ferror(infile)) { lw_put_byte(dst+0,5); diff --git a/src/cw/lw_readelem_wtp_name.c b/src/cw/lw_readelem_wtp_name.c index a8a80bfe..7eecbd77 100644 --- a/src/cw/lw_readelem_wtp_name.c +++ b/src/cw/lw_readelem_wtp_name.c @@ -38,7 +38,7 @@ */ int lw_readelem_wtp_name(uint8_t ** dst, int type, uint8_t * msgelem, int len) { - if (type != LW_ELEM_WTP_NAME) + if (type != LWAPP_ELEM_WTP_NAME) return 0; diff --git a/src/cw/lwapp.h b/src/cw/lwapp.h index f1cacf10..33c183d5 100644 --- a/src/cw/lwapp.h +++ b/src/cw/lwapp.h @@ -49,7 +49,7 @@ #define LWAPP_DATA_PORT_STR "12223" /** Block Size for Image Data */ -#define LW_BLOCKSIZE_IMAGE_DATA 1024 +#define LWAPP_BLOCKSIZE_IMAGE_DATA 1024 /**@}*/ @@ -91,11 +91,11 @@ */ -#define LW_MSG_DISCOVERY_REQUEST 1 -#define LW_MSG_DISCOVERY_RESPONSE 2 +#define LWAPP_MSG_DISCOVERY_REQUEST 1 +#define LWAPP_MSG_DISCOVERY_RESPONSE 2 -#define LW_MSG_JOIN_REQUEST 3 -#define LW_MSG_JOIN_RESPONSE 4 +#define LWAPP_MSG_JOIN_REQUEST 3 +#define LWAPP_MSG_JOIN_RESPONSE 4 /* Join ACK 5 @@ -125,11 +125,11 @@ /* LWAPP message elements */ -#define LW_ELEM_AC_ADDRESS 2 -#define LW_ELEM_WTP_DESCRIPTOR 3 -#define LW_ELEM_WTP_NAME 5 -#define LW_ELEM_AC_DESCRIPTOR 6 -#define LW_ELEM_ADD_WLAN 7 +#define LWAPP_ELEM_AC_ADDRESS 2 +#define LWAPP_ELEM_WTP_DESCRIPTOR 3 +#define LWAPP_ELEM_WTP_NAME 5 +#define LWAPP_ELEM_AC_DESCRIPTOR 6 +#define LWAPP_ELEM_ADD_WLAN 7 #define LW_ELEM_MAC_OPERATION 11 #define LW_ELEM_TX_POWER 12 diff --git a/src/cw/mavl.h b/src/cw/mavl.h index 8fec7d5d..8bd2b6ac 100644 --- a/src/cw/mavl.h +++ b/src/cw/mavl.h @@ -115,7 +115,7 @@ typedef struct mavl * mavl_t; /** * @param node node */ -#define mavlnode_dataptr(node) (((uint8_t*)(node))+sizeof(struct mavlnode)) +#define mavlnode_dataptr(node) ((void*)(((uint8_t*)(node))+sizeof(struct mavlnode))) struct mavl *mavl_create ( int ( *cmp ) ( const void *, const void * ), void ( *del ) ( void * ), size_t data_size ); @@ -129,8 +129,9 @@ void mavl_destroy ( struct mavl *t ); void mavl_del_all ( struct mavl *t ); void mavl_merge ( mavl_t m, mavl_t t ); void mavlnode_destroy ( struct mavl *t, struct mavlnode *n ); -struct mavlnode *mavl_get_node ( struct mavl *t, void *data ); - +struct mavlnode *mavlnode_get ( struct mavl *t, void *data ); +struct mavlnode * mavl_get_node_cmp(struct mavl *t ,void *data, + int ( *cmp ) ( const void *, const void * )); diff --git a/src/cw/mavl_get.c b/src/cw/mavl_get.c index 838099f9..8fe76d4a 100644 --- a/src/cw/mavl_get.c +++ b/src/cw/mavl_get.c @@ -20,7 +20,6 @@ * @brief Implementation of mavl_get */ -#include #include "mavl.h" diff --git a/src/cw/mavl_get_node.c b/src/cw/mavl_get_node.c index 3d14cba0..b09bf92b 100644 --- a/src/cw/mavl_get_node.c +++ b/src/cw/mavl_get_node.c @@ -17,12 +17,10 @@ */ -#include - #include "mavl.h" -struct mavlnode * mavl_get_node(struct mavl *t ,void *data) +struct mavlnode * mavlnode_get(struct mavl *t ,void *data) { struct mavlnode *n = t->root; while(n){ @@ -36,4 +34,3 @@ struct mavlnode * mavl_get_node(struct mavl *t ,void *data) } return NULL; } - diff --git a/src/cw/mavl_get_node_cmp..c b/src/cw/mavl_get_node_cmp..c new file mode 100644 index 00000000..d45a2e05 --- /dev/null +++ b/src/cw/mavl_get_node_cmp..c @@ -0,0 +1,18 @@ + +#include "mavl.h" + +struct mavlnode * mavl_get_node_cmp(struct mavl *t ,void *data, + int ( *cmp ) ( const void *, const void * )) +{ + struct mavlnode *n = t->root; + while(n){ + int rc=cmp(data,mavlnode_dataptr(n)); + if (rc==0) + return n; + if (rc<0) + n=n->left; + else + n=n->right; + } + return NULL; +} diff --git a/src/cw/mavl_merge.c b/src/cw/mavl_merge.c index 83d088d5..731a3c6e 100644 --- a/src/cw/mavl_merge.c +++ b/src/cw/mavl_merge.c @@ -27,7 +27,7 @@ static void mavlnode_move(mavl_t m,mavl_t t, struct mavlnode *n) { - struct mavlnode * mn = mavl_get_node(m,mavlnode_dataptr(n)); + struct mavlnode * mn = mavlnode_get(m,mavlnode_dataptr(n)); if (mn) { if (m->del) { m->del(mavlnode_dataptr(mn)); diff --git a/src/mod/Mod.mak b/src/mod/Mod.mak index e7f601d1..65cbfcbc 100644 --- a/src/mod/Mod.mak +++ b/src/mod/Mod.mak @@ -23,12 +23,12 @@ $(OBJDIR)/%.o:%.c $(SNAME) : $(OBJS) $(MODOBJS) @mkdir -p $(LIBARCHDIR) @echo " $(AR) $(SNAME)" - $(AR) rcs $(SNAME) $(OBJS) $(MODOBJS) + @$(AR) rcs $(SNAME) $(OBJS) $(MODOBJS) $(DNAME) : $(OBJS) $(MODOBJS) @mkdir -p $(LIBARCHDIR) @echo " $(CC) $(DNAME)" - $(LD) -L$(LIBARCHDIR) $(LDFLAGS) -shared -o $(DNAME) $(OBJS) $(MODOBJS) $(SLIBS) $(LIBS) + @$(LD) -L$(LIBARCHDIR) $(LDFLAGS) -shared -o $(DNAME) $(OBJS) $(MODOBJS) $(SLIBS) $(LIBS) $(MODNAME) : $(DNAME) cp $(DNAME) $(MODNAME) diff --git a/src/mod/capwap/Makefile b/src/mod/capwap/Makefile index 2bdf0a2e..6c423d62 100644 --- a/src/mod/capwap/Makefile +++ b/src/mod/capwap/Makefile @@ -15,7 +15,8 @@ OBJS=\ capwap_in_session_id.o \ capwap_in_vendor_specific_payload.o \ capwap_in_mtu_discovery_padding.o \ - capwap_out_capwap_control_ip_address.o + capwap_out_capwap_control_ip_address.o \ + capwap_in_capwap_control_ip_address.o LIBDIR := ../../../lib diff --git a/src/mod/capwap/capwap_actions_ac.c b/src/mod/capwap/capwap_actions_ac.c index ef8edbb8..9f504416 100644 --- a/src/mod/capwap/capwap_actions_ac.c +++ b/src/mod/capwap/capwap_actions_ac.c @@ -31,47 +31,47 @@ static struct cw_ElemHandler handlers[] = { { - "Discovery Type", /* name */ - CAPWAP_ELEM_DISCOVERY_TYPE, /* Element ID */ - 0,0, /* Vendor / Proto */ - 1,1, /* min/max length */ - CW_TYPE_BYTE, /* type */ - CW_KEY_DISCOVERY_TYPE, /* Key */ - cw_in_generic, /* get */ - cw_out_generic /* put */ + "Discovery Type", /* name */ + CAPWAP_ELEM_DISCOVERY_TYPE, /* Element ID */ + 0,0, /* Vendor / Proto */ + 1,1, /* min/max length */ + CW_TYPE_BYTE, /* type */ + CW_KEY_DISCOVERY_TYPE, /* Key */ + cw_in_generic, /* get */ + cw_out_generic /* put */ } , { - "WTP Mac Type", /* name */ - CAPWAP_ELEM_WTP_MAC_TYPE, /* Element ID */ - 0,0, /* Vendor / Proto */ - 1,1, /* min/max length */ - CW_TYPE_BYTE, /* type */ - CW_KEY_WTP_MAC_TYPE, /* Key */ - cw_in_generic, /* get */ - cw_out_generic /* put */ + "WTP Mac Type", /* name */ + CAPWAP_ELEM_WTP_MAC_TYPE, /* Element ID */ + 0,0, /* Vendor / Proto */ + 1,1, /* min/max length */ + CW_TYPE_BYTE, /* type */ + CW_KEY_WTP_MAC_TYPE, /* Key */ + cw_in_generic, /* get */ + cw_out_generic /* put */ } , { - "WTP Board Data", /* name */ - CAPWAP_ELEM_WTP_BOARD_DATA, /* Element ID */ - 0,0, /* Vendor / Proto */ - 14,1024, /* min/max length */ - NULL, /* type */ - CW_KEY_WTP_BOARD_DATA, /* Key */ - capwap_in_wtp_board_data, /* get */ - capwap_out_wtp_board_data /* put */ + "WTP Board Data", /* name */ + CAPWAP_ELEM_WTP_BOARD_DATA, /* Element ID */ + 0,0, /* Vendor / Proto */ + 14,1024, /* min/max length */ + NULL, /* type */ + CW_KEY_WTP_BOARD_DATA, /* Key */ + capwap_in_wtp_board_data, /* get */ + capwap_out_wtp_board_data /* put */ } , { - "WTP Descriptor", /* name */ - CAPWAP_ELEM_WTP_DESCRIPTOR, /* Element ID */ - 0,0, /* Vendor / Proto */ - 33,1024, /* min/max length */ - NULL, /* type */ - CW_KEY_WTP_DESCRIPTOR, /* Key */ - capwap_in_wtp_descriptor, /* get */ - capwap_out_wtp_descriptor, /* put */ + "WTP Descriptor", /* name */ + CAPWAP_ELEM_WTP_DESCRIPTOR, /* Element ID */ + 0,0, /* Vendor / Proto */ + 33,1024, /* min/max length */ + NULL, /* type */ + CW_KEY_WTP_DESCRIPTOR, /* Key */ + capwap_in_wtp_descriptor, /* get */ + capwap_out_wtp_descriptor, /* put */ } , { @@ -136,10 +136,10 @@ static struct cw_ElemHandler handlers[] = { "CAPWAP Control IPv4 Address", /* name */ CW_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS, /* Element ID */ 0,0, /* Vendor / Proto */ - 0,0, /* min/max length */ + 6,6, /* min/max length */ CW_TYPE_BSTR16, /* type */ "capwap-control-ip-address", /* Key */ - NULL, /* get */ + capwap_in_capwap_control_ip_address, /* get */ capwap_out_capwap_control_ip_address /* put */ }, @@ -147,10 +147,10 @@ static struct cw_ElemHandler handlers[] = { "CAPWAP Control IPv6 Address", /* name */ CW_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS, /* Element ID */ 0,0, /* Vendor / Proto */ - 0,0, /* min/max length */ + 18,18, /* min/max length */ CW_TYPE_BSTR16, /* type */ "capwap-control-ip-address", /* Key */ - NULL, /* get */ + capwap_in_capwap_control_ip_address, /* get */ capwap_out_capwap_control_ip_address /* put */ } diff --git a/src/cw/cw_in_capwap_control_ip_address.c b/src/mod/capwap/capwap_in_capwap_control_ip_address.c similarity index 63% rename from src/cw/cw_in_capwap_control_ip_address.c rename to src/mod/capwap/capwap_in_capwap_control_ip_address.c index 42021d68..cbb0c17d 100644 --- a/src/cw/cw_in_capwap_control_ip_address.c +++ b/src/mod/capwap/capwap_in_capwap_control_ip_address.c @@ -21,46 +21,28 @@ * @brief Implements cw_in_capwap_control_ip_address */ -#include -#include -#include -#include +#include "mod_capwap.h" -#include - - - -#include "log.h" - -#include "cw.h" - -#include "aciplist.h" -#include "sock.h" - - - -int cw_in_capwap_control_ip_address(struct conn *conn, struct cw_action_in *a, - uint8_t * data, int len,struct sockaddr *from) +int capwap_in_capwap_control_ip_address(struct cw_ElemHandler *eh, + struct cw_ElemHandlerParams *params, + uint8_t * data, int len) { -/* cw_acip_t * acip; - cw_aciplist_t list = - mbag_get_mavl_c(conn->incomming,a->item_id,cw_aciplist_create); - - if (!list) { - cw_log(LOG_ERR, "Error: Can't allocate CAWPAP IP Adress List"); - return 0; - } - - - acip = malloc(sizeof(cw_acip_t)); - if (!acip) { - cw_log(LOG_ERR,"Can't allocate memory for acv4ip: %s",strerror(errno)); - return 0; - } - + char key[CW_KTV_MAX_KEY_LEN]; + int idx; - if (a->elem_id == CW_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS) { + sprintf(key,"%s/address",eh->key); + idx = cw_ktv_idx_get(params->conn->remote_cfg,key,0,CW_TYPE_IPADDRESS); + + printf("SKEY is %s , idx: %d\n",key,idx); + + sprintf(key,"%s/address.%d",eh->key,idx+1); + cw_ktv_add(params->conn->remote_cfg,key,CW_TYPE_IPADDRESS,data,len-2); + + sprintf(key,"%s/wtps.%d",eh->key,idx+1); + cw_ktv_add(params->conn->remote_cfg,key,CW_TYPE_WORD,data+len-2,2); + +/* if (handler-id == CW_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS) { struct sockaddr_in addr; memcpy(&addr.sin_addr,data,4); addr.sin_family=AF_INET; @@ -78,11 +60,11 @@ int cw_in_capwap_control_ip_address(struct conn *conn, struct cw_action_in *a, memcpy(&acip->ip,&addr,sizeof(addr)); acip->index = cw_get_word(data+16); } - - - cw_aciplist_replace(list,acip); */ + + + return 1; } diff --git a/src/mod/capwap/capwap_out_capwap_control_ip_address.c b/src/mod/capwap/capwap_out_capwap_control_ip_address.c index efc0cbe2..5e81f928 100644 --- a/src/mod/capwap/capwap_out_capwap_control_ip_address.c +++ b/src/mod/capwap/capwap_out_capwap_control_ip_address.c @@ -1,3 +1,6 @@ + +#include "cw/cw.h" +#include "cw/dbg.h" #include "mod_capwap.h" /* @@ -47,40 +50,56 @@ static int put_ip(uint8_t *dst void *priv, cw_acip_t * acip void *data) int capwap_out_capwap_control_ip_address(struct cw_ElemHandler * eh, struct cw_ElemHandlerParams * params, uint8_t * dst) { - int i; - int wtps; - - - cw_KTV_t * address; - char key[CW_KTV_MAX_KEY_LEN]; - - i=0; - - sprintf(key,"%s/address.%d",eh->key,i); - address = cw_ktv_get(params->conn->local_cfg,key,CW_TYPE_IPADDRESS); - - sprintf(key,"%s/wtps.%d",eh->key,i); - wtps = cw_ktv_get_word(params->conn->local_cfg,key,0); - - while (address != NULL) { - char str[100]; - printf("Yea!"); - address->type->to_str(address,str,10); - printf("Hier isses: %s, %d\n",str,wtps); + int i; + int wtps; + cw_KTV_t * address; + uint8_t *d; + + d = dst; + i=0; + do { + uint8_t * msg; + int l; - i++; sprintf(key,"%s/address.%d",eh->key,i); address = cw_ktv_get(params->conn->local_cfg,key,CW_TYPE_IPADDRESS); sprintf(key,"%s/wtps.%d",eh->key,i); - wtps = cw_ktv_get_word(params->conn->local_cfg,key,0); - } + wtps = cw_ktv_get_word(params->conn->local_cfg,key,0); + i++; + if (address==NULL){ + break; + } + + msg = d; + + l = address->type->len(address); - - - + switch(eh->id){ + case CW_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS: + if (l!=4){ + continue; + } + break; + case CW_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS: + if (l!=16){ + continue; + } + break; + default: + continue; + } + + l = address->type->put(address,d+4); + l+=cw_put_word(dst+4+l,wtps); + l+=cw_put_elem_hdr(d,eh->id,l); + cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,eh,d+4,l-4); + + d+=l; + }while(address != NULL); - return 10; + + return d-dst; } /* diff --git a/src/mod/capwap/capwap_out_wtp_descriptor.c b/src/mod/capwap/capwap_out_wtp_descriptor.c index 3ab7db1f..f20ac9c0 100644 --- a/src/mod/capwap/capwap_out_wtp_descriptor.c +++ b/src/mod/capwap/capwap_out_wtp_descriptor.c @@ -28,7 +28,7 @@ int capwap_out_wtp_descriptor(struct cw_ElemHandler * eh, struct cw_ElemHandlerParams * params, uint8_t * dst) { char key[CW_KTV_MAX_KEY_LEN]; - int len; + int len,l; /* // XXX Dummy WTP Descriptor Header */ uint8_t *d; cw_KTV_t * val; @@ -75,5 +75,8 @@ int capwap_out_wtp_descriptor(struct cw_ElemHandler * eh, CW_SUBELEM_WTP_BOOTLOADER_VERSION, key); len = d-dst-4; - return len + cw_put_elem_hdr(dst,eh->id,len); + l = len + cw_put_elem_hdr(dst,eh->id,len); + + cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,eh,dst,l); + return l; } diff --git a/src/mod/capwap/mod_capwap.h b/src/mod/capwap/mod_capwap.h index 6904fb6a..b096e515 100644 --- a/src/mod/capwap/mod_capwap.h +++ b/src/mod/capwap/mod_capwap.h @@ -23,7 +23,9 @@ int capwap_out_ac_descriptor(struct cw_ElemHandler * eh, int capwap_out_capwap_control_ip_address(struct cw_ElemHandler * eh, struct cw_ElemHandlerParams * params, uint8_t * dst); - +int capwap_in_capwap_control_ip_address(struct cw_ElemHandler *eh, + struct cw_ElemHandlerParams *params, + uint8_t * data, int len); diff --git a/src/mod/cisco/cisco_actions_ac.c b/src/mod/cisco/cisco_actions_ac.c index c64836e2..218c4306 100644 --- a/src/mod/cisco/cisco_actions_ac.c +++ b/src/mod/cisco/cisco_actions_ac.c @@ -81,8 +81,9 @@ 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_WTP_DESCRIPTOR, 1, 0}, - {0,CW_VENDOR_ID_CISCO, CW_CISCO_RAD_NAME, 1, 0}, - {0,CW_VENDOR_ID_CISCO, CW_CISCO_BOARD_DATA_OPTIONS, 1, 0}, + {0,0, CAPWAP_ELEM_WTP_BOARD_DATA, 0, 0}, + {0,CW_VENDOR_ID_CISCO, CW_CISCO_RAD_NAME, 1, 0}, + {0,CW_VENDOR_ID_CISCO, CW_CISCO_BOARD_DATA_OPTIONS, 0, 0}, {0,0,0,00} }; diff --git a/src/wtp/discovery.c b/src/wtp/discovery.c index 23bf01d1..4f530215 100644 --- a/src/wtp/discovery.c +++ b/src/wtp/discovery.c @@ -3,6 +3,7 @@ #include #include + #include "cw/capwap.h" #include "cw/conn.h" #include "cw/sock.h" @@ -24,12 +25,7 @@ static int run_discovery(struct conn *conn) conn->capwap_state = CAPWAP_STATE_DISCOVERY; - cw_ktv_add(conn->local_cfg, "discovery_type", CW_TYPE_BYTE, &dtype,1); -/* mbag_set_byte(conn->outgoing, CW_ITEM_DISCOVERY_TYPE, - CAPWAP_DISCOVERY_TYPE_UNKNOWN); -*/ - - + /*cw_ktv_add(conn->local_cfg, "discovery-type", CW_TYPE_BYTE, &dtype,17);*/ cw_init_request(conn, CAPWAP_MSG_DISCOVERY_REQUEST); @@ -39,11 +35,11 @@ static int run_discovery(struct conn *conn) timer = cw_timer_start(0); -/* + while (!cw_timer_timeout(timer) && conn->capwap_state == CAPWAP_STATE_DISCOVERY) { int rc; - mavl_del_all(conn->incomming); + /*mavl_del_all(conn->incomming);*/ rc = cw_read_from(conn); @@ -55,7 +51,7 @@ static int run_discovery(struct conn *conn) break; } } -*/ + /* mbag_t discs; diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index 6019011c..4a72a92d 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -50,6 +50,7 @@ static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg) break; case 'c': bootcfg->cfgfilename = optarg; + break; case '?': exit(EXIT_FAILURE); default: @@ -98,13 +99,15 @@ int main (int argc, char **argv) for (ti=CW_KTV_STD_TYPES;*ti;ti++){ mavl_add_ptr(types_tree,*ti); } - + /* read the initial config file */ file = fopen(bootcfg.cfgfilename,"r"); + if (file == NULL){ - cw_log(LOG_ERR,"Cant open file '%s':%s", strerror(errno)); + cw_log(LOG_ERR,"Can't open file '%s':%s",bootcfg.cfgfilename, strerror(errno)); exit(EXIT_FAILURE); } + cw_ktv_read_file(file,global_cfg,types_tree); @@ -133,8 +136,8 @@ int main (int argc, char **argv) conn->dtls_mtu = 12000; conn->msgset=msgset; conn->local_cfg = global_cfg; - - + conn->remote_cfg = cw_ktv_create(); + conn->receiver = CW_RECEIVER_WTP; cw_run_discovery(conn, "255.255.255.255",NULL); diff --git a/wtp.project b/wtp.project index 3f566325..d8a1f639 100644 --- a/wtp.project +++ b/wtp.project @@ -27,6 +27,7 @@ +