Work on discovery cache

FossilOrigin-Name: 42e420b380c09de60f46dc30fcb12a3480f7c6441e438bf45a4066d74369215f
This commit is contained in:
7u83@mail.ru 2018-04-02 16:19:28 +00:00
parent 3d51c17a9a
commit 13b53ee3bc
9 changed files with 321 additions and 11 deletions

View File

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

View File

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

View File

@ -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);

View File

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

View File

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

View File

@ -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
View 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;
}

View File

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