Debuggin with cw_decode_msg is possible

This commit is contained in:
2022-07-28 18:25:05 +02:00
parent 6893cfa4d4
commit 4506690fe1
8 changed files with 70 additions and 25 deletions

View File

@ -406,7 +406,6 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
params.global_cfg=conn->global_cfg;
params.msgset=conn->msgset;
params.from=from;
params.msgdata=message;
params.mand_found=mand_found;

View File

@ -1,7 +1,7 @@
#include "cw.h"
#include "dbg.h"
#include "log.h"
#include "msgset.h"
int cw_decode_element(struct cw_ElemHandlerParams *params, int proto,
int vendor, int elem_id, uint8_t * data, int len)
@ -72,32 +72,53 @@ int cw_decode_element(struct cw_ElemHandlerParams *params, int proto,
}
int cw_decode_elements(uint8_t * elems_ptr, int elems_len)
int cw_decode_elements(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
{
uint8_t *elem;
mavl_t mand_found;
mlist_t unrecognized;
mand_found = mavl_create_conststr();
unrecognized = mlist_create(NULL,NULL,sizeof(uint8_t*));
/* 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;
uint8_t * elem_data;
elem_len = cw_get_elem_len(elem);
elem_data = cw_get_elem_data(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) {
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);
"Messag element claims size of %d bytes, but only %d bytes are left in the payload, truncating.",
elem_len,max_len-4);
}
params->from=NULL; /*from;*/
params->mand_found=mand_found;
rc = cw_decode_element(params,0,0,elem_id,elem_data,elem_len);
if (cw_result_is_ok(rc))
continue;
if (rc == CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT){
mlist_append(unrecognized,&elem);
continue;
}
if (rc < 0 ){
continue;
}
}
}

View File

@ -13,11 +13,9 @@ int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams *
cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name);
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
}
result = cw_ktv_add(params->remote_cfg, handler->key,
handler->type,NULL, elem_data,elem_len);
params->elem=result;
return CAPWAP_RESULT_SUCCESS;
}

View File

@ -74,6 +74,8 @@ int cw_process_element(struct cw_ElemHandlerParams *params, int proto, int vendo
cw_log(LOG_ERR,"No get method defined for %d %s",handler->id,handler->name);
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
}
rc = handler->get(handler, params, data, len);

View File

@ -28,7 +28,7 @@
#include "log.h"
#include "dbg.h"
#include "msgset.h"
#include "mavltypes.h"
/**
* Put a message to a buffer
@ -133,6 +133,30 @@ printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name
cw_set_msg_seqnum(msgptr,s);
}
{
printf ("----------------------------------- redecode -----------------------------\n");
uint8_t *elems_ptr;
int offset = cw_get_hdr_msg_offset(rawout);
uint8_t *msg_ptr = rawout + offset;
int elems_len = cw_get_msg_elems_len(msg_ptr);
elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
mavl_t * cfg = cw_ktv_create();
struct cw_ElemHandlerParams params;
params.remote_cfg=cfg;
params.msgset=conn->msgset;
params.msgdata=msg;
cw_decode_elements( &params, elems_ptr,elems_len);
}
return CAPWAP_RESULT_SUCCESS;

View File

@ -32,7 +32,7 @@ struct cw_ElemData{
struct cw_ElemHandlerParams {
/* struct conn * conn;*/
struct cw_MsgData * msgdata;
struct cw_MsgData * msgdata;
struct cw_ElemData * elemdata;
struct sockaddr *from;
mavl_t mand_found;