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;