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/dataman.h"/>
|
||||||
<File Name="src/ac/socklist.h"/>
|
<File Name="src/ac/socklist.h"/>
|
||||||
<File Name="src/ac/discovery_cache.c"/>
|
<File Name="src/ac/discovery_cache.c"/>
|
||||||
|
<File Name="src/ac/discovery_cache.h"/>
|
||||||
</VirtualDirectory>
|
</VirtualDirectory>
|
||||||
</VirtualDirectory>
|
</VirtualDirectory>
|
||||||
<Description/>
|
<Description/>
|
||||||
|
@ -275,6 +275,7 @@
|
|||||||
<File Name="src/cw/cw_ktv_replace.c"/>
|
<File Name="src/cw/cw_ktv_replace.c"/>
|
||||||
<File Name="src/cw/cw_ktv_set_byte.c"/>
|
<File Name="src/cw/cw_ktv_set_byte.c"/>
|
||||||
<File Name="src/cw/conn_q_wait_packet.c"/>
|
<File Name="src/cw/conn_q_wait_packet.c"/>
|
||||||
|
<File Name="src/cw/mavl_get_ext.c"/>
|
||||||
</VirtualDirectory>
|
</VirtualDirectory>
|
||||||
</VirtualDirectory>
|
</VirtualDirectory>
|
||||||
<Description/>
|
<Description/>
|
||||||
|
@ -175,6 +175,7 @@ void mavl_walk (struct mavlnode * node)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
int stcmp (const void * sa1, const void *sa2)
|
int stcmp (const void * sa1, const void *sa2)
|
||||||
{
|
{
|
||||||
const char **s1 = sa1;
|
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);
|
printf ("CMP %s, %s = %d\n", *s1, *s2, rc);
|
||||||
return 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[])
|
int main (int argc, char *argv[])
|
||||||
@ -197,6 +282,11 @@ int main (int argc, char *argv[])
|
|||||||
FILE * file;
|
FILE * file;
|
||||||
mavl_t types_tree, global_cfg;
|
mavl_t types_tree, global_cfg;
|
||||||
const cw_Type_t **ti;
|
const cw_Type_t **ti;
|
||||||
|
tester1();
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* parse arguments */
|
/* parse arguments */
|
||||||
parse_args (argc, argv, &bootcfg);
|
parse_args (argc, argv, &bootcfg);
|
||||||
|
@ -1,25 +1,161 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "cw/sock.h"
|
||||||
#include "cw/mlist.h"
|
#include "cw/mlist.h"
|
||||||
#include "cw/mavl.h"
|
#include "cw/mavl.h"
|
||||||
|
|
||||||
|
#include "discovery_cache.h"
|
||||||
|
|
||||||
struct cw_DiscoveryCache{
|
struct cw_DiscoveryCache{
|
||||||
int len;
|
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)
|
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_init(int len){
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
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_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_foreach_lr.c\
|
||||||
mavl_freeptr.c\
|
mavl_freeptr.c\
|
||||||
mavl_get.c\
|
mavl_get.c\
|
||||||
|
mavl_get_ext.c\
|
||||||
mavl_get_node.c\
|
mavl_get_node.c\
|
||||||
mavl_get_node_cmp..c\
|
mavl_get_node_cmp..c\
|
||||||
mavl_get_ptr.c\
|
mavl_get_ptr.c\
|
||||||
|
@ -93,7 +93,8 @@ struct mavl {
|
|||||||
*/
|
*/
|
||||||
typedef struct mavl * mavl_t;
|
typedef struct mavl * mavl_t;
|
||||||
|
|
||||||
|
#define MAVL_FIND_FIRST 1
|
||||||
|
#define MAVL_FIND_LAST 2
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param node node
|
* @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_add ( struct mavl *t, const void *data );*/
|
||||||
void * mavl_get ( 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_del ( struct mavl *t, const void *data );
|
||||||
void *mavl_replace ( struct mavl *t, const void *data, int * result );
|
void *mavl_replace ( struct mavl *t, const void *data, int * result );
|
||||||
void mavl_destroy ( struct mavl *t );
|
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 * ));
|
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)
|
static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
@ -83,6 +85,9 @@ int main (int argc, char **argv)
|
|||||||
int i;
|
int i;
|
||||||
struct cw_DiscoveryResult dis;
|
struct cw_DiscoveryResult dis;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bootcfg.nmods=0;
|
bootcfg.nmods=0;
|
||||||
|
|
||||||
/* read command line args, results are in bootcfg */
|
/* read command line args, results are in bootcfg */
|
||||||
|
Loading…
Reference in New Issue
Block a user