Debugging colored, cool

FossilOrigin-Name: b62ab94004ae914a6c042383ef399141a1a82e49408b6ae3b1422ba3c72733b1
This commit is contained in:
7u83@mail.ru 2018-03-19 16:26:01 +00:00
parent 7832ca1336
commit 34646183a1
28 changed files with 194 additions and 282 deletions

View File

@ -3,9 +3,9 @@
<Project Name="ac" Path="ac.project" Active="No"/> <Project Name="ac" Path="ac.project" Active="No"/>
<Project Name="wtp" Path="wtp.project" Active="No"/> <Project Name="wtp" Path="wtp.project" Active="No"/>
<Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/> <Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/>
<Project Name="mod_capwap" Path="mod_capwap.project" Active="No"/> <Project Name="mod_capwap" Path="mod_capwap.project" Active="Yes"/>
<Project Name="mod_cisco" Path="mod_cisco.project" Active="No"/> <Project Name="mod_cisco" Path="mod_cisco.project" Active="No"/>
<Project Name="libcw" Path="libcw.project" Active="Yes"/> <Project Name="libcw" Path="libcw.project" Active="No"/>
<Project Name="mod_capwap80211" Path="mod_capwap80211.project" Active="No"/> <Project Name="mod_capwap80211" Path="mod_capwap80211.project" Active="No"/>
<Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/> <Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/>
<BuildMatrix> <BuildMatrix>

View File

@ -43,7 +43,6 @@
<File Name="src/cw/radioinfo.h"/> <File Name="src/cw/radioinfo.h"/>
<File Name="src/cw/capwap80211.h"/> <File Name="src/cw/capwap80211.h"/>
<File Name="src/cw/conn_init.c"/> <File Name="src/cw/conn_init.c"/>
<File Name="src/cw/item_strings.c"/>
<File Name="src/cw/strheap.h"/> <File Name="src/cw/strheap.h"/>
<File Name="src/cw/cw_in_check_join_req.c"/> <File Name="src/cw/cw_in_check_join_req.c"/>
<File Name="src/cw/cw_put_radio_operational_states.c"/> <File Name="src/cw/cw_put_radio_operational_states.c"/>
@ -236,7 +235,6 @@
<File Name="src/cw/timer.h"/> <File Name="src/cw/timer.h"/>
<File Name="src/cw/mavl_foreach.c"/> <File Name="src/cw/mavl_foreach.c"/>
<File Name="src/cw/lwapp_cisco.h"/> <File Name="src/cw/lwapp_cisco.h"/>
<File Name="src/cw/hdr_print.c"/>
<File Name="src/cw/cw_init_data_keep_alive_msg.c"/> <File Name="src/cw/cw_init_data_keep_alive_msg.c"/>
<File Name="src/cw/capwap_strings_item.c"/> <File Name="src/cw/capwap_strings_item.c"/>
<File Name="src/cw/cw_out_ac_name_with_priority.c"/> <File Name="src/cw/cw_out_ac_name_with_priority.c"/>
@ -299,6 +297,7 @@
<File Name="src/cw/cw_dbg_set_level.c"/> <File Name="src/cw/cw_dbg_set_level.c"/>
<File Name="src/cw/cw_dbg_set_level_from_str.c"/> <File Name="src/cw/cw_dbg_set_level_from_str.c"/>
<File Name="src/cw/ansi_colors.h"/> <File Name="src/cw/ansi_colors.h"/>
<File Name="src/cw/cw_clock_lap.c"/>
</VirtualDirectory> </VirtualDirectory>
</VirtualDirectory> </VirtualDirectory>
<Description/> <Description/>

View File

@ -227,7 +227,7 @@ int main (int argc, char *argv[])
fclose(file); fclose(file);
cw_ktv_dump(global_cfg,DBG_INFO,NULL,"CFG:",NULL); cw_dbg_ktv_dump(global_cfg,DBG_INFO,NULL,"CFG:",NULL);
actube_global_cfg = global_cfg; actube_global_cfg = global_cfg;

View File

@ -10,7 +10,7 @@
#define ANSI_YELLOW "\x1b[33m" #define ANSI_YELLOW "\x1b[33m"
#define ANSI_BLUE "\x1b[34m" #define ANSI_BLUE "\x1b[34m"
#define ANSI_MAGENTA "\x1b[35m" #define ANSI_MAGENTA "\x1b[35m"
#define ANSI_CYAN "\x1b[35m" #define ANSI_CYAN "\x1b[36m"
#define ANSI_WHITE "\x1b[37m" #define ANSI_WHITE "\x1b[37m"
#define ANSI_BBLACK "\x1b[90m" #define ANSI_BBLACK "\x1b[90m"
@ -19,7 +19,7 @@
#define ANSI_BYELLOW "\x1b[93m" #define ANSI_BYELLOW "\x1b[93m"
#define ANSI_BBLUE "\x1b[94m" #define ANSI_BBLUE "\x1b[94m"
#define ANSI_BMAGENTA "\x1b[95m" #define ANSI_BMAGENTA "\x1b[95m"
#define ANSI_BCYAN "\x1b[95m" #define ANSI_BCYAN "\x1b[96m"
#define ANSI_BWHITE "\x1b[97m" #define ANSI_BWHITE "\x1b[97m"
#define ANSI_ITALIC "\x1b[3m" #define ANSI_ITALIC "\x1b[3m"

View File

