New type cw_type_bits

This commit is contained in:
2022-09-03 17:27:19 +02:00
parent 0078c07e58
commit 66db979fdb
11 changed files with 323 additions and 213 deletions

View File

@ -60,6 +60,7 @@ CWSRC=\
cw_type_word.c\
cw_type_sysptr.c\
cw_type_array.c\
cw_type_bits.c\
cw_write_descriptor_subelem.c\
cw_write_radio_element.c\
cw_detect_nat.c\

View File

@ -11,7 +11,7 @@ int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams *
char mkey[CW_CFG_MAX_KEY_LEN];
const char *key;
// cw_dbg(DBG_X,"HK: %s",handler->key,);
if (!type){
cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name);
@ -25,11 +25,7 @@ int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams *
else{
key = handler->key;
}
/* cw_dbg(DBG_X, "READ: %s / %s",type->name,key);*/
// cw_dbg(DBG_X, "READ: %s / %s",type->name,key);
type->read(params->cfg, key,elem_data,elem_len,handler->param);
return CAPWAP_RESULT_SUCCESS;
}

View File

@ -560,6 +560,8 @@ int cw_put_descriptor_subelem (uint8_t *dst, cw_Cfg_t ** cfg_list,
int cw_send_request(struct cw_Conn *conn,int msg_id);
int cw_out_generic_walk(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
, uint8_t * dst);
int cw_out_generic0(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
, uint8_t * dst,const char *key);
/**
*@}

View File

@ -1,37 +0,0 @@
#include "capwap.h"
#include "msgset.h"
#include "val.h"
#include "log.h"
#include "dbg.h"
int cw_in_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params,
uint8_t * elem_data, int elem_len)
{
cw_Type_t * type;
type = (cw_Type_t*)handler->type;
char mkey[CW_CFG_MAX_KEY_LEN];
const char *key;
if (!type){
cw_log(LOG_ERR,"Can't handle element: %s, no type defined",handler->name);
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
}
if (handler->mkkey != NULL){
handler->mkkey(handler->key,elem_data,elem_len, mkey);
key = mkey;
}
else{
key = handler->key;
}
/* cw_dbg(DBG_X, "READ: %s / %s",type->name,key);*/
type->read(params->cfg, key,elem_data,elem_len,handler->param);
return CAPWAP_RESULT_SUCCESS;
}

54
src/cw/cw_type_bits.c Normal file
View File

@ -0,0 +1,54 @@
#include "val.h"
static int get_len(const struct cw_ValBit *bits)
{
int i;
for (i=0;bits[i].key!=NULL;i++);
return bits[i].bit;
}
static int get_bit(const uint8_t * src,int pos, int len)
{
int b;
uint8_t m;
b = len-1-pos/8;
m = 1<<(pos%8);
return src[b]&m ? 1:0;
}
static int bread(cw_Cfg_t *cfg, const char * key, const uint8_t *src, int len, const void *param)
{
const struct cw_ValBit * bits=param;
int l,i;
l = get_len(bits);
for(i=0;bits[i].key!=NULL;i++){
int rc;
printf("%s: %d\n",bits[i].key,get_bit(src,bits[i].bit,l));
}
return 1;
}
static int bwrite(cw_Cfg_t ** cfgs, const char *key, uint8_t *dst, const void * param)
{
return 0;
}
const struct cw_Type cw_type_bits = {
"Bits", /* name */
NULL, /* del */
NULL, /* put */
NULL, /* get */
NULL, /* to_str */
NULL, /* from_str */
NULL, /* len */
NULL, /* data */
NULL, /* get_type_name */
NULL,
bread,
bwrite
};

View File

@ -37,12 +37,13 @@ static int read_struct(cw_Cfg_t * cfg,const cw_ValStruct_t * stru, const char *p
break;
default:
l = stru[i].len;
cw_dbg(DBG_X,"pos: %d, l:%d. len: %d",pos,l,len);
if (pos+l > len){
l = len-pos;
l = pos<len ? len-pos : 0 ;
}
}
cw_dbg(DBG_X,"This is l %d",l);
l=stru[i].type->read(cfg,key,data+pos,l,stru[i].valguard);
@ -102,8 +103,9 @@ static int write_struct(cw_Cfg_t ** cfgs, const cw_ValStruct_t * stru, const ch
sprintf(key,"%s",pkey);
// result = cw_cfg_get_l(cfgs,key,NULL);
rc = cw_cfg_base_exists_l(cfgs,key);
// printf("Base? :%s, %d\n",key,rc);
// cw_dbg(DBG_X,"Base? :'%s', %d\n",key,rc);
if(result) {
// char s[2048];
// result->type->to_str(result,s,2048);

View File

@ -86,9 +86,7 @@ struct cw_StrListElem cw_dbg_strings[] = {
DBG_ELEM_IN | DBG_ELEM_OUT |
DBG_MSG_ERR | DBG_ELEM_ERR |
DBG_PKT_ERR | DBG_RFC | DBG_WARN
| DBG_STATE), "std" },
| DBG_STATE | DBG_INFO), "std" },
{ DBG_ALL, "all"},

View File

@ -52,6 +52,7 @@ typedef struct cw_Val cw_Val_t;
/**
* @class cw_Type
* @author 7u83
@ -117,7 +118,10 @@ struct cw_ValStruct {
typedef struct cw_ValStruct cw_ValStruct_t;
struct cw_ValBit {
uint16_t bit;
const char *key;
};
@ -147,6 +151,7 @@ struct cw_ValIndexed{
typedef struct cw_ValIndexed cw_ValIndexed_t;
extern const struct cw_Type cw_type_bits;
extern const struct cw_Type cw_type_byte;
extern const struct cw_Type cw_type_word;
extern const struct cw_Type cw_type_dword;
@ -159,6 +164,7 @@ extern const struct cw_Type cw_type_bool;
extern const struct cw_Type cw_type_struct;
extern const struct cw_Type cw_type_array;
#define CW_TYPE_BITS (&cw_type_bits)
#define CW_TYPE_BYTE (&cw_type_byte)
#define CW_TYPE_WORD (&cw_type_word)
#define CW_TYPE_DWORD (&cw_type_dword)