int cw_in_radio_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, struct sockaddr *from) { 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; } int rid = cw_get_byte(data); mbag_t radio = mbag_i_get_mbag(conn->radios, rid, NULL); if (!radio) { if (a->vendor_id != 0 || ( (a->vendor_id == 0) && (a->msg_id != CW_MSG_DISCOVERY_REQUEST && a->msg_id != CW_MSG_JOIN_REQUEST) )) { cw_dbg(DBG_ELEM_ERR, "Radio not found %d", rid); return 0; } mbag_i_set_mbag(conn->radios,rid,mbag_create()); radio = mbag_i_get_mbag(conn->radios, rid, NULL); } int rc = mbag_set_from_buf(radio,idef->type,a->item_id,data+1,len-1); if (!rc){ cw_log(LOG_ERR, "Can't handle item type %s in definition for incomming msg %d (%s) - %d, cw_in_radio_generic.", idef->type->name, a->msg_id, cw_strmsg(a->msg_id), a->elem_id); } return rc; }
int cw_in_cisco_add_wlan(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, struct sockaddr *from) { int rid = cw_get_byte(data); mbag_t wlan = mbag_i_get_mbag(conn->radios,rid,NULL); if ( !wlan ) { printf("No Radio git\n"); } mbag_set_byte(wlan,"radio_id",rid); int mytype=mbag_get_byte(conn->config,CW_ITEM_AP_MODE_AND_TYPE,77) & 0xff; printf("My type: %d\n",mytype); exit(0); cw_cisco_get_wlan_legacy(wlan,data,len); return 0; }
int cisco80211_in_mac_operation(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, struct sockaddr *from) { int rid = cw_get_byte(data); mbag_t r = mbag_i_get_mbag(conn->radios,rid,NULL); if (!r){ cw_dbg(DBG_ELEM_ERR,"Radio %d not defined. Can't set mac operation."); return 0; } return cw_read_80211_mac_operation(data+3,r); }
static void update_radios(struct conn * conn, mbag_t result) { MAVLITER_DEFINE (it,conn->radios_upd); mavliter_foreach(&it){ struct mbag_item * item = mavliter_get(&it); int rid = item->iid; mbag_t radio = mbag_i_get_mbag(conn->radios,rid,NULL); if (!radio){ cw_dbg(DBG_ELEM_ERR,"Can't find radio with id %d",rid); continue; } mbag_t iresult = mbag_create(); mbag_i_set_mbag(result,rid,iresult); update_radio(conn,rid,item->data,radio,iresult); } }
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_in_radio_generic(struct conn *conn, struct cw_action_in *a, uint8_t * data, int len, struct sockaddr *from) { if (!check_len(conn, a, data, len, from)) return 0; int rid = cw_get_byte(data); mbag_t radio = mbag_i_get_mbag(conn->radios, rid, NULL); if (!radio) { if (a->vendor_id != 0 || ( (a->vendor_id == 0) && (a->msg_id != CW_MSG_DISCOVERY_REQUEST && a->msg_id != CW_MSG_JOIN_REQUEST) )) { cw_dbg(DBG_ELEM_ERR, "Radio not found %d", rid); return 0; } mbag_i_set_mbag(conn->radios,rid,mbag_create()); } return 1; }
void conn_clear_upd(struct conn *conn, int merge) { if (merge){ mavl_merge(conn->config, conn->config_upd); MAVLITER_DEFINE (it,conn->radios_upd); mavliter_foreach(&it){ struct mbag_item * ruitem = mavliter_get(&it); mavl_t radio_upd = ruitem->data; mbag_t radio = mbag_i_get_mbag(conn->radios,ruitem->iid,NULL); if (radio){ mavl_merge(radio,radio_upd); } } } mavl_del_all(conn->config_upd); mavl_del_all(conn->radios_upd); }