Removed cw_ElemHandlerParams.elem
This commit is contained in:
parent
8aa11dccba
commit
d2240646f9
@ -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) {
|
||||||
|
236
src/ac/wtpman.c
236
src/ac/wtpman.c
@ -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,15 +97,18 @@ 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,14 +147,17 @@ 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)
|
||||||
@ -158,9 +165,9 @@ static int wtpman_join(void *arg)
|
|||||||
|
|
||||||
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;
|
||||||
@ -328,7 +339,7 @@ static void * wtpman_main(void *arg)
|
|||||||
|
|
||||||
/* 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,7 +348,7 @@ 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;
|
||||||
}
|
}
|
||||||
@ -350,28 +361,28 @@ static void * wtpman_main(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*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;
|
||||||
|
|
||||||
|
|
||||||
@ -380,19 +391,21 @@ static void * wtpman_main(void *arg)
|
|||||||
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));
|
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,
|
||||||
mavl_merge(conn->remote_cfg,conn->update_cfg);
|
CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
|
||||||
|
mavl_merge(conn->remote_cfg, conn->update_cfg);
|
||||||
|
|
||||||
conn->update_cfg=NULL;
|
conn->update_cfg = NULL;
|
||||||
conn->local_cfg=tmp;
|
conn->local_cfg = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -404,7 +417,7 @@ 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;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -526,16 +541,19 @@ 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,7 +645,8 @@ 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;
|
||||||
@ -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,7 +675,7 @@ 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; */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -663,7 +687,7 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
|
|||||||
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;
|
||||||
@ -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
|
||||||
|
@ -135,9 +135,10 @@ 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);
|
||||||
@ -155,23 +156,26 @@ 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);
|
||||||
@ -179,7 +183,7 @@ static struct cw_MsgSet *load_msg_set(struct conn *conn, uint8_t * rawmsg, int l
|
|||||||
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,7 +277,8 @@ 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");
|
||||||
@ -278,7 +287,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,17 +299,17 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
|||||||
|
|
||||||
/* 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);
|
||||||
@ -308,9 +317,9 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
|||||||
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);
|
||||||
@ -353,87 +362,43 @@ 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;
|
cw_dbg(DBG_MSG_PARSING, "*** Parsing message of type %d - (%s) ***",
|
||||||
params.remote_cfg=conn->remote_cfg;
|
message->type, message->name);
|
||||||
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;
|
|
||||||
|
|
||||||
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){
|
cw_decode_elements(¶ms,elems_ptr, elems_len);
|
||||||
mlist_append(unrecognized,&elem);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc < 0 ){
|
exit(0);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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);
|
||||||
|
|
||||||
@ -442,7 +407,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
if (message->postprocess){
|
if (message->postprocess) {
|
||||||
message->postprocess(conn);
|
message->postprocess(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,8 +420,9 @@ 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;
|
||||||
}
|
}
|
||||||
@ -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,7 +527,7 @@ 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;
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
@ -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);
|
||||||
|
@ -45,6 +45,7 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
|
|||||||
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,15 +1,17 @@
|
|||||||
#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;
|
||||||
@ -33,45 +35,46 @@ 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");
|
sprintf(key, "%s/%s", prefix, "ssl-certfile");
|
||||||
ssl_cert = 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");
|
sprintf(key, "%s/%s", prefix, "ssl-keyfile");
|
||||||
ssl_key = cw_ktv_get_str(conn->local_cfg,key,NULL);
|
ssl_key = cw_cfg_get(conn->local_cfg, key, NULL);
|
||||||
|
|
||||||
if (ssl_cert != NULL && ssl_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;
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user