Removed cw_ElemHandlerParams.elem
This commit is contained in:
		@ -4,8 +4,6 @@
 | 
				
			|||||||
#include "mavl.h"
 | 
					#include "mavl.h"
 | 
				
			||||||
#include "cw/mavltypes.h"
 | 
					#include "cw/mavltypes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern mavl_t actube_global_cfg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct ac_status ac_global_status;
 | 
					extern struct ac_status ac_global_status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -105,7 +105,6 @@ static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct cw_DiscoveryCache * discovery_cache;
 | 
					struct cw_DiscoveryCache * discovery_cache;
 | 
				
			||||||
mavl_t actube_global_cfg;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ac_global_init()
 | 
					int ac_global_init()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -169,6 +168,7 @@ extern void test_sets();
 | 
				
			|||||||
return 0;	
 | 
					return 0;	
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static cw_Cfg_t * global_cfg = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main (int argc, char *argv[])
 | 
					int main (int argc, char *argv[])
 | 
				
			||||||
@ -180,7 +180,6 @@ int main (int argc, char *argv[])
 | 
				
			|||||||
	const cw_Type_t **ti;
 | 
						const cw_Type_t **ti;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_Cfg_t * global_cfg = NULL;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* parse arguments */
 | 
						/* parse arguments */
 | 
				
			||||||
	parse_args (argc, argv, &bootcfg);
 | 
						parse_args (argc, argv, &bootcfg);
 | 
				
			||||||
