Work on discovery cache
FossilOrigin-Name: 42e420b380c09de60f46dc30fcb12a3480f7c6441e438bf45a4066d74369215f
This commit is contained in:
		@ -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
 | 
			
		||||
		Reference in New Issue
	
	Block a user