Work on discovery cache
FossilOrigin-Name: 42e420b380c09de60f46dc30fcb12a3480f7c6441e438bf45a4066d74369215f
This commit is contained in:
parent
3d51c17a9a
commit
13b53ee3bc
@ -22,6 +22,7 @@
|
||||
<File Name="src/ac/dataman.h"/>
|
||||
<File Name="src/ac/socklist.h"/>
|
||||
<File Name="src/ac/discovery_cache.c"/>
|
||||
<File Name="src/ac/discovery_cache.h"/>
|
||||
</VirtualDirectory>
|
||||
</VirtualDirectory>
|
||||
<Description/>
|
||||
|
@ -275,6 +275,7 @@
|
||||
<File Name="src/cw/cw_ktv_replace.c"/>
|
||||
<File Name="src/cw/cw_ktv_set_byte.c"/>
|
||||
<File Name="src/cw/conn_q_wait_packet.c"/>
|
||||
<File Name="src/cw/mavl_get_ext.c"/>
|
||||
</VirtualDirectory>
|
||||
</VirtualDirectory>
|
||||
<Description/>
|
||||
|
@ -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);
|
||||
|
@ -1,25 +1,161 @@
|
||||
#include <string.h>
|
||||
|
||||
#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; i<len; i++){
|
||||
cache->queue[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;
|
||||
}
|
||||
|
||||
}
|
||||
|
24
src/ac/discovery_cache.h
Normal file
24
src/ac/discovery_cache.h
Normal file
@ -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
|
@ -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\
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
||||
|
49
src/cw/mavl_get_ext.c
Normal file
49
src/cw/mavl_get_ext.c
Normal file
@ -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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user