@ -481,7 +480,7 @@ void process_cw_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (!wtpman) {
 | 
						if (!wtpman) {
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		wtpman = wtpman_create (index, addr, preamble & 0xf);
 | 
							wtpman = wtpman_create (index, addr, preamble & 0xf, global_cfg);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		if (!wtpman) {
 | 
							if (!wtpman) {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										342
									
								
								src/ac/wtpman.c
									
									
									
									
									
								
							
							
						
						
									
										342
									
								
								src/ac/wtpman.c
									
									
									
									
									
								
							@ -21,7 +21,7 @@
 | 
				
			|||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <errno.h>
 | 
					#include <errno.h>
 | 
				
			||||||
#include <unistd.h> 
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "cw/capwap.h"
 | 
					#include "cw/capwap.h"
 | 
				
			||||||
@ -63,8 +63,8 @@ static void reset_echointerval_timer(struct wtpman *wtpman)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int msg_start_handler(struct conn *conn, struct cw_action_in *a, uint8_t * data,
 | 
					static int msg_start_handler(struct conn *conn, struct cw_action_in *a,
 | 
				
			||||||
			     int len, struct sockaddr *from)
 | 
								     uint8_t * data, int len, struct sockaddr *from)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct wtpman *wtpman = conn->data;
 | 
						struct wtpman *wtpman = conn->data;
 | 
				
			||||||
	reset_echointerval_timer(wtpman);
 | 
						reset_echointerval_timer(wtpman);
 | 
				
			||||||
@ -97,17 +97,20 @@ static void wtpman_run_discovery(void *arg)
 | 
				
			|||||||
	       && wtpman->conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
 | 
						       && wtpman->conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
 | 
				
			||||||
		int rc;
 | 
							int rc;
 | 
				
			||||||
		rc = cw_read_messages(wtpman->conn);
 | 
							rc = cw_read_messages(wtpman->conn);
 | 
				
			||||||
		if (cw_result_is_ok(rc)){
 | 
							if (cw_result_is_ok(rc)) {
 | 
				
			||||||
			wtpman->conn->capwap_state=CAPWAP_STATE_JOIN;
 | 
								wtpman->conn->capwap_state = CAPWAP_STATE_JOIN;
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
			cw_dbg(DBG_INFO,"Discovery has detected mods: %s %s", 
 | 
								cw_dbg(DBG_INFO, "Discovery has detected mods: %s %s",
 | 
				
			||||||
				wtpman->conn->cmod->name,wtpman->conn->bmod->name);
 | 
								       wtpman->conn->cmod->name,
 | 
				
			||||||
 | 
								       wtpman->conn->bmod->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			wtplist_lock();
 | 
								wtplist_lock();
 | 
				
			||||||
			discovery_cache_add(discovery_cache,(struct sockaddr*)&wtpman->conn->addr,
 | 
								discovery_cache_add(discovery_cache,
 | 
				
			||||||
				wtpman->conn->cmod,wtpman->conn->bmod);
 | 
										    (struct sockaddr *) &wtpman->conn->
 | 
				
			||||||
 | 
										    addr, wtpman->conn->cmod,
 | 
				
			||||||
 | 
										    wtpman->conn->bmod);
 | 
				
			||||||
			wtplist_unlock();
 | 
								wtplist_unlock();
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -124,12 +127,13 @@ static int wtpman_dtls_setup(void *arg)
 | 
				
			|||||||
	/* try to accept the connection */
 | 
						/* try to accept the connection */
 | 
				
			||||||
	if (!dtls_accept(wtpman->conn)) {
 | 
						if (!dtls_accept(wtpman->conn)) {
 | 
				
			||||||
		cw_dbg(DBG_DTLS, "Error establishing DTLS session with %s",
 | 
							cw_dbg(DBG_DTLS, "Error establishing DTLS session with %s",
 | 
				
			||||||
		       sock_addr2str_p(&wtpman->conn->addr,sock_buf));
 | 
							       sock_addr2str_p(&wtpman->conn->addr, sock_buf));
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_dbg(DBG_DTLS, "DTLS session established with %s, %s",
 | 
						cw_dbg(DBG_DTLS, "DTLS session established with %s, %s",
 | 
				
			||||||
	       sock_addr2str_p(&wtpman->conn->addr,sock_buf), dtls_get_cipher(wtpman->conn,cipherstr));
 | 
						       sock_addr2str_p(&wtpman->conn->addr, sock_buf),
 | 
				
			||||||
 | 
						       dtls_get_cipher(wtpman->conn, cipherstr));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
@ -143,24 +147,27 @@ static int wtpman_join(void *arg)
 | 
				
			|||||||
	struct conn *conn = wtpman->conn;
 | 
						struct conn *conn = wtpman->conn;
 | 
				
			||||||
	time_t timer, wait_join;
 | 
						time_t timer, wait_join;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_dbg(DBG_INFO, "Join State - %s", sock_addr2str(&conn->addr,sock_buf));
 | 
						cw_dbg(DBG_INFO, "Join State - %s",
 | 
				
			||||||
	
 | 
						       sock_addr2str(&conn->addr, sock_buf));
 | 
				
			||||||
	wait_join = cw_ktv_get_word(conn->global_cfg,"wait-join",CAPWAP_WAIT_JOIN);
 | 
					
 | 
				
			||||||
 | 
						wait_join =
 | 
				
			||||||
 | 
						    cw_ktv_get_word(conn->global_cfg, "wait-join", CAPWAP_WAIT_JOIN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	timer = cw_timer_start(wait_join);
 | 
						timer = cw_timer_start(wait_join);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (!cw_timer_timeout(timer) && wtpman->conn->capwap_state == CAPWAP_STATE_JOIN) {
 | 
						while (!cw_timer_timeout(timer)
 | 
				
			||||||
 | 
						       && wtpman->conn->capwap_state == CAPWAP_STATE_JOIN) {
 | 
				
			||||||
		rc = cw_read_messages(wtpman->conn);
 | 
							rc = cw_read_messages(wtpman->conn);
 | 
				
			||||||
		if (rc < 0) {
 | 
							if (rc < 0) {
 | 
				
			||||||
			if (errno == EAGAIN)
 | 
								if (errno == EAGAIN)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
				
 | 
					
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,
 | 
							cw_dbg_ktv_dump(conn->remote_cfg, DBG_INFO,
 | 
				
			||||||
		"-------------dump------------",
 | 
									"-------------dump------------",
 | 
				
			||||||
		"DMP","---------end dump --------");
 | 
									"DMP", "---------end dump --------");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rc != 0) {
 | 
						if (rc != 0) {
 | 
				
			||||||
@ -170,8 +177,9 @@ static int wtpman_join(void *arg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (wtpman->conn->capwap_state != CAPWAP_STATE_JOIN_COMPLETE) {
 | 
						if (wtpman->conn->capwap_state != CAPWAP_STATE_JOIN_COMPLETE) {
 | 
				
			||||||
		cw_dbg(DBG_MSG_ERR, "No join request from %s after %d seconds, WTP died.",
 | 
							cw_dbg(DBG_MSG_ERR,
 | 
				
			||||||
		       sock_addr2str(&wtpman->conn->addr,sock_buf), wait_join);
 | 
							       "No join request from %s after %d seconds, WTP died.",
 | 
				
			||||||
 | 
							       sock_addr2str(&wtpman->conn->addr, sock_buf), wait_join);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -241,7 +249,7 @@ static void wtpman_image_data(struct wtpman *wtpman)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void * wtpman_run_data(void *wtpman_arg)
 | 
					void *wtpman_run_data(void *wtpman_arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
@ -263,44 +271,47 @@ void * wtpman_run_data(void *wtpman_arg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int cw_run_state_machine(struct conn * conn, time_t *timer)
 | 
					int cw_run_state_machine(struct conn *conn, time_t * timer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int timerval;
 | 
						int timerval;
 | 
				
			||||||
	cw_StateMachineState_t search, *result;
 | 
						cw_StateMachineState_t search, *result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	while(1){
 | 
						while (1) {
 | 
				
			||||||
		search.state = conn->capwap_state;
 | 
							search.state = conn->capwap_state;
 | 
				
			||||||
		search.prevstate = conn->capwap_prevstate;
 | 
							search.prevstate = conn->capwap_prevstate;
 | 
				
			||||||
		result = mavl_get(conn->msgset->state_machine,&search);
 | 
							result = mavl_get(conn->msgset->state_machine, &search);
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		cw_dbg(DBG_STATE,"State transition: [%s -> %s]",
 | 
							cw_dbg(DBG_STATE, "State transition: [%s -> %s]",
 | 
				
			||||||
			cw_strstate(conn->capwap_prevstate),
 | 
							       cw_strstate(conn->capwap_prevstate),
 | 
				
			||||||
			cw_strstate(conn->capwap_state)
 | 
							       cw_strstate(conn->capwap_state)
 | 
				
			||||||
			);
 | 
							    );
 | 
				
			||||||
		if (result == NULL){
 | 
							if (result == NULL) {
 | 
				
			||||||
			cw_log(LOG_ERR,"State not found");
 | 
								cw_log(LOG_ERR, "State not found");
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (result->jump_state){
 | 
							if (result->jump_state) {
 | 
				
			||||||
			conn->capwap_state = result->jump_state;
 | 
								conn->capwap_state = result->jump_state;
 | 
				
			||||||
			conn->capwap_prevstate = result->jump_prevstate;
 | 
								conn->capwap_prevstate = result->jump_prevstate;
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
			cw_dbg(DBG_STATE,"Jump to state: [%s->%s]",
 | 
								cw_dbg(DBG_STATE, "Jump to state: [%s->%s]",
 | 
				
			||||||
				cw_strstate(conn->capwap_prevstate),
 | 
								       cw_strstate(conn->capwap_prevstate),
 | 
				
			||||||
				cw_strstate(conn->capwap_state));
 | 
								       cw_strstate(conn->capwap_state));
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		if (result->dbgmsg){
 | 
							if (result->dbgmsg) {
 | 
				
			||||||
			cw_dbg(DBG_STATE,"%s",result->dbgmsg);
 | 
								cw_dbg(DBG_STATE, "%s", result->dbgmsg);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		if (result->timer_key){
 | 
							if (result->timer_key) {
 | 
				
			||||||
			timerval = cw_ktv_get_word(conn->local_cfg,result->timer_key,result->timer_default);
 | 
								timerval =
 | 
				
			||||||
 | 
								    cw_ktv_get_word(conn->local_cfg, result->timer_key,
 | 
				
			||||||
 | 
										    result->timer_default);
 | 
				
			||||||
			*timer = cw_timer_start(timerval);
 | 
								*timer = cw_timer_start(timerval);
 | 
				
			||||||
			cw_dbg(DBG_STATE,"Starting timer: [%s] - %d seconds.",result->timer_key,timerval);
 | 
								cw_dbg(DBG_STATE, "Starting timer: [%s] - %d seconds.",
 | 
				
			||||||
 | 
								       result->timer_key, timerval);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return result->retval;
 | 
							return result->retval;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -309,10 +320,10 @@ int cw_run_state_machine(struct conn * conn, time_t *timer)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/*#define CW_TRANSITION(prestate,state) (prestate<<16|state)*/
 | 
					/*#define CW_TRANSITION(prestate,state) (prestate<<16|state)*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void * wtpman_main(void *arg)
 | 
					static void *wtpman_main(void *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	mavl_t r;
 | 
						mavl_t r;
 | 
				
			||||||
	int rc ;
 | 
						int rc;
 | 
				
			||||||
	time_t timer;
 | 
						time_t timer;
 | 
				
			||||||
	char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
						char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
				
			||||||
	struct conn *conn;
 | 
						struct conn *conn;
 | 
				
			||||||
@ -323,12 +334,12 @@ static void * wtpman_main(void *arg)
 | 
				
			|||||||
	wtpman->conn->seqnum = 0;
 | 
						wtpman->conn->seqnum = 0;
 | 
				
			||||||
	conn = wtpman->conn;
 | 
						conn = wtpman->conn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wtpman->conn->remote_cfg = cw_ktv_create(); 
 | 
						wtpman->conn->remote_cfg = cw_ktv_create();
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* We were invoked with an unencrypted packet, 
 | 
						/* We were invoked with an unencrypted packet, 
 | 
				
			||||||
	 * so assume, it is a discovery request */
 | 
						 * so assume, it is a discovery request */
 | 
				
			||||||
	if (!wtpman->dtlsmode){
 | 
						if (!wtpman->dtlsmode) {
 | 
				
			||||||
		wtpman_run_discovery(arg);
 | 
							wtpman_run_discovery(arg);
 | 
				
			||||||
		wtpman_remove(wtpman);
 | 
							wtpman_remove(wtpman);
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
@ -337,65 +348,67 @@ static void * wtpman_main(void *arg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* reject connections to our multi- or broadcast sockets */
 | 
						/* reject connections to our multi- or broadcast sockets */
 | 
				
			||||||
	if (socklist[wtpman->socklistindex].type != SOCKLIST_UNICAST_SOCKET) {
 | 
						if (socklist[wtpman->socklistindex].type != SOCKLIST_UNICAST_SOCKET) {
 | 
				
			||||||
		cw_dbg(DBG_DTLS,"Reject multi");
 | 
							cw_dbg(DBG_DTLS, "Reject multi");
 | 
				
			||||||
		wtpman_remove(wtpman);
 | 
							wtpman_remove(wtpman);
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	conn->capwap_state = CAPWAP_STATE_DTLS_SETUP;
 | 
						conn->capwap_state = CAPWAP_STATE_DTLS_SETUP;
 | 
				
			||||||
	/* establish dtls session */
 | 
						/* establish dtls session */
 | 
				
			||||||
	if (!wtpman_dtls_setup(wtpman)) {
 | 
						if (!wtpman_dtls_setup(wtpman)) {
 | 
				
			||||||
		wtpman_remove(wtpman);
 | 
							wtpman_remove(wtpman);
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	/*last_state = conn->capwap_state;
 | 
						/*last_state = conn->capwap_state;
 | 
				
			||||||
	conn->capwap_state = CAPWAP_STATE_JOIN;
 | 
						   conn->capwap_state = CAPWAP_STATE_JOIN;
 | 
				
			||||||
*/
 | 
						 */
 | 
				
			||||||
	conn->capwap_prevstate = CAPWAP_STATE_DTLS_SETUP;
 | 
						conn->capwap_prevstate = CAPWAP_STATE_DTLS_SETUP;
 | 
				
			||||||
	conn->capwap_state = CAPWAP_STATE_JOIN;
 | 
						conn->capwap_state = CAPWAP_STATE_JOIN;
 | 
				
			||||||
	rc = 0;
 | 
						rc = 0;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	while (1){
 | 
						while (1) {
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
		int wait_join;
 | 
							int wait_join;
 | 
				
			||||||
		int wait_change_state;
 | 
							int wait_change_state;
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		if (!cw_run_state_machine(conn, &timer)){
 | 
							if (!cw_run_state_machine(conn, &timer)) {
 | 
				
			||||||
			cw_dbg(DBG_INFO,"WTP died");
 | 
								cw_dbg(DBG_INFO, "WTP died");
 | 
				
			||||||
					wtpman_remove(wtpman);
 | 
								wtpman_remove(wtpman);
 | 
				
			||||||
				return NULL;		
 | 
								return NULL;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		while (!cw_timer_timeout(timer)) {
 | 
							while (!cw_timer_timeout(timer)) {
 | 
				
			||||||
			if (conn->update_cfg != NULL){
 | 
								if (conn->update_cfg != NULL) {
 | 
				
			||||||
				mavl_t tmp;
 | 
									mavl_t tmp;
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				tmp = conn->local_cfg;
 | 
									tmp = conn->local_cfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				mavl_merge(conn->default_cfg, conn->local_cfg);
 | 
									mavl_merge(conn->default_cfg, conn->local_cfg);
 | 
				
			||||||
/*				mavl_merge(conn->default_cfg, conn->remote_cfg);*/
 | 
					/*				mavl_merge(conn->default_cfg, conn->remote_cfg);*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				conn->local_cfg=conn->update_cfg;
 | 
									conn->local_cfg = conn->update_cfg;
 | 
				
			||||||
								
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
								
 | 
					 | 
				
			||||||
				cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
 | 
					 | 
				
			||||||
				mavl_merge(conn->remote_cfg,conn->update_cfg);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				conn->update_cfg=NULL;
 | 
									cw_dbg(DBG_INFO, "Updating WTP %s",
 | 
				
			||||||
				conn->local_cfg=tmp;
 | 
									       sock_addr2str(&conn->addr, sock_buf));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									rc = cw_send_request(conn,
 | 
				
			||||||
 | 
											     CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
 | 
				
			||||||
 | 
									mavl_merge(conn->remote_cfg, conn->update_cfg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									conn->update_cfg = NULL;
 | 
				
			||||||
 | 
									conn->local_cfg = tmp;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
			rc = cw_read_messages(wtpman->conn);
 | 
								rc = cw_read_messages(wtpman->conn);
 | 
				
			||||||
			if (rc < 0) {
 | 
								if (rc < 0) {
 | 
				
			||||||
				if (errno == EAGAIN)
 | 
									if (errno == EAGAIN)
 | 
				
			||||||
@ -403,31 +416,31 @@ static void * wtpman_main(void *arg)
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		if(rc<0){
 | 
							if (rc < 0) {
 | 
				
			||||||
			conn->capwap_prevstate = conn->capwap_state;
 | 
								conn->capwap_prevstate = conn->capwap_state;
 | 
				
			||||||
			conn->capwap_state = CAPWAP_STATE_TIMEOUT;
 | 
								conn->capwap_state = CAPWAP_STATE_TIMEOUT;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -443,11 +456,11 @@ static void * wtpman_main(void *arg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_dbg(DBG_INFO, "WTP from %s has joined with session id: %s",
 | 
						cw_dbg(DBG_INFO, "WTP from %s has joined with session id: %s",
 | 
				
			||||||
			sock_addr2str_p(&conn->addr,sock_buf),
 | 
						       sock_addr2str_p(&conn->addr, sock_buf),
 | 
				
			||||||
			format_bin2hex(conn->session_id,16));
 | 
						       format_bin2hex(conn->session_id, 16));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exit(0);
 | 
						exit(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
//	cw_dbg(DBG_INFO, "Creating data thread");
 | 
					//	cw_dbg(DBG_INFO, "Creating data thread");
 | 
				
			||||||
@ -469,7 +482,9 @@ exit(0);
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP","---------end dump --------");
 | 
						cw_dbg_ktv_dump(conn->remote_cfg, DBG_INFO,
 | 
				
			||||||
 | 
								"-------------dump------------", "DMP",
 | 
				
			||||||
 | 
								"---------end dump --------");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!cw_result_is_ok(rc)) {
 | 
						if (!cw_result_is_ok(rc)) {
 | 
				
			||||||
		cw_dbg(DBG_INFO, "WTP Problem: %s", cw_strrc(rc));
 | 
							cw_dbg(DBG_INFO, "WTP Problem: %s", cw_strrc(rc));
 | 
				
			||||||
@ -494,7 +509,7 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
 | 
				
			|||||||
//	radios_to_sql(conn);
 | 
					//	radios_to_sql(conn);
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*conn->msg_end=msg_end_handler;*/
 | 
						/*conn->msg_end=msg_end_handler; */
 | 
				
			||||||
	/* The main run loop */
 | 
						/* The main run loop */
 | 
				
			||||||
	reset_echointerval_timer(wtpman);
 | 
						reset_echointerval_timer(wtpman);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -508,12 +523,12 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/*//		cw_dbg(DBG_X, "Time left: %d",
 | 
					/*//		cw_dbg(DBG_X, "Time left: %d",
 | 
				
			||||||
// */
 | 
					// */
 | 
				
			||||||
	       /*cw_timer_timeleft(wtpman->echointerval_timer);*/
 | 
							/*cw_timer_timeleft(wtpman->echointerval_timer); */
 | 
				
			||||||
	       
 | 
					
 | 
				
			||||||
		if (cw_timer_timeout(wtpman->echointerval_timer)) {
 | 
							if (cw_timer_timeout(wtpman->echointerval_timer)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			cw_dbg(DBG_INFO, "Lost connection to WTP:%s",
 | 
								cw_dbg(DBG_INFO, "Lost connection to WTP:%s",
 | 
				
			||||||
			       sock_addr2str_p(&conn->addr,sock_buf));
 | 
								       sock_addr2str_p(&conn->addr, sock_buf));
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@ -525,17 +540,20 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
		r = db_get_update_tasks(conn, sock_addr2str(&conn->addr,sock_buf));
 | 
							r = db_get_update_tasks(conn,
 | 
				
			||||||
 | 
										sock_addr2str(&conn->addr, sock_buf));
 | 
				
			||||||
		if (r) {
 | 
							if (r) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*		
 | 
								/*              
 | 
				
			||||||
//			if (!conn->outgoing->count)
 | 
								   //                   if (!conn->outgoing->count)
 | 
				
			||||||
//				continue;
 | 
								   //                           continue;
 | 
				
			||||||
*/
 | 
								 */
 | 
				
			||||||
			cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf));
 | 
								cw_dbg(DBG_INFO, "Updating WTP %s",
 | 
				
			||||||
 | 
								       sock_addr2str(&conn->addr, sock_buf));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
 | 
								rc = cw_send_request(conn,
 | 
				
			||||||
 | 
										     CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
//			mavl_merge(conn->config, conn->outgoing);
 | 
					//			mavl_merge(conn->config, conn->outgoing);
 | 
				
			||||||
@ -547,15 +565,18 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		r = db_get_radio_tasks(conn, sock_addr2str(&conn->addr,sock_buf));
 | 
							r = db_get_radio_tasks(conn,
 | 
				
			||||||
 | 
									       sock_addr2str(&conn->addr, sock_buf));
 | 
				
			||||||
		if (r) {
 | 
							if (r) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
			//			if (!conn->radios_upd->count)
 | 
								//			if (!conn->radios_upd->count)
 | 
				
			||||||
//				continue;
 | 
					//				continue;
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
			cw_dbg(DBG_INFO, "Updating Radios for %s",sock_addr2str(&conn->addr,sock_buf));
 | 
								cw_dbg(DBG_INFO, "Updating Radios for %s",
 | 
				
			||||||
			rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
 | 
								       sock_addr2str(&conn->addr, sock_buf));
 | 
				
			||||||
 | 
								rc = cw_send_request(conn,
 | 
				
			||||||
 | 
										     CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
//			conn_clear_upd(conn,1);
 | 
					//			conn_clear_upd(conn,1);
 | 
				
			||||||
@ -567,21 +588,21 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
 | 
				
			|||||||
//			radios_to_sql(conn);
 | 
					//			radios_to_sql(conn);
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST);
 | 
								   rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST);
 | 
				
			||||||
			mavl_merge(conn->config, conn->outgoing);
 | 
								   mavl_merge(conn->config, conn->outgoing);
 | 
				
			||||||
			mavl_destroy(conn->outgoing);
 | 
								   mavl_destroy(conn->outgoing);
 | 
				
			||||||
			conn->outgoing = mbag_create();
 | 
								   conn->outgoing = mbag_create();
 | 
				
			||||||
			config_to_sql(conn);
 | 
								   config_to_sql(conn);
 | 
				
			||||||
			radios_to_sql(conn);
 | 
								   radios_to_sql(conn);
 | 
				
			||||||
			mavl_destroy(r);
 | 
								   mavl_destroy(r);
 | 
				
			||||||
			*/
 | 
								 */
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	db_ping_wtp(sock_addr2str_p(&conn->addr,sock_buf), "");
 | 
						db_ping_wtp(sock_addr2str_p(&conn->addr, sock_buf), "");
 | 
				
			||||||
	wtpman_remove(wtpman);
 | 
						wtpman_remove(wtpman);
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -596,8 +617,9 @@ static void wtpman_run_dtls(void *arg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* reject connections to our multi- or broadcast sockets */
 | 
						/* reject connections to our multi- or broadcast sockets */
 | 
				
			||||||
	if (socklist[wtpman->socklistindex].type != SOCKLIST_UNICAST_SOCKET) {
 | 
						if (socklist[wtpman->socklistindex].type != SOCKLIST_UNICAST_SOCKET) {
 | 
				
			||||||
		cw_dbg(DBG_DTLS, "Dropping connection from %s to non-unicast socket.",
 | 
							cw_dbg(DBG_DTLS,
 | 
				
			||||||
		       sock_addr2str_p(&wtpman->conn->addr,sock_buf));
 | 
							       "Dropping connection from %s to non-unicast socket.",
 | 
				
			||||||
 | 
							       sock_addr2str_p(&wtpman->conn->addr, sock_buf));
 | 
				
			||||||
		wtpman_remove(wtpman);
 | 
							wtpman_remove(wtpman);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -623,13 +645,14 @@ void wtpman_destroy(struct wtpman *wtpman)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dtlsmode)
 | 
					struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
 | 
				
			||||||
 | 
								     int dtlsmode, cw_Cfg_t * global_cfg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sockaddr dbgaddr;
 | 
						struct sockaddr dbgaddr;
 | 
				
			||||||
	socklen_t dbgaddrl;
 | 
						socklen_t dbgaddrl;
 | 
				
			||||||
	int sockfd, replyfd;
 | 
						int sockfd, replyfd;
 | 
				
			||||||
	char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
						char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	struct wtpman *wtpman;
 | 
						struct wtpman *wtpman;
 | 
				
			||||||
	wtpman = malloc(sizeof(struct wtpman));
 | 
						wtpman = malloc(sizeof(struct wtpman));
 | 
				
			||||||
	if (!wtpman)
 | 
						if (!wtpman)
 | 
				
			||||||
@ -642,8 +665,9 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
 | 
				
			|||||||
		replyfd = socklist_find_reply_socket(srcaddr, port);
 | 
							replyfd = socklist_find_reply_socket(srcaddr, port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (replyfd == -1) {
 | 
							if (replyfd == -1) {
 | 
				
			||||||
			cw_log(LOG_ERR, "Can't find reply socket for request from %s",
 | 
								cw_log(LOG_ERR,
 | 
				
			||||||
			       sock_addr2str(srcaddr,sock_buf));
 | 
								       "Can't find reply socket for request from %s",
 | 
				
			||||||
 | 
								       sock_addr2str(srcaddr, sock_buf));
 | 
				
			||||||
			free(wtpman);
 | 
								free(wtpman);
 | 
				
			||||||
			return NULL;
 | 
								return NULL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -651,19 +675,19 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
 | 
				
			|||||||
		replyfd = socklist[socklistindex].sockfd;
 | 
							replyfd = socklist[socklistindex].sockfd;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sockfd = replyfd;	/*//socklist[socklistindex].reply_sockfd;*/
 | 
						sockfd = replyfd;	/*//socklist[socklistindex].reply_sockfd; */
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dbgaddrl = sizeof(dbgaddr);
 | 
						dbgaddrl = sizeof(dbgaddr);
 | 
				
			||||||
	getsockname(sockfd, &dbgaddr, &dbgaddrl);
 | 
						getsockname(sockfd, &dbgaddr, &dbgaddrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_dbg(DBG_INFO, "Creating wtpman on socket %d, %s:%d", sockfd,
 | 
						cw_dbg(DBG_INFO, "Creating wtpman on socket %d, %s:%d", sockfd,
 | 
				
			||||||
	       sock_addr2str(&dbgaddr,sock_buf), sock_getport(&dbgaddr));
 | 
						       sock_addr2str(&dbgaddr, sock_buf), sock_getport(&dbgaddr));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -671,7 +695,8 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
 | 
				
			|||||||
	wtpman->conn->role = CW_ROLE_AC;
 | 
						wtpman->conn->role = CW_ROLE_AC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wtpman->conn->data_sock = socklist[socklistindex].data_sockfd;
 | 
						wtpman->conn->data_sock = socklist[socklistindex].data_sockfd;
 | 
				
			||||||
	sock_copyaddr(&wtpman->conn->data_addr, (struct sockaddr *) &wtpman->conn->addr);
 | 
						sock_copyaddr(&wtpman->conn->data_addr,
 | 
				
			||||||
 | 
							      (struct sockaddr *) &wtpman->conn->addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!wtpman->conn) {
 | 
						if (!wtpman->conn) {
 | 
				
			||||||
		wtpman_destroy(wtpman);
 | 
							wtpman_destroy(wtpman);
 | 
				
			||||||
@ -699,21 +724,24 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wtpman->conn->local_cfg = cw_ktv_create();
 | 
						wtpman->conn->local_cfg = cw_ktv_create();
 | 
				
			||||||
	wtpman->conn->global_cfg = actube_global_cfg;
 | 
						wtpman->conn->global_cfg = global_cfg;
 | 
				
			||||||
	wtpman->conn->local_cfg = actube_global_cfg;
 | 
						wtpman->conn->local_cfg = global_cfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* when created caused by a packet in DTLS mode, we try
 | 
						/* when created caused by a packet in DTLS mode, we try
 | 
				
			||||||
	 * to find out the modules to load, for detected connection 
 | 
						 * to find out the modules to load, for detected connection 
 | 
				
			||||||
	 * from discovery request */
 | 
						 * from discovery request */
 | 
				
			||||||
	if (dtlsmode){
 | 
						if (dtlsmode) {
 | 
				
			||||||
		int rc;
 | 
							int rc;
 | 
				
			||||||
		struct cw_Mod *cmod, *bmod;
 | 
							struct cw_Mod *cmod, *bmod;
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		rc = discovery_cache_get(discovery_cache,srcaddr,&cmod,&bmod);
 | 
							rc = discovery_cache_get(discovery_cache, srcaddr, &cmod,
 | 
				
			||||||
		if (rc){
 | 
										 &bmod);
 | 
				
			||||||
			cw_dbg(DBG_INFO, "Initializing with mod %s %s",cmod->name,bmod->name);
 | 
							if (rc) {
 | 
				
			||||||
			wtpman->conn->msgset = cw_mod_get_msg_set(wtpman->conn,cmod,bmod);
 | 
								cw_dbg(DBG_INFO, "Initializing with mod %s %s",
 | 
				
			||||||
			wtpman->conn->detected=1;
 | 
								       cmod->name, bmod->name);
 | 
				
			||||||
 | 
								wtpman->conn->msgset =
 | 
				
			||||||
 | 
								    cw_mod_get_msg_set(wtpman->conn, cmod, bmod);
 | 
				
			||||||
 | 
								wtpman->conn->detected = 1;
 | 
				
			||||||
			cmod->setup_cfg(wtpman->conn);
 | 
								cmod->setup_cfg(wtpman->conn);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -729,14 +757,8 @@ void wtpman_addpacket(struct wtpman *wtpman, uint8_t * packet, int len)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void wtpman_start(struct wtpman *wtpman, int dtlsmode)
 | 
					void wtpman_start(struct wtpman *wtpman, int dtlsmode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	cw_dbg(DBG_INFO, "Starting wtpman, DTLS mode = %d",dtlsmode);
 | 
						cw_dbg(DBG_INFO, "Starting wtpman, DTLS mode = %d", dtlsmode);
 | 
				
			||||||
	wtpman->dtlsmode=dtlsmode;
 | 
						wtpman->dtlsmode = dtlsmode;
 | 
				
			||||||
	pthread_create(&wtpman->thread, NULL, wtpman_main,
 | 
						pthread_create(&wtpman->thread, NULL, wtpman_main, (void *) wtpman);
 | 
				
			||||||
		       (void *) wtpman);
 | 
					 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -8,19 +8,20 @@
 | 
				
			|||||||
#include "cw/capwap.h"
 | 
					#include "cw/capwap.h"
 | 
				
			||||||
#include "cw/fragman.h"
 | 
					#include "cw/fragman.h"
 | 
				
			||||||
#include "cw/timer.h"
 | 
					#include "cw/timer.h"
 | 
				
			||||||
 | 
					#include "cw/cfg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define WTPMAN_QSIZE 1024
 | 
					#define WTPMAN_QSIZE 1024
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wtpman{
 | 
					struct wtpman {
 | 
				
			||||||
	pthread_t thread;
 | 
						pthread_t thread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct conn * conn;
 | 
						struct conn *conn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* wtp data */
 | 
						/* wtp data */
 | 
				
			||||||
	uint8_t * wtp_name;
 | 
						uint8_t *wtp_name;
 | 
				
			||||||
	uint8_t * wtp_location;
 | 
						uint8_t *wtp_location;
 | 
				
			||||||
	uint8_t * session_id;
 | 
						uint8_t *session_id;
 | 
				
			||||||
	uint8_t wtp_mactype;
 | 
						uint8_t wtp_mactype;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int socklistindex;
 | 
						int socklistindex;
 | 
				
			||||||
@ -28,7 +29,7 @@ struct wtpman{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	int dtlsmode;
 | 
						int dtlsmode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_timer_t echointerval_timer; 
 | 
						cw_timer_t echointerval_timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -43,13 +44,14 @@ struct wtp{
 | 
				
			|||||||
//extern void wtpman_run(void *arg);
 | 
					//extern void wtpman_run(void *arg);
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wtpman * wtpman_create();
 | 
					struct wtpman *wtpman_create();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wtpman * wtpman_create(int socklistindex,struct sockaddr * srcaddr, int dtlsmode);
 | 
					struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
 | 
				
			||||||
 | 
								     int dtlsmode, cw_Cfg_t * global_cfg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void wtpman_addpacket(struct wtpman * wtpman,uint8_t *packet,int len);
 | 
					extern void wtpman_addpacket(struct wtpman *wtpman, uint8_t * packet, int len);
 | 
				
			||||||
extern void wtpman_destroy(struct wtpman * wtpman);
 | 
					extern void wtpman_destroy(struct wtpman *wtpman);
 | 
				
			||||||
extern void wtpman_start(struct wtpman * wtpman,int dtlsmode);
 | 
					extern void wtpman_start(struct wtpman *wtpman, int dtlsmode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1770,7 +1770,7 @@ MAN_EXTENSION          = .3
 | 
				
			|||||||
# The default value is: NO.
 | 
					# The default value is: NO.
 | 
				
			||||||
# This tag requires that the tag GENERATE_MAN is set to YES.
 | 
					# This tag requires that the tag GENERATE_MAN is set to YES.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MAN_LINKS              = NO
 | 
					MAN_LINKS              = YES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#---------------------------------------------------------------------------
 | 
					#---------------------------------------------------------------------------
 | 
				
			||||||
# Configuration options related to the XML output
 | 
					# Configuration options related to the XML output
 | 
				
			||||||
 | 
				
			|||||||
@ -606,4 +606,10 @@ uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def)
 | 
				
			|||||||
	return v.val.word;
 | 
						return v.val.word;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cw_cfg_set_int(cw_Cfg_t * cfg, const char * key, int val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char a[128];
 | 
				
			||||||
 | 
						sprintf(a,"%d",val);
 | 
				
			||||||
 | 
						printf("VVVVVV: %s\n",a);
 | 
				
			||||||
 | 
						cw_cfg_set(cfg,key,a);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -31,6 +31,7 @@ void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def);
 | 
					int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def);
 | 
				
			||||||
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def);
 | 
					uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def);
 | 
				
			||||||
 | 
					void cw_cfg_set_int(cw_Cfg_t * cfg, const char * key, int val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -47,10 +47,10 @@ void cw_init_response(struct conn *conn, uint8_t * req)
 | 
				
			|||||||
	uint8_t *buffer;
 | 
						uint8_t *buffer;
 | 
				
			||||||
	int shbytes, dhbytes;
 | 
						int shbytes, dhbytes;
 | 
				
			||||||
	uint8_t *msgptr, *dmsgptr;
 | 
						uint8_t *msgptr, *dmsgptr;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	buffer = conn->resp_buffer;
 | 
						buffer = conn->resp_buffer;
 | 
				
			||||||
	shbytes = cw_get_hdr_msg_offset(req);
 | 
						shbytes = cw_get_hdr_msg_offset(req);
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	memcpy(buffer, req, shbytes);
 | 
						memcpy(buffer, req, shbytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cw_set_hdr_rmac(buffer, conn->base_rmac);
 | 
						cw_set_hdr_rmac(buffer, conn->base_rmac);
 | 
				
			||||||
@ -73,7 +73,7 @@ void cw_init_request(struct conn *conn, int msg_id)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	uint8_t *buffer = conn->req_buffer;
 | 
						uint8_t *buffer = conn->req_buffer;
 | 
				
			||||||
	uint8_t *msgptr;
 | 
						uint8_t *msgptr;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	/* zero the first 8 bytes */
 | 
						/* zero the first 8 bytes */
 | 
				
			||||||
	cw_set_dword(buffer + 0, 0);
 | 
						cw_set_dword(buffer + 0, 0);
 | 
				
			||||||
	cw_set_dword(buffer + 4, 0);
 | 
						cw_set_dword(buffer + 4, 0);
 | 
				
			||||||
@ -135,11 +135,12 @@ int cw_send_response(struct conn *conn, uint8_t * rawmsg, int len)
 | 
				
			|||||||
 * @param result_code result code to send
 | 
					 * @param result_code result code to send
 | 
				
			||||||
 * @return 1
 | 
					 * @return 1
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int cw_send_error_response(struct conn *conn, uint8_t * rawmsg, uint32_t result_code)
 | 
					int cw_send_error_response(struct conn *conn, uint8_t * rawmsg,
 | 
				
			||||||
 | 
								   uint32_t result_code)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint8_t *out,*dst;
 | 
						uint8_t *out, *dst;
 | 
				
			||||||
	int l;
 | 
						int l;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	cw_init_response(conn, rawmsg);
 | 
						cw_init_response(conn, rawmsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	out = conn->resp_buffer;
 | 
						out = conn->resp_buffer;
 | 
				
			||||||
@ -155,31 +156,34 @@ int cw_send_error_response(struct conn *conn, uint8_t * rawmsg, uint32_t result_
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct cw_MsgSet *load_msg_set(struct conn *conn, uint8_t * rawmsg, int len,
 | 
					static struct cw_MsgSet *load_msg_set(struct conn *conn, uint8_t * rawmsg,
 | 
				
			||||||
				      int elems_len, struct sockaddr *from)
 | 
									      int len, int elems_len,
 | 
				
			||||||
 | 
									      struct sockaddr *from)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
						char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
				
			||||||
	struct cw_Mod *cmod, *bmod;
 | 
						struct cw_Mod *cmod, *bmod;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	cmod =
 | 
						cmod =
 | 
				
			||||||
	    cw_mod_detect(conn, rawmsg, len, elems_len, from, CW_MOD_MODE_CAPWAP);
 | 
						    cw_mod_detect(conn, rawmsg, len, elems_len, from,
 | 
				
			||||||
 | 
								  CW_MOD_MODE_CAPWAP);
 | 
				
			||||||
	if (cmod == MOD_NULL) {
 | 
						if (cmod == MOD_NULL) {
 | 
				
			||||||
		cw_dbg(DBG_MSG_ERR,
 | 
							cw_dbg(DBG_MSG_ERR,
 | 
				
			||||||
		       "Can't find mod to handle connection from %s, discarding message",
 | 
							       "Can't find mod to handle connection from %s, discarding message",
 | 
				
			||||||
		       sock_addr2str_p(from,sock_buf));
 | 
							       sock_addr2str_p(from, sock_buf));
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bmod = 
 | 
						bmod =
 | 
				
			||||||
	    cw_mod_detect(conn, rawmsg, len, elems_len, from, CW_MOD_MODE_BINDINGS);
 | 
						    cw_mod_detect(conn, rawmsg, len, elems_len, from,
 | 
				
			||||||
 | 
								  CW_MOD_MODE_BINDINGS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	cw_dbg(DBG_INFO, "Mods deteced: %s,%s", cmod->name, bmod->name);
 | 
						cw_dbg(DBG_INFO, "Mods deteced: %s,%s", cmod->name, bmod->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	conn->cmod = cmod;
 | 
						conn->cmod = cmod;
 | 
				
			||||||
	conn->bmod = bmod;
 | 
						conn->bmod = bmod;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return cw_mod_get_msg_set(conn,cmod,bmod);
 | 
						return cw_mod_get_msg_set(conn, cmod, bmod);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -217,16 +221,17 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
	mavl_t mand_found;
 | 
						mavl_t mand_found;
 | 
				
			||||||
	mlist_t unrecognized;
 | 
						mlist_t unrecognized;
 | 
				
			||||||
	struct cw_MsgData search;
 | 
						struct cw_MsgData search;
 | 
				
			||||||
	struct cw_MsgData * message;
 | 
						struct cw_MsgData *message;
 | 
				
			||||||
	int result_code;
 | 
						int result_code;
 | 
				
			||||||
	cw_State_t *ui;
 | 
						cw_State_t *ui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint8_t *elems_ptr;
 | 
						uint8_t *elems_ptr;
 | 
				
			||||||
	uint8_t *elem;
 | 
						uint8_t *elem;
 | 
				
			||||||
	
 | 
						struct cw_ElemHandlerParams params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char sock_buf[SOCK_ADDR_BUFSIZE]; /**< to hold str from sockaddr2str */
 | 
						char sock_buf[SOCK_ADDR_BUFSIZE]; /**< to hold str from sockaddr2str */
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	/*struct cw_action_in as, *af, *afm;*/
 | 
						/*struct cw_action_in as, *af, *afm; */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int offset = cw_get_hdr_msg_offset(rawmsg);
 | 
						int offset = cw_get_hdr_msg_offset(rawmsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -243,7 +248,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
		if (conn->strict_hdr) {
 | 
							if (conn->strict_hdr) {
 | 
				
			||||||
			cw_dbg(DBG_MSG_ERR,
 | 
								cw_dbg(DBG_MSG_ERR,
 | 
				
			||||||
			       "Discarding message from %s, msgelems len=%d, payload len=%d, (Strict CAPWAP) ",
 | 
								       "Discarding message from %s, msgelems len=%d, payload len=%d, (Strict CAPWAP) ",
 | 
				
			||||||
			       sock_addr2str(&conn->addr,sock_buf), elems_len, payloadlen - 8);
 | 
								       sock_addr2str(&conn->addr, sock_buf), elems_len,
 | 
				
			||||||
 | 
								       payloadlen - 8);
 | 
				
			||||||
			errno = EAGAIN;
 | 
								errno = EAGAIN;
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -252,7 +258,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
		if (elems_len < payloadlen - 8) {
 | 
							if (elems_len < payloadlen - 8) {
 | 
				
			||||||
			cw_dbg(DBG_RFC,
 | 
								cw_dbg(DBG_RFC,
 | 
				
			||||||
			       "Packet from from %s has %d bytes of extra data, ignoring.",
 | 
								       "Packet from from %s has %d bytes of extra data, ignoring.",
 | 
				
			||||||
			       sock_addr2str(&conn->addr,sock_buf), payloadlen - 8 - elems_len);
 | 
								       sock_addr2str(&conn->addr, sock_buf),
 | 
				
			||||||
 | 
								       payloadlen - 8 - elems_len);
 | 
				
			||||||
			elems_len = len - 8;
 | 
								elems_len = len - 8;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -260,7 +267,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			cw_dbg(DBG_RFC,
 | 
								cw_dbg(DBG_RFC,
 | 
				
			||||||
			       "Packet from from %s has msgelems len of %d bytes, but has only %d bytes of data, truncating.",
 | 
								       "Packet from from %s has msgelems len of %d bytes, but has only %d bytes of data, truncating.",
 | 
				
			||||||
			       sock_addr2str(&conn->addr, sock_buf), elems_len, payloadlen - 8);
 | 
								       sock_addr2str(&conn->addr, sock_buf), elems_len,
 | 
				
			||||||
 | 
								       payloadlen - 8);
 | 
				
			||||||
			elems_len = payloadlen - 8;
 | 
								elems_len = payloadlen - 8;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -269,16 +277,17 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
	/* Detect the connecting AC type */
 | 
						/* Detect the connecting AC type */
 | 
				
			||||||
	if (!conn->detected) {
 | 
						if (!conn->detected) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct cw_MsgSet *set = load_msg_set(conn, rawmsg, len, elems_len, from);
 | 
							struct cw_MsgSet *set =
 | 
				
			||||||
 | 
							    load_msg_set(conn, rawmsg, len, elems_len, from);
 | 
				
			||||||
		if (!set) {
 | 
							if (!set) {
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
			//cw_log(LOG_ERR, "Error");
 | 
								//cw_log(LOG_ERR, "Error");
 | 
				
			||||||
*/ 
 | 
					*/
 | 
				
			||||||
			errno = EAGAIN;
 | 
								errno = EAGAIN;
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		conn->cmod->setup_cfg(conn);
 | 
							conn->cmod->setup_cfg(conn);
 | 
				
			||||||
		conn->msgset= set;
 | 
							conn->msgset = set;
 | 
				
			||||||
		conn->detected = 1;
 | 
							conn->detected = 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -287,30 +296,30 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/* prepare struct for search operation */
 | 
						/* prepare struct for search operation */
 | 
				
			||||||
	search.type = cw_get_msg_id(msg_ptr);
 | 
						search.type = cw_get_msg_id(msg_ptr);
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	/* Search message */
 | 
						/* Search message */
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	message = mavl_get(conn->msgset->msgdata,&search);
 | 
						message = mavl_get(conn->msgset->msgdata, &search);
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
	result_code = 0;
 | 
						result_code = 0;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	if (!message){
 | 
						if (!message) {
 | 
				
			||||||
		/* Message is unknown */
 | 
							/* Message is unknown */
 | 
				
			||||||
		if (search.type & 1){
 | 
							if (search.type & 1) {
 | 
				
			||||||
			cw_dbg(DBG_MSG_ERR, 
 | 
								cw_dbg(DBG_MSG_ERR,
 | 
				
			||||||
				"Message type %d [%s] unrecognized, sending response.",
 | 
								       "Message type %d [%s] unrecognized, sending response.",
 | 
				
			||||||
				search.type, cw_strmsg(search.type),
 | 
								       search.type, cw_strmsg(search.type),
 | 
				
			||||||
				cw_strstate(conn->capwap_state));
 | 
								       cw_strstate(conn->capwap_state));
 | 
				
			||||||
				
 | 
					
 | 
				
			||||||
			result_code = CAPWAP_RESULT_MSG_UNRECOGNIZED;
 | 
								result_code = CAPWAP_RESULT_MSG_UNRECOGNIZED;
 | 
				
			||||||
			cw_send_error_response(conn, rawmsg, result_code);
 | 
								cw_send_error_response(conn, rawmsg, result_code);
 | 
				
			||||||
			errno = EAGAIN;
 | 
								errno = EAGAIN;
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		cw_dbg(DBG_MSG_ERR, 
 | 
							cw_dbg(DBG_MSG_ERR,
 | 
				
			||||||
			"Message type %d [%s] unrecognized, discarding.",
 | 
							       "Message type %d [%s] unrecognized, discarding.",
 | 
				
			||||||
		search.type, cw_strmsg(search.type),
 | 
							       search.type, cw_strmsg(search.type),
 | 
				
			||||||
		cw_strstate(conn->capwap_state));
 | 
							       cw_strstate(conn->capwap_state));
 | 
				
			||||||
		errno = EAGAIN;
 | 
							errno = EAGAIN;
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -332,18 +341,18 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
	/* Check if current state is in state of message */
 | 
						/* Check if current state is in state of message */
 | 
				
			||||||
	ui = message->states;
 | 
						ui = message->states;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (ui=message->states; ui->state; ui++){
 | 
						for (ui = message->states; ui->state; ui++) {
 | 
				
			||||||
/*		printf("Comparing %d and %d\n", conn->capwap_state, ui->state);*/
 | 
					/*		printf("Comparing %d and %d\n", conn->capwap_state, ui->state);*/
 | 
				
			||||||
		if(ui->state==conn->capwap_state){
 | 
							if (ui->state == conn->capwap_state) {
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	if (!ui->state){
 | 
						if (!ui->state) {
 | 
				
			||||||
		/* Message found, but it was in wrong state */
 | 
							/* Message found, but it was in wrong state */
 | 
				
			||||||
		cw_dbg(DBG_MSG_ERR,
 | 
							cw_dbg(DBG_MSG_ERR,
 | 
				
			||||||
		       "Message type %d (%s) not allowed in %s State, sending response.", 
 | 
							       "Message type %d (%s) not allowed in %s State, sending response.",
 | 
				
			||||||
		       search.type,cw_strmsg(search.type), 
 | 
							       search.type, cw_strmsg(search.type),
 | 
				
			||||||
		       cw_strstate(conn->capwap_state));
 | 
							       cw_strstate(conn->capwap_state));
 | 
				
			||||||
		result_code = CAPWAP_RESULT_MSG_INVALID_IN_CURRENT_STATE;
 | 
							result_code = CAPWAP_RESULT_MSG_INVALID_IN_CURRENT_STATE;
 | 
				
			||||||
		cw_send_error_response(conn, rawmsg, result_code);
 | 
							cw_send_error_response(conn, rawmsg, result_code);
 | 
				
			||||||
@ -352,97 +361,53 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
/*	if (conn->msg_start){
 | 
					 | 
				
			||||||
		conn->msg_start(conn, afm, rawmsg, len, from);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
	/* Execute start processor for message */
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
//	if (afm->start) {
 | 
					 | 
				
			||||||
//		afm->start(conn, afm, rawmsg, len, from);
 | 
					 | 
				
			||||||
//	}
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
 | 
						elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params.local_cfg = conn->local_cfg;
 | 
				
			||||||
 | 
						params.remote_cfg = conn->remote_cfg;
 | 
				
			||||||
 | 
						params.default_cfg = conn->default_cfg;
 | 
				
			||||||
 | 
						params.global_cfg = conn->global_cfg;
 | 
				
			||||||
 | 
						params.msgset = conn->msgset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params.from = from;
 | 
				
			||||||
 | 
						params.msgdata = message;
 | 
				
			||||||
 | 
						params.mand_found = mand_found;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Create an avltree to catch the found mandatory elements */
 | 
					 | 
				
			||||||
/*	//conn->mand = stravltree_create();*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mand_found = mavl_create_conststr();
 | 
						mand_found = mavl_create_conststr();
 | 
				
			||||||
	unrecognized = mlist_create(NULL,NULL,sizeof(uint8_t*));
 | 
						unrecognized = mlist_create(NULL, NULL, sizeof(uint8_t *));
 | 
				
			||||||
 | 
					 | 
				
			||||||
	cw_dbg(DBG_MSG_PARSING ,"*** Parsing message of type %d - (%s) ***",
 | 
					 | 
				
			||||||
			message->type,message->name);
 | 
					 | 
				
			||||||
	/* iterate through message elements */
 | 
					 | 
				
			||||||
	cw_foreach_elem(elem, elems_ptr, elems_len) {
 | 
					 | 
				
			||||||
		int rc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		struct cw_ElemHandlerParams params;
 | 
					 | 
				
			||||||
		int elem_len, elem_id, max_len;
 | 
					 | 
				
			||||||
		uint8_t * elem_data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		elem_len = cw_get_elem_len(elem);
 | 
					 | 
				
			||||||
		elem_data=cw_get_elem_data(elem);
 | 
					 | 
				
			||||||
		elem_id = cw_get_elem_id(elem);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		max_len=elems_len-(elem_data-elems_ptr);
 | 
					 | 
				
			||||||
		if (elem_len > max_len){
 | 
					 | 
				
			||||||
			cw_dbg(DBG_RFC,
 | 
					 | 
				
			||||||
			"Messag element claims size of %d bytes, but only %d bytes are left in the payload, truncating.",
 | 
					 | 
				
			||||||
			elem_len,max_len-4);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
/*		params.conn=conn;*/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                params.local_cfg=conn->local_cfg;
 | 
					 | 
				
			||||||
                params.remote_cfg=conn->remote_cfg;
 | 
					 | 
				
			||||||
                params.default_cfg=conn->default_cfg;
 | 
					 | 
				
			||||||
                params.global_cfg=conn->global_cfg;
 | 
					 | 
				
			||||||
                params.msgset=conn->msgset;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		params.from=from;
 | 
						cw_dbg(DBG_MSG_PARSING, "*** Parsing message of type %d - (%s) ***",
 | 
				
			||||||
		params.msgdata=message;
 | 
						       message->type, message->name);
 | 
				
			||||||
		params.mand_found=mand_found;
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		rc = cw_process_element(¶ms,0,0,elem_id,elem_data,elem_len); 
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (cw_result_is_ok(rc))
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (rc == CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT){
 | 
					 | 
				
			||||||
			mlist_append(unrecognized,&elem);
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (rc < 0 ){
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
					
 | 
				
			||||||
 | 
						cw_decode_elements(¶ms,elems_ptr, elems_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						exit(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* all message elements are processed, do now after processing
 | 
						/* all message elements are processed, do now after processing
 | 
				
			||||||
	   by calling the "end" function for the message */
 | 
						   by calling the "end" function for the message */
 | 
				
			||||||
	   
 | 
					
 | 
				
			||||||
	cw_check_missing_mand(message,mand_found);
 | 
						cw_check_missing_mand(message, mand_found);
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	cw_dbg(DBG_MSG_PARSING," *** Done parsing message of type %d (%s) ***", 
 | 
						cw_dbg(DBG_MSG_PARSING, " *** Done parsing message of type %d (%s) ***",
 | 
				
			||||||
				message->type,message->name);
 | 
						       message->type, message->name);
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	mavl_destroy(mand_found);
 | 
						mavl_destroy(mand_found);
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
/*	cw_dbg_ktv_dump(conn->remote_cfg,DBG_CFG_DMP,
 | 
					/*	cw_dbg_ktv_dump(conn->remote_cfg,DBG_CFG_DMP,
 | 
				
			||||||
		" *** Remote CFG dump ***", "CFG:", " *** End of remote CFG dump");
 | 
							" *** Remote CFG dump ***", "CFG:", " *** End of remote CFG dump");
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (message->postprocess){
 | 
						if (message->postprocess) {
 | 
				
			||||||
		message->postprocess(conn);
 | 
							message->postprocess(conn);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -455,12 +420,13 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			cw_send_error_response(conn, rawmsg, result_code);
 | 
								cw_send_error_response(conn, rawmsg, result_code);
 | 
				
			||||||
		} else if (result_code == 0) {
 | 
							} else if (result_code == 0) {
 | 
				
			||||||
			cw_ktv_set_dword(conn->local_cfg,"result-code",result_code);
 | 
								cw_ktv_set_dword(conn->local_cfg, "result-code",
 | 
				
			||||||
			if (ui->next){
 | 
										 result_code);
 | 
				
			||||||
 | 
								if (ui->next) {
 | 
				
			||||||
				conn->capwap_prevstate = conn->capwap_state;
 | 
									conn->capwap_prevstate = conn->capwap_state;
 | 
				
			||||||
				conn->capwap_state = ui->next;
 | 
									conn->capwap_state = ui->next;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
				
 | 
					
 | 
				
			||||||
			/* All is ok, send regular response message */
 | 
								/* All is ok, send regular response message */
 | 
				
			||||||
			cw_send_response(conn, rawmsg, len);
 | 
								cw_send_response(conn, rawmsg, len);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
@ -475,7 +441,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
 | 
				
			|||||||
		 */
 | 
							 */
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*stravltree_destroy(conn->mand);*/
 | 
						/*stravltree_destroy(conn->mand); */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return result_code;
 | 
						return result_code;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -491,7 +457,7 @@ int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
						char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
				
			||||||
	uint8_t seqnum;
 | 
						uint8_t seqnum;
 | 
				
			||||||
	int s1,s2,sd;
 | 
						int s1, s2, sd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint8_t *msgptr = rawmsg + cw_get_hdr_msg_offset(rawmsg);
 | 
						uint8_t *msgptr = rawmsg + cw_get_hdr_msg_offset(rawmsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -522,7 +488,7 @@ int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen,
 | 
				
			|||||||
	if (sd != 0) {
 | 
						if (sd != 0) {
 | 
				
			||||||
		cw_dbg(DBG_MSG_ERR,
 | 
							cw_dbg(DBG_MSG_ERR,
 | 
				
			||||||
		       "Discarding message from %s, old seqnum, seqnum = %d, last seqnum=%d",
 | 
							       "Discarding message from %s, old seqnum, seqnum = %d, last seqnum=%d",
 | 
				
			||||||
		       sock_addr2str(&conn->addr,sock_buf), s2, s1);
 | 
							       sock_addr2str(&conn->addr, sock_buf), s2, s1);
 | 
				
			||||||
		errno = EAGAIN;
 | 
							errno = EAGAIN;
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -533,7 +499,7 @@ int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	cw_dbg(DBG_MSG_ERR,
 | 
						cw_dbg(DBG_MSG_ERR,
 | 
				
			||||||
	       "Retransmitted request message from %s detected, seqnum=%d, type=%d",
 | 
						       "Retransmitted request message from %s detected, seqnum=%d, type=%d",
 | 
				
			||||||
	       sock_addr2str(&conn->addr,sock_buf), s2, type);
 | 
						       sock_addr2str(&conn->addr, sock_buf), s2, type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (cw_get_hdr_msg_type(conn->resp_buffer) - 1 != type) {
 | 
						if (cw_get_hdr_msg_type(conn->resp_buffer) - 1 != type) {
 | 
				
			||||||
@ -547,7 +513,7 @@ int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen,
 | 
				
			|||||||
	cw_dbg(DBG_MSG_ERR, "Retransmitting response message to %s, seqnum=%d",
 | 
						cw_dbg(DBG_MSG_ERR, "Retransmitting response message to %s, seqnum=%d",
 | 
				
			||||||
	       sock_addr2str(&conn->addr, sock_buf), s2);
 | 
						       sock_addr2str(&conn->addr, sock_buf), s2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*// XXX untested*/
 | 
						/*// XXX untested */
 | 
				
			||||||
	conn_send_msg(conn, conn->resp_buffer);
 | 
						conn_send_msg(conn, conn->resp_buffer);
 | 
				
			||||||
	errno = EAGAIN;
 | 
						errno = EAGAIN;
 | 
				
			||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
@ -561,13 +527,13 @@ int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen,
 | 
				
			|||||||
 * @param len lenght of packet data
 | 
					 * @param len lenght of packet data
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
 | 
					int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
 | 
				
			||||||
			struct sockaddr *from)
 | 
								 struct sockaddr *from)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
						char sock_buf[SOCK_ADDR_BUFSIZE];
 | 
				
			||||||
	int preamble;
 | 
						int preamble;
 | 
				
			||||||
	int offs;
 | 
						int offs;
 | 
				
			||||||
	int payloadlen;
 | 
						int payloadlen;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	if (len < 8) {
 | 
						if (len < 8) {
 | 
				
			||||||
		/* packet too short */
 | 
							/* packet too short */
 | 
				
			||||||
		cw_dbg(DBG_PKT_ERR,
 | 
							cw_dbg(DBG_PKT_ERR,
 | 
				
			||||||
@ -583,8 +549,8 @@ int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
 | 
				
			|||||||
		/* wrong version */
 | 
							/* wrong version */
 | 
				
			||||||
		cw_dbg(DBG_PKT_ERR,
 | 
							cw_dbg(DBG_PKT_ERR,
 | 
				
			||||||
		       "Discarding packet from %s, wrong version, version=%d, version %d expected.",
 | 
							       "Discarding packet from %s, wrong version, version=%d, version %d expected.",
 | 
				
			||||||
		       sock_addr2str(&conn->addr,sock_buf), (preamble & 0xf0) >> 4,
 | 
							       sock_addr2str(&conn->addr, sock_buf),
 | 
				
			||||||
		       CAPWAP_VERSION);
 | 
							       (preamble & 0xf0) >> 4, CAPWAP_VERSION);
 | 
				
			||||||
		errno = EAGAIN;
 | 
							errno = EAGAIN;
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -593,7 +559,7 @@ int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
 | 
				
			|||||||
		/* Encrypted data, this shuold never happen here */
 | 
							/* Encrypted data, this shuold never happen here */
 | 
				
			||||||
		cw_dbg(DBG_PKT_ERR,
 | 
							cw_dbg(DBG_PKT_ERR,
 | 
				
			||||||
		       "Discarding packet from %s, encrypted data after decryption ...",
 | 
							       "Discarding packet from %s, encrypted data after decryption ...",
 | 
				
			||||||
		       sock_addr2str(&conn->addr,sock_buf));
 | 
							       sock_addr2str(&conn->addr, sock_buf));
 | 
				
			||||||
		errno = EAGAIN;
 | 
							errno = EAGAIN;
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -607,7 +573,7 @@ int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
 | 
				
			|||||||
		/* Eleminate messages with wrong header size */
 | 
							/* Eleminate messages with wrong header size */
 | 
				
			||||||
		cw_dbg(DBG_PKT_ERR,
 | 
							cw_dbg(DBG_PKT_ERR,
 | 
				
			||||||
		       "Discarding packet from %s, header length (%d) greater than packet len (%d).",
 | 
							       "Discarding packet from %s, header length (%d) greater than packet len (%d).",
 | 
				
			||||||
		       sock_addr2str(&conn->addr,sock_buf), offs, len);
 | 
							       sock_addr2str(&conn->addr, sock_buf), offs, len);
 | 
				
			||||||
		errno = EAGAIN;
 | 
							errno = EAGAIN;
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -619,7 +585,8 @@ int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
 | 
				
			|||||||
			/* wrong rmac size */
 | 
								/* wrong rmac size */
 | 
				
			||||||
			cw_dbg(DBG_PKT_ERR,
 | 
								cw_dbg(DBG_PKT_ERR,
 | 
				
			||||||
			       "Discarding packet from %s, wrong R-MAC size, size=%d",
 | 
								       "Discarding packet from %s, wrong R-MAC size, size=%d",
 | 
				
			||||||
			       sock_addr2str(&conn->addr,sock_buf), *(packet + 8));
 | 
								       sock_addr2str(&conn->addr, sock_buf),
 | 
				
			||||||
 | 
								       *(packet + 8));
 | 
				
			||||||
			errno = EAGAIN;
 | 
								errno = EAGAIN;
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -631,7 +598,7 @@ int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
 | 
				
			|||||||
		/* fragmented, add the packet to fragman */
 | 
							/* fragmented, add the packet to fragman */
 | 
				
			||||||
		uint8_t *f;
 | 
							uint8_t *f;
 | 
				
			||||||
		int rc;
 | 
							int rc;
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
		f = fragman_add(conn->fragman, packet, offs, payloadlen);
 | 
							f = fragman_add(conn->fragman, packet, offs, payloadlen);
 | 
				
			||||||
		if (f == NULL) {
 | 
							if (f == NULL) {
 | 
				
			||||||
			errno = EAGAIN;
 | 
								errno = EAGAIN;
 | 
				
			||||||
@ -656,22 +623,24 @@ int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int conn_process_packet(struct conn *conn, uint8_t * packet, int len,
 | 
					int conn_process_packet(struct conn *conn, uint8_t * packet, int len,
 | 
				
			||||||
			struct sockaddr *from){
 | 
								struct sockaddr *from)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* show this packet in debug output */
 | 
						/* show this packet in debug output */
 | 
				
			||||||
	cw_dbg_pkt(DBG_PKT_IN, conn, packet, len, from);
 | 
						cw_dbg_pkt(DBG_PKT_IN, conn, packet, len, from);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return conn_process_packet2(conn,packet,len,from);
 | 
						return conn_process_packet2(conn, packet, len, from);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int conn_process_data_packet(struct conn *conn, uint8_t * packet, int len,
 | 
					int conn_process_data_packet(struct conn *conn, uint8_t * packet, int len,
 | 
				
			||||||
			struct sockaddr *from){
 | 
								     struct sockaddr *from)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* show this packet in debug output */
 | 
						/* show this packet in debug output */
 | 
				
			||||||
	cw_dbg_pkt(DBG_PKT_IN, conn, packet, len, from);
 | 
						cw_dbg_pkt(DBG_PKT_IN, conn, packet, len, from);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return conn_process_packet2(conn,packet,len,from);
 | 
						return conn_process_packet2(conn, packet, len, from);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -705,4 +674,3 @@ int cw_read_messages(struct conn *conn)
 | 
				
			|||||||
	errno = EAGAIN;
 | 
						errno = EAGAIN;
 | 
				
			||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,7 @@ int cw_decode_element(struct cw_ElemHandlerParams *params, int proto,
 | 
				
			|||||||
	struct cw_ElemData *elem_data, elem_data_search;
 | 
						struct cw_ElemData *elem_data, elem_data_search;
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	params->elem = NULL;
 | 
						//params->elem = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* try to retrieve a handler for this message element */
 | 
						/* try to retrieve a handler for this message element */
 | 
				
			||||||
	handler =
 | 
						handler =
 | 
				
			||||||
@ -66,7 +66,7 @@ int cw_decode_element(struct cw_ElemHandlerParams *params, int proto,
 | 
				
			|||||||
		return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
 | 
							return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printf ("USING HANDLERi TO DECODE: %d %s\n",handler->id,handler->name);
 | 
						printf ("USING HANDLER TO DECODE: %d %s\n",handler->id,handler->name);
 | 
				
			||||||
	rc = handler->get(handler, params, data, len);
 | 
						rc = handler->get(handler, params, data, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,6 @@ int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams *
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	result = cw_ktv_add(params->remote_cfg, handler->key, 
 | 
						result = cw_ktv_add(params->remote_cfg, handler->key, 
 | 
				
			||||||
				handler->type,NULL, elem_data,elem_len);
 | 
									handler->type,NULL, elem_data,elem_len);
 | 
				
			||||||
	params->elem=result;
 | 
					//	params->elem=result;
 | 
				
			||||||
	return CAPWAP_RESULT_SUCCESS;
 | 
						return CAPWAP_RESULT_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@ int cw_in_idx_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerPara
 | 
				
			|||||||
	result = cw_ktv_add(params->remote_cfg, key, 
 | 
						result = cw_ktv_add(params->remote_cfg, key, 
 | 
				
			||||||
				handler->type, NULL, elem_data+1,elem_len-1);
 | 
									handler->type, NULL, elem_data+1,elem_len-1);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	params->elem=result;
 | 
					//	params->elem=result;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return CAPWAP_RESULT_SUCCESS;	
 | 
						return CAPWAP_RESULT_SUCCESS;	
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -20,7 +20,7 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo
 | 
				
			|||||||
	struct cw_ElemData * elem_data, elem_data_search;
 | 
						struct cw_ElemData * elem_data, elem_data_search;
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	params->elem=NULL;
 | 
					//	params->elem=NULL;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	/* try to retrieve a handler for this message element */
 | 
						/* try to retrieve a handler for this message element */
 | 
				
			||||||
	handler = cw_msgset_get_elemhandler(params->msgset,proto, vendor, elem_id);
 | 
						handler = cw_msgset_get_elemhandler(params->msgset,proto, vendor, elem_id);
 | 
				
			||||||
 | 
				
			|||||||
@ -44,7 +44,8 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
 | 
				
			|||||||
	struct cw_MsgData * msg;
 | 
						struct cw_MsgData * msg;
 | 
				
			||||||
	struct mlistelem * elem;
 | 
						struct mlistelem * elem;
 | 
				
			||||||
	int len,l;
 | 
						int len,l;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
 | 
					printf("Hello msg\n");	
 | 
				
			||||||
	cw_dbg(DBG_INFO, "Number of elements in ktv: %d",conn->local_cfg->count);
 | 
						cw_dbg(DBG_INFO, "Number of elements in ktv: %d",conn->local_cfg->count);
 | 
				
			||||||
/*	cw_dbg_ktv_dump(conn->local_cfg,DBG_CFG_DMP,"Local CFG","LOCAL:","End Local CFG");*/
 | 
					/*	cw_dbg_ktv_dump(conn->local_cfg,DBG_CFG_DMP,"Local CFG","LOCAL:","End Local CFG");*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -104,7 +105,7 @@ printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		params.elemdata = data;
 | 
							params.elemdata = data;
 | 
				
			||||||
		params.elem=NULL;
 | 
					//		params.elem=NULL;
 | 
				
			||||||
		params.msgdata=msg;
 | 
							params.msgdata=msg;
 | 
				
			||||||
		params.debug_details=details;
 | 
							params.debug_details=details;
 | 
				
			||||||
		*details=0;
 | 
							*details=0;
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,7 @@ int cw_in_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerPa
 | 
				
			|||||||
	result = cw_ktv_add(params->remote_cfg, key, 
 | 
						result = cw_ktv_add(params->remote_cfg, key, 
 | 
				
			||||||
				handler->type, NULL, elem_data+1,elem_len-1);
 | 
									handler->type, NULL, elem_data+1,elem_len-1);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	params->elem=result;
 | 
					//	params->elem=result;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return CAPWAP_RESULT_SUCCESS;	
 | 
						return CAPWAP_RESULT_SUCCESS;	
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,22 +1,24 @@
 | 
				
			|||||||
#include "cw.h"
 | 
					#include "cw.h"
 | 
				
			||||||
 | 
					#include "cfg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int get_psk(struct conn * conn,const char * username, uint8_t **psk, unsigned int *len)
 | 
					static int get_psk(struct conn *conn, const char *username, uint8_t ** psk,
 | 
				
			||||||
 | 
							   unsigned int *len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char key[CW_KTV_MAX_KEY_LEN];
 | 
						char key[CW_KTV_MAX_KEY_LEN];
 | 
				
			||||||
	cw_Val_t * result;
 | 
						cw_Val_t *result;
 | 
				
			||||||
	sprintf(key,"%s/%s","psk",username);
 | 
						sprintf(key, "%s/%s", "psk", username);
 | 
				
			||||||
	result = cw_ktv_get(conn->local_cfg,key,CW_TYPE_BSTR16);
 | 
						result = cw_ktv_get(conn->local_cfg, key, CW_TYPE_BSTR16);
 | 
				
			||||||
	if (result == NULL){
 | 
						if (result == NULL) {
 | 
				
			||||||
		if (conn->dtls_psk != NULL){
 | 
							if (conn->dtls_psk != NULL) {
 | 
				
			||||||
			*psk = bstr16_data(conn->dtls_psk);
 | 
								*psk = bstr16_data(conn->dtls_psk);
 | 
				
			||||||
			*len = bstr16_len(conn->dtls_psk);
 | 
								*len = bstr16_len(conn->dtls_psk);
 | 
				
			||||||
			return 1;
 | 
								return 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		
 | 
					
 | 
				
			||||||
	if (result == NULL)
 | 
						if (result == NULL)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	*psk = result->type->data(result);
 | 
						*psk = result->type->data(result);
 | 
				
			||||||
@ -33,46 +35,47 @@ static int get_psk(struct conn * conn,const char * username, uint8_t **psk, unsi
 | 
				
			|||||||
 * @param default_cipher
 | 
					 * @param default_cipher
 | 
				
			||||||
 * @return 
 | 
					 * @return 
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int cw_setup_dtls(struct conn * conn, mavl_t cfg, const char *prefix, char  * default_cipher)
 | 
					int cw_setup_dtls(struct conn *conn, mavl_t cfg, const char *prefix,
 | 
				
			||||||
 | 
							  char *default_cipher)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char key[CW_KTV_MAX_KEY_LEN];
 | 
						char key[CW_KTV_MAX_KEY_LEN];
 | 
				
			||||||
	char *ssl_cert,*ssl_key;
 | 
						char *ssl_cert, *ssl_key;
 | 
				
			||||||
	uint8_t security;
 | 
						uint8_t security;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	security = 0;
 | 
						security = 0;
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	sprintf(key,"%s/%s",prefix,"ssl-cipher");
 | 
						sprintf(key, "%s/%s", prefix, "ssl-cipher");
 | 
				
			||||||
	conn->dtls_cipher = cw_ktv_get_str(cfg,key, default_cipher);
 | 
						conn->dtls_cipher = cw_cfg_get(cfg, key, default_cipher);
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	sprintf(key,"%s/%s",prefix,"ssl-psk");
 | 
						sprintf(key, "%s/%s", prefix, "ssl-psk");
 | 
				
			||||||
	conn->dtls_psk  = cw_ktv_get_bstr16(cfg,key,NULL);
 | 
						conn->dtls_psk = cw_cfg_get(cfg, key, NULL);
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	sprintf(key,"%s/%s",prefix,"ssl-psk-enable");
 | 
						sprintf(key, "%s/%s", prefix, "ssl-psk-enable");
 | 
				
			||||||
	conn->dtls_psk_enable = cw_ktv_get_bool(cfg,key,0);
 | 
						conn->dtls_psk_enable = cw_cfg_get_bool(cfg, key, "flase");
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	if (conn->dtls_psk_enable ){
 | 
						if (conn->dtls_psk_enable) {
 | 
				
			||||||
		security |= CAPWAP_FLAG_AC_SECURITY_S;
 | 
							security |= CAPWAP_FLAG_AC_SECURITY_S;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(key,"%s/%s",prefix,"ssl-certfile");
 | 
					
 | 
				
			||||||
	ssl_cert = cw_ktv_get_str(conn->local_cfg,key,NULL);
 | 
					
 | 
				
			||||||
	sprintf(key,"%s/%s",prefix,"ssl-keyfile");
 | 
						sprintf(key, "%s/%s", prefix, "ssl-certfile");
 | 
				
			||||||
	ssl_key = cw_ktv_get_str(conn->local_cfg,key,NULL);
 | 
						ssl_cert = cw_cfg_get(conn->local_cfg, key, NULL);
 | 
				
			||||||
	
 | 
						sprintf(key, "%s/%s", prefix, "ssl-keyfile");
 | 
				
			||||||
	if (ssl_cert != NULL && ssl_key != NULL){
 | 
						ssl_key = cw_cfg_get(conn->local_cfg, key, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (ssl_cert != NULL && ssl_key != NULL) {
 | 
				
			||||||
		conn->dtls_cert_file = ssl_cert;
 | 
							conn->dtls_cert_file = ssl_cert;
 | 
				
			||||||
		conn->dtls_key_file = ssl_key;
 | 
							conn->dtls_key_file = ssl_key;
 | 
				
			||||||
		sprintf(key,"%s/%s",prefix,"ssl-keypass");
 | 
							sprintf(key, "%s/%s", prefix, "ssl-keypass");
 | 
				
			||||||
		conn->dtls_key_pass = cw_ktv_get_str(cfg,key,NULL);
 | 
							conn->dtls_key_pass = cw_cfg_get(cfg, key, NULL);
 | 
				
			||||||
		security |= CAPWAP_FLAG_AC_SECURITY_X;
 | 
							security |= CAPWAP_FLAG_AC_SECURITY_X;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sprintf(key,"%s/%s",prefix,"ssl-dhbits");
 | 
						sprintf(key, "%s/%s", prefix, "ssl-dhbits");
 | 
				
			||||||
	conn->dtls_dhbits = cw_ktv_get_word(cfg,key,1024);
 | 
						conn->dtls_dhbits = cw_cfg_get_word(cfg, key, "1024");
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	conn->dtls_get_psk = get_psk;
 | 
						conn->dtls_get_psk = get_psk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return security;
 | 
						return security;
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@
 | 
				
			|||||||
#include "mavl.h"
 | 
					#include "mavl.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "val.h"
 | 
					#include "val.h"
 | 
				
			||||||
 | 
					#include "cfg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct cw_ElemDef{
 | 
					struct cw_ElemDef{
 | 
				
			||||||
	int proto;
 | 
						int proto;
 | 
				
			||||||
@ -29,8 +29,9 @@ struct cw_ElemHandlerParams {
 | 
				
			|||||||
	struct cw_ElemData * elemdata;
 | 
						struct cw_ElemData * elemdata;
 | 
				
			||||||
	struct sockaddr *from;
 | 
						struct sockaddr *from;
 | 
				
			||||||
	mavl_t mand_found;
 | 
						mavl_t mand_found;
 | 
				
			||||||
	cw_Val_t * elem;
 | 
					//	cw_Val_t * elem;
 | 
				
			||||||
	char * debug_details;
 | 
						char * debug_details;
 | 
				
			||||||
 | 
						cw_Cfg_t * cfg;
 | 
				
			||||||
	mavl_t remote_cfg;
 | 
						mavl_t remote_cfg;
 | 
				
			||||||
	mavl_t local_cfg;
 | 
						mavl_t local_cfg;
 | 
				
			||||||
	mavl_t default_cfg;
 | 
						mavl_t default_cfg;
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@
 | 
				
			|||||||
#include "cw/log.h"
 | 
					#include "cw/log.h"
 | 
				
			||||||
#include "cw/dbg.h"
 | 
					#include "cw/dbg.h"
 | 
				
			||||||
#include "cw/dtls.h"
 | 
					#include "cw/dtls.h"
 | 
				
			||||||
 | 
					#include "cw/cfg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*#include "mod_cisco.h"*/
 | 
					/*#include "mod_cisco.h"*/
 | 
				
			||||||
@ -228,7 +229,7 @@ int static setup_cfg(struct conn  * conn)
 | 
				
			|||||||
	conn->header_len=header_len;
 | 
						conn->header_len=header_len;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	security = cw_setup_dtls(conn,conn->local_cfg,"cisco",CAPWAP_CIPHER);
 | 
						security = cw_setup_dtls(conn,conn->local_cfg,"cisco",CAPWAP_CIPHER);
 | 
				
			||||||
	cw_ktv_set_byte(conn->local_cfg,"ac-descriptor/security",security);
 | 
						cw_cfg_set_int(conn->local_cfg,"ac-descriptor/security",security);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if (conn->default_cfg==NULL){
 | 
						if (conn->default_cfg==NULL){
 | 
				
			||||||
		conn->default_cfg=cw_ktv_create();
 | 
							conn->default_cfg=cw_ktv_create();
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user