@ -355,7 +355,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
mand_found = mavl_create_conststr(); mand_found = mavl_create_conststr();
unrecognized = mlist_create(NULL,NULL,sizeof(uint8_t*)); unrecognized = mlist_create(NULL,NULL,sizeof(uint8_t*));
cw_dbg(DBG_MSG_PARSING ,"*** parsing message elemtns in %d - (%s) ***", cw_dbg(DBG_MSG_PARSING ,"*** Parsing message of type %d - (%s) ***",
message->type,message->name); message->type,message->name);
/* iterate through message elements */ /* iterate through message elements */
cw_foreach_elem(elem, elems_ptr, elems_len) { cw_foreach_elem(elem, elems_ptr, elems_len) {
@ -394,6 +394,10 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
mlist_append(unrecognized,&elem); mlist_append(unrecognized,&elem);
continue; continue;
} }
if (rc < 0 ){
continue;
}
} }
@ -403,32 +407,16 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
cw_check_missing_mand(message,mand_found); cw_check_missing_mand(message,mand_found);
cw_dbg(DBG_MSG_PARSING," *** done parsing message elements in %d (%s) ***", cw_dbg(DBG_MSG_PARSING," *** Done parsing message of type %d (%s) ***",
message->type,message->name); message->type,message->name);
mavl_destroy(mand_found); mavl_destroy(mand_found);
cw_dbg_ktv_dump(conn->remote_cfg,DBG_CFG_DMP,
" *** Remote CFG dump ***", "CFG:", " *** End of remote CFG dump");
{ {
mavliter_t it;
const struct cw_Type * type;
cw_dbg (DBG_INFO, "********** THE REMOTE CFG **************\n");
mavliter_init(&it,conn->remote_cfg);
mavliter_foreach(&it){
char value[500];
struct cw_KTV * data;
data = mavliter_get(&it);
type = data->type;
type->to_str(data,value,0);
cw_dbg(DBG_INFO,"RMTCFG: %s (%s): %s",data->key,type->name, value);
}
{ {
mlistelem_t *e; mlistelem_t *e;
mlist_foreach(e,unrecognized){ mlist_foreach(e,unrecognized){

View File

@ -21,6 +21,7 @@
uint8_t * conn_q_get_packet(struct conn * conn) uint8_t * conn_q_get_packet(struct conn * conn)
{ {
int qrpos;
struct timespec timespec; struct timespec timespec;
clock_gettime(CLOCK_REALTIME,&timespec); clock_gettime(CLOCK_REALTIME,&timespec);
timespec.tv_sec++; timespec.tv_sec++;
@ -30,7 +31,7 @@ uint8_t * conn_q_get_packet(struct conn * conn)
return NULL; return NULL;
}; };
int qrpos = conn->qrpos+1; qrpos = conn->qrpos+1;
if (qrpos==conn->qsize) if (qrpos==conn->qsize)
qrpos=0; qrpos=0;
conn->qrpos=qrpos; conn->qrpos=qrpos;

View File

@ -11,5 +11,3 @@ double cw_clock_lap(struct timeval *tv)
gettimeofday(&lap, NULL); gettimeofday(&lap, NULL);
return (cw_timevaltodouble(&lap) - cw_timevaltodouble(tv)) / 1000000.0; return (cw_timevaltodouble(&lap) - cw_timevaltodouble(tv)) / 1000000.0;
} }

View File

@ -1,26 +1,23 @@
#include "capwap.h"
#include "msgset.h" #include "msgset.h"
#include "ktv.h" #include "ktv.h"
#include "log.h" #include "log.h"
int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params, int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
uint8_t * elem_data, int elem_len){ uint8_t * elem_data, int elem_len)
/* mavldata_t data, *result; {
char str[30]; cw_KTV_t * result;
*/
if (!handler->type){ if (!handler->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 0; return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
} }
cw_ktv_add(params->conn->remote_cfg, handler->key, handler->type, elem_data,elem_len);
result = cw_ktv_add(params->conn->remote_cfg, handler->key,
handler->type, elem_data,elem_len);
/* params->elem=result;
result = handler->type->get(&data,elem_data,elem_len);
result->kv.key = strdup(handler->key);
handler->type->to_str(result,str,30); return CAPWAP_RESULT_SUCCESS;
mavl_add(conn->remote_cfg, result);
*/
return 0;
} }

View File

@ -4,7 +4,7 @@
#include "log.h" #include "log.h"
#include "dbg.h" #include "dbg.h"
const char * cw_ktv_add(mavl_t kvtstore, const char *key, const struct cw_Type *type, cw_KTV_t * cw_ktv_add(mavl_t kvtstore, const char *key, const struct cw_Type *type,
const uint8_t * data, int len) const uint8_t * data, int len)
{ {
cw_KTV_t mdata, *mresult; cw_KTV_t mdata, *mresult;
@ -15,7 +15,7 @@ const char * cw_ktv_add(mavl_t kvtstore, const char *key, const struct cw_Type *
*/ */
mdata.key=cw_strdup(key); mdata.key=cw_strdup(key);
if (!mdata.key){ if (!mdata.key){
cw_log(LOG_ERR, "Can't allocate memory for key %s: %s", cw_log(LOG_ERR, "Can't allocate memory for KTV key %s: %s",
key,strerror(errno)); key,strerror(errno));
return NULL; return NULL;
} }
@ -35,8 +35,8 @@ const char * cw_ktv_add(mavl_t kvtstore, const char *key, const struct cw_Type *
free(mdata.key); free(mdata.key);
if (type->del) if (type->del)
type->del(&mdata); type->del(&mdata);
return key; return mresult;
} }
return mdata.key; return mresult;
} }

View File

@ -1,30 +1,3 @@
#include "ktv.h" #include "ktv.h"
#include "dbg.h" #include "dbg.h"
void cw_ktv_dump(mavl_t ktv, uint32_t dbglevel,
const char *header, const char *prefix, const char *footer )
{
char value[500];
struct cw_KTV * data;
mavliter_t it;
const struct cw_Type * type;
if (header != NULL)
cw_dbg (dbglevel, header);
mavliter_init(&it,ktv);
mavliter_foreach(&it){
data = mavliter_get(&it);
type = data->type;
type->to_str(data,value,0);
cw_dbg(dbglevel,"%s%s (%s): %s",prefix,data->key,type->name, value);
}
if (footer != NULL)
cw_dbg (dbglevel, footer);
}

View File

@ -17,6 +17,9 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo
struct cw_ElemHandler * handler; struct cw_ElemHandler * handler;
struct cw_ElemData * elem_data, elem_data_search; struct cw_ElemData * elem_data, elem_data_search;
int rc;
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->conn->msgset,proto, vendor, elem_id); handler = cw_msgset_get_elemhandler(params->conn->msgset,proto, vendor, elem_id);
@ -37,10 +40,6 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT; return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
} }
if (elem_data->mand){
mavl_add_str(params->mand_found,handler->key);
}
/* check the length of the message */ /* check the length of the message */
if (len < handler->min_len) { if (len < handler->min_len) {
cw_dbg(DBG_ELEM_ERR, cw_dbg(DBG_ELEM_ERR,
@ -49,6 +48,13 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo
handler->min_len); handler->min_len);
return -1; return -1;
} }
if (elem_data->mand){
mavl_add_str(params->mand_found,handler->key);
}
if (len > handler->max_len && handler->max_len) { if (len > handler->max_len && handler->max_len) {
cw_dbg(DBG_ELEM_ERR, cw_dbg(DBG_ELEM_ERR,
"%d (%s) message element too big, len=%d, max len=%d", handler->id, "%d (%s) message element too big, len=%d, max len=%d", handler->id,
@ -57,8 +63,11 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo
return -1; return -1;
} }
cw_dbg_elem(DBG_ELEM_IN, params->conn, params->msgdata->type, handler, params, cw_dbg_elem(DBG_ELEM_IN, params->conn, params->msgdata->type, handler,
data,len); data,len);
return handler->get(handler, params, data, len); rc = handler->get(handler, params, data, len);
return rc;
} }

