Working on Cisoc support.

FossilOrigin-Name: 3b605a558b58d0288e1ee3c60277c74967b120fcb500e3458b3b7c7d71903bae
This commit is contained in:
7u83@mail.ru 2015-03-23 06:48:27 +00:00
parent ccd226aeba
commit 69d5462211
49 changed files with 358 additions and 144 deletions

View File

@ -44,7 +44,7 @@
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Board ID | regDomainSet | RegDomainSlot | RegDomainCode |
| Band ID | regDomainSet | RegDomainSlot | RegDomainCode |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RegDomainCope1|
+-+-+-+-+-+-+-+-+
@ -54,7 +54,7 @@
128. Cisco Rest Button State
128. Cisco Reset Button State
The state of the reset button
@ -88,11 +88,22 @@
Length: 4
208. Cisco MWAR Type
0
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
| MWAR Type |
+-+-+-+-+-+-+-+-+
01 Primary?
LWAPP
=====
73. Cisco PAth MTU
73. Cisco Path MTU
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

View File

@ -222,7 +222,7 @@ void process_cw_ctrl_packet(int index,struct sockaddr * addr, uint8_t * buffer,
/* first of all check preamble */
int preamble = CWTH_GET_PREAMBLE(buffer);
int preamble = cw_get_hdr_preamble(buffer);
#ifdef WITH_DTLS
if (preamble != CAPWAP_PACKET_PREAMBLE && preamble != CAPWAP_DTLS_PACKET_PREAMBLE){

View File

@ -604,7 +604,7 @@ printf("Slept befor join resp\n");
wtpman->wtpinfo.name,wtpman->wtpinfo.location,
sock_addr2str(&wtpman->conn->addr));
//exit(0);
return 1;
}
@ -684,7 +684,7 @@ static void wtpman_run(void *arg)
*/
do {
int cfg_status_msgs[] = { CWMSG_IMAGE_DATA_REQUEST, CWMSG_CONFIGURATION_STATUS_REQUEST, -1 };
int cfg_status_msgs[] = { CWMSG_IMAGE_DATA_REQUEST, CW_MSG_CONFIGURATION_STATUS_REQUEST, -1 };
cwrmsg = conn_wait_for_request(wtpman->conn, cfg_status_msgs, timer);
if (!cwrmsg){
@ -704,7 +704,7 @@ static void wtpman_run(void *arg)
}
} while (cwrmsg->type != CWMSG_CONFIGURATION_STATUS_REQUEST);
} while (cwrmsg->type != CW_MSG_CONFIGURATION_STATUS_REQUEST);
@ -995,7 +995,7 @@ void wtpman_lw_addpacket(struct wtpman *wtpman, uint8_t *packet, int len)
*/
uint8_t * data;
/*
lw_foreach_msgelem(data,msgdata,msglen){
int eltype = LWMSGELEM_GET_TYPE(data);
int ellen = LWMSGELEM_GET_LEN(data);
@ -1006,7 +1006,7 @@ void wtpman_lw_addpacket(struct wtpman *wtpman, uint8_t *packet, int len)
printf ("ELEM TYPE: %d, LEN: %d\n",eltype,ellen);
}
*/
char wi[4096];
wtpinfo_print(wi,&wtpman->wtpinfo);

View File

@ -56,9 +56,22 @@ UTILOBJS= \
cw_util.o \
cw_format_version.o
# LWAPP objs
LWAPPOBJS = \
lw_checksum.o \
lw_readelem_wtp_name.o \
# LWAPP cisco vendor specific objs
LWAPPCISCOOBJS = \
lw_addelem.o
# cw_tohex.o\
#capwap_parse_ctrlhdr.o \
CAPWAPOBJS= \
cwmsg_init.o \
cwmsg_init_echo_request.o \
@ -134,9 +147,7 @@ CAPWAPOBJS= \
cw_readelem_wtp_reboot_statistics.o\
cwmsg_addelem_vendor_cisco_ap_timesync.o \
cwmsg_addelem_vendor_cisco_mwar_addr.o \
lw_checksum.o \
lw_readelem_wtp_board_data.o \
lw_readelem_wtp_name.o
#cwmsg_addelem_session_id.o
# process_msgelems_discovery_request.o \
@ -188,6 +199,7 @@ CONNOBJS= conn_create.o \
conn_get_message.o \
conn_get_response.o \
conn_prepare_configuration_update_request.o \
cw_prepare_configuration_status_request.o \
conn_prepare_request.o \
conn_prepare_image_data_request.o \
conn_send_request.o \
@ -204,7 +216,11 @@ BSTROBJS= bstr_create.o \
FRAGOBJS=fragman.o
OBJS=$(CONNOBJS) $(FRAGOBJS) $(SOCKOBJS) $(CAPWAPOBJS) $(WTPINFOOBJS) $(LOGOBJS) $(UTILOBJS) $(DTLSOBJS) $(BSTROBJS)
OBJS=$(CONNOBJS) $(FRAGOBJS) $(SOCKOBJS) $(CAPWAPOBJS) $(WTPINFOOBJS) \
$(LOGOBJS) $(UTILOBJS) $(DTLSOBJS) $(BSTROBJS) \
$(LWAPPOBJS) \
$(LWAPPCISCOOBJS)
O:=$(OBJS);
OBJS:=$(patsubst %.o,$(ARCH)/%.o,$(OBJS))

View File

