diff --git a/src/capwap/capwap_actions.h b/src/capwap/capwap_actions.h index 060ba44d..c2a30d3e 100644 --- a/src/capwap/capwap_actions.h +++ b/src/capwap/capwap_actions.h @@ -174,6 +174,22 @@ 0, /* ID to use store */ \ 4, 4 /* min/max length */ +#define CW_ACTION_IN_RADIO_ADMINISTRATIVE_STATE_WTP \ + CW_ELEM_RADIO_ADMINISTRATIVE_STATE, /* Element ID*/ \ + cw_in_radio_administrative_state_wtp, 0, /* start/end callback */ \ + MBAG_DWORD, /* Type of element */ \ + 0, /* ID to use store */ \ + 4, 4 /* min/max length */ + + + + +#define CW_ACTION_IN_MAXIMUM_MESSAGE_LENGTH \ + CW_ELEM_MAXIMUM_MESSAGE_LENGTH, /* Element ID*/ \ + cw_in_generic, 0, /* start/end callback */ \ + MBAG_WORD, /* Type of element */ \ + CW_ITEM_MAXIMUM_MESSAGE_LENGTH /* ID to use store */ \ + 2, 2 /* min/max length */ diff --git a/src/capwap/capwap_actions_wtp.c b/src/capwap/capwap_actions_wtp.c index 83c99f8e..d0c5308f 100644 --- a/src/capwap/capwap_actions_wtp.c +++ b/src/capwap/capwap_actions_wtp.c @@ -68,6 +68,11 @@ cw_action_in_t capwap_actions_wtp_in[] = { 0, cw_in_check_join_resp } , + /* Result Code */ + {0, 0, CW_STATE_JOIN, CW_MSG_JOIN_RESPONSE, + CW_ACTION_IN_RESULT_CODE, 1} + , + /* AC Descriptor */ {0, 0, CW_STATE_JOIN, CW_MSG_JOIN_RESPONSE, CW_ACTION_IN_AC_DESCRIPTOR, 1} @@ -78,13 +83,14 @@ cw_action_in_t capwap_actions_wtp_in[] = { CW_ACTION_IN_AC_NAME, 1} , - /* Vendor Specific */ + + /* CAPWAP Control IPv4 Address */ {0, 0, CW_STATE_JOIN, CW_MSG_JOIN_RESPONSE, - CW_ACTION_IN_RESULT_CODE, 1} + CW_ACTION_IN_CAPWAP_CONTROL_IPV4_ADDRESS, 1} , - + /* ------------------------------------------------------------------------------- */ @@ -102,7 +108,7 @@ cw_action_in_t capwap_actions_wtp_in[] = { /* ------------------------------------------------------------------------------- */ - /* Message Image Data Request */ + /* Message Image Data Request IN */ {0, 0, CW_STATE_IMAGE_DATA, CW_MSG_IMAGE_DATA_REQUEST, 0, 0, cw_in_check_img_data_req_wtp } , @@ -133,13 +139,12 @@ cw_action_in_t capwap_actions_wtp_in[] = { /* ------------------------------------------------------------------------------- */ - /* Message Change State Response IN */ {0, 0, CW_STATE_CONFIGURE, CW_MSG_CHANGE_STATE_EVENT_RESPONSE, 0, - 0,0 } + 0, cw_in_check_cfg_update_req } , - + /* ------------------------------------------------------------------------------- */ /* Message Configuration Update Request IN */ {0, 0, CW_STATE_RUN, CW_MSG_CONFIGURATION_UPDATE_REQUEST, 0, 0,0 } @@ -151,7 +156,7 @@ cw_action_in_t capwap_actions_wtp_in[] = { {0, 0, CW_STATE_RUN, CW_MSG_CONFIGURATION_UPDATE_REQUEST, - CW_ACTION_IN_RADIO_ADMINISTRATIVE_STATE, 0} + CW_ACTION_IN_RADIO_ADMINISTRATIVE_STATE_WTP, 0} , @@ -163,6 +168,7 @@ cw_action_in_t capwap_actions_wtp_in[] = { + /* ------------------------------------------------------------------------------- */ /* Echo Response Response IN */ {0, 0, CW_STATE_RUN, CW_MSG_ECHO_RESPONSE, 0, 0,0 } @@ -316,6 +322,11 @@ cw_action_out_t capwap_actions_wtp_out[] = { {CW_MSG_CHANGE_STATE_EVENT_REQUEST, CW_ITEM_NONE} , + /* Radio Ooerational State */ + {CW_MSG_CHANGE_STATE_EVENT_REQUEST, CW_ITEM_RADIO_OPER_STATE, 0, + 0, NULL, cw_out_radio_operational_states, cw_out_get_config,1} + , + /* ------------------------------------------------------------------------------- @@ -325,10 +336,16 @@ cw_action_out_t capwap_actions_wtp_out[] = { , /* ------------------------------------------------------------------------------- - * Echo Request Request OUT + * Configuration Update Response */ {CW_MSG_CONFIGURATION_UPDATE_RESPONSE, CW_ITEM_NONE} , + + /* Radio Oper State */ + {CW_MSG_CONFIGURATION_UPDATE_RESPONSE, CW_ITEM_RADIO_OPER_STATE, 0, + 0, NULL, cw_out_radio_operational_states, cw_out_get_config,1} + , + {0, 0} diff --git a/src/capwap/capwap_cisco.h b/src/capwap/capwap_cisco.h index a199e483..958bc8e0 100644 --- a/src/capwap/capwap_cisco.h +++ b/src/capwap/capwap_cisco.h @@ -46,6 +46,8 @@ #define CW_CISCO_DIRECT_SEQUENCE_CONTROL LW_ELEM_DIRECT_SEQUENCE_CONTROL /* 14 */ #define CW_CISCO_SUPPORTED_RATES LW_ELEM_80211_RATE_SET /* 16 */ +#define CW_CISCO_80211_DELETE_WLAN LW_ELEM_80211_DELETE_WLAN /* 28 */ + #define CW_CISCO_MWAR_NAME LW_ELEM_AC_NAME /* 31 */ #define CW_CISCO_LOCATION_DATA LW_ELEM_LOCATION_DATA /* 35 */ @@ -61,6 +63,8 @@ #define CW_CISCO_AP_STATIC_IP_ADDR 83 +#define CW_CISCO_SIG_PAYLOAD 84 +#define CW_CISCO_SIG_TOGGLE 87 #define CW_CISCO_AC_NAME_WITH_INDEX 91 #define CW_CISCO_SPAM_DOMAIN_SECRET 96 @@ -212,41 +216,13 @@ int cw_out_cisco_wtp_radio_cfg(struct conn *conn, struct cw_action_out *a, uint8 int cw_in_cisco_radio_administrative_state(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, struct sockaddr *from); +int cw_in_cisco_radio_administrative_state_wtp(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, + struct sockaddr *from); -/* -#define cw_addelem_cisco_rad(dst,acinfo)\ - lw_put_ac_descriptor(dst+10,acinfo) - cw_put_elem_vedor_hdr(dst,CW_VENDOR_ID_CISCO,CW_CISCO_RAD, -*/ +int cw_in_cisco_radio_cfg(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, + struct sockaddr *from); -/* cwmsg methods */ - -/* -#define cwmsg_addelem_cisco_ap_timesync(cwmsg,time,type)\ - (cwmsg)->pos+=cw_addelem_cisco_ap_timesync(((cwmsg)->msgelems+(cwmsg)->pos),time,type) - -#define cwmsg_addelem_cisco_rad_name(cwmsg,name)\ - (cwmsg)->pos+=cw_addelem_cisco_rad_name(((cwmsg)->msgelems+(cwmsg)->pos),(name)) - -#define cwmsg_addelem_cisco_ap_grpoup_name(cwmsg,name)\ - (cwmsg)->pos+=cw_addelem_ap_group_name(((cwmsg)->msgelems+(cwmsg)->pos),(name)) - -#define cwmsg_addelem_cisco_mwar(cwmsg,acinfo)\ - (cwmsg)->pos+=cw_addelem_cisco_mwar(((cwmsg)->msgelems+(cwmsg)->pos),(acinfo)) - -#define cwmsg_addelem_cisco_certificate(cwmsg,crt,len)\ - (cwmsg)->pos+=cw_addelem_cisco_certificate(((cwmsg)->msgelems+(cwmsg)->pos),crt,len) - -#define cwmsg_addelem_cisco_ap_regulatory_domain(cwmsg,radioinfo)\ - (cwmsg)->pos+=cw_addelem_cisco_ap_regulatory_domain(((cwmsg)->msgelems+(cwmsg)->pos),radioinfo) - -#define cwmsg_addelem_cisco_wtp_radio_cfg(cwmsg,radioinfo)\ - (cwmsg)->pos+=cw_addelem_cisco_wtp_radio_cfg(((cwmsg)->msgelems+(cwmsg)->pos),radioinfo) - -*/ - - #endif diff --git a/src/capwap/capwap_items.h b/src/capwap/capwap_items.h index 3e5c0e5e..06a4a454 100644 --- a/src/capwap/capwap_items.h +++ b/src/capwap/capwap_items.h @@ -51,7 +51,7 @@ enum capwap_items { CW_ITEM_AC_HASH_VALUE, CW_ITEM_AC_NAME_WITH_PRIORITY, - + CW_ITEM_MAXIMUM_MESSAGE_LENGTH, /* CIPWAP and Cisco */ @@ -70,7 +70,9 @@ enum capwap_items { CW_ITEM_AP_MODE_AND_TYPE, CW_ITEM_CISCO_BOARD_DATA_OPTIONS, - CW_ITEM_RADIOS + CW_ITEM_RADIOS, + CW_ITEM_RADIO_OPER_STATE, + }; diff --git a/src/capwap/cipwap_actions.h b/src/capwap/cipwap_actions.h index 6cd02d40..a7e515b2 100644 --- a/src/capwap/cipwap_actions.h +++ b/src/capwap/cipwap_actions.h @@ -17,3 +17,20 @@ 4, 4 /* min/max length */ +#define CW_ACTION_IN_CISCO_RADIO_ADMINISTRATIVE_STATE_WTP \ + CW_ELEM_RADIO_ADMINISTRATIVE_STATE, /* Element ID*/ \ + cw_in_cisco_radio_administrative_state_wtp, 0, /* start/end callback */ \ + MBAG_DWORD, /* Type of element */ \ + 0, /* ID to use store */ \ + 4, 4 /* min/max length */ + + + +#define CW_ACTION_IN_CISCO_RADIO_CFG\ + CW_CISCO_WTP_RADIO_CFG, /* Element ID*/ \ + cw_in_cisco_radio_cfg, 0, /* start/end callback */ \ + NULL, /* Type of element */ \ + 0, /* ID to use store */ \ + 0, 1114 /* min/max length */ + + diff --git a/src/capwap/cipwap_actions_wtp.c b/src/capwap/cipwap_actions_wtp.c index c508453a..08de6b9d 100644 --- a/src/capwap/cipwap_actions_wtp.c +++ b/src/capwap/cipwap_actions_wtp.c @@ -45,14 +45,16 @@ cw_action_in_t cipwap_actions_wtp_in[] = { cw_in_ac_name_with_priority, 0, MBAG_BSTR16,CW_ITEM_AC_NAME_WITH_PRIORITY,0,512} , - + /* AP Mode an Type */ {CW_VENDOR_ID_CISCO, 0, CW_STATE_RUN, CW_MSG_CONFIGURATION_UPDATE_REQUEST, CW_ACTION_IN_CISCO_AP_MODE_AND_TYPE, 1} , + /* Radio Administrative State */ + /* Oveload CAPWAP action to handle a radio ID of 255 */ {0, 0, CW_STATE_RUN, CW_MSG_CONFIGURATION_UPDATE_REQUEST, - CW_ACTION_IN_CISCO_RADIO_ADMINISTRATIVE_STATE, 0} + CW_ACTION_IN_CISCO_RADIO_ADMINISTRATIVE_STATE_WTP, 0} , @@ -67,7 +69,11 @@ cw_action_in_t cipwap_actions_wtp_in[] = { * Configuration Status Response IN */ {0, 0, CW_STATE_CONFIGURE, CW_MSG_CONFIGURATION_STATUS_RESPONSE, - CW_ACTION_IN_RADIO_ADMINISTRATIVE_STATE, 0} + CW_ACTION_IN_RADIO_ADMINISTRATIVE_STATE_WTP, 0} + , + + {CW_VENDOR_ID_CISCO, 0, CW_STATE_CONFIGURE, CW_MSG_CONFIGURATION_STATUS_RESPONSE, + CW_ACTION_IN_CISCO_RADIO_CFG, 0} , diff --git a/src/capwap/cisco.c b/src/capwap/cisco.c index 5ca2b579..8292297c 100644 --- a/src/capwap/cisco.c +++ b/src/capwap/cisco.c @@ -4,6 +4,7 @@ #include "mbag.h" #include "radio.h" #include "log.h" +#include "dbg.h" int cw_put_cisco_wtp_radio_cfg(uint8_t *dst, int rid, mbag_t radio) { @@ -112,3 +113,59 @@ int cw_out_cisco_wtp_radio_cfg(struct conn *conn, struct cw_action_out *a, uint8 // return l+cw_out_cisco_wtp_radio_cfg_(conn,a,dst+l,1); } + + + + + +int cw_in_cisco_radio_cfg(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, + struct sockaddr *from) +{ + + int rid = cw_get_byte(data); + mbag_t radio = mbag_get_mbag(conn->radios,rid,NULL); + if ( !radio){ + cw_dbg(DBG_ELEM_ERR,"Radio ID %d not defined",rid); + return 0; + } + + +// printf("Here we are %d\n",rid); + return 0; +} + + +int cw_radio_cisco_set_state(struct conn * conn, uint8_t *data, int len, int cause) +{ + + int rid = cw_get_byte(data); + int state = cw_get_byte(data+1); + if (rid != 255) + return cw_radio_set_admin_state(conn->radios,rid,state,cause); + + + MAVLITER_DEFINE(it,conn->radios); + mavliter_foreach(&it){ + mbag_item_t *i = mavliter_get(&it); + cw_radio_set_admin_state(conn->radios,i->id,state,cause); + + } + return 1; + +} + + +int cw_in_cisco_radio_administrative_state(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, + struct sockaddr *from) +{ + return cw_radio_cisco_set_state(conn,data,len,-1); +} + + +int cw_in_cisco_radio_administrative_state_wtp(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, + struct sockaddr *from) +{ + return cw_radio_cisco_set_state(conn,data,len,3); +} + + diff --git a/src/capwap/cw_cisco_id_to_str.c b/src/capwap/cw_cisco_id_to_str.c index 02c8b462..a4edbff2 100644 --- a/src/capwap/cw_cisco_id_to_str.c +++ b/src/capwap/cw_cisco_id_to_str.c @@ -114,6 +114,12 @@ const char * cw_cisco_id_to_str(int elem_id) return "AP Retransmit Param"; case CW_CISCO_AP_VENUE_SETTINGS: return "AP Venue Settings"; + case CW_CISCO_80211_DELETE_WLAN: + return "Delete WLAN"; + case CW_CISCO_SIG_PAYLOAD: + return "Signature Payload"; + case CW_CISCO_SIG_TOGGLE: + return "Signature Toggle"; default: return "Unknown"; diff --git a/src/capwap/cw_in_check_cfg_upate_req.c b/src/capwap/cw_in_check_cfg_upate_req.c deleted file mode 100644 index dee0089f..00000000 --- a/src/capwap/cw_in_check_cfg_upate_req.c +++ /dev/null @@ -1,30 +0,0 @@ - -#include "capwap.h" -#include "intavltree.h" -#include "dbg.h" -#include "log.h" -#include "capwap_items.h" - -int cw_in_check_cfg_update_req(struct conn *conn, struct cw_action_in *a, uint8_t * data, - int len,struct sockaddr *from) -{ - - cw_action_in_t * mlist[60]; - - /* Check for mandatory elements */ - int n = cw_check_missing_mand(mlist,conn,a); - if (n) { - if ( conn->strict_capwap ){ - cw_dbg_missing_mand(DBG_MSG_ERR,conn,mlist,n,a); - conn->capwap_state=CW_STATE_JOIN; - return CW_RESULT_MISSING_MAND_ELEM; - } - cw_dbg_missing_mand(DBG_RFC,conn,mlist,n,a); - } - - - /* set result code to ok and change to configure state */ - mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0); - - return 0; -} diff --git a/src/capwap/cw_in_generic.c b/src/capwap/cw_in_generic.c index 2acc2aab..cf2cacbf 100644 --- a/src/capwap/cw_in_generic.c +++ b/src/capwap/cw_in_generic.c @@ -97,7 +97,6 @@ int cw_in_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data, int } - int cw_in_radio_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, struct sockaddr *from) { diff --git a/src/capwap/cw_in_radio_administrative_state.c b/src/capwap/cw_in_radio_administrative_state.c index eac9bbf5..8c4c8b30 100644 --- a/src/capwap/cw_in_radio_administrative_state.c +++ b/src/capwap/cw_in_radio_administrative_state.c @@ -4,6 +4,37 @@ #include "log.h" #include "mbag.h" #include "capwap.h" +#include "radio.h" + + +int cw_radio_set_admin_state(mbag_t radios,int rid, int state, int cause) +{ + mbag_t radio = mbag_get_mbag(radios,rid,NULL); + if (!radio) { + cw_dbg(DBG_ELEM_ERR,"Can't set radio administrative state for radio %d - radio does't exists",rid); + return 0; + } + mbag_set_byte(radio,CW_RADIO_ADMIN_STATE,state); + + if (cause < 0) + return 1; + + + /* Set operational state for next config update response. */ + + mbag_set_word(radio,CW_RADIO_OPER_STATE, (state<<8) | 3); + + return 1; +} + + +int cw_in_radio_administrative_state(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, + struct sockaddr *from) +{ + int rid = cw_get_byte(data); + int state = cw_get_byte(data+1); + return cw_radio_set_admin_state(conn->radios,rid,state,-1); +} diff --git a/src/capwap/cw_out_generic.c b/src/capwap/cw_out_generic.c index 6be9d78c..b04cafc3 100644 --- a/src/capwap/cw_out_generic.c +++ b/src/capwap/cw_out_generic.c @@ -91,3 +91,7 @@ int cw_out_generic(struct conn *conn, struct cw_action_out *a, uint8_t * dst) // return len + cw_put_elem_hdr(dst, a->elem_id, len); } + + + + diff --git a/src/capwap/cw_out_radio_info.c b/src/capwap/cw_out_radio_info.c index 9ee91826..265b822e 100644 --- a/src/capwap/cw_out_radio_info.c +++ b/src/capwap/cw_out_radio_info.c @@ -60,43 +60,4 @@ int cw_out_radio_administrative_states(struct conn *conn, struct cw_action_out * -static int set_radio_admin_state(mbag_t radios,int rid,int state) -{ - mbag_t radio = mbag_get_mbag(radios,rid,NULL); - if (!radio){ - cw_dbg(DBG_ELEM_ERR,"Can't set radio administrative state for radio %d - radio does't exists",rid); - return 0; - } - - mbag_set_byte(radio,CW_RADIO_ADMIN_STATE,state); - - return 1; -} - -int cw_in_radio_administrative_state(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, - struct sockaddr *from) -{ - int rid = cw_get_byte(data); - int state = cw_get_byte(data+1); - return set_radio_admin_state(conn->radios,rid,state); -} - - -int cw_in_cisco_radio_administrative_state(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, - struct sockaddr *from) -{ - - int rid = cw_get_byte(data); - int state = cw_get_byte(data+1); - if (rid != 255) - return set_radio_admin_state(conn->radios,rid,state); - - - MAVLITER_DEFINE(it,conn->radios); - mavliter_foreach(&it){ - mbag_item_t *i = mavliter_get(&it); - mbag_set_byte(i->data,CW_RADIO_ADMIN_STATE,state); - } - return 1; -} diff --git a/src/capwap/lwapp.h b/src/capwap/lwapp.h index a9933b8c..bcf8fd09 100644 --- a/src/capwap/lwapp.h +++ b/src/capwap/lwapp.h @@ -134,6 +134,8 @@ #define LW_ELEM_TX_POWER_LEVELS 13 #define LW_ELEM_DIRECT_SEQUENCE_CONTROL 14 +#define LW_ELEM_80211_DELETE_WLAN 28 + #define LW_ELEM_AC_NAME 31 #define LW_ELEM_LOCATION_DATA 35 #define LW_ELEM_STATISTICS_TIMER 37 diff --git a/src/capwap/radio.h b/src/capwap/radio.h index 12fc631f..fab0bd7a 100644 --- a/src/capwap/radio.h +++ b/src/capwap/radio.h @@ -5,6 +5,7 @@ enum radiodata{ CW_RADIO_ADMIN_STATE=10000, + CW_RADIO_OPER_STATE, CW_RADIO_TYPE, CW_RADIO_REG_DOMAIN, CW_RADIO_BSSID, diff --git a/src/wtp/cfg.c b/src/wtp/cfg.c index 9b9a65c3..e2db6ef9 100644 --- a/src/wtp/cfg.c +++ b/src/wtp/cfg.c @@ -29,6 +29,7 @@ int cfg_json_put_ac_ip_list(char *dst, const char *name, mbag_item_t * i, int n) int cfg_json_put_acobj(char *dst, const char *name, mbag_item_t * i, int n); int cfg_json_put_byte(char *dst, const char *name, mbag_item_t * i, int n); int cfg_json_put_radios(char *dst, const char *name, mbag_item_t * i, int n); +int cfg_json_put_bstr(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); @@ -48,6 +49,7 @@ int cfg_json_get_word(struct mbag_itemdef *idef, char *js, jsmntok_t * t, mbag_t int cfg_json_get_byte(struct mbag_itemdef *idef, char *js, jsmntok_t * t, mbag_t mbag); int cfg_json_get_ac_name_with_priority(struct mbag_itemdef *idef, char *js, jsmntok_t * t, mbag_t mbag); +int cfg_json_get_bstr(struct mbag_itemdef *idef, char *js, jsmntok_t * t, mbag_t mbag); @@ -244,6 +246,33 @@ int cfg_json_get_vendorstr(struct mbag_itemdef *idef, char *js, jsmntok_t * t, } +int cfg_json_get_bstr(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; + bstr16_t b16 = bstr16cfgstr(js + t->start); + + /* this is a dirty hack. It should be removed + when we have a bstrcfgstr function */ + + bstr_t b=bstr_create(bstr16_data(b16),bstr_len(b16)); + free(b16); + + mbag_set_bstr(mbag, item_id, b); + return 0; +} + + + + int cfg_json_get_bstr16(struct mbag_itemdef *idef, char *js, jsmntok_t * t, mbag_t mbag) { @@ -409,6 +438,7 @@ struct mbag_itemdef general_cfg[] = { cfg_json_put_bstr16}, + /* {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}, @@ -432,6 +462,8 @@ struct mbag_itemdef board_data_cfg[] = { struct mbag_itemdef radio_cfg[] = { {CW_RADIO_ADMIN_STATE, "admin_state", cfg_json_get_byte, cfg_json_put_byte}, {CW_RADIO_TYPE, "radio_type", cfg_json_get_dword, cfg_json_put_dword}, +/* {CW_RADIO_OPER_STATE,"oper_state", cfg_json_get_word,cfg_json_put_word},*/ + {CW_RADIO_BSSID,"bssid", cfg_json_get_bstr,cfg_json_put_bstr}, {0,0,0} @@ -451,6 +483,32 @@ struct mbag_itemdef *get_idef_by_id(struct mbag_itemdef *cfg, uint32_t id) +/* This is almost a copy of the bstr16 function. + Maybe it could be combined to shorten the code. */ +int cfg_json_put_bstr(char *dst, const char *name, mbag_item_t * i, int n) +{ + if (i->type != MBAG_BSTR) { + return 0; + } + + char *d = dst; + memset(d, '\t', n); + d += n; + d += sprintf(d, "\"%s\":", name); + + int utf8 = cw_is_utf8(bstr_data(i->data), bstr_len(i->data)); + if (utf8) { + d += sprintf(d, "\"%.*s\"", bstr_len(i->data), bstr_data(i->data)); + } else { + d += sprintf(d, "\".x"); + d += cw_format_hex(d, bstr_data(i->data), bstr_len(i->data)); + d += sprintf(d, "\""); + } + return d - dst; +} + + + diff --git a/src/wtp/cfg.json b/src/wtp/cfg.json index 0286aa61..f366bd5b 100644 --- a/src/wtp/cfg.json +++ b/src/wtp/cfg.json @@ -27,12 +27,14 @@ "wtp_board_data_options":".x00010000", "radios":{ "0":{ - "admin_state":"2", - "radio_type":"1" + "admin_state":"1", + "radio_type":"1", + "bssid":".x123456789abc" }, "1":{ - "admin_state":"2", - "radio_type":"2" + "admin_state":"1", + "radio_type":"2", + "bssid":".xaabbccddeeff" } }, "bssid":""