View File

@ -88,7 +88,7 @@ int cw_put_msg(struct conn *conn, uint8_t * rawout)
l = handler->put(handler,&params,dst+len); l = handler->put(handler,&params,dst+len);
if(l>0) if(l>0)
cw_dbg_elem(DBG_ELEM_OUT,conn,type,handler,&params,dst+len,l); cw_dbg_elem(DBG_ELEM_OUT,conn,type,handler,dst+len,l);
len += l; len += l;
} }

View File

@ -90,6 +90,7 @@ static struct cw_StrListElem color_on[] = {
{DBG_X, "\x1b[31m"}, {DBG_X, "\x1b[31m"},
{DBG_WARN, ANSI_CYAN}, {DBG_WARN, ANSI_CYAN},
{DBG_MOD, ANSI_WHITE}, {DBG_MOD, ANSI_WHITE},
{DBG_CFG_DMP, ANSI_BCYAN },
{CW_STR_STOP, ""} {CW_STR_STOP, ""}
@ -129,6 +130,7 @@ static struct cw_StrListElem prefix[] = {
{DBG_DTLS_DETAIL, " DTLS - "}, {DBG_DTLS_DETAIL, " DTLS - "},
{DBG_WARN, " Warning - "}, {DBG_WARN, " Warning - "},
{DBG_MOD, " Mod - "}, {DBG_MOD, " Mod - "},
{DBG_X, "XXXXX - "}, {DBG_X, "XXXXX - "},
{CW_STR_STOP, ""} {CW_STR_STOP, ""}
@ -466,9 +468,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 conn *conn, int msg,
struct cw_ElemHandler * handler, struct cw_ElemHandler * handler, const uint8_t * msgbuf, int len)
struct cw_ElemHandlerParams *params,
const uint8_t * msgbuf, int len)
{ {
char vendorname[256]; char vendorname[256];
char vendor_details[265]; char vendor_details[265];
@ -486,17 +486,9 @@ void cw_dbg_elem(int level, struct conn *conn, int msg,
sprintf(vendorname,""); sprintf(vendorname,"");
} }
if (params->elem == NULL) {
cw_dbg(level,"%s %d (%s), len=%d ",vendorname,handler->id, cw_dbg(level,"%s %d (%s), len=%d ",vendorname,handler->id,
handler->name,len); handler->name,len);
}else {
char str[512];
params->elem->type->to_str(params->elem,str,512);
cw_dbg(level,"%s %d (%s), len=%d, val=%s ",vendorname,handler->id,
handler->name,len, str);
}
if (cw_dbg_is_level(DBG_ELEM_DMP)) { if (cw_dbg_is_level(DBG_ELEM_DMP)) {
/*dmp = cw_format_dump(msgbuf,len,NULL);*/ /*dmp = cw_format_dump(msgbuf,len,NULL);*/
@ -510,6 +502,33 @@ void cw_dbg_elem(int level, struct conn *conn, int msg,
void cw_dbg_ktv_dump(mavl_t ktv, uint32_t dbglevel,
const char *header, const char *prefix, const char *footer )
{
char value[500];
struct cw_KTV * data;
mavliter_t it;
const struct cw_Type * type;
if (header != NULL)
cw_dbg (dbglevel, header);
mavliter_init(&it,ktv);
mavliter_foreach(&it){
data = mavliter_get(&it);
type = data->type;
type->to_str(data,value,0);
cw_dbg(dbglevel,"%s%s (%s): %s",prefix,data->key,type->name, value);
}
if (footer != NULL)
cw_dbg (dbglevel, footer);
}

View File

@ -112,6 +112,8 @@ enum cw_dbg_levels{
/** Show DTLS Details */ /** Show DTLS Details */
DBG_DTLS_DETAIL, DBG_DTLS_DETAIL,
DBG_CFG_DMP,
/** Debug Mods */ /** Debug Mods */
DBG_MOD, DBG_MOD,
@ -133,17 +135,18 @@ enum cw_dbg_levels{
#define DBG_LN __FILE__,__LINE__ #define DBG_LN __FILE__,__LINE__
/*
struct dbg_Context{ struct dbg_Context{
int level; int level;
}; };
*/
void cw_dbg_set_level (int level, int on); 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 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 conn *conn,cw_action_in_t ** ml,int n,cw_action_in_t *a);
*/ */
@ -195,9 +198,7 @@ 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 conn *conn, int msg,
struct cw_ElemHandler * handler, struct struct cw_ElemHandler * handler, const uint8_t * msgbuf, int len);
cw_ElemHandlerParams * params,
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);
@ -206,7 +207,8 @@ void cw_dbg_msg(int level,struct conn *conn, uint8_t * packet, int len,struct so
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,
const char *header, const char *prefix, const char *footer );
/** /**
* Set debug level * Set debug level

View File

@ -63,6 +63,8 @@ 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_DMP, "cfg_dmp" },
{ DBG_WARN, "warn" }, { DBG_WARN, "warn" },
{ DBG_MOD,"mod"}, { DBG_MOD,"mod"},

View File

@ -48,8 +48,8 @@ static const char * ssl_version2str(int version)
return "TLSv1"; return "TLSv1";
case DTLS1_VERSION: case DTLS1_VERSION:
return "DTLSv1"; return "DTLSv1";
// case DTLS1_2_VERSION: /* case DTLS1_2_VERSION:
// return "DTLSv1.2"; return "DTLSv1.2"; */
} }
return "Version unknown"; return "Version unknown";
} }
@ -65,7 +65,7 @@ static void dtls_debug_cb(int write_p,int version,int type, const void * buf,siz
s += sprintf(s,"SSL msg in: "); s += sprintf(s,"SSL msg in: ");
s+=sprintf(s,"type = %d (0x%02X), %s (%08x), len = %d",type,type,ssl_version2str(version),version,(int)len); s+=sprintf(s,"type = %d (0x%02X), %s (%08x), len = %d",type,type,ssl_version2str(version),version,(int)len);
// cw_dbg(DBG_DTLS_DETAIL,buffer); /* cw_dbg(DBG_DTLS_DETAIL,buffer); */
} }
#endif #endif
@ -121,7 +121,7 @@ int pem_passwd_cb(char *buf, int size, int rwflag, void *password)
if (rsa_1024) if (rsa_1024)
rsa_tmp=rsa_1024; rsa_tmp=rsa_1024;
else else
exit(0); //should_not_happen_in_this_example(); exit(0); /* should_not_happen_in_this_example(); */
break; break;
default: default:
/* Generating a key on the fly is very costly, so use what is there */ /* Generating a key on the fly is very costly, so use what is there */
@ -139,9 +139,10 @@ int pem_passwd_cb(char *buf, int size, int rwflag, void *password)
int dtls_openssl_init() int dtls_openssl_init()
{ {
int rc;
const char * version = SSLeay_version(SSLEAY_VERSION); const char * version = SSLeay_version(SSLEAY_VERSION);
cw_dbg(DBG_INFO,"Init SSL library - %s",version); cw_dbg(DBG_INFO,"Init SSL library - %s",version);
int rc = SSL_library_init(); rc = SSL_library_init();
ERR_clear_error(); ERR_clear_error();
SSL_load_error_strings(); SSL_load_error_strings();
OpenSSL_add_all_algorithms(); OpenSSL_add_all_algorithms();
@ -151,11 +152,12 @@ int dtls_openssl_init()
int dtls_openssl_log_error_queue(const char *txt) int dtls_openssl_log_error_queue(const char *txt)
{ {
char errstr[256];
int e = ERR_get_error(); int e = ERR_get_error();
if (e==0) if (e==0)
return 0; return 0;
char errstr[256];
while (e!=0){ while (e!=0){
ERR_error_string(e,errstr); ERR_error_string(e,errstr);
cw_log(LOG_ERR,"%s - %s",txt,errstr); cw_log(LOG_ERR,"%s - %s",txt,errstr);
@ -166,16 +168,18 @@ int dtls_openssl_log_error_queue(const char *txt)
int dtls_openssl_log_error(SSL * ssl, int rc, const char *txt) int dtls_openssl_log_error(SSL * ssl, int rc, const char *txt)
{ {
char errstr[256];
int e;
int en = errno; /* save errno */ int en = errno; /* save errno */
if (!ssl){ if (!ssl){
return dtls_openssl_log_error_queue(txt); return dtls_openssl_log_error_queue(txt);
} }
int e;
e = SSL_get_error(ssl,rc); e = SSL_get_error(ssl,rc);
char errstr[256];
ERR_error_string(e,errstr); ERR_error_string(e,errstr);
cw_log(LOG_ERR,"%s - %s","SSSSS",errstr); cw_log(LOG_ERR,"%s - %s","SSSSS",errstr);
@ -254,10 +258,8 @@ 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 conn * conn = b->ptr;
*/ */
printf ("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMaking session id\n");
const char * sessid = "9123456789"; const char * sessid = "9123456789";
/* printf ("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMaking session id\n");*/
memcpy(id,sessid,strlen(sessid)); memcpy(id,sessid,strlen(sessid));
*id_len=strlen(sessid); *id_len=strlen(sessid);
return 1; return 1;
@ -267,11 +269,11 @@ int generate_session_id(const SSL *ssl, unsigned char * id, unsigned int *id_len
static int dtls_verify_peer_callback (int ok, X509_STORE_CTX *ctx) static int dtls_verify_peer_callback (int ok, X509_STORE_CTX *ctx)
{ {
printf ("Verify callback called with ok = %d\n",ok); /* printf ("Verify callback called with ok = %d\n",ok);*/
// SSL *ssl; /*// SSL *ssl;
// ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); // ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
*/
char buf[1024]; char buf[1024];
X509 *err_cert; X509 *err_cert;
@ -304,6 +306,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 conn * conn, const SSL_METHOD * method, BIO_METHOD * bio)
{ {
int rc;
struct dtls_openssl_data * d = malloc(sizeof(struct dtls_openssl_data)); struct dtls_openssl_data * d = malloc(sizeof(struct dtls_openssl_data));
if (!d) if (!d)
return NULL; return NULL;
@ -317,7 +320,7 @@ struct dtls_openssl_data * dtls_openssl_data_create(struct conn * conn, const SS
} }
int rc = SSL_CTX_set_cipher_list(d->ctx, conn->dtls_cipher); rc = SSL_CTX_set_cipher_list(d->ctx, conn->dtls_cipher);
if (!rc){ if (!rc){
dtls_openssl_log_error(0,rc,"DTLS setup cipher error:"); dtls_openssl_log_error(0,rc,"DTLS setup cipher error:");
dtls_openssl_data_destroy(d); dtls_openssl_data_destroy(d);
@ -372,28 +375,29 @@ struct dtls_openssl_data * dtls_openssl_data_create(struct conn * conn, const SS
// SSL_CTX_set_session_cache_mode(d->ctx, SSL_SESS_CACHE_BOTH); /*// SSL_CTX_set_session_cache_mode(d->ctx, SSL_SESS_CACHE_BOTH);*/
SSL_CTX_set_options(d->ctx, SSL_OP_NO_SSLv2 |SSL_OP_NO_SSLv3 ); SSL_CTX_set_options(d->ctx, SSL_OP_NO_SSLv2 |SSL_OP_NO_SSLv3 );
// SSL_CTX_set_generate_session_id(d->ctx,generate_session_id); /*// SSL_CTX_set_generate_session_id(d->ctx,generate_session_id);*/
SSL_CTX_set_timeout(d->ctx,30); SSL_CTX_set_timeout(d->ctx,30);
/*
// rc =SSL_CTX_set_max_proto_version (d->ctx,DTLS1_VERSION); // rc =SSL_CTX_set_max_proto_version (d->ctx,DTLS1_VERSION);
// printf("MAXMAMX = %d\n",rc); // printf("MAXMAMX = %d\n",rc);
*/
/*
// SSL_CTX_set_verify(d->ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, dtls_verify_callback); // SSL_CTX_set_verify(d->ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, dtls_verify_callback);
// SSL_CTX_set_verify(d->ctx, SSL_VERIFY_PEER, dtls_verify_callback); // SSL_CTX_set_verify(d->ctx, SSL_VERIFY_PEER, dtls_verify_callback);
// SSL_CTX_set_tmp_rsa_callback(d->ctx,tmp_rsa_callback); // SSL_CTX_set_tmp_rsa_callback(d->ctx,tmp_rsa_callback);
// SSL_CTX_set_mode(d->ctx,SSL_MODE_SEND_SERVERHELLO_TIME); // SSL_CTX_set_mode(d->ctx,SSL_MODE_SEND_SERVERHELLO_TIME);
*/
/*
// rsa_512 = RSA_generate_key(512,RSA_F4,NULL,NULL); // rsa_512 = RSA_generate_key(512,RSA_F4,NULL,NULL);
// if (rsa_512 == NULL) // if (rsa_512 == NULL)
// evaluate_error_queue(); // evaluate_error_queue();
@ -404,7 +408,7 @@ struct dtls_openssl_data * dtls_openssl_data_create(struct conn * conn, const SS
// printf ("Ver cookie rc %d\n",rc); // printf ("Ver cookie rc %d\n",rc);
*/
/* /*
if (conn->dtls_key_file && conn->dtls_cert_file){ if (conn->dtls_key_file && conn->dtls_cert_file){
@ -489,15 +493,17 @@ out_err:
#include <arpa/inet.h> #include <arpa/inet.h>
//#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 conn *conn)
{ {
struct dtls_openssl_data * d ;
conn->write = conn->send_packet; conn->write = conn->send_packet;
conn->read = conn->recv_packet; conn->read = conn->recv_packet;
struct dtls_openssl_data * d = (struct dtls_openssl_data*)conn->dtls_data; d = (struct dtls_openssl_data*)conn->dtls_data;
if (!d) if (!d)
return 0; return 0;
@ -525,13 +531,14 @@ int dtls_openssl_shutdown(struct conn *conn)
//int cookie_initialized=0; /*//int cookie_initialized=0;
//#define COOKIE_SECRET_LENGTH 16 //#define COOKIE_SECRET_LENGTH 16
//unsigned char cookie_secret[COOKIE_SECRET_LENGTH]; //unsigned char cookie_secret[COOKIE_SECRET_LENGTH];
*/
int dtls_openssl_generate_cookie(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len) int dtls_openssl_generate_cookie(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len)
{ {
char sock_buf[SOCK_ADDR_BUFSIZE]; char sock_buf[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 conn * conn = b->ptr;
@ -540,7 +547,7 @@ int dtls_openssl_generate_cookie(SSL *ssl, unsigned char *cookie, unsigned int *
/* we "missuse" sockaddr2str to convert our cookie to a hex str */ /* we "missuse" sockaddr2str to convert our cookie to a hex str */
cw_dbg(DBG_DTLS,"DTLS session cookie for %s generated: %s", cw_dbg(DBG_DTLS,"DTLS session cookie for %s generated: %s",
sock_addr2str(&conn->addr,sock_buf), sock_hwaddr2idstr(conn->dtls_cookie,sizeof(conn->dtls_cookie))); sock_addr2str(&conn->addr,sock_buf), sock_hwaddr2idstr(conn->dtls_cookie,sizeof(conn->dtls_cookie),sock_buf2));
memcpy(cookie,conn->dtls_cookie,sizeof(conn->dtls_cookie)); memcpy(cookie,conn->dtls_cookie,sizeof(conn->dtls_cookie));
*cookie_len=sizeof(conn->dtls_cookie); *cookie_len=sizeof(conn->dtls_cookie);
@ -548,17 +555,15 @@ int dtls_openssl_generate_cookie(SSL *ssl, unsigned char *cookie, unsigned int *
} }
int dtls_openssl_verify_cookie(SSL *ssl, unsigned char *cookie, unsigned int len) int dtls_openssl_verify_cookie(SSL *ssl, unsigned char *cookie, unsigned int len)
{ {
char sock_buf[SOCK_ADDR_BUFSIZE]; char sock_buf[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 conn * conn = 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_addr2str(&conn->addr,sock_buf),sock_hwaddr2idstr(conn->dtls_cookie,len,sock_buf2));
if (len != sizeof(conn->dtls_cookie)){ if (len != sizeof(conn->dtls_cookie)){
return 0; return 0;

View File

@ -1,123 +0,0 @@
/*
This file is part of libcapwap.
libcapwap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
libcapwap is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdio.h>
#include "capwap.h"
#include "sock.h"
/*
int hdr_print(char *str, uint8_t *packet, int len)
{
char *s = str;
if (len<1){
s+=sprintf(s,"\tNo info available.");
return s-str;
}
int preamble = cw_get_hdr_preamble(packet); //CWTH_GET_PREAMBLE(packet);
if (preamble==01){
s+=sprintf(s,"\tEncrypted data.");
return s-str;
}
if (preamble!=00){
s+=sprintf(s,"\tWrong CAPWAP version or encryption type.");
return s-str;
}
if (len < 4){
s+=sprintf(s,"\tNo more data. Packet too short.");
return s-str;
}
int hlen = cw_get_hdr_hlen(packet); //CWTH_GET_HLEN(packet);
int rid = cw_get_hdr_rid(packet);
int wbid = cw_get_hdr_wbid(packet);
s+=sprintf(s,"\tHLEN: %d, RID: %02X, WBID %02X",hlen,rid,wbid);
s+=sprintf(s," Flags: (T=%d,F=%d,L=%d,W=%d,M=%d,K=%d)\n",
cw_get_hdr_flag_t(packet),
cw_get_hdr_flag_f(packet),
cw_get_hdr_flag_l(packet),
cw_get_hdr_flag_w(packet),
cw_get_hdr_flag_m(packet),
cw_get_hdr_flag_k(packet)
);
if (cw_get_hdr_flag_m(packet)){
uint8_t * rmac = cw_get_hdr_rmac(packet);
s+=sprintf(s,"\tRadio MAC: %s\n",sock_hwaddr2str(bstr_data(rmac),
bstr_len(rmac)));
}
if (len < 8){
s+=sprintf(s,"\tNo more data. Packet too short.");
return s-str;
}
int frag_id = cw_get_hdr_fragid(packet);
int frag_offs = cw_get_hdr_fragoffset(packet);
s+=sprintf(s,"\tFrag Id: %d, Frag Offs:: %d\n",frag_id,frag_offs);
int bhlen = 4*hlen;
if (cw_get_hdr_flag_f(packet) && frag_offs!=0){
s+=sprintf(s,"\tFragment data ...");
return s-str;
}
if (len<bhlen+4){
s+=sprintf(s,"\tNo more data. Packet too short.");
return s-str;
}
int msgtype = ntohl(*((uint32_t*)(packet+bhlen)));
s+=sprintf(s,"\tMsgType: %d",msgtype);
if (len<bhlen+8){
s+=sprintf(s,"\n\tNo more data. Packet too short.");
return s-str;
}
int seqnum = (ntohl(*((uint32_t*)(packet+bhlen+4))))>>24;
int msgelemlen = 0xFF & ((ntohl(*((uint32_t*)(packet+bhlen+4))))>>8);
s+=sprintf(s,", SeqNum: %d, MsgelemLen:%d",seqnum,msgelemlen);
return s-str;
}
*/

View File

@ -6,6 +6,18 @@
#include "mavl.h" #include "mavl.h"
/**
* @addtogroup DATAMGMT Data Structures & Algos
* @{
*/
/**
* @defgroup KTV Key-Type-Value-Store
* @{
*/
#define CW_KTV_MAX_KEY_LEN 1024 #define CW_KTV_MAX_KEY_LEN 1024
struct cw_KTV { struct cw_KTV {
@ -21,7 +33,12 @@ struct cw_KTV {
}; };
typedef struct cw_KTV cw_KTV_t; typedef struct cw_KTV cw_KTV_t;
/**
* @class cw_Type
* @author 7u83
* @file ktv.h
* @brief Representation of a cw_Type objetc
*/
struct cw_Type { struct cw_Type {
/** A human readable name for this type */ /** A human readable name for this type */
const char *name; const char *name;
@ -36,8 +53,13 @@ struct cw_Type {
struct cw_KTV *(*get) (struct cw_KTV * data, const uint8_t * src, int len); struct cw_KTV *(*get) (struct cw_KTV * data, const uint8_t * src, int len);
/** A pointer to a function to convert elements of this type to a string. /** A pointer to a function to convert elements of this type to a string.
This function is mainly used to store elements to an SQL database * This function is mainly used to store elements to an SQL database
or to json strings */ * or to json strings
* @param data pointer to KTV object
* @param dst buffer where to put the string in
* @param max_len maximum length of buffer
* @return The number of bytes written to dst
*/
int (*to_str) (const struct cw_KTV * data, char *dst, int max_len); int (*to_str) (const struct cw_KTV * data, char *dst, int max_len);
/** Cereate an item of this type from a string, which was previously /** Cereate an item of this type from a string, which was previously
@ -63,7 +85,7 @@ extern const struct cw_Type cw_type_bstr16;
/* /*
void cw_kvstore_mavl_delete(const void *data); void cw_kvstore_mavl_delete(const void *data);
*/ */
const char *cw_ktv_add(mavl_t kvstore, const char *key, const struct cw_Type *type, cw_KTV_t *cw_ktv_add(mavl_t kvstore, const char *key, const struct cw_Type *type,
const uint8_t * data, int len); const uint8_t * data, int len);
const char * cw_ktv_add_from_str(mavl_t kvtstore, const char *key, const struct cw_Type *type, const char * cw_ktv_add_from_str(mavl_t kvtstore, const char *key, const struct cw_Type *type,
@ -74,6 +96,10 @@ int cw_ktv_mavlcmp_type_by_name(const void *v1,const void *v2);
void cw_ktv_mavldel(void *data); void cw_ktv_mavldel(void *data);
/**
* Create a KTV store
* @return a #mavl_t object representing the KTV store
*/
#define cw_ktv_create()\ #define cw_ktv_create()\
mavl_create(cw_ktv_mavlcmp, cw_ktv_mavldel, sizeof(cw_KTV_t)) mavl_create(cw_ktv_mavlcmp, cw_ktv_mavldel, sizeof(cw_KTV_t))
@ -85,12 +111,13 @@ int cw_ktv_read_file(FILE * file, mavl_t ktv, mavl_t types);
cw_KTV_t * cw_ktv_get(mavl_t ktv, const char *key, const cw_Type_t * type); cw_KTV_t * cw_ktv_get(mavl_t ktv, const char *key, const cw_Type_t * type);
uint8_t cw_ktv_get_byte(mavl_t ktv,const char *key, uint8_t def); uint8_t cw_ktv_get_byte(mavl_t ktv,const char *key, uint8_t def);
uint16_t cw_ktv_get_word(mavl_t ktv,const char *key, uint16_t def); uint16_t cw_ktv_get_word(mavl_t ktv,const char *key, uint16_t def);
void cw_ktv_dump(mavl_t ktv, uint32_t dbglevel,
const char *header, const char *prefix, const char *footer );
extern const cw_Type_t * cw_ktv_std_types[]; extern const cw_Type_t * cw_ktv_std_types[];
#define CW_KTV_STD_TYPES cw_ktv_std_types #define CW_KTV_STD_TYPES cw_ktv_std_types
/**
* @} KTV
* @} DATAMGMT
*/
#endif /* __KVT_H */ #endif /* __KVT_H */

View File

@ -16,6 +16,7 @@
*/ */
/** /**
*@file *@file
*@brief Definitions for logging and debugging. *@brief Definitions for logging and debugging.

View File

@ -157,8 +157,11 @@ void *mavl_replace_data ( struct mavl *t, void *data, int len );
/**
* An alias gor #mavl_get
*/
#define mavl_find(t,d) mavl_get(t,d) #define mavl_find(t,d) mavl_get(t,d)
#define mavl_find_ptr(tree,search_ptr) mavl_get_ptr(tree,search_ptr) #define mavl_find_ptr(tree,search_ptr) mavl_get_ptr(tree,search_ptr)
#define mavl_insert(t,d) mavl_add(t,d) #define mavl_insert(t,d) mavl_add(t,d)

View File

@ -182,13 +182,14 @@ static int mavl_add0 ( struct mavl *t, struct mavlnode **parent, const void ** d
* Add an element to an AVL tree * Add an element to an AVL tree
* *
* @param t mavl * @param t mavl
* @param data pointer to element * @param data pointer to the element to add
* * @param exists pointer to an interger vairable which wil be set to 1, if
* @return A pointer to the element in the tree. If teh returned pointer * the element to add already exists in the tree. If the element did't
* equals to the pointer given in the data argument, the element has already * exist, the variable ist to 0.
* been in the tree. If the function returns NULL, there was en error, e.g. * @return A pointer to the element in the tree. If the element was added,
* no memory left. Consult therefore errno. * it the pointer to newly created element. If the element had already existed,
* * the pointer points to the existing element. mavl_add returns thero, if
* something else went wrong. Therefore consult errno.
* @example mavl_add_example.c * @example mavl_add_example.c
*/ */

View File

@ -1,5 +1,12 @@
#include "mlist.h" #include "mlist.h"
/**
* @brief Create a mlist object
* @param v1
* @param v2
* @param data_size
* @return a pointer to the created object or NULL if something
* wnet wrong.
*/
mlist_t mlist_create(int (*cmp) (const void *v1, const void *v2), mlist_t mlist_create(int (*cmp) (const void *v1, const void *v2),
void (*del)(void*), void (*del)(void*),
size_t data_size) size_t data_size)

View File

@ -167,8 +167,8 @@ static int update_msgdata(struct cw_MsgSet *set, struct cw_MsgData *msgdata,
elemdef->vendor, elemdef->id); elemdef->vendor, elemdef->id);
/* check if a handler for our element already exists */ /* check if a handler for our element already exists */
if (!handler) { if (!handler) {
cw_log(LOG_ERR, "No handler for message element: %d %d %d", cw_log(LOG_ERR, "Creating message set: No handler for message element: %d %d %d [%s]",
elemdef->proto, elemdef->vendor, elemdef->id); elemdef->proto, elemdef->vendor, elemdef->id, cw_strelem(elemdef->id));
continue; continue;
} }

View File

@ -86,7 +86,10 @@ char *sock_addrtostr(const struct sockaddr *sa, char *s, size_t maxlen, int addp
#define SOCK_ADDR_BUFSIZE 64 #define SOCK_ADDR_BUFSIZE 64
/*
#define SOCK_ADDR_BUF_DEFINE char __sock_buf__[SOCK_ADDR_BUFSIZE] #define SOCK_ADDR_BUF_DEFINE char __sock_buf__[SOCK_ADDR_BUFSIZE]
*/
/** /**
* Convert a sockaddr structure to a human readable string * Convert a sockaddr structure to a human readable string
@ -113,8 +116,8 @@ char *sock_addrtostr(const struct sockaddr *sa, char *s, size_t maxlen, int addp
#define sock_hwaddr2str(s,l) ( sock_hwaddrtostr( s,l, (char[64]){0}, ":" ) ) #define sock_hwaddr2str(s,l,buf) ( sock_hwaddrtostr( s,l, buf, ":" ) )
#define sock_hwaddr2idstr(s,l) ( sock_hwaddrtostr( s,l, (char[64]){0}, "" ) ) #define sock_hwaddr2idstr(s,l,buf) ( sock_hwaddrtostr( s,l, buf, "" ) )
/* /*
//#define sock_addrtostr(s,str,n) sock_addrtostr(s,str,n,1) //#define sock_addrtostr(s,str,n) sock_addrtostr(s,str,n,1)

View File

@ -42,7 +42,7 @@ typedef time_t cw_timer_t;
* @code * @code
* cw_timer_t timer = cw_timer_start(60); * cw_timer_t timer = cw_timer_start(60);
* while (!cw_timer_timeout(timer)){ * while (!cw_timer_timeout(timer)){
* // Do something for max. 60 seconds ... * @startcomment Do something for max. 60 seconds ... @endcomment
* } * }
* @endcode * @endcode
*/ */
@ -78,7 +78,7 @@ typedef time_t cw_timer_t;
* @code * @code
* CW_CLOCK_DEFINE(clk); * CW_CLOCK_DEFINE(clk);
* cw_clock_start(clk); * cw_clock_start(clk);
* // do something ... * @startcomment do something ... @endcomment
* int t = cw_clock_lap(clk); * int t = cw_clock_lap(clk);
* printf("Caclulation took %d seconds\n",t); * printf("Caclulation took %d seconds\n",t);
* @endcode * @endcode

View File

@ -54,7 +54,7 @@ static struct cw_ElemHandler handlers[] = {
"WTP Board Data", /* name */ "WTP Board Data", /* name */
CAPWAP_ELEM_WTP_BOARD_DATA, /* Element ID */ CAPWAP_ELEM_WTP_BOARD_DATA, /* Element ID */
0,0, /* Vendor / Proto */ 0,0, /* Vendor / Proto */
4,128, /* min/max length */ 14,1024, /* min/max length */
NULL, /* type */ NULL, /* type */
CW_KEY_WTP_BOARD_DATA, /* Key */ CW_KEY_WTP_BOARD_DATA, /* Key */
capwap_in_wtp_board_data, /* get */ capwap_in_wtp_board_data, /* get */
@ -65,7 +65,7 @@ static struct cw_ElemHandler handlers[] = {
"WTP Descriptor", /* name */ "WTP Descriptor", /* name */
CAPWAP_ELEM_WTP_DESCRIPTOR, /* Element ID */ CAPWAP_ELEM_WTP_DESCRIPTOR, /* Element ID */
0,0, /* Vendor / Proto */ 0,0, /* Vendor / Proto */
4,128, /* min/max length */ 33,1024, /* min/max length */
NULL, /* type */ NULL, /* type */
CW_KEY_WTP_DESCRIPTOR, /* Key */ CW_KEY_WTP_DESCRIPTOR, /* Key */
capwap_in_wtp_descriptor, /* get */ capwap_in_wtp_descriptor, /* get */

View File

@ -55,7 +55,7 @@ static void readsubelems_wtp_board_data(mavl_t cfg, uint8_t * msgelem,
return; return;
} }
cw_dbg(DBG_SUBELEM, "Reading WTP board data sub-element, type=%d, len=%d", cw_dbg(DBG_SUBELEM, "WTP board data sub-element, type=%d, len=%d",
subtype, sublen); subtype, sublen);
switch (subtype) { switch (subtype) {

View File

@ -108,7 +108,7 @@ int main (int argc, char **argv)
cw_ktv_read_file(file,global_cfg,types_tree); cw_ktv_read_file(file,global_cfg,types_tree);
cw_ktv_dump(global_cfg,DBG_INFO,"----- global cfg start -----","","----- global cfg end -----"); cw_dbg_ktv_dump(global_cfg,DBG_CFG_DMP,"----- global cfg start -----","","----- global cfg end -----");
mod = cw_mod_load(bootcfg.modname, global_cfg, CW_ROLE_WTP); mod = cw_mod_load(bootcfg.modname, global_cfg, CW_ROLE_WTP);