@ -43,7 +43,7 @@ int acinfo_readelem_ac_name(struct ac_info * acinfo,int type, uint8_t *msgelem,
int acinfo_readelem_ac_descriptor(struct ac_info * acinfo,int type, uint8_t *msgelem, int len)
{
if (type != CWMSGELEM_AC_DESCRIPTOR)
if (type != CW_ELEM_AC_DESCRIPTOR)
return 0;
if (len<12)

View File

@ -31,29 +31,27 @@
#define CWVENDOR_CISCO_MWAR_ADDR 2
#define CWVENDOR_CISCO_RAD 3
#define CWVENDOR_CISCO_RAD_SLOT 4
#define CWVENDOR_CISCO_RAD_NAME LWMSGELEM_WTP_NAME /* 5 */
#define CWVENDOR_CISCO_RAD_NAME LW_ELEM_WTP_NAME /* 5 */
#define CWVENDOR_CISCO_MWAR 6
#define CWVENDOR_CISCO_BOARD DATA LWMSGELEM_WTP_BOARD_DATA /* 50 */
#define CWVENDOR_CISCO_BOARD DATA LW_ELEM_WTP_BOARD_DATA /* 50 */
#define CWVENDER_CISCO_AP_MODE_AND_TYPE 54
#define CWVENDOR_CISCO_AP_IP_ADDR 83
#define CWVENDOR_CISCO_SPAM_VENDOR_SPECIFIC 104
#define CWVENDOR_CISCO_AP_GROUP_NAME 123
#define CW_CISCO_AP_GROUP_NAME 123
#define CWVENDOR_CISCO_AP_LED_STATE_CONFIG 125
#define CWVENDOR_CISCO_AP_REGULATORY_DOMAIN 126
#define CW_ELEM_CISCO_AP_REGULATORY_DOMAIN 126
#define CWVENDOR_CISCO_AP_PRE_STD_SWITCH_CONFIG 137
#define CWVENDOR_CISCO_AP_POWER_INJECTOR_CONFIG 138
#define CWVENDOR_CISCO_AP_TIMESYNC 151
#define CW_CISCO_AP_TIMESYNC 151
#define CWVENDOR_CISCO_BOARD_DATA_OPTIONS 207
#define CWVENDOR_CISCO_MWAR_TYPE 208
#define CW_CISCO_BOARD_DATA_OPTIONS 207
#define CW_CISCO_MWAR_TYPE 208

View File

@ -127,20 +127,24 @@ static int process_message(struct conn * conn,struct cwrmsg *cwrmsg,int (*cb)(vo
static void cw_dbg_packet(struct conn * conn, uint8_t * packet, int len)
{
if (!cw_dbg_is_level(DBG_CW_PKT_OUT))
if (!cw_dbg_is_level(DBG_CW_PKT_IN))
return;
printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Header printer\n");
/* print the header */
char hdr[200];
hdr_print(hdr,packet,len);
if (!cw_dbg_is_level(DBG_CW_PKT_DMP)){
cw_dbg(DBG_CW_PKT_OUT,"Processing capwap packet from %s, len=%d\n%s",sock_addr2str(&conn->addr),len,hdr);
printf("the dumpi dumper\n");
cw_dbg(DBG_CW_PKT_IN,"Processing capwap packet from %s, len=%d\n%s",sock_addr2str(&conn->addr),len,hdr);
return;
}
printf("The super dumper\n");
cw_dbg_dmp(DBG_CW_PKT_DMP,packet,len,"Processing packet from %s, len=%d\n%s\n\tDump:",
sock_addr2str(&conn->addr),len,hdr
);
@ -156,7 +160,6 @@ static void cw_dbg_packet(struct conn * conn, uint8_t * packet, int len)
void conn_process_packet(struct conn * conn, uint8_t *packet, int len,int (*cb)(void*,struct cwrmsg*),void *cbarg)
{
cw_dbg_packet(conn,packet,len);
@ -183,6 +186,10 @@ void conn_process_packet(struct conn * conn, uint8_t *packet, int len,int (*cb)(
return;
}
printf("Debug packet **************************************************************************\n");
cw_dbg_packet(conn,packet,len);
int hlen = 4*((val >> 19) & 0x1f);
@ -220,6 +227,8 @@ void conn_process_packet(struct conn * conn, uint8_t *packet, int len,int (*cb)(
if (f==NULL)
return;
cw_dbg_packet(conn,f+4,*(uint32_t*)f);
if (!cwrmsg_init_ctrlhdr(conn,&cwrmsg,f+4,*(uint32_t*)f)){
free(f);
return;

View File

@ -32,6 +32,9 @@ int cw_foreach_msgelem(uint8_t * msgelems, int len,
int elen;
int i = 0;
do {
val = ntohl(*(uint32_t *) (msgelems + i));
type = (val >> 16) & 0xFFFF;
elen = val & 0xffff;
@ -44,8 +47,10 @@ printf("Bumm %d %d\n",i+elen+4,len);
return 0;
}
callback(arg, type, msgelems + i + 4, elen);
i += elen + 4;
printf("left = %d\n",len-i);
} while (i < len);
return 1;

View File

@ -265,7 +265,7 @@ void cw_dbg_msgelem_(int msg, int msgelem, const uint8_t * msgbuf, int len)
const char *elemname;
char vendorname[256];
if (msgelem == CWMSGELEM_VENDOR_SPECIFIC_PAYLOAD) {
if (msgelem == CW_ELEM_VENDOR_SPECIFIC_PAYLOAD) {
int vendor = ntohl(*((uint32_t *) msgbuf));
int type = ntohs(*((uint16_t *) (msgbuf + 4)));
sprintf(vendorname, "%s/%s/%d",

View File

@ -31,6 +31,7 @@ struct cw_dbg_cfgstrs cw_dbg_cfgstrs[] = {
{"rfc",DBG_CW_RFC},
{"pkt_in",DBG_CW_PKT_IN},
{"pkt_out",DBG_CW_PKT_OUT},
{"pkt_dtl",DBG_CW_PKT_DTL},
{"pkt",(DBG_CW_PKT_IN | DBG_CW_PKT_OUT)},
{"pkt_dmp",DBG_CW_PKT_DMP},
{"pkt_err",DBG_CW_PKT_ERR},

View File

@ -24,14 +24,14 @@
const char * cw_msgelemtostr(int elem)
{
switch (elem){
case CWMSGELEM_AC_DESCRIPTOR:
return "ac descriptor";
case CW_ELEM_AC_DESCRIPTOR:
return "AC descriptor";
/* AC IPv4 List 2
AC IPv6 List 3
*/
case CWMSGELEM_AC_NAME:
return "ac name";
case CW_ELEM_AC_NAME:
return "AC name";
/*
AC Name with Priority 5
AC Timestamp 6
@ -40,14 +40,14 @@ const char * cw_msgelemtostr(int elem)
Reserved 9
*/
case CWMSGELEM_CONTROL_IPV4_ADDRESS:
return "ctrl ipv4 addr";
return "Ctrl IPv4 addr";
case CWMSGELEM_CONTROL_IPV6_ADDRESS:
return "ctrl ipv6 addr";
return "ctrl IPv6 addr";
case CWMSGELEM_CAPWAP_LOCAL_IPV4_ADDRESS:
return "capwap local ipv4 addr";
return "CAPWAP local IPv4 addr";
case CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS:
return "capwap local ipv6 addr";
return "CAPWAP local IPv6 addr";
/* CAPWAP Timers 12
CAPWAP Transport Protocol 51
Data Transfer Data 13
@ -65,7 +65,7 @@ const char * cw_msgelemtostr(int elem)
Duplicate IPv6 Address 22
*/
case CWMSGELEM_ECN_SUPPORT:
return "ecn support";
return "ECN support";
/* Idle Timeout 23
*/
case CWMSGELEM_IMAGE_DATA:
@ -99,18 +99,18 @@ const char * cw_msgelemtostr(int elem)
/* Returned Message Element 34
*/
case CWMSGELEM_SESSION_ID:
case CW_ELEM_SESSION_ID:
return "session id";
case CWMSGELEM_STATISTICS_TIMER:
return "statistics timer";
return "Statistics Timer";
case CWMSGELEM_VENDOR_SPECIFIC_PAYLOAD:
return "vendor specific payload";
case CW_ELEM_VENDOR_SPECIFIC_PAYLOAD:
return "Vendor Specific Payload";
case CWMSGELEM_WTP_BOARD_DATA:
return "wtp board data";
return "WTP Board Data";
case CWMSGELEM_WTP_DESCRIPTOR:
return "wtp descriptor";
@ -122,8 +122,8 @@ const char * cw_msgelemtostr(int elem)
/* case CWMSGELEM_RESERVED_1:
return "reserved (42)";
*/
case CWMSGELEM_WTP_IPV4_IP_ADDR:
return "WTP IPv4 IP address";
case CW_ELEM_WTP_IPV4_IP_ADDRESS:
return "WTP IPv4 IP Address";
/*
Reserved 43

View File

@ -22,10 +22,10 @@ const char * cw_msgtostr(int type)
{
switch(type){
case CWMSG_DISCOVERY_REQUEST:
return "discovery request";
return "Discovery Request";
case CWMSG_DISCOVERY_RESPONSE:
return "discovery response";
return "Discovery Response";
case CWMSG_JOIN_REQUEST:
return "join request";
@ -33,11 +33,11 @@ const char * cw_msgtostr(int type)
case CWMSG_JOIN_RESPONSE:
return "join response";
case CWMSG_CONFIGURATION_STATUS_REQUEST:
return "configuration status request";
case CW_MSG_CONFIGURATION_STATUS_REQUEST:
return "Configuration Status Request";
case CWMSG_CONFIGURATION_STATUS_RESPONSE:
return "configuration status response";
case CW_MSG_CONFIGURATION_STATUS_RESPONSE:
return "Configuration Status Response";
case CWMSG_CONFIGURATION_UPDATE_REQUEST:
return "configuration update request";

View File

@ -77,7 +77,7 @@ static int read_subelem(struct ac_info* acinfo,int subtype,uint8_t *elem, int le
*/
int cw_readelem_ac_descriptor(struct ac_info * acinfo,int type, uint8_t *msgelem, int len)
{
if (type != CWMSGELEM_AC_DESCRIPTOR)
if (type != CW_ELEM_AC_DESCRIPTOR)
return 0;
if (len<12)

View File

@ -23,7 +23,7 @@
int cw_readelem_ac_name(uint8_t **dst, int type,uint8_t *msgelem, int len)
{
if (type != CWMSGELEM_AC_NAME)
if (type != CW_ELEM_AC_NAME)
return 0;
if (len > 512 ) {

View File

@ -9,7 +9,7 @@ int cw_readelem_capwap_local_ip_addr(struct sockaddr * local_ip, int type, uint8
{
switch (type){
case CWMSGELEM_CAPWAP_LOCAL_IPV4_ADDRESS:
case CWMSGELEM_WTP_IPV4_IP_ADDR:
case CW_ELEM_WTP_IPV4_IP_ADDRESS:
{
if (len!=4)
return -1;
@ -24,7 +24,7 @@ int cw_readelem_capwap_local_ip_addr(struct sockaddr * local_ip, int type, uint8
}
#ifdef WITH_IPV6
case CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS:
case CWMSGELEM_WTP_IPV6_IP_ADDR:
case CW_ELEM_WTP_IPV6_IP_ADDRESS:
{
if (len!=16)
return -1;

View File

@ -15,7 +15,7 @@ int cw_readelem_cisco_payload(void *data,int msgtype,int elem_id,uint8_t *msgele
switch (msgtype) {
case CWMSG_CONFIGURATION_STATUS_REQUEST:
case CW_MSG_CONFIGURATION_STATUS_REQUEST:
{
if (lw_readelem_wtp_board_data((struct wtpinfo*)data,elem_id,msgelem,len))
return 1;
@ -47,7 +47,7 @@ int cw_readelem_cisco_payload(void *data,int msgtype,int elem_id,uint8_t *msgele
int cw_readelem_vendor_specific_payload(void * data,int msgtype,int elemtype,uint8_t *msgelem, int len)
{
if (elemtype != CWMSGELEM_VENDOR_SPECIFIC_PAYLOAD)
if (elemtype != CW_ELEM_VENDOR_SPECIFIC_PAYLOAD)
return 0;
if (len < 6){
@ -64,6 +64,8 @@ int cw_readelem_vendor_specific_payload(void * data,int msgtype,int elemtype,uin
case CW_VENDOR_ID_CISCO:
return cw_readelem_cisco_payload(data,msgtype,elem_id,msgelem+6,elem_len);
default:
cw_dbg(DBG_ERR,"Can't read vendor specific payload. Vendor ID %d",vendor_id);
}

View File

@ -51,7 +51,7 @@ extern int cw_rand(uint8_t*dst, int len);
#define cw_timer_timeout(t) (time(NULL)>t ? 1 : 0)
/** Generic macroto to isolate bits from a dword */
/** Generic macro to isolate bits from a dword */
#define cw_get_dword_bits(src,start,len) ((~(0xFFFFFFFF<<len)) & (src >> (32 - start - len)))

View File

@ -41,7 +41,5 @@ extern void cwmsg_addelem_radio_operational_state(struct cwmsg * cwmsg, struct r
extern void cwmsg_addelem_vendor_cisco_mwar_addr(struct cwmsg *msg, struct conn *conn);
#define cwmsg_addelem_session_id(msg,session_id) \
cwmsg_addelem(msg,CWMSGELEM_SESSION_ID,bstr_data(session_id),bstr_len(session_id));
#endif

View File

@ -87,6 +87,6 @@ void cwmsg_addelem_ac_descriptor(struct cwmsg *msg,struct ac_info * acinfo,struc
}
cwmsg_addelem(msg,CWMSGELEM_AC_DESCRIPTOR,acd,len);
cwmsg_addelem(msg,CW_ELEM_AC_DESCRIPTOR,acd,len);
}

View File

@ -27,6 +27,6 @@ void cwmsg_addelem_ac_timestamp(struct cwmsg *msg)
uint32_t ntpt = t+(uint32_t)2398291200LL;
uint8_t c[4];
*((uint32_t*)c)= htonl(ntpt);
cwmsg_addelem(msg,CWMSGELEM_AC_TIMESTAMP,c,4);
cwmsg_addelem(msg,CW_ELEM_AC_TIMESTAMP,c,4);
}

View File

@ -27,6 +27,7 @@
#include "cwmsg.h"
#include "conn.h"
#include "sock.h" //Tube
void cwmsg_addelem_cw_local_ip_addr(struct cwmsg *msg, struct conn * conn)
{
@ -36,6 +37,8 @@ void cwmsg_addelem_cw_local_ip_addr(struct cwmsg *msg, struct conn * conn)
getsockname (conn->sock,(struct sockaddr *)&a,&alen);
int cw_mode = msg->capwap_mode;
cw_mode = CWMODE_CISCO;
switch (((struct sockaddr*)&a)->sa_family){
case AF_INET:
@ -43,9 +46,11 @@ void cwmsg_addelem_cw_local_ip_addr(struct cwmsg *msg, struct conn * conn)
struct sockaddr_in * sain = (struct sockaddr_in*)&a;
int id;
if (cw_mode == CWMODE_CISCO)
id = CWMSGELEM_WTP_IPV4_IP_ADDR;
id = CW_ELEM_WTP_IPV4_IP_ADDRESS;
else
id = CWMSGELEM_CAPWAP_LOCAL_IPV4_ADDRESS;
printf("Sending local ip %s\n",sock_addr2str(sain));
cwmsg_addelem(msg,id,(uint8_t*)&sain->sin_addr,4);
break;
@ -56,7 +61,7 @@ void cwmsg_addelem_cw_local_ip_addr(struct cwmsg *msg, struct conn * conn)
{
int id;
if (cw_mode == CWMODE_CISCO)
id = CWMSGELEM_WTP_IPV6_IP_ADDR;
id = CW_ELEM_WTP_IPV6_IP_ADDRESS;
else
id = CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS;
struct sockaddr_in6 * sain = (struct sockaddr_in6*)&a;

View File

@ -25,6 +25,6 @@ void cwmsg_addelem_vendor_cisco_ap_timesync(struct cwmsg *cwmsg)
{
//time_t t = htonl(time(NULL));
uint32_t t = htonl(time(NULL));
cwmsg_addelem_vendor_specific_payload(cwmsg, CW_VENDOR_ID_CISCO, CWVENDOR_CISCO_AP_TIMESYNC,
cwmsg_addelem_vendor_specific_payload(cwmsg, CW_VENDOR_ID_CISCO, CW_CISCO_AP_TIMESYNC,
(uint8_t *) & t, sizeof(t));
}

View File

@ -12,7 +12,7 @@
#include "conn.h"
#include "sock.h"
void cwmsg_addelem_vendor_cisco_mwar_addr(struct cwmsg *msg, struct conn *conn)
{
@ -21,10 +21,12 @@ void cwmsg_addelem_vendor_cisco_mwar_addr(struct cwmsg *msg, struct conn *conn)
switch (((struct sockaddr*)&conn->addr)->sa_family){
case AF_INET:
{
data[0]=0;
data[0]=1; /* mwar type */
data[5]=0;
data[6]=0;
printf("Adding mwar addr %s\n",sock_addr2str(&conn->addr));
struct sockaddr_in * sain = (struct sockaddr_in*)&conn->addr;
memcpy(data+1,(uint8_t*)&sain->sin_addr,4);
cwmsg_addelem_vendor_specific_payload(msg, CW_VENDOR_ID_CISCO,

View File

@ -36,7 +36,7 @@ void cwmsg_addelem_vendor_specific_payload(struct cwmsg *msg,int vendor_id, int
memcpy(buffer+6,payload,len);
cwmsg_addelem(msg,CWMSGELEM_VENDOR_SPECIFIC_PAYLOAD,buffer,len+6);
cwmsg_addelem(msg,CW_ELEM_VENDOR_SPECIFIC_PAYLOAD,buffer,len+6);
free(buffer);
}

View File

@ -49,7 +49,8 @@ void cwmsg_init(struct cwmsg * cwmsg, uint8_t *buffer, int type, int seqnum, str
if (hlen%4){
int n = hlen;
hlen = (hlen>>2)*4+4;
memset(buffer+n,0,hlen-n);
memset(buffer+n,0,hlen-n);
*(buffer+n)=0xc0;
}

View File

@ -36,7 +36,7 @@ struct eparm{
static int readelem(void * eparm,int type,uint8_t* msgelem,int len)
{
struct eparm * e = (struct eparm*)eparm;
cw_dbg_msgelem(CWMSG_CONFIGURATION_STATUS_REQUEST, type, msgelem,len);
cw_dbg_msgelem(CW_MSG_CONFIGURATION_STATUS_REQUEST, type, msgelem,len);
/* mandatory elements */
@ -59,7 +59,7 @@ static int readelem(void * eparm,int type,uint8_t* msgelem,int len)
/* non-mantatory elements */
if (cw_readelem_vendor_specific_payload
(e->wtpinfo, CWMSG_CONFIGURATION_STATUS_REQUEST, type, msgelem, len))
(e->wtpinfo, CW_MSG_CONFIGURATION_STATUS_REQUEST, type, msgelem, len))
return 1;
@ -73,7 +73,7 @@ foundX:
void cwread_configuration_status_request(struct wtpinfo * wtpinfo, uint8_t * msg, int len)
{
int mand[] = {
CWMSGELEM_AC_NAME,
CW_ELEM_AC_NAME,
CWMSGELEM_WTP_REBOOT_STATISTICS,
CWMSGELEM_RADIO_ADMINISTRATIVE_STATE,
CWMSGELEM_STATISTICS_TIMER,

View File

@ -68,8 +68,8 @@ static int acinfo_readelem_discovery_resp(void * eparm,int type,uint8_t* msgelem
void cwread_discovery_response(struct ac_info * acinfo, uint8_t * msg, int len)
{
int mand[] = {
CWMSGELEM_AC_DESCRIPTOR,
CWMSGELEM_AC_NAME,
CW_ELEM_AC_DESCRIPTOR,
CW_ELEM_AC_NAME,
XCWMSGELEM_CAPWAP_CONTROL_IP_ADDRESS,
XCWMSGELEM_CAPWAP_RADIO_INFO,

View File

@ -14,7 +14,7 @@ void cwmsg_addelem_capwap_timers(struct cwmsg *msg,int discovery,int echo_reques
void cwsend_conf_status_response(struct conn * conn,int seqnum, int rc, struct radioinfo * radioinfo, struct ac_info * acinfo, struct wtpinfo * wtpinfo)
{
struct cwmsg * cwmsg = &conn->resp_msg;
cwmsg_init(cwmsg,conn->resp_buffer,CWMSG_CONFIGURATION_STATUS_RESPONSE,seqnum,NULL);
cwmsg_init(cwmsg,conn->resp_buffer,CW_MSG_CONFIGURATION_STATUS_RESPONSE,seqnum,NULL);
cwmsg_addelem_capwap_timers(cwmsg,120,15);
/*

View File

@ -35,7 +35,7 @@ int cwsend_discovery_request(struct conn *conn, struct radioinfo *radioinfo,
struct cwmsg cwmsg;
cwmsg_init(&cwmsg, buffer, CWMSG_DISCOVERY_REQUEST, conn_get_next_seqnum(conn),
NULL /*radioinfo */ );
radioinfo );
cwmsg.capwap_mode = conn->capwap_mode;
@ -67,6 +67,12 @@ int cwsend_discovery_request(struct conn *conn, struct radioinfo *radioinfo,
switch (cwmsg.capwap_mode) {
case CWMODE_CISCO:
cwmsg_addelem_vendor_cisco_rad_name(&cwmsg, (uint8_t *) wtpinfo->name);
uint8_t data207[4] = {1,1,0,1};
cwmsg_addelem_vendor_specific_payload(&cwmsg,CW_VENDOR_ID_CISCO,
CW_CISCO_BOARD_DATA_OPTIONS,data207,4);
break;
default:

View File

@ -41,7 +41,7 @@ void cwsend_discovery_response(struct conn *conn, int seqnum, struct radioinfo *
cwmsg_addelem_ac_descriptor(cwmsg, acinfo,wtpinfo);
cwmsg_addelem(cwmsg, CWMSGELEM_AC_NAME, (uint8_t *) acinfo->ac_name,
cwmsg_addelem(cwmsg, CW_ELEM_AC_NAME, (uint8_t *) acinfo->ac_name,
strlen((char *) acinfo->ac_name));
cwmsg_addelem_wtp_radio_infos(cwmsg, acinfo->radioinfos);
@ -52,8 +52,12 @@ void cwsend_discovery_response(struct conn *conn, int seqnum, struct radioinfo *
switch (cwmsg->capwap_mode) {
case CWMODE_CISCO:
case CWMODE_CIPWAP:
{
cwmsg_addelem_vendor_cisco_ap_timesync(cwmsg);
uint8_t mwtype=1;
cwmsg_addelem_vendor_s_payload(cwmsg,CW_VENDOR_ID_CISCO,CW_CISCO_MWAR_TYPE,&mwtype,1);
break;
}
default:
break;

View File

@ -21,17 +21,30 @@
#include "capwap.h"
#include "capwap_cisco.h"
#include "lwapp_cisco.h"
#include "conn.h"
#include "cwmsg.h"
#include "sock.h"
#include "acinfo.h" //Tube
int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct wtpinfo *wtpinfo)
{
uint8_t buffer[CWMSG_MAX_SIZE];
struct cwmsg cwmsg;
//radioinfo->rmac=0;
cwmsg_init(&cwmsg, buffer, CWMSG_JOIN_REQUEST, conn_get_next_seqnum(conn), radioinfo);
cwmsg.capwap_mode = conn->capwap_mode;
// printf("Rad info rmac %s\n",sock_hwaddr2str(bstr_data(radioinfo->rmac),bstr_len(radioinfo->rmac)));
/* Mandatory elements */
/* location data */
@ -57,20 +70,38 @@ int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct w
/* WTP MAC type */
cwmsg_addelem(&cwmsg, CWMSGELEM_WTP_MAC_TYPE, &wtpinfo->mac_type, sizeof(uint8_t));
/* WTP radio information elements */
cwmsg_addelem_wtp_radio_infos(&cwmsg, wtpinfo->radioinfo);
/* local ip address */
cwmsg_addelem_cw_local_ip_addr(&cwmsg, conn);
/* maximum message length */
uint16_t l = htons(wtpinfo->max_msg_len);
cwmsg_addelem(&cwmsg, CWMSGELEM_MAXIMUM_MESSAGE_LENGTH, (uint8_t *) & l, sizeof(l));
switch (conn->capwap_mode) {
case CWMODE_CISCO:
cwmsg_addelem_vendor_cisco_mwar_addr(&cwmsg,conn);
uint8_t data207[4] = {11,77,30,31};
uint8_t data207[4] = {1,1,0,1};
cwmsg_addelem_vendor_specific_payload(&cwmsg,CW_VENDOR_ID_CISCO,
CWVENDOR_CISCO_BOARD_DATA_OPTIONS,data207,4);
CW_CISCO_BOARD_DATA_OPTIONS,data207,4);
cwmsg_addelem_vendor_specific_payload(&cwmsg,CW_VENDOR_ID_CISCO,
// cwmsg_ae(cw_addelem_vendor_specific_payload(&cwmsg,CW_VENDOR_ID_CISCO,
// CWVENDOR_CISCO_BOARD_DATA_OPTIONS,data207,4);
/* cwmsg_addelem_vendor_specific_payload(&cwmsg,CW_VENDOR_ID_CISCO,
CWVENDOR_CISCO_AP_GROUP_NAME,(uint8_t*)"Tobias",strlen("Tobias"));
*/
cwmsg_addelem_vendor_s_payload(&cwmsg, CW_VENDOR_ID_CISCO,
CW_CISCO_AP_GROUP_NAME,(uint8_t *)"default-group",strlen("default-group"));
break;
@ -80,15 +111,38 @@ int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct w
sizeof(uint8_t));
}
/* local ip address */
cwmsg_addelem_cw_local_ip_addr(&cwmsg, conn);
/* WTP radio information elements */
cwmsg_addelem_wtp_radio_infos(&cwmsg, wtpinfo->radioinfo);
/* Non-mandatory elements */
/* maximum message length */
uint16_t l = htons(wtpinfo->max_msg_len);
cwmsg_addelem(&cwmsg, CWMSGELEM_MAXIMUM_MESSAGE_LENGTH, (uint8_t *) & l, sizeof(l));
switch (conn->capwap_mode) {
case CWMODE_CISCO:
{
uint8_t mtu[2048];
int l = lw_put_cisco_path_mtu(mtu,1485,1101);
printf("Len = %d\n",l);
// cwmsg_addelem_vendor_specific_payload(&cwmsg,LW_VENDOR_CISCO,
// LW_ELEM_VENDOR_SPECIFIC,mtu,l);
// (&cwmsg)->pos+=4;
struct ac_info acinfo;
extern struct ac_info wtp_acinfo;
// memset(&acinfo,0,sizeof(struct ac_info));
// cwmsg_addelem_ac_descriptor(&cwmsg,&wtp_acinfo,wtpinfo);
}
}
printf("MTU %d\n",conn->mtu);
return conn_send_cwmsg(conn, &cwmsg);
}

View File

@ -17,7 +17,7 @@ void cwsend_join_response(struct conn *conn, int seqnum, int rc, struct radioinf
cwmsg_addelem_result_code(cwmsg, rc);
cwmsg_addelem_ac_descriptor(cwmsg, acinfo,wtpinfo);
cwmsg_addelem(cwmsg, CWMSGELEM_AC_NAME, acinfo->ac_name, strlen((char *) acinfo->ac_name));
cwmsg_addelem(cwmsg, CW_ELEM_AC_NAME, acinfo->ac_name, strlen((char *) acinfo->ac_name));
cwmsg_addelem(cwmsg, CWMSGELEM_ECN_SUPPORT, &acinfo->ecn_support, sizeof(uint8_t));
cwmsg_addelem_ctrl_ip_addrs(cwmsg, acinfo);
// cwmsg_addelem_cw_local_ip_addr(cwmsg,conn);

View File

@ -1,10 +1,15 @@
#include "gnutls/dtls.h"
#include "dtls.h"
#include "dtls_gnutls.h"
#include "conn.h"
#include "cw_log.h"
int dtls_gnutls_connect(struct conn *conn)
{
struct dtls_gnutls_data * d;
@ -13,6 +18,9 @@ int dtls_gnutls_connect(struct conn *conn)
// gnutls_dh_set_prime_bits(d->session, 512);
gnutls_handshake_set_timeout(d->session,GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT);
gnutls_dtls_set_data_mtu(d->session,1500);
gnutls_dtls_set_mtu(d->session,1500);
int rc;
do {
rc = gnutls_handshake(d->session);

View File

@ -21,14 +21,14 @@
#include <stdio.h>
#include "capwap.h"
#include "sock.h"
int hdr_print(char *str, uint8_t *packet, int len)
{
printf("The readl header printer\n");
char *s = str;
@ -38,7 +38,8 @@ int hdr_print(char *str, uint8_t *packet, int len)
return s-str;
}
int preamble = CWTH_GET_PREAMBLE(packet);
int preamble = cw_get_hdr_preamble(packet); //CWTH_GET_PREAMBLE(packet);
if (preamble==01){
s+=sprintf(s,"\tEncrypted data.");
return s-str;
@ -57,21 +58,29 @@ int hdr_print(char *str, uint8_t *packet, int len)
int hlen = CWTH_GET_HLEN(packet);
int rid = CWTH_GET_RID(packet);
int wbid = CWTH_GET_WBID(packet);
int hlen = cw_get_hdr_hlen(packet); //CWTH_GET_HLEN(packet);
int rid = cw_get_hdr_rid(packet);
int wbid = cw_get_hdr_wbid(packet);
s+=sprintf(s,"\tHLEN: %d, RID: %02X, WBID %02X",hlen,rid,wbid);
s+=sprintf(s," Flags: (T=%d,F=%d,L=%d,W=%d,M=%d,K=%d)\n",
CWTH_GET_FLAG_T(packet),
CWTH_GET_FLAG_F(packet),
CWTH_GET_FLAG_L(packet),
CWTH_GET_FLAG_W(packet),
CWTH_GET_FLAG_M(packet),
CWTH_GET_FLAG_K(packet)
cw_get_hdr_flag_t(packet),
cw_get_hdr_flag_f(packet),
cw_get_hdr_flag_l(packet),
cw_get_hdr_flag_w(packet),
cw_get_hdr_flag_m(packet),
cw_get_hdr_flag_k(packet)
);
if (cw_get_hdr_flag_m(packet)){
uint8_t * rmac = cw_get_hdr_rmac(packet);
s+=sprintf(s,"\tRadio MAC: %s\n",sock_hwaddr2str(bstr_data(rmac),
bstr_len(rmac)));
}
if (len < 8){
@ -79,13 +88,13 @@ int hdr_print(char *str, uint8_t *packet, int len)
return s-str;
}
int frag_id = CWTH_GET_FRAGID(packet);
int frag_offs = CWTH_GET_FRAGOFFSET(packet);
int frag_id = cw_get_hdr_fragid(packet);
int frag_offs = cw_get_hdr_fragoffset(packet);
s+=sprintf(s,"\tFrag Id: %d, Frag Offs:: %d\n",frag_id,frag_offs);
int bhlen = 4*hlen;
if (CWTH_GET_FLAG_F(packet) && frag_offs!=0){
if (cw_get_hdr_flag_f(packet) && frag_offs!=0){
s+=sprintf(s,"\tFragment data ...");
return s-str;
}

View File

@ -16,13 +16,20 @@
*/
/**
*@file
*@brief Implements lw_checksum.
*/
#include "lwapp.h"
/**
* Calculate the 16-bit checksum for LWAPP image data message
* elements with opcode 3 - also used by Cisco in CAPWAP
* @param d pointer to data to calulate the checksum for
* @param len length of data
* @return the calculated checksum.
*/
uint16_t lw_checksum(uint8_t * d, int len)
{
int32_t sum = 0;

View File

@ -22,7 +22,7 @@
*/
int lw_readelem_wtp_board_data(struct wtpinfo *wtpinfo, int type, uint8_t *msgelem, int len)
{
if (type != LWMSGELEM_WTP_BOARD_DATA)
if (type != LW_ELEM_WTP_BOARD_DATA)
return 0;
if ( len != 46 ) {

View File

@ -37,7 +37,7 @@
*/
int lw_readelem_wtp_name(uint8_t ** dst, int type, uint8_t * msgelem, int len)
{
if (type != LWMSGELEM_WTP_NAME)
if (type != LW_ELEM_WTP_NAME)
return 0;

View File

@ -67,11 +67,13 @@
#define LWMSG_DISCOVERY_REQUEST 1
#define LWMSG_DISCOVERY_RESPONSE 2
#define LWMSG_DISCOVERY_REQUEST 1
#define LWMSG_DISCOVERY_RESPONSE 2
/* Join Request 3
Join Response 4
#define LW_MSG_JOIN_REQUEST 3
#define LW_MSG_JOIN_RESPONSE 4
/*
Join ACK 5
Join Confirm 6
Unused 7-9
@ -99,17 +101,44 @@
/* LWAPP message elements */
#define LWMSGELEM_WTP_DESCRIPTOR 3
#define LWMSGELEM_WTP_NAME 5
#define LW_ELEM_AC_ADDRESS 2
#define LW_ELEM_WTP_DESCRIPTOR 3
#define LW_ELEM_WTP_NAME 5
#define LW_ELEM_AC_DESCRIPTOR 6
#define LW_ELEM_AC_NAME 31
#define LWMSGELEM_SUPPORTED_RATES 16
#define LW_ELEM_TEST 18
#define LWMSGELEM_WTP_BOARD_DATA 50
#define LW_ELEM_WTP_BOARD_DATA 50
#define LW_ELEM_VENDOR_SPECIFIC 104
/* useful macros and inline functions */
#define lw_foreach_elem(d,msg,len) for(d=msg; d<msg+len; d=d+3+LWMSGELEM_GET_LEN(d))
static inline int lw_put_dword(uint8_t *dst, uint32_t dw){
*((uint32_t*)(dst)) = htonl(dw);
return 4;
}
static inline int lw_put_word(uint8_t *dst, uint16_t w){
*((uint16_t*)(dst)) = htons(w);
return 2;
}
static inline int lw_put_elem_hdr(uint8_t *dst,uint8_t type,uint16_t len)
{
*dst=type;
*((uint16_t*)(dst+1)) = htons(len);
return len;
}
/* useful macros */
#define lw_foreach_msgelem(d,msg,len) for(d=msg; d<msg+len; d=d+3+LWMSGELEM_GET_LEN(d))
/* function proto types */
@ -120,4 +149,5 @@ extern int lw_readelem_wtp_name(bstr_t * dst, int type, uint8_t * msgelem, int l
#endif

View File

@ -66,7 +66,7 @@ struct wtpinfo{
bstr_t session_id;
// int session_id_len;
struct radioinfo radioinfo[31];

View File

@ -28,7 +28,7 @@
int wtpinfo_lwreadelem_wtp_descriptor(struct wtpinfo * wtpinfo, int type, uint8_t *msgelem, int len)
{
if (type != LWMSGELEM_WTP_DESCRIPTOR)
if (type != LW_ELEM_WTP_DESCRIPTOR)
return 0;
/* if (len!=16)

View File

@ -10,7 +10,7 @@
int wtpinfo_readelem_session_id(struct wtpinfo * wtpinfo, int type, uint8_t * msgelem, int len)
{
if (type != CWMSGELEM_SESSION_ID)
if (type != CW_ELEM_SESSION_ID)
return 0;
wtpinfo->session_id = bstr_create(msgelem,len);

View File

@ -1,7 +1,13 @@
#include "capwap/conn.h"
#include "wtp_interface.h"
int configure()
{
struct conn * conn = get_conn();
struct wtpinfo * wtpinfo = get_wtpinfo();
cw_prepare_configuration_status_request(conn,wtpinfo);
conn_send_request(conn);
}

View File

@ -50,12 +50,13 @@ static int acprint(void *p,void*d) //,int ctr)
ACIP * ip = (ACIP*)d;
char str[100];
sock_addrtostr((struct sockaddr*)&ip->ip,str,100);
// printf("ACIP: %s\n",str);
// printf("CTR: %i\n",ip->wtp_count);
printf("ACIP: %s\n",str);
printf("CTR: %i\n",ip->wtp_count);
return 1;
}
struct ac_info wtp_acinfo;
static int msg_cb(void *priv,struct cwrmsg * cwrmsg)
@ -75,22 +76,22 @@ static int msg_cb(void *priv,struct cwrmsg * cwrmsg)
*/
struct ac_info acinfo;
memset(&acinfo,0,sizeof(acinfo));
struct ac_info * acinfo = &wtp_acinfo;
memset(acinfo,0,sizeof(struct ac_info));
acinfo.aciplist = di->aciplist;
acinfo->aciplist = di->aciplist;
cwread_discovery_response(&acinfo,cwrmsg->msgelems,cwrmsg->msgelems_len);
cwread_discovery_response(acinfo,cwrmsg->msgelems,cwrmsg->msgelems_len);
char ai [4096];
acinfo_print(ai,&acinfo);
acinfo_print(ai,acinfo);
printf("AC INFO\n%s",ai);
@ -111,7 +112,7 @@ static int msg_cb(void *priv,struct cwrmsg * cwrmsg)
printf("ACL COUNT: %i\n",acinfo.aciplist->count);
*/
aciplist_foreach(acinfo.aciplist,acprint,0);
aciplist_foreach(acinfo->aciplist,acprint,0);
// responses++;
//
@ -300,7 +301,6 @@ ACIPLIST * do_discovery(const char *acaddr)
discovery_count++;
/* create socket */
int sockfd;
int opt;
sockfd=socket(res->ai_family,SOCK_DGRAM,0);
@ -324,17 +324,20 @@ ACIPLIST * do_discovery(const char *acaddr)
do_discover_conn(conn,&di);
close(sockfd);
if ( di.aciplist->count != 0)
if ( di.aciplist->count != 0){
set_sock(sockfd);
break;
}
close(sockfd);
}
freeaddrinfo(res0);
if (di.aciplist->count){
// cw_log_debug2("Discover responses received: %i\n",di.response_count);
cw_dbg(DBG_CW_INFO,"Discovery responses received: %i\n",di.response_count);
return di.aciplist;
}

View File

@ -62,19 +62,23 @@ for(int i=0; i<10; i++){
// }while(cwrmsg==0);
printf("SEQQQQS %d %d\n",cwrmsg->seqnum,conn->seqnum);
if(!cwrmsg) {
exit(0);
}
printf("SEQS %d %d\n",cwrmsg->type,conn->seqnum);
// cw_log_debug0("Received message %i",cwrmsg->seqnum);
if (cwrmsg->type != CWMSG_JOIN_RESPONSE || cwrmsg->seqnum != conn->seqnum){
printf("Wrong messagei %d %d\n",cwrmsg->seqnum,conn->seqnum);
printf("Wrong message %d %d\n",cwrmsg->type,conn->seqnum);
}
struct ac_info acinfo;
memset(&acinfo,0,sizeof(acinfo));
acinfo.result_code=99;
cwread_join_response(&acinfo,cwrmsg->msgelems,cwrmsg->msgelems_len);
@ -91,7 +95,9 @@ int join(struct sockaddr *sa)
int sockfd;
int rc;
sockfd = socket(AF_INET,SOCK_DGRAM,0);
// sockfd = socket(AF_INET,SOCK_DGRAM,0);
sockfd = get_sock();
if (sockfd==-1){
cw_log(LOG_ERR,"Can't create socket: %s\n",strerror(errno));
return -1;
@ -111,6 +117,7 @@ int join(struct sockaddr *sa)
struct conn * conn = get_conn();
conn->capwap_mode = CWMODE_CISCO;
conn->seqnum=-1;
conn->sock=sockfd;

View File

@ -99,11 +99,10 @@ printf("Back from conn send req\n");
if (rc==0){
printf("Error !\n");
exit(0);
dtls_shutdown(conn);
// dtls_shutdown(conn);
// cw_log_debug1("Connection lost, no echo response");
return 0;
// return 0;
}
echo_interval_timer=time(NULL);
}

View File

@ -148,7 +148,7 @@ char * default_ac_list[] = {
// "192.168.0.255",
"255.255.255.255",
// "224.0.1.140",
// "192.168.0.12"
//"192.168.0.77"
};
int wtpconf_ac_list()

View File

@ -6,6 +6,7 @@
#include "capwap/acinfo.h"
#include "capwap/conn.h"
#include "capwap/capwap_80211.h"
#include "capwap/cw_log.h"
#include "wtp_conf.h"
#include "wtp_interface.h"
@ -30,6 +31,8 @@ struct wtpinfo * get_wtpinfo()
}
wtpinfo->radios_in_use=2;
wtpinfo->encryption_cap=1;
wtpinfo->serial_no=conf_serial_no;
@ -56,17 +59,22 @@ struct wtpinfo * get_wtpinfo()
wtpinfo->macaddress=conf_macaddress;
wtpinfo->macaddress_len=conf_macaddress_len;
wtpinfo->mac_type=0;
wtpinfo->max_msg_len=14000;
wtpinfo->mac_type=1;
// wtpinfo->session_id = malloc(8);
// wtpinfo->session_id_len = cw_rand(wtpinfo->session_id,8);
uint8_t sessid[4];
int sidl = cw_rand(sessid,4);
wtpinfo->session_id = bstr_create(sessid,sidl);
memset(sessid,0,4);
int sidl = cw_rand(sessid+2,2);
wtpinfo->session_id = bstr_create(sessid,4);
wtpinfo->frame_tunnel_mode=1;
wtpinfo->frame_tunnel_mode=4;
return wtpinfo;
}
@ -86,6 +94,22 @@ ACIPLIST * order_aciplist(ACIPLIST *aciplistin)
}
static int sockfd = -1;
int get_sock()
{
return sockfd;
}
int set_sock(int sock)
{
sockfd = sock;
}
static struct conn * conn=0;
struct conn * get_conn()
{

View File

@ -81,10 +81,17 @@ int do_connect(void *priv,void *data)
if (!rc)
return 1;
rc = configure();
printf("Sleep after oin\n");
sleep(5);
printf("Go conf\n");
// rc = join(&ip->ip);
// if (!rc)
// return 1;
rc = configure();
run (get_conn());
return 0;
}

View File

@ -1218,11 +1218,13 @@ int wtpdrv_get_radioinfo(int rid,struct radioinfo * radioinfo)
radioinfo->rid=rid;
//uint8_t rm[8]="12345600";
uint8_t rm[8]={0x00,0x19,0xdb,0xe0,0x93,0x27};
// uint8_t rm[8]={0x00,0x19,0xdb,0xe0,0x93,0x27};
// uint8_t rm[8]={0x00,0x3a,0x99,0x02,0xfa,0xc0};
uint8_t rm[8]={0x68,0x67,0x65,0x64,0x63,0x62};
radioinfo->rmac = bstr_create(rm,6);
radioinfo->type|=CW_80211_RADIO_TYPE_B; //CWRADIO_TYPE_N;
radioinfo->type|=rid+1; //CW_80211_RADIO_TYPE_B; //CWRADIO_TYPE_N;
/*
struct wpa_driver_ops * drv = wpa_drivers[0];