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 @@
+