Removed cw_ElemHandlerParams.elem

This commit is contained in:
7u83 2022-08-09 09:52:30 +02:00
parent 8aa11dccba
commit d2240646f9
18 changed files with 364 additions and 361 deletions

View File

@ -1,3 +1,4 @@
.OBJDIR: ./
all: all:
$(MAKE) -C src/cw $(MAKE) -C src/cw

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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(&params,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(&params,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;
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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