From 7dab041047674089f0e19d4898127369f598bf12 Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@mail.ru> Date: Fri, 29 Jul 2022 12:11:19 +0200 Subject: [PATCH] Uses msgset.write_header and header_len again. --- src/cw/cw_out_generic.c | 6 ++-- src/cw/cw_out_generic_indexed_enum.c | 14 +++----- src/cw/cw_out_generic_struct.c | 4 +-- src/cw/cw_out_generic_with_index.c | 4 +-- src/cw/cw_out_idx_generic_struct.c | 6 ++-- src/cw/cw_out_radio_generic_struct.c | 8 ++--- src/cw/cw_put_msg.c | 1 + src/cw/cw_write_header.c | 2 ++ src/cw/msgset.h | 20 +++++++---- src/mod/capwap/capwap_actions_ac.c | 16 +++++++++ src/mod/cisco/cisco_actions_ac.c | 7 ++-- src/mod/cisco/mod_cisco_ac.c | 52 +++++++++++++++------------- src/wtp/cisco.ktv | 10 +++--- 13 files changed, 87 insertions(+), 63 deletions(-) diff --git a/src/cw/cw_out_generic.c b/src/cw/cw_out_generic.c index 3eed6273..633fbe99 100644 --- a/src/cw/cw_out_generic.c +++ b/src/cw/cw_out_generic.c @@ -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);*/ diff --git a/src/cw/cw_out_generic_indexed_enum.c b/src/cw/cw_out_generic_indexed_enum.c index 4da7c810..5f416eca 100644 --- a/src/cw/cw_out_generic_indexed_enum.c +++ b/src/cw/cw_out_generic_indexed_enum.c @@ -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); } diff --git a/src/cw/cw_out_generic_struct.c b/src/cw/cw_out_generic_struct.c index 843b2264..04fbdaa9 100644 --- a/src/cw/cw_out_generic_struct.c +++ b/src/cw/cw_out_generic_struct.c @@ -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); } diff --git a/src/cw/cw_out_generic_with_index.c b/src/cw/cw_out_generic_with_index.c index 8f75d709..c5070ad0 100644 --- a/src/cw/cw_out_generic_with_index.c +++ b/src/cw/cw_out_generic_with_index.c @@ -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++; diff --git a/src/cw/cw_out_idx_generic_struct.c b/src/cw/cw_out_idx_generic_struct.c index 4c47035f..616f0a18 100644 --- a/src/cw/cw_out_idx_generic_struct.c +++ b/src/cw/cw_out_idx_generic_struct.c @@ -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; diff --git a/src/cw/cw_out_radio_generic_struct.c b/src/cw/cw_out_radio_generic_struct.c index 18377626..f21416ca 100644 --- a/src/cw/cw_out_radio_generic_struct.c +++ b/src/cw/cw_out_radio_generic_struct.c @@ -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;imsgset->write_header(handler,dst,l); printf("header wr len %d\n",l); if (handler->patch){ handler->patch(dst+offset,stack); diff --git a/src/cw/cw_put_msg.c b/src/cw/cw_put_msg.c index 123959d8..31257e67 100644 --- a/src/cw/cw_put_msg.c +++ b/src/cw/cw_put_msg.c @@ -154,6 +154,7 @@ printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name cw_decode_elements( ¶ms, elems_ptr,elems_len); + printf ("----------------------------------- end redecode -----------------------------\n"); } diff --git a/src/cw/cw_write_header.c b/src/cw/cw_write_header.c index 05566265..a4a64317 100644 --- a/src/cw/cw_write_header.c +++ b/src/cw/cw_write_header.c @@ -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; diff --git a/src/cw/msgset.h b/src/cw/msgset.h index 4577df30..1d444e9c 100644 --- a/src/cw/msgset.h +++ b/src/cw/msgset.h @@ -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; diff --git a/src/mod/capwap/capwap_actions_ac.c b/src/mod/capwap/capwap_actions_ac.c index f23f6908..345ca212 100644 --- a/src/mod/capwap/capwap_actions_ac.c +++ b/src/mod/capwap/capwap_actions_ac.c @@ -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; } diff --git a/src/mod/cisco/cisco_actions_ac.c b/src/mod/cisco/cisco_actions_ac.c index cb790e0a..0f3fd271 100644 --- a/src/mod/cisco/cisco_actions_ac.c +++ b/src/mod/cisco/cisco_actions_ac.c @@ -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} }; diff --git a/src/mod/cisco/mod_cisco_ac.c b/src/mod/cisco/mod_cisco_ac.c index ab2df2f8..611857b1 100644 --- a/src/mod/cisco/mod_cisco_ac.c +++ b/src/mod/cisco/mod_cisco_ac.c @@ -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) { diff --git a/src/wtp/cisco.ktv b/src/wtp/cisco.ktv index 8cf10115..356c3ddc 100644 --- a/src/wtp/cisco.ktv +++ b/src/wtp/cisco.ktv @@ -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