Compare commits

...

12 Commits

Author SHA1 Message Date
1703be9294 Deleted capwap_mode 2022-08-09 23:45:37 +02:00
d8f18f1a6a deleted capwap_mode 2022-08-09 23:44:35 +02:00
4b5b00009c Renamed struct conn to struct cw_Conn 2022-08-09 22:35:47 +02:00
3da4805c06 cw_in_check_cfg_update_req.c deleted 2022-08-09 21:54:26 +02:00
5b25d49b2b Removed unused code 2022-08-09 21:51:49 +02:00
484be39f78 Fixed: free interface name 2022-08-09 21:48:48 +02:00
0739d57aa6 param attribute added 2022-08-09 21:48:15 +02:00
fe16e62ef2 Deleted unused code 2022-08-09 21:47:39 +02:00
8a1a713c12 new type CW_TYPE_STRUCT 2022-08-09 21:45:46 +02:00
14e69d168b Discovery types and Mac types added 2022-08-09 18:17:10 +02:00
bc5e312ec4 Deleted some unused comments 2022-08-09 17:23:23 +02:00
d2240646f9 Removed cw_ElemHandlerParams.elem 2022-08-09 09:52:30 +02:00
66 changed files with 855 additions and 848 deletions

View File

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

View File

@ -4,8 +4,6 @@
#include "mavl.h" #include "mavl.h"
#include "cw/mavltypes.h" #include "cw/mavltypes.h"
extern mavl_t actube_global_cfg;
extern struct ac_status ac_global_status; extern struct ac_status ac_global_status;

View File

@ -105,7 +105,6 @@ static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
struct cw_DiscoveryCache * discovery_cache; struct cw_DiscoveryCache * discovery_cache;
mavl_t actube_global_cfg;
int ac_global_init() int ac_global_init()
{ {
@ -169,6 +168,7 @@ extern void test_sets();
return 0; return 0;
*/ */
static cw_Cfg_t * global_cfg = NULL;
int main (int argc, char *argv[]) int main (int argc, char *argv[])
@ -180,7 +180,6 @@ int main (int argc, char *argv[])
const cw_Type_t **ti; const cw_Type_t **ti;
cw_Cfg_t * global_cfg = NULL;
/* parse arguments */ /* parse arguments */
parse_args (argc, argv, &bootcfg); parse_args (argc, argv, &bootcfg);
@ -481,7 +480,7 @@ void process_cw_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer,
if (!wtpman) { if (!wtpman) {
wtpman = wtpman_create (index, addr, preamble & 0xf); wtpman = wtpman_create (index, addr, preamble & 0xf, global_cfg);
if (!wtpman) { if (!wtpman) {

View File

@ -146,6 +146,7 @@ static int init_ac_name(cw_Cfg_t * cfg)
} }
} }
free(primary_if);
} }
sprintf(ac_name,"actube%s",acid); sprintf(ac_name,"actube%s",acid);

View File

