diff --git a/src/capwap/Makefile b/src/capwap/Makefile index ab1a4dd2..ed8e914e 100644 --- a/src/capwap/Makefile +++ b/src/capwap/Makefile @@ -74,7 +74,8 @@ MAVLOBJS= \ mavl_get_node.o \ mavl_foreach.o \ mavl_foreach_lr.o \ - utf8.o + utf8.o \ + file.o # cw_foreach_msgelem.o \ diff --git a/src/capwap/capwap.h b/src/capwap/capwap.h index 5787d2f5..050a86a6 100644 --- a/src/capwap/capwap.h +++ b/src/capwap/capwap.h @@ -1093,6 +1093,7 @@ int cw_out_wtp_board_data(struct conn *conn, struct cw_action_out *a, uint8_t * void cw_init_request(struct conn *conn, int msg_id); struct mbag_item *cw_out_get_session_id(struct conn *conn, struct cw_action_out *a); +struct mbag_item *cw_out_get_config(struct conn *conn, struct cw_action_out *a); diff --git a/src/capwap/capwap_action_helpers.c b/src/capwap/capwap_action_helpers.c index a5dcc081..6a03acda 100644 --- a/src/capwap/capwap_action_helpers.c +++ b/src/capwap/capwap_action_helpers.c @@ -27,6 +27,11 @@ struct mbag_item *cw_out_get_local(struct conn *conn, struct cw_action_out *a) return mbag_get(conn->local,a->item_id); } +struct mbag_item *cw_out_get_config(struct conn *conn, struct cw_action_out *a) +{ + return mbag_get(conn->config,a->item_id); +} + #include "capwap.h" diff --git a/src/capwap/capwap_actions_wtp.c b/src/capwap/capwap_actions_wtp.c index 7e490de7..bf44a4ca 100644 --- a/src/capwap/capwap_actions_wtp.c +++ b/src/capwap/capwap_actions_wtp.c @@ -197,7 +197,7 @@ cw_action_out_t capwap_actions_wtp_out[] = { /* WTP Name */ {CW_MSG_JOIN_REQUEST, CW_ITEM_WTP_NAME, 0, - CW_ELEM_WTP_NAME, NULL,cw_out_generic, cw_out_get_local,1} + CW_ELEM_WTP_NAME, NULL,cw_out_generic, cw_out_get_config,1} , /* WTP MAC Type */ diff --git a/src/capwap/conn_init.c b/src/capwap/conn_init.c index 363519c7..49fd117a 100644 --- a/src/capwap/conn_init.c +++ b/src/capwap/conn_init.c @@ -39,9 +39,10 @@ void conn_init(struct conn * conn) conn->wait_dtls=CAPWAP_WAIT_DTLS; conn->wait_join=CAPWAP_WAIT_JOIN; conn->mtu_discovery=1; - conn->remote = mbag_create(); conn->capwap_mode = CW_MODE_UNKNOWN; conn->strict_capwap=1; + + conn->remote = mbag_create(); } diff --git a/src/capwap/cw_in_check_disc_resp.c b/src/capwap/cw_in_check_disc_resp.c index 43ea8435..ef4bd45e 100644 --- a/src/capwap/cw_in_check_disc_resp.c +++ b/src/capwap/cw_in_check_disc_resp.c @@ -35,6 +35,9 @@ int cw_in_check_disc_resp(struct conn *conn, struct cw_action_in *a, uint8_t * d discs = mbag_get_avltree_c(conn->remote, CW_ITEM_DISCOVERIES, mbag_create); +//mavl_del_all(discs); +//exit(0); + if ( !discs ) { cw_log(LOG_ERR,"Can't allocate store for disc resp"); errno = ENOMEM; diff --git a/src/capwap/cw_out_wtp_board_data.c b/src/capwap/cw_out_wtp_board_data.c index 91d5fe53..a2f33a09 100644 --- a/src/capwap/cw_out_wtp_board_data.c +++ b/src/capwap/cw_out_wtp_board_data.c @@ -9,7 +9,7 @@ int cw_out_wtp_board_data(struct conn *conn, struct cw_action_out *a, uint8_t * dst) { mbag_t board_data = - mbag_get_avltree(conn->local, CW_ITEM_WTP_BOARD_DATA); + mbag_get_mbag(conn->config, CW_ITEM_WTP_BOARD_DATA,NULL); if (!board_data) { cw_log(LOG_ERR, "Error: Can't send WTP Board Data element. WTP Board Data is not defined."); return 0; diff --git a/src/capwap/mbag.c b/src/capwap/mbag.c index 37e0575d..eb9f66c5 100644 --- a/src/capwap/mbag.c +++ b/src/capwap/mbag.c @@ -37,11 +37,9 @@ const struct mbag_typedef mbag_type_vendorstr = { void free_avltree(void*t){ - mbag_item_t *i = (mbag_item_t *) t; + mavl_t i = (mavl_t) t; -printf("the mavl deleer %p\n",i->data); - mavl_destroy(i->data); -printf("jo\n"); + mavl_destroy(i); } const struct mbag_typedef mbag_type_avltree = { @@ -53,10 +51,9 @@ const struct mbag_typedef mbag_type_avltree = { static void mbag_type_mbag_del(void *i) { - struct mbag_item *x = (struct mbag_item*)i; -printf("MBAG DELETE %p\n",x->data); + mbag_t x = (mbag_t)i; - mavl_destroy(x->data); + mavl_destroy(x); } const struct mbag_typedef mbag_type_mbag = { @@ -66,17 +63,15 @@ const struct mbag_typedef mbag_type_mbag = { static void mbag_del_data(struct mbag_item *i) { -printf("Deling: %p\n",i->data); if (i->type->del) { -printf("Calling deler\n"); - i->type->del(i); + i->type->del(i->data); } } static void mbag_del_fun(void *e) { - + mbag_del_data(e); free(e); } diff --git a/src/capwap/mbag.h b/src/capwap/mbag.h index 70725bbd..069f244f 100644 --- a/src/capwap/mbag.h +++ b/src/capwap/mbag.h @@ -276,7 +276,6 @@ static inline int mbag_set_avltree(mbag_t s, uint32_t id, struct avltree *t) return 0; i->type = MBAG_AVLTREE; i->data = t; -printf("Adding AVL %p to %p\n",t,s); return 1; } diff --git a/src/wtp/cfg.c b/src/wtp/cfg.c index 3a0c0953..871270be 100644 --- a/src/wtp/cfg.c +++ b/src/wtp/cfg.c @@ -14,23 +14,27 @@ #include "capwap/mavl.h" #include "capwap/format.h" - +#include "capwap/file.h" /* json putters */ int cfg_json_put_bstr16(char *dst,const char * name, mbag_item_t *i,int n); int cfg_json_put_vendorstr(char *dst,const char * name, mbag_item_t *i,int n); +int cfg_json_put_dword(char *dst,const char * name, mbag_item_t *i,int n); + +//static int scn_obj(char *js, jsmntok_t *t, int (vcb)(char*js,jsmntok_t*t,struct mbag_itemdef *defs,mbag_t mbag), struct mbag_itemdef *defs,mbag_t mbag); struct mbag_itemdef { int item_id; const char *cfgname; - int (*setfun) (struct mbag_itemdef *,char *,jsmntok_t *); + int (*setfun) (struct mbag_itemdef *,char *,jsmntok_t *,mbag_t mbag); int (*tojsonfun) (char *dst,const char *name, mbag_item_t *i,int n); }; typedef struct mbag_itemdef cfg_item_t; +int cfg_json_get_dword(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag); enum { @@ -39,7 +43,7 @@ enum { }; -static int scn_obj(char *js, jsmntok_t *t, int (vcb)(char*js,jsmntok_t*t) ) { +static int scn_obj(char *js, jsmntok_t *t, int (vcb)(char*js,jsmntok_t*t,struct mbag_itemdef *defs,mbag_t mbag), struct mbag_itemdef *defs,mbag_t mbag) { int i; if (t->type!=JSMN_OBJECT){ @@ -56,7 +60,7 @@ printf("No object\n"); int j=1; for (i = 0; i < t->size; i++) { - j+=vcb(js,t+j); + j+=vcb(js,t+j,defs,mbag); continue; } @@ -107,9 +111,8 @@ printf("GET BYTE\n"); } -int cfg_json_get_vendorstr(struct mbag_itemdef *idef,char *js, jsmntok_t *t) +int cfg_json_get_vendorstr(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag) { - struct conn * conn = get_conn(); int item_id = idef->item_id; *(js+t->end)=0; @@ -128,13 +131,13 @@ int cfg_json_get_vendorstr(struct mbag_itemdef *idef,char *js, jsmntok_t *t) *((t+2)->end+js)=0; bstr16_t v = bstr16cfgstr(str); - mbag_set_vendorstr(conn->config,item_id,vendor_id,bstr16_data(v),bstr16_len(v)); + mbag_set_vendorstr(mbag,item_id,vendor_id,bstr16_data(v),bstr16_len(v)); free(v); return 0; } -int cfg_json_get_bstr16(struct mbag_itemdef *idef,char *js, jsmntok_t *t) +int cfg_json_get_bstr16(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag) { struct conn * conn = get_conn(); @@ -147,7 +150,24 @@ int cfg_json_get_bstr16(struct mbag_itemdef *idef,char *js, jsmntok_t *t) } *(js+t->end)=0; bstr16_t b = bstr16cfgstr(js+t->start); - mbag_set_bstr16(conn->config,item_id,b); + mbag_set_bstr16(mbag,item_id,b); + return 0; +} + +int cfg_json_get_dword(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag) +{ + + struct conn * conn = get_conn(); + + int item_id = idef->item_id; + *(js+t->end)=0; +// char *str = js+t->start; + if (t->type != JSMN_STRING){ + return 0; + } + *(js+t->end)=0; + uint32_t dw = atoi(js+t->start); + mbag_set_dword(mbag,item_id,dw); return 0; } @@ -199,7 +219,8 @@ int bstr_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t) -int wtp_board_data_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t); +int wtp_board_data_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag); +int cfg_json_put_obj(char *dst,const char * name, mbag_item_t *i,int n); @@ -208,26 +229,26 @@ int wtp_board_data_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t); struct mbag_itemdef general_cfg[] = { {CW_ITEM_WTP_NAME, "wtp_name",cfg_json_get_bstr16,cfg_json_put_bstr16}, {CW_ITEM_LOCATION_DATA,"location_data",cfg_json_get_bstr16,cfg_json_put_bstr16}, - {CW_ITEM_WTP_HARDWARE_VERSION, "hardware_version",cfg_json_get_vendorstr,cfg_json_put_vendorstr}, {CW_ITEM_WTP_SOFTWARE_VERSION, "software_version",cfg_json_get_vendorstr,cfg_json_put_vendorstr}, + {CW_ITEM_WTP_BOARD_DATA,"wtp_board_data",wtp_board_data_local,cfg_json_put_obj}, + {CW_RADIO_BSSID, "bssid",cfg_json_get_bstr16,cfg_json_put_bstr16}, - {CW_ITEM_WTP_BOARD_MODELNO, "modelno",bstr16_local}, - {CW_ITEM_WTP_BOARD_DATA,"wtp_board_data",wtp_board_data_local}, - {CW_ITEM_WTP_FRAME_TUNNEL_MODE,"frame_tunnel_mode",byte_local}, + +/* {CW_ITEM_WTP_FRAME_TUNNEL_MODE,"frame_tunnel_mode",byte_local}, {CW_ITEM_WTP_MAC_TYPE,"mac_type",byte_local}, {CW_ITEM_WTP_GROUP_NAME,"group_name",bstr16_local}, {CW_RADIO_BSSID,"bssid",bstr_local}, - +*/ {0, 0, 0} }; struct mbag_itemdef board_data_cfg[] = { - {CW_ITEM_WTP_BOARD_MODELNO, "model_no",NULL}, - {CW_ITEM_WTP_BOARD_SERIALNO, "serial_no",NULL}, - {CW_ITEM_WTP_BOARD_VENDOR, "vendor_id",NULL}, + {CW_ITEM_WTP_BOARD_MODELNO, "model_no",cfg_json_get_bstr16,cfg_json_put_bstr16}, + {CW_ITEM_WTP_BOARD_SERIALNO, "serial_no",cfg_json_get_bstr16,cfg_json_put_bstr16}, + {CW_ITEM_WTP_BOARD_VENDOR, "vendor_id",cfg_json_get_dword,cfg_json_put_dword}, {0, 0, 0} }; @@ -257,6 +278,24 @@ int cfg_json_put_bstr16(char *dst,const char * name, mbag_item_t *i,int n) return d-dst; } + +int cfg_json_put_dword(char *dst,const char * name, mbag_item_t *i,int n) +{ +// if (i->type != MBAG_BSTR16){ +// return 0; +// } + + char *d = dst; + memset(d,'\t',n); + d+=n; + d+=sprintf(d,"\"%s\":",name); + d+=sprintf(d,"\"%d\"",i->dword); + return d-dst; +} + + + + int cfg_json_put_vendorstr(char *dst,const char * name, mbag_item_t *i,int n) { if (i->type != MBAG_VENDORSTR){ @@ -285,18 +324,30 @@ int cfg_json_put_vendorstr(char *dst,const char * name, mbag_item_t *i,int n) // d+=sprintf(d,"\"%.*s\",\n",bstr16_len(i->data),bstr16_data(i->data)); return d-dst; } +int mbag_tojson(char *dst, mbag_t m, struct mbag_itemdef *defs, int n); +int cfg_json_put_obj(char *dst,const char * name, mbag_item_t *i,int n) +{ + char *d = dst; + memset(d,'\t',n); + d+=n; + d+=sprintf(d,"\"%s\":",name); + printf("here we are %s\n",dst); + + d+=mbag_tojson(d,i->data,board_data_cfg,n); + return d-dst; -int mbag_tojson(char *dst, mbag_t m, int n) +} + +int mbag_tojson(char *dst, mbag_t m, struct mbag_itemdef *defs, int n) { char *d; d = dst; -printf("MBAG COUNT: %d\n",m->count); - memset(dst,'\t',n); - d+=n; +// memset(dst,'\t',n); +// d+=n; d+=sprintf(d,"%s","{\n"); MAVLITER_DEFINE(it,m); @@ -305,10 +356,20 @@ printf("MBAG COUNT: %d\n",m->count); mavliter_foreach(&it) { mbag_item_t * i = mavliter_get(&it); - struct mbag_itemdef * idef = get_idef_by_id(general_cfg,i->id); +/* + if (i->type == MBAG_MBAG){ + printf("MBAG DETECTD\n"); + + d+=mbag_tojson(d,i->data,n+1); + continue; + + } + +*/ +//d+=sprintf(d,"jele ."); + + struct mbag_itemdef * idef = get_idef_by_id(defs,i->id); if (idef==0){ - d+=sprintf(d,"NOJai\n"); - continue; } if (!idef->tojsonfun) @@ -320,24 +381,25 @@ printf("MBAG COUNT: %d\n",m->count); } d+=sprintf(d,"\n"); - - d+=sprintf(d,"%s","}\n"); - memset(dst,'\t',n); + memset(d,'\t',n); d+=n; + d+=sprintf(d,"%s","}"); + return d-dst; } -tester() +int tester() { struct conn * conn = get_conn(); char dst[4096]; - mbag_tojson(dst,conn->config,0); + int n = mbag_tojson(dst,conn->config,general_cfg,0); - printf("Json resilt:\n%s",dst); - - exit(0); +printf("Json: %s\n",dst); + + cw_save_file("cfg.save.json",dst,n); +exit(0); } @@ -351,16 +413,16 @@ struct mbag_itemdef * get_cfg(struct mbag_itemdef *cfg,const char *key){ return NULL; } -static int wtp_board_data_cb(char *js,jsmntok_t *t) +static int wtp_board_data_cb(char *js,jsmntok_t *t,mbag_t mbag) { struct conn * conn = get_conn(); - mbag_t bd = mbag_get_avltree(conn->local,CW_ITEM_WTP_BOARD_DATA); + mbag_t bd = mbag_get_mbag(conn->config,CW_ITEM_WTP_BOARD_DATA,NULL); if (!bd){ bd = mbag_create(); if (!bd){ return skip(t+1); } - mbag_set_avltree(conn->local,CW_ITEM_WTP_BOARD_DATA,bd); + mbag_set_mbag(mbag,CW_ITEM_WTP_BOARD_DATA,bd); } @@ -395,24 +457,38 @@ static int wtp_board_data_cb(char *js,jsmntok_t *t) return skip(t+1); } +static int set_cfg(char *js,jsmntok_t *t,struct mbag_itemdef *defs,mbag_t mbag); -int wtp_board_data_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t) +int wtp_board_data_local(struct mbag_itemdef *idef,char *js, jsmntok_t *t,mbag_t mbag) { -printf("Local board data\n"); if ( t->type != JSMN_OBJECT ) { printf("Error: wtp_board_data is no object\n"); printf("Size: %d\n",t->size); return 0; } -printf("Scanni\n"); - scn_obj(js, t,wtp_board_data_cb); +printf("BOARD DATA SCANER\n"); + + struct conn * conn = get_conn(); + mbag_t bd = mbag_get_mbag(conn->config,CW_ITEM_WTP_BOARD_DATA,NULL); + if (!bd){ + bd = mbag_create(); + if (!bd){ + return skip(t+1); + } + mbag_set_mbag(mbag,CW_ITEM_WTP_BOARD_DATA,bd); + } + + + + + scn_obj(js, t,set_cfg,board_data_cfg,bd); return skip(t+1); } -static int set_cfg(char *js,jsmntok_t *t){ +static int set_cfg(char *js,jsmntok_t *t,struct mbag_itemdef *defs,mbag_t mbag){ *(js+t->end)=0; const char * key = js+t->start; @@ -421,7 +497,7 @@ static int set_cfg(char *js,jsmntok_t *t){ - struct mbag_itemdef * idef = get_cfg(general_cfg,key); + struct mbag_itemdef * idef = get_cfg(defs,key); // printf("Key: %s\n",key); // printf("Val: %s\n",val); @@ -434,7 +510,7 @@ static int set_cfg(char *js,jsmntok_t *t){ } else{ - idef->setfun(idef,js,t+1); + idef->setfun(idef,js,t+1,mbag); } return skip(t+1); @@ -446,6 +522,8 @@ static int set_cfg(char *js,jsmntok_t *t){ int setup_conf(struct conn *conn) { + +/* FILE * infile = fopen("cfg.json","rb"); if ( !infile ){ perror("Can't open cfg.json"); @@ -465,6 +543,14 @@ int setup_conf(struct conn *conn) fseek(infile,0,SEEK_SET); fread(jstr,1,size,infile); +*/ + + size_t size; + char *jstr = cw_load_file("cfg.json",&size); + if (!jstr) { + fprintf(stderr,"Can't load cfg %s: %s\n","cfg.json",strerror(errno)); + return 0; + } jsmn_parser p; jsmntok_t t[1200]; @@ -475,7 +561,7 @@ int setup_conf(struct conn *conn) printf("Parser failed\n"); } - scn_obj(jstr, t,set_cfg); + scn_obj(jstr, t,set_cfg,general_cfg,conn->config); diff --git a/src/wtp/cfg.json b/src/wtp/cfg.json index f918d94d..bf80e154 100644 --- a/src/wtp/cfg.json +++ b/src/wtp/cfg.json @@ -1,7 +1,21 @@ { - "wtp_name":"TubeWTP", + "wtp_name":"TubeWTPx", "hardware_version":["4232704",".x01000000"], "software_version":["4232704",".x08006e00"], - "location_data":"China" -} + "location_data":"China", + "bssid": ".x003a9902fac0", + "wtp_board_data" : { + "vendor_id": "4232704", + "model_no": "AIR-LAP1131AG-E-K9", + "serial_no": "2045" + }, + + + "acname_with_priority": { + "1":"Master-AC", + "2":"Cisco-AC" + }, + + +} diff --git a/src/wtp/discovery.c b/src/wtp/discovery.c index 4a7588a4..5803c84e 100644 --- a/src/wtp/discovery.c +++ b/src/wtp/discovery.c @@ -131,9 +131,10 @@ static int run_discovery(struct conn *conn) } } + mbag_t discs; discs = mbag_get_avltree(conn->remote, CW_ITEM_DISCOVERIES); -printf("discs = %p\n",discs); + if (!discs) { cw_log(LOG_ERR,"No discovery responses received"); @@ -142,24 +143,19 @@ printf("discs = %p\n",discs); int i; - cw_aciplist_t list = cw_select_ac(conn, discs); -printf("List is %p\n",list); DEFINE_AVLITER(ii,list); avliter_foreach(&ii){ cw_acip_t * ip = avliter_get(&ii); - printf("Have an IOP\n"); } - printf("Nitems: %d\n",conn->remote->count); - printf("DEl: %p\n",conn->remote); - //mavl_del_all(conn->remote); + mavl_del_all(conn->remote); mbag_set_avltree(conn->local,CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST,list); diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index 8989aa35..67cee526 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -108,8 +108,7 @@ conn->config=mbag_create(); setup_conf(conn); -/* - mbag_t board_data = mbag_itemstore_create(); + mbag_t board_data = mbag_create(); mbag_set_dword(board_data, CW_ITEM_WTP_BOARD_VENDOR, conf_vendor_id); @@ -118,11 +117,8 @@ conn->config=mbag_create(); mbag_set_bstr16n(board_data, CW_ITEM_WTP_BOARD_SERIALNO, bstr_data(conf_serial_no), bstr_len(conf_serial_no)); -*/ - - -// mbag_set_avltree(conn->outgoing, CW_ITEM_WTP_BOARD_DATA, board_data); + mbag_set_avltree(conn->outgoing, CW_ITEM_WTP_BOARD_DATA, board_data); cw_acpriolist_t acprios = cw_acpriolist_create(); cw_acpriolist_set(acprios,"Master AC",strlen("Master AC"),1);