Inital...
FossilOrigin-Name: 1eea8a29f623b2f00ef7a3c438571cd39c9a6424fb4aacd6c14ed49418f0d46b
This commit is contained in:
parent
43bb7ec515
commit
9138e7229b
114
src/capwap/cisco.c
Normal file
114
src/capwap/cisco.c
Normal file
@ -0,0 +1,114 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_cisco.h"
|
||||
|
||||
#include "mbag.h"
|
||||
#include "radio.h"
|
||||
#include "log.h"
|
||||
|
||||
int cw_put_cisco_wtp_radio_cfg(uint8_t *dst, int rid, mbag_t radio)
|
||||
{
|
||||
|
||||
cw_put_byte(dst,rid);
|
||||
|
||||
cw_put_byte(dst+1,0); //?
|
||||
cw_put_word(dst+2,mbag_get_word(radio,CW_RADIO_OCCUPANCY_LIMIT,12));
|
||||
cw_put_byte(dst+4,mbag_get_byte(radio,CW_RADIO_CFP_PERIOD,8));
|
||||
|
||||
cw_put_word(dst+5,mbag_get_word(radio,CW_RADIO_CFP_MAX_DURATION,200));
|
||||
|
||||
|
||||
bstr_t grmac = mbag_get_bstr(radio,CW_RADIO_BSSID,NULL);
|
||||
|
||||
//printf("GRMAC: %d\n",bstr_len(grmac));
|
||||
if ( grmac) {
|
||||
if (bstr_len(grmac)!=6){
|
||||
cw_log(LOG_ERR,"Wrong bssid size");
|
||||
exit(0);
|
||||
grmac =NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bstr_t rmac;
|
||||
|
||||
if (!grmac){
|
||||
uint8_t defrmac[]={0,0,0,0,0,0};
|
||||
rmac = bstr_create(defrmac,6);
|
||||
}
|
||||
else
|
||||
rmac = grmac;
|
||||
|
||||
|
||||
cw_put_bstr(dst+7,rmac);
|
||||
|
||||
if ( !grmac )
|
||||
free(rmac);
|
||||
|
||||
cw_put_word(dst+13,0); // beacon period
|
||||
|
||||
|
||||
cw_put_data(dst+15,mbag_get_raw(radio,CW_RADIO_COUNTRY_STRING,"DE "),3);
|
||||
cw_put_data(dst+18,mbag_get_raw(radio,CW_RADIO_COUNTRY_STRING,"DE "),3);
|
||||
|
||||
cw_put_byte(dst+21,10); // gPeriod
|
||||
|
||||
cw_put_dword(dst+22,0x3538); // ?
|
||||
|
||||
cw_put_word(dst+26,0);
|
||||
|
||||
return 26+2; //+cw_put_elem_vendor_hdr(dst,CW_VENDOR_ID_CISCO,CW_CISCO_WTP_RADIO_CFG,28);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cw_put_elem_cisco_ap_regulatory_domain(uint8_t *dst,int rid, mbag_t radio)
|
||||
{
|
||||
int l=0;
|
||||
uint8_t *d=dst+10;
|
||||
|
||||
d+=cw_put_byte(d,rid); /* Band ID */
|
||||
d+=cw_put_byte(d,1); /* Set True/False */
|
||||
d+=cw_put_byte(d,rid); /* Slot ID */
|
||||
d+=cw_put_word(d,mbag_get_word(radio,CW_RADIO_REG_DOMAIN,1));
|
||||
|
||||
return 5 + cw_put_elem_vendor_hdr(dst, CW_VENDOR_ID_CISCO, CW_CISCO_AP_REGULATORY_DOMAIN, 5);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cw_put_elem_cisco_radio_cfg(uint8_t * dst,int rid, mbag_t radio)
|
||||
{
|
||||
int l = cw_put_cisco_wtp_radio_cfg(dst+10,rid,radio);
|
||||
return l+cw_put_elem_vendor_hdr(dst,CW_VENDOR_ID_CISCO,CW_CISCO_WTP_RADIO_CFG,l);
|
||||
}
|
||||
|
||||
int cw_out_cisco_wtp_radio_cfg(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_info(dst+l,i->id,i->data);
|
||||
l+=cw_put_elem_cisco_radio_cfg(dst+l,i->id,i->data);
|
||||
l+=cw_put_elem_cisco_ap_regulatory_domain(dst+l,i->id,i->data);
|
||||
|
||||
}
|
||||
return l;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// MAVLITER_DEFINE
|
||||
// int l = cw_out_cisco_wtp_radio_cfg_(conn,a,dst,0);
|
||||
|
||||
// return l+cw_out_cisco_wtp_radio_cfg_(conn,a,dst+l,1);
|
||||
}
|
||||
|
42
src/capwap/cw_out_cisco_wtp_radio_cfg.c
Normal file
42
src/capwap/cw_out_cisco_wtp_radio_cfg.c
Normal file
@ -0,0 +1,42 @@
|
||||
#include "capwap.h"
|
||||
#include "capwap_cisco.h"
|
||||
|
||||
#include "itemstore.h"
|
||||
|
||||
int cw_put_cisco_wtp_radio_cfg(uint8_t *dst, int rid, cw_itemstore radio)
|
||||
{
|
||||
|
||||
cw_put_byte(dst,rid);
|
||||
|
||||
cw_put_byte(dst+1,0); //?
|
||||
cw_put_word(dst+2,cw_istore_get_word(radio,CW_RADIO_OCCUPANCY_LIMIT);
|
||||
cw_put_byte(dst+4,cw_istore_get_byte(radio,CW_RADIO_CFP_PERIOD));
|
||||
|
||||
cw_put_word(dst+5,cw_istore_get_word(radio,CW_RADIO_CFP_MAX_DURATION,200);
|
||||
|
||||
/* XXX catch rmac shorter or longer than 6*/
|
||||
|
||||
cw_put_bstr(dst+7,cw_istore_get_datari->rmac); /* length MUST be 6 */
|
||||
|
||||
cw_put_word(dst+13,200); // beacon period
|
||||
cw_put_data(dst+15,cw_itemstore_get_datari->country_str,3);
|
||||
cw_put_data(dst+18,ri->country_str2,3);
|
||||
|
||||
cw_put_byte(dst+10+21,10); // gPeriod
|
||||
|
||||
cw_put_dword(dst+10+22,0x3538); // ?
|
||||
|
||||
return 28; //+cw_put_elem_vendor_hdr(dst,CW_VENDOR_ID_CISCO,CW_CISCO_WTP_RADIO_CFG,28);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int cw_out_cisco_wtp_radio_cfg(struct conn *conn, struct cw_action_out *a, uint8_t * dst)
|
||||
{
|
||||
uint8_t *d = dst;
|
||||
|
||||
|
||||
return 28+cw_put_elem_vendor_hdr(dst,CW_VENDOR_ID_CISCO,CW_CISCO_WTP_RADIO_CFG,28);
|
||||
}
|
||||
|
24
src/capwap/cw_out_init_session_id.c
Normal file
24
src/capwap/cw_out_init_session_id.c
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
|
||||
#include "capwap.h"
|
||||
#include "capwap_items.h"
|
||||
|
||||
#include "log.h"
|
||||
#include "rand.h"
|
||||
|
||||
int cw_out_init_session_id(struct conn *conn,struct cw_action_out * a,uint8_t *dst)
|
||||
{
|
||||
printf("Vendor ID: %d\n", a->vendor_id);
|
||||
uint8_t session_id[16];
|
||||
int l = cw_rand(session_id,16);
|
||||
if ( l!=16 ) {
|
||||
cw_log(LOG_ERR,"Can't init session ID.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
cw_itemstore_set_bstrn(conn->local,CW_ITEM_SESSION_ID,session_id,16);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
36
src/capwap/cw_out_radio_info.c
Normal file
36
src/capwap/cw_out_radio_info.c
Normal file
@ -0,0 +1,36 @@
|
||||
|
||||
#include "capwap.h"
|
||||
#include "capwap_items.h"
|
||||
#include "capwap_80211.h"
|
||||
#include "radio.h"
|
||||
|
||||
#include "dbg.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "mbag.h"
|
||||
|
||||
|
||||
|
||||
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_RADIO_TYPE,0));
|
||||
return 5 + cw_put_elem_hdr(dst,CW_ELEM80211_WTP_RADIO_INFORMATION,5);
|
||||
|
||||
}
|
||||
|
||||
int cw_out_radio_infos(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_info(dst+l,i->id,i->data);
|
||||
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user