@ -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 conn * find_ap(const char *name); struct cw_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 conn * conn; struct cw_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 conn * conn; struct cw_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 conn * conn; struct cw_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 conn * conn; struct cw_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 conn * conn; struct cw_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 conn * conn; struct cw_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 conn * find_ap(const char *name) struct cw_Conn * find_ap(const char *name)
{ {
struct connlist * cl; struct connlist * cl;
mavliter_t it; mavliter_t it;
@ -224,7 +224,7 @@ struct 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 conn * conn; struct cw_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 conn * conn; struct cw_Conn * conn;
conn = mavliter_get_ptr (&it); conn = mavliter_get_ptr (&it);
sock_addr2str_p (&conn->addr, addr); sock_addr2str_p (&conn->addr, addr);

View File

@ -71,7 +71,7 @@ void wtplist_destroy()
struct wtpman * wtplist_get(const struct sockaddr * addr) struct wtpman * wtplist_get(const struct sockaddr * addr)
{ {
struct conn * conn = connlist_get(connlist,addr); struct cw_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 conn search; struct cw_Conn search;
struct conn * conn; struct cw_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);*/

View File

@ -63,8 +63,8 @@ static void reset_echointerval_timer(struct wtpman *wtpman)
} }
static int msg_start_handler(struct conn *conn, struct cw_action_in *a, uint8_t * data, static int msg_start_handler(struct cw_Conn *conn, struct cw_action_in *a,
int len, struct sockaddr *from) uint8_t * data, int len, struct sockaddr *from)
{ {
struct wtpman *wtpman = conn->data; struct wtpman *wtpman = conn->data;
reset_echointerval_timer(wtpman); reset_echointerval_timer(wtpman);
@ -101,11 +101,14 @@ static void wtpman_run_discovery(void *arg)
wtpman->conn->capwap_state = CAPWAP_STATE_JOIN; wtpman->conn->capwap_state = CAPWAP_STATE_JOIN;
cw_dbg(DBG_INFO, "Discovery has detected mods: %s %s", cw_dbg(DBG_INFO, "Discovery has detected mods: %s %s",
wtpman->conn->cmod->name,wtpman->conn->bmod->name); wtpman->conn->cmod->name,
wtpman->conn->bmod->name);
wtplist_lock(); wtplist_lock();
discovery_cache_add(discovery_cache,(struct sockaddr*)&wtpman->conn->addr, discovery_cache_add(discovery_cache,
wtpman->conn->cmod,wtpman->conn->bmod); (struct sockaddr *) &wtpman->conn->
addr, wtpman->conn->cmod,
wtpman->conn->bmod);
wtplist_unlock(); wtplist_unlock();
} }
@ -129,7 +132,8 @@ static int wtpman_dtls_setup(void *arg)
} }
cw_dbg(DBG_DTLS, "DTLS session established with %s, %s", cw_dbg(DBG_DTLS, "DTLS session established with %s, %s",
sock_addr2str_p(&wtpman->conn->addr,sock_buf), dtls_get_cipher(wtpman->conn,cipherstr)); sock_addr2str_p(&wtpman->conn->addr, sock_buf),
dtls_get_cipher(wtpman->conn, cipherstr));
return 1; return 1;
@ -140,17 +144,20 @@ 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 conn *conn = wtpman->conn; struct cw_Conn *conn = wtpman->conn;
time_t timer, wait_join; time_t timer, wait_join;
cw_dbg(DBG_INFO, "Join State - %s", sock_addr2str(&conn->addr,sock_buf)); cw_dbg(DBG_INFO, "Join State - %s",
sock_addr2str(&conn->addr, sock_buf));
wait_join = cw_ktv_get_word(conn->global_cfg,"wait-join",CAPWAP_WAIT_JOIN); wait_join =
cw_ktv_get_word(conn->global_cfg, "wait-join", CAPWAP_WAIT_JOIN);
timer = cw_timer_start(wait_join); timer = cw_timer_start(wait_join);
while (!cw_timer_timeout(timer) && wtpman->conn->capwap_state == CAPWAP_STATE_JOIN) { while (!cw_timer_timeout(timer)
&& wtpman->conn->capwap_state == CAPWAP_STATE_JOIN) {
rc = cw_read_messages(wtpman->conn); rc = cw_read_messages(wtpman->conn);
if (rc < 0) { if (rc < 0) {
if (errno == EAGAIN) if (errno == EAGAIN)
@ -170,7 +177,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, "No join request from %s after %d seconds, WTP died.", cw_dbg(DBG_MSG_ERR,
"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;
@ -185,7 +193,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 conn *conn = wtpman->conn; struct cw_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);
@ -247,7 +255,7 @@ 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 conn *conn = wtpman->conn; struct cw_Conn *conn = wtpman->conn;
uint8_t data[1001]; uint8_t data[1001];
@ -263,7 +271,7 @@ void * wtpman_run_data(void *wtpman_arg)
} }
int cw_run_state_machine(struct conn * conn, time_t *timer) int cw_run_state_machine(struct cw_Conn *conn, time_t * timer)
{ {
int timerval; int timerval;
@ -298,9 +306,12 @@ int cw_run_state_machine(struct conn * conn, time_t *timer)
} }
if (result->timer_key) { if (result->timer_key) {
timerval = cw_ktv_get_word(conn->local_cfg,result->timer_key,result->timer_default); timerval =
cw_ktv_get_word(conn->local_cfg, result->timer_key,
result->timer_default);
*timer = cw_timer_start(timerval); *timer = cw_timer_start(timerval);
cw_dbg(DBG_STATE,"Starting timer: [%s] - %d seconds.",result->timer_key,timerval); cw_dbg(DBG_STATE, "Starting timer: [%s] - %d seconds.",
result->timer_key, timerval);
} }
return result->retval; return result->retval;
} }
@ -315,7 +326,7 @@ static void * wtpman_main(void *arg)
int rc; int rc;
time_t timer; time_t timer;
char sock_buf[SOCK_ADDR_BUFSIZE]; char sock_buf[SOCK_ADDR_BUFSIZE];
struct conn *conn; struct cw_Conn *conn;
int last_state; int last_state;
struct wtpman *wtpman = (struct wtpman *) arg; struct wtpman *wtpman = (struct wtpman *) arg;
@ -386,9 +397,11 @@ static void * wtpman_main(void *arg)
cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf)); cw_dbg(DBG_INFO, "Updating WTP %s",
sock_addr2str(&conn->addr, sock_buf));
rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST); rc = cw_send_request(conn,
CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
mavl_merge(conn->remote_cfg, conn->update_cfg); mavl_merge(conn->remote_cfg, conn->update_cfg);
conn->update_cfg = NULL; conn->update_cfg = NULL;
@ -469,7 +482,9 @@ exit(0);
} }
} }
cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP","---------end dump --------"); cw_dbg_ktv_dump(conn->remote_cfg, DBG_INFO,
"-------------dump------------", "DMP",
"---------end dump --------");
if (!cw_result_is_ok(rc)) { if (!cw_result_is_ok(rc)) {
cw_dbg(DBG_INFO, "WTP Problem: %s", cw_strrc(rc)); cw_dbg(DBG_INFO, "WTP Problem: %s", cw_strrc(rc));
@ -526,16 +541,19 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
r = db_get_update_tasks(conn, sock_addr2str(&conn->addr,sock_buf)); r = db_get_update_tasks(conn,
sock_addr2str(&conn->addr, sock_buf));
if (r) { if (r) {
/* /*
// if (!conn->outgoing->count) // if (!conn->outgoing->count)
// continue; // continue;
*/ */
cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr,sock_buf)); cw_dbg(DBG_INFO, "Updating WTP %s",
sock_addr2str(&conn->addr, sock_buf));
rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST); rc = cw_send_request(conn,
CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
/* /*
// mavl_merge(conn->config, conn->outgoing); // mavl_merge(conn->config, conn->outgoing);
@ -547,15 +565,18 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
*/ */
} }
r = db_get_radio_tasks(conn, sock_addr2str(&conn->addr,sock_buf)); r = db_get_radio_tasks(conn,
sock_addr2str(&conn->addr, sock_buf));
if (r) { if (r) {
/* /*
// if (!conn->radios_upd->count) // if (!conn->radios_upd->count)
// continue; // continue;
*/ */
cw_dbg(DBG_INFO, "Updating Radios for %s",sock_addr2str(&conn->addr,sock_buf)); cw_dbg(DBG_INFO, "Updating Radios for %s",
rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST); sock_addr2str(&conn->addr, sock_buf));
rc = cw_send_request(conn,
CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
/* /*
// conn_clear_upd(conn,1); // conn_clear_upd(conn,1);
@ -596,7 +617,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, "Dropping connection from %s to non-unicast socket.", cw_dbg(DBG_DTLS,
"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;
@ -623,7 +645,8 @@ void wtpman_destroy(struct wtpman *wtpman)
struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dtlsmode) struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
int dtlsmode, cw_Cfg_t * global_cfg)
{ {
struct sockaddr dbgaddr; struct sockaddr dbgaddr;
socklen_t dbgaddrl; socklen_t dbgaddrl;
@ -642,7 +665,8 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
replyfd = socklist_find_reply_socket(srcaddr, port); replyfd = socklist_find_reply_socket(srcaddr, port);
if (replyfd == -1) { if (replyfd == -1) {
cw_log(LOG_ERR, "Can't find reply socket for request from %s", cw_log(LOG_ERR,
"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;
@ -671,7 +695,8 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
wtpman->conn->role = CW_ROLE_AC; wtpman->conn->role = CW_ROLE_AC;
wtpman->conn->data_sock = socklist[socklistindex].data_sockfd; wtpman->conn->data_sock = socklist[socklistindex].data_sockfd;
sock_copyaddr(&wtpman->conn->data_addr, (struct sockaddr *) &wtpman->conn->addr); sock_copyaddr(&wtpman->conn->data_addr,
(struct sockaddr *) &wtpman->conn->addr);
if (!wtpman->conn) { if (!wtpman->conn) {
wtpman_destroy(wtpman); wtpman_destroy(wtpman);
@ -699,8 +724,8 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
wtpman->conn->local_cfg = cw_ktv_create(); wtpman->conn->local_cfg = cw_ktv_create();
wtpman->conn->global_cfg = actube_global_cfg; wtpman->conn->global_cfg = global_cfg;
wtpman->conn->local_cfg = actube_global_cfg; wtpman->conn->local_cfg = global_cfg;
/* when created caused by a packet in DTLS mode, we try /* when created caused by a packet in DTLS mode, we try
* to find out the modules to load, for detected connection * to find out the modules to load, for detected connection
@ -709,10 +734,13 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr, int dt
int rc; int rc;
struct cw_Mod *cmod, *bmod; struct cw_Mod *cmod, *bmod;
rc = discovery_cache_get(discovery_cache,srcaddr,&cmod,&bmod); rc = discovery_cache_get(discovery_cache, srcaddr, &cmod,
&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->msgset =
cw_mod_get_msg_set(wtpman->conn, cmod, bmod);
wtpman->conn->detected = 1; wtpman->conn->detected = 1;
cmod->setup_cfg(wtpman->conn); cmod->setup_cfg(wtpman->conn);
} }
@ -731,12 +759,6 @@ void wtpman_start(struct wtpman *wtpman, int dtlsmode)
{ {
cw_dbg(DBG_INFO, "Starting wtpman, DTLS mode = %d", dtlsmode); cw_dbg(DBG_INFO, "Starting wtpman, DTLS mode = %d", dtlsmode);
wtpman->dtlsmode = dtlsmode; wtpman->dtlsmode = dtlsmode;
pthread_create(&wtpman->thread, NULL, wtpman_main, pthread_create(&wtpman->thread, NULL, wtpman_main, (void *) wtpman);
(void *) wtpman);
return; return;
} }

View File

@ -8,13 +8,14 @@
#include "cw/capwap.h" #include "cw/capwap.h"
#include "cw/fragman.h" #include "cw/fragman.h"
#include "cw/timer.h" #include "cw/timer.h"
#include "cw/cfg.h"
#define WTPMAN_QSIZE 1024 #define WTPMAN_QSIZE 1024
struct wtpman { struct wtpman {
pthread_t thread; pthread_t thread;
struct conn * conn; struct cw_Conn *conn;
/* wtp data */ /* wtp data */
@ -45,7 +46,8 @@ struct wtp{
struct wtpman *wtpman_create(); struct wtpman *wtpman_create();
struct wtpman * wtpman_create(int socklistindex,struct sockaddr * srcaddr, int dtlsmode); struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
int dtlsmode, cw_Cfg_t * global_cfg);
extern void wtpman_addpacket(struct wtpman *wtpman, uint8_t * packet, int len); extern void wtpman_addpacket(struct wtpman *wtpman, uint8_t * packet, int len);
extern void wtpman_destroy(struct wtpman *wtpman); extern void wtpman_destroy(struct wtpman *wtpman);

View File

@ -1770,7 +1770,7 @@ MAN_EXTENSION = .3
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_MAN is set to YES. # This tag requires that the tag GENERATE_MAN is set to YES.
MAN_LINKS = NO MAN_LINKS = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the XML output # Configuration options related to the XML output

View File

@ -16,7 +16,6 @@ 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\
@ -68,14 +67,16 @@ 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\
@ -202,9 +203,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\

View File

@ -6,6 +6,7 @@
#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)
{ {
@ -84,6 +85,8 @@ 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;
@ -428,59 +431,6 @@ 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;
@ -532,63 +482,6 @@ 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)
{ {
@ -606,4 +499,9 @@ 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);
}

View File

@ -31,6 +31,7 @@ void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base)
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def); int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def);
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def); uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def);
void cw_cfg_set_int(cw_Cfg_t * cfg, const char * key, int val);
#endif #endif

View File

