diff --git a/actube.workspace b/actube.workspace index c63c2d68..e0162c79 100644 --- a/actube.workspace +++ b/actube.workspace @@ -4,8 +4,8 @@ - - + + diff --git a/libcw.project b/libcw.project index c38ad210..9b14c05c 100644 --- a/libcw.project +++ b/libcw.project @@ -284,6 +284,9 @@ + + + diff --git a/src/cw/Makefile b/src/cw/Makefile index 026b4af8..c9303187 100644 --- a/src/cw/Makefile +++ b/src/cw/Makefile @@ -60,8 +60,11 @@ CWSRC=\ cw_in_generic.c\ cw_in_generic_struct.c\ cw_in_radio_generic_struct.c\ + cw_in_idx_generic.c\ + cw_in_idx_generic_struct.c\ cw_in_generic_enum.c\ cw_out_generic_struct.c\ + cw_out_idx_generic_struct.c\ cw_init_data_keep_alive_msg.c\ cw_inline.c\ cw_in_wtp_reboot_statistics.c\ diff --git a/src/cw/cw.h b/src/cw/cw.h index 43ae685e..b2709467 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -386,10 +386,15 @@ int cw_setup_dtls(struct conn * conn, mavl_t cfg, const char *prefix, char * de * @{ */ - /* -int cw_in_generic(struct conn * conn, struct cw_ElemHandler * handler, - uint8_t * elem_data, int elem_len, struct sockaddr * from); -*/ + + +int cw_in_idx_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params, + uint8_t * elem_data, int elem_len); +int cw_in_idx_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params, + uint8_t * elem_data, int elem_len); + +int cw_out_idx_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params + , uint8_t * dst); int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params, uint8_t * elem_data, int elem_len); diff --git a/src/cw/cw_in_idx_generic.c b/src/cw/cw_in_idx_generic.c new file mode 100644 index 00000000..790a1098 --- /dev/null +++ b/src/cw/cw_in_idx_generic.c @@ -0,0 +1,25 @@ +#include "cw.h" +#include "log.h" + +int cw_in_idx_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params, + uint8_t * elem_data, int elem_len) +{ + char key[CW_KTV_MAX_KEY_LEN]; + cw_KTV_t * result; + int idx; + + if (!handler->type){ + cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name); + return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT; + } + + idx=cw_get_byte(elem_data); + sprintf(key,handler->key,idx); + + result = cw_ktv_add(params->conn->remote_cfg, key, + handler->type, elem_data+1,elem_len-1); + + params->elem=result; + + return CAPWAP_RESULT_SUCCESS; +} diff --git a/src/cw/cw_in_idx_generic_struct.c b/src/cw/cw_in_idx_generic_struct.c new file mode 100644 index 00000000..79c00013 --- /dev/null +++ b/src/cw/cw_in_idx_generic_struct.c @@ -0,0 +1,25 @@ + +#include "capwap.h" +#include "msgset.h" +#include "ktv.h" +#include "log.h" +#include "cw.h" + +int cw_in_idx_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params, + uint8_t * elem_data, int elem_len) +{ + char key[CW_KTV_MAX_KEY_LEN]; + int idx; + + if (!handler->type){ + cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name); + return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT; + } + + idx = cw_get_byte(elem_data); + sprintf(key, handler->key, idx); + + cw_ktv_read_struct(params->conn->remote_cfg,handler->type,key,elem_data+1,elem_len-1); + + return CAPWAP_RESULT_SUCCESS; +} diff --git a/src/cw/cw_out_idx_generic_struct.c b/src/cw/cw_out_idx_generic_struct.c new file mode 100644 index 00000000..3f9e9eba --- /dev/null +++ b/src/cw/cw_out_idx_generic_struct.c @@ -0,0 +1,51 @@ + +#include "cw.h" +#include "dbg.h" + +int cw_out_idx_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params + , uint8_t * dst) +{ + char key[CW_KTV_MAX_KEY_LEN]; + struct cw_KTV * elem, search; + + int len,i,l; + int radios; + int fint, sr; + + len =0; + + i=0; + + + do { + sprintf(key,handler->key,i); + search.key=key; + /*elem = mavl_get(params->conn->local_cfg, &search);*/ + elem = mavl_get_first(params->conn->local_cfg,&search); + if(elem != NULL){ + printf("Elem key: %s",elem->key); + } + sr = sscanf(elem->key,handler->key,&fint); + + if (sr!=1) + break; + if (fint<=i) + break; + + printf("Here we are '%s'! --> %d\n",key,fint); + i=fint+1; + + }while(1); + + exit(0); + + radios = cw_ktv_get_byte(params->conn->local_cfg,"wtp-descriptor/max-radios",0); + + for(i=1;iconn,params->msgdata->type,handler,dst,l); + len+=l; + } + return len; +} + diff --git a/src/mod/cisco/cisco_actions_ac.c b/src/mod/cisco/cisco_actions_ac.c index 7b7e6dfa..aee92857 100644 --- a/src/mod/cisco/cisco_actions_ac.c +++ b/src/mod/cisco/cisco_actions_ac.c @@ -500,9 +500,9 @@ static struct cw_ElemHandler handlers[] = { CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */ 5,5, /* min/max length */ cisco_ap_regulatory_domain, /* type */ - "cisco/regulatory-domain", /* Key */ - cw_in_radio_generic_struct, /* get */ - NULL /* put */ + "cisco/regulatory-domain/%03d", /* Key */ + cw_in_idx_generic_struct, /* get */ + cw_out_idx_generic_struct /* put */ }, {0,0,0,0,0,0,0,0} diff --git a/src/wtp/join.c b/src/wtp/join.c index f6a3f34d..d137da91 100644 --- a/src/wtp/join.c +++ b/src/wtp/join.c @@ -205,6 +205,7 @@ int join(struct conn * conn, struct cw_DiscoveryResult * dis) mavliter_init(&ii,dis->prio_ip); mavliter_foreach(&ii){ + int rc; cw_KTV_t * val,*ac; mavl_t rcfg; char * rk; @@ -234,7 +235,9 @@ int join(struct conn * conn, struct cw_DiscoveryResult * dis) sock_strtoaddr(ipstr,(struct sockaddr*)(&sockaddr)); sock_setport((struct sockaddr*)&sockaddr,5246); - run_join_d(conn,(struct sockaddr*)(&sockaddr)); + rc = run_join_d(conn,(struct sockaddr*)(&sockaddr)); + if (rc) + return 1; } return 0;