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 */