Compare commits
No commits in common. "1703be929456d402370a19743e91ead27f99e286" and "8aa11dccbad04a8a9b1021a06b8047af08cf07b0" have entirely different histories.
1703be9294
...
8aa11dccba
@ -4,6 +4,8 @@
|
|||||||
#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,6 +105,7 @@ 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()
|
||||||
{
|
{
|
||||||
@ -168,7 +169,6 @@ 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,6 +180,7 @@ 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);
|
||||||
@ -480,7 +481,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, global_cfg);
|
wtpman = wtpman_create (index, addr, preamble & 0xf);
|
||||||
|
|
||||||
|
|
||||||
if (!wtpman) {
|
if (!wtpman) {
|
||||||
|
@ -146,7 +146,6 @@ static int init_ac_name(cw_Cfg_t * cfg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
free(primary_if);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(ac_name,"actube%s",acid);
|
sprintf(ac_name,"actube%s",acid);
|
||||||
|
@ -36,7 +36,7 @@ void wlan0_cmd(struct shelldata *sd, const char * cmd);
|
|||||||
void show_cfg (FILE *out, mavl_t ktv);
|
void show_cfg (FILE *out, mavl_t ktv);
|
||||||
void show_aps (FILE *out);
|
void show_aps (FILE *out);
|
||||||
|
|
||||||
struct cw_Conn * find_ap(const char *name);
|
struct conn * find_ap(const char *name);
|
||||||
|
|
||||||
struct command{
|
struct command{
|
||||||
char * cmd;
|
char * cmd;
|
||||||
@ -72,7 +72,7 @@ void list_cmd(struct shelldata *sd, const char *cmd)
|
|||||||
|
|
||||||
void cfg_cmd(struct shelldata *sd, const char *cmd)
|
void cfg_cmd(struct shelldata *sd, const char *cmd)
|
||||||
{
|
{
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
wtplist_lock();
|
wtplist_lock();
|
||||||
conn = find_ap(sd->prompt);
|
conn = find_ap(sd->prompt);
|
||||||
if (conn==NULL){
|
if (conn==NULL){
|
||||||
@ -86,7 +86,7 @@ void cfg_cmd(struct shelldata *sd, const char *cmd)
|
|||||||
|
|
||||||
void ucfg_cmd(struct shelldata *sd, const char *cmd)
|
void ucfg_cmd(struct shelldata *sd, const char *cmd)
|
||||||
{
|
{
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
show_cfg(sd->out,sd->update_cfg);
|
show_cfg(sd->out,sd->update_cfg);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -96,7 +96,7 @@ void ucfg_cmd(struct shelldata *sd, const char *cmd)
|
|||||||
void
|
void
|
||||||
send_cmd(struct shelldata * sd, const char *cmd)
|
send_cmd(struct shelldata * sd, const char *cmd)
|
||||||
{
|
{
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
wtplist_lock();
|
wtplist_lock();
|
||||||
conn = find_ap(sd->prompt);
|
conn = find_ap(sd->prompt);
|
||||||
if (conn==NULL){
|
if (conn==NULL){
|
||||||
@ -111,7 +111,7 @@ send_cmd(struct shelldata * sd, const char *cmd)
|
|||||||
void
|
void
|
||||||
wlan0_cmd(struct shelldata * sd, const char *cmd)
|
wlan0_cmd(struct shelldata * sd, const char *cmd)
|
||||||
{
|
{
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
wtplist_lock();
|
wtplist_lock();
|
||||||
conn = find_ap(sd->prompt);
|
conn = find_ap(sd->prompt);
|
||||||
if (conn==NULL){
|
if (conn==NULL){
|
||||||
@ -129,7 +129,7 @@ wlan0_cmd(struct shelldata * sd, const char *cmd)
|
|||||||
|
|
||||||
void set_cmd(struct shelldata *sd, const char *str)
|
void set_cmd(struct shelldata *sd, const char *str)
|
||||||
{
|
{
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
struct cw_Val_Reader r;
|
struct cw_Val_Reader r;
|
||||||
char key[CW_KTV_MAX_KEY_LEN];
|
char key[CW_KTV_MAX_KEY_LEN];
|
||||||
char type[CW_KTV_MAX_KEY_LEN];
|
char type[CW_KTV_MAX_KEY_LEN];
|
||||||
@ -189,7 +189,7 @@ void show_aps (FILE *out)
|
|||||||
cw_Val_t * result;
|
cw_Val_t * result;
|
||||||
char addr[SOCK_ADDR_BUFSIZE];
|
char addr[SOCK_ADDR_BUFSIZE];
|
||||||
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
|
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
conn = mavliter_get_ptr (&it);
|
conn = mavliter_get_ptr (&it);
|
||||||
|
|
||||||
sock_addr2str_p (&conn->addr, addr);
|
sock_addr2str_p (&conn->addr, addr);
|
||||||
@ -211,7 +211,7 @@ void show_aps (FILE *out)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct cw_Conn * find_ap(const char *name)
|
struct conn * find_ap(const char *name)
|
||||||
{
|
{
|
||||||
struct connlist * cl;
|
struct connlist * cl;
|
||||||
mavliter_t it;
|
mavliter_t it;
|
||||||
@ -224,7 +224,7 @@ struct cw_Conn * find_ap(const char *name)
|
|||||||
mavliter_foreach (&it) {
|
mavliter_foreach (&it) {
|
||||||
cw_Val_t * result;
|
cw_Val_t * result;
|
||||||
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
|
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
conn = mavliter_get_ptr (&it);
|
conn = mavliter_get_ptr (&it);
|
||||||
|
|
||||||
result = cw_ktv_get (conn->remote_cfg, "wtp-name", NULL);
|
result = cw_ktv_get (conn->remote_cfg, "wtp-name", NULL);
|
||||||
@ -266,7 +266,7 @@ void con (FILE *out)
|
|||||||
cw_Val_t * result;
|
cw_Val_t * result;
|
||||||
char addr[SOCK_ADDR_BUFSIZE];
|
char addr[SOCK_ADDR_BUFSIZE];
|
||||||
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
|
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
conn = mavliter_get_ptr (&it);
|
conn = mavliter_get_ptr (&it);
|
||||||
|
|
||||||
sock_addr2str_p (&conn->addr, addr);
|
sock_addr2str_p (&conn->addr, addr);
|
||||||
|
@ -71,7 +71,7 @@ void wtplist_destroy()
|
|||||||
struct wtpman * wtplist_get(const struct sockaddr * addr)
|
struct wtpman * wtplist_get(const struct sockaddr * addr)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct cw_Conn * conn = connlist_get(connlist,addr);
|
struct conn * conn = connlist_get(connlist,addr);
|
||||||
if (!conn)
|
if (!conn)
|
||||||
return 0;
|
return 0;
|
||||||
return conn->data;
|
return conn->data;
|
||||||
@ -80,8 +80,8 @@ struct wtpman * wtplist_get(const struct sockaddr * addr)
|
|||||||
|
|
||||||
struct wtpman * wtplist_get_by_session_id(bstr16_t *session_id)
|
struct wtpman * wtplist_get_by_session_id(bstr16_t *session_id)
|
||||||
{
|
{
|
||||||
struct cw_Conn search;
|
struct conn search;
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
|
|
||||||
search.session_id = session_id;
|
search.session_id = session_id;
|
||||||
/*memcpy (search.session_id, session_id,16);*/
|
/*memcpy (search.session_id, session_id,16);*/
|
||||||
|
208
src/ac/wtpman.c
208
src/ac/wtpman.c
@ -63,8 +63,8 @@ static void reset_echointerval_timer(struct wtpman *wtpman)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int msg_start_handler(struct cw_Conn *conn, struct cw_action_in *a,
|
static int msg_start_handler(struct conn *conn, struct cw_action_in *a, uint8_t * data,
|
||||||
uint8_t * data, int len, struct sockaddr *from)
|
int len, struct sockaddr *from)
|
||||||
{
|
{
|
||||||
struct wtpman *wtpman = conn->data;
|
struct wtpman *wtpman = conn->data;
|
||||||
reset_echointerval_timer(wtpman);
|
reset_echointerval_timer(wtpman);
|
||||||
@ -97,18 +97,15 @@ 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->cmod->name,wtpman->conn->bmod->name);
|
||||||
wtpman->conn->bmod->name);
|
|
||||||
|
|
||||||
wtplist_lock();
|
wtplist_lock();
|
||||||
discovery_cache_add(discovery_cache,
|
discovery_cache_add(discovery_cache,(struct sockaddr*)&wtpman->conn->addr,
|
||||||
(struct sockaddr *) &wtpman->conn->
|
wtpman->conn->cmod,wtpman->conn->bmod);
|
||||||
addr, wtpman->conn->cmod,
|
|
||||||
wtpman->conn->bmod);
|
|
||||||
wtplist_unlock();
|
wtplist_unlock();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -127,13 +124,12 @@ 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),
|
sock_addr2str_p(&wtpman->conn->addr,sock_buf), dtls_get_cipher(wtpman->conn,cipherstr));
|
||||||
dtls_get_cipher(wtpman->conn, cipherstr));
|
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -144,20 +140,17 @@ static int wtpman_join(void *arg)
|
|||||||
int rc;
|
int rc;
|
||||||
char sock_buf[SOCK_ADDR_BUFSIZE];
|
char sock_buf[SOCK_ADDR_BUFSIZE];
|
||||||
struct wtpman *wtpman = (struct wtpman *) arg;
|
struct wtpman *wtpman = (struct wtpman *) arg;
|
||||||
struct cw_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",
|
cw_dbg(DBG_INFO, "Join State - %s", sock_addr2str(&conn->addr,sock_buf));
|
||||||
sock_addr2str(&conn->addr, sock_buf));
|
|
||||||
|
|
||||||
wait_join =
|
wait_join = cw_ktv_get_word(conn->global_cfg,"wait-join",CAPWAP_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)
|
while (!cw_timer_timeout(timer) && wtpman->conn->capwap_state == CAPWAP_STATE_JOIN) {
|
||||||
&& 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)
|
||||||
@ -165,9 +158,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) {
|
||||||
@ -177,9 +170,8 @@ 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,
|
cw_dbg(DBG_MSG_ERR, "No join request from %s after %d seconds, WTP died.",
|
||||||
"No join request from %s after %d seconds, WTP died.",
|
sock_addr2str(&wtpman->conn->addr,sock_buf), wait_join);
|
||||||
sock_addr2str(&wtpman->conn->addr, sock_buf), wait_join);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -193,7 +185,7 @@ static int wtpman_join(void *arg)
|
|||||||
static void wtpman_image_data(struct wtpman *wtpman)
|
static void wtpman_image_data(struct wtpman *wtpman)
|
||||||
{
|
{
|
||||||
/* char sock_buf[SOCK_ADDR_BUFSIZE];
|
/* char sock_buf[SOCK_ADDR_BUFSIZE];
|
||||||
struct cw_Conn *conn = wtpman->conn;
|
struct conn *conn = wtpman->conn;
|
||||||
|
|
||||||
// Image upload
|
// Image upload
|
||||||
const char *filename = mbag_get_str(conn->outgoing, CW_ITEM_IMAGE_FILENAME, NULL);
|
const char *filename = mbag_get_str(conn->outgoing, CW_ITEM_IMAGE_FILENAME, NULL);
|
||||||
@ -249,13 +241,13 @@ 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;
|
||||||
/*
|
/*
|
||||||
struct wtpman *wtpman = (struct wtpman *) wtpman_arg;
|
struct wtpman *wtpman = (struct wtpman *) wtpman_arg;
|
||||||
struct cw_Conn *conn = wtpman->conn;
|
struct conn *conn = wtpman->conn;
|
||||||
|
|
||||||
|
|
||||||
uint8_t data[1001];
|
uint8_t data[1001];
|
||||||
@ -271,47 +263,44 @@ void *wtpman_run_data(void *wtpman_arg)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int cw_run_state_machine(struct cw_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 =
|
timerval = cw_ktv_get_word(conn->local_cfg,result->timer_key,result->timer_default);
|
||||||
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.",
|
cw_dbg(DBG_STATE,"Starting timer: [%s] - %d seconds.",result->timer_key,timerval);
|
||||||
result->timer_key, timerval);
|
|
||||||
}
|
}
|
||||||
return result->retval;
|
return result->retval;
|
||||||
}
|
}
|
||||||
@ -320,13 +309,13 @@ int cw_run_state_machine(struct cw_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 cw_Conn *conn;
|
struct conn *conn;
|
||||||
int last_state;
|
int last_state;
|
||||||
|
|
||||||
struct wtpman *wtpman = (struct wtpman *) arg;
|
struct wtpman *wtpman = (struct wtpman *) arg;
|
||||||
@ -339,7 +328,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;
|
||||||
@ -348,7 +337,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;
|
||||||
}
|
}
|
||||||
@ -362,27 +351,27 @@ 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;
|
||||||
|
|
||||||
|
|
||||||
@ -391,21 +380,19 @@ 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",
|
cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf));
|
||||||
sock_addr2str(&conn->addr, sock_buf));
|
|
||||||
|
|
||||||
rc = cw_send_request(conn,
|
rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
|
||||||
CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
|
mavl_merge(conn->remote_cfg,conn->update_cfg);
|
||||||
mavl_merge(conn->remote_cfg, conn->update_cfg);
|
|
||||||
|
|
||||||
conn->update_cfg = NULL;
|
conn->update_cfg=NULL;
|
||||||
conn->local_cfg = tmp;
|
conn->local_cfg=tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -417,7 +404,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;
|
||||||
}
|
}
|
||||||
@ -456,11 +443,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");
|
||||||
@ -482,9 +469,7 @@ static void *wtpman_main(void *arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cw_dbg_ktv_dump(conn->remote_cfg, DBG_INFO,
|
cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP","---------end dump --------");
|
||||||
"-------------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));
|
||||||
@ -509,7 +494,7 @@ static void *wtpman_main(void *arg)
|
|||||||
// 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);
|
||||||
|
|
||||||
@ -523,12 +508,12 @@ static void *wtpman_main(void *arg)
|
|||||||
|
|
||||||
/*// 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;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -541,19 +526,16 @@ static void *wtpman_main(void *arg)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
r = db_get_update_tasks(conn,
|
r = db_get_update_tasks(conn, sock_addr2str(&conn->addr,sock_buf));
|
||||||
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",
|
cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf));
|
||||||
sock_addr2str(&conn->addr, sock_buf));
|
|
||||||
|
|
||||||
rc = cw_send_request(conn,
|
rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
|
||||||
CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// mavl_merge(conn->config, conn->outgoing);
|
// mavl_merge(conn->config, conn->outgoing);
|
||||||
@ -565,18 +547,15 @@ static void *wtpman_main(void *arg)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
r = db_get_radio_tasks(conn,
|
r = db_get_radio_tasks(conn, sock_addr2str(&conn->addr,sock_buf));
|
||||||
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",
|
cw_dbg(DBG_INFO, "Updating Radios for %s",sock_addr2str(&conn->addr,sock_buf));
|
||||||
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);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// conn_clear_upd(conn,1);
|
// conn_clear_upd(conn,1);
|
||||||
@ -602,7 +581,7 @@ static void *wtpman_main(void *arg)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
@ -617,9 +596,8 @@ 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,
|
cw_dbg(DBG_DTLS, "Dropping connection from %s to non-unicast socket.",
|
||||||
"Dropping connection from %s to non-unicast socket.",
|
sock_addr2str_p(&wtpman->conn->addr,sock_buf));
|
||||||
sock_addr2str_p(&wtpman->conn->addr, sock_buf));
|
|
||||||
wtpman_remove(wtpman);
|
wtpman_remove(wtpman);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -645,8 +623,7 @@ void wtpman_destroy(struct wtpman *wtpman)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
|
struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dtlsmode)
|
||||||
int dtlsmode, cw_Cfg_t * global_cfg)
|
|
||||||
{
|
{
|
||||||
struct sockaddr dbgaddr;
|
struct sockaddr dbgaddr;
|
||||||
socklen_t dbgaddrl;
|
socklen_t dbgaddrl;
|
||||||
@ -665,9 +642,8 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
|
|||||||
replyfd = socklist_find_reply_socket(srcaddr, port);
|
replyfd = socklist_find_reply_socket(srcaddr, port);
|
||||||
|
|
||||||
if (replyfd == -1) {
|
if (replyfd == -1) {
|
||||||
cw_log(LOG_ERR,
|
cw_log(LOG_ERR, "Can't find reply socket for request from %s",
|
||||||
"Can't find reply socket for request from %s",
|
sock_addr2str(srcaddr,sock_buf));
|
||||||
sock_addr2str(srcaddr, sock_buf));
|
|
||||||
free(wtpman);
|
free(wtpman);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -675,7 +651,7 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
|
|||||||
replyfd = socklist[socklistindex].sockfd;
|
replyfd = socklist[socklistindex].sockfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
sockfd = replyfd; /*//socklist[socklistindex].reply_sockfd; */
|
sockfd = replyfd; /*//socklist[socklistindex].reply_sockfd;*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -687,7 +663,7 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
|
|||||||
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));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -695,8 +671,7 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
|
|||||||
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,
|
sock_copyaddr(&wtpman->conn->data_addr, (struct sockaddr *) &wtpman->conn->addr);
|
||||||
(struct sockaddr *) &wtpman->conn->addr);
|
|
||||||
|
|
||||||
if (!wtpman->conn) {
|
if (!wtpman->conn) {
|
||||||
wtpman_destroy(wtpman);
|
wtpman_destroy(wtpman);
|
||||||
@ -724,24 +699,21 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
|
|||||||
|
|
||||||
|
|
||||||
wtpman->conn->local_cfg = cw_ktv_create();
|
wtpman->conn->local_cfg = cw_ktv_create();
|
||||||
wtpman->conn->global_cfg = global_cfg;
|
wtpman->conn->global_cfg = actube_global_cfg;
|
||||||
wtpman->conn->local_cfg = global_cfg;
|
wtpman->conn->local_cfg = actube_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,
|
rc = discovery_cache_get(discovery_cache,srcaddr,&cmod,&bmod);
|
||||||
&bmod);
|
if (rc){
|
||||||
if (rc) {
|
cw_dbg(DBG_INFO, "Initializing with mod %s %s",cmod->name,bmod->name);
|
||||||
cw_dbg(DBG_INFO, "Initializing with mod %s %s",
|
wtpman->conn->msgset = cw_mod_get_msg_set(wtpman->conn,cmod,bmod);
|
||||||
cmod->name, bmod->name);
|
wtpman->conn->detected=1;
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -757,8 +729,14 @@ 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, (void *) wtpman);
|
pthread_create(&wtpman->thread, NULL, wtpman_main,
|
||||||
|
(void *) wtpman);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,20 +8,19 @@
|
|||||||
#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 cw_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;
|
||||||
@ -44,14 +43,13 @@ 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,
|
struct wtpman * wtpman_create(int socklistindex,struct sockaddr * srcaddr, int dtlsmode);
|
||||||
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 = YES
|
MAN_LINKS = NO
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the XML output
|
# Configuration options related to the XML output
|
||||||
|
@ -16,6 +16,7 @@ CWSRC=\
|
|||||||
cw_in_ac_name_with_priority.c\
|
cw_in_ac_name_with_priority.c\
|
||||||
cw_in_capwap_local_ipv4_address.c\
|
cw_in_capwap_local_ipv4_address.c\
|
||||||
cw_in_capwap_local_ipv6_address.c\
|
cw_in_capwap_local_ipv6_address.c\
|
||||||
|
cw_in_check_cfg_update_req.c\
|
||||||
cw_in_check_disc_req.c\
|
cw_in_check_disc_req.c\
|
||||||
cw_in_check_img_data_req_ac.c\
|
cw_in_check_img_data_req_ac.c\
|
||||||
cw_in_check_img_data_req_wtp.c\
|
cw_in_check_img_data_req_wtp.c\
|
||||||
@ -67,16 +68,14 @@ CWSRC=\
|
|||||||
cw_type_bool.c\
|
cw_type_bool.c\
|
||||||
cw_type_str.c\
|
cw_type_str.c\
|
||||||
cw_type_dword.c\
|
cw_type_dword.c\
|
||||||
cw_type_struct.c\
|
|
||||||
cw_type_ipaddress.c\
|
cw_type_ipaddress.c\
|
||||||
cw_type_word.c\
|
cw_type_word.c\
|
||||||
cw_type_sysptr.c\
|
cw_type_sysptr.c\
|
||||||
cw_write_descriptor_subelem.c\
|
cw_write_descriptor_subelem.c\
|
||||||
|
cw_read_from.c \
|
||||||
cw_write_radio_element.c\
|
cw_write_radio_element.c\
|
||||||
cw_detect_nat.c\
|
cw_detect_nat.c\
|
||||||
|
|
||||||
#cw_read_from.c \
|
|
||||||
|
|
||||||
KTVSRC=\
|
KTVSRC=\
|
||||||
cw_ktv_add.c\
|
cw_ktv_add.c\
|
||||||
cw_ktv_cast.c\
|
cw_ktv_cast.c\
|
||||||
@ -203,9 +202,9 @@ MISCSRC=\
|
|||||||
md5sum.c\
|
md5sum.c\
|
||||||
mod.c\
|
mod.c\
|
||||||
msgset.c\
|
msgset.c\
|
||||||
|
netconn.c\
|
||||||
send.c\
|
send.c\
|
||||||
strheap.c\
|
strheap.c\
|
||||||
netconn.c\
|
|
||||||
|
|
||||||
DTLSSRC+=\
|
DTLSSRC+=\
|
||||||
dtls_bio.c\
|
dtls_bio.c\
|
||||||
|
120
src/cw/cfg.c
120
src/cw/cfg.c
@ -6,7 +6,6 @@
|
|||||||
#include "cw.h"
|
#include "cw.h"
|
||||||
#include "cfg.h"
|
#include "cfg.h"
|
||||||
#include "val.h"
|
#include "val.h"
|
||||||
#include "dbg.h"
|
|
||||||
|
|
||||||
static const char *nextc(const char *s)
|
static const char *nextc(const char *s)
|
||||||
{
|
{
|
||||||
@ -85,8 +84,6 @@ cw_Cfg_t *cw_cfg_create()
|
|||||||
|
|
||||||
int cw_cfg_set(cw_Cfg_t * cfg, const char *key, const char *val)
|
int cw_cfg_set(cw_Cfg_t * cfg, const char *key, const char *val)
|
||||||
{
|
{
|
||||||
cw_dbg(DBG_CFG_SET, "%s: %s",key,val);
|
|
||||||
|
|
||||||
struct cw_Cfg_entry e;
|
struct cw_Cfg_entry e;
|
||||||
int replaced;
|
int replaced;
|
||||||
|
|
||||||
@ -431,6 +428,59 @@ int cw_cfg_load(const char *filename, cw_Cfg_t * cfg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int cw_cfg_get_next_idx(cw_Cfg_t * cfg, const char *key, int n)
|
||||||
|
{
|
||||||
|
char ikey[CW_CFG_MAX_KEY_LEN];
|
||||||
|
struct cw_Cfg_entry search, *result;
|
||||||
|
const char *d;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
sprintf(ikey, "%s.%d", key, n);
|
||||||
|
|
||||||
|
search.key = ikey;
|
||||||
|
result = mavl_get_first(cfg, &search);
|
||||||
|
|
||||||
|
printf("KEY: %s\n", search.key);
|
||||||
|
printf("NNNNN: %s\n", result->key);
|
||||||
|
|
||||||
|
|
||||||
|
if (result == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
d = NULL;
|
||||||
|
for (i = strlen(ikey); i >= 0; i--) {
|
||||||
|
|
||||||
|
if (ikey[i] == '.') {
|
||||||
|
d = result->key + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result->key[i] != '.') {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncmp(result->key, ikey, i) != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
printf("TRANSFER %s\n", result->key + i + 1);
|
||||||
|
return atoi(result->key + i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void pcb(char *dst, struct mavlnode *node)
|
||||||
|
{
|
||||||
|
struct cw_Cfg_entry *e = mavlnode_dataptr(node);
|
||||||
|
sprintf(dst, "%s", e->key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base)
|
void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base)
|
||||||
{
|
{
|
||||||
struct cw_Cfg_entry search;
|
struct cw_Cfg_entry search;
|
||||||
@ -482,6 +532,63 @@ const char *cw_cfg_iter_next(struct cw_Cfg_iter *cfi, const char *key)
|
|||||||
return e->val;
|
return e->val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cw_cfg_iterate(cw_Cfg_t * cfg, const char *key)
|
||||||
|
{
|
||||||
|
printf("Iterate\n");
|
||||||
|
struct cw_Cfg_entry *e;
|
||||||
|
struct cw_Cfg_entry search;
|
||||||
|
search.key = key;
|
||||||
|
struct mavliter it;
|
||||||
|
struct mavlnode *first;
|
||||||
|
|
||||||
|
mavl_print(cfg,pcb,180);
|
||||||
|
|
||||||
|
printf("SEEK TO %s\n", search.key);
|
||||||
|
|
||||||
|
struct cw_Cfg_iter cfi;
|
||||||
|
cw_cfg_iter_init(cfg, &cfi, key);
|
||||||
|
const char *kee;
|
||||||
|
|
||||||
|
while ((kee = cw_cfg_iter_next(&cfi, NULL)) != NULL) {
|
||||||
|
printf("KEY===%s\n", kee);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
mavliter_init(&it, cfg);
|
||||||
|
mavliter_seek(&it, &search, 0);
|
||||||
|
struct cw_Cfg_entry *en;
|
||||||
|
return;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
i = cw_cfg_get_next_idx(cfg, "actube/listen", i);
|
||||||
|
|
||||||
|
printf("This i %d\n", i);
|
||||||
|
|
||||||
|
while ((i = cw_cfg_get_next_idx(cfg, "actube/listen", i)) != -1) {
|
||||||
|
|
||||||
|
printf("Here i %d\n", i);
|
||||||
|
printf("we have key: %s.%d\n", "actube/listen", i);
|
||||||
|
printf("Next=%d\n", i);
|
||||||
|
i++;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
e = mavl_get_first(cfg, &search);
|
||||||
|
if (!e) {
|
||||||
|
printf("NULL\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf("%s : %s\n", e->key, e->val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
@ -499,9 +606,4 @@ 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);
|
|
||||||
cw_cfg_set(cfg,key,a);
|
|
||||||
}
|
|
||||||
|
@ -31,7 +31,6 @@ 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
|
||||||
|
107
src/cw/conn.h
107
src/cw/conn.h
@ -56,7 +56,7 @@ struct cw_action_in;
|
|||||||
/**
|
/**
|
||||||
* Connection Object
|
* Connection Object
|
||||||
*/
|
*/
|
||||||
struct cw_Conn {
|
struct conn {
|
||||||
int sock;
|
int sock;
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage addr;
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ struct cw_Conn {
|
|||||||
|
|
||||||
|
|
||||||
/** Counter for mandatory message elements */
|
/** Counter for mandatory message elements */
|
||||||
/* struct avltree *mand;*/
|
struct avltree *mand;
|
||||||
|
|
||||||
|
|
||||||
/** Actionsdefs - this defines the possible actions for
|
/** Actionsdefs - this defines the possible actions for
|
||||||
@ -154,19 +154,19 @@ struct cw_Conn {
|
|||||||
|
|
||||||
/* receive and send methods */
|
/* receive and send methods */
|
||||||
|
|
||||||
int (*recv_packet) (struct cw_Conn*, uint8_t *, int);
|
int (*recv_packet) (struct conn *, uint8_t *, int);
|
||||||
int (*recv_packet_peek) (struct cw_Conn*, uint8_t *, int);
|
int (*recv_packet_peek) (struct conn *, uint8_t *, int);
|
||||||
int (*send_packet) (struct cw_Conn*, const uint8_t *, int);
|
int (*send_packet) (struct conn *, const uint8_t *, int);
|
||||||
/*
|
/*
|
||||||
// int (*recv_data_packet) (struct cw_Conn*, uint8_t *,int);
|
// int (*recv_data_packet) (struct conn *, uint8_t *,int);
|
||||||
// int (*send_data_packet) (struct cw_Conn*, const uint8_t *, int);
|
// int (*send_data_packet) (struct conn *, const uint8_t *, int);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int (*readfrom) (struct cw_Conn*, uint8_t *, int, struct sockaddr_storage *);
|
int (*readfrom) (struct conn *, uint8_t *, int, struct sockaddr_storage *);
|
||||||
int (*read) (struct cw_Conn*, uint8_t *, int);
|
int (*read) (struct conn *, uint8_t *, int);
|
||||||
int (*write) (struct cw_Conn*, const uint8_t *, int);
|
int (*write) (struct conn *, const uint8_t *, int);
|
||||||
/*
|
/*
|
||||||
// int (*write_data) (struct cw_Conn*, const uint8_t *, int);
|
// int (*write_data) (struct conn *, const uint8_t *, int);
|
||||||
*/
|
*/
|
||||||
/* optional packet queue */
|
/* optional packet queue */
|
||||||
uint8_t **q;
|
uint8_t **q;
|
||||||
@ -179,14 +179,14 @@ struct cw_Conn {
|
|||||||
int cur_packet_pos;
|
int cur_packet_pos;
|
||||||
|
|
||||||
/* dtls stuff */
|
/* dtls stuff */
|
||||||
int (*dtls_start) (struct cw_Conn*);
|
int (*dtls_start) (struct conn *);
|
||||||
int (*dtls_accept) (struct cw_Conn*);
|
int (*dtls_accept) (struct conn *);
|
||||||
|
|
||||||
bstr16_t dtls_psk;
|
bstr16_t dtls_psk;
|
||||||
int dtls_psk_enable;
|
int dtls_psk_enable;
|
||||||
|
|
||||||
int dtls_dhbits;
|
int dtls_dhbits;
|
||||||
int (*dtls_get_psk)(struct cw_Conn*,const char *user,uint8_t**psk, int *len);
|
int (*dtls_get_psk)(struct conn *,const char *user,uint8_t**psk, int *len);
|
||||||
|
|
||||||
struct cw_Mod *cmod, *bmod;
|
struct cw_Mod *cmod, *bmod;
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ struct cw_Conn {
|
|||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
/** Mode */
|
/** Mode */
|
||||||
// int capwap_mode;
|
int capwap_mode;
|
||||||
|
|
||||||
/** CAWAP mode for outgoing messages */
|
/** CAWAP mode for outgoing messages */
|
||||||
int capwap_mode_out;
|
int capwap_mode_out;
|
||||||
@ -229,8 +229,8 @@ struct cw_Conn {
|
|||||||
int strict_hdr;
|
int strict_hdr;
|
||||||
|
|
||||||
|
|
||||||
int (*process_packet)(struct cw_Conn*conn, uint8_t * packet, int len,struct sockaddr *from);
|
int (*process_packet)(struct conn *conn, uint8_t * packet, int len,struct sockaddr *from);
|
||||||
int (*process_message)(struct cw_Conn*conn, uint8_t * rawmsg, int rawlen,
|
int (*process_message)(struct conn *conn, uint8_t * rawmsg, int rawlen,
|
||||||
struct sockaddr *from);
|
struct sockaddr *from);
|
||||||
|
|
||||||
|
|
||||||
@ -238,17 +238,16 @@ struct cw_Conn {
|
|||||||
void * mods;
|
void * mods;
|
||||||
|
|
||||||
|
|
||||||
int (*msg_start)(struct cw_Conn*conn,struct cw_action_in *a,uint8_t*data,int len,struct sockaddr *from);
|
int (*msg_start)(struct conn *conn,struct cw_action_in *a,uint8_t*data,int len,struct sockaddr *from);
|
||||||
int (*msg_end)(struct cw_Conn*conn,struct cw_action_in *a,uint8_t*elem,int len,struct sockaddr *from);
|
int (*msg_end)(struct conn *conn,struct cw_action_in *a,uint8_t*elem,int len,struct sockaddr *from);
|
||||||
|
|
||||||
int (*elem_end)(struct cw_Conn*conn,struct cw_action_in *a,int afrc,uint8_t*elem,int len,struct sockaddr *from);
|
int (*elem_end)(struct conn *conn,struct cw_action_in *a,int afrc,uint8_t*elem,int len,struct sockaddr *from);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// void (*actions_registered)(struct cw_Conn*conn);
|
// void (*actions_registered)(struct conn *conn);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
};
|
};
|
||||||
typedef struct cw_Conn cw_Conn_t;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -256,76 +255,76 @@ typedef struct cw_Conn cw_Conn_t;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct cw_Conn*conn_create(int sock, struct sockaddr *addr, int qsize);
|
struct conn *conn_create(int sock, struct sockaddr *addr, int qsize);
|
||||||
struct cw_Conn*conn_create_noq(int sock, struct sockaddr *addr);
|
struct conn *conn_create_noq(int sock, struct sockaddr *addr);
|
||||||
|
|
||||||
|
|
||||||
extern int conn_send_cwmsg(struct cw_Conn*conn, struct cwmsg *cwmsg);
|
extern int conn_send_cwmsg(struct conn *conn, struct cwmsg *cwmsg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
//extern int conn_process_packet(struct cw_Conn*conn, uint8_t * packet, int len,
|
//extern int conn_process_packet(struct conn *conn, uint8_t * packet, int len,
|
||||||
// int (*cb) (void *, uint8_t *,int len), void *cbarg);
|
// int (*cb) (void *, uint8_t *,int len), void *cbarg);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int conn_process_packet(struct cw_Conn*conn, uint8_t * packet, int len,struct sockaddr *from);
|
extern int conn_process_packet(struct conn *conn, uint8_t * packet, int len,struct sockaddr *from);
|
||||||
extern int process_message(struct cw_Conn*conn, uint8_t * rawmsg, int rawlen,
|
extern int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen,
|
||||||
struct sockaddr *from);
|
struct sockaddr *from);
|
||||||
|
|
||||||
extern uint8_t *conn_get_message(struct cw_Conn*conn);
|
extern uint8_t *conn_get_message(struct conn *conn);
|
||||||
|
|
||||||
extern int conn_send_packet(struct cw_Conn*conn, const uint8_t * buffer, int len);
|
extern int conn_send_packet(struct conn *conn, const uint8_t * buffer, int len);
|
||||||
extern int conn_send_data_packet(struct cw_Conn* conn, const uint8_t * buffer, int len);
|
extern int conn_send_data_packet(struct conn * conn, const uint8_t * buffer, int len);
|
||||||
|
|
||||||
extern void conn_destroy(struct cw_Conn*conn);
|
extern void conn_destroy(struct conn *conn);
|
||||||
|
|
||||||
uint8_t *conn_q_get_packet(struct cw_Conn*conn);
|
uint8_t *conn_q_get_packet(struct conn *conn);
|
||||||
extern int conn_q_recv_packet(struct cw_Conn*conn, uint8_t * buffer, int len);
|
extern int conn_q_recv_packet(struct conn *conn, uint8_t * buffer, int len);
|
||||||
extern int conn_q_recv_packet_peek(struct cw_Conn*conn, uint8_t * buffer, int len);
|
extern int conn_q_recv_packet_peek(struct conn *conn, uint8_t * buffer, int len);
|
||||||
|
|
||||||
extern int conn_recv_packet(struct cw_Conn*conn, uint8_t * buf, int len);
|
extern int conn_recv_packet(struct conn *conn, uint8_t * buf, int len);
|
||||||
extern int conn_recv_packet_peek(struct cw_Conn*conn, uint8_t * buf, int len);
|
extern int conn_recv_packet_peek(struct conn *conn, uint8_t * buf, int len);
|
||||||
|
|
||||||
extern int conn_send_response(struct cw_Conn*conn, struct cwmsg *cwmsg, int seqnum);
|
extern int conn_send_response(struct conn *conn, struct cwmsg *cwmsg, int seqnum);
|
||||||
extern struct cwrmsg *conn_get_response(struct cw_Conn*conn);
|
extern struct cwrmsg *conn_get_response(struct conn *conn);
|
||||||
|
|
||||||
|
|
||||||
#define conn_get_next_seqnum(conn) (conn->seqnum=((conn->seqnum+1)&0xff))
|
#define conn_get_next_seqnum(conn) (conn->seqnum=((conn->seqnum+1)&0xff))
|
||||||
#define conn_get_last_seqnum(conn) (conn->seqnum&0xff)
|
#define conn_get_last_seqnum(conn) (conn->seqnum&0xff)
|
||||||
|
|
||||||
|
|
||||||
void conn_q_add_packet(struct cw_Conn*conn, uint8_t * packet, int len);
|
void conn_q_add_packet(struct conn *conn, uint8_t * packet, int len);
|
||||||
|
|
||||||
struct image_identifier;
|
struct image_identifier;
|
||||||
struct cwimage_data;
|
struct cwimage_data;
|
||||||
|
|
||||||
extern void conn_prepare_request(struct cw_Conn*conn, int type);
|
extern void conn_prepare_request(struct conn *conn, int type);
|
||||||
extern int conn_prepare_image_data_request(struct cw_Conn*conn, struct cwimage_data *,
|
extern int conn_prepare_image_data_request(struct conn *conn, struct cwimage_data *,
|
||||||
struct image_identifier *id);
|
struct image_identifier *id);
|
||||||
/*
|
/*
|
||||||
//extern void conn_detect_capwap(struct cw_Conn*conn, struct wtpinfo *wtpinfo);
|
//extern void conn_detect_capwap(struct conn *conn, struct wtpinfo *wtpinfo);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct cwrmsg *conn_send_request(struct cw_Conn*conn);
|
struct cwrmsg *conn_send_request(struct conn *conn);
|
||||||
struct cwrmsg *conn_wait_for_message(struct cw_Conn*conn, time_t timer);
|
struct cwrmsg *conn_wait_for_message(struct conn *conn, time_t timer);
|
||||||
|
|
||||||
struct cwrmsg *conn_wait_for_request(struct cw_Conn*conn, int *msglist, time_t timer);
|
struct cwrmsg *conn_wait_for_request(struct conn *conn, int *msglist, time_t timer);
|
||||||
|
|
||||||
int conn_q_wait_packet(struct cw_Conn* conn, int seconds);
|
int conn_q_wait_packet(struct conn * conn, int seconds);
|
||||||
|
|
||||||
#define conn_is_error(conn) (conn->dtls_error)
|
#define conn_is_error(conn) (conn->dtls_error)
|
||||||
|
|
||||||
void conn_init(struct cw_Conn*conn);
|
void conn_init(struct conn *conn);
|
||||||
|
|
||||||
extern int cw_read_messages(struct cw_Conn*conn);
|
extern int cw_read_messages(struct conn *conn);
|
||||||
|
|
||||||
extern int conn_recvfrom_packet(struct cw_Conn*conn, uint8_t * buf, int len,
|
extern int conn_recvfrom_packet(struct conn *conn, uint8_t * buf, int len,
|
||||||
struct sockaddr_storage *from);
|
struct sockaddr_storage *from);
|
||||||
|
|
||||||
int conn_send_msg(struct cw_Conn* conn, uint8_t *rawmsg);
|
int conn_send_msg(struct conn * conn, uint8_t *rawmsg);
|
||||||
int cw_read_from(struct cw_Conn* conn, struct sockaddr_storage * from);
|
int cw_read_from(struct conn * conn, struct sockaddr_storage * from);
|
||||||
|
|
||||||
int conn_send_msg(struct cw_Conn *conn, uint8_t * rawmsg);
|
int conn_send_msg(struct conn *conn, uint8_t * rawmsg);
|
||||||
|
|
||||||
void conn_clear_upd(struct cw_Conn*conn, int merge);
|
void conn_clear_upd(struct conn *conn, int merge);
|
||||||
|
|
||||||
#endif /* __CONN_H */
|
#endif /* __CONN_H */
|
||||||
|
@ -45,10 +45,10 @@
|
|||||||
* for asynchronous operation.
|
* for asynchronous operation.
|
||||||
* To create a conn object without queue functionallity use #conn_create_noq.
|
* To create a conn object without queue functionallity use #conn_create_noq.
|
||||||
*/
|
*/
|
||||||
struct cw_Conn * conn_create(int sock, struct sockaddr * addr, int qsize)
|
struct conn * conn_create(int sock, struct sockaddr * addr, int qsize)
|
||||||
{
|
{
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
conn = malloc(sizeof (struct cw_Conn ));
|
conn = malloc(sizeof (struct conn));
|
||||||
if (!conn)
|
if (!conn)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -36,10 +36,10 @@
|
|||||||
* @retval 1 Success
|
* @retval 1 Success
|
||||||
* @retval 0 failure, conslt errno for more details
|
* @retval 0 failure, conslt errno for more details
|
||||||
*/
|
*/
|
||||||
struct cw_Conn * conn_create_noq(int sock, struct sockaddr * addr)
|
struct conn * conn_create_noq(int sock, struct sockaddr * addr)
|
||||||
{
|
{
|
||||||
struct cw_Conn * conn;
|
struct conn * conn;
|
||||||
conn = malloc(sizeof (struct cw_Conn ));
|
conn = malloc(sizeof (struct conn));
|
||||||
if (!conn)
|
if (!conn)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
* Destroy a conn object
|
* Destroy a conn object
|
||||||
* @param object to destroy
|
* @param object to destroy
|
||||||
*/
|
*/
|
||||||
void conn_destroy(struct cw_Conn * conn)
|
void conn_destroy(struct conn * conn)
|
||||||
{
|
{
|
||||||
if (conn->fragman)
|
if (conn->fragman)
|
||||||
fragman_destroy(conn->fragman);
|
fragman_destroy(conn->fragman);
|
||||||
|
@ -47,15 +47,15 @@ static int header_len(struct cw_ElemHandler * handler)
|
|||||||
* Basic initialization of a conn object
|
* Basic initialization of a conn object
|
||||||
* @param conn conn object to initialize
|
* @param conn conn object to initialize
|
||||||
*/
|
*/
|
||||||
void conn_init(struct cw_Conn * conn)
|
void conn_init(struct conn * conn)
|
||||||
{
|
{
|
||||||
memset(conn,0,sizeof(struct cw_Conn ));
|
memset(conn,0,sizeof(struct conn));
|
||||||
conn->retransmit_interval=CAPWAP_RETRANSMIT_INTERVAL;
|
conn->retransmit_interval=CAPWAP_RETRANSMIT_INTERVAL;
|
||||||
conn->max_retransmit=CAPWAP_MAX_RETRANSMIT;
|
conn->max_retransmit=CAPWAP_MAX_RETRANSMIT;
|
||||||
conn->wait_dtls=CAPWAP_WAIT_DTLS;
|
conn->wait_dtls=CAPWAP_WAIT_DTLS;
|
||||||
conn->wait_join=CAPWAP_WAIT_JOIN;
|
conn->wait_join=CAPWAP_WAIT_JOIN;
|
||||||
conn->mtu_discovery=1;
|
conn->mtu_discovery=1;
|
||||||
// conn->capwap_mode = 0;
|
conn->capwap_mode = 0;
|
||||||
conn->strict_capwap=1;
|
conn->strict_capwap=1;
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
/**
|
/**
|
||||||
* Init response message header
|
* Init response message header
|
||||||
*/
|
*/
|
||||||
void cw_init_response(struct cw_Conn *conn, uint8_t * req)
|
void cw_init_response(struct conn *conn, uint8_t * req)
|
||||||
{
|
{
|
||||||
uint8_t *buffer;
|
uint8_t *buffer;
|
||||||
int shbytes, dhbytes;
|
int shbytes, dhbytes;
|
||||||
@ -69,7 +69,7 @@ void cw_init_response(struct cw_Conn *conn, uint8_t * req)
|
|||||||
cw_set_msg_flags(dmsgptr, 0);
|
cw_set_msg_flags(dmsgptr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cw_init_request(struct cw_Conn *conn, int msg_id)
|
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;
|
||||||
@ -97,7 +97,7 @@ void cw_init_request(struct cw_Conn *conn, int msg_id)
|
|||||||
cw_set_msg_elems_len(msgptr, 0);
|
cw_set_msg_elems_len(msgptr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cw_init_data_msg(struct cw_Conn *conn)
|
void cw_init_data_msg(struct conn *conn)
|
||||||
{
|
{
|
||||||
uint8_t *buffer = conn->req_buffer;
|
uint8_t *buffer = conn->req_buffer;
|
||||||
cw_set_dword(buffer + 0, 0);
|
cw_set_dword(buffer + 0, 0);
|
||||||
@ -114,7 +114,7 @@ void cw_init_data_msg(struct cw_Conn *conn)
|
|||||||
/**
|
/**
|
||||||
* send a response
|
* send a response
|
||||||
*/
|
*/
|
||||||
int cw_send_response(struct cw_Conn *conn, uint8_t * rawmsg, int len)
|
int cw_send_response(struct conn *conn, uint8_t * rawmsg, int len)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
cw_init_response(conn, rawmsg);
|
cw_init_response(conn, rawmsg);
|
||||||
@ -135,10 +135,9 @@ int cw_send_response(struct cw_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 cw_Conn *conn, uint8_t * rawmsg,
|
int cw_send_error_response(struct conn *conn, uint8_t * rawmsg, uint32_t result_code)
|
||||||
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);
|
||||||
@ -156,26 +155,23 @@ int cw_send_error_response(struct cw_Conn *conn, uint8_t * rawmsg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct cw_MsgSet *load_msg_set(struct cw_Conn *conn, uint8_t * rawmsg,
|
static struct cw_MsgSet *load_msg_set(struct conn *conn, uint8_t * rawmsg, int len,
|
||||||
int len, int elems_len,
|
int elems_len, struct sockaddr *from)
|
||||||
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_detect(conn, rawmsg, len, elems_len, from, CW_MOD_MODE_CAPWAP);
|
||||||
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_detect(conn, rawmsg, len, elems_len, from, CW_MOD_MODE_BINDINGS);
|
||||||
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);
|
||||||
@ -183,12 +179,12 @@ static struct cw_MsgSet *load_msg_set(struct cw_Conn *conn, uint8_t * rawmsg,
|
|||||||
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int cw_in_check_generic(struct cw_Conn *conn, struct cw_action_in *a, uint8_t * data,
|
int cw_in_check_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data,
|
||||||
int len,struct sockaddr *from)
|
int len,struct sockaddr *from)
|
||||||
{
|
{
|
||||||
// if (cw_is_request(a->msg_id)){
|
// if (cw_is_request(a->msg_id)){
|
||||||
@ -201,7 +197,7 @@ int cw_in_check_generic(struct cw_Conn *conn, struct cw_action_in *a, uint8_t *
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void cw_read_elem(struct cw_ElemHandler * handler, struct cw_Conn * conn,
|
void cw_read_elem(struct cw_ElemHandler * handler, struct conn * conn,
|
||||||
uint8_t * elem_data, int elem_len, struct sockaddr * from){
|
uint8_t * elem_data, int elem_len, struct sockaddr * from){
|
||||||
mavldata_t data, *result;
|
mavldata_t data, *result;
|
||||||
char str[30];
|
char str[30];
|
||||||
@ -215,23 +211,22 @@ void cw_read_elem(struct cw_ElemHandler * handler, struct cw_Conn * conn,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
||||||
struct sockaddr *from)
|
struct sockaddr *from)
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
|
||||||
@ -248,8 +243,7 @@ static int process_elements(struct cw_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,
|
sock_addr2str(&conn->addr,sock_buf), elems_len, payloadlen - 8);
|
||||||
payloadlen - 8);
|
|
||||||
errno = EAGAIN;
|
errno = EAGAIN;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -258,8 +252,7 @@ static int process_elements(struct cw_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),
|
sock_addr2str(&conn->addr,sock_buf), payloadlen - 8 - elems_len);
|
||||||
payloadlen - 8 - elems_len);
|
|
||||||
elems_len = len - 8;
|
elems_len = len - 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,8 +260,7 @@ static int process_elements(struct cw_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,
|
sock_addr2str(&conn->addr, sock_buf), elems_len, payloadlen - 8);
|
||||||
payloadlen - 8);
|
|
||||||
elems_len = payloadlen - 8;
|
elems_len = payloadlen - 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -277,8 +269,7 @@ static int process_elements(struct cw_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 =
|
struct cw_MsgSet *set = load_msg_set(conn, rawmsg, len, elems_len, from);
|
||||||
load_msg_set(conn, rawmsg, len, elems_len, from);
|
|
||||||
if (!set) {
|
if (!set) {
|
||||||
/*
|
/*
|
||||||
//cw_log(LOG_ERR, "Error");
|
//cw_log(LOG_ERR, "Error");
|
||||||
@ -287,7 +278,7 @@ static int process_elements(struct cw_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,13 +290,13 @@ static int process_elements(struct cw_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),
|
||||||
@ -341,18 +332,18 @@ static int process_elements(struct cw_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);
|
||||||
@ -362,43 +353,87 @@ static int process_elements(struct cw_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;*/
|
||||||
|
|
||||||
cw_dbg(DBG_MSG_PARSING, "*** Parsing message of type %d - (%s) ***",
|
params.local_cfg=conn->local_cfg;
|
||||||
message->type, message->name);
|
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;
|
||||||
|
|
||||||
|
rc = cw_process_element(¶ms,0,0,elem_id,elem_data,elem_len);
|
||||||
|
|
||||||
|
|
||||||
params.cfg = cw_cfg_create();
|
if (cw_result_is_ok(rc))
|
||||||
cw_decode_elements(¶ms,elems_ptr, elems_len);
|
continue;
|
||||||
|
|
||||||
exit(0);
|
if (rc == CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT){
|
||||||
|
mlist_append(unrecognized,&elem);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc < 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);
|
||||||
|
|
||||||
@ -407,7 +442,7 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
if (message->postprocess) {
|
if (message->postprocess){
|
||||||
message->postprocess(conn);
|
message->postprocess(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -420,9 +455,8 @@ static int process_elements(struct cw_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",
|
cw_ktv_set_dword(conn->local_cfg,"result-code",result_code);
|
||||||
result_code);
|
if (ui->next){
|
||||||
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;
|
||||||
}
|
}
|
||||||
@ -441,7 +475,7 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*stravltree_destroy(conn->mand); */
|
/*stravltree_destroy(conn->mand);*/
|
||||||
|
|
||||||
return result_code;
|
return result_code;
|
||||||
|
|
||||||
@ -452,12 +486,12 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int process_message(struct cw_Conn *conn, uint8_t * rawmsg, int rawlen,
|
int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen,
|
||||||
struct sockaddr *from)
|
struct sockaddr *from)
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
|
||||||
@ -488,7 +522,7 @@ int process_message(struct cw_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;
|
||||||
}
|
}
|
||||||
@ -499,7 +533,7 @@ int process_message(struct cw_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) {
|
||||||
@ -513,7 +547,7 @@ int process_message(struct cw_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;
|
||||||
@ -526,7 +560,7 @@ int process_message(struct cw_Conn *conn, uint8_t * rawmsg, int rawlen,
|
|||||||
* @param packet pointer to packet data
|
* @param packet pointer to packet data
|
||||||
* @param len lenght of packet data
|
* @param len lenght of packet data
|
||||||
*/
|
*/
|
||||||
int conn_process_packet2(struct cw_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];
|
||||||
@ -549,8 +583,8 @@ int conn_process_packet2(struct cw_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),
|
sock_addr2str(&conn->addr,sock_buf), (preamble & 0xf0) >> 4,
|
||||||
(preamble & 0xf0) >> 4, CAPWAP_VERSION);
|
CAPWAP_VERSION);
|
||||||
errno = EAGAIN;
|
errno = EAGAIN;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -559,7 +593,7 @@ int conn_process_packet2(struct cw_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;
|
||||||
}
|
}
|
||||||
@ -573,7 +607,7 @@ int conn_process_packet2(struct cw_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;
|
||||||
}
|
}
|
||||||
@ -585,8 +619,7 @@ int conn_process_packet2(struct cw_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),
|
sock_addr2str(&conn->addr,sock_buf), *(packet + 8));
|
||||||
*(packet + 8));
|
|
||||||
errno = EAGAIN;
|
errno = EAGAIN;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -622,25 +655,23 @@ int conn_process_packet2(struct cw_Conn *conn, uint8_t * packet, int len,
|
|||||||
return conn->process_message(conn, packet, len, from);
|
return conn->process_message(conn, packet, len, from);
|
||||||
}
|
}
|
||||||
|
|
||||||
int conn_process_packet(struct cw_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 cw_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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -658,7 +689,7 @@ int conn_process_data_packet(struct cw_Conn *conn, uint8_t * packet, int len,
|
|||||||
/**
|
/**
|
||||||
* Used as main message loop
|
* Used as main message loop
|
||||||
*/
|
*/
|
||||||
int cw_read_messages(struct cw_Conn *conn)
|
int cw_read_messages(struct conn *conn)
|
||||||
{
|
{
|
||||||
uint8_t buf[2024];
|
uint8_t buf[2024];
|
||||||
int len = 2024;
|
int len = 2024;
|
||||||
@ -674,3 +705,4 @@ int cw_read_messages(struct cw_Conn *conn)
|
|||||||
errno = EAGAIN;
|
errno = EAGAIN;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include "sock.h"
|
#include "sock.h"
|
||||||
|
|
||||||
|
|
||||||
void conn_q_add_packet(struct cw_Conn * conn,uint8_t *packet,int len)
|
void conn_q_add_packet(struct conn * conn,uint8_t *packet,int len)
|
||||||
{
|
{
|
||||||
char sock_buf[SOCK_ADDR_BUFSIZE];
|
char sock_buf[SOCK_ADDR_BUFSIZE];
|
||||||
int qwpos = conn->qwpos;
|
int qwpos = conn->qwpos;
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
|
|
||||||
uint8_t * conn_q_get_packet(struct cw_Conn * conn)
|
uint8_t * conn_q_get_packet(struct conn * conn)
|
||||||
{
|
{
|
||||||
int qrpos;
|
int qrpos;
|
||||||
struct timespec timespec;
|
struct timespec timespec;
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
|
|
||||||
static int conn_q_recv_packet_(struct cw_Conn * conn, uint8_t * buffer,int len,int peek)
|
static int conn_q_recv_packet_(struct conn * conn, uint8_t * buffer,int len,int peek)
|
||||||
{
|
{
|
||||||
if ( !conn->cur_packet)
|
if ( !conn->cur_packet)
|
||||||
{
|
{
|
||||||
@ -58,12 +58,12 @@ static int conn_q_recv_packet_(struct cw_Conn * conn, uint8_t * buffer,int len,i
|
|||||||
return conn->cur_packet_len;
|
return conn->cur_packet_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int conn_q_recv_packet(struct cw_Conn * conn, uint8_t * buffer,int len)
|
int conn_q_recv_packet(struct conn * conn, uint8_t * buffer,int len)
|
||||||
{
|
{
|
||||||
return conn_q_recv_packet_(conn,buffer,len,0);
|
return conn_q_recv_packet_(conn,buffer,len,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int conn_q_recv_packet_peek(struct cw_Conn * conn, uint8_t * buffer,int len)
|
int conn_q_recv_packet_peek(struct conn * conn, uint8_t * buffer,int len)
|
||||||
{
|
{
|
||||||
return conn_q_recv_packet_(conn,buffer,len,1);
|
return conn_q_recv_packet_(conn,buffer,len,1);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
|
|
||||||
int conn_q_wait_packet(struct cw_Conn * conn, int seconds)
|
int conn_q_wait_packet(struct conn * conn, int seconds)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct timespec timespec;
|
struct timespec timespec;
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include "sock.h"
|
#include "sock.h"
|
||||||
|
|
||||||
int conn_recv_packet_(struct cw_Conn *conn, uint8_t * buf, int len, int flags)
|
int conn_recv_packet_(struct conn *conn, uint8_t * buf, int len, int flags)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
while ((n = recv(conn->sock, (char *) buf, len, flags)) < 0) {
|
while ((n = recv(conn->sock, (char *) buf, len, flags)) < 0) {
|
||||||
@ -41,7 +41,7 @@ int conn_recv_packet_(struct cw_Conn *conn, uint8_t * buf, int len, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int conn_recvfrom_packet(struct cw_Conn *conn, uint8_t * buf, int len,
|
int conn_recvfrom_packet(struct conn *conn, uint8_t * buf, int len,
|
||||||
struct sockaddr_storage *from)
|
struct sockaddr_storage *from)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
@ -65,7 +65,7 @@ int conn_recvfrom_packet(struct cw_Conn *conn, uint8_t * buf, int len,
|
|||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
int conn_recv_packet_x(struct cw_Conn *conn, uint8_t * buf, int len, int flags)
|
int conn_recv_packet_x(struct conn *conn, uint8_t * buf, int len, int flags)
|
||||||
{
|
{
|
||||||
int port;
|
int port;
|
||||||
socklen_t al;
|
socklen_t al;
|
||||||
@ -104,12 +104,12 @@ int conn_recv_packet_x(struct cw_Conn *conn, uint8_t * buf, int len, int flags)
|
|||||||
|
|
||||||
/* yes, these functions could be better defined as macros in a .h file */
|
/* yes, these functions could be better defined as macros in a .h file */
|
||||||
|
|
||||||
int conn_recv_packet(struct cw_Conn *conn, uint8_t * buf, int len)
|
int conn_recv_packet(struct conn *conn, uint8_t * buf, int len)
|
||||||
{
|
{
|
||||||
return conn_recv_packet_x(conn, buf, len, 0);
|
return conn_recv_packet_x(conn, buf, len, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int conn_recv_packet_peek(struct cw_Conn *conn, uint8_t * buf, int len)
|
int conn_recv_packet_peek(struct conn *conn, uint8_t * buf, int len)
|
||||||
{
|
{
|
||||||
int rc = conn_recv_packet_(conn, buf, len, MSG_PEEK);
|
int rc = conn_recv_packet_(conn, buf, len, MSG_PEEK);
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#include "dbg.h"
|
#include "dbg.h"
|
||||||
|
|
||||||
|
|
||||||
int conn_send_data_packet(struct cw_Conn * conn, const uint8_t * buffer, int len)
|
int conn_send_data_packet(struct conn * conn, const uint8_t * buffer, int len)
|
||||||
{
|
{
|
||||||
char sock_buf[SOCK_ADDR_BUFSIZE];
|
char sock_buf[SOCK_ADDR_BUFSIZE];
|
||||||
int n;
|
int n;
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
#include "dbg.h"
|
#include "dbg.h"
|
||||||
|
|
||||||
#define CW_MODE_ZYXEL 7
|
#define CW_MODE_ZYXEL 7
|
||||||
extern cw_send_msg(struct cw_Conn * conn,uint8_t * msg);
|
extern cw_send_msg(struct conn * conn,uint8_t * msg);
|
||||||
|
|
||||||
int conn_send_msg(struct cw_Conn * conn, uint8_t *rawmsg)
|
int conn_send_msg(struct conn * conn, uint8_t *rawmsg)
|
||||||
{
|
{
|
||||||
uint8_t * ptr;
|
uint8_t * ptr;
|
||||||
int packetlen;
|
int packetlen;
|
||||||
@ -18,9 +18,9 @@ int conn_send_msg(struct cw_Conn * conn, uint8_t *rawmsg)
|
|||||||
|
|
||||||
/* Zyxel doesn't count msg element length from
|
/* Zyxel doesn't count msg element length from
|
||||||
behind seqnum */
|
behind seqnum */
|
||||||
// if (conn->capwap_mode == CW_MODE_ZYXEL){
|
if (conn->capwap_mode == CW_MODE_ZYXEL){
|
||||||
/* // XXX val-=3; */
|
/* // XXX val-=3; */
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
|
||||||
ptr = rawmsg;
|
ptr = rawmsg;
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int conn_send_packet(struct cw_Conn * conn, const uint8_t * buffer, int len)
|
int conn_send_packet(struct conn * conn, const uint8_t * buffer, int len)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
while((n=sendto( conn->sock, buffer, len, 0,
|
while((n=sendto( conn->sock, buffer, len, 0,
|
||||||
|
@ -39,24 +39,24 @@
|
|||||||
|
|
||||||
static int cmp_by_addr_p ( const void * d1, const void *d2 )
|
static int cmp_by_addr_p ( const void * d1, const void *d2 )
|
||||||
{
|
{
|
||||||
struct cw_Conn * c1 = * ( void ** ) d1 ;
|
struct conn * c1 = * ( void ** ) d1 ;
|
||||||
struct cw_Conn * c2 = * ( void ** ) d2 ;
|
struct conn * c2 = * ( void ** ) d2 ;
|
||||||
return sock_cmpaddr ( ( struct sockaddr* ) &c1->addr, ( struct sockaddr* ) &c2->addr, 1 );
|
return sock_cmpaddr ( ( struct sockaddr* ) &c1->addr, ( struct sockaddr* ) &c2->addr, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int cmp_by_addr ( const void * d1, const void *d2 )
|
static int cmp_by_addr ( const void * d1, const void *d2 )
|
||||||
{
|
{
|
||||||
struct cw_Conn * c1 = * ( void ** ) d1 ;
|
struct conn * c1 = * ( void ** ) d1 ;
|
||||||
struct cw_Conn * c2 = * ( void ** ) d2 ;
|
struct conn * c2 = * ( void ** ) d2 ;
|
||||||
return sock_cmpaddr ( ( struct sockaddr* ) &c1->addr, ( struct sockaddr* ) &c2->addr, 0 );
|
return sock_cmpaddr ( ( struct sockaddr* ) &c1->addr, ( struct sockaddr* ) &c2->addr, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int cmp_by_session_id ( const void *d1, const void *d2 )
|
static int cmp_by_session_id ( const void *d1, const void *d2 )
|
||||||
{
|
{
|
||||||
struct cw_Conn * c1 = *( void ** ) d1;
|
struct conn * c1 = *( void ** ) d1;
|
||||||
struct cw_Conn * c2 = *( void ** ) d2;
|
struct conn * c2 = *( void ** ) d2;
|
||||||
int len1,len2;
|
int len1,len2;
|
||||||
|
|
||||||
if (c1->session_id==NULL && c2->session_id==NULL)
|
if (c1->session_id==NULL && c2->session_id==NULL)
|
||||||
@ -143,15 +143,15 @@ void connlist_destroy ( struct connlist * cl )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct cw_Conn * connlist_get ( struct connlist * cl, const struct sockaddr * addr )
|
struct conn * connlist_get ( struct connlist * cl, const struct sockaddr * addr )
|
||||||
{
|
{
|
||||||
struct cw_Conn search;
|
struct conn search;
|
||||||
sock_copyaddr ( &search.addr, addr );
|
sock_copyaddr ( &search.addr, addr );
|
||||||
return mavl_get_ptr ( cl->by_addr, &search );
|
return mavl_get_ptr ( cl->by_addr, &search );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct cw_Conn * connlist_add ( struct connlist * cl, struct cw_Conn * conn )
|
struct conn * connlist_add ( struct connlist * cl, struct conn * conn )
|
||||||
{
|
{
|
||||||
if ( cl->len != 0 )
|
if ( cl->len != 0 )
|
||||||
if ( cl->by_addr->count >= cl->len )
|
if ( cl->by_addr->count >= cl->len )
|
||||||
@ -161,17 +161,17 @@ struct cw_Conn * connlist_add ( struct connlist * cl, struct cw_Conn * conn )
|
|||||||
return mavl_insert_ptr ( cl->by_addr, conn );
|
return mavl_insert_ptr ( cl->by_addr, conn );
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cw_Conn * connlist_get_by_session_id ( struct connlist *cl, struct cw_Conn * conn )
|
struct conn * connlist_get_by_session_id ( struct connlist *cl, struct conn * conn )
|
||||||
{
|
{
|
||||||
return mavl_get_ptr ( cl->by_session_id, conn );
|
return mavl_get_ptr ( cl->by_session_id, conn );
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cw_Conn * connlist_add_by_session_id ( struct connlist * cl, struct cw_Conn * conn )
|
struct conn * connlist_add_by_session_id ( struct connlist * cl, struct conn * conn )
|
||||||
{
|
{
|
||||||
return mavl_insert_ptr ( cl->by_session_id, conn );
|
return mavl_insert_ptr ( cl->by_session_id, conn );
|
||||||
}
|
}
|
||||||
|
|
||||||
void connlist_remove ( struct connlist *cl, struct cw_Conn * conn )
|
void connlist_remove ( struct connlist *cl, struct conn * conn )
|
||||||
{
|
{
|
||||||
void * md;
|
void * md;
|
||||||
md = conn;
|
md = conn;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "pthread.h"
|
#include "pthread.h"
|
||||||
|
|
||||||
struct connlist {
|
struct connlist {
|
||||||
/* struct cw_Conn ** connlist; */
|
/* struct conn ** connlist; */
|
||||||
|
|
||||||
struct mavl *by_addr;
|
struct mavl *by_addr;
|
||||||
struct mavl *by_session_id;
|
struct mavl *by_session_id;
|
||||||
@ -22,12 +22,12 @@ struct connlist *connlist_create(int len, int cmpports);
|
|||||||
void connlist_lock(struct connlist *cl);
|
void connlist_lock(struct connlist *cl);
|
||||||
void connlist_unlock(struct connlist *cl);
|
void connlist_unlock(struct connlist *cl);
|
||||||
void conlist_destroy(struct connlist *cl);
|
void conlist_destroy(struct connlist *cl);
|
||||||
struct cw_Conn *connlist_get(struct connlist *cl, const struct sockaddr *addr);
|
struct conn *connlist_get(struct connlist *cl, const struct sockaddr *addr);
|
||||||
struct cw_Conn *connlist_add(struct connlist *cl, struct cw_Conn *conn);
|
struct conn *connlist_add(struct connlist *cl, struct conn *conn);
|
||||||
void connlist_remove(struct connlist *cl, struct cw_Conn *conn);
|
void connlist_remove(struct connlist *cl, struct conn *conn);
|
||||||
void connlist_destroy(struct connlist *cl);
|
void connlist_destroy(struct connlist *cl);
|
||||||
|
|
||||||
struct cw_Conn * connlist_get_by_session_id(struct connlist *cl, struct cw_Conn * conn);
|
struct conn * connlist_get_by_session_id(struct connlist *cl, struct conn * conn);
|
||||||
struct cw_Conn * connlist_add_by_session_id(struct connlist * cl, struct cw_Conn * conn);
|
struct conn * connlist_add_by_session_id(struct connlist * cl, struct conn * conn);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
32
src/cw/cw.h
32
src/cw/cw.h
@ -327,7 +327,7 @@ int cw_put_elem_result_code(uint8_t * dst, uint32_t code);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*extern int cw_put_ac_status(uint8_t * dst, struct cw_ac_status *s, struct cw_Conn *conn);*/
|
/*extern int cw_put_ac_status(uint8_t * dst, struct cw_ac_status *s, struct conn *conn);*/
|
||||||
|
|
||||||
|
|
||||||
struct cw_DescriptorSubelemDef {
|
struct cw_DescriptorSubelemDef {
|
||||||
@ -356,12 +356,12 @@ extern int cw_read_descriptor_subelems(mavl_t store, const char * key, uint8_t *
|
|||||||
struct cw_DescriptorSubelemDef *elems);
|
struct cw_DescriptorSubelemDef *elems);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int cw_read_wtp_descriptor(mavl_t mbag, struct cw_Conn *conn,
|
int cw_read_wtp_descriptor(mavl_t mbag, struct conn *conn,
|
||||||
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
||||||
struct cw_DescriptorSubelemDef *allowed);
|
struct cw_DescriptorSubelemDef *allowed);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int cw_read_wtp_descriptor(mavl_t mbag, struct cw_Conn *conn,
|
int cw_read_wtp_descriptor(mavl_t mbag, struct conn *conn,
|
||||||
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
||||||
struct cw_DescriptorSubelemDef *allowed);
|
struct cw_DescriptorSubelemDef *allowed);
|
||||||
|
|
||||||
@ -372,7 +372,7 @@ int cw_write_radio_element(struct cw_ElemHandler * handler, struct cw_ElemHandle
|
|||||||
uint8_t * dst);
|
uint8_t * dst);
|
||||||
|
|
||||||
|
|
||||||
extern int cw_read_wtp_descriptor_7(mavl_t mbag, struct cw_Conn *conn,
|
extern int cw_read_wtp_descriptor_7(mavl_t mbag, struct conn *conn,
|
||||||
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
||||||
struct cw_DescriptorSubelemDef *allowed);
|
struct cw_DescriptorSubelemDef *allowed);
|
||||||
|
|
||||||
@ -384,7 +384,7 @@ int cw_read_ac_descriptor(mavl_t store,
|
|||||||
struct cw_DescriptorSubelemDef *allowed);
|
struct cw_DescriptorSubelemDef *allowed);
|
||||||
|
|
||||||
|
|
||||||
int cw_setup_dtls(struct cw_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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -444,11 +444,11 @@ int cw_out_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerP
|
|||||||
int cw_out_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
int cw_out_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||||
, uint8_t * dst);
|
, uint8_t * dst);
|
||||||
|
|
||||||
extern int cw_in_wtp_reboot_statistics(struct cw_Conn *conn, struct cw_action_in *a,
|
extern int cw_in_wtp_reboot_statistics(struct conn *conn, struct cw_action_in *a,
|
||||||
uint8_t * data, int len, struct sockaddr *from);
|
uint8_t * data, int len, struct sockaddr *from);
|
||||||
|
|
||||||
|
|
||||||
extern int cw_in_wtp_board_data(struct cw_Conn *conn, struct cw_action_in *a, uint8_t * data,
|
extern int cw_in_wtp_board_data(struct conn *conn, struct cw_action_in *a, uint8_t * data,
|
||||||
int len, struct sockaddr *from);
|
int len, struct sockaddr *from);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -457,24 +457,24 @@ int cw_in_vendor_specific_payload(struct cw_ElemHandler *handler,
|
|||||||
uint8_t * data, int len);
|
uint8_t * data, int len);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern int cw_in_capwap_control_ip_address(struct cw_Conn *conn, struct cw_action_in *a,
|
extern int cw_in_capwap_control_ip_address(struct conn *conn, struct cw_action_in *a,
|
||||||
uint8_t * data, int len,
|
uint8_t * data, int len,
|
||||||
struct sockaddr *from);
|
struct sockaddr *from);
|
||||||
|
|
||||||
extern int cw_in_capwap_local_ipv4_address(struct cw_Conn *conn, struct cw_action_in *a,
|
extern int cw_in_capwap_local_ipv4_address(struct conn *conn, struct cw_action_in *a,
|
||||||
uint8_t * data, int len,
|
uint8_t * data, int len,
|
||||||
struct sockaddr *from);
|
struct sockaddr *from);
|
||||||
|
|
||||||
extern int cw_in_capwap_local_ipv6_address(struct cw_Conn *conn, struct cw_action_in *a,
|
extern int cw_in_capwap_local_ipv6_address(struct conn *conn, struct cw_action_in *a,
|
||||||
uint8_t * data, int len,
|
uint8_t * data, int len,
|
||||||
struct sockaddr *from);
|
struct sockaddr *from);
|
||||||
|
|
||||||
extern int cw_in_radio_operational_state(struct cw_Conn *conn, struct cw_action_in *a,
|
extern int cw_in_radio_operational_state(struct conn *conn, struct cw_action_in *a,
|
||||||
uint8_t * data, int len, struct sockaddr *from);
|
uint8_t * data, int len, struct sockaddr *from);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int cw_process_element(struct cw_Conn * conn,
|
int cw_process_element(struct conn * conn,
|
||||||
struct cw_MsgData * msgdata, int proto, int vendor,
|
struct cw_MsgData * msgdata, int proto, int vendor,
|
||||||
uint8_t * elem, int max_len);
|
uint8_t * elem, int max_len);
|
||||||
*/
|
*/
|
||||||
@ -502,7 +502,7 @@ int cw_process_element(struct cw_ElemHandlerParams *params,
|
|||||||
#define cw_out_capwap_local_ip_address_7 cw_out_wtp_ip_address
|
#define cw_out_capwap_local_ip_address_7 cw_out_wtp_ip_address
|
||||||
|
|
||||||
|
|
||||||
void cw_init_request(struct cw_Conn *conn, int msg_id);
|
void cw_init_request(struct conn *conn, int msg_id);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -527,16 +527,16 @@ int cw_put_elem_radio_administrative_state(uint8_t * dst, int rid, int state);
|
|||||||
int cw_put_local_ip_address(uint8_t *dst, int id, int ipv_id, int ipv6_id,
|
int cw_put_local_ip_address(uint8_t *dst, int id, int ipv_id, int ipv6_id,
|
||||||
uint8_t *src, int len);
|
uint8_t *src, int len);
|
||||||
|
|
||||||
int cw_detect_nat(struct cw_Conn *conn);
|
int cw_detect_nat(struct conn *conn);
|
||||||
|
|
||||||
uint8_t *cw_init_data_keep_alive_msg(uint8_t * buffer,uint8_t *rmac);
|
uint8_t *cw_init_data_keep_alive_msg(uint8_t * buffer,uint8_t *rmac);
|
||||||
|
|
||||||
/*int cw_out_radio_generic(struct cw_Conn *conn, struct cw_action_out *a, uint8_t * dst);*/
|
/*int cw_out_radio_generic(struct conn *conn, struct cw_action_out *a, uint8_t * dst);*/
|
||||||
|
|
||||||
int cw_put_elem_session_id(uint8_t *dst, uint8_t *session_id, int len);
|
int cw_put_elem_session_id(uint8_t *dst, uint8_t *session_id, int len);
|
||||||
|
|
||||||
int cw_result_is_ok( int rc );
|
int cw_result_is_ok( int rc );
|
||||||
int cw_put_msg(struct cw_Conn *conn, uint8_t * rawout);
|
int cw_put_msg(struct conn *conn, uint8_t * rawout);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
|
@ -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,8 +66,10 @@ 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);
|
||||||
rc = handler->get(handler, params, data, len);
|
rc = handler->get(handler, params, data, len);
|
||||||
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,7 +123,4 @@ int cw_decode_elements(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mavl_destroy(mand_found);
|
|
||||||
mlist_destroy(unrecognized);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
* @retval 1 NAT detected
|
* @retval 1 NAT detected
|
||||||
* @retval 0 no NAT was detected
|
* @retval 0 no NAT was detected
|
||||||
*/
|
*/
|
||||||
int cw_detect_nat(struct cw_Conn *conn)
|
int cw_detect_nat(struct conn *conn)
|
||||||
{
|
{
|
||||||
cw_Val_t * result;
|
cw_Val_t * result;
|
||||||
|
|
||||||
|
@ -35,6 +35,10 @@ int cw_format_version(char *s, const uint8_t * version, int len)
|
|||||||
}
|
}
|
||||||
rs += sprintf(s + rs, ")");
|
rs += sprintf(s + rs, ")");
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
vendor = bstrv_get_vendor_id(ver);
|
||||||
|
rs += sprintf(s + rs, ", Vendor Id: %d, %s", vendor, cw_strvendor(vendor));
|
||||||
|
*/
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cw_in_capwap_local_ipv6_address(struct cw_Conn *conn, struct cw_action_in *a,
|
int cw_in_capwap_local_ipv6_address(struct conn *conn, struct cw_action_in *a,
|
||||||
uint8_t * data, int len,struct sockaddr *from)
|
uint8_t * data, int len,struct sockaddr *from)
|
||||||
{
|
{
|
||||||
struct sockaddr_in6 addr;
|
struct sockaddr_in6 addr;
|
||||||
|
32
src/cw/cw_in_check_cfg_update_req.c
Normal file
32
src/cw/cw_in_check_cfg_update_req.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#include "capwap.h"
|
||||||
|
#include "intavltree.h"
|
||||||
|
#include "dbg.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
|
||||||
|
int cw_in_check_cfg_update_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
|
||||||
|
int len,struct sockaddr *from)
|
||||||
|
{
|
||||||
|
|
||||||
|
/*cw_action_in_t * mlist[60];*/
|
||||||
|
|
||||||
|
/* Check for mandatory elements */
|
||||||
|
/* int n = cw_check_missing_mand(mlist,conn,a);
|
||||||
|
if (n) {
|
||||||
|
if ( conn->strict_capwap ){
|
||||||
|
cw_dbg_missing_mand(DBG_MSG_ERR,conn,mlist,n,a);
|
||||||
|
conn->capwap_state=CAPWAP_STATE_JOIN;
|
||||||
|
return CW_RESULT_MISSING_MAND_ELEM;
|
||||||
|
}
|
||||||
|
cw_dbg_missing_mand(DBG_RFC,conn,mlist,n,a);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* set result code to ok and change to configure state */
|
||||||
|
/*mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);*/
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -8,43 +8,14 @@ int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams *
|
|||||||
uint8_t * elem_data, int elem_len)
|
uint8_t * elem_data, int elem_len)
|
||||||
{
|
{
|
||||||
cw_Val_t * result;
|
cw_Val_t * result;
|
||||||
cw_Val_t val;
|
|
||||||
cw_Type_t * type;
|
|
||||||
int n;
|
|
||||||
char strval[2048];
|
|
||||||
|
|
||||||
memset(&val,0,sizeof(cw_Val_t));
|
if (!handler->type){
|
||||||
|
|
||||||
|
|
||||||
type = (cw_Type_t*)handler->type;
|
|
||||||
|
|
||||||
if (!type){
|
|
||||||
cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name);
|
cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name);
|
||||||
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
|
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
type->read(params->local_cfg, handler->key,elem_data,elem_len,handler->param);
|
result = cw_ktv_add(params->remote_cfg, handler->key,
|
||||||
|
handler->type,NULL, elem_data,elem_len);
|
||||||
|
params->elem=result;
|
||||||
// exit(0);
|
|
||||||
|
|
||||||
/* if (!result){
|
|
||||||
cw_log(LOG_ERR, "Can't create kvstore element for key %s of type %s: %s",
|
|
||||||
handler->key,type->name, strerror(errno));
|
|
||||||
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// n = type->to_str(&val,strval,2048);
|
|
||||||
|
|
||||||
// printf("SETTING: %s: %s (%d)\n",handler->key,strval,n);
|
|
||||||
|
|
||||||
|
|
||||||
// result = cw_ktv_add(params->remote_cfg, handler->key,
|
|
||||||
// handler->type,NULL, elem_data,elem_len);
|
|
||||||
// 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;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
|
||||||
int cw_in_wtp_reboot_statistics(struct cw_Conn *conn, struct cw_action_in *a, uint8_t * data,
|
int cw_in_wtp_reboot_statistics(struct conn *conn, struct cw_action_in *a, uint8_t * data,
|
||||||
int len, struct sockaddr *from)
|
int len, struct sockaddr *from)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
* alread initilaized in buffer
|
* alread initilaized in buffer
|
||||||
* Message alements are taken fom actiondef in #conn->action
|
* Message alements are taken fom actiondef in #conn->action
|
||||||
*/
|
*/
|
||||||
int cw_put_msg(struct cw_Conn *conn, uint8_t * rawout)
|
int cw_put_msg(struct conn *conn, uint8_t * rawout)
|
||||||
{
|
{
|
||||||
char details[1024];
|
char details[1024];
|
||||||
uint8_t *msgptr,*dst;
|
uint8_t *msgptr,*dst;
|
||||||
@ -45,7 +45,6 @@ int cw_put_msg(struct cw_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");*/
|
||||||
|
|
||||||
@ -105,7 +104,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;
|
||||||
@ -174,7 +173,7 @@ printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
int cw_put_custom_msg(struct cw_Conn *conn, uint8_t * rawout, /*mavl_conststr_t elems*/ int t)
|
int cw_put_custom_msg(struct conn *conn, uint8_t * rawout, /*mavl_conststr_t elems*/ int t)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -22,12 +22,12 @@
|
|||||||
#include "keys.h"
|
#include "keys.h"
|
||||||
|
|
||||||
|
|
||||||
int cw_read_descriptor_subelems(mavl_t cfg, const char *parent_key,
|
int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key,
|
||||||
uint8_t * data, int len,
|
uint8_t * data, int len,
|
||||||
struct cw_DescriptorSubelemDef *elems)
|
struct cw_DescriptorSubelemDef *elems)
|
||||||
{
|
{
|
||||||
uint32_t vendor_id;
|
uint32_t vendor_id;
|
||||||
int sublen, subtype;
|
int sublen,subtype;
|
||||||
int errors = 0;
|
int errors = 0;
|
||||||
int success = 0;
|
int success = 0;
|
||||||
int sub = 0;
|
int sub = 0;
|
||||||
@ -41,17 +41,18 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char *parent_key,
|
|||||||
sublen = cw_get_word(data + sub + 6);
|
sublen = cw_get_word(data + sub + 6);
|
||||||
subtype = cw_get_word(data + sub + 4);
|
subtype = cw_get_word(data + sub + 4);
|
||||||
|
|
||||||
|
|
||||||
/* search sub-element */
|
/* search sub-element */
|
||||||
for (i = 0; elems[i].maxlen; i++) {
|
for (i = 0; elems[i].maxlen; i++) {
|
||||||
if (elems[i].type == subtype)
|
|
||||||
|
if (elems[i].type == subtype /* && elems[i].vendor_id==vendor_id*/)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!elems[i].maxlen) {
|
if (!elems[i].maxlen) {
|
||||||
/* cw_dbg_version_subelem(DBG_ELEM_ERR,
|
cw_dbg_version_subelem(DBG_ELEM_ERR, "Can't handle sub-elem, vendor or type unknown",
|
||||||
"Can't handle sub-elem, vendor or type unknown",
|
subtype, vendor_id, data+sub+8, sublen);
|
||||||
subtype, vendor_id,
|
|
||||||
data + sub + 8, sublen);*/
|
|
||||||
errors++;
|
errors++;
|
||||||
} else {
|
} else {
|
||||||
int l = sublen;
|
int l = sublen;
|
||||||
@ -68,24 +69,15 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char *parent_key,
|
|||||||
|
|
||||||
|
|
||||||
/* vendor */
|
/* vendor */
|
||||||
sprintf(key, "%s/%s/%s", parent_key, elems[i].key,
|
sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_SKEY_VENDOR);
|
||||||
CW_SKEY_VENDOR);
|
cw_ktv_add(cfg,key,CW_TYPE_DWORD,NULL,data + sub,4);
|
||||||
cw_cfg_set_int(cfg, key, vendor_id);
|
|
||||||
|
|
||||||
|
|
||||||
/* version */
|
/* version */
|
||||||
sprintf(key, "%s/%s/%s", parent_key, elems[i].key,
|
sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_SKEY_VERSION);
|
||||||
CW_SKEY_VERSION);
|
cw_ktv_add(cfg,key,CW_TYPE_BSTR16,NULL,data+sub+8,l);
|
||||||
|
|
||||||
CW_TYPE_BSTR16->read(cfg,key,data+sub+8,l,NULL);
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(dbgstr, "%s", key);
|
sprintf(dbgstr, "%s", key);
|
||||||
|
cw_dbg_version_subelem(DBG_SUBELEM, dbgstr, subtype, vendor_id, data+sub+8,l);
|
||||||
|
|
||||||
|
|
||||||
/* cw_dbg_version_subelem(DBG_SUBELEM, dbgstr, subtype,
|
|
||||||
vendor_id, data + sub + 8, l);*/
|
|
||||||
success++;
|
success++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
|
||||||
int cw_read_from(struct cw_Conn *conn, struct sockaddr_storage *from)
|
int cw_read_from(struct conn *conn, struct sockaddr_storage *from)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
uint8_t buf[2024];
|
uint8_t buf[2024];
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ static struct cw_DescriptorSubelemDef allowed_default[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int cw_read_wtp_descriptor(mavl_t cfg, struct cw_Conn *conn,
|
int cw_read_wtp_descriptor(mavl_t cfg, struct conn *conn,
|
||||||
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
||||||
struct cw_DescriptorSubelemDef *allowed)
|
struct cw_DescriptorSubelemDef *allowed)
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,7 @@ static struct cw_DescriptorSubelemDef allowed_default[] = {
|
|||||||
/**
|
/**
|
||||||
* Read WTP Descriptor in Cisco-Style (Draft 7)
|
* Read WTP Descriptor in Cisco-Style (Draft 7)
|
||||||
*/
|
*/
|
||||||
int cw_read_wtp_descriptor_7(mavl_t cfg, struct cw_Conn *conn,
|
int cw_read_wtp_descriptor_7(mavl_t cfg, struct conn *conn,
|
||||||
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
||||||
struct cw_DescriptorSubelemDef *allowed)
|
struct cw_DescriptorSubelemDef *allowed)
|
||||||
{
|
{
|
||||||
@ -30,10 +30,11 @@ int cw_read_wtp_descriptor_7(mavl_t cfg, struct cw_Conn *conn,
|
|||||||
char key[64];
|
char key[64];
|
||||||
|
|
||||||
sprintf(key,"%s/%s",eh->key, CW_SKEY_MAX_RADIOS);
|
sprintf(key,"%s/%s",eh->key, CW_SKEY_MAX_RADIOS);
|
||||||
cw_cfg_set_int(cfg,key,cw_get_byte(data));
|
cw_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data,1);
|
||||||
|
|
||||||
sprintf(key,"%s/%s",eh->key, CW_SKEY_RADIOS_IN_USE);
|
sprintf(key,"%s/%s",eh->key, CW_SKEY_RADIOS_IN_USE);
|
||||||
cw_cfg_set_int(cfg,key,cw_get_byte(data+1));
|
cw_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data+1,1);
|
||||||
|
|
||||||
|
|
||||||
pos = 2;
|
pos = 2;
|
||||||
|
|
||||||
|
@ -1,17 +1,15 @@
|
|||||||
#include "cw.h"
|
#include "cw.h"
|
||||||
#include "cfg.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int get_psk(struct cw_Conn *conn, const char *username, uint8_t ** psk,
|
static int get_psk(struct conn * conn,const char * username, uint8_t **psk, unsigned int *len)
|
||||||
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;
|
||||||
@ -35,46 +33,45 @@ static int get_psk(struct cw_Conn *conn, const char *username, uint8_t ** psk,
|
|||||||
* @param default_cipher
|
* @param default_cipher
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int cw_setup_dtls(struct cw_Conn *conn, mavl_t cfg, const char *prefix,
|
int cw_setup_dtls(struct conn * conn, mavl_t cfg, const char *prefix, char * default_cipher)
|
||||||
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_cfg_get(cfg, key, default_cipher);
|
conn->dtls_cipher = cw_ktv_get_str(cfg,key, default_cipher);
|
||||||
|
|
||||||
|
|
||||||
sprintf(key, "%s/%s", prefix, "ssl-psk");
|
sprintf(key,"%s/%s",prefix,"ssl-psk");
|
||||||
conn->dtls_psk = cw_cfg_get(cfg, key, NULL);
|
conn->dtls_psk = cw_ktv_get_bstr16(cfg,key,NULL);
|
||||||
|
|
||||||
sprintf(key, "%s/%s", prefix, "ssl-psk-enable");
|
sprintf(key,"%s/%s",prefix,"ssl-psk-enable");
|
||||||
conn->dtls_psk_enable = cw_cfg_get_bool(cfg, key, "flase");
|
conn->dtls_psk_enable = cw_ktv_get_bool(cfg,key,0);
|
||||||
|
|
||||||
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_cfg_get(conn->local_cfg, key, NULL);
|
ssl_cert = cw_ktv_get_str(conn->local_cfg,key,NULL);
|
||||||
sprintf(key, "%s/%s", prefix, "ssl-keyfile");
|
sprintf(key,"%s/%s",prefix,"ssl-keyfile");
|
||||||
ssl_key = cw_cfg_get(conn->local_cfg, key, NULL);
|
ssl_key = cw_ktv_get_str(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_cfg_get(cfg, key, NULL);
|
conn->dtls_key_pass = cw_ktv_get_str(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_cfg_get_word(cfg, key, "1024");
|
conn->dtls_dhbits = cw_ktv_get_word(cfg,key,1024);
|
||||||
|
|
||||||
conn->dtls_get_psk = get_psk;
|
conn->dtls_get_psk = get_psk;
|
||||||
|
|
||||||
|
@ -104,32 +104,6 @@ static int cast(cw_Val_t * data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bread(cw_Cfg_t *cfg, const char * key, const uint8_t *src, int len, void *param)
|
|
||||||
{
|
|
||||||
char *d, *dst;
|
|
||||||
dst = malloc(len*2+3);
|
|
||||||
if (dst==NULL)
|
|
||||||
return 0;
|
|
||||||
d=dst;
|
|
||||||
|
|
||||||
if ( format_is_utf8 ( src, len) ) {
|
|
||||||
d += sprintf ( d, "%.*s", len, src );
|
|
||||||
|
|
||||||
} else {
|
|
||||||
d += sprintf ( d, ".x" );
|
|
||||||
d += format_hex ( d, src,len);
|
|
||||||
}
|
|
||||||
|
|
||||||
cw_cfg_set(cfg,key,dst);
|
|
||||||
free(dst);
|
|
||||||
return d - dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int bwrite(cw_Cfg_t *cfg, const char *key, const uint8_t *dst, void * param)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const struct cw_Type cw_type_bstr16 = {
|
const struct cw_Type cw_type_bstr16 = {
|
||||||
"Bstr16", /* name */
|
"Bstr16", /* name */
|
||||||
@ -141,10 +115,7 @@ const struct cw_Type cw_type_bstr16 = {
|
|||||||
len, /* len */
|
len, /* len */
|
||||||
data, /* data */
|
data, /* data */
|
||||||
get_type_name, /* get_type_name */
|
get_type_name, /* get_type_name */
|
||||||
cast, /* cast */
|
cast /* cast */
|
||||||
bread,
|
|
||||||
bwrite
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,9 +35,6 @@ static int put(const cw_Val_t *data, uint8_t * dst)
|
|||||||
|
|
||||||
static const char * get_guardstr(int val, const cw_ValValRange_t * valrange)
|
static const char * get_guardstr(int val, const cw_ValValRange_t * valrange)
|
||||||
{
|
{
|
||||||
if (valrange==NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
while(valrange->name!=NULL){
|
while(valrange->name!=NULL){
|
||||||
if(val>=valrange->min && val<=valrange->max)
|
if(val>=valrange->min && val<=valrange->max)
|
||||||
return valrange->name;
|
return valrange->name;
|
||||||
@ -124,26 +121,6 @@ static int cast(cw_Val_t * data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bread(cw_Cfg_t *cfg, const char * key, const uint8_t *src, int len, void *param)
|
|
||||||
{
|
|
||||||
uint8_t val;
|
|
||||||
cw_ValValRange_t * valrange = (cw_ValValRange_t *) param;
|
|
||||||
const char *str;
|
|
||||||
|
|
||||||
val = cw_get_byte(src);
|
|
||||||
str = get_guardstr(val, valrange);
|
|
||||||
if (str != NULL)
|
|
||||||
cw_cfg_set(cfg,key,str);
|
|
||||||
else
|
|
||||||
cw_cfg_set_int(cfg,key,val);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int bwrite(cw_Cfg_t *cfg, const char *key, const uint8_t *dst, void * param)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct cw_Type cw_type_byte = {
|
const struct cw_Type cw_type_byte = {
|
||||||
"Byte", /* name */
|
"Byte", /* name */
|
||||||
@ -155,8 +132,5 @@ const struct cw_Type cw_type_byte = {
|
|||||||
len, /* len */
|
len, /* len */
|
||||||
data, /* data */
|
data, /* data */
|
||||||
get_type_name, /* get_type_name */
|
get_type_name, /* get_type_name */
|
||||||
cast,
|
cast
|
||||||
bread,
|
|
||||||
bwrite
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -1,95 +0,0 @@
|
|||||||
#include "cw.h"
|
|
||||||
#include "val.h"
|
|
||||||
|
|
||||||
|
|
||||||
static int read_struct(cw_Cfg_t * cfg,const cw_ValStruct_t * stru, const char *pkey,
|
|
||||||
const uint8_t * data, int len)
|
|
||||||
{
|
|
||||||
char key[CW_KTV_MAX_KEY_LEN];
|
|
||||||
int pos, i,l;
|
|
||||||
|
|
||||||
|
|
||||||
pos=0; i=0;
|
|
||||||
while (stru[i].type != NULL){
|
|
||||||
if(stru[i].position!=-1)
|
|
||||||
pos=stru[i].position;
|
|
||||||
|
|
||||||
if (stru[i].key!=NULL)
|
|
||||||
sprintf(key,"%s/%s",pkey,stru[i].key);
|
|
||||||
else
|
|
||||||
sprintf(key,"%s",pkey);
|
|
||||||
|
|
||||||
switch (stru[i].len){
|
|
||||||
case CW_STRUCT_LEN_BYTE:
|
|
||||||
/* read len from next byte */
|
|
||||||
l = cw_get_byte(data+pos);
|
|
||||||
pos ++;
|
|
||||||
break;
|
|
||||||
case CW_STRUCT_LEN_WORD:
|
|
||||||
/* read len from next word */
|
|
||||||
l = cw_get_word(data+pos);
|
|
||||||
pos ++;
|
|
||||||
break;
|
|
||||||
case -1:
|
|
||||||
l = len-pos;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
l = stru[i].len;
|
|
||||||
if (pos+l > len){
|
|
||||||
l = len-pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
l=stru[i].type->read(cfg,key,data+pos,l,stru[i].valguard);
|
|
||||||
|
|
||||||
// result = cw_ktv_add(ktv,key,stru[i].type,stru[i].valguard,data+pos,l);
|
|
||||||
|
|
||||||
// stru[i].type->to_str(result,dbstr,100);
|
|
||||||
// cw_dbg(DBG_ELEM_DETAIL, "Read (%d): %s: %s",pos,key,dbstr);
|
|
||||||
// printf("READ STRUCT (%d): %s: %s\n",pos,key,dbstr);
|
|
||||||
|
|
||||||
if (stru[i].len==-1){
|
|
||||||
///l = result->type->len(result);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
l = stru[i].len;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(stru[i].position == -1)
|
|
||||||
pos+=l;
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int bread(cw_Cfg_t *cfg, const char * key, const uint8_t *src, int len, const void *param)
|
|
||||||
{
|
|
||||||
cw_ValStruct_t * stru = (cw_ValStruct_t *) param;
|
|
||||||
|
|
||||||
read_struct(cfg,stru,key,src,len);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const struct cw_Type cw_type_struct = {
|
|
||||||
"Byte", /* name */
|
|
||||||
NULL, /* del */
|
|
||||||
NULL, /* put */
|
|
||||||
NULL, /* get */
|
|
||||||
NULL, /* to_str */
|
|
||||||
NULL, /* from_str */
|
|
||||||
NULL, /* len */
|
|
||||||
NULL, /* data */
|
|
||||||
NULL, /* get_type_name */
|
|
||||||
NULL,
|
|
||||||
bread,
|
|
||||||
NULL
|
|
||||||
|
|
||||||
};
|
|
101
src/cw/dbg.c
101
src/cw/dbg.c
@ -133,9 +133,6 @@ static struct cw_StrListElem prefix[] = {
|
|||||||
{DBG_WARN, " Warning - "},
|
{DBG_WARN, " Warning - "},
|
||||||
{DBG_MOD, " Mod - "},
|
{DBG_MOD, " Mod - "},
|
||||||
{DBG_STATE, " State - "},
|
{DBG_STATE, " State - "},
|
||||||
{DBG_CFG_SET, " Cfg Set - "},
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{DBG_X, "XXXXX - "},
|
{DBG_X, "XXXXX - "},
|
||||||
|
|
||||||
@ -211,7 +208,7 @@ static void cw_dbg_vlog_line(struct cw_LogWriter * writer,
|
|||||||
/**
|
/**
|
||||||
* Put a list of missing mandatory message elements to debug output
|
* Put a list of missing mandatory message elements to debug output
|
||||||
*/
|
*/
|
||||||
void cw_dbg_missing_mand(int level, struct cw_Conn *conn, int ** ml, int n,
|
void cw_dbg_missing_mand(int level, struct conn *conn, int ** ml, int n,
|
||||||
int * a)
|
int * a)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -246,7 +243,7 @@ void cw_dbg_missing_mand(int level, struct cw_Conn *conn, int ** ml, int n,
|
|||||||
/**
|
/**
|
||||||
* Display a packet on for debugger
|
* Display a packet on for debugger
|
||||||
*/
|
*/
|
||||||
void cw_dbg_pkt(int level, struct cw_Conn *conn, uint8_t * packet, int len,
|
void cw_dbg_pkt(int level, struct conn *conn, uint8_t * packet, int len,
|
||||||
struct sockaddr *from)
|
struct sockaddr *from)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -308,7 +305,7 @@ void cw_dbg_dmp(int level, const uint8_t * data, int len, const char *format, ..
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cw_dbg_msg(int level, struct cw_Conn *conn, uint8_t * packet, int len,
|
void cw_dbg_msg(int level, struct conn *conn, uint8_t * packet, int len,
|
||||||
struct sockaddr *from)
|
struct sockaddr *from)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -363,6 +360,96 @@ void cw_dbg_msg(int level, struct cw_Conn *conn, uint8_t * packet, int len,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
static int cw_format_vendor(char *dst, uint32_t vendor_id, int elem_id,
|
||||||
|
const uint8_t * elem_data)
|
||||||
|
{
|
||||||
|
uint32_t lw_elem_id;
|
||||||
|
switch (vendor_id) {
|
||||||
|
case CW_VENDOR_ID_CISCO:
|
||||||
|
{
|
||||||
|
if (elem_id != CW_CISCO_SPAM_VENDOR_SPECIFIC) {
|
||||||
|
return sprintf(dst, "%d - %s", elem_id,
|
||||||
|
cw_cisco_id_to_str(elem_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// dive into LWAPP vendor specific decoding
|
||||||
|
lw_elem_id = lw_get_word(elem_data + 4 + 6);
|
||||||
|
return sprintf(dst, "%d/LWAPP Vendor: %d - %s",
|
||||||
|
elem_id,
|
||||||
|
lw_elem_id, lw_cisco_id_to_str(lw_elem_id));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return sprintf(dst, "%d", elem_id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cw_dbg_version_subelem(int level, const char *context, int subtype,
|
||||||
|
uint32_t vendor_id, const uint8_t * vstr, int len)
|
||||||
|
{
|
||||||
|
char v[2048];
|
||||||
|
int n;
|
||||||
|
|
||||||
|
if (!cw_dbg_is_level(level))
|
||||||
|
return;
|
||||||
|
if (!vstr)
|
||||||
|
return;
|
||||||
|
n = cw_format_version(v, vstr, len);
|
||||||
|
|
||||||
|
sprintf(v + n, ", Vendor Id: %d, %s", vendor_id, cw_strvendor(vendor_id));
|
||||||
|
|
||||||
|
cw_dbg(level, "%s: SubType %d, %s", context, subtype, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void cw_dbgv(struct cw_LogWriter *writer, int level, const char * format, va_list args)
|
||||||
|
{
|
||||||
|
char fbuf[1024];
|
||||||
|
|
||||||
|
if (writer->colored ){
|
||||||
|
sprintf(fbuf, "DBG:%s%s %s%s%s",
|
||||||
|
get_dbg_color_on(level),
|
||||||
|
get_dbg_prefix(level),
|
||||||
|
get_dbg_color_ontext(level), format, get_dbg_color_off(level)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sprintf(fbuf, "DBG:%s %s",
|
||||||
|
get_dbg_prefix(level), format);
|
||||||
|
}
|
||||||
|
|
||||||
|
writer->write(LOG_DEBUG,fbuf,args,&cw_log_console_writer);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
void cw_dbgv1(struct cw_LogWriter *writer, int level, const char * format, ...){
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
cw_dbgv(writer,level,format,args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
void cw_dbg(int level, const char *format, ...){
|
void cw_dbg(int level, const char *format, ...){
|
||||||
int i;
|
int i;
|
||||||
@ -383,7 +470,7 @@ void cw_dbg(int level, const char *format, ...){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cw_dbg_elem(int level, struct cw_Conn *conn, int msg,
|
void cw_dbg_elem(int level, struct conn *conn, int msg,
|
||||||
struct cw_ElemHandler * handler, const uint8_t * msgbuf, int len)
|
struct cw_ElemHandler * handler, const uint8_t * msgbuf, int len)
|
||||||
{
|
{
|
||||||
char vendorname[256];
|
char vendorname[256];
|
||||||
|
18
src/cw/dbg.h
18
src/cw/dbg.h
@ -115,8 +115,6 @@ enum cw_dbg_levels{
|
|||||||
|
|
||||||
DBG_CFG_DMP,
|
DBG_CFG_DMP,
|
||||||
|
|
||||||
DBG_CFG_SET,
|
|
||||||
|
|
||||||
/** Debug Mods */
|
/** Debug Mods */
|
||||||
DBG_MOD,
|
DBG_MOD,
|
||||||
|
|
||||||
@ -149,14 +147,14 @@ void cw_dbg_set_level (int level, int on);
|
|||||||
int cw_dbg_set_level_from_str(const char *level);
|
int cw_dbg_set_level_from_str(const char *level);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void cw_dbg_elem_(struct cw_Conn * conn, int msg, int msgelem, const uint8_t * msgbuf, int len);
|
void cw_dbg_elem_(struct conn * conn, int msg, int msgelem, const uint8_t * msgbuf, int len);
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
void cw_dbg_missing_mand(int level,struct cw_Conn *conn,cw_action_in_t ** ml,int n,cw_action_in_t *a);
|
void cw_dbg_missing_mand(int level,struct conn *conn,cw_action_in_t ** ml,int n,cw_action_in_t *a);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void cw_dbg_packet(struct cw_Conn *conn, uint8_t * packet, int len);
|
void cw_dbg_packet(struct conn *conn, uint8_t * packet, int len);
|
||||||
void cw_dbg_pkt(int level,struct cw_Conn *conn, uint8_t * packet, int len,struct sockaddr *from);
|
void cw_dbg_pkt(int level,struct conn *conn, uint8_t * packet, int len,struct sockaddr *from);
|
||||||
void cw_dbg(int level, const char *format, ...);
|
void cw_dbg(int level, const char *format, ...);
|
||||||
void cw_dbg_dmp(int level, const uint8_t * data, int len, const char *format, ...);
|
void cw_dbg_dmp(int level, const uint8_t * data, int len, const char *format, ...);
|
||||||
|
|
||||||
@ -201,16 +199,16 @@ void cw_dbg_dmp_(int level, const uint8_t * data, int len, const char *format, .
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cw_dbg_elem(int level, struct cw_Conn *conn, int msg,
|
void cw_dbg_elem(int level, struct conn *conn, int msg,
|
||||||
struct cw_ElemHandler * handler, const uint8_t * msgbuf, int len);
|
struct cw_ElemHandler * handler, const uint8_t * msgbuf, int len);
|
||||||
|
|
||||||
|
|
||||||
void cw_dbg_pkt_nc(int level,struct netconn *nc, uint8_t * packet, int len,struct sockaddr *from);
|
void cw_dbg_pkt_nc(int level,struct netconn *nc, uint8_t * packet, int len,struct sockaddr *from);
|
||||||
|
|
||||||
void cw_dbg_msg(int level,struct cw_Conn *conn, uint8_t * packet, int len,struct sockaddr *from);
|
void cw_dbg_msg(int level,struct conn *conn, uint8_t * packet, int len,struct sockaddr *from);
|
||||||
char * cw_dbg_mkdmp(const uint8_t * data, int len);
|
char * cw_dbg_mkdmp(const uint8_t * data, int len);
|
||||||
//void cw_dbg_version_subelem(int level, const char *context, int subtype,
|
void cw_dbg_version_subelem(int level, const char *context, int subtype,
|
||||||
// uint32_t vendor_id, const uint8_t * vstr, int len);
|
uint32_t vendor_id, const uint8_t * vstr, int len);
|
||||||
void cw_dbg_ktv_dump(mavl_t ktv, uint32_t dbglevel,
|
void cw_dbg_ktv_dump(mavl_t ktv, uint32_t dbglevel,
|
||||||
const char *header, const char *prefix, const char *footer );
|
const char *header, const char *prefix, const char *footer );
|
||||||
|
|
||||||
|
@ -63,9 +63,6 @@ struct cw_StrListElem cw_dbg_strings[] = {
|
|||||||
{ DBG_DTLS_BIO_DMP, "dtls_bio_dmp"},
|
{ DBG_DTLS_BIO_DMP, "dtls_bio_dmp"},
|
||||||
{ DBG_DTLS_DETAIL, "dtls_detail"},
|
{ DBG_DTLS_DETAIL, "dtls_detail"},
|
||||||
|
|
||||||
{ DBG_CFG_SET, "cfg_set" },
|
|
||||||
|
|
||||||
|
|
||||||
{DBG_CFG_DMP, "cfg_dmp" },
|
{DBG_CFG_DMP, "cfg_dmp" },
|
||||||
|
|
||||||
{ DBG_WARN, "warn" },
|
{ DBG_WARN, "warn" },
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
* @param maxlen maximum number of bytes to read
|
* @param maxlen maximum number of bytes to read
|
||||||
* @return the number of bytes read
|
* @return the number of bytes read
|
||||||
*/
|
*/
|
||||||
int dtls_bio_read(struct cw_Conn *conn, char *out, int maxlen)
|
int dtls_bio_read(struct conn *conn, char *out, int maxlen)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
if (conn->dtls_buffer_len == 0) {
|
if (conn->dtls_buffer_len == 0) {
|
||||||
@ -75,7 +75,7 @@ int dtls_bio_read(struct cw_Conn *conn, char *out, int maxlen)
|
|||||||
* @param len number of bytes to write
|
* @param len number of bytes to write
|
||||||
* @return the number of bytes written
|
* @return the number of bytes written
|
||||||
*/
|
*/
|
||||||
int dtls_bio_write(struct cw_Conn *conn, const char *data, int len)
|
int dtls_bio_write(struct conn *conn, const char *data, int len)
|
||||||
{
|
{
|
||||||
uint8_t buffer[4096];
|
uint8_t buffer[4096];
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -217,7 +217,7 @@ void dtls_openssl_data_destroy(struct dtls_openssl_data * d){
|
|||||||
free(d);
|
free(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dtls_openssl_set_certs(struct cw_Conn * conn, struct dtls_openssl_data *d)
|
int dtls_openssl_set_certs(struct conn * conn, struct dtls_openssl_data *d)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
if (conn->dtls_key_file && conn->dtls_cert_file){
|
if (conn->dtls_key_file && conn->dtls_cert_file){
|
||||||
@ -255,7 +255,7 @@ int dtls_openssl_set_certs(struct cw_Conn * conn, struct dtls_openssl_data *d)
|
|||||||
int generate_session_id(const SSL *ssl, unsigned char * id, unsigned int *id_len)
|
int generate_session_id(const SSL *ssl, unsigned char * id, unsigned int *id_len)
|
||||||
{
|
{
|
||||||
/* BIO * b = SSL_get_rbio(ssl);
|
/* BIO * b = SSL_get_rbio(ssl);
|
||||||
struct cw_Conn * conn = b->ptr;
|
struct conn * conn = b->ptr;
|
||||||
*/
|
*/
|
||||||
const char * sessid = "9123456789";
|
const char * sessid = "9123456789";
|
||||||
/* printf ("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMaking session id\n");*/
|
/* printf ("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMaking session id\n");*/
|
||||||
@ -292,7 +292,7 @@ return 1;
|
|||||||
static unsigned int psk_server_cb(SSL *ssl,const char *identity, unsigned char * psk, unsigned int max_psk_len)
|
static unsigned int psk_server_cb(SSL *ssl,const char *identity, unsigned char * psk, unsigned int max_psk_len)
|
||||||
{
|
{
|
||||||
BIO * b = SSL_get_rbio(ssl);
|
BIO * b = SSL_get_rbio(ssl);
|
||||||
struct cw_Conn * conn = BIO_get_data(b); /*->ptr;*/
|
struct conn * conn = BIO_get_data(b); /*->ptr;*/
|
||||||
|
|
||||||
int l = bstr16_len(conn->dtls_psk) < max_psk_len ? bstr16_len(conn->dtls_psk) : max_psk_len;
|
int l = bstr16_len(conn->dtls_psk) < max_psk_len ? bstr16_len(conn->dtls_psk) : max_psk_len;
|
||||||
memcpy(psk,conn->dtls_psk,l);
|
memcpy(psk,conn->dtls_psk,l);
|
||||||
@ -304,7 +304,7 @@ static unsigned int psk_server_cb(SSL *ssl,const char *identity, unsigned char *
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct dtls_openssl_data * dtls_openssl_data_create(struct cw_Conn * conn, const SSL_METHOD * method, BIO_METHOD * bio)
|
struct dtls_openssl_data * dtls_openssl_data_create(struct conn * conn, const SSL_METHOD * method, BIO_METHOD * bio)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct dtls_openssl_data * d = malloc(sizeof(struct dtls_openssl_data));
|
struct dtls_openssl_data * d = malloc(sizeof(struct dtls_openssl_data));
|
||||||
@ -507,7 +507,7 @@ out_err:
|
|||||||
/*//#include <socket.h>*/
|
/*//#include <socket.h>*/
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
int dtls_openssl_shutdown(struct cw_Conn *conn)
|
int dtls_openssl_shutdown(struct conn *conn)
|
||||||
{
|
{
|
||||||
struct dtls_openssl_data * d ;
|
struct dtls_openssl_data * d ;
|
||||||
|
|
||||||
@ -552,7 +552,7 @@ int dtls_openssl_generate_cookie(SSL *ssl, unsigned char *cookie, unsigned int *
|
|||||||
char sock_buf2[SOCK_ADDR_BUFSIZE];
|
char sock_buf2[SOCK_ADDR_BUFSIZE];
|
||||||
|
|
||||||
BIO * b = SSL_get_rbio(ssl);
|
BIO * b = SSL_get_rbio(ssl);
|
||||||
struct cw_Conn * conn = BIO_get_data(b); /*b->ptr;*/
|
struct conn * conn = BIO_get_data(b); /*b->ptr;*/
|
||||||
|
|
||||||
cw_rand(conn->dtls_cookie,sizeof(conn->dtls_cookie));
|
cw_rand(conn->dtls_cookie,sizeof(conn->dtls_cookie));
|
||||||
|
|
||||||
@ -571,8 +571,8 @@ int dtls_openssl_verify_cookie(SSL *ssl, const unsigned char *cookie, unsigned i
|
|||||||
char sock_buf[SOCK_ADDR_BUFSIZE];
|
char sock_buf[SOCK_ADDR_BUFSIZE];
|
||||||
char sock_buf2[SOCK_ADDR_BUFSIZE];
|
char sock_buf2[SOCK_ADDR_BUFSIZE];
|
||||||
BIO * b = SSL_get_rbio(ssl);
|
BIO * b = SSL_get_rbio(ssl);
|
||||||
/*struct cw_Conn * conn = b->ptr;*/
|
/*struct conn * conn = b->ptr;*/
|
||||||
struct cw_Conn * conn = BIO_get_data(b); /*b->ptr;*/
|
struct conn * conn = BIO_get_data(b); /*b->ptr;*/
|
||||||
|
|
||||||
cw_dbg(DBG_DTLS,"Verifying DTLS cookie from %s: %s",
|
cw_dbg(DBG_DTLS,"Verifying DTLS cookie from %s: %s",
|
||||||
sock_addr2str(&conn->addr,sock_buf),sock_hwaddr2idstr(conn->dtls_cookie,len,sock_buf2));
|
sock_addr2str(&conn->addr,sock_buf),sock_hwaddr2idstr(conn->dtls_cookie,len,sock_buf2));
|
||||||
@ -588,7 +588,7 @@ int dtls_openssl_verify_cookie(SSL *ssl, const unsigned char *cookie, unsigned i
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int dtls_openssl_read(struct cw_Conn * conn, uint8_t *buffer, int len)
|
int dtls_openssl_read(struct conn * conn, uint8_t *buffer, int len)
|
||||||
{
|
{
|
||||||
struct dtls_openssl_data * d = conn->dtls_data;
|
struct dtls_openssl_data * d = conn->dtls_data;
|
||||||
int rc = SSL_read(d->ssl,buffer,len);
|
int rc = SSL_read(d->ssl,buffer,len);
|
||||||
@ -599,7 +599,7 @@ int dtls_openssl_read(struct cw_Conn * conn, uint8_t *buffer, int len)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dtls_openssl_write(struct cw_Conn * conn, const uint8_t *buffer, int len)
|
int dtls_openssl_write(struct conn * conn, const uint8_t *buffer, int len)
|
||||||
{
|
{
|
||||||
struct dtls_openssl_data * d = conn->dtls_data;
|
struct dtls_openssl_data * d = conn->dtls_data;
|
||||||
int rc = SSL_write(d->ssl,buffer,len);
|
int rc = SSL_write(d->ssl,buffer,len);
|
||||||
|
@ -48,20 +48,20 @@ extern int dtls_openssl_init();
|
|||||||
#define CAPWAP_CIPHER "ALL"
|
#define CAPWAP_CIPHER "ALL"
|
||||||
|
|
||||||
|
|
||||||
struct dtls_openssl_data * dtls_openssl_data_create(struct cw_Conn * conn, const SSL_METHOD * method, BIO_METHOD * bio);
|
struct dtls_openssl_data * dtls_openssl_data_create(struct conn * conn, const SSL_METHOD * method, BIO_METHOD * bio);
|
||||||
extern int dtls_openssl_psk_key2bn(const char *psk_key, unsigned char *psk, unsigned int max_psk_len);
|
extern int dtls_openssl_psk_key2bn(const char *psk_key, unsigned char *psk, unsigned int max_psk_len);
|
||||||
extern int dtls_openssl_generate_cookie(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len);
|
extern int dtls_openssl_generate_cookie(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len);
|
||||||
extern int dtls_openssl_verify_cookie(SSL *ssl, const unsigned char *cookie, unsigned int cookie_len);
|
extern int dtls_openssl_verify_cookie(SSL *ssl, const unsigned char *cookie, unsigned int cookie_len);
|
||||||
|
|
||||||
extern int dtls_openssl_read(struct cw_Conn * conn, uint8_t *buffer, int len);
|
extern int dtls_openssl_read(struct conn * conn, uint8_t *buffer, int len);
|
||||||
extern int dtls_openssl_write(struct cw_Conn * conn, const uint8_t *buffer, int len);
|
extern int dtls_openssl_write(struct conn * conn, const uint8_t *buffer, int len);
|
||||||
extern int dtls_openssl_connect(struct cw_Conn * conn);
|
extern int dtls_openssl_connect(struct conn * conn);
|
||||||
extern const char * dtls_openssl_get_cipher(struct cw_Conn * conn, char *dst);
|
extern const char * dtls_openssl_get_cipher(struct conn * conn, char *dst);
|
||||||
|
|
||||||
extern int dtls_openssl_log_error(SSL * ssl, int rc, const char *txt);
|
extern int dtls_openssl_log_error(SSL * ssl, int rc, const char *txt);
|
||||||
|
|
||||||
extern int dtls_openssl_accept(struct cw_Conn * conn);
|
extern int dtls_openssl_accept(struct conn * conn);
|
||||||
extern int dtls_openssl_set_certs(struct cw_Conn * conn, struct dtls_openssl_data *d);
|
extern int dtls_openssl_set_certs(struct conn * conn, struct dtls_openssl_data *d);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ extern int dtls_openssl_log_error_queue(const char *txt);
|
|||||||
|
|
||||||
extern BIO_METHOD * dtls_openssl_bio_method();
|
extern BIO_METHOD * dtls_openssl_bio_method();
|
||||||
|
|
||||||
extern int dtls_openssl_shutdown(struct cw_Conn *conn);
|
extern int dtls_openssl_shutdown(struct conn *conn);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "dtls_openssl.h"
|
#include "dtls_openssl.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
int dtls_openssl_accept(struct cw_Conn *conn)
|
int dtls_openssl_accept(struct conn *conn)
|
||||||
{
|
{
|
||||||
struct dtls_openssl_data *d;
|
struct dtls_openssl_data *d;
|
||||||
char sock_buf[SOCK_ADDR_BUFSIZE];
|
char sock_buf[SOCK_ADDR_BUFSIZE];
|
||||||
|
@ -75,16 +75,16 @@ BIO_METHOD *dtls_openssl_bio_method()
|
|||||||
|
|
||||||
int dtls_openssl_bio_write(BIO * b, const char *data, int len)
|
int dtls_openssl_bio_write(BIO * b, const char *data, int len)
|
||||||
{
|
{
|
||||||
/* struct cw_Conn *conn = b->ptr;*/
|
/* struct conn *conn = b->ptr;*/
|
||||||
struct cw_Conn *conn = BIO_get_data(b);
|
struct conn *conn = BIO_get_data(b);
|
||||||
return dtls_bio_write(conn, data, len);
|
return dtls_bio_write(conn, data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int dtls_openssl_bio_read(BIO * b, char *out, int maxlen)
|
int dtls_openssl_bio_read(BIO * b, char *out, int maxlen)
|
||||||
{
|
{
|
||||||
/*struct cw_Conn *conn = b->ptr;*/
|
/*struct conn *conn = b->ptr;*/
|
||||||
struct cw_Conn *conn = BIO_get_data(b);
|
struct conn *conn = BIO_get_data(b);
|
||||||
return dtls_bio_read(conn, out, maxlen);
|
return dtls_bio_read(conn, out, maxlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,8 +123,8 @@ int dtls_openssl_bio_free(BIO * bio)
|
|||||||
|
|
||||||
long dtls_openssl_bio_ctrl(BIO * b, int cmd, long num, void *ptr)
|
long dtls_openssl_bio_ctrl(BIO * b, int cmd, long num, void *ptr)
|
||||||
{
|
{
|
||||||
/*struct cw_Conn *conn = b->ptr;*/
|
/*struct conn *conn = b->ptr;*/
|
||||||
struct cw_Conn *conn = BIO_get_data(b);
|
struct conn *conn = BIO_get_data(b);
|
||||||
|
|
||||||
long ret = 1;
|
long ret = 1;
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
BIO *b = SSL_get_rbio(ssl);
|
BIO *b = SSL_get_rbio(ssl);
|
||||||
/*struct cw_Conn *conn = b->ptr;*/
|
/*struct conn *conn = b->ptr;*/
|
||||||
struct cw_Conn * conn = BIO_get_data(b); /*b->ptr;*/
|
struct conn * conn = BIO_get_data(b); /*b->ptr;*/
|
||||||
|
|
||||||
snprintf(identity, max_identity_len, "CLient_identity");
|
snprintf(identity, max_identity_len, "CLient_identity");
|
||||||
|
|
||||||
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
dtls_openssl_connect(struct cw_Conn *conn)
|
dtls_openssl_connect(struct conn *conn)
|
||||||
{
|
{
|
||||||
struct dtls_openssl_data *d;
|
struct dtls_openssl_data *d;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
#include "dtls_openssl.h"
|
#include "dtls_openssl.h"
|
||||||
|
|
||||||
const char * dtls_openssl_get_cipher(struct cw_Conn * conn, char *dst)
|
const char * dtls_openssl_get_cipher(struct conn * conn, char *dst)
|
||||||
{
|
{
|
||||||
struct dtls_openssl_data * d;
|
struct dtls_openssl_data * d;
|
||||||
const SSL_CIPHER * c;
|
const SSL_CIPHER * c;
|
||||||
|
@ -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,9 +29,8 @@ 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;
|
||||||
@ -58,7 +57,7 @@ struct cw_ElemHandler {
|
|||||||
|
|
||||||
int (*mkkey)(const char *pkey, uint8_t*data, int len, char *dst);
|
int (*mkkey)(const char *pkey, uint8_t*data, int len, char *dst);
|
||||||
int (*patch)(uint8_t *dst, void *data );
|
int (*patch)(uint8_t *dst, void *data );
|
||||||
void * param;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int conn_send_data_msg(struct cw_Conn * conn, uint8_t *rawmsg,int len)
|
int conn_send_data_msg(struct conn * conn, uint8_t *rawmsg,int len)
|
||||||
{
|
{
|
||||||
int packetlen = len;
|
int packetlen = len;
|
||||||
int fragoffset;
|
int fragoffset;
|
||||||
@ -93,7 +93,7 @@ int conn_send_data_msg(struct cw_Conn * conn, uint8_t *rawmsg,int len)
|
|||||||
|
|
||||||
#define MAX_MTU 9500
|
#define MAX_MTU 9500
|
||||||
int
|
int
|
||||||
cw_send_msg( struct cw_Conn * conn, uint8_t *msg)
|
cw_send_msg( struct conn * conn, uint8_t *msg)
|
||||||
{
|
{
|
||||||
uint8_t buf[MAX_MTU];
|
uint8_t buf[MAX_MTU];
|
||||||
int fragoffset,hlen,mtu;
|
int fragoffset,hlen,mtu;
|
||||||
@ -166,7 +166,7 @@ cw_send_msg( struct cw_Conn * conn, uint8_t *msg)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cw_send_request(struct cw_Conn *conn,int msg_id)
|
int cw_send_request(struct conn *conn,int msg_id)
|
||||||
{
|
{
|
||||||
time_t timer;
|
time_t timer;
|
||||||
int i;
|
int i;
|
||||||
@ -218,7 +218,7 @@ int cw_send_request(struct cw_Conn *conn,int msg_id)
|
|||||||
|
|
||||||
|
|
||||||
/*// XXX find a better name for this function */
|
/*// XXX find a better name for this function */
|
||||||
int cw_send_custom_request_2(struct cw_Conn *conn,int msg_id)
|
int cw_send_custom_request_2(struct conn *conn,int msg_id)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
17
src/cw/val.h
17
src/cw/val.h
@ -8,7 +8,6 @@
|
|||||||
#include "mavltypes.h"
|
#include "mavltypes.h"
|
||||||
|
|
||||||
#include "bstr.h"
|
#include "bstr.h"
|
||||||
#include "cfg.h"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,7 +53,7 @@ typedef struct cw_Val cw_Val_t;
|
|||||||
/**
|
/**
|
||||||
* @class cw_Type
|
* @class cw_Type
|
||||||
* @author 7u83
|
* @author 7u83
|
||||||
* @file val.h
|
* @file ktv.h
|
||||||
* @brief Representation of a cw_Type objetc
|
* @brief Representation of a cw_Type objetc
|
||||||
*/
|
*/
|
||||||
struct cw_Type {
|
struct cw_Type {
|
||||||
@ -92,9 +91,6 @@ struct cw_Type {
|
|||||||
|
|
||||||
int (*cast)(cw_Val_t *);
|
int (*cast)(cw_Val_t *);
|
||||||
|
|
||||||
int (*read)(cw_Cfg_t *cfg, const char * key, const uint8_t *src, int len, const void * param);
|
|
||||||
int (*write)(cw_Cfg_t *cfg, const char *key, const uint8_t *dst, const void * param);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
typedef struct cw_Type cw_Type_t;
|
typedef struct cw_Type cw_Type_t;
|
||||||
|
|
||||||
@ -121,12 +117,8 @@ typedef struct cw_ValStruct cw_ValStruct_t;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define CW_STRUCT_LEN_WORD -2
|
#define CW_KTVSTRUCT_L16 -2
|
||||||
#define CW_STRUCT_LEN_BYTE -3
|
#define CW_KTVSTRUCT_L8 -3
|
||||||
|
|
||||||
|
|
||||||
#define CW_KTVSTRUCT_L8 -2
|
|
||||||
#define CW_KTVSTRUCT_L16 -3
|
|
||||||
|
|
||||||
struct cw_ValEnum{
|
struct cw_ValEnum{
|
||||||
int value;
|
int value;
|
||||||
@ -160,7 +152,6 @@ extern const struct cw_Type cw_type_str;
|
|||||||
extern const struct cw_Type cw_type_ipaddress;
|
extern const struct cw_Type cw_type_ipaddress;
|
||||||
extern const struct cw_Type cw_type_sysptr;
|
extern const struct cw_Type cw_type_sysptr;
|
||||||
extern const struct cw_Type cw_type_bool;
|
extern const struct cw_Type cw_type_bool;
|
||||||
extern const struct cw_Type cw_type_struct;
|
|
||||||
|
|
||||||
#define CW_TYPE_BYTE (&cw_type_byte)
|
#define CW_TYPE_BYTE (&cw_type_byte)
|
||||||
#define CW_TYPE_WORD (&cw_type_word)
|
#define CW_TYPE_WORD (&cw_type_word)
|
||||||
@ -171,8 +162,6 @@ extern const struct cw_Type cw_type_struct;
|
|||||||
#define CW_TYPE_SYSPTR (&cw_type_sysptr)
|
#define CW_TYPE_SYSPTR (&cw_type_sysptr)
|
||||||
#define CW_TYPE_STR (&cw_type_str)
|
#define CW_TYPE_STR (&cw_type_str)
|
||||||
#define CW_TYPE_BOOL (&cw_type_bool)
|
#define CW_TYPE_BOOL (&cw_type_bool)
|
||||||
#define CW_TYPE_STRUCT (&cw_type_struct)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void cw_kvstore_mavl_delete(const void *data);
|
void cw_kvstore_mavl_delete(const void *data);
|
||||||
*/
|
*/
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
#include "cw/mavltypes.h"
|
#include "cw/mavltypes.h"
|
||||||
|
|
||||||
static int postprocess_join_request(struct cw_Conn *conn);
|
static int postprocess_join_request(struct conn *conn);
|
||||||
|
|
||||||
|
|
||||||
static cw_ValStruct_t wtp_reboot_statistics[] = {
|
static cw_ValStruct_t wtp_reboot_statistics[] = {
|
||||||
@ -64,25 +64,6 @@ static cw_ValValRange_t radio_admin_state_valguard[]={
|
|||||||
{0,0,NULL}
|
{0,0,NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
static cw_ValValRange_t discovery_types[]={
|
|
||||||
{0,0,"0 - Unknown"},
|
|
||||||
{1,1,"1 - Static Configuration"},
|
|
||||||
{2,2,"2 - DHCP"},
|
|
||||||
{3,3,"3 - DNS"},
|
|
||||||
{4,4,"4 - AC Referral"},
|
|
||||||
{0,0,NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
static cw_ValValRange_t mac_types[]={
|
|
||||||
{0,0,"0 - Local MAC"},
|
|
||||||
{1,1,"1 - Split MAC"},
|
|
||||||
{2,2,"2 - Both"},
|
|
||||||
{0,0,NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static cw_ValStruct_t radio_admin_state[] = {
|
static cw_ValStruct_t radio_admin_state[] = {
|
||||||
{CW_TYPE_BYTE, NULL, 1,-1, radio_admin_state_valguard},
|
{CW_TYPE_BYTE, NULL, 1,-1, radio_admin_state_valguard},
|
||||||
{NULL,NULL,0,0}
|
{NULL,NULL,0,0}
|
||||||
@ -96,13 +77,9 @@ static struct cw_ElemHandler handlers[] = {
|
|||||||
0,0, /* Vendor / Proto */
|
0,0, /* Vendor / Proto */
|
||||||
1,1, /* min/max length */
|
1,1, /* min/max length */
|
||||||
CW_TYPE_BYTE, /* type */
|
CW_TYPE_BYTE, /* type */
|
||||||
"discovery-type", /* Key */
|
CW_KEY_DISCOVERY_TYPE, /* Key */
|
||||||
cw_in_generic, /* get */
|
cw_in_generic, /* get */
|
||||||
cw_out_generic, /* put */
|
cw_out_generic /* put */
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
discovery_types,
|
|
||||||
|
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
@ -111,12 +88,9 @@ static struct cw_ElemHandler handlers[] = {
|
|||||||
0,0, /* Vendor / Proto */
|
0,0, /* Vendor / Proto */
|
||||||
1,1, /* min/max length */
|
1,1, /* min/max length */
|
||||||
CW_TYPE_BYTE, /* type */
|
CW_TYPE_BYTE, /* type */
|
||||||
"wtp-mac-type", /* Key */
|
CW_KEY_WTP_MAC_TYPE, /* Key */
|
||||||
cw_in_generic, /* get */
|
cw_in_generic, /* get */
|
||||||
cw_out_generic, /* put */
|
cw_out_generic /* put */
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
mac_types
|
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
@ -772,7 +746,7 @@ static struct cw_MsgDef messages[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int postprocess_join_request(struct cw_Conn *conn)
|
static int postprocess_join_request(struct conn *conn)
|
||||||
{
|
{
|
||||||
cw_Val_t * result;
|
cw_Val_t * result;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ static int init(struct cw_Mod * mod, mavl_t global_cfg, int role)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int detect(struct cw_Conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
|
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
|
||||||
struct sockaddr *from, int mode)
|
struct sockaddr *from, int mode)
|
||||||
{
|
{
|
||||||
if (mode != CW_MOD_MODE_CAPWAP)
|
if (mode != CW_MOD_MODE_CAPWAP)
|
||||||
@ -44,7 +44,7 @@ static int detect(struct cw_Conn *conn, const uint8_t * rawmsg, int rawlen, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int static setup_cfg(struct cw_Conn * conn)
|
int static setup_cfg(struct conn * conn)
|
||||||
{
|
{
|
||||||
int security;
|
int security;
|
||||||
|
|
||||||
|
@ -756,13 +756,10 @@ static struct cw_ElemHandler handlers70[] = {
|
|||||||
CW_CISCO_BOARD_DATA_OPTIONS, /* Element ID */
|
CW_CISCO_BOARD_DATA_OPTIONS, /* Element ID */
|
||||||
CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
|
CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
|
||||||
4,4, /* min/max length */
|
4,4, /* min/max length */
|
||||||
CW_TYPE_STRUCT, /* type */
|
cisco_wtp_board_data_options, /* type */
|
||||||
"cisco/wtp-board-data/options", /* Key */
|
"cisco/wtp-board-data/options", /* Key */
|
||||||
cw_in_generic, /* handler */
|
cw_in_generic_struct, /* handler */
|
||||||
cw_out_generic, /* put */
|
cw_out_generic_struct /* put */
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
cisco_wtp_board_data_options, /* struct datae */
|
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
@ -2144,7 +2141,7 @@ static cw_StateMachineState_t statemachine_states[]={
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int (*postprocess_join_request_parent)(struct cw_Conn * conn);
|
static int (*postprocess_join_request_parent)(struct conn * conn);
|
||||||
struct cw_MsgSet * cisco_register_msg_set(struct cw_MsgSet * set, int mode){
|
struct cw_MsgSet * cisco_register_msg_set(struct cw_MsgSet * set, int mode){
|
||||||
|
|
||||||
struct cw_MsgData * md;
|
struct cw_MsgData * md;
|
||||||
@ -2164,7 +2161,7 @@ struct cw_MsgSet * cisco_register_msg_set(struct cw_MsgSet * set, int mode){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void set_ac_version(struct cw_Conn * conn)
|
static void set_ac_version(struct conn * conn)
|
||||||
{
|
{
|
||||||
cw_Val_t * wtpver;
|
cw_Val_t * wtpver;
|
||||||
char verstr[512];
|
char verstr[512];
|
||||||
@ -2191,7 +2188,7 @@ static void set_ac_version(struct cw_Conn * conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int postprocess_discovery(struct cw_Conn *conn)
|
static int postprocess_discovery(struct conn *conn)
|
||||||
{
|
{
|
||||||
if (conn->role == CW_ROLE_AC ){
|
if (conn->role == CW_ROLE_AC ){
|
||||||
set_ac_version(conn);
|
set_ac_version(conn);
|
||||||
@ -2200,7 +2197,7 @@ static int postprocess_discovery(struct cw_Conn *conn)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int postprocess_join_request(struct cw_Conn *conn)
|
static int postprocess_join_request(struct conn *conn)
|
||||||
{
|
{
|
||||||
if (postprocess_join_request_parent!=NULL){
|
if (postprocess_join_request_parent!=NULL){
|
||||||
postprocess_join_request_parent(conn);
|
postprocess_join_request_parent(conn);
|
||||||
@ -2209,7 +2206,7 @@ static int postprocess_join_request(struct cw_Conn *conn)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int preprocess_join_request(struct cw_Conn *conn)
|
static int preprocess_join_request(struct conn *conn)
|
||||||
{
|
{
|
||||||
cw_Val_t * ver;
|
cw_Val_t * ver;
|
||||||
int use_ac_version;
|
int use_ac_version;
|
||||||
|
@ -35,7 +35,7 @@ int cisco_in_wtp_descriptor(struct cw_ElemHandler *eh, struct cw_ElemHandlerPara
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
return cw_read_wtp_descriptor_7(params->cfg, NULL /*params->conn*/, eh, data, len, allowed);
|
return cw_read_wtp_descriptor_7(params->remote_cfg, NULL /*params->conn*/, eh, data, len, allowed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#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"*/
|
||||||
@ -168,7 +167,7 @@ static int init(struct cw_Mod *mod, mavl_t global_cfg, int role)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int detect(struct cw_Conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
|
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
|
||||||
struct sockaddr *from, int mode)
|
struct sockaddr *from, int mode)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -221,7 +220,7 @@ static struct cw_Mod capwap_ac = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
int static setup_cfg(struct cw_Conn * conn)
|
int static setup_cfg(struct conn * conn)
|
||||||
{
|
{
|
||||||
int security;
|
int security;
|
||||||
|
|
||||||
@ -229,7 +228,7 @@ int static setup_cfg(struct cw_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_cfg_set_int(conn->local_cfg,"ac-descriptor/security",security);
|
cw_ktv_set_byte(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