Uses msgset.write_header and header_len again.

This commit is contained in:
7u83 2022-07-29 12:11:19 +02:00
parent 51416668c4
commit 7dab041047
13 changed files with 87 additions and 63 deletions

View File

@ -12,7 +12,7 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
, uint8_t * dst)
{
struct cw_KTV * elem, search;
struct cw_KTV * elem;
int start, len, l;
/* Get the element */
@ -49,7 +49,7 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
/* Size for msg elem header depends on
vendor specific payload */
/* start = handler->vendor ? 10 : 4; */
start = cw_header_len(handler);
start = params->msgset->header_len(handler);
if (cw_ktv_cast(elem,handler->type)==NULL){
cw_log(LOG_ERR,"Can't put element '%s'- can't cast from %s to %s for key: %s", handler->name,
@ -67,7 +67,7 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
l = len + cw_put_elem_hdr(dst, handler->id, len); */
l = cw_write_header(handler,dst,len);
l = params->msgset->write_header(handler,dst,len);
cw_dbg_elem(DBG_ELEM_OUT,NULL,params->msgdata->type,handler,dst,l);
/* cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,handler,dst,l);*/

View File

@ -10,7 +10,6 @@ int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemH
uint8_t * ob;
const cw_KTVIndexed_t *ie;
cw_KTVEnum_t * e;
struct cw_ElemHandler thandler;
ie = handler->type;
@ -22,10 +21,13 @@ int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemH
for(i=0; e[i].name!=NULL; i++) {
sprintf(key,"%s/%s",handler->key,e[i].name);
printf("Her is the Key: %s - %s\n",key, );
result = cw_ktv_base_exists(params->local_cfg,key);
if (result==NULL)
continue;
start = cw_header_len(handler);
start = params->msgset->header_len(handler);
len = 0;
if (ie->idxpos==0)
len = 1;
@ -36,17 +38,11 @@ int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemH
len += cw_ktv_write_struct(params->local_cfg,
NULL,e[i].type,key,ob+start+len);
/* thandler.type=e[i].type;
thandler.key=key;
len += e->fun_out(&thandler,params,ob+start+len);
*/
cw_set_byte(ob+start+ie->idxpos,e[i].value);
if (ie->idxpos==len)
len++;
ob += cw_write_header(handler,ob,len);
ob += params->msgset->write_header(handler,ob,len);
}

View File

@ -30,12 +30,12 @@ int cw_out_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandler
return 0;
}
start = cw_header_len(handler);
start = params->msgset->header_len(handler);
len = cw_ktv_write_struct(params->local_cfg,
params->default_cfg,
handler->type,handler->key,dst+start);
return cw_write_header(handler,dst,len);
return params->msgset->write_header(handler,dst,len);
}

View File

@ -24,12 +24,12 @@ int cw_out_generic_with_index(struct cw_ElemHandler * eh,
if (strncmp(result->key,key,strlen(key))!=0)
break;
start = cw_header_len(eh);
start = params->msgset->header_len(eh);
len = cw_put_byte(ob+start,idx);
len += result->type->put(result,ob+start+len);
ob += cw_write_header(eh,ob,len);
ob += params->msgset->write_header(eh,ob,len);
idx++;

View File

@ -37,15 +37,13 @@ int cw_out_idx_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHan
sprintf(key,handler->key,idx);
printf("Here we are '%s'! --> %d\n",key,idx);
len =0;
start = mdst + cw_header_len(handler);
start = mdst + params->msgset->header_len(handler);
len += cw_put_byte(start+len,idx);
len += cw_ktv_write_struct(params->local_cfg,NULL, handler->type,key,start+len);
mdst += cw_write_header(handler,mdst,len);
mdst += params->msgset->write_header(handler,mdst,len);
i=idx+1;

View File

@ -14,7 +14,7 @@ int cw_out_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemH
cdst = dst;
offset = cw_header_len(handler);
offset = params->msgset->header_len(handler);
i=-1;
while(1){
@ -37,7 +37,7 @@ int cw_out_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemH
l+= cw_ktv_write_struct(params->local_cfg,NULL, handler->type,basekey,cdst+offset+l);
cdst+=cw_write_header(handler,cdst,l);
cdst+=params->msgset->write_header(handler,cdst,l);
}
return cdst-dst;
}
@ -61,7 +61,7 @@ int cw_out_traverse0(struct cw_ElemHandler * handler, struct cw_ElemHandlerParam
if (result != NULL){
int offset;
int i,l;
offset = cw_header_len(handler);
offset = params->msgset->header_len(handler);
printf("Yea! We can do it: %s\n",result->key);
for (i=0;i<stack[0];i++){
printf("I=%i\n",stack[i+1]);
@ -71,7 +71,7 @@ int cw_out_traverse0(struct cw_ElemHandler * handler, struct cw_ElemHandlerParam
printf("Write struct len %i\n",l);
l=cw_write_header(handler,dst,l);
l=params->msgset->write_header(handler,dst,l);
printf("header wr len %d\n",l);
if (handler->patch){
handler->patch(dst+offset,stack);

View File

@ -154,6 +154,7 @@ printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name
cw_decode_elements( &params, elems_ptr,elems_len);
printf ("----------------------------------- end redecode -----------------------------\n");
}

View File

@ -10,6 +10,8 @@ int cw_write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
return len + cw_put_elem_hdr(dst, handler->id, len);
}
int cw_header_len(struct cw_ElemHandler * handler)
{
return handler->vendor ? 10 : 4;

View File

@ -7,13 +7,6 @@
#include "ktv.h"
struct cw_MsgSet {
mavl_t msgdata;
mavl_t handlers_by_id;
mavl_t handlers_by_key;
mavl_t types_tree;
mavl_t state_machine;
};
struct cw_ElemDef{
int proto;
@ -68,6 +61,19 @@ struct cw_ElemHandler {
};
struct cw_MsgSet {
mavl_t msgdata;
mavl_t handlers_by_id;
mavl_t handlers_by_key;
mavl_t types_tree;
mavl_t state_machine;
int (*write_header)(struct cw_ElemHandler * handler, uint8_t * dst, int len);
int (*header_len)(struct cw_ElemHandler *handler);
};
struct cw_State{
uint8_t state;
uint8_t next;

View File

@ -826,6 +826,19 @@ static cw_StateMachineState_t statemachine_states[]={
{0,0,0}
};
static int write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
{
if (handler->vendor)
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
return len + cw_put_elem_hdr(dst, handler->id, len);
}
static int header_len(struct cw_ElemHandler * handler)
{
return handler->vendor ? 10 : 4;
}
struct cw_MsgSet * capwap_register_msg_set(struct cw_MsgSet * set, int mode){
@ -843,6 +856,9 @@ struct cw_MsgSet * capwap_register_msg_set(struct cw_MsgSet * set, int mode){
mavl_insert_ptr(set->types_tree,CW_TYPE_DWORD);
mavl_insert_ptr(set->types_tree,CW_TYPE_WORD);
set->write_header = write_header;
set->header_len = header_len;
cw_dbg(DBG_INFO,"CAPWAP: Done register messages");
return set;
}

View File

@ -297,9 +297,9 @@ int cisco_out_ap_regulatory_domain(struct cw_ElemHandler * eh,
}
}
start = cw_header_len(eh);
start = params->msgset->header_len(eh);
len = cw_ktv_write_struct(params->local_cfg,NULL,type,key,ob+start);
ob += cw_write_header(eh,ob,len);
ob += params->msgset->write_header(eh,ob,len);
idx++;
@ -1869,8 +1869,11 @@ static struct cw_ElemDef change_state_event_request_elements[] ={
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_ADD_WLAN, 1, CW_IGNORE},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_OPER_STATE_DETAIL_CAUSE, 1, CW_IGNORE},
{0, 0, CAPWAP_ELEM_RADIO_ADMINISTRATIVE_STATE, 1, 0},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_HARDWARE_INFO, 1, 0},
{0,0,0,0,0}
};

View File

@ -26,6 +26,31 @@ static struct cw_Mod * capwap_mod = NULL;
static struct cw_Mod * capwap80211_mod = NULL;
static int write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
{
if (handler->proto == 0){
if (handler->vendor)
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
return len + cw_put_elem_hdr(dst, handler->id, len);
}
/* put the lwap elem header */
lw_set_dword(dst + 10, handler->vendor);
lw_set_word(dst + 14, handler->id);
return len + 6 + cw_put_elem_vendor_hdr(dst, handler->vendor,
CISCO_ELEM_SPAM_VENDOR_SPECIFIC, len+6);
}
static int header_len(struct cw_ElemHandler * handler)
{
if (handler->proto==0)
return handler->vendor ? 10 : 4;
return 16;
}
static struct cw_MsgSet * register_messages(struct cw_MsgSet *set, int mode)
{
cw_dbg(DBG_INFO,"CISCO: Register messages");
@ -35,6 +60,8 @@ static struct cw_MsgSet * register_messages(struct cw_MsgSet *set, int mode)
capwap_mod->register_messages(set, CW_MOD_MODE_CAPWAP);
capwap80211_mod->register_messages(set, CW_MOD_MODE_BINDINGS);
cisco_register_msg_set(set,CW_MOD_MODE_CAPWAP);
set->write_header = write_header;
set->header_len = header_len;
/* cw_dbg(DBG_MOD,"Cisco: loading cisco message set");*/
@ -193,31 +220,6 @@ static struct cw_Mod capwap_ac = {
};
*/
static int write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
{
if (handler->proto == 0){
if (handler->vendor)
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
return len + cw_put_elem_hdr(dst, handler->id, len);
}
/* put the lwap elem header */
lw_set_dword(dst + 10, handler->vendor);
lw_set_word(dst + 14, handler->id);
return len + 6 + cw_put_elem_vendor_hdr(dst, handler->vendor,
CISCO_ELEM_SPAM_VENDOR_SPECIFIC, len+6);
}
static int header_len(struct cw_ElemHandler * handler)
{
if (handler->proto==0)
return handler->vendor ? 10 : 4;
return 16;
}
int static setup_cfg(struct conn * conn)
{

View File

@ -1,4 +1,4 @@
ac-descriptor/active-wtps :Word: 2
ac-descriptor/active-wtps :Word: 1
ac-descriptor/dtls-policy :Byte: 0
ac-descriptor/hardware/vendor :Dword: 4232704
ac-descriptor/hardware/version :Bstr16: .x01000001
@ -61,7 +61,7 @@ cisco/ap-regulatory-domain.1/slot :Byte: 0
cisco/ap-sub-mode :Byte: 0
cisco/ap-telnet-ssh/ssh :Bool: false
cisco/ap-telnet-ssh/telnet :Bool: false
cisco/ap-timesync/timestamp :Dword: 1469722147
cisco/ap-timesync/timestamp :Dword: 1469728495
cisco/ap-timesync/type :Byte: 0
cisco/ap-username-and-password/802.1x-credentials/option :Word: 2
cisco/ap-username-and-password/802.1x-credentials/password :Str:
@ -165,7 +165,7 @@ radio.0/cisco/rad-extended-config/multicast-buffer :Word: 0
radio.0/cisco/rad-extended-config/multicast-data-range :Word: 0
radio.0/cisco/rad-extended-config/rx-sensop-threshold :Word: 0
radio.0/cisco/tx-power-levels :Bstr16: .x070011000e000b000800050002ffff0000
radio.0/cisco/tx-power/current-tx-power :Word: 1
radio.0/cisco/tx-power/current-tx-power :Word: 3
radio.0/cisco/tx-power/reserved :Byte: 1
radio.0/cisco/wtp-radio-config/beacon-period :Word: 100
radio.0/cisco/wtp-radio-config/bss-id :Bstr16: .x0800276edf58
@ -196,7 +196,7 @@ radio.0/wlan.0/add-wlan/scan-defer-time :Word: 100
radio.0/wlan.0/add-wlan/session-timout :Word: 1800
radio.0/wlan.0/add-wlan/ssid :Str:
radio.0/wlan.0/add-wlan/wep-encryption :Bool: false
radio.0/wlan.0/add-wlan/wep-key :Bstr16: .x61d4be12e22feb1135d1be6d3f
radio.0/wlan.0/add-wlan/wep-key :Bstr16: .x4e1c7dbd0d2f612263b1a002fd
radio.0/wlan.0/add-wlan/wep-key-index :Byte: 1
radio.0/wlan.0/add-wlan/wlan-capability :Word: 1073
radio.0/wlan.0/add-wlan/wlan-id :Byte: 1
@ -248,7 +248,7 @@ radio.1/cisco/multi-domain-capability/max-tx-power-level :Word: 20
radio.1/cisco/multi-domain-capability/number-of-channels :Word: 4
radio.1/cisco/multi-domain-capability/reserved :Byte: 1
radio.1/cisco/tx-power-levels :Bstr16: .x070011000e000b000800050002ffff0000
radio.1/cisco/tx-power/current-tx-power :Word: 6
radio.1/cisco/tx-power/current-tx-power :Word: 3
radio.1/cisco/tx-power/reserved :Byte: 1
radio.1/cisco/wtp-radio-config/beacon-period :Word: 100
radio.1/cisco/wtp-radio-config/bss-id :Bstr16: .x04fe7f499b90