diff --git a/src/ac/Makefile b/src/ac/Makefile index e714b066..5700e142 100644 --- a/src/ac/Makefile +++ b/src/ac/Makefile @@ -15,9 +15,9 @@ CFLAGS += -Wall -g -O0 -D_REENTRANT -DIPV6 -I/usr/local/include -I../ -DSYS_ARCH LIBS+=-lcapwap +LIBS+=-lcipwap LIBS+=-lcisco LIBS+=-lfortinet -LIBS+=-lcipwap LIBS+=-lcapwap80211 LIBS+=-lcw LIBS+=-lrt diff --git a/src/ac/ac_global.c b/src/ac/ac_global.c index 48c54823..68b443a1 100644 --- a/src/ac/ac_global.c +++ b/src/ac/ac_global.c @@ -8,6 +8,9 @@ #include "cw/aciplist.h" #include "socklist.h" #include "cw/sock.h" +#include "cw/dbg.h" + +#include "wtpman.h" struct cw_ac_status ac_status; @@ -78,8 +81,33 @@ void release_iplist(void *arg,void *data) { } + + +/* +int handle_echo_req(struct conn *conn, struct cw_action_in *a, uint8_t * data, + int len, struct sockaddr *from) +{ + cw_dbg(DBG_X,"Handle Echo Request %p",conn->data); +// struct wtpman * wtpman = conn->data; +// wtpman_echo_req(wtpman); + return 0; +} + +*/ + +/*static void setup_actions (struct mod_ac *c, struct mod_ac *b, struct cw_actiondef *actions) +{ + cw_dbg(DBG_X,"Setup Actions! Yea"); + cw_set_msg_end_callback(actions,CW_STATE_RUN,CW_MSG_ECHO_REQUEST,handle_echo_req); +} +*/ + int ac_global_init() { +// mod_set_actions_registered_cb(setup_actions); + + + ac_config = mbag_create(); mbag_set_str(ac_config, CW_ITEM_AC_NAME, conf_acname); mbag_set_ptr(ac_config, CW_ITEM_AC_STATUS, &ac_status); diff --git a/src/ac/db.c b/src/ac/db.c index 378fa569..1a403cda 100644 --- a/src/ac/db.c +++ b/src/ac/db.c @@ -6,6 +6,7 @@ #include "cw/capwap_items.h" #include "cw/conn.h" #include "cw/item.h" +#include "cw/mbag.h" #include "conf.h" @@ -88,6 +89,8 @@ static sqlite3_stmt * put_wtp_prop_stmt; static sqlite3_stmt * get_tasks_stmt; +static sqlite3_stmt * stmt_get_radio_tasks; + static sqlite3_stmt * stmt_ping_wtp; static sqlite3_stmt * stmt_put_radio_prop; @@ -145,6 +148,11 @@ int db_start() goto errX; + sql = "SELECT wtpid,rid,key,sub_key,val FROM radios WHERE upd>0 AND wtpid=?"; + rc = sqlite3_prepare_v2(handle, sql,-1, &stmt_get_radio_tasks,0); + if (rc) + goto errX; + return 1; @@ -315,10 +323,6 @@ mavl_conststr_t db_get_update_tasks(struct conn * conn,const char * wtpid) if(sqlite3_bind_text(get_tasks_stmt,1,wtpid,-1,SQLITE_STATIC)) goto errX; - - - - //rc = sqlite3_step(get_tasks_stmt); while (SQLITE_ROW == sqlite3_step(get_tasks_stmt)) { int ii; @@ -332,7 +336,6 @@ mavl_conststr_t db_get_update_tasks(struct conn * conn,const char * wtpid) const char *id = (const char*)sqlite3_column_text(get_tasks_stmt,1); if (!id) { - //DBGX("::::::::::::::::::::::::::::::::::::::::::::::::::::NULL ID!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",""); continue; } @@ -366,7 +369,6 @@ mavl_conststr_t db_get_update_tasks(struct conn * conn,const char * wtpid) if (r->count) return r; - mavl_destroy(r); return NULL; @@ -388,4 +390,96 @@ errX: +mavl_conststr_t db_get_radio_tasks(struct conn * conn,const char * wtpid) +{ + +//cw_dbg(DBG_X,"Get Radio Tasks for %s",wtpid); + + sqlite3_reset(stmt_get_radio_tasks); + sqlite3_clear_bindings(stmt_get_radio_tasks); + + mavl_conststr_t r = mavl_create_conststr(); + if (!r) + return NULL; + + + int rc=0; + + + if(sqlite3_bind_text(stmt_get_radio_tasks,1,wtpid,-1,SQLITE_STATIC)) + goto errX; + + while (SQLITE_ROW == sqlite3_step(stmt_get_radio_tasks)) { + + int ii; + //DBGX("-----------------------------------------------------",""); + for (ii=0; ii<6; ii++){ + + DBGX("CVALL: %s",(const char*)sqlite3_column_text(stmt_get_radio_tasks,ii)); + + + } + const char *strrid= (const char*)sqlite3_column_text(stmt_get_radio_tasks,1); + + const char *id = (const char*)sqlite3_column_text(stmt_get_radio_tasks,2); + if (!id) { + continue; + } + + const char *sub_id = (const char*)sqlite3_column_text(stmt_get_radio_tasks,3); + + const char *val = (const char*)sqlite3_column_text(stmt_get_radio_tasks,4); + + //DBGX("ID: (%s), SubID (%s), Val (%s)",id,sub_id,val); + + const struct cw_itemdef * cwi = cw_itemdef_get(conn->actions->radioitems,id,sub_id); + if (!cwi) { + DBGX("No item definition found for: %s/%s",id,sub_id); + continue; + } + + + if (!cwi->type->from_str) { + cw_log(LOG_ERR,"Can't convert from string %s/%s - No method defined.",id,sub_id); + continue; + } + + + mbag_item_t * i = cwi->type->from_str(val); + i->id=cwi->id; + + int rid = atoi(strrid); + cw_dbg(DBG_X,"RID: %d",rid); + + + mbag_t radio = mbag_i_get_mbag_c(conn->radios_upd,rid,mbag_create); + mbag_set(radio,i); + + + //mbag_set(conn->outgoing,i); + + mavl_add(r,(void*)cwi->id); + } + + if (r->count) + return r; + + mavl_destroy(r); + return NULL; + + +errX: + if (rc) { + cw_log(LOG_ERR,"Can't get tasks: %d - %s", + rc,sqlite3_errmsg(handle)); + } + + if (r) + mavl_destroy(r); + + + return NULL; + +} + diff --git a/src/ac/db.h b/src/ac/db.h index a93d67b1..60b21f72 100644 --- a/src/ac/db.h +++ b/src/ac/db.h @@ -13,6 +13,7 @@ void db_put_wtp_prop(const char *wtp_id,const char * id,const char *sub_id,const mavl_conststr_t db_get_update_tasks(struct conn * conn,const char * wtpid); void db_put_radio_prop(const char *wtp_id,const char *rid, const char * key,const char *sub_key,const char * val); +extern mavl_conststr_t db_get_radio_tasks(struct conn * conn,const char * wtpid); #endif diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index 59b9bb7f..aa082c9d 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -317,7 +317,7 @@ void radio_to_sql(struct conn *conn, char *wtp_id, int rid, mbag_t radio) mbag_item_t *i = mavliter_get(&it); const struct cw_itemdef *cwi = - cw_itemdef_get(conn->actions->items, i->id, NULL); + cw_itemdef_get(conn->actions->radioitems, i->id, NULL); if (cwi) { char str[4096]; if (i->type->to_str) { @@ -376,11 +376,11 @@ void wtpman_run_data(void *wtpman_arg) uint8_t data[1001]; memset(data, 0, 1000); - cw_log(LOG_ERR, "I am the data thread\n"); + cw_log(LOG_ERR, "I am the data thread**********************************************************************\n"); while (1) { sleep(5); conn->write_data(conn, data, 100); - cw_log(LOG_ERR, "O was the data thread\n"); + cw_log(LOG_ERR, "O was the data thread***********************************************************\n"); } @@ -489,24 +489,50 @@ static void wtpman_run(void *arg) mavl_del_all(conn->outgoing); - mavl_conststr_t r = db_get_update_tasks(conn, sock_addr2str(&conn->addr)); + mavl_conststr_t r; + r = db_get_update_tasks(conn, sock_addr2str(&conn->addr)); + if (r) { + + if (!conn->outgoing->count) + continue; + + cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr)); + + rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST); + mavl_merge(conn->config, conn->outgoing); + mavl_destroy(conn->outgoing); + conn->outgoing = mbag_create(); + config_to_sql(conn); + radios_to_sql(conn); + mavl_destroy(r); + } + + r = db_get_radio_tasks(conn, sock_addr2str(&conn->addr)); + if (r) { + + if (!conn->radios_upd->count) + continue; + + cw_dbg(DBG_INFO, "Updating Radios for %s",sock_addr2str(&conn->addr)); + rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST); + mavl_destroy(conn->radios_upd); + conn->radios_upd=mbag_i_create(); - if (!r) - continue; + radios_to_sql(conn); - if (!conn->outgoing->count) - continue; + /* + rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST); + mavl_merge(conn->config, conn->outgoing); + mavl_destroy(conn->outgoing); + conn->outgoing = mbag_create(); + config_to_sql(conn); + radios_to_sql(conn); + mavl_destroy(r); + */ + } - cw_dbg(DBG_INFO, "Updating WTP %s",sock_addr2str(&conn->addr)); - rc = cw_send_request(conn, CW_MSG_CONFIGURATION_UPDATE_REQUEST); - mavl_merge(conn->config, conn->outgoing); - mavl_destroy(conn->outgoing); - conn->outgoing = mbag_create(); - config_to_sql(conn); - radios_to_sql(conn); - mavl_destroy(r); } @@ -609,6 +635,7 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr) wtpman->conn->strict_capwap = conf_strict_capwap; wtpman->conn->strict_hdr = conf_strict_headers; wtpman->conn->radios = mbag_i_create(); + wtpman->conn->radios_upd = mbag_i_create(); wtpman->conn->local = ac_config; //wtpman->conn->capwap_mode=0; //CW_MODE_STD; //CISCO; wtpman->conn->capwap_mode = CW_MODE_CISCO; diff --git a/src/cw/capwap.h b/src/cw/capwap.h index fe25c456..332a1d48 100644 --- a/src/cw/capwap.h +++ b/src/cw/capwap.h @@ -514,6 +514,10 @@ enum cw_reboot_failure_types { +#define CW_RADIO_ADMIN_STATE_DISABLED 1 +#define CW_RADIO_ADMIN_STATE_ENABLED 2 + + extern void cw_read_image_data_request(struct cwimage_data *, uint8_t * msg, int len); //extern int cw_readelem_ac_descriptor(struct ac_info *acinfo, int type, uint8_t * msgelem, diff --git a/src/cw/capwap80211_items.c b/src/cw/capwap80211_items.c index 12e17329..6f22402f 100644 --- a/src/cw/capwap80211_items.c +++ b/src/cw/capwap80211_items.c @@ -4,16 +4,25 @@ -const char CW_ITEM80211_SUPPORTED_RATES[]="802.11 supported_rates"; -const char CW_ITEM80211_WTP_RADIO_INFORMATION[]="802.11 radio_info"; - struct cw_itemdef capwap80211_itemdefs[] = { - {CW_ITEM80211_SUPPORTED_RATES,CW_ITEM_NONE,CAPWAP80211_TYPE_RATESET}, - {CW_ITEM80211_WTP_RADIO_INFORMATION,CW_ITEM_NONE,MBAG_DWORD}, {CW_ITEM_NONE} }; + +const char CW_RADIOITEM80211_SUPPORTED_RATES[]="802.11 supported_rates"; +const char CW_RADIOITEM80211_WTP_RADIO_INFORMATION[]="802.11 radio_info"; + + + + + +struct cw_itemdef capwap80211_radioitemdefs[] = { + + {CW_RADIOITEM80211_SUPPORTED_RATES,CW_ITEM_NONE,CAPWAP80211_TYPE_RATESET}, + {CW_RADIOITEM80211_WTP_RADIO_INFORMATION,CW_ITEM_NONE,MBAG_DWORD}, + {CW_ITEM_NONE} +}; diff --git a/src/cw/capwap80211_items.h b/src/cw/capwap80211_items.h index 8050d690..47c02ff0 100644 --- a/src/cw/capwap80211_items.h +++ b/src/cw/capwap80211_items.h @@ -3,10 +3,12 @@ #include "item.h" -extern const char CW_ITEM80211_SUPPORTED_RATES[]; -extern const char CW_ITEM80211_WTP_RADIO_INFORMATION[]; +extern const char CW_RADIOITEM80211_SUPPORTED_RATES[]; +extern const char CW_RADIOITEM80211_WTP_RADIO_INFORMATION[]; extern struct cw_itemdef capwap80211_itemdefs[]; +extern struct cw_itemdef capwap80211_radioitemdefs[]; + #endif diff --git a/src/cw/capwap_items.c b/src/cw/capwap_items.c index a966e2d3..3484ee67 100644 --- a/src/cw/capwap_items.c +++ b/src/cw/capwap_items.c @@ -15,9 +15,6 @@ const char CW_ITEM_WTP_FRAME_TUNNEL_MODE[]="wtp_frame_tunnel_mode"; const char CW_ITEM_WTP_RADIOS_IN_USE[]="max_radios"; const char CW_ITEM_WTP_MAX_RADIOS[]="radios_in_use"; -const char CW_ITEM_SSH_ENABLE[]="ssh_enable"; -const char CW_ITEM_TELNET_ENABLE[]="telnet_enable"; - /* const char CW_ITEM_WTP_HARDWARE_VENDOR= */ @@ -42,7 +39,7 @@ const char CW_ITEM_WTP_OTHERSOFTWARE_VERSION, const char CW_ITEM_WTP_BOARD_DATA[]="wtp_board_data"; const char CW_ITEM_WTP_DESCRIPTOR[]="0wtp_descriptor"; const char CW_ITEM_CAPWAP_TIMERS[]="capwap_timers"; -const char CW_ITEM_RADIO_ADMINISTRATIVE_STATE[]="radio_admin_state"; +//const char CW_ITEM_RADIO_ADMINISTRATIVE_STATE[]="radio_admin_state"; const char CW_ITEM_AC_NAME[]="ac_name"; const char CW_ITEM_AC_DESCRIPTOR[]="ac_descriptor"; @@ -104,10 +101,6 @@ struct cw_itemdef capwap_itemdefs[] = { {CW_ITEM_CAPWAP_TRANSPORT_PROTOCOL,CW_ITEM_NONE,MBAG_BYTE}, -{CW_ITEM_TELNET_ENABLE,CW_ITEM_NONE,MBAG_BYTE}, -{CW_ITEM_SSH_ENABLE,CW_ITEM_NONE,MBAG_BYTE}, - - {CW_ITEM_WTP_NAME,CW_ITEM_NONE,MBAG_STR}, {CW_ITEM_WTP_MAC_TYPE,CW_ITEM_NONE,MBAG_BYTE}, {CW_ITEM_WTP_FRAME_TUNNEL_MODE,CW_ITEM_NONE,MBAG_BYTE}, @@ -158,10 +151,13 @@ cisco_items or so */ }; +const char CW_RADIOITEM_ADMIN_STATE[]="admin_state"; +const char CW_RADIOITEM_OPER_STATE[]="oper_state"; struct cw_itemdef capwap_radiodefs[] = { + {CW_RADIOITEM_ADMIN_STATE,CW_ITEM_NONE,MBAG_BYTE}, + {CW_RADIOITEM_OPER_STATE,CW_ITEM_NONE,MBAG_WORD}, - -{CW_ITEM_NONE} + {CW_ITEM_NONE} }; diff --git a/src/cw/capwap_items.h b/src/cw/capwap_items.h index 8b0bc51b..f207b3f3 100644 --- a/src/cw/capwap_items.h +++ b/src/cw/capwap_items.h @@ -176,8 +176,8 @@ extern const char CW_ITEM_RADIO_INFOS[]; extern const char CW_ITEM_ECN_SUPPORT[]; -extern const char CW_ITEM_SSH_ENABLE[]; -extern const char CW_ITEM_TELNET_ENABLE[]; +//extern const char CW_ITEM_SSH_ENABLE[]; +//extern const char CW_ITEM_TELNET_ENABLE[]; @@ -192,7 +192,12 @@ extern const char CW_ITEM_TELNET_ENABLE[]; #define CW_ITEM_REBOOT_LAST_FAILURE_TYPE "last_failure" +extern const char CW_RADIOITEM_ADMIN_STATE[]; +extern const char CW_RADIOITEM_OPER_STATE[]; + extern struct cw_itemdef capwap_itemdefs[]; +extern struct cw_itemdef capwap_radiodefs[]; + #endif diff --git a/src/cw/conn.h b/src/cw/conn.h index eef3755e..6438b0aa 100644 --- a/src/cw/conn.h +++ b/src/cw/conn.h @@ -63,8 +63,11 @@ struct conn { mbag_t incomming; mbag_t remote; mbag_t local; + mbag_t radios; + mbag_t radios_upd; mbag_t config; + mbag_t config_upd; /** base_mac */ diff --git a/src/cw/cw.h b/src/cw/cw.h index bc6f1d9b..f66eafab 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -524,6 +524,20 @@ extern int cw_put_radio_operational_states(mbag_t radios, uint8_t * dst, int *ne */ +/** + * @defgroup CAPWAP_RADIO Radio Operations + * @{ + */ +extern int cw_radio_set_admin_state(mbag_t radios,int rid, int state, int cause); +extern int cw_put_elem_radio_administrative_state(uint8_t *dst,int radio_id,mbag_t radio); +extern int cw_put_elem_radio_operational_state(uint8_t * dst, int rid, int os, int d7mode); + + + +/** + * @} + */ + /** diff --git a/src/cw/cw_in_radio_generic.c b/src/cw/cw_in_radio_generic.c index d31e146a..21c312d5 100644 --- a/src/cw/cw_in_radio_generic.c +++ b/src/cw/cw_in_radio_generic.c @@ -15,7 +15,7 @@ int cw_in_radio_generic(struct conn *conn, struct cw_action_in *a, uint8_t * dat int len, struct sockaddr *from) { - const cw_itemdef_t * idef = cw_itemdef_get(conn->actions->items,a->item_id,CW_ITEM_NONE); + const cw_itemdef_t * idef = cw_itemdef_get(conn->actions->radioitems,a->item_id,CW_ITEM_NONE); if (!idef){ cw_log(LOG_ERR,"No definition found for %s",a->item_id); return 0; diff --git a/src/cw/cw_out_radio_info.c b/src/cw/cw_out_radio_info.c index b2676174..aec11cba 100644 --- a/src/cw/cw_out_radio_info.c +++ b/src/cw/cw_out_radio_info.c @@ -16,19 +16,12 @@ int cw_put_elem_radio_info(uint8_t*dst,int radio_id,mbag_t radio) { cw_put_byte(dst+4,radio_id); - cw_put_dword(dst+5,mbag_get_dword(radio,CW_ITEM80211_WTP_RADIO_INFORMATION,0)); + cw_put_dword(dst+5,mbag_get_dword(radio,CW_RADIOITEM80211_WTP_RADIO_INFORMATION,0)); return 5 + cw_put_elem_hdr(dst,CW_ELEM80211_WTP_RADIO_INFORMATION,5); } -int cw_put_elem_radio_administrative_state(uint8_t *dst,int radio_id,mbag_t radio) -{ - cw_put_byte(dst+4,radio_id); - cw_put_byte(dst+5,mbag_get_byte(radio,CW_RADIO_ADMIN_STATE,9)); - return 2 + cw_put_elem_hdr(dst,CW_ELEM_RADIO_ADMINISTRATIVE_STATE,2); -} - int cw_out_radio_infos(struct conn *conn, struct cw_action_out *a, uint8_t * dst) { @@ -46,21 +39,6 @@ int cw_out_radio_infos(struct conn *conn, struct cw_action_out *a, uint8_t * dst } -int cw_out_radio_administrative_states(struct conn *conn, struct cw_action_out *a, uint8_t * dst) -{ - int l=0; - MAVLITER_DEFINE(it,conn->radios); - mavliter_foreach(&it){ - struct mbag_item *i = mavliter_get(&it); - if ( i->type != MBAG_MBAG ) { - continue; - } - l+=cw_put_elem_radio_administrative_state(dst+l,i->iid,i->data); - - } - return l; -} - diff --git a/src/cw/cw_put_radio_operational_states.c b/src/cw/cw_put_radio_operational_states.c index 2bf8f7c4..413fde05 100644 --- a/src/cw/cw_put_radio_operational_states.c +++ b/src/cw/cw_put_radio_operational_states.c @@ -46,7 +46,7 @@ int cw_put_radio_operational_states(mbag_t radios, uint8_t * dst, int *nerror, i mavliter_foreach(&it){ mbag_item_t * radioitem = mavliter_get(&it); - mbag_item_t *ositem = mbag_get(radioitem->data,CW_RADIO_OPER_STATE); + mbag_item_t *ositem = mbag_get(radioitem->data,CW_RADIOITEM_OPER_STATE); if (!ositem){ (*nerror)++; continue; @@ -77,7 +77,7 @@ int cw_put_radio_operational_states(mbag_t radios, uint8_t * dst, int *nerror, i /* delete the operational state item, so it won't be sent again, until it is set by a change through Set Radio Admin State */ - mbag_del(radioitem->data,CW_RADIO_OPER_STATE); + mbag_del(radioitem->data,CW_RADIOITEM_OPER_STATE); } diff --git a/src/cw/item.h b/src/cw/item.h index e26b6012..3ef7bfed 100644 --- a/src/cw/item.h +++ b/src/cw/item.h @@ -36,6 +36,8 @@ struct cw_itemdef { /** Type */ mbagtype_t type; + const char *meta_id; + }; typedef struct cw_itemdef cw_itemdef_t; diff --git a/src/cw/radio.c b/src/cw/radio.c index bb15f5eb..2335a8f2 100644 --- a/src/cw/radio.c +++ b/src/cw/radio.c @@ -63,26 +63,6 @@ int cw_radio_update_oper_states(mbag_t radios,int cause) -int cw_radio_set_admin_state(mbag_t radios,int rid, int state, int cause) -{ - mbag_t radio = mbag_i_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_radio_set_all_admin_states(mbag_t radios,int state, int cause) { diff --git a/src/cw/radio.h b/src/cw/radio.h index a2a657b4..6fc73a14 100644 --- a/src/cw/radio.h +++ b/src/cw/radio.h @@ -8,8 +8,8 @@ -extern const char CW_RADIO_ADMIN_STATE[]; -extern const char CW_RADIO_OPER_STATE[]; +//extern const char CW_RADIO_ADMIN_STATE[]; +//extern const char CW_RADIO_OPER_STATE[]; extern const char CW_RADIO_SUPPORTED_RATES[]; diff --git a/src/mod/capwap/capwap_actions_ac.c b/src/mod/capwap/capwap_actions_ac.c index 6480569d..e6b5d975 100644 --- a/src/mod/capwap/capwap_actions_ac.c +++ b/src/mod/capwap/capwap_actions_ac.c @@ -94,7 +94,7 @@ static cw_action_in_t actions_in[] = { .msg_id = CW_MSG_DISCOVERY_REQUEST, .elem_id = CW_ELEM_WTP_MAC_TYPE, .start = cw_in_generic2, - .item_id = "wtp_mac_type", + .item_id = CW_ITEM_WTP_MAC_TYPE, .mand = 1, .min_len = 1, .max_len = 1 @@ -314,7 +314,7 @@ static cw_action_in_t actions_in[] = { /* -------------------------------------------------------------------------- - * Configuration Status Request + * Configuration Status Request - IN */ { .capwap_state = CW_STATE_CONFIGURE, @@ -342,7 +342,7 @@ static cw_action_in_t actions_in[] = { .capwap_state = CW_STATE_CONFIGURE, .msg_id = CW_MSG_CONFIGURATION_STATUS_REQUEST, .elem_id = CW_ELEM_RADIO_ADMINISTRATIVE_STATE, - .item_id = CW_ITEM_RADIO_ADMINISTRATIVE_STATE, + .item_id = CW_RADIOITEM_ADMIN_STATE, .start = cw_in_radio_administrative_state, .mand = 1 @@ -417,8 +417,8 @@ static cw_action_in_t actions_in[] = { .capwap_state = CW_STATE_CONFIGURE, .msg_id= CW_MSG_CHANGE_STATE_EVENT_REQUEST, .elem_id = CW_ELEM_RADIO_OPERATIONAL_STATE, - .item_id = CW_RADIO_OPER_STATE, - .start = cw_in_radio_operational_state, + .item_id = CW_RADIOITEM_OPER_STATE, + .start = cw_in_radio_generic, //operational_state, .min_len=3, .max_len=3, .mand = 0 @@ -465,7 +465,7 @@ static cw_action_in_t actions_in[] = { .capwap_state = CW_STATE_RUN, .msg_id= CW_MSG_CHANGE_STATE_EVENT_REQUEST, .elem_id = CW_ELEM_RADIO_OPERATIONAL_STATE, - .item_id = CW_RADIO_OPER_STATE, + .item_id = CW_RADIOITEM_OPER_STATE, .start = cw_in_radio_operational_state, .min_len=3, .max_len=3, @@ -730,6 +730,17 @@ static cw_action_out_t actions_out[]={ } , + /* Radio Administrative State - OUT */ + { + .msg_id = CW_MSG_CONFIGURATION_UPDATE_REQUEST, + .elem_id = CW_ELEM_RADIO_ADMINISTRATIVE_STATE, + .item_id = CW_RADIOITEM_ADMIN_STATE, + .out = cw_out_radio_administrative_states, + .get = cw_out_get_outgoing, + .mand = 0 + } + , + @@ -772,7 +783,7 @@ int capwap_register_actions_ac(struct cw_actiondef *def) rc += cw_strheap_register_strings(def->strelem, capwap_strings_elem); rc += cw_itemdefheap_register(def->items, capwap_itemdefs); - rc += cw_itemdefheap_register(def->radioitems, capwap_radioitemdefs); + rc += cw_itemdefheap_register(def->radioitems, capwap_radiodefs); intavltree_add(def->wbids, 0); diff --git a/src/mod/capwap/capwap_actions_wtp.c b/src/mod/capwap/capwap_actions_wtp.c index ddb8a388..0f096a76 100644 --- a/src/mod/capwap/capwap_actions_wtp.c +++ b/src/mod/capwap/capwap_actions_wtp.c @@ -353,9 +353,9 @@ static cw_action_in_t actions_in[] = { .capwap_state = CW_STATE_RUN, .msg_id = CW_MSG_CONFIGURATION_UPDATE_REQUEST, .elem_id = CW_ELEM_RADIO_ADMINISTRATIVE_STATE, - .item_id = CW_ITEM_RADIO_ADMINISTRATIVE_STATE, + .item_id = CW_RADIOITEM_ADMIN_STATE, .start = cw_in_radio_administrative_state, - .mand = 1 + .mand = 0 } , @@ -568,7 +568,7 @@ static cw_action_out_t actions_out[] = { /* Radio Admin State - Config Status Request */ { .msg_id = CW_MSG_CONFIGURATION_STATUS_REQUEST, - .item_id = CW_ITEM_RADIO_ADMINISTRATIVE_STATE, + .item_id = CW_RADIOITEM_ADMIN_STATE, .out = cw_out_radio_administrative_states, .get = cw_out_get_config, .mand = 1 diff --git a/src/mod/capwap80211/capwap80211_actions_ac.c b/src/mod/capwap80211/capwap80211_actions_ac.c index 32b13733..31281879 100644 --- a/src/mod/capwap80211/capwap80211_actions_ac.c +++ b/src/mod/capwap80211/capwap80211_actions_ac.c @@ -29,7 +29,7 @@ static cw_action_in_t actions_ac_in[] = { .capwap_state = CW_STATE_DISCOVERY, .msg_id = CW_MSG_DISCOVERY_REQUEST, .elem_id = CW_ELEM80211_WTP_RADIO_INFORMATION, - .item_id = CW_ITEM80211_WTP_RADIO_INFORMATION, + .item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION, .start = cw_in_radio_generic, .mand = 1, .min_len = 5, @@ -47,7 +47,7 @@ static cw_action_in_t actions_ac_in[] = { .capwap_state = CW_STATE_JOIN, .msg_id = CW_MSG_JOIN_REQUEST, .elem_id = CW_ELEM80211_WTP_RADIO_INFORMATION, - .item_id = CW_ITEM80211_WTP_RADIO_INFORMATION, + .item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION, .start = cw_in_radio_generic, .mand = 1, .min_len = 5, @@ -64,7 +64,7 @@ static cw_action_in_t actions_ac_in[] = { .capwap_state = CW_STATE_CONFIGURE, .msg_id = CW_MSG_CONFIGURATION_STATUS_REQUEST, .elem_id = CW_ELEM80211_SUPPORTED_RATES, - .item_id = CW_ITEM80211_SUPPORTED_RATES, + .item_id = CW_RADIOITEM80211_SUPPORTED_RATES, .start = cw_in_radio_generic, .mand = 0, .min_len = 3, @@ -90,8 +90,8 @@ cw_action_out_t actions_ac_out[]={ /* 802.11 Radio Information - Discovery Response */ { .msg_id = CW_MSG_DISCOVERY_RESPONSE, - .item_id = CW_ITEM80211_WTP_RADIO_INFORMATION , .elem_id = CW_ELEM80211_WTP_RADIO_INFORMATION, + .item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION , .out = cw_out_radio_infos, .mand = 1 } @@ -105,8 +105,8 @@ cw_action_out_t actions_ac_out[]={ /* 802.11 Radio Information - Discovery Response */ { .msg_id = CW_MSG_JOIN_RESPONSE, - .item_id = CW_ITEM80211_WTP_RADIO_INFORMATION, .elem_id = CW_ELEM80211_WTP_RADIO_INFORMATION, + .item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION, .out = cw_out_radio_infos, .mand = 1 } @@ -135,6 +135,7 @@ int capwap80211_register_actions_ac(struct cw_actiondef *def) rc+= cw_strheap_register_strings(def->strelem, capwap_strings_elem80211); rc += cw_itemdefheap_register(def->items,capwap80211_itemdefs); + rc += cw_itemdefheap_register(def->radioitems,capwap80211_radioitemdefs); /*rc += cw_strheap_register_strings(def->strelem, capwap_strings_elem); */ diff --git a/src/mod/capwap80211/capwap80211_actions_wtp.c b/src/mod/capwap80211/capwap80211_actions_wtp.c index 18175618..8de5e71c 100644 --- a/src/mod/capwap80211/capwap80211_actions_wtp.c +++ b/src/mod/capwap80211/capwap80211_actions_wtp.c @@ -8,12 +8,6 @@ #include "cw/capwap80211_items.h" #include "cw/radio.h" -//#include "capwap_80211_actions.h" -//#include "capwap_80211.h" -//#include "capwap.h" - - - @@ -28,7 +22,7 @@ static cw_action_in_t actions_wtp_in[] = { .capwap_state = CW_STATE_DISCOVERY, .msg_id = CW_MSG_DISCOVERY_RESPONSE, .elem_id = CW_ELEM80211_WTP_RADIO_INFORMATION, - .item_id = CW_ITEM80211_WTP_RADIO_INFORMATION, + .item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION, // .start = cw_in_radio_generic, .mand = 1, .min_len = 5, @@ -45,7 +39,7 @@ static cw_action_in_t actions_wtp_in[] = { .capwap_state = CW_STATE_JOIN, .msg_id = CW_MSG_JOIN_RESPONSE, .elem_id = CW_ELEM80211_WTP_RADIO_INFORMATION, - .item_id = CW_ITEM80211_WTP_RADIO_INFORMATION, + .item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION, // .start = cw_in_radio_generic, .mand = 1, .min_len = 5, diff --git a/src/mod/cipwap/Makefile b/src/mod/cipwap/Makefile index 75499ede..ed31b863 100644 --- a/src/mod/cipwap/Makefile +++ b/src/mod/cipwap/Makefile @@ -1,6 +1,8 @@ OBJS=\ - mod_cipwap_ac.o + mod_cipwap_ac.o \ + cipwap_actions_ac.o + NAME=libcipwap.a diff --git a/src/mod/cipwap/cipwap_actions_ac.c b/src/mod/cipwap/cipwap_actions_ac.c new file mode 100644 index 00000000..e626919f --- /dev/null +++ b/src/mod/cipwap/cipwap_actions_ac.c @@ -0,0 +1,62 @@ +/* + This file is part of libcapwap. + + libcapwap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + + +#include "cw/cw.h" +#include "cw/action.h" +#include "cw/cipwap_items.h" +#include "cw/strheap.h" +#include "cw/radio.h" + + +#include "mod_cipwap.h" + +static cw_action_in_t actions_in[] = { + + /* End of list */ + {0, 0} +}; + +static cw_action_out_t actions_out[]={ + + /* End of list */ + {0,0} +}; + + + + +int cipwap_register_actions_ac(struct cw_actiondef *def) +{ + int rc; + + rc = cw_actionlist_in_register_actions(def->in, actions_in); + rc += cw_actionlist_out_register_actions(def->out, actions_out); +/* + rc += cw_strheap_register_strings(def->strmsg, capwap_strings_msg); + rc += cw_strheap_register_strings(def->strelem, capwap_strings_elem); +*/ + rc += cw_itemdefheap_register(def->items, cipwap_itemdefs); + +/* rc += cw_itemdefheap_register(def->radioitems, capwap_radiodefs); + intavltree_add(def->wbids, 0); +*/ + + + return rc; +} diff --git a/src/mod/cipwap/mod_cipwap.h b/src/mod/cipwap/mod_cipwap.h index ed736356..992c9539 100644 --- a/src/mod/cipwap/mod_cipwap.h +++ b/src/mod/cipwap/mod_cipwap.h @@ -2,5 +2,6 @@ #define __MOD_CIPWAP_H struct mod_ac * mod_cipwap_ac(); +extern int cipwap_register_actions_ac(struct cw_actiondef *def); #endif diff --git a/src/mod/cipwap/mod_cipwap_ac.c b/src/mod/cipwap/mod_cipwap_ac.c index 658626f7..72d54fb9 100644 --- a/src/mod/cipwap/mod_cipwap_ac.c +++ b/src/mod/cipwap/mod_cipwap_ac.c @@ -1,4 +1,7 @@ + +#include "../modload.h" + #include "cw/mod.h" #include "cw/log.h" #include "cw/dbg.h" @@ -15,19 +18,62 @@ int cipwap_init() static int detect(struct conn *conn,const uint8_t *rawmsg, int rawlen,int elems_len, struct sockaddr *from, int mode) { - if (mode != MOD_MODE_CAPWAP) - return 0; + if (mode == MOD_MODE_CAPWAP) + return 1; - cw_dbg(DBG_MOD,"CIPWAP detected: no"); return 0; } +static int register_actions(struct cw_actiondef *actions, int mode) +{ + switch (mode) { + case MOD_MODE_CAPWAP: + { + + struct mod_ac *cmod = modload_ac("capwap"); + if (!cmod) { + cw_log(LOG_ERR, + "Can't initialize mod_cisco, failed to load base mod mod_capwap"); + return 1; + } + cmod->register_actions(actions, MOD_MODE_CAPWAP); + int rc = cipwap_register_actions_ac(actions); + cw_dbg(DBG_INFO, "Initialized mod_cisco with %d actions", rc); + return rc; + } + +/* + case MOD_MODE_BINDINGS: + { + struct mod_ac *cmod = modload_ac("capwap80211"); + if (!cmod) { + cw_log(LOG_ERR, + "Can't initialize mod_cisco, failed to load base mod mod_capwap80211"); + return 1; + } + cmod->register_actions(actions, MOD_MODE_BINDINGS); + int rc = cipwap_register_actions80211_ac(actions); + cw_dbg(DBG_INFO, "Initialized mod_cisco 80211 with %d actions", rc); + return 0; + } +*/ + + + } + + + return 0; + + +} + static struct mod_ac cipwap_ac = { .name ="cipwap", .init = cipwap_init, - .detect = detect + .detect = detect, + .register_actions=register_actions }; diff --git a/src/mod/cisco/Makefile b/src/mod/cisco/Makefile index 0734ff9f..04693102 100644 --- a/src/mod/cisco/Makefile +++ b/src/mod/cisco/Makefile @@ -15,6 +15,7 @@ OBJS=\ cisco_in_radio_administrative_state.o \ cisco_in_spam_vendor_specific.o \ cisco_in_telnet_ssh.o \ + cisco_out_radio_administrative_states.o diff --git a/src/mod/cisco/cisco.h b/src/mod/cisco/cisco.h index cfb9b8df..9aa1b014 100644 --- a/src/mod/cisco/cisco.h +++ b/src/mod/cisco/cisco.h @@ -31,4 +31,8 @@ int cisco_in_telnet_ssh(struct conn *conn, struct cw_action_in *a, uint8_t * dat int cisco_out_telnet_ssh(struct conn *conn,struct cw_action_out * a,uint8_t *dst); +int cisco_out_radio_administrative_states(struct conn *conn, struct cw_action_out *a, uint8_t * dst); + + + #endif diff --git a/src/mod/cisco/cisco_actions_ac.c b/src/mod/cisco/cisco_actions_ac.c index d0466d13..026b347c 100644 --- a/src/mod/cisco/cisco_actions_ac.c +++ b/src/mod/cisco/cisco_actions_ac.c @@ -300,6 +300,17 @@ static cw_action_out_t actions_out[]={ } , + /* Radio Administrative State - OUT */ + { + .msg_id = CW_MSG_CONFIGURATION_UPDATE_REQUEST, + .elem_id = CW_ELEM_RADIO_ADMINISTRATIVE_STATE, + .item_id = CW_RADIOITEM_ADMIN_STATE, + .out = cisco_out_radio_administrative_states, + .get = cw_out_get_outgoing, + .mand = 0 + } + , + @@ -320,7 +331,7 @@ static cw_action_in_t actions80211_in[] = { .capwap_state = CW_STATE_DISCOVERY, .msg_id = CW_MSG_DISCOVERY_REQUEST, .elem_id = CW_ELEM80211_WTP_RADIO_INFORMATION, - .item_id = CW_ITEM80211_WTP_RADIO_INFORMATION, + .item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION, .start = cw_in_radio_generic, .mand = 0, .min_len = 5, @@ -333,7 +344,7 @@ static cw_action_in_t actions80211_in[] = { .vendor_id = CW_VENDOR_ID_CISCO, .msg_id = CW_MSG_CONFIGURATION_STATUS_REQUEST, .elem_id = CW_CISCO_SUPPORTED_RATES, - .item_id = CW_ITEM80211_SUPPORTED_RATES, + .item_id = CW_RADIOITEM80211_SUPPORTED_RATES, .start = cw_in_radio_generic, .mand = 0, .min_len = 5, @@ -345,6 +356,7 @@ static cw_action_in_t actions80211_in[] = { }; + #include "cw/item.h" static struct cw_itemdef _capwap_itemdefs[] = { diff --git a/src/mod/cisco/cisco_actions_wtp.c b/src/mod/cisco/cisco_actions_wtp.c index d20aea72..41a9b2aa 100644 --- a/src/mod/cisco/cisco_actions_wtp.c +++ b/src/mod/cisco/cisco_actions_wtp.c @@ -125,7 +125,7 @@ static cw_action_in_t actions_in[] = { .capwap_state = CW_STATE_RUN, .msg_id = CW_MSG_CONFIGURATION_UPDATE_REQUEST, .elem_id = CW_ELEM_RADIO_ADMINISTRATIVE_STATE, - .item_id = CW_ITEM_RADIO_ADMINISTRATIVE_STATE, + .item_id = CW_RADIOITEM_ADMIN_STATE, .start = cisco_in_radio_administrative_state_wtp, .mand = 1 } @@ -238,7 +238,7 @@ static cw_action_out_t actions_out[]={ .vendor_id = CW_VENDOR_ID_CISCO, .msg_id = CW_MSG_CONFIGURATION_STATUS_REQUEST, .elem_id = CW_ELEM80211_WTP_RADIO_INFORMATION, - .item_id = CW_ITEM80211_WTP_RADIO_INFORMATION, + .item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION, .out = cisco_out_80211_wtp_radio_cfg, .get = cw_out_get_config, .mand = 1 diff --git a/src/mod/cisco/cisco_in_telnet_ssh.c b/src/mod/cisco/cisco_in_telnet_ssh.c index b7d31925..d4194c05 100644 --- a/src/mod/cisco/cisco_in_telnet_ssh.c +++ b/src/mod/cisco/cisco_in_telnet_ssh.c @@ -1,7 +1,7 @@ #include "cisco.h" -#include "cw/capwap_items.h" +#include "cw/cipwap_items.h" #include "cw/cw.h" #include "cw/dbg.h" @@ -14,10 +14,10 @@ int cisco_in_telnet_ssh(struct conn *conn, struct cw_action_in *a, uint8_t * dat switch (type){ case 0: - mbag_set_byte(conn->incomming,CW_ITEM_TELNET_ENABLE,enable); + mbag_set_byte(conn->incomming,CIPWAP_ITEM_TELNET_ENABLE,enable); break; case 1: - mbag_set_byte(conn->incomming,CW_ITEM_SSH_ENABLE,enable); + mbag_set_byte(conn->incomming,CIPWAP_ITEM_SSH_ENABLE,enable); break; default: cw_dbg(DBG_ELEM_ERR,"Unknown Telnet/SSH Type: %d",type); diff --git a/src/mod/cisco/cisco_out_radio_administrative_states.c b/src/mod/cisco/cisco_out_radio_administrative_states.c new file mode 100644 index 00000000..c6edd0b8 --- /dev/null +++ b/src/mod/cisco/cisco_out_radio_administrative_states.c @@ -0,0 +1,24 @@ +#include "cw/cw.h" +#include "cw/dbg.h" +#include "cw/capwap_items.h" + + +int cisco_out_radio_administrative_states(struct conn *conn, struct cw_action_out *a, uint8_t * dst) +{ + int l=0; + MAVLITER_DEFINE(it,conn->radios_upd); + mavliter_foreach(&it){ + struct mbag_item *i = mavliter_get(&it); + if ( i->type != MBAG_MBAG ) { + continue; + } + + int state = mbag_get_byte(i->data,CW_RADIOITEM_ADMIN_STATE,CW_RADIO_ADMIN_STATE_DISABLED); + l+=cw_put_elem_radio_administrative_state(dst+l,i->iid,i->data); +// l+=cw_put_elem_radio_operational_state(dst+l,i->iid,state<<8,0); + + } + return l; +} + + diff --git a/src/mod/cisco/cisco_out_telnet_ssh.c b/src/mod/cisco/cisco_out_telnet_ssh.c index aeb6144f..d41a3c49 100644 --- a/src/mod/cisco/cisco_out_telnet_ssh.c +++ b/src/mod/cisco/cisco_out_telnet_ssh.c @@ -1,6 +1,8 @@ #include "cisco.h" #include "cw/capwap_items.h" +#include "cw/cipwap_items.h" + #include "cw/lwapp.h" #include "cw/cw.h" #include "cw/dbg.h" @@ -56,8 +58,8 @@ int cw_cisco_put_telnet_ssh(struct conn *conn,uint8_t type,const char * item_id, int cisco_out_telnet_ssh(struct conn *conn,struct cw_action_out * a,uint8_t *dst) { int l; - l=cw_cisco_put_telnet_ssh(conn,0,CW_ITEM_TELNET_ENABLE,dst); - l+=cw_cisco_put_telnet_ssh(conn,1,CW_ITEM_SSH_ENABLE,dst+l); + l=cw_cisco_put_telnet_ssh(conn,0,CIPWAP_ITEM_TELNET_ENABLE,dst); + l+=cw_cisco_put_telnet_ssh(conn,1,CIPWAP_ITEM_SSH_ENABLE,dst+l); return l; } diff --git a/src/mod/cisco/mod_cisco_ac.c b/src/mod/cisco/mod_cisco_ac.c index caed4be4..e0c22f97 100644 --- a/src/mod/cisco/mod_cisco_ac.c +++ b/src/mod/cisco/mod_cisco_ac.c @@ -21,10 +21,10 @@ static int register_actions(struct cw_actiondef *actions, int mode) case MOD_MODE_CAPWAP: { - struct mod_ac *cmod = modload_ac("capwap"); + struct mod_ac *cmod = modload_ac("cipwap"); if (!cmod) { cw_log(LOG_ERR, - "Can't initialize mod_cisco, failed to load base mod mod_capwap"); + "Can't initialize mod_cisco, failed to load base mod mod_cipwap"); return 1; } cmod->register_actions(actions, MOD_MODE_CAPWAP); diff --git a/src/wtp/cfg.c b/src/wtp/cfg.c index 2a0f52b8..17eed8a6 100644 --- a/src/wtp/cfg.c +++ b/src/wtp/cfg.c @@ -136,7 +136,7 @@ static int scn_radios(char *js, jsmntok_t * t) printf("Radio id %d\n",rid); mbag_t radio=mbag_i_get_mbag_c(conn->radios,rid,mbag_create); - scn_obj(js,to+1,radio,conn->actions->items /*radioitems*/,NULL); + scn_obj(js,to+1,radio,conn->actions->radioitems /*radioitems*/,NULL); } diff --git a/src/wtp/dot11.h b/src/wtp/dot11.h index 65a14ca1..77c82021 100644 --- a/src/wtp/dot11.h +++ b/src/wtp/dot11.h @@ -1,5 +1,5 @@ -#ifndef __DOT11_H -#define __DOT11_H +#ifndef __DOT11X_H +#define __DOT11X_H #include diff --git a/src/wtp/join.c b/src/wtp/join.c index 1ddce098..a182cd1e 100644 --- a/src/wtp/join.c +++ b/src/wtp/join.c @@ -114,7 +114,7 @@ int run_join_d(struct sockaddr *sa) /* we call connect to bind this socket to a local IP address, * which we can later obtain by getsockname */ - rc = connect(sockfd, (struct sockaddr *) sa, +/* rc = connect(sockfd, (struct sockaddr *) sa, sock_addrlen((struct sockaddr *) sa)); if (rc < 0) { @@ -123,7 +123,7 @@ int run_join_d(struct sockaddr *sa) close(sockfd); return -1; } - +*/ cw_dbg(DBG_DTLS, "Establishing DTLS session with %s", sock_addr2str(sa)); diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index 8c66d6db..e185a45e 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -132,16 +132,17 @@ int main() struct conn *conn = the_conn; conn->radios = mbag_i_create(); + conn->radios_upd=conn->radios; mbag_i_set_mbag(conn->radios,0,mbag_create()); // mbag_i_set_mbag(conn->radios,1,mbag_create()); // mbag_set_mbag(conn->radios,0xff,mbag_create()); -#define CWMOD "cisco" -#define CWBIND "cisco" -//#define CWMOD "capwap" -//#define CWBIND "capwap80211" +//#define CWMOD "cisco" +//#define CWBIND "cisco" +#define CWMOD "capwap" +#define CWBIND "capwap80211" struct mod_wtp *mod = modload_wtp(CWMOD); @@ -206,11 +207,11 @@ int main() printf("RID = %d\n",i->iid); printf("DATA: %p\n",i->data); mbag_t radio= (mbag_t)i->data; - struct mbag_item *mri = mbag_get(radio,CW_ITEM80211_WTP_RADIO_INFORMATION); + struct mbag_item *mri = mbag_get(radio,CW_RADIOITEM80211_WTP_RADIO_INFORMATION); if (!mri){ printf("Setting to 8 %p %p\n",mri,r); - mbag_set_dword(radio,CW_ITEM80211_WTP_RADIO_INFORMATION,8); + mbag_set_dword(radio,CW_RADIOITEM80211_WTP_RADIO_INFORMATION,1); } else{ printf("MRI %p\n",mri); diff --git a/src/wtp/wtpdrv.h b/src/wtp/wtpdrv.h index 1637bb25..ecf43d41 100644 --- a/src/wtp/wtpdrv.h +++ b/src/wtp/wtpdrv.h @@ -1,4 +1,9 @@ -int wtpdrv_get_num_radios(); +//int wtpdrv_get_num_radios(); +struct wtpdrv +{ + int (*get_num_raadios)(); + +}