new mavl is working now
FossilOrigin-Name: 65a4eefffea57509c0d7fd573e53b15bf4a730ce297b7db182aaac796ea92448
This commit is contained in:
		
							
								
								
									
										742
									
								
								src/ac/ac_main.c
									
									
									
									
									
								
							
							
						
						
									
										742
									
								
								src/ac/ac_main.c
									
									
									
									
									
								
							@ -52,208 +52,367 @@
 | 
			
		||||
int ac_run();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void *alive_thread(void *data)
 | 
			
		||||
static void *alive_thread (void *data)
 | 
			
		||||
{
 | 
			
		||||
	/* Ping the database every 5 seconds */
 | 
			
		||||
	while (1) {
 | 
			
		||||
		sleep(5);
 | 
			
		||||
		sleep (5);
 | 
			
		||||
		db_ping();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <getopt.h>
 | 
			
		||||
static int parse_args(int argc, char *argv[])
 | 
			
		||||
static int parse_args (int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
//	int getopt_ret;
 | 
			
		||||
	int option_index;
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	static struct option long_options[] = {
 | 
			
		||||
		{"version", optional_argument, NULL, 'v'},
 | 
			
		||||
		{0, 0, 0, 0}
 | 
			
		||||
	};
 | 
			
		||||
	int o;
 | 
			
		||||
	while ((o = getopt_long(argc, argv, "v", long_options, &option_index)) != -1) {
 | 
			
		||||
	
 | 
			
		||||
	while ( (o = getopt_long (argc, argv, "v", long_options, &option_index)) != -1) {
 | 
			
		||||
		switch (o) {
 | 
			
		||||
			case 0:
 | 
			
		||||
				break;
 | 
			
		||||
				
 | 
			
		||||
			case 'v':
 | 
			
		||||
				printf("AC-Tube 0.01, %s\n", SYS_ARCH);
 | 
			
		||||
				exit(0);
 | 
			
		||||
				printf ("AC-Tube 0.01, %s\n", SYS_ARCH);
 | 
			
		||||
				exit (0);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "cw/mod.h"
 | 
			
		||||
extern struct cw_Mod * cw_get_mod_ac(const char *name);
 | 
			
		||||
extern struct cw_Mod * cw_get_mod_ac (const char *name);
 | 
			
		||||
 | 
			
		||||
#include "cw/mlist.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern void test_sets();
 | 
			
		||||
#include "cw/file.h"
 | 
			
		||||
#include "cw/cw_types.h"
 | 
			
		||||
#include "cw/kvt.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
struct mykv {
 | 
			
		||||
	int key;
 | 
			
		||||
	int value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int mycmp (void *e1, void *e2)
 | 
			
		||||
{
 | 
			
		||||
/*	mavl_t kv;
 | 
			
		||||
	mavliter_t kviter;
 | 
			
		||||
	uint8_t bytes[] = { 99,4,5,7 };
 | 
			
		||||
	struct mykv * k1 = e1;
 | 
			
		||||
	struct mykv * k2 = e2;
 | 
			
		||||
	
 | 
			
		||||
//printf("My CMP: %d and %d\n", k1->key, k2->key);
 | 
			
		||||
 | 
			
		||||
	kv = cw_types_mavl_create();
 | 
			
		||||
	//mavl_cmp_kv,cw_type_delete);
 | 
			
		||||
	
 | 
			
		||||
	mavldata_t data, *result;
 | 
			
		||||
 | 
			
		||||
	data.kv.key="wtp_board_data";
 | 
			
		||||
	result = cw_type_byte.get(&data,bytes,1);
 | 
			
		||||
	mavl_add(kv,result);
 | 
			
		||||
	
 | 
			
		||||
	data.kv.key="wtp_next_data";
 | 
			
		||||
	result = cw_type_byte.get(&data,bytes+1,1);
 | 
			
		||||
	mavl_add(kv,result);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	mavliter_init(&kviter,kv);
 | 
			
		||||
	mavliter_foreach(&kviter){
 | 
			
		||||
		char value[500];
 | 
			
		||||
		mavldata_t * data;
 | 
			
		||||
		data = mavliter_get(&kviter);
 | 
			
		||||
		struct cw_Type * type = data->kv.priv;
 | 
			
		||||
		type->to_str(data,value,0);
 | 
			
		||||
	if (k1->key > k2->key)
 | 
			
		||||
		return 1;
 | 
			
		||||
		
 | 
			
		||||
		printf("Got %s (%s): %s\n",data->kv.key,type->name, value);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mavl_destroy(kv);
 | 
			
		||||
	exit(0);
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*	cw_log_init();
 | 
			
		||||
	cw_log(LOG_ERROR,"Hello Debug World222");
 | 
			
		||||
	exit(0);
 | 
			
		||||
*/	
 | 
			
		||||
/*
 | 
			
		||||
	char * dump_data = "Eine kleine Mickey Maus zog sich mal die Hosen\
 | 
			
		||||
	aus, zog sie wieder an, und du bist dran. Dran bist du noch lange nicht\
 | 
			
		||||
	musst erst sagen, wie alt du bist.";
 | 
			
		||||
	
 | 
			
		||||
	char * result = cw_format_dump(dump_data,strlen(dump_data),NULL);
 | 
			
		||||
	
 | 
			
		||||
	printf("Dump Result:\n%s\n", result);
 | 
			
		||||
	exit(0);
 | 
			
		||||
*/	
 | 
			
		||||
	
 | 
			
		||||
/*	char data[100];
 | 
			
		||||
	mavl_t im;
 | 
			
		||||
	mavldata_t * val, * val2,itt, itt2, * result, search ;	
 | 
			
		||||
	mavliter_t myit;
 | 
			
		||||
	
 | 
			
		||||
	im = mavl_create(mavl_cmp_dword,NULL);
 | 
			
		||||
	itt.dword = 7;
 | 
			
		||||
	itt2.dword = 7;
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	val = mavl_add(im,&itt);
 | 
			
		||||
	val2 = mavl_add(im,&itt2);
 | 
			
		||||
	
 | 
			
		||||
	search.dword = 7;
 | 
			
		||||
	result = mavl_get(im,&search);
 | 
			
		||||
 | 
			
		||||
	printf("Result: (%p, %p) (%p, %p) (%p, %p)\n",val, &itt, val2, &itt2, result, &search);
 | 
			
		||||
	
 | 
			
		||||
	exit(0);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	for (itt.dword=100; itt.dword>0; itt.dword--){
 | 
			
		||||
		printf("Copunting: %d\n",itt.dword);
 | 
			
		||||
		mavl_add(im,&itt);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	mavliter_init(&myit,im);
 | 
			
		||||
	mavliter_foreach(&myit){
 | 
			
		||||
		union mavldata * result;
 | 
			
		||||
		result = mavliter_get(&myit);
 | 
			
		||||
		printf("Got Value %d\n",result->dword);
 | 
			
		||||
	}
 | 
			
		||||
	if (k1->key < k2->key)
 | 
			
		||||
		return -1;
 | 
			
		||||
		
 | 
			
		||||
	mavl_destroy(im);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mavl_walk (struct mavlnode  * node)
 | 
			
		||||
{
 | 
			
		||||
	struct mykv * kv;
 | 
			
		||||
	
 | 
			
		||||
	if (!node) {
 | 
			
		||||
		printf ("\n");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	kv = mavlnode_dataptr (node);
 | 
			
		||||
	printf ("KV %d\n", kv->key);
 | 
			
		||||
	
 | 
			
		||||
	printf ("go left:");
 | 
			
		||||
	mavl_walk (node->left);
 | 
			
		||||
	printf ("go right:");
 | 
			
		||||
	mavl_walk (node->right);
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int stcmp (const void * sa1, const void *sa2)
 | 
			
		||||
{
 | 
			
		||||
	const char **s1 = sa1;
 | 
			
		||||
	const char **s2 = sa2;
 | 
			
		||||
	int rc;
 | 
			
		||||
	rc = strcmp (*s1, *s2);
 | 
			
		||||
	
 | 
			
		||||
	printf ("CMP %s, %s = %d\n", *s1, *s2, rc);
 | 
			
		||||
	return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main (int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
	mavl_t tree;
 | 
			
		||||
	int i;
 | 
			
		||||
	mavliter_t it;
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	/*tree = mavl_create_ptr( (int(*)(const void*,const void*))strcmp,free);
 | 
			
		||||
	 */
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
		tree = mavl_create_ptr(mycmp,NULL);
 | 
			
		||||
	
 | 
			
		||||
		struct mykv * mdata;
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
		mdata = malloc(sizeof(struct mykv));
 | 
			
		||||
		mdata->key=14;
 | 
			
		||||
		mdata->value=15;
 | 
			
		||||
		mavl_add_ptr(tree, mdata);
 | 
			
		||||
	
 | 
			
		||||
		mdata = malloc(sizeof(struct mykv));
 | 
			
		||||
		mdata->key=16;
 | 
			
		||||
		mdata->value=17;
 | 
			
		||||
		mavl_add_ptr(tree, mdata);
 | 
			
		||||
	
 | 
			
		||||
		mdata = malloc(sizeof(struct mykv));
 | 
			
		||||
		mdata->key=12;
 | 
			
		||||
		mdata->value=13;
 | 
			
		||||
		mavl_add_ptr(tree, mdata);
 | 
			
		||||
	
 | 
			
		||||
		mavliter_init(&it,tree);
 | 
			
		||||
		mavliter_foreach(&it){
 | 
			
		||||
			mdata = mavliter_get_ptr(&it);
 | 
			
		||||
			printf("MAVLIT: %d %d\n",mdata->key,mdata->value);
 | 
			
		||||
	
 | 
			
		||||
			struct mykv search;
 | 
			
		||||
			search.key=mdata->key;
 | 
			
		||||
			mdata = mavl_get_ptr(tree,&search);
 | 
			
		||||
			printf("Search T: %d %d\n",mdata->key,mdata->value);
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
		exit(0);
 | 
			
		||||
	*/
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
		if (tree==NULL)
 | 
			
		||||
			return 0;
 | 
			
		||||
	
 | 
			
		||||
		tree = mavl_create_str();
 | 
			
		||||
	
 | 
			
		||||
		mavl_add_str(tree,cw_strdup("7u83"));
 | 
			
		||||
		mavl_add_str(tree,cw_strdup("Herre"));
 | 
			
		||||
		mavl_add_str(tree,cw_strdup("Tube"));
 | 
			
		||||
		mavl_add_str(tree,cw_strdup("Tobias"));
 | 
			
		||||
		printf("Count: %d\n", mavl_get_count(tree));
 | 
			
		||||
		mavliter_init(&it,tree);
 | 
			
		||||
	
 | 
			
		||||
		mavliter_foreach(&it){
 | 
			
		||||
	
 | 
			
		||||
			printf("iterWert %s\n",mavliter_get_str(&it));
 | 
			
		||||
		}
 | 
			
		||||
	*/
 | 
			
		||||
/*	
 | 
			
		||||
	tree = mavl_create (mycmp, NULL, sizeof (struct mykv));
 | 
			
		||||
	
 | 
			
		||||
	struct mykv nwert;
 | 
			
		||||
	int result;
 | 
			
		||||
	struct mykv * mr;
 | 
			
		||||
	
 | 
			
		||||
	nwert.key = 7;
 | 
			
		||||
	nwert.value = 777;
 | 
			
		||||
	mr = mavl_add_exists (tree, &nwert, &result);
 | 
			
		||||
	printf ("7Result %d: %d %d\n", result, mr->key, mr->value);
 | 
			
		||||
	
 | 
			
		||||
	for (i = 0; i < 10; i++) {
 | 
			
		||||
		//cw_rand(&nwert.key,sizeof(nwert.key));
 | 
			
		||||
		//	printf("Addwert: %u\n",nwert.key);
 | 
			
		||||
		//	printf("add %u\n", i);
 | 
			
		||||
		nwert.key = 9 - i;
 | 
			
		||||
		nwert.value = 100 + i;
 | 
			
		||||
		result=0;
 | 
			
		||||
		mr = mavl_add_exists (tree, &nwert, &result);
 | 
			
		||||
		printf ("Result %d: %d %d\n", result, mr->key, mr->value);
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	mavliter_init (&it, tree);
 | 
			
		||||
	
 | 
			
		||||
	mavliter_foreach (&it) {
 | 
			
		||||
		struct mykv *kv;
 | 
			
		||||
		kv = mavliter_get (&it);
 | 
			
		||||
		printf ("iterWert %u\n", kv->key);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	exit (0);
 | 
			
		||||
*/	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	/*	mavl_t kv;
 | 
			
		||||
		mavliter_t kviter;
 | 
			
		||||
		uint8_t bytes[] = { 99,4,5,7 };
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
		kv = cw_types_mavl_create();
 | 
			
		||||
		//mavl_cmp_kv,cw_type_delete);
 | 
			
		||||
	
 | 
			
		||||
		mavldata_t data, *result;
 | 
			
		||||
	
 | 
			
		||||
		data.kv.key="wtp_board_data";
 | 
			
		||||
		result = cw_type_byte.get(&data,bytes,1);
 | 
			
		||||
		mavl_add(kv,result);
 | 
			
		||||
	
 | 
			
		||||
		data.kv.key="wtp_next_data";
 | 
			
		||||
		result = cw_type_byte.get(&data,bytes+1,1);
 | 
			
		||||
		mavl_add(kv,result);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
		mavliter_init(&kviter,kv);
 | 
			
		||||
		mavliter_foreach(&kviter){
 | 
			
		||||
			char value[500];
 | 
			
		||||
			mavldata_t * data;
 | 
			
		||||
			data = mavliter_get(&kviter);
 | 
			
		||||
			struct cw_Type * type = data->kv.priv;
 | 
			
		||||
			type->to_str(data,value,0);
 | 
			
		||||
	
 | 
			
		||||
			printf("Got %s (%s): %s\n",data->kv.key,type->name, value);
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
		mavl_destroy(kv);
 | 
			
		||||
		exit(0);
 | 
			
		||||
	*/
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	/*	cw_log_init();
 | 
			
		||||
		cw_log(LOG_ERROR,"Hello Debug World222");
 | 
			
		||||
		exit(0);
 | 
			
		||||
	*/
 | 
			
		||||
	/*
 | 
			
		||||
		char * dump_data = "Eine kleine Mickey Maus zog sich mal die Hosen\
 | 
			
		||||
		aus, zog sie wieder an, und du bist dran. Dran bist du noch lange nicht\
 | 
			
		||||
		musst erst sagen, wie alt du bist.";
 | 
			
		||||
	
 | 
			
		||||
		char * result = cw_format_dump(dump_data,strlen(dump_data),NULL);
 | 
			
		||||
	
 | 
			
		||||
		printf("Dump Result:\n%s\n", result);
 | 
			
		||||
		exit(0);
 | 
			
		||||
	*/
 | 
			
		||||
	
 | 
			
		||||
	/*	char data[100];
 | 
			
		||||
		mavl_t im;
 | 
			
		||||
		mavldata_t * val, * val2,itt, itt2, * result, search ;
 | 
			
		||||
		mavliter_t myit;
 | 
			
		||||
	
 | 
			
		||||
		im = mavl_create(mavl_cmp_dword,NULL);
 | 
			
		||||
		itt.dword = 7;
 | 
			
		||||
		itt2.dword = 7;
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
		val = mavl_add(im,&itt);
 | 
			
		||||
		val2 = mavl_add(im,&itt2);
 | 
			
		||||
	
 | 
			
		||||
		search.dword = 7;
 | 
			
		||||
		result = mavl_get(im,&search);
 | 
			
		||||
	
 | 
			
		||||
		printf("Result: (%p, %p) (%p, %p) (%p, %p)\n",val, &itt, val2, &itt2, result, &search);
 | 
			
		||||
	
 | 
			
		||||
		exit(0);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
		for (itt.dword=100; itt.dword>0; itt.dword--){
 | 
			
		||||
			printf("Copunting: %d\n",itt.dword);
 | 
			
		||||
			mavl_add(im,&itt);
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
		mavliter_init(&myit,im);
 | 
			
		||||
		mavliter_foreach(&myit){
 | 
			
		||||
			union mavldata * result;
 | 
			
		||||
			result = mavliter_get(&myit);
 | 
			
		||||
			printf("Got Value %d\n",result->dword);
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
		mavl_destroy(im);
 | 
			
		||||
	
 | 
			
		||||
	*/
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	int rc = 0;
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	/* parse arguments */
 | 
			
		||||
	parse_args(argc, argv);
 | 
			
		||||
 | 
			
		||||
	parse_args (argc, argv);
 | 
			
		||||
	
 | 
			
		||||
	cw_log_name = "AC-Tube";
 | 
			
		||||
 | 
			
		||||
	if (!read_config("ac.conf"))
 | 
			
		||||
	
 | 
			
		||||
	if (!read_config ("ac.conf"))
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
	/* Show debug options if there are any set */
 | 
			
		||||
	if (cw_dbg_opt_level)
 | 
			
		||||
		cw_log(LOG_INFO, "Debug Options: %08X", cw_dbg_opt_level);
 | 
			
		||||
 | 
			
		||||
		cw_log (LOG_INFO, "Debug Options: %08X", cw_dbg_opt_level);
 | 
			
		||||
		
 | 
			
		||||
	/* XXX Hard coded debug settigns, set it by config in the future */
 | 
			
		||||
	cw_dbg_opt_display = DBG_DISP_ASC_DMP | DBG_DISP_COLORS;
 | 
			
		||||
 | 
			
		||||
	/* Warn, if the "secret" debugging feature for 
 | 
			
		||||
	
 | 
			
		||||
	/* Warn, if the "secret" debugging feature for
 | 
			
		||||
	   developers is turned on ;) */
 | 
			
		||||
//	DBGX("Attention! %s", "DBG X is ON!");
 | 
			
		||||
 | 
			
		||||
//	cw_mod_set_mod_path("../../lib/actube");
 | 
			
		||||
	//cw_mod_load("capwap");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	/* Initialize the database */
 | 
			
		||||
	if (!db_init())
 | 
			
		||||
		goto errX;
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
	/* Start the database */
 | 
			
		||||
	if (!db_start())
 | 
			
		||||
		goto errX;
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
	db_ping();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	/* Start a database "pinger thread", which inserts
 | 
			
		||||
	   every xx seconds a timestamp into the DB */
 | 
			
		||||
	pthread_t alth;
 | 
			
		||||
	pthread_create(&alth, NULL, alive_thread, NULL);
 | 
			
		||||
 | 
			
		||||
	pthread_create (&alth, NULL, alive_thread, NULL);
 | 
			
		||||
	
 | 
			
		||||
	/* Init DTLS library */
 | 
			
		||||
	dtls_init();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	ac_global_init();
 | 
			
		||||
	
 | 
			
		||||
	if (!socklist_init())
 | 
			
		||||
		goto errX;
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
	if (!wtplist_init())
 | 
			
		||||
		goto errX;
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
	if (!dataman_list_init())
 | 
			
		||||
		goto errX;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	cw_log(LOG_INFO, "Starting AC-Tube, Name=%s, ID=%s", conf_acname, conf_acid);
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
	cw_log (LOG_INFO, "Starting AC-Tube, Name=%s, ID=%s", conf_acname, conf_acid);
 | 
			
		||||
	rc = ac_run();
 | 
			
		||||
      errX:
 | 
			
		||||
errX:
 | 
			
		||||
	/* XXX There is more cleanup to do */
 | 
			
		||||
	wtplist_destroy();
 | 
			
		||||
	socklist_destroy();
 | 
			
		||||
@ -266,297 +425,315 @@ int main(int argc, char *argv[])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void process_ctrl_packet(int index, struct sockaddr *addr, uint8_t * buffer, int len);
 | 
			
		||||
void process_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len);
 | 
			
		||||
 | 
			
		||||
void process_cw_data_packet(int index, struct sockaddr *addr, uint8_t * buffer, int len);
 | 
			
		||||
void process_cw_data_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int ac_run()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	if (!conf_listen_addrs_len) {
 | 
			
		||||
		cw_log(LOG_ERR, "Fatal error: No listen addresses found.");
 | 
			
		||||
		cw_log (LOG_ERR, "Fatal error: No listen addresses found.");
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/* it is important to create the unicast sockets first, 
 | 
			
		||||
	 * because when we create the mcast an bcast sockets next 
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	/* it is important to create the unicast sockets first,
 | 
			
		||||
	 * because when we create the mcast an bcast sockets next
 | 
			
		||||
	 * we will look for already created sockets to find a
 | 
			
		||||
	 * good unicast reply socket */
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	int i;
 | 
			
		||||
	
 | 
			
		||||
	for (i = 0; i < conf_listen_addrs_len; i++) {
 | 
			
		||||
		char addr[100];
 | 
			
		||||
		char port[50];
 | 
			
		||||
		int proto;
 | 
			
		||||
 | 
			
		||||
		conf_parse_listen_addr(conf_listen_addrs[i], addr, port, &proto);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		conf_parse_listen_addr (conf_listen_addrs[i], addr, port, &proto);
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		//struct sockaddr sa;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		socklist_add_unicast(addr, port,proto);
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		socklist_add_unicast (addr, port, proto);
 | 
			
		||||
		
 | 
			
		||||
//#ifdef WITH_LWAPP
 | 
			
		||||
//		if (conf_lwapp)
 | 
			
		||||
//			socklist_add_unicast(conf_listen_addrs[i], conf_lw_control_port,
 | 
			
		||||
//					     AC_PROTO_LWAPP);
 | 
			
		||||
//#endif
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	if (socklist_len == 0) {
 | 
			
		||||
		cw_log(LOG_ERR, "Fatal error: Could not setup any listen socket");
 | 
			
		||||
		cw_log (LOG_ERR, "Fatal error: Could not setup any listen socket");
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	/* create multicast sockets */
 | 
			
		||||
	for (i = 0; i < conf_mcast_groups_len; i++) {
 | 
			
		||||
 | 
			
		||||
		socklist_add_multicast(conf_mcast_groups[i], conf_control_port,
 | 
			
		||||
				       AC_PROTO_CAPWAP);
 | 
			
		||||
	
 | 
			
		||||
		socklist_add_multicast (conf_mcast_groups[i], conf_control_port,
 | 
			
		||||
		                        AC_PROTO_CAPWAP);
 | 
			
		||||
#ifdef WITH_LWAPP
 | 
			
		||||
		                        
 | 
			
		||||
		if (conf_lwapp)
 | 
			
		||||
			socklist_add_multicast(conf_mcast_groups[i], conf_lw_control_port,
 | 
			
		||||
					       AC_PROTO_LWAPP);
 | 
			
		||||
			socklist_add_multicast (conf_mcast_groups[i], conf_lw_control_port,
 | 
			
		||||
			                        AC_PROTO_LWAPP);
 | 
			
		||||
			                        
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
			                        
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	/* broadcast socket ipv4 only */
 | 
			
		||||
	for (i = 0; i < conf_bcast_addrs_len; i++) {
 | 
			
		||||
 | 
			
		||||
		char addr[50],port[50];
 | 
			
		||||
	
 | 
			
		||||
		char addr[50], port[50];
 | 
			
		||||
		int proto;
 | 
			
		||||
		conf_parse_listen_addr(conf_bcast_addrs[i], addr, port, &proto);
 | 
			
		||||
 | 
			
		||||
		socklist_add_broadcast(addr,port,proto);
 | 
			
		||||
		conf_parse_listen_addr (conf_bcast_addrs[i], addr, port, &proto);
 | 
			
		||||
		
 | 
			
		||||
		socklist_add_broadcast (addr, port, proto);
 | 
			
		||||
#ifdef WITH_LWAPP
 | 
			
		||||
		
 | 
			
		||||
//              printf("Adding %d\n",socklist_len);
 | 
			
		||||
		if (conf_lwapp)
 | 
			
		||||
			socklist_add_broadcast(conf_bcast_addrs[i], conf_lw_control_port,
 | 
			
		||||
					       AC_PROTO_LWAPP);
 | 
			
		||||
			socklist_add_broadcast (conf_bcast_addrs[i], conf_lw_control_port,
 | 
			
		||||
			                        AC_PROTO_LWAPP);
 | 
			
		||||
			                        
 | 
			
		||||
//              printf ("SI %d, PROTO: %d\n",socklist_len-1,socklist[socklist_len-1].ac_proto);
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	//get_acinfo();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	while (1) {
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
		/* prepare fdset */
 | 
			
		||||
		fd_set fset;
 | 
			
		||||
		int max = 0;
 | 
			
		||||
		FD_ZERO(&fset);
 | 
			
		||||
		FD_ZERO (&fset);
 | 
			
		||||
		
 | 
			
		||||
		for (i = 0; i < socklist_len; i++) {
 | 
			
		||||
			FD_SET(socklist[i].sockfd, &fset);
 | 
			
		||||
			FD_SET (socklist[i].sockfd, &fset);
 | 
			
		||||
			
 | 
			
		||||
			if (socklist[i].sockfd > max)
 | 
			
		||||
				max = socklist[i].sockfd;
 | 
			
		||||
				
 | 
			
		||||
			if (socklist[i].data_sockfd) {
 | 
			
		||||
				FD_SET(socklist[i].data_sockfd,&fset);
 | 
			
		||||
				FD_SET (socklist[i].data_sockfd, &fset);
 | 
			
		||||
				
 | 
			
		||||
				if (socklist[i].sockfd > max)
 | 
			
		||||
					max = socklist[i].sockfd;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		/* wait for an event */
 | 
			
		||||
		int n;
 | 
			
		||||
		while ((n = select(max + 1, &fset, NULL, NULL, NULL)) < 0) {
 | 
			
		||||
		
 | 
			
		||||
		while ( (n = select (max + 1, &fset, NULL, NULL, NULL)) < 0) {
 | 
			
		||||
			if (errno != EINTR)
 | 
			
		||||
				return n;
 | 
			
		||||
 | 
			
		||||
				
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		/* process the received packet */
 | 
			
		||||
		for (i = 0; i < socklist_len; i++) {
 | 
			
		||||
			uint8_t buffer[4096];
 | 
			
		||||
			struct sockaddr_storage srcaddr;
 | 
			
		||||
			socklen_t srcaddrlen;
 | 
			
		||||
 | 
			
		||||
			
 | 
			
		||||
			if (FD_ISSET(socklist[i].data_sockfd, &fset)){
 | 
			
		||||
				
 | 
			
		||||
				int len = sock_receive(socklist[i].data_sockfd,
 | 
			
		||||
						       buffer, sizeof(buffer),
 | 
			
		||||
						       0,
 | 
			
		||||
						       (struct sockaddr *) &srcaddr,
 | 
			
		||||
						       &srcaddrlen);
 | 
			
		||||
 | 
			
		||||
				process_cw_data_packet(i, (struct sockaddr *) &srcaddr, buffer, len);
 | 
			
		||||
			
 | 
			
		||||
			if (FD_ISSET (socklist[i].data_sockfd, &fset)) {
 | 
			
		||||
			
 | 
			
		||||
				int len = sock_receive (socklist[i].data_sockfd,
 | 
			
		||||
				                        buffer, sizeof (buffer),
 | 
			
		||||
				                        0,
 | 
			
		||||
				                        (struct sockaddr *) &srcaddr,
 | 
			
		||||
				                        &srcaddrlen);
 | 
			
		||||
				                        
 | 
			
		||||
				process_cw_data_packet (i, (struct sockaddr *) &srcaddr, buffer, len);
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
			if (FD_ISSET(socklist[i].sockfd, &fset)){
 | 
			
		||||
 | 
			
		||||
				int len = sock_receive(socklist[i].sockfd,
 | 
			
		||||
						       buffer, sizeof(buffer),
 | 
			
		||||
						       0,
 | 
			
		||||
						       (struct sockaddr *) &srcaddr,
 | 
			
		||||
						       &srcaddrlen);
 | 
			
		||||
 | 
			
		||||
				process_ctrl_packet(i, (struct sockaddr *) &srcaddr, buffer, len);
 | 
			
		||||
			
 | 
			
		||||
			if (FD_ISSET (socklist[i].sockfd, &fset)) {
 | 
			
		||||
			
 | 
			
		||||
				int len = sock_receive (socklist[i].sockfd,
 | 
			
		||||
				                        buffer, sizeof (buffer),
 | 
			
		||||
				                        0,
 | 
			
		||||
				                        (struct sockaddr *) &srcaddr,
 | 
			
		||||
				                        &srcaddrlen);
 | 
			
		||||
				                        
 | 
			
		||||
				process_ctrl_packet (i, (struct sockaddr *) &srcaddr, buffer, len);
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void process_cw_data_packet(int index, struct sockaddr *addr, uint8_t * buffer, int len)
 | 
			
		||||
void process_cw_data_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len)
 | 
			
		||||
{
 | 
			
		||||
	char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
			
		||||
	cw_dbg(DBG_X, "There is a data packet now");
 | 
			
		||||
 | 
			
		||||
	cw_dbg (DBG_X, "There is a data packet now");
 | 
			
		||||
	
 | 
			
		||||
	dataman_list_lock();
 | 
			
		||||
	cw_dbg(DBG_X, "Dataman list locked, now getting");
 | 
			
		||||
	struct dataman * dm = dataman_list_get(socklist[index].data_sockfd,addr);
 | 
			
		||||
	cw_dbg(DBG_X, "Dataman list locked, now gotted");
 | 
			
		||||
 | 
			
		||||
	cw_dbg(DBG_INFO,"Packet for dataman %s,%d",sock_addr2str_p(addr,sock_buf),socklist[index].data_sockfd);
 | 
			
		||||
	cw_dbg (DBG_X, "Dataman list locked, now getting");
 | 
			
		||||
	struct dataman * dm = dataman_list_get (socklist[index].data_sockfd, addr);
 | 
			
		||||
	cw_dbg (DBG_X, "Dataman list locked, now gotted");
 | 
			
		||||
	
 | 
			
		||||
	cw_dbg (DBG_INFO, "Packet for dataman %s,%d", sock_addr2str_p (addr, sock_buf), socklist[index].data_sockfd);
 | 
			
		||||
	
 | 
			
		||||
	if (!dm) {
 | 
			
		||||
		cw_dbg(DBG_INFO,"No dataman %s,%d",sock_addr2str_p(addr,sock_buf),socklist[index].data_sockfd);
 | 
			
		||||
		dm = dataman_create(socklist[index].data_sockfd,addr);
 | 
			
		||||
		if (!dm){
 | 
			
		||||
			cw_log(LOG_ERR,"Can't create dataman for packet from %s",sock_addr2str_p(addr,sock_buf));
 | 
			
		||||
		cw_dbg (DBG_INFO, "No dataman %s,%d", sock_addr2str_p (addr, sock_buf), socklist[index].data_sockfd);
 | 
			
		||||
		dm = dataman_create (socklist[index].data_sockfd, addr);
 | 
			
		||||
		
 | 
			
		||||
		if (!dm) {
 | 
			
		||||
			cw_log (LOG_ERR, "Can't create dataman for packet from %s", sock_addr2str_p (addr, sock_buf));
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		dataman_list_add(dm);
 | 
			
		||||
 | 
			
		||||
		dataman_start(dm);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		dataman_list_add (dm);
 | 
			
		||||
		
 | 
			
		||||
		dataman_start (dm);
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	dataman_list_unlock();
 | 
			
		||||
 | 
			
		||||
	dataman_add_packet(dm,buffer,len);
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	dataman_add_packet (dm, buffer, len);
 | 
			
		||||
	
 | 
			
		||||
	return;
 | 
			
		||||
 | 
			
		||||
	exit(0);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	printf("Data packet received len = %d\n",len);
 | 
			
		||||
	exit(0);
 | 
			
		||||
	struct wtpman *wtpman = wtplist_get(addr);
 | 
			
		||||
	if (!wtpman){
 | 
			
		||||
		cw_dbg(DBG_PKT_ERR,"Discarding packet on data channel from %s - No wtpman found.",sock_addr2str(addr,sock_buf));
 | 
			
		||||
	
 | 
			
		||||
	exit (0);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	printf ("Data packet received len = %d\n", len);
 | 
			
		||||
	exit (0);
 | 
			
		||||
	struct wtpman *wtpman = wtplist_get (addr);
 | 
			
		||||
	
 | 
			
		||||
	if (!wtpman) {
 | 
			
		||||
		cw_dbg (DBG_PKT_ERR, "Discarding packet on data channel from %s - No wtpman found.", sock_addr2str (addr, sock_buf));
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	wtpman_addpacket(wtpman, buffer, len);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	wtpman_addpacket (wtpman, buffer, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void process_cw_ctrl_packet(int index, struct sockaddr *addr, uint8_t * buffer, int len)
 | 
			
		||||
void process_cw_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len)
 | 
			
		||||
{
 | 
			
		||||
	char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	/* first of all check preamble */
 | 
			
		||||
	int preamble = cw_get_hdr_preamble(buffer);
 | 
			
		||||
 | 
			
		||||
	int preamble = cw_get_hdr_preamble (buffer);
 | 
			
		||||
	
 | 
			
		||||
	if (preamble != CAPWAP_PACKET_PREAMBLE && preamble != CAPWAP_DTLS_PACKET_PREAMBLE) {
 | 
			
		||||
		cw_dbg(DBG_PKT_ERR,
 | 
			
		||||
		       "Discarding packet from %s, wrong preamble, preamble = 0x%01X",
 | 
			
		||||
		       sock_addr2str(addr,sock_buf), preamble);
 | 
			
		||||
		cw_dbg (DBG_PKT_ERR,
 | 
			
		||||
		        "Discarding packet from %s, wrong preamble, preamble = 0x%01X",
 | 
			
		||||
		        sock_addr2str (addr, sock_buf), preamble);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	wtplist_lock();
 | 
			
		||||
	struct wtpman *wtpman = wtplist_get(addr);
 | 
			
		||||
	struct wtpman *wtpman = wtplist_get (addr);
 | 
			
		||||
	
 | 
			
		||||
	if (!wtpman) {
 | 
			
		||||
 | 
			
		||||
		wtpman = wtpman_create(index, addr);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
		wtpman = wtpman_create (index, addr);
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		if (!wtpman) {
 | 
			
		||||
			cw_log(LOG_ERR, "Error creating wtpman: %s", strerror(errno));
 | 
			
		||||
			cw_log (LOG_ERR, "Error creating wtpman: %s", strerror (errno));
 | 
			
		||||
			wtplist_unlock();
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		if (!wtplist_add(wtpman)) {
 | 
			
		||||
			cw_log(LOG_ERR, "Error adding wtpman: Too many wtp connections");
 | 
			
		||||
			wtpman_destroy(wtpman);
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		if (!wtplist_add (wtpman)) {
 | 
			
		||||
			cw_log (LOG_ERR, "Error adding wtpman: Too many wtp connections");
 | 
			
		||||
			wtpman_destroy (wtpman);
 | 
			
		||||
			wtplist_unlock();
 | 
			
		||||
			return;
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		wtpman_start(wtpman, preamble & 0xf);
 | 
			
		||||
		
 | 
			
		||||
		wtpman_start (wtpman, preamble & 0xf);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	wtpman_addpacket(wtpman, buffer, len);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	wtpman_addpacket (wtpman, buffer, len);
 | 
			
		||||
	wtplist_unlock();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void process_lw_ctrl_packet(int index, struct sockaddr *addr, uint8_t * buffer, int len)
 | 
			
		||||
void process_lw_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len)
 | 
			
		||||
{
 | 
			
		||||
	//int sock = socklist[index].reply_sockfd;
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	uint8_t *m = buffer + 6;
 | 
			
		||||
	uint32_t val = ntohl(*((uint32_t *) (m)));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	printf("VAL: %08X\n", val);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	uint32_t val = ntohl (* ( (uint32_t *) (m)));
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	printf ("VAL: %08X\n", val);
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	/* first of all check preamble */
 | 
			
		||||
	int version = LWTH_GET_VERSION(m);
 | 
			
		||||
 | 
			
		||||
	int version = LWTH_GET_VERSION (m);
 | 
			
		||||
	
 | 
			
		||||
	if (version != LW_VERSION) {
 | 
			
		||||
//              cw_log_debug1("Discarding LWAPP packet, wrong verson");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int l = LWTH_GET_LENGTH(m);
 | 
			
		||||
	printf("LEN = %d\n", l);
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	int l = LWTH_GET_LENGTH (m);
 | 
			
		||||
	printf ("LEN = %d\n", l);
 | 
			
		||||
	
 | 
			
		||||
	if (l + 12 != len) {
 | 
			
		||||
		//      cw_log_debug1("Discarding LWAPP packet, wrong length");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	wtplist_lock();
 | 
			
		||||
	struct wtpman *wtpman = wtplist_get(addr);
 | 
			
		||||
	struct wtpman *wtpman = wtplist_get (addr);
 | 
			
		||||
	
 | 
			
		||||
	if (!wtpman) {
 | 
			
		||||
 | 
			
		||||
		wtpman = wtpman_create(index, addr);
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
		wtpman = wtpman_create (index, addr);
 | 
			
		||||
		
 | 
			
		||||
		if (!wtpman) {
 | 
			
		||||
			cw_log(LOG_ERR, "Error creating wtpman: %s", strerror(errno));
 | 
			
		||||
			cw_log (LOG_ERR, "Error creating wtpman: %s", strerror (errno));
 | 
			
		||||
			wtplist_unlock();
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		if (!wtplist_add(wtpman)) {
 | 
			
		||||
			cw_log(LOG_ERR, "Error adding wtpman: Too many wtp connections");
 | 
			
		||||
			wtpman_destroy(wtpman);
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		if (!wtplist_add (wtpman)) {
 | 
			
		||||
			cw_log (LOG_ERR, "Error adding wtpman: Too many wtp connections");
 | 
			
		||||
			wtpman_destroy (wtpman);
 | 
			
		||||
			wtplist_unlock();
 | 
			
		||||
			return;
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		//wtpman_lw_start(wtpman);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	//wtpman_lw_addpacket(wtpman,buffer,len);
 | 
			
		||||
	wtplist_unlock();
 | 
			
		||||
}
 | 
			
		||||
@ -565,14 +742,15 @@ void process_lw_ctrl_packet(int index, struct sockaddr *addr, uint8_t * buffer,
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void process_ctrl_packet(int index, struct sockaddr *addr, uint8_t * buffer, int len)
 | 
			
		||||
void process_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer, int len)
 | 
			
		||||
{
 | 
			
		||||
	switch (socklist[index].ac_proto) {
 | 
			
		||||
		case AC_PROTO_CAPWAP:
 | 
			
		||||
			process_cw_ctrl_packet(index, addr, buffer, len);
 | 
			
		||||
			process_cw_ctrl_packet (index, addr, buffer, len);
 | 
			
		||||
			return;
 | 
			
		||||
			
 | 
			
		||||
		case AC_PROTO_LWAPP:
 | 
			
		||||
			process_lw_ctrl_packet(index, addr, buffer, len);
 | 
			
		||||
			process_lw_ctrl_packet (index, addr, buffer, len);
 | 
			
		||||
			return;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										147
									
								
								src/ac/conf.c
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								src/ac/conf.c
									
									
									
									
									
								
							@ -38,7 +38,6 @@ uint8_t conf_macaddress_len = 0;
 | 
			
		||||
 | 
			
		||||
long conf_strict_capwap = 1;
 | 
			
		||||
long conf_strict_headers = 0;
 | 
			
		||||
//char *conf_capwap_mode_str = NULL;
 | 
			
		||||
int conf_capwap_mode = CW_MODE_CAPWAP;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -79,8 +78,6 @@ char *conf_sslkeypass = NULL;
 | 
			
		||||
char *conf_sslcipher = NULL;
 | 
			
		||||
char *conf_dtls_psk = NULL;
 | 
			
		||||
 | 
			
		||||
//char * conf_ac_hardware_version=NULL;
 | 
			
		||||
//char * conf_ac_software_version=NULL;
 | 
			
		||||
int conf_security = 0;
 | 
			
		||||
long conf_vendor_id = CONF_DEFAULT_VENDOR_ID;
 | 
			
		||||
 | 
			
		||||
@ -92,11 +89,6 @@ bstr_t conf_cisco_hardware_version = NULL;
 | 
			
		||||
bstr_t conf_cisco_software_version = NULL;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//int conf_hardware_version_len=0;
 | 
			
		||||
 | 
			
		||||
//int conf_software_version_len=0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int conf_use_loopback = 0;
 | 
			
		||||
 | 
			
		||||
long conf_debug_level = -1;
 | 
			
		||||
@ -140,7 +132,9 @@ static int init_acname()
 | 
			
		||||
 | 
			
		||||
static int init_acid()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	int i;
 | 
			
		||||
	char *s;
 | 
			
		||||
	
 | 
			
		||||
	if (conf_acid != NULL)
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
@ -165,11 +159,11 @@ static int init_acid()
 | 
			
		||||
		return 0;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	conf_acid = malloc(2 * conf_macaddress_len + 1);
 | 
			
		||||
	char *s = conf_acid;
 | 
			
		||||
	s = conf_acid;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < conf_macaddress_len; i++) {
 | 
			
		||||
		s += sprintf(s, "%02X", conf_macaddress[i]);
 | 
			
		||||
@ -178,10 +172,13 @@ static int init_acid()
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int init_dtls()
 | 
			
		||||
{
 | 
			
		||||
	if (conf_dtls_psk != NULL) {
 | 
			
		||||
//              conf_security=CW_SECURITY_FLAGS_S;
 | 
			
		||||
/*
 | 
			
		||||
		//              conf_security=CW_SECURITY_FLAGS_S;
 | 
			
		||||
*/
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
@ -260,17 +257,21 @@ static int init_control_port()
 | 
			
		||||
 | 
			
		||||
static int init_listen_addrs()
 | 
			
		||||
{
 | 
			
		||||
	struct ifaddrs *ifap, *ifa;
 | 
			
		||||
	int rc;
 | 
			
		||||
	int ctr;
 | 
			
		||||
	
 | 
			
		||||
	if (conf_listen_addrs != 0)
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	struct ifaddrs *ifap, *ifa;
 | 
			
		||||
 | 
			
		||||
	int rc = getifaddrs(&ifap);
 | 
			
		||||
 | 
			
		||||
	rc = getifaddrs(&ifap);
 | 
			
		||||
	if (rc == -1)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	/* count the addresses */
 | 
			
		||||
	int ctr = 0;
 | 
			
		||||
	ctr = 0;
 | 
			
		||||
	for (ifa = ifap; ifa != 0; ifa = ifa->ifa_next) {
 | 
			
		||||
		if (!ifa->ifa_addr)
 | 
			
		||||
			continue;
 | 
			
		||||
@ -307,8 +308,7 @@ static int init_listen_addrs()
 | 
			
		||||
 | 
			
		||||
		if (ifa->ifa_addr->sa_family == AF_INET && conf_ipv4) {
 | 
			
		||||
			sock_addrtostr(ifa->ifa_addr, str, 100,0);
 | 
			
		||||
//			printf("The converter has %s\n",str);
 | 
			
		||||
//			*strchr(str, ':') = 0;
 | 
			
		||||
 | 
			
		||||
			conf_listen_addrs[ctr] =
 | 
			
		||||
			    (char *) cw_setstr((uint8_t **) & conf_listen_addrs[ctr],
 | 
			
		||||
					       (uint8_t *) str, strlen(str));
 | 
			
		||||
@ -346,6 +346,7 @@ static char *conf_default_mcast_groups_ipv4[] = {
 | 
			
		||||
 | 
			
		||||
#ifdef WITH_IPV6
 | 
			
		||||
static char *conf_default_mcast_groups_ipv6[] = {
 | 
			
		||||
	"ff01:0:0:0:0:0:0:18c",
 | 
			
		||||
/*	"ff01:0:0:0:0:0:0:18c",
 | 
			
		||||
	"ff02:0:0:0:0:0:0:18c%em0",
 | 
			
		||||
	"ff03:0:0:0:0:0:0:18c",
 | 
			
		||||
@ -356,11 +357,8 @@ static char *conf_default_mcast_groups_ipv6[] = {
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//#include "avltree"
 | 
			
		||||
//#include "cw/stravltree.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
static int add_bcast_addr(void *priv, void *addr)
 | 
			
		||||
{
 | 
			
		||||
	printf("Callback Called\n");
 | 
			
		||||
@ -374,12 +372,17 @@ static int add_bcast_addr(void *priv, void *addr)
 | 
			
		||||
		conf_bcast_addrs_len++;
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Initialize broadcast addresses (ipv4 only)
 | 
			
		||||
 */
 | 
			
		||||
int init_bcast_addrs()
 | 
			
		||||
{
 | 
			
		||||
	int rc;
 | 
			
		||||
	char str[100];
 | 
			
		||||
	struct ifaddrs *ifa0, *ifa;
 | 
			
		||||
	mavl_t t;
 | 
			
		||||
	mavliter_t it;
 | 
			
		||||
	
 | 
			
		||||
@ -389,17 +392,17 @@ int init_bcast_addrs()
 | 
			
		||||
	if (!conf_ipv4)
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	t = mavl_create(mavl_cmp_str,mavl_free_str);
 | 
			
		||||
	if (!t)
 | 
			
		||||
	t = mavl_create_str();
 | 
			
		||||
	if (t==NULL)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	/* add the default broadast address */
 | 
			
		||||
	mavl_add_strdup(t, "255.255.255.255");
 | 
			
		||||
	mavl_add_str(t, cw_strdup("255.255.255.255"));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/* add all other local broadcast addresses */
 | 
			
		||||
	struct ifaddrs *ifa0, *ifa;
 | 
			
		||||
	int rc = getifaddrs(&ifa0);
 | 
			
		||||
	
 | 
			
		||||
	rc = getifaddrs(&ifa0);
 | 
			
		||||
	if (rc == -1)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
@ -421,24 +424,22 @@ int init_bcast_addrs()
 | 
			
		||||
		if (sa->sa_family != AF_INET)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		char str[100];
 | 
			
		||||
 | 
			
		||||
		if (ifa->ifa_broadaddr) {
 | 
			
		||||
			sock_addrtostr(ifa->ifa_broadaddr, str, 100,1);
 | 
			
		||||
			*strchr(str, ':') = 0;
 | 
			
		||||
			mavl_add_strdup(t, str);
 | 
			
		||||
			mavl_add_str(t, cw_strdup(str));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	conf_bcast_addrs = malloc(t->count * sizeof(char *));
 | 
			
		||||
 | 
			
		||||
//mavl_foreach_asc(t, add_bcast_addr, 0);
 | 
			
		||||
 | 
			
		||||
	mavliter_init(&it,t);
 | 
			
		||||
	mavliter_foreach(&it){
 | 
			
		||||
		union mavldata * d;
 | 
			
		||||
		d = mavliter_get(&it);
 | 
			
		||||
		conf_bcast_addrs[conf_bcast_addrs_len] = strdup(d->str);
 | 
			
		||||
		char * d;
 | 
			
		||||
		d = mavliter_get_str(&it);
 | 
			
		||||
		conf_bcast_addrs[conf_bcast_addrs_len] = cw_strdup(d);
 | 
			
		||||
		if (conf_bcast_addrs[conf_bcast_addrs_len] != 0)
 | 
			
		||||
			conf_bcast_addrs_len++;
 | 
			
		||||
 | 
			
		||||
@ -454,19 +455,23 @@ int init_bcast_addrs()
 | 
			
		||||
 | 
			
		||||
int init_mcast_groups()
 | 
			
		||||
{
 | 
			
		||||
	if (conf_mcast_groups)
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	int ctr;
 | 
			
		||||
	int i;
 | 
			
		||||
	
 | 
			
		||||
	int n = 0;
 | 
			
		||||
	int n4 = 0, n6 = 0;
 | 
			
		||||
 | 
			
		||||
	if (conf_mcast_groups)
 | 
			
		||||
		return 1;
 | 
			
		||||
	
 | 
			
		||||
	if (conf_ipv4) {
 | 
			
		||||
		n4 = sizeof(conf_default_mcast_groups_ipv4) / sizeof(char *);
 | 
			
		||||
	}
 | 
			
		||||
#ifdef WITH_IPV6
 | 
			
		||||
 | 
			
		||||
	if (conf_ipv6) {
 | 
			
		||||
		n6 = sizeof(conf_default_mcast_groups_ipv6) / sizeof(char *);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	n = n4 + n6;
 | 
			
		||||
	if (n == 0)
 | 
			
		||||
		return 1;
 | 
			
		||||
@ -476,8 +481,8 @@ int init_mcast_groups()
 | 
			
		||||
		return 0;
 | 
			
		||||
	memset(conf_mcast_groups, 0, n * sizeof(char *));
 | 
			
		||||
 | 
			
		||||
	int ctr = 0;
 | 
			
		||||
	int i;
 | 
			
		||||
	ctr = 0;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < n4; i++) {
 | 
			
		||||
		uint8_t *g = (uint8_t *) conf_default_mcast_groups_ipv4[i];
 | 
			
		||||
		conf_mcast_groups[ctr] =
 | 
			
		||||
@ -546,8 +551,8 @@ static int conf_read_dbg_level(cfg_t * cfg)
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < n; i++) {
 | 
			
		||||
		char *str = cfg_getnstr(cfg, name, i);
 | 
			
		||||
//int u = cw_log_str2dbglevel(str);
 | 
			
		||||
		int b = cw_strlist_get_id(cw_dbg_strings, str);	//cw_log_str2dbglevel(str);
 | 
			
		||||
		int b = cw_strlist_get_id(cw_dbg_strings, str);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		cw_dbg_set_level(b, 1);
 | 
			
		||||
 | 
			
		||||
@ -555,34 +560,9 @@ static int conf_read_dbg_level(cfg_t * cfg)
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct cw_Mod ** conf_mods; //[10];
 | 
			
		||||
struct cw_Mod ** conf_mods; 
 | 
			
		||||
char *conf_mods_dir = NULL;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int init_mods()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
/*	conf_mods[0]=modload_ac("cisco");
 | 
			
		||||
	conf_mods[1]=modload_ac("fortinet");
 | 
			
		||||
//	conf_mods[2]=modload_ac("zyxel");
 | 
			
		||||
	conf_mods[2]=modload_ac("cipwap");
 | 
			
		||||
	conf_mods[3]=modload_ac("capwap");
 | 
			
		||||
	conf_mods[4]=modload_ac("capwap80211");
 | 
			
		||||
	conf_mods[5]=NULL;
 | 
			
		||||
*/
 | 
			
		||||
	int i;
 | 
			
		||||
	for(i=0; conf_mods[i]; i++){
 | 
			
		||||
		if (conf_mods[i]->init){
 | 
			
		||||
			conf_mods[i]->init();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Read the module names from config file
 | 
			
		||||
 */ 
 | 
			
		||||
@ -626,6 +606,10 @@ void conf_init_capwap_mode()
 | 
			
		||||
 | 
			
		||||
int conf_parse_listen_addr(const char *addrstr, char *saddr, char *port, int *proto)
 | 
			
		||||
{
 | 
			
		||||
	char *b;
 | 
			
		||||
	int c;
 | 
			
		||||
	int i, l;
 | 
			
		||||
	char *ctrlport;
 | 
			
		||||
	char *p = strchr(addrstr, '/');
 | 
			
		||||
	if (!p)
 | 
			
		||||
		*proto = AC_PROTO_CAPWAP;
 | 
			
		||||
@ -638,7 +622,7 @@ int conf_parse_listen_addr(const char *addrstr, char *saddr, char *port, int *pr
 | 
			
		||||
			*proto = AC_PROTO_UNKNOWN;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	char *ctrlport;
 | 
			
		||||
 | 
			
		||||
	switch (*proto) {
 | 
			
		||||
		case AC_PROTO_CAPWAP:
 | 
			
		||||
			ctrlport = CAPWAP_CONTROL_PORT_STR;
 | 
			
		||||
@ -651,8 +635,8 @@ int conf_parse_listen_addr(const char *addrstr, char *saddr, char *port, int *pr
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	int i, l;
 | 
			
		||||
	int c = 0;
 | 
			
		||||
 | 
			
		||||
	c = 0;
 | 
			
		||||
 | 
			
		||||
	if (p)
 | 
			
		||||
		l = p - addrstr;
 | 
			
		||||
@ -684,7 +668,7 @@ int conf_parse_listen_addr(const char *addrstr, char *saddr, char *port, int *pr
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* we assume now, its ipv6 */
 | 
			
		||||
	char *b = strstr(addrstr, "]:");
 | 
			
		||||
	b = strstr(addrstr, "]:");
 | 
			
		||||
	if (!b) {
 | 
			
		||||
		/* ippv6 w/o port */
 | 
			
		||||
		strncpy(saddr, addrstr, l);
 | 
			
		||||
@ -716,9 +700,6 @@ int read_config(const char *filename)
 | 
			
		||||
{
 | 
			
		||||
	int i, n;
 | 
			
		||||
 | 
			
		||||
	if (!init_control_port())
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	cfg_opt_t opts[] = {
 | 
			
		||||
		CFG_STR_LIST("mods", "{}", CFGF_NONE),
 | 
			
		||||
		CFG_SIMPLE_STR("mods_dir", &conf_mods_dir),
 | 
			
		||||
@ -733,7 +714,7 @@ int read_config(const char *filename)
 | 
			
		||||
		CFG_SIMPLE_BOOL("strict_capwap", &conf_strict_capwap),
 | 
			
		||||
		CFG_SIMPLE_BOOL("strict_headers", &conf_strict_headers),
 | 
			
		||||
		CFG_SIMPLE_BOOL("use_loopback", &conf_use_loopback),
 | 
			
		||||
//		CFG_SIMPLE_STR("capwap_mode", &conf_capwap_mode_str),
 | 
			
		||||
/*//		CFG_SIMPLE_STR("capwap_mode", &conf_capwap_mode_str),*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef WITH_LWAPP
 | 
			
		||||
@ -765,12 +746,17 @@ int read_config(const char *filename)
 | 
			
		||||
		CFG_SIMPLE_BOOL("dtls_verify_peer", &conf_dtls_verify_peer),
 | 
			
		||||
		CFG_SIMPLE_BOOL("ipv4", &conf_ipv4),
 | 
			
		||||
		CFG_SIMPLE_BOOL("ipv6", &conf_ipv6),
 | 
			
		||||
		CFG_SIMPLE_STR("db_file", conf_db_file),
 | 
			
		||||
		CFG_SIMPLE_STR("db_file", &conf_db_file),
 | 
			
		||||
		CFG_SIMPLE_STR("image_dir", &conf_image_dir),
 | 
			
		||||
 | 
			
		||||
		CFG_END()
 | 
			
		||||
	};
 | 
			
		||||
	cfg_t *cfg;
 | 
			
		||||
	
 | 
			
		||||
	if (!init_control_port())
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	cfg = cfg_init(opts, CFGF_NONE);
 | 
			
		||||
	cfg_set_error_function(cfg, errfunc);
 | 
			
		||||
 | 
			
		||||
@ -838,18 +824,13 @@ int read_config(const char *filename)
 | 
			
		||||
	if (!conf_image_dir)
 | 
			
		||||
		conf_image_dir = CONF_DEFAULT_IMAGE_DIR;
 | 
			
		||||
 | 
			
		||||
//printf("INIT MODS\n");
 | 
			
		||||
//	init_mods();
 | 
			
		||||
//printf("done init mods");
 | 
			
		||||
 | 
			
		||||
//	conf_init_capwap_mode();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	init_listen_addrs();
 | 
			
		||||
	init_mcast_groups();
 | 
			
		||||
	init_bcast_addrs();
 | 
			
		||||
 | 
			
		||||
//printf("Yea all mods inited\n");
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@ static int cmp(const void *d1, const void *d2)
 | 
			
		||||
 | 
			
		||||
int dataman_list_init()
 | 
			
		||||
{
 | 
			
		||||
	dataman_list = mavl_create(cmp, NULL);
 | 
			
		||||
	dataman_list = mavl_create_ptr(cmp, NULL);
 | 
			
		||||
	if (!dataman_list)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
@ -85,7 +85,7 @@ struct dataman *dataman_list_add(struct dataman *dm)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	cw_dbg(DBG_X,"Adding dataman %p\n",dm);
 | 
			
		||||
	return mavl_add(dataman_list, dm);
 | 
			
		||||
	return mavl_add(dataman_list, dm,NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,6 @@
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MAX_WTPS 200
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
@ -41,7 +41,7 @@
 | 
			
		||||
#include "socklist.h"
 | 
			
		||||
#include "wtpman.h"
 | 
			
		||||
#include "wtplist.h"
 | 
			
		||||
 | 
			
		||||
#include "cw/kvt.h"
 | 
			
		||||
 | 
			
		||||
static void reset_echointerval_timer(struct wtpman *wtpman)
 | 
			
		||||
{
 | 
			
		||||
@ -94,10 +94,10 @@ static void wtpman_run_discovery(void *arg)
 | 
			
		||||
	wtpman->conn->capwap_state = CAPWAP_STATE_DISCOVERY;
 | 
			
		||||
//	wtpman->conn->actions = &capwap_actions;
 | 
			
		||||
 | 
			
		||||
	wtpman->conn->outgoing = mbag_create();
 | 
			
		||||
/*	wtpman->conn->outgoing = mbag_create();
 | 
			
		||||
	wtpman->conn->incomming = mbag_create();
 | 
			
		||||
	
 | 
			
		||||
	wtpman->conn->remote_cfg = mavl_create(mavl_cmp_kv,NULL);
 | 
			
		||||
*/	
 | 
			
		||||
	wtpman->conn->remote_cfg = cw_kvt_create(); //mavl_cmp_kv,NULL,1312);
 | 
			
		||||
 | 
			
		||||
	while (!cw_timer_timeout(timer)
 | 
			
		||||
	       && wtpman->conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user