@ -56,7 +56,7 @@ struct cw_action_in;
/** /**
* Connection Object * Connection Object
*/ */
struct conn { struct cw_Conn {
int sock; int sock;
struct sockaddr_storage addr; struct sockaddr_storage addr;
@ -106,7 +106,7 @@ struct 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 conn {
/* receive and send methods */ /* receive and send methods */
int (*recv_packet) (struct conn *, uint8_t *, int); int (*recv_packet) (struct cw_Conn*, uint8_t *, int);
int (*recv_packet_peek) (struct conn *, uint8_t *, int); int (*recv_packet_peek) (struct cw_Conn*, uint8_t *, int);
int (*send_packet) (struct conn *, const uint8_t *, int); int (*send_packet) (struct cw_Conn*, const uint8_t *, int);
/* /*
// int (*recv_data_packet) (struct conn *, uint8_t *,int); // int (*recv_data_packet) (struct cw_Conn*, uint8_t *,int);
// int (*send_data_packet) (struct conn *, const uint8_t *, int); // int (*send_data_packet) (struct cw_Conn*, const uint8_t *, int);
*/ */
int (*readfrom) (struct conn *, uint8_t *, int, struct sockaddr_storage *); int (*readfrom) (struct cw_Conn*, uint8_t *, int, struct sockaddr_storage *);
int (*read) (struct conn *, uint8_t *, int); int (*read) (struct cw_Conn*, uint8_t *, int);
int (*write) (struct conn *, const uint8_t *, int); int (*write) (struct cw_Conn*, const uint8_t *, int);
/* /*
// int (*write_data) (struct conn *, const uint8_t *, int); // int (*write_data) (struct cw_Conn*, const uint8_t *, int);
*/ */
/* optional packet queue */ /* optional packet queue */
uint8_t **q; uint8_t **q;
@ -179,14 +179,14 @@ struct conn {
int cur_packet_pos; int cur_packet_pos;
/* dtls stuff */ /* dtls stuff */
int (*dtls_start) (struct conn *); int (*dtls_start) (struct cw_Conn*);
int (*dtls_accept) (struct conn *); int (*dtls_accept) (struct cw_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 conn *,const char *user,uint8_t**psk, int *len); int (*dtls_get_psk)(struct cw_Conn*,const char *user,uint8_t**psk, int *len);
struct cw_Mod *cmod, *bmod; struct cw_Mod *cmod, *bmod;
@ -219,7 +219,7 @@ struct 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 conn {
int strict_hdr; int strict_hdr;
int (*process_packet)(struct conn *conn, uint8_t * packet, int len,struct sockaddr *from); int (*process_packet)(struct cw_Conn*conn, uint8_t * packet, int len,struct sockaddr *from);
int (*process_message)(struct conn *conn, uint8_t * rawmsg, int rawlen, int (*process_message)(struct cw_Conn*conn, uint8_t * rawmsg, int rawlen,
struct sockaddr *from); struct sockaddr *from);
@ -238,16 +238,17 @@ struct conn {
void * mods; void * mods;
int (*msg_start)(struct conn *conn,struct cw_action_in *a,uint8_t*data,int len,struct sockaddr *from); int (*msg_start)(struct cw_Conn*conn,struct cw_action_in *a,uint8_t*data,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 (*msg_end)(struct cw_Conn*conn,struct cw_action_in *a,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); int (*elem_end)(struct cw_Conn*conn,struct cw_action_in *a,int afrc,uint8_t*elem,int len,struct sockaddr *from);
/* /*
// void (*actions_registered)(struct conn *conn); // void (*actions_registered)(struct cw_Conn*conn);
*/ */
}; };
typedef struct cw_Conn cw_Conn_t;
@ -255,76 +256,76 @@ struct conn {
struct conn *conn_create(int sock, struct sockaddr *addr, int qsize); struct cw_Conn*conn_create(int sock, struct sockaddr *addr, int qsize);
struct conn *conn_create_noq(int sock, struct sockaddr *addr); struct cw_Conn*conn_create_noq(int sock, struct sockaddr *addr);
extern int conn_send_cwmsg(struct conn *conn, struct cwmsg *cwmsg); extern int conn_send_cwmsg(struct cw_Conn*conn, struct cwmsg *cwmsg);
/* /*
//extern int conn_process_packet(struct conn *conn, uint8_t * packet, int len, //extern int conn_process_packet(struct cw_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 conn *conn, uint8_t * packet, int len,struct sockaddr *from); extern int conn_process_packet(struct cw_Conn*conn, uint8_t * packet, int len,struct sockaddr *from);
extern int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen, extern int process_message(struct cw_Conn*conn, uint8_t * rawmsg, int rawlen,
struct sockaddr *from); struct sockaddr *from);
extern uint8_t *conn_get_message(struct conn *conn); extern uint8_t *conn_get_message(struct cw_Conn*conn);
extern int conn_send_packet(struct conn *conn, const uint8_t * buffer, int len); extern int conn_send_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 int conn_send_data_packet(struct cw_Conn* conn, const uint8_t * buffer, int len);
extern void conn_destroy(struct conn *conn); extern void conn_destroy(struct cw_Conn*conn);
uint8_t *conn_q_get_packet(struct conn *conn); uint8_t *conn_q_get_packet(struct cw_Conn*conn);
extern int conn_q_recv_packet(struct conn *conn, uint8_t * buffer, int len); extern int conn_q_recv_packet(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_q_recv_packet_peek(struct cw_Conn*conn, uint8_t * buffer, int len);
extern int conn_recv_packet(struct conn *conn, uint8_t * buf, int len); extern int conn_recv_packet(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_recv_packet_peek(struct cw_Conn*conn, uint8_t * buf, int len);
extern int conn_send_response(struct conn *conn, struct cwmsg *cwmsg, int seqnum); extern int conn_send_response(struct cw_Conn*conn, struct cwmsg *cwmsg, int seqnum);
extern struct cwrmsg *conn_get_response(struct conn *conn); extern struct cwrmsg *conn_get_response(struct cw_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 conn *conn, uint8_t * packet, int len); void conn_q_add_packet(struct cw_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 conn *conn, int type); extern void conn_prepare_request(struct cw_Conn*conn, int type);
extern int conn_prepare_image_data_request(struct conn *conn, struct cwimage_data *, extern int conn_prepare_image_data_request(struct cw_Conn*conn, struct cwimage_data *,
struct image_identifier *id); struct image_identifier *id);
/* /*
//extern void conn_detect_capwap(struct conn *conn, struct wtpinfo *wtpinfo); //extern void conn_detect_capwap(struct cw_Conn*conn, struct wtpinfo *wtpinfo);
*/ */
struct cwrmsg *conn_send_request(struct conn *conn); struct cwrmsg *conn_send_request(struct cw_Conn*conn);
struct cwrmsg *conn_wait_for_message(struct conn *conn, time_t timer); struct cwrmsg *conn_wait_for_message(struct cw_Conn*conn, time_t timer);
struct cwrmsg *conn_wait_for_request(struct conn *conn, int *msglist, time_t timer); struct cwrmsg *conn_wait_for_request(struct cw_Conn*conn, int *msglist, time_t timer);
int conn_q_wait_packet(struct conn * conn, int seconds); int conn_q_wait_packet(struct cw_Conn* conn, int seconds);
#define conn_is_error(conn) (conn->dtls_error) #define conn_is_error(conn) (conn->dtls_error)
void conn_init(struct conn *conn); void conn_init(struct cw_Conn*conn);
extern int cw_read_messages(struct conn *conn); extern int cw_read_messages(struct cw_Conn*conn);
extern int conn_recvfrom_packet(struct conn *conn, uint8_t * buf, int len, extern int conn_recvfrom_packet(struct cw_Conn*conn, uint8_t * buf, int len,
struct sockaddr_storage *from); struct sockaddr_storage *from);
int conn_send_msg(struct conn * conn, uint8_t *rawmsg); int conn_send_msg(struct cw_Conn* conn, uint8_t *rawmsg);
int cw_read_from(struct conn * conn, struct sockaddr_storage * from); int cw_read_from(struct cw_Conn* conn, struct sockaddr_storage * from);
int conn_send_msg(struct conn *conn, uint8_t * rawmsg); int conn_send_msg(struct cw_Conn *conn, uint8_t * rawmsg);
void conn_clear_upd(struct conn *conn, int merge); void conn_clear_upd(struct cw_Conn*conn, int merge);
#endif /* __CONN_H */ #endif /* __CONN_H */

View File

@ -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 conn * conn_create(int sock, struct sockaddr * addr, int qsize) struct cw_Conn * conn_create(int sock, struct sockaddr * addr, int qsize)
{ {
struct conn * conn; struct cw_Conn * conn;
conn = malloc(sizeof (struct conn)); conn = malloc(sizeof (struct cw_Conn ));
if (!conn) if (!conn)
return NULL; return NULL;

View File

@ -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 conn * conn_create_noq(int sock, struct sockaddr * addr) struct cw_Conn * conn_create_noq(int sock, struct sockaddr * addr)
{ {
struct conn * conn; struct cw_Conn * conn;
conn = malloc(sizeof (struct conn)); conn = malloc(sizeof (struct cw_Conn ));
if (!conn) if (!conn)
return NULL; return NULL;

View File

@ -28,7 +28,7 @@
* Destroy a conn object * Destroy a conn object
* @param object to destroy * @param object to destroy
*/ */
void conn_destroy(struct conn * conn) void conn_destroy(struct cw_Conn * conn)
{ {
if (conn->fragman) if (conn->fragman)
fragman_destroy(conn->fragman); fragman_destroy(conn->fragman);

View File

@ -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 conn * conn) void conn_init(struct cw_Conn * conn)
{ {
memset(conn,0,sizeof(struct conn)); memset(conn,0,sizeof(struct cw_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;

View File

@ -42,7 +42,7 @@
/** /**
* Init response message header * Init response message header
*/ */
void cw_init_response(struct conn *conn, uint8_t * req) void cw_init_response(struct cw_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 conn *conn, uint8_t * req)
cw_set_msg_flags(dmsgptr, 0); cw_set_msg_flags(dmsgptr, 0);
} }
void cw_init_request(struct conn *conn, int msg_id) void cw_init_request(struct cw_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 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 conn *conn) void cw_init_data_msg(struct cw_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 conn *conn)
/** /**
* send a response * send a response
*/ */
int cw_send_response(struct conn *conn, uint8_t * rawmsg, int len) int cw_send_response(struct cw_Conn *conn, uint8_t * rawmsg, int len)
{ {
int rc; int rc;
cw_init_response(conn, rawmsg); cw_init_response(conn, rawmsg);
@ -135,7 +135,8 @@ int cw_send_response(struct conn *conn, uint8_t * rawmsg, int len)
* @param result_code result code to send * @param result_code result code to send
* @return 1 * @return 1
*/ */
int cw_send_error_response(struct conn *conn, uint8_t * rawmsg, uint32_t result_code) int cw_send_error_response(struct cw_Conn *conn, uint8_t * rawmsg,
uint32_t result_code)
{ {
uint8_t *out, *dst; uint8_t *out, *dst;
int l; int l;
@ -155,14 +156,16 @@ int cw_send_error_response(struct conn *conn, uint8_t * rawmsg, uint32_t result_
} }
static struct cw_MsgSet *load_msg_set(struct conn *conn, uint8_t * rawmsg, int len, static struct cw_MsgSet *load_msg_set(struct cw_Conn *conn, uint8_t * rawmsg,
int elems_len, struct sockaddr *from) int len, int elems_len,
struct sockaddr *from)
{ {
char sock_buf[SOCK_ADDR_BUFSIZE]; char sock_buf[SOCK_ADDR_BUFSIZE];
struct cw_Mod *cmod, *bmod; struct cw_Mod *cmod, *bmod;
cmod = cmod =
cw_mod_detect(conn, rawmsg, len, elems_len, from, CW_MOD_MODE_CAPWAP); cw_mod_detect(conn, rawmsg, len, elems_len, from,
CW_MOD_MODE_CAPWAP);
if (cmod == MOD_NULL) { if (cmod == MOD_NULL) {
cw_dbg(DBG_MSG_ERR, cw_dbg(DBG_MSG_ERR,
"Can't find mod to handle connection from %s, discarding message", "Can't find mod to handle connection from %s, discarding message",
@ -171,7 +174,8 @@ static struct cw_MsgSet *load_msg_set(struct conn *conn, uint8_t * rawmsg, int l
} }
bmod = bmod =
cw_mod_detect(conn, rawmsg, len, elems_len, from, CW_MOD_MODE_BINDINGS); cw_mod_detect(conn, rawmsg, len, elems_len, from,
CW_MOD_MODE_BINDINGS);
cw_dbg(DBG_INFO, "Mods deteced: %s,%s", cmod->name, bmod->name); cw_dbg(DBG_INFO, "Mods deteced: %s,%s", cmod->name, bmod->name);
@ -184,7 +188,7 @@ static struct cw_MsgSet *load_msg_set(struct conn *conn, uint8_t * rawmsg, int l
} }
/* /*
int cw_in_check_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data, int cw_in_check_generic(struct cw_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)){
@ -197,7 +201,7 @@ int cw_in_check_generic(struct conn *conn, struct cw_action_in *a, uint8_t * dat
*/ */
/* /*
void cw_read_elem(struct cw_ElemHandler * handler, struct conn * conn, void cw_read_elem(struct cw_ElemHandler * handler, struct cw_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];
@ -211,7 +215,7 @@ void cw_read_elem(struct cw_ElemHandler * handler, struct conn * conn,
*/ */
static int process_elements(struct conn *conn, uint8_t * rawmsg, int len, static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
struct sockaddr *from) struct sockaddr *from)
{ {
mavl_t mand_found; mavl_t mand_found;
@ -223,6 +227,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
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 */
@ -243,7 +248,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
if (conn->strict_hdr) { if (conn->strict_hdr) {
cw_dbg(DBG_MSG_ERR, cw_dbg(DBG_MSG_ERR,
"Discarding message from %s, msgelems len=%d, payload len=%d, (Strict CAPWAP) ", "Discarding message from %s, msgelems len=%d, payload len=%d, (Strict CAPWAP) ",
sock_addr2str(&conn->addr,sock_buf), elems_len, payloadlen - 8); sock_addr2str(&conn->addr, sock_buf), elems_len,
payloadlen - 8);
errno = EAGAIN; errno = EAGAIN;
return -1; return -1;
} }
@ -252,7 +258,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
if (elems_len < payloadlen - 8) { if (elems_len < payloadlen - 8) {
cw_dbg(DBG_RFC, cw_dbg(DBG_RFC,
"Packet from from %s has %d bytes of extra data, ignoring.", "Packet from from %s has %d bytes of extra data, ignoring.",
sock_addr2str(&conn->addr,sock_buf), payloadlen - 8 - elems_len); sock_addr2str(&conn->addr, sock_buf),
payloadlen - 8 - elems_len);
elems_len = len - 8; elems_len = len - 8;
} }
@ -260,7 +267,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
cw_dbg(DBG_RFC, cw_dbg(DBG_RFC,
"Packet from from %s has msgelems len of %d bytes, but has only %d bytes of data, truncating.", "Packet from from %s has msgelems len of %d bytes, but has only %d bytes of data, truncating.",
sock_addr2str(&conn->addr, sock_buf), elems_len, payloadlen - 8); sock_addr2str(&conn->addr, sock_buf), elems_len,
payloadlen - 8);
elems_len = payloadlen - 8; elems_len = payloadlen - 8;
} }
} }
@ -269,7 +277,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
/* Detect the connecting AC type */ /* Detect the connecting AC type */
if (!conn->detected) { if (!conn->detected) {
struct cw_MsgSet *set = load_msg_set(conn, rawmsg, len, elems_len, from); struct cw_MsgSet *set =
load_msg_set(conn, rawmsg, len, elems_len, from);
if (!set) { if (!set) {
/* /*
//cw_log(LOG_ERR, "Error"); //cw_log(LOG_ERR, "Error");
@ -353,53 +362,9 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
/* if (conn->msg_start){
conn->msg_start(conn, afm, rawmsg, len, from);
}
*/
/* Execute start processor for message */
/*
// if (afm->start) {
// afm->start(conn, afm, rawmsg, len, from);
// }
*/
elems_ptr = cw_get_msg_elems_ptr(msg_ptr); elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
/* Create an avltree to catch the found mandatory elements */
/* //conn->mand = stravltree_create();*/
mand_found = mavl_create_conststr();
unrecognized = mlist_create(NULL,NULL,sizeof(uint8_t*));
cw_dbg(DBG_MSG_PARSING ,"*** Parsing message of type %d - (%s) ***",
message->type,message->name);
/* iterate through message elements */
cw_foreach_elem(elem, elems_ptr, elems_len) {
int rc;
struct cw_ElemHandlerParams params;
int elem_len, elem_id, max_len;
uint8_t * elem_data;
elem_len = cw_get_elem_len(elem);
elem_data=cw_get_elem_data(elem);
elem_id = cw_get_elem_id(elem);
max_len=elems_len-(elem_data-elems_ptr);
if (elem_len > max_len){
cw_dbg(DBG_RFC,
"Messag element claims size of %d bytes, but only %d bytes are left in the payload, truncating.",
elem_len,max_len-4);
}
/* params.conn=conn;*/
params.local_cfg = conn->local_cfg; params.local_cfg = conn->local_cfg;
params.remote_cfg = conn->remote_cfg; params.remote_cfg = conn->remote_cfg;
params.default_cfg = conn->default_cfg; params.default_cfg = conn->default_cfg;
@ -410,22 +375,22 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
params.msgdata = message; params.msgdata = message;
params.mand_found = mand_found; params.mand_found = mand_found;
rc = cw_process_element(&params,0,0,elem_id,elem_data,elem_len);
if (cw_result_is_ok(rc)) mand_found = mavl_create_conststr();
continue; unrecognized = mlist_create(NULL, NULL, sizeof(uint8_t *));
if (rc == CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT){
mlist_append(unrecognized,&elem);
continue;
}
if (rc < 0 ){
continue;
}
}
cw_dbg(DBG_MSG_PARSING, "*** Parsing message of type %d - (%s) ***",
message->type, message->name);
params.cfg = cw_cfg_create();
cw_decode_elements(&params,elems_ptr, elems_len);
exit(0);
/* all message elements are processed, do now after processing /* all message elements are processed, do now after processing
by calling the "end" function for the message */ by calling the "end" function for the message */
@ -455,7 +420,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
cw_send_error_response(conn, rawmsg, result_code); cw_send_error_response(conn, rawmsg, result_code);
} else if (result_code == 0) { } else if (result_code == 0) {
cw_ktv_set_dword(conn->local_cfg,"result-code",result_code); cw_ktv_set_dword(conn->local_cfg, "result-code",
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;
@ -486,7 +452,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
int process_message(struct conn *conn, uint8_t * rawmsg, int rawlen, int process_message(struct cw_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];
@ -560,7 +526,7 @@ int process_message(struct 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 conn *conn, uint8_t * packet, int len, int conn_process_packet2(struct cw_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];
@ -583,8 +549,8 @@ int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
/* wrong version */ /* wrong version */
cw_dbg(DBG_PKT_ERR, cw_dbg(DBG_PKT_ERR,
"Discarding packet from %s, wrong version, version=%d, version %d expected.", "Discarding packet from %s, wrong version, version=%d, version %d expected.",
sock_addr2str(&conn->addr,sock_buf), (preamble & 0xf0) >> 4, sock_addr2str(&conn->addr, sock_buf),
CAPWAP_VERSION); (preamble & 0xf0) >> 4, CAPWAP_VERSION);
errno = EAGAIN; errno = EAGAIN;
return -1; return -1;
} }
@ -619,7 +585,8 @@ int conn_process_packet2(struct conn *conn, uint8_t * packet, int len,
/* wrong rmac size */ /* wrong rmac size */
cw_dbg(DBG_PKT_ERR, cw_dbg(DBG_PKT_ERR,
"Discarding packet from %s, wrong R-MAC size, size=%d", "Discarding packet from %s, wrong R-MAC size, size=%d",
sock_addr2str(&conn->addr,sock_buf), *(packet + 8)); sock_addr2str(&conn->addr, sock_buf),
*(packet + 8));
errno = EAGAIN; errno = EAGAIN;
return -1; return -1;
} }
@ -655,8 +622,9 @@ int conn_process_packet2(struct 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 conn *conn, uint8_t * packet, int len, int conn_process_packet(struct cw_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);
@ -665,8 +633,9 @@ int conn_process_packet(struct conn *conn, uint8_t * packet, int len,
} }
int conn_process_data_packet(struct conn *conn, uint8_t * packet, int len, int conn_process_data_packet(struct cw_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);
@ -689,7 +658,7 @@ int conn_process_data_packet(struct conn *conn, uint8_t * packet, int len,
/** /**
* Used as main message loop * Used as main message loop
*/ */
int cw_read_messages(struct conn *conn) int cw_read_messages(struct cw_Conn *conn)
{ {
uint8_t buf[2024]; uint8_t buf[2024];
int len = 2024; int len = 2024;
@ -705,4 +674,3 @@ int cw_read_messages(struct conn *conn)
errno = EAGAIN; errno = EAGAIN;
return -1; return -1;
} }

View File

@ -25,7 +25,7 @@
#include "sock.h" #include "sock.h"
void conn_q_add_packet(struct conn * conn,uint8_t *packet,int len) void conn_q_add_packet(struct cw_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;

View File

@ -19,7 +19,7 @@
#include <time.h> #include <time.h>
#include "conn.h" #include "conn.h"
uint8_t * conn_q_get_packet(struct conn * conn) uint8_t * conn_q_get_packet(struct cw_Conn * conn)
{ {
int qrpos; int qrpos;
struct timespec timespec; struct timespec timespec;

View File

@ -22,7 +22,7 @@
#include "conn.h" #include "conn.h"
static int conn_q_recv_packet_(struct conn * conn, uint8_t * buffer,int len,int peek) static int conn_q_recv_packet_(struct cw_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 conn * conn, uint8_t * buffer,int len,int
return conn->cur_packet_len; return conn->cur_packet_len;
} }
int conn_q_recv_packet(struct conn * conn, uint8_t * buffer,int len) int conn_q_recv_packet(struct cw_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 conn * conn, uint8_t * buffer,int len) int conn_q_recv_packet_peek(struct cw_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);
} }

View File

@ -3,7 +3,7 @@
#include "conn.h" #include "conn.h"
int conn_q_wait_packet(struct conn * conn, int seconds) int conn_q_wait_packet(struct cw_Conn * conn, int seconds)
{ {
struct timespec timespec; struct timespec timespec;

View File

@ -27,7 +27,7 @@
#include "sock.h" #include "sock.h"
int conn_recv_packet_(struct conn *conn, uint8_t * buf, int len, int flags) int conn_recv_packet_(struct cw_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 conn *conn, uint8_t * buf, int len, int flags)
} }
int conn_recvfrom_packet(struct conn *conn, uint8_t * buf, int len, int conn_recvfrom_packet(struct cw_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 conn *conn, uint8_t * buf, int len,
#include "log.h" #include "log.h"
int conn_recv_packet_x(struct conn *conn, uint8_t * buf, int len, int flags) int conn_recv_packet_x(struct cw_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 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 conn *conn, uint8_t * buf, int len) int conn_recv_packet(struct cw_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 conn *conn, uint8_t * buf, int len) int conn_recv_packet_peek(struct cw_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;

View File

@ -29,7 +29,7 @@
#include "dbg.h" #include "dbg.h"
int conn_send_data_packet(struct conn * conn, const uint8_t * buffer, int len) int conn_send_data_packet(struct cw_Conn * conn, const uint8_t * buffer, int len)
{ {
char sock_buf[SOCK_ADDR_BUFSIZE]; char sock_buf[SOCK_ADDR_BUFSIZE];
int n; int n;

View File

@ -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 conn * conn,uint8_t * msg); extern cw_send_msg(struct cw_Conn * conn,uint8_t * msg);
int conn_send_msg(struct conn * conn, uint8_t *rawmsg) int conn_send_msg(struct cw_Conn * conn, uint8_t *rawmsg)
{ {
uint8_t * ptr; uint8_t * ptr;
int packetlen; int packetlen;
@ -18,9 +18,9 @@ int conn_send_msg(struct 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;

View File

@ -27,7 +27,7 @@
int conn_send_packet(struct conn * conn, const uint8_t * buffer, int len) int conn_send_packet(struct cw_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,

View File

@ -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 conn * c1 = * ( void ** ) d1 ; struct cw_Conn * c1 = * ( void ** ) d1 ;
struct conn * c2 = * ( void ** ) d2 ; struct cw_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 conn * c1 = * ( void ** ) d1 ; struct cw_Conn * c1 = * ( void ** ) d1 ;
struct conn * c2 = * ( void ** ) d2 ; struct cw_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 conn * c1 = *( void ** ) d1; struct cw_Conn * c1 = *( void ** ) d1;
struct conn * c2 = *( void ** ) d2; struct cw_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 conn * connlist_get ( struct connlist * cl, const struct sockaddr * addr ) struct cw_Conn * connlist_get ( struct connlist * cl, const struct sockaddr * addr )
{ {
struct conn search; struct cw_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 conn * connlist_add ( struct connlist * cl, struct conn * conn ) struct cw_Conn * connlist_add ( struct connlist * cl, struct cw_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 conn * connlist_add ( struct connlist * cl, struct conn * conn )
return mavl_insert_ptr ( cl->by_addr, conn ); return mavl_insert_ptr ( cl->by_addr, conn );
} }
struct conn * connlist_get_by_session_id ( struct connlist *cl, struct conn * conn ) struct cw_Conn * connlist_get_by_session_id ( struct connlist *cl, struct cw_Conn * conn )
{ {
return mavl_get_ptr ( cl->by_session_id, conn ); return mavl_get_ptr ( cl->by_session_id, conn );
} }
struct conn * connlist_add_by_session_id ( struct connlist * cl, struct conn * conn ) struct cw_Conn * connlist_add_by_session_id ( struct connlist * cl, struct cw_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 conn * conn ) void connlist_remove ( struct connlist *cl, struct cw_Conn * conn )
{ {
void * md; void * md;
md = conn; md = conn;

View File

@ -7,7 +7,7 @@
#include "pthread.h" #include "pthread.h"
struct connlist { struct connlist {
/* struct conn ** connlist; */ /* struct cw_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 conn *connlist_get(struct connlist *cl, const struct sockaddr *addr); struct cw_Conn *connlist_get(struct connlist *cl, const struct sockaddr *addr);
struct conn *connlist_add(struct connlist *cl, struct conn *conn); struct cw_Conn *connlist_add(struct connlist *cl, struct cw_Conn *conn);
void connlist_remove(struct connlist *cl, struct conn *conn); void connlist_remove(struct connlist *cl, struct cw_Conn *conn);
void connlist_destroy(struct connlist *cl); void connlist_destroy(struct connlist *cl);
struct conn * connlist_get_by_session_id(struct connlist *cl, struct conn * conn); struct cw_Conn * connlist_get_by_session_id(struct connlist *cl, struct cw_Conn * conn);
struct conn * connlist_add_by_session_id(struct connlist * cl, struct conn * conn); struct cw_Conn * connlist_add_by_session_id(struct connlist * cl, struct cw_Conn * conn);
#endif #endif

View File

@ -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 conn *conn);*/ /*extern int cw_put_ac_status(uint8_t * dst, struct cw_ac_status *s, struct cw_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 conn *conn, int cw_read_wtp_descriptor(mavl_t mbag, struct cw_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 conn *conn, int cw_read_wtp_descriptor(mavl_t mbag, struct cw_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 conn *conn, extern int cw_read_wtp_descriptor_7(mavl_t mbag, struct cw_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 conn * conn, mavl_t cfg, const char *prefix, char * default_cipher); int cw_setup_dtls(struct cw_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 conn *conn, struct cw_action_in *a, extern int cw_in_wtp_reboot_statistics(struct cw_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 conn *conn, struct cw_action_in *a, uint8_t * data, extern int cw_in_wtp_board_data(struct cw_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 conn *conn, struct cw_action_in *a, extern int cw_in_capwap_control_ip_address(struct cw_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 conn *conn, struct cw_action_in *a, extern int cw_in_capwap_local_ipv4_address(struct cw_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 conn *conn, struct cw_action_in *a, extern int cw_in_capwap_local_ipv6_address(struct cw_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 conn *conn, struct cw_action_in *a, extern int cw_in_radio_operational_state(struct cw_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 conn * conn, int cw_process_element(struct cw_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 conn *conn, int msg_id); void cw_init_request(struct cw_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 conn *conn); int cw_detect_nat(struct cw_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 conn *conn, struct cw_action_out *a, uint8_t * dst);*/ /*int cw_out_radio_generic(struct cw_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 conn *conn, uint8_t * rawout); int cw_put_msg(struct cw_Conn *conn, uint8_t * rawout);
/** /**
* @} * @}

View File

@ -11,7 +11,7 @@ int cw_decode_element(struct cw_ElemHandlerParams *params, int proto,
struct cw_ElemData *elem_data, elem_data_search; struct cw_ElemData *elem_data, elem_data_search;
int rc; int rc;
params->elem = NULL; //params->elem = NULL;
/* try to retrieve a handler for this message element */ /* try to retrieve a handler for this message element */
handler = handler =
@ -66,10 +66,8 @@ 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;
} }
@ -123,4 +121,7 @@ int cw_decode_elements(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr
} }
mavl_destroy(mand_found);
mlist_destroy(unrecognized);
return 0;
} }

View File

@ -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 conn *conn) int cw_detect_nat(struct cw_Conn *conn)
{ {
cw_Val_t * result; cw_Val_t * result;

View File

@ -35,10 +35,6 @@ 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;
} }

View File

@ -9,7 +9,7 @@
int cw_in_capwap_local_ipv6_address(struct conn *conn, struct cw_action_in *a, int cw_in_capwap_local_ipv6_address(struct cw_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;

View File

@ -1,32 +0,0 @@
#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;
}

View File

@ -8,14 +8,43 @@ 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];
if (!handler->type){ memset(&val,0,sizeof(cw_Val_t));
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;
} }
result = cw_ktv_add(params->remote_cfg, handler->key, type->read(params->local_cfg, handler->key,elem_data,elem_len,handler->param);
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;
} }

View File

@ -19,7 +19,7 @@ int cw_in_idx_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerPara
result = cw_ktv_add(params->remote_cfg, key, result = cw_ktv_add(params->remote_cfg, key,
handler->type, NULL, elem_data+1,elem_len-1); handler->type, NULL, elem_data+1,elem_len-1);
params->elem=result; // params->elem=result;
return CAPWAP_RESULT_SUCCESS; return CAPWAP_RESULT_SUCCESS;
} }

View File

@ -21,7 +21,7 @@
#include "log.h" #include "log.h"
int cw_in_wtp_reboot_statistics(struct conn *conn, struct cw_action_in *a, uint8_t * data, int cw_in_wtp_reboot_statistics(struct cw_Conn *conn, struct cw_action_in *a, uint8_t * data,
int len, struct sockaddr *from) int len, struct sockaddr *from)
{ {
/* /*

View File

@ -20,7 +20,7 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo
struct cw_ElemData * elem_data, elem_data_search; struct cw_ElemData * elem_data, elem_data_search;
int rc; int rc;
params->elem=NULL; // params->elem=NULL;
/* try to retrieve a handler for this message element */ /* try to retrieve a handler for this message element */
handler = cw_msgset_get_elemhandler(params->msgset,proto, vendor, elem_id); handler = cw_msgset_get_elemhandler(params->msgset,proto, vendor, elem_id);

View File

@ -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 conn *conn, uint8_t * rawout) int cw_put_msg(struct cw_Conn *conn, uint8_t * rawout)
{ {
char details[1024]; char details[1024];
uint8_t *msgptr,*dst; uint8_t *msgptr,*dst;
@ -45,6 +45,7 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
struct mlistelem * elem; struct mlistelem * elem;
int len,l; int len,l;
printf("Hello msg\n");
cw_dbg(DBG_INFO, "Number of elements in ktv: %d",conn->local_cfg->count); cw_dbg(DBG_INFO, "Number of elements in ktv: %d",conn->local_cfg->count);
/* cw_dbg_ktv_dump(conn->local_cfg,DBG_CFG_DMP,"Local CFG","LOCAL:","End Local CFG");*/ /* cw_dbg_ktv_dump(conn->local_cfg,DBG_CFG_DMP,"Local CFG","LOCAL:","End Local CFG");*/
@ -104,7 +105,7 @@ printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name
params.elemdata = data; params.elemdata = data;
params.elem=NULL; // params.elem=NULL;
params.msgdata=msg; params.msgdata=msg;
params.debug_details=details; params.debug_details=details;
*details=0; *details=0;
@ -173,7 +174,7 @@ printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name
*/ */
int cw_put_custom_msg(struct conn *conn, uint8_t * rawout, /*mavl_conststr_t elems*/ int t) int cw_put_custom_msg(struct cw_Conn *conn, uint8_t * rawout, /*mavl_conststr_t elems*/ int t)
{ {
/* /*

View File

@ -41,18 +41,17 @@ 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, "Can't handle sub-elem, vendor or type unknown", /* cw_dbg_version_subelem(DBG_ELEM_ERR,
subtype, vendor_id, data+sub+8, sublen); "Can't handle sub-elem, vendor or type unknown",
subtype, vendor_id,
data + sub + 8, sublen);*/
errors++; errors++;
} else { } else {
int l = sublen; int l = sublen;
@ -69,15 +68,24 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key,
/* vendor */ /* vendor */
sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_SKEY_VENDOR); sprintf(key, "%s/%s/%s", parent_key, elems[i].key,
cw_ktv_add(cfg,key,CW_TYPE_DWORD,NULL,data + sub,4); CW_SKEY_VENDOR);
cw_cfg_set_int(cfg, key, vendor_id);
/* version */ /* version */
sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_SKEY_VERSION); sprintf(key, "%s/%s/%s", parent_key, elems[i].key,
cw_ktv_add(cfg,key,CW_TYPE_BSTR16,NULL,data+sub+8,l); CW_SKEY_VERSION);
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++;
} }

View File

@ -2,7 +2,7 @@
#include "log.h" #include "log.h"
int cw_read_from(struct conn *conn, struct sockaddr_storage *from) int cw_read_from(struct cw_Conn *conn, struct sockaddr_storage *from)
{ {
int n; int n;
uint8_t buf[2024]; uint8_t buf[2024];

View File

@ -24,7 +24,7 @@ int cw_in_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerPa
result = cw_ktv_add(params->remote_cfg, key, result = cw_ktv_add(params->remote_cfg, key,
handler->type, NULL, elem_data+1,elem_len-1); handler->type, NULL, elem_data+1,elem_len-1);
params->elem=result; // params->elem=result;
return CAPWAP_RESULT_SUCCESS; return CAPWAP_RESULT_SUCCESS;
} }

View File

@ -16,7 +16,7 @@ static struct cw_DescriptorSubelemDef allowed_default[] = {
}; };
int cw_read_wtp_descriptor(mavl_t cfg, struct conn *conn, int cw_read_wtp_descriptor(mavl_t cfg, struct cw_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)
{ {

View File

@ -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 conn *conn, int cw_read_wtp_descriptor_7(mavl_t cfg, struct cw_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,11 +30,10 @@ int cw_read_wtp_descriptor_7(mavl_t cfg, struct 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_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data,1); cw_cfg_set_int(cfg,key,cw_get_byte(data));
sprintf(key,"%s/%s",eh->key, CW_SKEY_RADIOS_IN_USE); sprintf(key,"%s/%s",eh->key, CW_SKEY_RADIOS_IN_USE);
cw_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data+1,1); cw_cfg_set_int(cfg,key,cw_get_byte(data+1));
pos = 2; pos = 2;

View File

@ -1,8 +1,10 @@
#include "cw.h" #include "cw.h"
#include "cfg.h"
static int get_psk(struct conn * conn,const char * username, uint8_t **psk, unsigned int *len) static int get_psk(struct cw_Conn *conn, const char *username, uint8_t ** psk,
unsigned int *len)
{ {
char key[CW_KTV_MAX_KEY_LEN]; char key[CW_KTV_MAX_KEY_LEN];
cw_Val_t *result; cw_Val_t *result;
@ -33,7 +35,8 @@ static int get_psk(struct conn * conn,const char * username, uint8_t **psk, unsi
* @param default_cipher * @param default_cipher
* @return * @return
*/ */
int cw_setup_dtls(struct conn * conn, mavl_t cfg, const char *prefix, char * default_cipher) int cw_setup_dtls(struct cw_Conn *conn, mavl_t cfg, const char *prefix,
char *default_cipher)
{ {
char key[CW_KTV_MAX_KEY_LEN]; char key[CW_KTV_MAX_KEY_LEN];
char *ssl_cert, *ssl_key; char *ssl_cert, *ssl_key;
@ -42,14 +45,14 @@ int cw_setup_dtls(struct conn * conn, mavl_t cfg, const char *prefix, char * de
security = 0; security = 0;
sprintf(key, "%s/%s", prefix, "ssl-cipher"); sprintf(key, "%s/%s", prefix, "ssl-cipher");
conn->dtls_cipher = cw_ktv_get_str(cfg,key, default_cipher); conn->dtls_cipher = cw_cfg_get(cfg, key, default_cipher);
sprintf(key, "%s/%s", prefix, "ssl-psk"); sprintf(key, "%s/%s", prefix, "ssl-psk");
conn->dtls_psk = cw_ktv_get_bstr16(cfg,key,NULL); conn->dtls_psk = cw_cfg_get(cfg, key, NULL);
sprintf(key, "%s/%s", prefix, "ssl-psk-enable"); sprintf(key, "%s/%s", prefix, "ssl-psk-enable");
conn->dtls_psk_enable = cw_ktv_get_bool(cfg,key,0); conn->dtls_psk_enable = cw_cfg_get_bool(cfg, key, "flase");
if (conn->dtls_psk_enable) { if (conn->dtls_psk_enable) {
security |= CAPWAP_FLAG_AC_SECURITY_S; security |= CAPWAP_FLAG_AC_SECURITY_S;
@ -58,20 +61,20 @@ int cw_setup_dtls(struct conn * conn, mavl_t cfg, const char *prefix, char * de
sprintf(key, "%s/%s", prefix, "ssl-certfile"); sprintf(key, "%s/%s", prefix, "ssl-certfile");
ssl_cert = cw_ktv_get_str(conn->local_cfg,key,NULL); ssl_cert = cw_cfg_get(conn->local_cfg, key, NULL);
sprintf(key, "%s/%s", prefix, "ssl-keyfile"); sprintf(key, "%s/%s", prefix, "ssl-keyfile");
ssl_key = cw_ktv_get_str(conn->local_cfg,key,NULL); ssl_key = cw_cfg_get(conn->local_cfg, key, NULL);
if (ssl_cert != NULL && ssl_key != NULL) { if (ssl_cert != NULL && ssl_key != NULL) {
conn->dtls_cert_file = ssl_cert; conn->dtls_cert_file = ssl_cert;
conn->dtls_key_file = ssl_key; conn->dtls_key_file = ssl_key;
sprintf(key, "%s/%s", prefix, "ssl-keypass"); sprintf(key, "%s/%s", prefix, "ssl-keypass");
conn->dtls_key_pass = cw_ktv_get_str(cfg,key,NULL); conn->dtls_key_pass = cw_cfg_get(cfg, key, NULL);
security |= CAPWAP_FLAG_AC_SECURITY_X; security |= CAPWAP_FLAG_AC_SECURITY_X;
} }
sprintf(key, "%s/%s", prefix, "ssl-dhbits"); sprintf(key, "%s/%s", prefix, "ssl-dhbits");
conn->dtls_dhbits = cw_ktv_get_word(cfg,key,1024); conn->dtls_dhbits = cw_cfg_get_word(cfg, key, "1024");
conn->dtls_get_psk = get_psk; conn->dtls_get_psk = get_psk;

View File

@ -104,6 +104,32 @@ 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 */
@ -115,7 +141,10 @@ 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
}; };

View File

@ -35,6 +35,9 @@ 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;
@ -121,6 +124,26 @@ 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 */
@ -132,5 +155,8 @@ 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
}; };

95
src/cw/cw_type_struct.c Normal file
View File

@ -0,0 +1,95 @@
#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
};

View File

@ -133,6 +133,9 @@ 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 - "},
@ -208,7 +211,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 conn *conn, int ** ml, int n, void cw_dbg_missing_mand(int level, struct cw_Conn *conn, int ** ml, int n,
int * a) int * a)
{ {
/* /*
@ -243,7 +246,7 @@ void cw_dbg_missing_mand(int level, struct 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 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) struct sockaddr *from)
{ {
@ -305,7 +308,7 @@ void cw_dbg_dmp(int level, const uint8_t * data, int len, const char *format, ..
} }
void cw_dbg_msg(int level, struct conn *conn, uint8_t * packet, int len, void cw_dbg_msg(int level, struct cw_Conn *conn, uint8_t * packet, int len,
struct sockaddr *from) struct sockaddr *from)
{ {
@ -360,96 +363,6 @@ void cw_dbg_msg(int level, struct 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;
@ -470,7 +383,7 @@ void cw_dbg(int level, const char *format, ...){
void cw_dbg_elem(int level, struct conn *conn, int msg, void cw_dbg_elem(int level, struct cw_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];

View File

@ -115,6 +115,8 @@ enum cw_dbg_levels{
DBG_CFG_DMP, DBG_CFG_DMP,
DBG_CFG_SET,
/** Debug Mods */ /** Debug Mods */
DBG_MOD, DBG_MOD,
@ -147,14 +149,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 conn * conn, int msg, int msgelem, const uint8_t * msgbuf, int len); void cw_dbg_elem_(struct cw_Conn * conn, int msg, int msgelem, const uint8_t * msgbuf, int len);
*/ */
/* /*
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_missing_mand(int level,struct cw_Conn *conn,cw_action_in_t ** ml,int n,cw_action_in_t *a);
*/ */
void cw_dbg_packet(struct conn *conn, uint8_t * packet, int len); void cw_dbg_packet(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); void cw_dbg_pkt(int level,struct cw_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, ...);
@ -199,16 +201,16 @@ void cw_dbg_dmp_(int level, const uint8_t * data, int len, const char *format, .
void cw_dbg_elem(int level, struct conn *conn, int msg, void cw_dbg_elem(int level, struct cw_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 conn *conn, 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);
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 );

View File

@ -63,6 +63,9 @@ 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" },

View File

@ -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 conn *conn, char *out, int maxlen) int dtls_bio_read(struct cw_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 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 conn *conn, const char *data, int len) int dtls_bio_write(struct cw_Conn *conn, const char *data, int len)
{ {
uint8_t buffer[4096]; uint8_t buffer[4096];
int rc; int rc;

View File

@ -217,7 +217,7 @@ void dtls_openssl_data_destroy(struct dtls_openssl_data * d){
free(d); free(d);
} }
int dtls_openssl_set_certs(struct conn * conn, struct dtls_openssl_data *d) int dtls_openssl_set_certs(struct cw_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 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 conn * conn = b->ptr; struct cw_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 conn * conn = BIO_get_data(b); /*->ptr;*/ struct cw_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 conn * conn, const SSL_METHOD * method, BIO_METHOD * bio) struct dtls_openssl_data * dtls_openssl_data_create(struct cw_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 conn *conn) int dtls_openssl_shutdown(struct cw_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 conn * conn = BIO_get_data(b); /*b->ptr;*/ struct cw_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 conn * conn = b->ptr;*/ /*struct cw_Conn * conn = b->ptr;*/
struct conn * conn = BIO_get_data(b); /*b->ptr;*/ struct cw_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 conn * conn, uint8_t *buffer, int len) int dtls_openssl_read(struct cw_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 conn * conn, uint8_t *buffer, int len)
return rc; return rc;
} }
int dtls_openssl_write(struct conn * conn, const uint8_t *buffer, int len) int dtls_openssl_write(struct cw_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);

View File

@ -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 conn * conn, const SSL_METHOD * method, BIO_METHOD * bio); struct dtls_openssl_data * dtls_openssl_data_create(struct cw_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 conn * conn, uint8_t *buffer, int len); extern int dtls_openssl_read(struct cw_Conn * conn, uint8_t *buffer, int len);
extern int dtls_openssl_write(struct conn * conn, const uint8_t *buffer, int len); extern int dtls_openssl_write(struct cw_Conn * conn, const uint8_t *buffer, int len);
extern int dtls_openssl_connect(struct conn * conn); extern int dtls_openssl_connect(struct cw_Conn * conn);
extern const char * dtls_openssl_get_cipher(struct conn * conn, char *dst); extern const char * dtls_openssl_get_cipher(struct cw_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 conn * conn); extern int dtls_openssl_accept(struct cw_Conn * conn);
extern int dtls_openssl_set_certs(struct conn * conn, struct dtls_openssl_data *d); extern int dtls_openssl_set_certs(struct cw_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 conn *conn); extern int dtls_openssl_shutdown(struct cw_Conn *conn);
/** /**
* @} * @}

View File

@ -24,7 +24,7 @@
#include "dtls_openssl.h" #include "dtls_openssl.h"
#include "log.h" #include "log.h"
int dtls_openssl_accept(struct conn *conn) int dtls_openssl_accept(struct cw_Conn *conn)
{ {
struct dtls_openssl_data *d; struct dtls_openssl_data *d;
char sock_buf[SOCK_ADDR_BUFSIZE]; char sock_buf[SOCK_ADDR_BUFSIZE];

View File

@ -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 conn *conn = b->ptr;*/ /* struct cw_Conn *conn = b->ptr;*/
struct conn *conn = BIO_get_data(b); struct cw_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 conn *conn = b->ptr;*/ /*struct cw_Conn *conn = b->ptr;*/
struct conn *conn = BIO_get_data(b); struct cw_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 conn *conn = b->ptr;*/ /*struct cw_Conn *conn = b->ptr;*/
struct conn *conn = BIO_get_data(b); struct cw_Conn *conn = BIO_get_data(b);
long ret = 1; long ret = 1;
switch (cmd) { switch (cmd) {

View File

@ -15,8 +15,8 @@
{ {
int l; int l;
BIO *b = SSL_get_rbio(ssl); BIO *b = SSL_get_rbio(ssl);
/*struct conn *conn = b->ptr;*/ /*struct cw_Conn *conn = b->ptr;*/
struct conn * conn = BIO_get_data(b); /*b->ptr;*/ struct cw_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 conn *conn) dtls_openssl_connect(struct cw_Conn *conn)
{ {
struct dtls_openssl_data *d; struct dtls_openssl_data *d;
int rc; int rc;

View File

@ -19,7 +19,7 @@
#include "dtls_openssl.h" #include "dtls_openssl.h"
const char * dtls_openssl_get_cipher(struct conn * conn, char *dst) const char * dtls_openssl_get_cipher(struct cw_Conn * conn, char *dst)
{ {
struct dtls_openssl_data * d; struct dtls_openssl_data * d;
const SSL_CIPHER * c; const SSL_CIPHER * c;

View File

@ -6,7 +6,7 @@
#include "mavl.h" #include "mavl.h"
#include "val.h" #include "val.h"
#include "cfg.h"
struct cw_ElemDef{ struct cw_ElemDef{
int proto; int proto;
@ -29,8 +29,9 @@ struct cw_ElemHandlerParams {
struct cw_ElemData * elemdata; struct cw_ElemData * elemdata;
struct sockaddr *from; struct sockaddr *from;
mavl_t mand_found; mavl_t mand_found;
cw_Val_t * elem; // cw_Val_t * elem;
char * debug_details; char * debug_details;
cw_Cfg_t * cfg;
mavl_t remote_cfg; mavl_t remote_cfg;
mavl_t local_cfg; mavl_t local_cfg;
mavl_t default_cfg; mavl_t default_cfg;
@ -57,7 +58,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;
}; };

View File

@ -37,7 +37,7 @@
int conn_send_data_msg(struct conn * conn, uint8_t *rawmsg,int len) int conn_send_data_msg(struct cw_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 conn * conn, uint8_t *rawmsg,int len)
#define MAX_MTU 9500 #define MAX_MTU 9500
int int
cw_send_msg( struct conn * conn, uint8_t *msg) cw_send_msg( struct cw_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 conn * conn, uint8_t *msg)
int cw_send_request(struct conn *conn,int msg_id) int cw_send_request(struct cw_Conn *conn,int msg_id)
{ {
time_t timer; time_t timer;
int i; int i;
@ -218,7 +218,7 @@ int cw_send_request(struct 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 conn *conn,int msg_id) int cw_send_custom_request_2(struct cw_Conn *conn,int msg_id)
{ {

View File

@ -8,6 +8,7 @@
#include "mavltypes.h" #include "mavltypes.h"
#include "bstr.h" #include "bstr.h"
#include "cfg.h"
/** /**
@ -53,7 +54,7 @@ typedef struct cw_Val cw_Val_t;
/** /**
* @class cw_Type * @class cw_Type
* @author 7u83 * @author 7u83
* @file ktv.h * @file val.h
* @brief Representation of a cw_Type objetc * @brief Representation of a cw_Type objetc
*/ */
struct cw_Type { struct cw_Type {
@ -91,6 +92,9 @@ 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;
@ -117,8 +121,12 @@ typedef struct cw_ValStruct cw_ValStruct_t;
#define CW_KTVSTRUCT_L16 -2 #define CW_STRUCT_LEN_WORD -2
#define CW_KTVSTRUCT_L8 -3 #define CW_STRUCT_LEN_BYTE -3
#define CW_KTVSTRUCT_L8 -2
#define CW_KTVSTRUCT_L16 -3
struct cw_ValEnum{ struct cw_ValEnum{
int value; int value;
@ -152,6 +160,7 @@ 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)
@ -162,6 +171,8 @@ extern const struct cw_Type cw_type_bool;
#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);
*/ */

View File

@ -29,7 +29,7 @@
#include "cw/mavltypes.h" #include "cw/mavltypes.h"
static int postprocess_join_request(struct conn *conn); static int postprocess_join_request(struct cw_Conn *conn);
static cw_ValStruct_t wtp_reboot_statistics[] = { static cw_ValStruct_t wtp_reboot_statistics[] = {
@ -64,6 +64,25 @@ 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}
@ -77,9 +96,13 @@ 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 */
CW_KEY_DISCOVERY_TYPE, /* Key */ "discovery-type", /* Key */
cw_in_generic, /* get */ cw_in_generic, /* get */
cw_out_generic /* put */ cw_out_generic, /* put */
NULL,
NULL,
discovery_types,
} }
, ,
{ {
@ -88,9 +111,12 @@ 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 */
CW_KEY_WTP_MAC_TYPE, /* 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
} }
, ,
{ {
@ -746,7 +772,7 @@ static struct cw_MsgDef messages[] = {
}; };
static int postprocess_join_request(struct conn *conn) static int postprocess_join_request(struct cw_Conn *conn)
{ {
cw_Val_t * result; cw_Val_t * result;

View File

@ -34,7 +34,7 @@ static int init(struct cw_Mod * mod, mavl_t global_cfg, int role)
} }
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len, static int detect(struct cw_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 conn *conn, const uint8_t * rawmsg, int rawlen, int ele
} }
int static setup_cfg(struct conn * conn) int static setup_cfg(struct cw_Conn * conn)
{ {
int security; int security;

View File

@ -756,10 +756,13 @@ 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 */
cisco_wtp_board_data_options, /* type */ CW_TYPE_STRUCT, /* type */
"cisco/wtp-board-data/options", /* Key */ "cisco/wtp-board-data/options", /* Key */
cw_in_generic_struct, /* handler */ cw_in_generic, /* handler */
cw_out_generic_struct /* put */ cw_out_generic, /* put */
NULL,
NULL,
cisco_wtp_board_data_options, /* struct datae */
} }
, ,
{ {
@ -2141,7 +2144,7 @@ static cw_StateMachineState_t statemachine_states[]={
}; };
static int (*postprocess_join_request_parent)(struct conn * conn); static int (*postprocess_join_request_parent)(struct cw_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;
@ -2161,7 +2164,7 @@ struct cw_MsgSet * cisco_register_msg_set(struct cw_MsgSet * set, int mode){
static void set_ac_version(struct conn * conn) static void set_ac_version(struct cw_Conn * conn)
{ {
cw_Val_t * wtpver; cw_Val_t * wtpver;
char verstr[512]; char verstr[512];
@ -2188,7 +2191,7 @@ static void set_ac_version(struct conn * conn)
} }
} }
static int postprocess_discovery(struct conn *conn) static int postprocess_discovery(struct cw_Conn *conn)
{ {
if (conn->role == CW_ROLE_AC ){ if (conn->role == CW_ROLE_AC ){
set_ac_version(conn); set_ac_version(conn);
@ -2197,7 +2200,7 @@ static int postprocess_discovery(struct conn *conn)
return 1; return 1;
} }
static int postprocess_join_request(struct conn *conn) static int postprocess_join_request(struct cw_Conn *conn)
{ {
if (postprocess_join_request_parent!=NULL){ if (postprocess_join_request_parent!=NULL){
postprocess_join_request_parent(conn); postprocess_join_request_parent(conn);
@ -2206,7 +2209,7 @@ static int postprocess_join_request(struct conn *conn)
return 1; return 1;
} }
static int preprocess_join_request(struct conn *conn) static int preprocess_join_request(struct cw_Conn *conn)
{ {
cw_Val_t * ver; cw_Val_t * ver;
int use_ac_version; int use_ac_version;

View File

@ -35,7 +35,7 @@ int cisco_in_wtp_descriptor(struct cw_ElemHandler *eh, struct cw_ElemHandlerPara
}; };
return cw_read_wtp_descriptor_7(params->remote_cfg, NULL /*params->conn*/, eh, data, len, allowed); return cw_read_wtp_descriptor_7(params->cfg, NULL /*params->conn*/, eh, data, len, allowed);
} }

View File

@ -4,6 +4,7 @@
#include "cw/log.h" #include "cw/log.h"
#include "cw/dbg.h" #include "cw/dbg.h"
#include "cw/dtls.h" #include "cw/dtls.h"
#include "cw/cfg.h"
/*#include "mod_cisco.h"*/ /*#include "mod_cisco.h"*/
@ -167,7 +168,7 @@ static int init(struct cw_Mod *mod, mavl_t global_cfg, int role)
return rc; return rc;
} }
static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len, static int detect(struct cw_Conn *conn, const uint8_t * rawmsg, int rawlen, int elems_len,
struct sockaddr *from, int mode) struct sockaddr *from, int mode)
{ {
@ -220,7 +221,7 @@ static struct cw_Mod capwap_ac = {
*/ */
int static setup_cfg(struct conn * conn) int static setup_cfg(struct cw_Conn * conn)
{ {
int security; int security;
@ -228,7 +229,7 @@ int static setup_cfg(struct conn * conn)
conn->header_len=header_len; conn->header_len=header_len;
security = cw_setup_dtls(conn,conn->local_cfg,"cisco",CAPWAP_CIPHER); security = cw_setup_dtls(conn,conn->local_cfg,"cisco",CAPWAP_CIPHER);
cw_ktv_set_byte(conn->local_cfg,"ac-descriptor/security",security); cw_cfg_set_int(conn->local_cfg,"ac-descriptor/security",security);
if (conn->default_cfg==NULL){ if (conn->default_cfg==NULL){
conn->default_cfg=cw_ktv_create(); conn->default_cfg=cw_ktv_create();