diff --git a/ac.project b/ac.project
index 5a16c217..5768a631 100644
--- a/ac.project
+++ b/ac.project
@@ -22,6 +22,7 @@
+
diff --git a/libcw.project b/libcw.project
index 68d0c7b4..e928bb53 100644
--- a/libcw.project
+++ b/libcw.project
@@ -275,6 +275,7 @@
+
diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c
index 3c983ed3..61890c65 100644
--- a/src/ac/ac_main.c
+++ b/src/ac/ac_main.c
@@ -175,6 +175,7 @@ void mavl_walk (struct mavlnode * node)
}
+/*
int stcmp (const void * sa1, const void *sa2)
{
const char **s1 = sa1;
@@ -185,9 +186,93 @@ int stcmp (const void * sa1, const void *sa2)
printf ("CMP %s, %s = %d\n", *s1, *s2, rc);
return rc;
}
+*/
+#include "discovery_cache.h"
+tester()
+{
+ struct cw_DiscoveryCache * cache;
+ struct sockaddr_storage a1,a2,a3,a4,a5,a6;
+ cache = discovery_cache_create(10);
+
+ sock_strtoaddr("192.168.0.2:11",(struct sockaddr*)&a1);
+ sock_strtoaddr("192.168.0.1:3",(struct sockaddr*)&a3);
+ sock_strtoaddr("192.168.0.1:6",(struct sockaddr*)&a4);
+ sock_strtoaddr("192.168.0.1:9",(struct sockaddr*)&a5);
+ sock_strtoaddr("192.168.0.1:1",(struct sockaddr*)&a6);
+ sock_strtoaddr("192.168.0.1:2",(struct sockaddr*)&a2);
+
+ discovery_cache_add(cache, (struct sockaddr*)&a1,"capwap","ciscon");
+
+ discovery_cache_add(cache, (struct sockaddr*)&a3,"capwap","ciscoc");
+ discovery_cache_add(cache, (struct sockaddr*)&a4,"capwap","ciscod");
+ discovery_cache_add(cache, (struct sockaddr*)&a5,"capwap","ciscoe");
+ discovery_cache_add(cache, (struct sockaddr*)&a6,"capwap","ciscof");
+ discovery_cache_add(cache, (struct sockaddr*)&a2,"capwap","ciscob");
+
+ {
+ struct cw_DiscoveryCacheElem * elem;
+ struct sockaddr_storage s;
+
+ sock_strtoaddr("192.168.0.1:800", (struct sockaddr*)&s);
+
+
+ elem = discovery_cache_get(cache,(struct sockaddr*)&s);
+ if (elem){
+ printf("Found = %s %s\n", elem->mod_capwap, elem->mod_bindings);
+ }
+ else{
+ printf("no elem\n");
+ }
+
+ }
+
+}
+
+static int ibcmp(const void *v1, const void *v2)
+{
+ int *i1,*i2;
+ i1=v1;i2=v2;
+
+ return *i1-*i2;
+}
+
+void tester1()
+{
+ mavl_t tree;
+ int val;
+ mavliter_t it;
+
+ tree = mavl_create(ibcmp,NULL,sizeof(int));
+ val = 3;
+ mavl_add(tree,&val,NULL);
+ val = 7;
+ mavl_add(tree,&val,NULL);
+
+ val = 2;
+ mavl_add(tree,&val,NULL);
+
+ mavliter_init(&it,tree);
+ mavliter_foreach(&it){
+ int *result;
+ result = mavliter_get(&it);
+ printf("Result: %i\n",*result);
+ }
+
+ val = 2;
+ mavl_del(tree,&val);
+
+
+ mavliter_init(&it,tree);
+ mavliter_foreach(&it){
+ int *result;
+ result = mavliter_get(&it);
+ printf("Result: %i\n",*result);
+ }
+
+}
int main (int argc, char *argv[])
@@ -197,6 +282,11 @@ int main (int argc, char *argv[])
FILE * file;
mavl_t types_tree, global_cfg;
const cw_Type_t **ti;
+tester1();
+exit(0);
+
+
+
/* parse arguments */
parse_args (argc, argv, &bootcfg);
diff --git a/src/ac/discovery_cache.c b/src/ac/discovery_cache.c
index e04773f5..8a857a87 100644
--- a/src/ac/discovery_cache.c
+++ b/src/ac/discovery_cache.c
@@ -1,25 +1,161 @@
+#include
+#include "cw/sock.h"
#include "cw/mlist.h"
#include "cw/mavl.h"
+#include "discovery_cache.h"
+
struct cw_DiscoveryCache{
int len;
+ int qpos;
+ int qdel;
+ mavl_t byaddrp;
+ mavl_t byaddr;
+ struct cw_DiscoveryCacheElem * queue;
+ uint32_t ctrlo, ctrhi;
};
-struct CacheElem{
- struct sockaddr_storage addr;
- const char *mod_capwap;
- const char *mod_bindings;
-
-};
void discovery_cache_destroy(struct cw_DiscoveryCache * c)
{
+ if (c->byaddr)
+ mavl_destroy(c->byaddr);
+
+ if (c->byaddrp)
+ mavl_destroy(c->byaddrp);
+
+ free(c);
+}
+
+
+static int cmpaddrp ( const void * d1, const void *d2 )
+{
+ struct cw_DiscoveryCacheElem * c1 = * ( void ** ) d1 ;
+ struct cw_DiscoveryCacheElem * c2 = * ( void ** ) d2 ;
+ return sock_cmpaddr ( ( struct sockaddr* ) &c1->addr, ( struct sockaddr* ) &c2->addr, 1 );
+}
+
+
+static int cmpaddr ( const void * d1, const void *d2 )
+{
+ struct cw_DiscoveryCacheElem * c1 = * ( void ** ) d1 ;
+ struct cw_DiscoveryCacheElem * c2 = * ( void ** ) d2 ;
+ int rc;
+
+ rc = sock_cmpaddr ( ( struct sockaddr* ) &c1->addr, ( struct sockaddr* ) &c2->addr, 0 );
+ if (rc != 0)
+ return rc;
+
+ if (c1->ctrhi != c2->ctrhi)
+ return c1->ctrhi-c2->ctrhi;
+
+ return c1->ctrlo-c2->ctrlo;
+
+}
+
+
+
+
+struct cw_DiscoveryCache * discovery_cache_create(int len)
+{
+
+ int i;
+ struct cw_DiscoveryCache * cache;
+
+ cache = malloc (sizeof(struct cw_DiscoveryCache));
+ if (cache==NULL)
+ return NULL;
+
+ memset(cache,0,sizeof(struct cw_DiscoveryCache));
+ cache->queue = malloc(sizeof(struct cw_DiscoveryCacheElem)*len);
+ if (cache->queue==NULL)
+ goto errX;
+
+ for (i=0; iqueue[i].mod_capwap=NULL;
+ }
+
+ cache->byaddr = mavl_create_ptr(cmpaddr,NULL);
+ if (cache->byaddr == NULL)
+ goto errX;
+
+
+ cache->byaddrp = mavl_create_ptr(cmpaddrp,NULL);
+ if (cache->byaddrp == NULL)
+ goto errX;
+
+ cache->len=len;
+ cache->qpos=0;
+
+
+ return cache;
+errX:
+ discovery_cache_destroy(cache);
+ return NULL;
+}
+
+void discovery_cache_add(struct cw_DiscoveryCache *cache,
+ struct sockaddr * addr, const char * mod_capwap, const char * mod_bindings)
+{
+ struct cw_DiscoveryCacheElem * cur = cache->queue+cache->qpos;
+ if (cur->mod_capwap==NULL){
+ /* delete here */
+ mavl_del(cache->byaddr,cur);
+ mavl_del(cache->byaddr,cur);
+
+ }
+
+ cur->mod_capwap=mod_capwap;
+ cur->mod_bindings=mod_bindings;
+ sock_copyaddr(&cur->addr,addr);
+
+ cur->ctrhi=cache->ctrhi;
+ cur->ctrlo=cache->ctrlo;
+
+ if ((++cache->ctrlo)==0){
+ cache->ctrhi++;
+ }
+
+ mavl_add_ptr(cache->byaddr,cur);
+ mavl_add_ptr(cache->byaddrp,cur);
+
+ cache->qpos++;
+ if (cache->qpos>=cache->len)
+ cache->qpos=0;
}
-struct cw_DiscoveryCache * discovery_cache_init(int len){
+
+struct cw_DiscoveryCacheElem * discovery_cache_get(struct cw_DiscoveryCache * cache,struct sockaddr *addr)
+{
+ struct cw_DiscoveryCacheElem * elem, ** result, *search_ptr, search;
+ sock_copyaddr(&search.addr,addr);
+ search.ctrhi=search.ctrlo=0;
+
+
+ elem = mavl_get_ptr(cache->byaddrp ,&search);
+ if (elem != NULL)
+ return elem;
+
+ search.mod_capwap="hallo";
+ search_ptr = &search;
+ /*elem = *((struct cw_DiscoveryCacheElem **)
+*/
+ result = mavl_get_first(cache->byaddr, &search_ptr);
+ if (result == NULL)
+ return NULL;
+
+ elem = *result;
+ if (elem != NULL){
+ if (sock_cmpaddr((struct sockaddr*)&elem->addr,addr,0)!=0)
+ return NULL;
+
+ mavl_del(cache->byaddr,result);
+ mavl_del(cache->byaddrp,result);
+ }
return NULL;
-}
\ No newline at end of file
+
+}
diff --git a/src/ac/discovery_cache.h b/src/ac/discovery_cache.h
new file mode 100644
index 00000000..9d24e5db
--- /dev/null
+++ b/src/ac/discovery_cache.h
@@ -0,0 +1,24 @@
+#ifndef __DISCOVERY_CACHE_H
+#define __DISCOVERY_CACHE_H
+
+
+extern struct cw_DiscoveryCache;
+struct cw_DiscoveryCacheElem{
+ struct sockaddr_storage addr;
+ const char *mod_capwap;
+ const char *mod_bindings;
+ uint32_t ctrlo, ctrhi;
+};
+
+
+
+struct cw_DiscoveryCache * discovery_cache_create(int len);
+void discovery_cache_add(struct cw_DiscoveryCache *cache,
+ struct sockaddr * addr, const char * mod_capwap, const char * mod_bindings);
+
+struct cw_DiscoveryCacheElem * discovery_cache_get(
+ struct cw_DiscoveryCache * cache,struct sockaddr *addr);
+
+
+
+#endif
\ No newline at end of file
diff --git a/src/cw/Makefile b/src/cw/Makefile
index 215fb493..44d5baa0 100644
--- a/src/cw/Makefile
+++ b/src/cw/Makefile
@@ -149,6 +149,7 @@ MAVLSRC=\
mavl_foreach_lr.c\
mavl_freeptr.c\
mavl_get.c\
+ mavl_get_ext.c\
mavl_get_node.c\
mavl_get_node_cmp..c\
mavl_get_ptr.c\
diff --git a/src/cw/mavl.h b/src/cw/mavl.h
index 67f2d37d..bf061023 100644
--- a/src/cw/mavl.h
+++ b/src/cw/mavl.h
@@ -93,7 +93,8 @@ struct mavl {
*/
typedef struct mavl * mavl_t;
-
+#define MAVL_FIND_FIRST 1
+#define MAVL_FIND_LAST 2
/**
* @param node node
@@ -107,6 +108,8 @@ void *mavl_add ( struct mavl *t, const void *data, int *exists );
/*void *mavl_add ( struct mavl *t, const void *data );*/
void * mavl_get ( struct mavl *t , const void *data );
+void * mavl_get_ext(struct mavl *t ,const void *search, int mode);
+
void *mavl_del ( struct mavl *t, const void *data );
void *mavl_replace ( struct mavl *t, const void *data, int * result );
void mavl_destroy ( struct mavl *t );
@@ -118,8 +121,8 @@ struct mavlnode * mavl_get_node_cmp(struct mavl *t ,void *data,
int ( *cmp ) ( const void *, const void * ));
-
-
+#define mavl_get_first(tree,search) mavl_get_ext(tree,search,MAVL_FIND_FIRST)
+#define mavl_get_last(tree,search) mavl_get_ext(tree,search,MAVL_FIND_LAST)
diff --git a/src/cw/mavl_get_ext.c b/src/cw/mavl_get_ext.c
new file mode 100644
index 00000000..53e5fbe4
--- /dev/null
+++ b/src/cw/mavl_get_ext.c
@@ -0,0 +1,49 @@
+#include "mavl.h"
+
+
+
+void * mavl_get_ext(struct mavl *t ,const void *search, int mode)
+{
+
+ struct mavlnode *n,/**lastl,*/*last;
+ last = NULL; /*lastl=NULL;*/
+ n = t->root;
+ while(n){
+ int rc;
+
+ rc = t->cmp(search,mavlnode_dataptr(n));
+
+ /*printf("Compare: %s %s = %d\n",c1->key,c2->key, rc);*/
+
+ if (rc==0){
+ return mavlnode_dataptr(n);
+
+ }
+
+ if (rc<0){
+ if (mode == MAVL_FIND_FIRST)
+ last = n;
+ if (n->left==NULL){
+ if (last == NULL)
+ return NULL;
+ return mavlnode_dataptr(last);
+
+ }
+ n=n->left;
+ }
+ else{
+ if (mode == MAVL_FIND_LAST)
+ last=n;
+
+ if(n->right==NULL){
+ if (last == NULL)
+ return NULL;
+ return mavlnode_dataptr(last);
+
+ }
+ n=n->right;
+ }
+ }
+ return NULL;
+}
+
diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c
index 33a53b07..9fe18488 100644
--- a/src/wtp/wtp_main.c
+++ b/src/wtp/wtp_main.c
@@ -23,6 +23,8 @@ struct bootcfg{
};
+
+
static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
{
int c;
@@ -83,6 +85,9 @@ int main (int argc, char **argv)
int i;
struct cw_DiscoveryResult dis;
+
+
+
bootcfg.nmods=0;
/* read command line args, results are in bootcfg */