diff --git a/src/ac/ac_global.c b/src/ac/ac_global.c index 1d4321d8..bd9aedc5 100644 --- a/src/ac/ac_global.c +++ b/src/ac/ac_global.c @@ -90,9 +90,9 @@ int ac_global_init() ac_status.dtls_policy = CW_FLAG_DTLS_POLICY_C | CW_FLAG_DTLS_POLICY_D; - mbag_set_vendorstr(ac_config, CW_ITEM_AC_HARDWARE_VERSION, 0, + mbag_set_bstrv(ac_config, CW_ITEM_AC_HARDWARE_VERSION, 0, bstr_data(conf_hardware_version), bstr_len(conf_hardware_version)); - mbag_set_vendorstr(ac_config, CW_ITEM_AC_SOFTWARE_VERSION, 0, + mbag_set_bstrv(ac_config, CW_ITEM_AC_SOFTWARE_VERSION, 0, bstr_data(conf_software_version), bstr_len(conf_software_version)); diff --git a/src/cw/bstr.h b/src/cw/bstr.h index e8854ce7..5a552341 100644 --- a/src/cw/bstr.h +++ b/src/cw/bstr.h @@ -32,14 +32,23 @@ #include #include +/** + * @defgroup BSTRTypes Types + * @{ + */ + /** * bstr type * - * bstr_t serves as binary string where the first byte contains + * bstr_t serves as binary string, where the first byte contains * the length of the string. */ typedef uint8_t* bstr_t; +/** + *@} + */ + extern uint8_t * bstr_create(uint8_t *data, uint8_t len); extern uint8_t * bstr_create_from_cfgstr(const char * s); extern uint8_t * bstr_replace( bstr_t * dst, uint8_t * bstr); @@ -64,7 +73,7 @@ extern int bstr_to_str(char *dst, bstr_t str,char * def); #define bstr_size(len) (len+1) /** - *@defgroup BstrConstants Types & Constants + *@defgroup BSTRConstants Constants *@{ */ @@ -73,6 +82,13 @@ extern int bstr_to_str(char *dst, bstr_t str,char * def); */ #define BSTR_MAX_LEN 254 +/**@}*/ + + +/** + *@addtogroup BSTRTypes + *@{ + */ /** * The same as #bstr_t, but there are two bytes used @@ -80,7 +96,9 @@ extern int bstr_to_str(char *dst, bstr_t str,char * def); */ typedef uint8_t *bstr16_t; -/**@}*/ +/** + *@} + */ /** @@ -125,42 +143,57 @@ static inline uint8_t * bstr16_create(uint8_t *data, uint16_t len) uint8_t * bstr16_create_from_str(const char *s); -typedef uint8_t * vendorstr_t; +/** + *@addtogroup BSTRTypes + *@{ + */ -#define vendorstr_get_vendor_id(str)\ +/** + * The bstrv_t type is basicly a #bstr16_t and can be + * handeld like a bstr16_t. + * The difference is, that the first four bytes of the + * string data containing a vendor id. + */ +typedef uint8_t * bstrv_t; + +/** + *@} + */ + +#define bstrv_get_vendor_id(str)\ ( *((uint32_t*)((str)+2))) -#define vendorstr_set_vendor_id(str,id)\ +#define bstrv_set_vendor_id(str,id)\ ( *((uint32_t*)((str)+2)) = id) -#define vendorstr_len(str)\ +#define bstrv_len(str)\ (*((uint16_t*)((str)+0))) -#define vendorstr_set_len(str,len)\ +#define bstrv_set_len(str,len)\ (*((uint16_t*)((str)+0))=len) -#define vendorstr_data(str)\ +#define bstrv_data(str)\ (((uint8_t*)(str))+6) -#define vendorstr_size(n)\ +#define bstrv_size(n)\ (1+6+(n)*sizeof(uint8_t)) -static inline uint8_t * vendorstr_create(uint32_t vendor_id, uint8_t *data, uint8_t len) +static inline uint8_t * bstrv_create(uint32_t vendor_id, uint8_t *data, uint8_t len) { - uint8_t * str = malloc(vendorstr_size(len)); + uint8_t * str = malloc(bstrv_size(len)); if (!str) return 0; - vendorstr_set_vendor_id(str,vendor_id); - vendorstr_set_len(str,len); - memcpy(vendorstr_data(str),data,len); - *(vendorstr_data(str)+vendorstr_len(str))=0; + bstrv_set_vendor_id(str,vendor_id); + bstrv_set_len(str,len); + memcpy(bstrv_data(str),data,len); + *(bstrv_data(str)+bstrv_len(str))=0; return str; } -uint8_t * vendorstr_create_from_str(uint32_t vendor_id,const char *s); +uint8_t * bstrv_create_from_str(uint32_t vendor_id,const char *s); uint8_t * bstr16cfgstr(const char * s); diff --git a/src/cw/capwap.h b/src/cw/capwap.h index b6ca721e..f772a050 100644 --- a/src/cw/capwap.h +++ b/src/cw/capwap.h @@ -1084,9 +1084,9 @@ static inline int cw_put_ac_status(uint8_t * dst, struct cw_ac_status *s) static inline int cw_put_version(uint8_t * dst, uint16_t subelem_id, uint8_t * v) { uint8_t *d = dst; - d += cw_put_dword(d, vendorstr_get_vendor_id(v)); - d += cw_put_dword(d, (subelem_id << 16) | vendorstr_len(v)); - d += cw_put_data(d, vendorstr_data(v), vendorstr_len(v)); + d += cw_put_dword(d, bstrv_get_vendor_id(v)); + d += cw_put_dword(d, (subelem_id << 16) | bstrv_len(v)); + d += cw_put_data(d, bstrv_data(v), bstrv_len(v)); return d - dst; } diff --git a/src/cw/cw_in_ac_descriptor.c b/src/cw/cw_in_ac_descriptor.c index 05d1b4bd..ce38f086 100644 --- a/src/cw/cw_in_ac_descriptor.c +++ b/src/cw/cw_in_ac_descriptor.c @@ -66,18 +66,18 @@ static int read_subeelms(struct conn *conn,struct cw_action_in * a,uint8_t *data int subtype = cw_get_word(data+sub+4); printf("substart : %d\n",sub); - vendorstr_t vstr=NULL; + bstrv_t vstr=NULL; switch (subtype){ case 0: case 4: /* hardware version */ - vstr = mbag_set_vendorstr(conn->incomming,CW_ITEM_AC_HARDWARE_VERSION, + vstr = mbag_set_bstrv(conn->incomming,CW_ITEM_AC_HARDWARE_VERSION, vendor_id,data+sub+8,sublen); break; case 1: case 5: /* software version */ - vstr = mbag_set_vendorstr(conn->incomming,CW_ITEM_AC_SOFTWARE_VERSION, + vstr = mbag_set_bstrv(conn->incomming,CW_ITEM_AC_SOFTWARE_VERSION, vendor_id,data+sub+8,sublen); break; } diff --git a/src/cw/cw_in_check_cipwap_join_req.c b/src/cw/cw_in_check_cipwap_join_req.c index 2e5cbe9f..31195043 100644 --- a/src/cw/cw_in_check_cipwap_join_req.c +++ b/src/cw/cw_in_check_cipwap_join_req.c @@ -27,8 +27,8 @@ int cw_detect_capwap(struct conn *conn) mbag_item_t * item = mbag_get(is,CW_ITEM_WTP_SOFTWARE_VERSION); if (item) { - vendorstr_t s = item->data; - uint32_t v = vendorstr_get_vendor_id(s); + bstrv_t s = item->data; + uint32_t v = bstrv_get_vendor_id(s); switch(v) { case CW_VENDOR_ID_CISCO: diff --git a/src/cw/cw_in_check_img_data_req_ac.c b/src/cw/cw_in_check_img_data_req_ac.c index b5dc7038..58604632 100644 --- a/src/cw/cw_in_check_img_data_req_ac.c +++ b/src/cw/cw_in_check_img_data_req_ac.c @@ -22,16 +22,16 @@ int cw_in_check_img_data_req_ac(struct conn *conn, struct cw_action_in *a, uint8 struct mbag_item *i = mbag_get(conn->incomming,CW_ITEM_IMAGE_IDENTIFIER); if (i) { - uint32_t vendor_id = vendorstr_get_vendor_id(i->data); + uint32_t vendor_id = bstrv_get_vendor_id(i->data); const char * image_dir; image_dir = mbag_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR,"./img"); - char * image_filename = malloc(6+vendorstr_len(i->data)+1+strlen(image_dir)); + char * image_filename = malloc(6+bstrv_len(i->data)+1+strlen(image_dir)); if (!image_filename) return CW_RESULT_IMAGE_DATA_ERROR; - sprintf(image_filename,"%s%04X/%s",image_dir,vendor_id,vendorstr_data(i->data)); + sprintf(image_filename,"%s%04X/%s",image_dir,vendor_id,bstrv_data(i->data)); FILE *infile = fopen(image_filename,"rb"); diff --git a/src/cw/cw_in_check_img_data_req_wtp.c b/src/cw/cw_in_check_img_data_req_wtp.c index f7fc8db0..6d050ece 100644 --- a/src/cw/cw_in_check_img_data_req_wtp.c +++ b/src/cw/cw_in_check_img_data_req_wtp.c @@ -33,16 +33,16 @@ int cw_in_check_img_data_req_wtp(struct conn *conn, struct cw_action_in *a, uint struct mbag_item *i = mbag_get(conn->incomming,CW_ITEM_IMAGE_IDENTIFIER); if (i) { - uint32_t vendor_id = vendorstr_get_vendor_id(i->data); + uint32_t vendor_id = bstrv_get_vendor_id(i->data); const char * image_dir; image_dir = mbag_get_str(conn->local,CW_ITEM_AC_IMAGE_DIR,"./img"); - char * image_filename = malloc(6+vendorstr_len(i->data)+1+strlen(image_dir)); + char * image_filename = malloc(6+bstrv_len(i->data)+1+strlen(image_dir)); if (!image_filename) return CW_RESULT_IMAGE_DATA_ERROR; - sprintf(image_filename,"%s%04X/%s",image_dir,vendor_id,vendorstr_data(i->data)); + sprintf(image_filename,"%s%04X/%s",image_dir,vendor_id,bstrv_data(i->data)); FILE *infile = fopen(image_filename,"rb"); diff --git a/src/cw/cw_in_cisco_image_identifier.c b/src/cw/cw_in_cisco_image_identifier.c index 7151ff40..e53b1f4b 100644 --- a/src/cw/cw_in_cisco_image_identifier.c +++ b/src/cw/cw_in_cisco_image_identifier.c @@ -31,7 +31,7 @@ int cw_in_cisco_image_identifier(struct conn *conn,struct cw_action_in * a,uint8 } // mbag_set(conn->remote,a->item_id,a->itemtype,data+dstart,len); - mbag_set_vendorstr(conn->incomming,a->item_id,vendor_id,data+dstart,len); + mbag_set_bstrv(conn->incomming,a->item_id,vendor_id,data+dstart,len); return 1; } diff --git a/src/cw/cw_in_generic.c b/src/cw/cw_in_generic.c index 9afcaaf0..72dbc4c9 100644 --- a/src/cw/cw_in_generic.c +++ b/src/cw/cw_in_generic.c @@ -63,7 +63,7 @@ int static do_save(mbag_t itemstore, struct conn *conn, struct cw_action_in *a, } */ if (a->itemtype == MBAG_VENDORSTR) { - mbag_set_vendorstr(itemstore, a->item_id, + mbag_set_bstrv(itemstore, a->item_id, cw_get_dword(data), data + 4, len - 4); return 1; } diff --git a/src/cw/cw_in_generic2.c b/src/cw/cw_in_generic2.c index ef9b4d08..83bc71d0 100644 --- a/src/cw/cw_in_generic2.c +++ b/src/cw/cw_in_generic2.c @@ -75,7 +75,7 @@ int static do_save(mbag_t itemstore, struct conn *conn, struct cw_action_in *a, } */ if (idef->type == MBAG_VENDORSTR) { - mbag_set_vendorstr(itemstore, a->item_id, + mbag_set_bstrv(itemstore, a->item_id, cw_get_dword(data), data + 4, len - 4); return 1; } diff --git a/src/cw/cw_in_wtp_descriptor.c b/src/cw/cw_in_wtp_descriptor.c index 9adafcae..f9966cd2 100644 --- a/src/cw/cw_in_wtp_descriptor.c +++ b/src/cw/cw_in_wtp_descriptor.c @@ -82,14 +82,14 @@ static int cw_read_wtp_descriptor_versions(mbag_t mbag, uint8_t * data, data + i, sublen); */ - mbag_set_vendorstr(mbag, + mbag_set_bstrv(mbag, CW_ITEM_WTP_HARDWARE_VERSION, vendor_id, data + i, sublen); break; case CW_SUBELEM_WTP_SOFTWARE_VERSION: - mbag_set_vendorstr(mbag, + mbag_set_bstrv(mbag, CW_ITEM_WTP_SOFTWARE_VERSION, vendor_id, data + i, sublen); /* @@ -104,7 +104,7 @@ static int cw_read_wtp_descriptor_versions(mbag_t mbag, uint8_t * data, break; case CW_SUBELEM_WTP_BOOTLOADER_VERSION: - mbag_set_vendorstr(mbag, + mbag_set_bstrv(mbag, CW_ITEM_WTP_BOOTLOADER_VERSION, vendor_id, data + i, sublen); diff --git a/src/cw/cw_out_generic.c b/src/cw/cw_out_generic.c index ed5ff3d9..bd14149a 100644 --- a/src/cw/cw_out_generic.c +++ b/src/cw/cw_out_generic.c @@ -33,8 +33,8 @@ int cw_put_item(uint8_t * dst, struct mbag_item *item) if (MBAG_VENDORSTR == item->type) { int l=0; - l+=cw_put_dword(dst, vendorstr_get_vendor_id(item->data)); - l+=cw_put_data(dst+4, vendorstr_data(item->data),vendorstr_len(item->data)); + l+=cw_put_dword(dst, bstrv_get_vendor_id(item->data)); + l+=cw_put_data(dst+4, bstrv_data(item->data),bstrv_len(item->data)); return l; } cw_log(LOG_ERR,"No method to put items of type %d",item->type); diff --git a/src/cw/cw_read_wtp_descriptor_versions.c b/src/cw/cw_read_wtp_descriptor_versions.c index 35372135..1b9c889b 100644 --- a/src/cw/cw_read_wtp_descriptor_versions.c +++ b/src/cw/cw_read_wtp_descriptor_versions.c @@ -45,20 +45,20 @@ int cw_read_wtp_descriptor_versions(mbag_t mbag, uint8_t * data, int len) switch (subtype) { case CW_SUBELEM_WTP_HARDWARE_VERSION: - mbag_set_vendorstr(mbag, + mbag_set_bstrv(mbag, CW_ITEM_WTP_HARDWARE_VERSION, vendor_id, data + i, sublen); break; case CW_SUBELEM_WTP_SOFTWARE_VERSION: - mbag_set_vendorstr(mbag, + mbag_set_bstrv(mbag, CW_ITEM_WTP_SOFTWARE_VERSION, vendor_id, data + i, sublen); break; case CW_SUBELEM_WTP_BOOTLOADER_VERSION: - mbag_set_vendorstr(mbag, + mbag_set_bstrv(mbag, CW_ITEM_WTP_BOOTLOADER_VERSION, vendor_id, data + i, sublen); diff --git a/src/cw/dbg.c b/src/cw/dbg.c index adc1e375..2804550f 100644 --- a/src/cw/dbg.c +++ b/src/cw/dbg.c @@ -529,14 +529,14 @@ int cw_format_item(char *dst,mbag_item_t * item) return 0; } -static int cw_format_version(char *s, vendorstr_t ver, char * def) +static int cw_format_version(char *s, bstrv_t ver, char * def) { if (!ver) return sprintf(s,"%s",def); - uint8_t * version = vendorstr_data(ver); - int len = vendorstr_len(ver); + uint8_t * version = bstrv_data(ver); + int len = bstrv_len(ver); @@ -567,14 +567,14 @@ static int cw_format_version(char *s, vendorstr_t ver, char * def) rs+=sprintf(s+rs,")"); } - uint32_t vendor = vendorstr_get_vendor_id(ver); + uint32_t vendor = bstrv_get_vendor_id(ver); rs+=sprintf(s+rs,", Vendor Id: %d, %s",vendor, cw_strvendor(vendor)); return rs; } -void cw_dbg_version_subelem(int level,const char*context,int subtype,vendorstr_t vstr) +void cw_dbg_version_subelem(int level,const char*context,int subtype,bstrv_t vstr) { if ( !cw_dbg_is_level(level)) return; diff --git a/src/cw/dbg.h b/src/cw/dbg.h index ae11ae5e..30d56a2d 100644 --- a/src/cw/dbg.h +++ b/src/cw/dbg.h @@ -180,7 +180,7 @@ extern void cw_dbg_elem_colored(int level, struct conn *conn, int msg, int msgel void cw_dbg_pkt(int level,struct conn *conn, uint8_t * packet, int len,struct sockaddr *from); void cw_dbg_msg(int level,struct conn *conn, uint8_t * packet, int len,struct sockaddr *from); char * cw_dbg_mkdmp(const uint8_t * data, int len); -void cw_dbg_version_subelem(int level,const char*context,int subtype,vendorstr_t vstr); +void cw_dbg_version_subelem(int level,const char*context,int subtype,bstrv_t vstr); /** diff --git a/src/cw/mbag.h b/src/cw/mbag.h index f2dac283..0f8d9f2e 100644 --- a/src/cw/mbag.h +++ b/src/cw/mbag.h @@ -104,7 +104,7 @@ extern const struct mbag_typedef mbag_type_dword; extern const struct mbag_typedef mbag_type_mbag; extern const struct mbag_typedef mbag_type_bstr; extern const struct mbag_typedef mbag_type_bstr16; -extern const struct mbag_typedef mbag_type_vendorstr; +extern const struct mbag_typedef mbag_type_bstrv; extern const struct mbag_typedef mbag_type_str; extern const struct mbag_typedef mbag_type_avltree; extern const struct mbag_typedef mbag_type_const_data; @@ -121,7 +121,7 @@ extern const struct mbag_typedef mbag_type_mbag_dyn; #define MBAG_MBAG_DYN (&mbag_type_mbag_dyn) #define MBAG_BSTR (&mbag_type_bstr) #define MBAG_BSTR16 (&mbag_type_bstr16) -#define MBAG_VENDORSTR (&mbag_type_vendorstr) +#define MBAG_VENDORSTR (&mbag_type_bstrv) #define MBAG_STR (&mbag_type_str) #define MBAG_DATA MBAG_STR #define MBAG_AVLTREE (&mbag_type_avltree) @@ -218,15 +218,15 @@ static inline int mbag_set_data(mbag_t s, const char *id, const struct mbag_type } -static inline vendorstr_t mbag_set_vendorstr(mbag_t s, const char *id, uint32_t vendor_id, - uint8_t * vendorstr, int len) +static inline bstrv_t mbag_set_bstrv(mbag_t s, const char *id, uint32_t vendor_id, + uint8_t * bstrv, int len) { mbag_item_t *i = mbag_item_create(s, id); if (!i) return NULL; i->type = MBAG_VENDORSTR; - i->data = vendorstr_create(vendor_id,vendorstr,len); + i->data = bstrv_create(vendor_id,bstrv,len); return i->data; } diff --git a/src/cw/mbag_type_vendorstr.c b/src/cw/mbag_type_vendorstr.c index 4c81fc56..2f86f334 100644 --- a/src/cw/mbag_type_vendorstr.c +++ b/src/cw/mbag_type_vendorstr.c @@ -18,7 +18,7 @@ /** *@file - *@brief Implementation of mbag_type vendorstr + *@brief Implementation of mbag_type bstrv *@addtogroup MbagFunctions *@{ */ @@ -33,14 +33,14 @@ static int to_str(void *item,char *dst) mbag_item_t *i= item; char *d=dst; - d+=sprintf(d,"%d,",vendorstr_get_vendor_id(i->data)); + d+=sprintf(d,"%d,",bstrv_get_vendor_id(i->data)); - if (cw_is_utf8(vendorstr_data(i->data), vendorstr_len(i->data))) { - d += sprintf(d, "%.*s", vendorstr_len(i->data), - vendorstr_data(i->data)); + if (cw_is_utf8(bstrv_data(i->data), bstrv_len(i->data))) { + d += sprintf(d, "%.*s", bstrv_len(i->data), + bstrv_data(i->data)); } else { d += sprintf(d, ".x"); - d += cw_format_hex(d, vendorstr_data(i->data), vendorstr_len(i->data)); + d += cw_format_hex(d, bstrv_data(i->data), bstrv_len(i->data)); } return d-dst; @@ -58,10 +58,10 @@ static struct mbag_item * from_str(const char *src) if (s){ - i->data=vendorstr_create_from_str(vendor_id,s+1); + i->data=bstrv_create_from_str(vendor_id,s+1); } else{ - i->data=vendorstr_create_from_str(vendor_id,""); + i->data=bstrv_create_from_str(vendor_id,""); } return i; @@ -70,9 +70,9 @@ static struct mbag_item * from_str(const char *src) /** * Defines the VendorStr type. * - * MBAG items of this type containing a variable of type #vendorstr_t. + * MBAG items of this type containing a variable of type #bstrv_t. */ -const struct mbag_typedef mbag_type_vendorstr = { +const struct mbag_typedef mbag_type_bstrv = { "VendorStr",free,to_str,from_str }; diff --git a/src/cw/vendorstr_create_from_str.c b/src/cw/vendorstr_create_from_str.c index 5877331a..e7d46fe3 100644 --- a/src/cw/vendorstr_create_from_str.c +++ b/src/cw/vendorstr_create_from_str.c @@ -2,20 +2,20 @@ #include "format.h" -uint8_t * vendorstr_create_from_str(uint32_t vendor_id,const char *s) +uint8_t * bstrv_create_from_str(uint32_t vendor_id,const char *s) { int l = strlen(s); if (s[0]!='.') - return vendorstr_create(vendor_id,(uint8_t*)s,l); + return bstrv_create(vendor_id,(uint8_t*)s,l); if (l<=2) - return vendorstr_create(vendor_id,(uint8_t*)s,l); + return bstrv_create(vendor_id,(uint8_t*)s,l); if (s[1]=='.') - return vendorstr_create(vendor_id,(uint8_t*)s+1,l-1); + return bstrv_create(vendor_id,(uint8_t*)s+1,l-1); if (s[1]!='x') - return vendorstr_create(vendor_id,(uint8_t*)s,l); + return bstrv_create(vendor_id,(uint8_t*)s,l); /* the string starts with ".x" - read hexbytes */ l-=2; @@ -24,13 +24,13 @@ uint8_t * vendorstr_create_from_str(uint32_t vendor_id,const char *s) msize++; - uint8_t * mem = malloc(vendorstr_size(msize)); + uint8_t * mem = malloc(bstrv_size(msize)); if(!mem) return NULL; - vendorstr_set_vendor_id(mem,vendor_id); - vendorstr_set_len(mem,msize); + bstrv_set_vendor_id(mem,vendor_id); + bstrv_set_len(mem,msize); - cw_format_scan_hex_bytes(vendorstr_data(mem),s+2,l); + cw_format_scan_hex_bytes(bstrv_data(mem),s+2,l); return mem; } diff --git a/src/mod/capwap/capwap_out_wtp_descriptor.c b/src/mod/capwap/capwap_out_wtp_descriptor.c index 84e3a9be..822a98ba 100644 --- a/src/mod/capwap/capwap_out_wtp_descriptor.c +++ b/src/mod/capwap/capwap_out_wtp_descriptor.c @@ -7,11 +7,6 @@ static int cw_put_encryption_subelems(uint8_t *dst,int capwap_mode) { - if (capwap_mode==CW_MODE_CISCO){ - cw_put_word(dst,0x01); - return 2; - } - int n=2; dst+=cw_put_byte(dst,n); @@ -28,7 +23,7 @@ static int cw_put_encryption_subelems(uint8_t *dst,int capwap_mode) -int cw_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t * dst) +int capwap_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t * dst) { mbag_t mbag = conn->config; diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index 6fd0cd9c..60b842cc 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -172,6 +172,10 @@ conn->config=mbag_create(); mbag_set_mbag(conn->config, CW_ITEM_WTP_BOARD_DATA, board_data); +// hw = vendorstr_create(conf_vendor_id,conf_hardware_version + //mbag_set_bstr16(conn->config, CW_ITEM_WTP_HARDWARE_VERSION,conf_hardware_version); + //mbag_set_bstr16(conn->config, CW_ITEM_WTP_SOFTWARE_VERSION,conf_software_version); + printf("Board_data %p\n",board_data); mbag_t mb = mbag_get_mbag(conn->config,CW_ITEM_WTP_BOARD_DATA,NULL);