From 4ef1b69f830a28816f0d84ef37d27ad5dd58308c Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@mail.ru> Date: Sun, 28 Aug 2022 11:42:11 +0200 Subject: [PATCH] Fixes in RPC --- src/cw/cfg.c | 49 +++++++++++++++++-- src/cw/cfg.h | 4 +- src/cw/cw.c | 46 +++++++++++++++++ src/cw/cw_out_generic_indexed_enum.c | 4 +- src/cw/cw_out_radio_generic_struct.c | 2 +- src/cw/message.c | 4 +- .../capwap_in_capwap_control_ip_address.c | 2 +- src/mod/cisco/cisco_actions.c | 4 +- src/wtp/wtp_main.c | 11 +++++ 9 files changed, 113 insertions(+), 13 deletions(-) diff --git a/src/cw/cfg.c b/src/cw/cfg.c index 856799ba..859ff07d 100644 --- a/src/cw/cfg.c +++ b/src/cw/cfg.c @@ -595,13 +595,13 @@ struct cw_Cfg_entry *cw_cfg_iter_next(struct cw_Cfg_iter *cfi, const char *nnkey const char *d; e = mavliter_get(&(cfi->it)); - if (e == NULL) + if (e == NULL){ return NULL; + } bl = strlen(cfi->base); kl = strlen(e->key); - if (bl > kl) return NULL; @@ -617,7 +617,6 @@ struct cw_Cfg_entry *cw_cfg_iter_next(struct cw_Cfg_iter *cfi, const char *nnkey d = strchr(e->key, '.'); if (d == NULL) return NULL; - if (d - e->key != bl) return NULL; @@ -706,7 +705,7 @@ void cw_cfg_set_int(cw_Cfg_t * cfg, const char * key, int val) } -int cw_cfg_get_next_index(cw_Cfg_t * cfg, const char *key) +int cw_cfg_get_new_index(cw_Cfg_t * cfg, const char *key) { char ikey[CW_CFG_MAX_KEY_LEN]; struct cw_Cfg_entry search, * result; @@ -722,7 +721,7 @@ int cw_cfg_get_next_index(cw_Cfg_t * cfg, const char *key) return 0; } - d = strchr(result->key,'.'); + d = strrchr(result->key,'.'); if (d==NULL){ return 0; } @@ -733,6 +732,46 @@ int cw_cfg_get_next_index(cw_Cfg_t * cfg, const char *key) return atoi(d+1)+1; } + +int cw_cfg_get_first_index(cw_Cfg_t * cfg, const char *key, int n) +{ + char ikey[CW_CFG_MAX_KEY_LEN]; + struct cw_Cfg_entry search, * result; + char *d; + + sprintf(ikey,"%s.%d",key,n); + + search.key=ikey; + + result = mavl_get_first(cfg->cfg,&search); + if (result == NULL){ + return -1; + } + + d = strrchr(result->key,'.'); + if (d==NULL){ + return -1; + } + + if (strncmp(result->key,ikey,d-result->key)!=0) + return -1; + + return atoi(d+1); +} + +int cw_cfg_get_first_index_l(cw_Cfg_t ** cfgs, const char *key, int n) +{ + int r; + while(*cfgs != NULL){ + r = cw_cfg_get_first_index(*cfgs,key,n); + if (r!=-1) + return r; + cfgs++; + } + return -1; +} + + int cw_cfg_set_val(cw_Cfg_t * cfg, const char *key, const struct cw_Type *type, const void * valguard, const uint8_t * data, int len) { cw_Val_t mdata, *mresult; diff --git a/src/cw/cfg.h b/src/cw/cfg.h index 37032602..ea381956 100644 --- a/src/cw/cfg.h +++ b/src/cw/cfg.h @@ -69,7 +69,7 @@ void cw_cfg_set_int(cw_Cfg_t * cfg, const char * key, int val); uint8_t cw_cfg_get_byte(cw_Cfg_t * cfg, char *key, uint8_t def); bstr16_t cw_cfg_get_bstr16(cw_Cfg_t * cfg, const char * key, const char *def); int cw_cfg_set_bstr16(cw_Cfg_t * cfg, const char * key, bstr16_t str); -int cw_cfg_get_next_index(cw_Cfg_t * cfg, const char *key); +int cw_cfg_get_new_index(cw_Cfg_t * cfg, const char *key); const char *cw_cfg_get_l(cw_Cfg_t ** cfg, const char * key, const char *def); void cw_cfg_copy(cw_Cfg_t *src, cw_Cfg_t *dst,int dbg_level,const char *dbg_prefix); void cw_cfg_destroy(cw_Cfg_t *cfg); @@ -86,6 +86,8 @@ void cw_cfg_fdump(FILE *f, cw_Cfg_t * cfg, const char *filter); int cw_cfg_read_from_string(const char *str, cw_Cfg_t *cfg); void cw_cfg_del(cw_Cfg_t * cfg, const char *key); +int cw_cfg_get_first_index(cw_Cfg_t * cfg, const char *key, int n); +int cw_cfg_get_first_index_l(cw_Cfg_t ** cfgs, const char *key, int n); diff --git a/src/cw/cw.c b/src/cw/cw.c index cb01ce82..683fc204 100644 --- a/src/cw/cw.c +++ b/src/cw/cw.c @@ -47,6 +47,17 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams // cw_dbg(DBG_X,"Generic out!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); // cw_cfg_dump(params->cfg); // cw_dbg(DBG_X,"Generic out!!!!!!!!!!!!!!!!!!!!!!!!!!!! ENDDUMP"); +// +// + if (!cw_cfg_base_exists(params->cfg_list[0],handler->key)){ + cw_dbg(DBG_MSG_COMPOSE," Add Elem: %d %d %d %s %s - (skip)", + params->elemdata->proto, + params->elemdata->vendor, + params->elemdata->id, + handler->name, handler->key); + return 0; + } + start = params->msgset->header_len(handler); len = ((const cw_Type_t*)(handler->type))-> @@ -117,6 +128,41 @@ int cw_out_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerP int len,i,l,start; int radios; len =0; + + for (i=0; (i=cw_cfg_get_first_index_l(params->cfg_list,"radio",i))!=-1; i++){ + sprintf(key,"radio.%d/%s",i,handler->key); + if (!params->elemdata->mand){ + if (!cw_cfg_base_exists(params->cfg_list[0],key)){ + cw_dbg(DBG_MSG_COMPOSE," Add Elem: %d %d %d %s %s - (skip)", + params->elemdata->proto, + params->elemdata->vendor, + params->elemdata->id, + handler->name, key); + continue; + } + } + + type = (struct cw_Type*)handler->type; + start = params->msgset->header_len(handler)+len; + + + + l = type->write(params->cfg_list, key,dst+start+1,handler->param); + if (l==-1) + continue; + + l += cw_put_byte(dst+start,i); + + l = params->msgset->write_header(handler,dst+len,l); + len+=l; + + + } + + return len; + + + radios = cw_cfg_get_byte_l(params->cfg_list,"capwap/wtp-descriptor/max-radios",0); for(i=0;itype; + + for(i=0; e[i].name!=NULL; i++) { int b; @@ -32,7 +34,7 @@ int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemH cw_dbg(DBG_X,"Her is the Key: %s %s\n",key,e[i].name); - b = cw_cfg_base_exists_l(params->cfg_list,handler->key); + b = cw_cfg_base_exists(params->cfg_list[0],handler->key); if (!b){ //stop(); continue; diff --git a/src/cw/cw_out_radio_generic_struct.c b/src/cw/cw_out_radio_generic_struct.c index 3992f50a..44dfee48 100644 --- a/src/cw/cw_out_radio_generic_struct.c +++ b/src/cw/cw_out_radio_generic_struct.c @@ -139,7 +139,7 @@ int cw_out_traverse(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams //current[0]=0; - stop(); + //stop(); return 0; // return cw_out_traverse0(handler,params,dst,-1,current,handler->key, stack); diff --git a/src/cw/message.c b/src/cw/message.c index fa06c014..5064f685 100644 --- a/src/cw/message.c +++ b/src/cw/message.c @@ -38,7 +38,7 @@ int cw_encode_elements(struct cw_ElemHandlerParams *params, mlist_t elements_lis } continue; } - +/* if (!data->mand){ if (!cw_cfg_base_exists(params->cfg_list[0],handler->key)){ cw_dbg(DBG_MSG_COMPOSE," Add Elem: %d %d %d %s %s - (skip)", @@ -47,7 +47,7 @@ int cw_encode_elements(struct cw_ElemHandlerParams *params, mlist_t elements_lis continue; } } - +*/ l = handler->put(handler,params,dst+len); cw_dbg(DBG_MSG_COMPOSE," Add Elem: %d %d %d %s - (%d bytes)", diff --git a/src/mod/capwap/capwap_in_capwap_control_ip_address.c b/src/mod/capwap/capwap_in_capwap_control_ip_address.c index 62210b46..d65d7adb 100644 --- a/src/mod/capwap/capwap_in_capwap_control_ip_address.c +++ b/src/mod/capwap/capwap_in_capwap_control_ip_address.c @@ -34,7 +34,7 @@ int capwap_in_capwap_control_ip_address(struct cw_ElemHandler *eh, int idx; sprintf(key,"%s/address",eh->key); - idx = cw_cfg_get_next_index(params->cfg,key); + idx = cw_cfg_get_new_index(params->cfg,key); /* printf("SKEY is %s , idx: %d\n",key,idx);*/ diff --git a/src/mod/cisco/cisco_actions.c b/src/mod/cisco/cisco_actions.c index fe20d999..3eae59de 100644 --- a/src/mod/cisco/cisco_actions.c +++ b/src/mod/cisco/cisco_actions.c @@ -267,7 +267,7 @@ int cisco_in_ap_regulatory_domain(struct cw_ElemHandler *eh, int idx; void * type; - idx = cw_cfg_get_next_index(params->cfg,eh->key); + idx = cw_cfg_get_new_index(params->cfg,eh->key); sprintf(key,"%s.%d",eh->key,idx); @@ -2520,7 +2520,7 @@ static struct cw_ElemDef configuration_update_request_elements[] ={ {0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_MIN_IOS_VERSION, 0, 0}, {0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_BACKUP_SOFTWARE_VERSION, 0, 0}, - {0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_REGULATORY_DOMAIN, 0, 0}, +/* {0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_REGULATORY_DOMAIN, 0, 0},*/ {0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_MODEL, 0, 0}, {0, CW_VENDOR_ID_CISCO, CISCO_ELEM_RESET_BUTTON_STATE, 0, 0}, {0, CW_VENDOR_ID_CISCO, CISCO_ELEM_WTP_RADIO_CONFIGURATION, 0, 0}, diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index 577d1999..c04a72dd 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -163,6 +163,17 @@ int main (int argc, char **argv) cw_cfg_destroy(cfg); +/* { +struct cw_Cfg_iter cfi; +struct cw_Cfg_entry *e; +int i; +for (i=0; (i=cw_cfg_get_first_index(global_cfg,"radio",i))!=-1; i++){ + printf("Inedx: %d\n", i); +} +goto errX; + } +*/ + /* conn->mod=mod;*/ conn->detected = 1;