From 4a20f80250dd94779b7cb251ed2ebf11d54eb3e9 Mon Sep 17 00:00:00 2001
From: "7u83@mail.ru" <7u83@mail.ru@noemail.net>
Date: Sat, 14 Mar 2015 20:41:50 +0000
Subject: [PATCH] More cisco-compatibility.
FossilOrigin-Name: 04ec8be34c8f04e70ce803fb8f47f72f426bdc7cf85edced8f09d3a9f1f0c50d
---
src/ac/wtpman.c | 4 +-
src/capwap/Makefile | 5 +-
src/capwap/acinfo.h | 4 +
src/capwap/bstr.h | 23 ++++
src/capwap/bstr_create_from_cfgstr.c | 6 +-
src/capwap/capwap_cisco.h | 10 +-
src/capwap/cw_addelem_capwap_local_ip_addr.c | 79 +++++++++++++
src/capwap/cw_readelem_wtp_descriptor.c | 112 +++++++++++++++++++
src/capwap/cwmsg_addelem_wtp_board_data.c | 40 ++++---
src/capwap/cwmsg_addelem_wtp_descriptor.c | 3 +-
src/capwap/cwmsg_init.c | 9 +-
src/capwap/cwread_join_response.c | 14 ++-
src/capwap/cwsend_join_request.c | 12 ++
src/capwap/process_join_request.c | 2 +-
src/capwap/radioinfo.h | 5 +-
src/capwap/wtpinfo.h | 8 +-
src/capwap/wtpinfo_print.c | 37 +++++-
src/capwap/wtpinfo_readelem_wtp_board_data.c | 8 +-
src/capwap/wtpinfo_readelem_wtp_descriptor.c | 43 ++++---
src/wtp/conf_uci.c | 12 ++
src/wtp/discovery.c | 7 +-
src/wtp/join.c | 24 +++-
src/wtp/wtp_conf.c | 10 +-
src/wtp/wtp_conf.h | 14 ++-
src/wtp/wtp_interface.c | 7 +-
src/wtp/wtpdrv.c | 5 +
26 files changed, 439 insertions(+), 64 deletions(-)
create mode 100644 src/capwap/cw_addelem_capwap_local_ip_addr.c
create mode 100644 src/capwap/cw_readelem_wtp_descriptor.c
diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c
index 4427f7a0..631aaee0 100644
--- a/src/ac/wtpman.c
+++ b/src/ac/wtpman.c
@@ -379,8 +379,8 @@ static void wtpman_run_discovery(void *arg)
struct radioinfo radioinfo;
radioinfo.rid = cwrmsg->rid;
- memcpy(radioinfo.rmac, cwrmsg->rmac,8);
- radioinfo.rmac[0]=0;
+// memcpy(radioinfo.rmac, cwrmsg->rmac,8);
+// radioinfo.rmac[0]=0;
struct ac_info * acinfo = get_acinfo();
diff --git a/src/capwap/Makefile b/src/capwap/Makefile
index c42a64cd..c3b361c4 100644
--- a/src/capwap/Makefile
+++ b/src/capwap/Makefile
@@ -94,7 +94,6 @@ CAPWAPOBJS= \
cwread_discovery_request.o\
cwread_change_state_event_request.o\
cwread_wtp_event_request.o \
- process_msgelems_discovery_request.o \
process_conf_status_request.o \
process_join_request.o \
wtpinfo_readelem_wtp_board_data.o \
@@ -132,6 +131,7 @@ CAPWAPOBJS= \
cwmsg_addelem_vendor_cisco_mwar_addr.o \
lw_checksum.o \
#cwmsg_addelem_session_id.o
+# process_msgelems_discovery_request.o \
# cwsend_image_data_request.o
# cwmsg_set_control_header.o
@@ -185,7 +185,8 @@ CONNOBJS= conn.o \
BSTROBJS= bstr_create.o \
bstr_create_from_cfgstr.o \
- bstr_replace.o
+ bstr_replace.o \
+ bstr_to_str.o
FRAGOBJS=fragman.o
diff --git a/src/capwap/acinfo.h b/src/capwap/acinfo.h
index 393a78f4..fdb117f4 100644
--- a/src/capwap/acinfo.h
+++ b/src/capwap/acinfo.h
@@ -53,8 +53,12 @@ struct ac_info{
struct sockaddr_storage local_ip;
/* wireless bindings */
+
+
struct radioinfo radioinfos[32];
+ uint32_t result_code;
+
};
typedef struct ac_info ACINFO;
diff --git a/src/capwap/bstr.h b/src/capwap/bstr.h
index 53cd7d8b..eb2c479c 100644
--- a/src/capwap/bstr.h
+++ b/src/capwap/bstr.h
@@ -1,3 +1,21 @@
+/*
+ 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 .
+
+*/
+
#ifndef __BSTR_H
#define __BSTR_H
@@ -10,9 +28,14 @@ extern uint8_t * bstr_create(uint8_t *data, uint8_t len);
extern uint8_t * bstr_create_from_cfgstr(const char * s);
extern uint8_t * bstr_replace( uint8_t ** dst, uint8_t * bstr);
+extern int bstr_to_str(char *dst, bstr_t str,char * def);
+
#define bstr_len(s) (*(s))
#define bstr_data(s) (s+1)
+#define bstr_size(len) (len+1)
+
+#define BSTR_MAX_LEN 254
#endif
diff --git a/src/capwap/bstr_create_from_cfgstr.c b/src/capwap/bstr_create_from_cfgstr.c
index d818d01f..793cb26e 100644
--- a/src/capwap/bstr_create_from_cfgstr.c
+++ b/src/capwap/bstr_create_from_cfgstr.c
@@ -31,13 +31,13 @@ uint8_t * bstr_create_from_cfgstr(const char * s)
if (s[0]!='.')
- return bstr_create((uint8_t*)s,l+1);
+ return bstr_create((uint8_t*)s,l);
if (l<=2)
- return bstr_create((uint8_t*)s,l+1);
+ return bstr_create((uint8_t*)s,l);
if (s[1]=='.')
- return bstr_create((uint8_t*)s+1,l);
+ return bstr_create((uint8_t*)s+1,l-1);
if (s[1]=='x'){
uint8_t * ns=0;
diff --git a/src/capwap/capwap_cisco.h b/src/capwap/capwap_cisco.h
index 7d056d1e..06544a66 100644
--- a/src/capwap/capwap_cisco.h
+++ b/src/capwap/capwap_cisco.h
@@ -27,9 +27,11 @@
#define CWVENDOR_CISCO_RAD_NAME 5
#define CWVENDOR_CISCO_MWAR 6
-#define CWVENDOR_CISCO_AP_GROUP_NAME 124
+#define CWVENDOR_CISCO_AP_GROUP_NAME 123
#define CWVENDOR_CISCO_AP_TIMESYNC 151
+#define CWVENDOR_CISCO_PL207 207
+
extern void cwmsg_addelem_vendor_cisco_ap_timesync(struct cwmsg * cwmsg);
@@ -38,6 +40,12 @@ extern void cwmsg_addelem_vendor_cisco_ap_timesync(struct cwmsg * cwmsg);
#define cwmsg_addelem_vendor_cisco_rad_name(cwmsg,str) \
cwmsg_addelem_vendor_specific_payload(cwmsg,CW_VENDOR_ID_CISCO, \
CWVENDOR_CISCO_RAD_NAME,str,strlen((char*)str))
+/* group name payload */
+#define cwmsg_addelem_vendor_cisco_group_name(cwmsg,str) \
+ cwmsg_addelem_vendor_secific_payload(cwmsg,CW_VENDOR_ID_CISCO, \
+ CWVENDOR_CISCO_GROUP_NAME,str,strlen((char*)str));
+/* payload 207 */
+
#endif
diff --git a/src/capwap/cw_addelem_capwap_local_ip_addr.c b/src/capwap/cw_addelem_capwap_local_ip_addr.c
new file mode 100644
index 00000000..deeb0b1a
--- /dev/null
+++ b/src/capwap/cw_addelem_capwap_local_ip_addr.c
@@ -0,0 +1,79 @@
+/*
+ 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
+#include
+#include
+
+#include
+
+
+#include "capwap.h"
+#include "cwmsg.h"
+#include "conn.h"
+
+
+uint8_t * cw_addelem(uint8_t * buf,int type, uint8_t *elem, int len)
+{
+ uint32_t val = type<<16|len;
+ *((uint32_t*)(buf))=htonl(val);
+ buf+=4;
+ memcpy(buf,elem,len);
+ return buf+len;
+}
+
+
+void cw_addelem_capwap_local_ip_addr(struct cwmsg *msg, int sock, int cw_mode)
+{
+ struct sockaddr_storage a;
+ socklen_t alen = sizeof(struct sockaddr_storage);
+ getsockname (sock,(struct sockaddr *)&a,&alen);
+
+ int cw_mode = cwmsg->capwap_mode;
+
+ switch (((struct sockaddr*)&a)->sa_family){
+ case AF_INET:
+ {
+ struct sockaddr_in * sain = (struct sockaddr_in*)&a;
+ int id;
+ if (cw_mode == CWMODE_CISCO)
+ id = CWMSGELEM_WTP_IPV4_IP_ADDR;
+ else
+ id = CWMSGELEM_CAPWAP_LOCAL_IPV4_ADDRESS;
+
+ cwmsg_addelem(msg,id,(uint8_t*)&sain->sin_addr,4);
+ break;
+ }
+
+
+ case AF_INET6:
+ {
+ int id;
+ if (cw_mode == CWMODE_CISCO)
+ id = CWMSGELEM_WTP_IPV6_IP_ADDR;
+ else
+ id = CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS;
+ struct sockaddr_in6 * sain = (struct sockaddr_in6*)&a;
+ return cwmsg_addelem(msg,id,(uint8_t*)&sain->sin6_addr,16);
+ }
+ break;
+ }
+
+}
+
+
diff --git a/src/capwap/cw_readelem_wtp_descriptor.c b/src/capwap/cw_readelem_wtp_descriptor.c
new file mode 100644
index 00000000..59f56c12
--- /dev/null
+++ b/src/capwap/cw_readelem_wtp_descriptor.c
@@ -0,0 +1,112 @@
+/*
+ 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 "capwap.h"
+#include "wtpinfo.h"
+
+#include "cw_util.h"
+#include "cw_log.h"
+
+
+
+
+static int wtpinfo_readelem_wtp_descriptor_(struct wtpinfo * wtpinfo, int type, uint8_t *msgelem, int len, int cq)
+{
+ if (type != CWMSGELEM_WTP_DESCRIPTOR)
+ return 0;
+
+ if (len<6)
+ return -1;
+
+ wtpinfo->max_radios=*msgelem;
+ wtpinfo->radios_in_use=*(msgelem+1);
+
+ int ncrypt = *(msgelem+2);
+ int i;
+ if (ncrypt == 0 ){
+ /* non-conform */
+ cw_dbg(DBG_CW_RFC,"Non-standard-conform WTP descriptor detected (See RFC 5415)");
+ if (!cq)
+ i=3;
+ else
+ i=4;
+ }
+ else{
+ i=ncrypt*3+3;
+ }
+
+ do {
+ if (i+8>len)
+ {
+ cw_dbg(DBG_CW_MSG_ERR,"WTP descriptor subelement to long, length=%d>%d",i+8,len);
+ return -1;
+ }
+
+ uint32_t vendor_id=ntohl(*((uint32_t*)(msgelem+i)));
+
+ uint32_t val = ntohl(*((uint32_t*)(msgelem+i+4)));
+ int subtype= (val>>16)&0xffff;
+ int sublen = val&0xffff;
+ i+=8;
+
+ if (sublen+i>len){
+ cw_dbg(DBG_CW_MSG_ERR,"WTP descriptor subelement too long, length = %d",sublen);
+ return -1;
+ }
+
+ cw_dbg(DBG_CW_MSG,"Reading WTP descriptor subelement, type=%d,len=%d",subtype,sublen);
+
+ switch(subtype){
+ case CWMSGSUBELEM_WTP_DESCRIPTOR_HARDWARE_VERSION:
+ wtpinfo->hardware_vendor_id=vendor_id;
+ cw_setstr(&wtpinfo->hardware_version,msgelem+i,sublen);
+ wtpinfo->hardware_version_len=sublen;
+ break;
+ case CWMSGSUBELEM_WTP_DESCRIPTOR_SOFTWARE_VERSION:
+ wtpinfo->software_vendor_id=vendor_id;
+ cw_setstr(&wtpinfo->software_version,msgelem+i,sublen);
+ wtpinfo->software_version_len=sublen;
+ break;
+ case CWMSGSUBELEM_WTP_DESCRIPTOR_BOOTLOADER_VERSION:
+ wtpinfo->bootloader_vendor_id=vendor_id;
+ cw_setstr(&wtpinfo->bootloader_version,msgelem+i,sublen);
+ wtpinfo->bootloader_version_len=sublen;
+ break;
+ default:
+ cw_dbg(DBG_CW_MSG_ERR,"Unknown WTP descriptor subelement, type = %d",subtype);
+ break;
+ }
+ i+=sublen;
+
+ }while(ivendor_id);
- int l;
int len = 4;
/* mandatory sub-elements */
- if (wtpinfo->model_no) {
- l = bstr_len(wtpinfo->model_no);
- *((uint32_t *) (msg + len)) = htonl(CWBOARDDATA_MODELNO << 16 | l);
- memcpy(msg + len + 4, bstr_data(wtpinfo->model_no), l);
- len += l + 4;
- }
- if (wtpinfo->serial_no) {
- l = bstr_len( wtpinfo->serial_no);
- *((uint32_t *) (msg + len)) = htonl(CWBOARDDATA_SERIALNO << 16 | l);
- memcpy(msg + len + 4, bstr_data(wtpinfo->serial_no), l);
- len += l + 4;
- }
+
+ len += add_board_data_subelem(msg+len,CWBOARDDATA_MODELNO,wtpinfo->model_no);
+
+ len += add_board_data_subelem(msg+len,CWBOARDDATA_SERIALNO,wtpinfo->serial_no);
+
/* other sub-elements */
+
+ len += add_board_data_subelem(msg+len,CWBOARDDATA_BOARDID,wtpinfo->board_id);
+
+ len += add_board_data_subelem(msg+len,CWBOARDDATA_REVISION,wtpinfo->board_revision);
+
+
if (wtpinfo->macaddress) {
*((uint32_t *) (msg + len)) =
htonl(CWBOARDDATA_MACADDRESS << 16 | wtpinfo->macaddress_len);
diff --git a/src/capwap/cwmsg_addelem_wtp_descriptor.c b/src/capwap/cwmsg_addelem_wtp_descriptor.c
index 8c11de73..ea0cfa4a 100644
--- a/src/capwap/cwmsg_addelem_wtp_descriptor.c
+++ b/src/capwap/cwmsg_addelem_wtp_descriptor.c
@@ -27,7 +27,8 @@ void cwmsg_addelem_wtp_descriptor(struct cwmsg * cwmsg, struct wtpinfo * wtpinfo
switch (cwmsg->capwap_mode){
case CWMODE_CISCO:
- *((uint16_t*)(d+len))=0;
+ /* encryption capabilities */
+ *((uint16_t*)(d+len))=htons(wtpinfo->encryption_cap);
len+=2;
break;
default:
diff --git a/src/capwap/cwmsg_init.c b/src/capwap/cwmsg_init.c
index c8df7d2c..7f8ed654 100644
--- a/src/capwap/cwmsg_init.c
+++ b/src/capwap/cwmsg_init.c
@@ -33,15 +33,16 @@ void cwmsg_init(struct cwmsg * cwmsg, uint8_t *buffer, int type, int seqnum, str
cwmsg->flags=0;
if (radioinfo){
- if (radioinfo->rmac[0]){
+ if (radioinfo->rmac){
/* we assume the radio mac is already aligned */
- rmaclen=(*radioinfo->rmac);
- memcpy(buffer+8,radioinfo->rmac,rmaclen/8+8);
+ rmaclen=bstr_len(radioinfo->rmac);
+ *(buffer+8)=rmaclen;
+ memcpy(buffer+9,bstr_data(radioinfo->rmac),rmaclen);
cwmsg->flags=CWTH_FLAGS_M;
}
}
- hlen+=rmaclen;
+ hlen+=rmaclen+1;
if (hlen%4)
hlen = (hlen>>2)*4+4;
diff --git a/src/capwap/cwread_join_response.c b/src/capwap/cwread_join_response.c
index 5edfcda6..d8fa9b7b 100644
--- a/src/capwap/cwread_join_response.c
+++ b/src/capwap/cwread_join_response.c
@@ -25,14 +25,21 @@
static int acinfo_readelem_join_resp(void * a,int type,uint8_t* msgelem,int len)
{
+printf("Here we are reading\n");
+ cw_dbg_msgelem(CWMSG_JOIN_RESPONSE, type, msgelem, len);
+
struct ac_info * acinfo = (struct ac_info *)a;
// cw_log_debug1("Process join resp msgelem, type=%d, len=%d\n",type,len);
+ if (cw_readelem_result_code(&acinfo->result_code,type,msgelem,len))
+ goto foundX;
+
+
if (acinfo_readelem_ecn_support(acinfo,type,msgelem,len))
- return 1;
+ goto foundX;
if (acinfo_readelem_ac_descriptor(acinfo,type,msgelem,len))
- return 1;
+ goto foundX;
if (acinfo_readelem_ac_name(acinfo,type,msgelem,len))
return 1;
@@ -43,7 +50,10 @@ static int acinfo_readelem_join_resp(void * a,int type,uint8_t* msgelem,int len)
/* if (acinfo_readelem_cw_local_ip_addr(acinfo,type,msgelem,len))
return 1;
*/
+
return 0;
+foundX:
+ return 1;
}
diff --git a/src/capwap/cwsend_join_request.c b/src/capwap/cwsend_join_request.c
index 81fe860b..bc563e2f 100644
--- a/src/capwap/cwsend_join_request.c
+++ b/src/capwap/cwsend_join_request.c
@@ -19,6 +19,8 @@
#include
#include "capwap.h"
+#include "capwap_cisco.h"
+
#include "conn.h"
#include "cwmsg.h"
@@ -61,6 +63,16 @@ int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct w
switch (conn->capwap_mode) {
case CWMODE_CISCO:
cwmsg_addelem_vendor_cisco_mwar_addr(&cwmsg,conn);
+
+ uint8_t data207[4] = {1,1,0,1};
+
+ cwmsg_addelem_vendor_specific_payload(&cwmsg,CW_VENDOR_ID_CISCO,
+ CWVENDOR_CISCO_PL207,data207,4);
+
+ cwmsg_addelem_vendor_specific_payload(&cwmsg,CW_VENDOR_ID_CISCO,
+ CWVENDOR_CISCO_AP_GROUP_NAME,(uint8_t*)"Tobias",strlen("Tobias"));
+
+
break;
default:
/* ECN support */
diff --git a/src/capwap/process_join_request.c b/src/capwap/process_join_request.c
index 3b2fa699..3305c3d7 100644
--- a/src/capwap/process_join_request.c
+++ b/src/capwap/process_join_request.c
@@ -70,7 +70,7 @@ static int process_elem(void *eparm,int type,uint8_t* msgelem,int len)
if (wtpinfo_readelem_ecn_support(wtpinfo,type,msgelem,len))
goto foundX;
- if (cw_readelem_capwap_local_ip_addr(wtpinfo,type,msgelem,len)){
+ if (cw_readelem_capwap_local_ip_addr(&wtpinfo->local_ip,type,msgelem,len)){
cw_mand_elem_found(e->mand, XCWMSGELEM_CAPWAP_LOCAL_IP_ADDRESS);
return 1;
}
diff --git a/src/capwap/radioinfo.h b/src/capwap/radioinfo.h
index 370cc1c3..9658ec86 100644
--- a/src/capwap/radioinfo.h
+++ b/src/capwap/radioinfo.h
@@ -20,6 +20,9 @@
#ifndef __RADIOINFO_H
#define __RADIOINFO_H
+#include "bstr.h"
+
+
struct radioinfo{
char set;
int rid;
@@ -27,7 +30,7 @@ struct radioinfo{
int admin_state;
int state;
int cause;
- uint8_t rmac[8];
+ bstr_t rmac;
};
#endif
diff --git a/src/capwap/wtpinfo.h b/src/capwap/wtpinfo.h
index 2a09e3c0..bf748cb9 100644
--- a/src/capwap/wtpinfo.h
+++ b/src/capwap/wtpinfo.h
@@ -50,8 +50,9 @@ struct wtpinfo{
uint32_t vendor_id;
uint8_t* model_no;
uint8_t* serial_no;
- uint8_t* board_id;
- uint8_t* board_revision;
+
+ bstr_t board_id;
+ bstr_t board_revision;
uint16_t statistics_timer;
@@ -78,6 +79,9 @@ struct wtpinfo{
int bootloader_version_len;
uint32_t bootloader_vendor_id;
+
+ uint16_t encryption_cap;
+
uint8_t * macaddress;
diff --git a/src/capwap/wtpinfo_print.c b/src/capwap/wtpinfo_print.c
index f1685b61..dd7bacd2 100644
--- a/src/capwap/wtpinfo_print.c
+++ b/src/capwap/wtpinfo_print.c
@@ -168,14 +168,40 @@ int wtpinfo_print(char *str, struct wtpinfo * wtpinfo)
- sock_addrtostr((struct sockaddr*)&wtpinfo->local_ip,hstr,64);
- s+=sprintf (s,"\tLocal IP: %s\n",hstr);
+// sock_addrtostr((struct sockaddr*)&wtpinfo->local_ip,hstr,64);
+
+int i0;
+for (i0=0; i0<10; i0++){
+ printf("%d\n", ((char*)(&wtpinfo->local_ip))[i0] );
+}
+
+ s+=sprintf (s,"\tLocal IP: %s\n",sock_addr2str(&(wtpinfo->local_ip)));
s+=sprintf (s,"\tVendor ID: %d, %s\n", wtpinfo->vendor_id,cw_ianavendoridtostr(wtpinfo->vendor_id) );
- s+=sprintf (s,"\tModel No.: %s\n", (!wtpinfo->model_no ? (uint8_t*)"Not set" : wtpinfo->model_no) );
- s+=sprintf (s,"\tSerial No.: %s\n", (!wtpinfo->serial_no ? (uint8_t*)"Not set" : wtpinfo->serial_no) );
+
+ s+=sprintf (s,"\tModel No.: "); //, (!wtpinfo->model_no ? (uint8_t*)"Not set" : wtpinfo->model_no) );
+ s+=bstr_to_str(s,wtpinfo->model_no,0);
+ s+=sprintf(s,"\n");
+
+
+// s+=sprintf (s,"\tSerial No.: %s\n", (!wtpinfo->serial_no ? (uint8_t*)"Not set" : wtpinfo->serial_no) );
+
+
+
+ s+=sprintf (s,"\tSerial No.: ");
+ s+=bstr_to_str(s,wtpinfo->serial_no,0);
+ s+=sprintf(s,"\n");
+
+ s+=sprintf (s,"\tBoard ID: ");
+ s+=bstr_to_str(s,wtpinfo->board_id,0);
+ s+=sprintf(s,"\n");
+
+ s+=sprintf (s,"\tBoard Revision: ");
+ s+=bstr_to_str(s,wtpinfo->board_revision,0);
+ s+=sprintf(s,"\n");
+
// s+=sprintf (s,"\tBoard Id: %s\n", (!wtpinfo->board_id ? (uint8_t*)"Not set" : wtpinfo->board_id) );
@@ -257,6 +283,9 @@ int wtpinfo_print(char *str, struct wtpinfo * wtpinfo)
s+=sprintf(s,"%s",ristr);
+
+ s+=sprintf(s,"Encryption: %08x\n",wtpinfo->encryption_cap);
+
s+=wtp_reboot_statistics_print(s,&wtpinfo->reboot_statistics);
return s-str;
diff --git a/src/capwap/wtpinfo_readelem_wtp_board_data.c b/src/capwap/wtpinfo_readelem_wtp_board_data.c
index 91c33c42..90bc7f9e 100644
--- a/src/capwap/wtpinfo_readelem_wtp_board_data.c
+++ b/src/capwap/wtpinfo_readelem_wtp_board_data.c
@@ -30,10 +30,10 @@ static void wtpinfo_readsubelems_wtp_board_data(struct wtpinfo * wtpinfo,uint8_t
switch(subtype){
case CWBOARDDATA_MODELNO:
- cw_setstr(&wtpinfo->model_no,msgelem+i,sublen);
+ bstr_replace(&wtpinfo->model_no,bstr_create(msgelem+i,sublen));
break;
case CWBOARDDATA_SERIALNO:
- cw_setstr(&wtpinfo->serial_no,msgelem+i,sublen);
+ bstr_replace(&wtpinfo->serial_no,bstr_create(msgelem+i,sublen));
break;
case CWBOARDDATA_MACADDRESS:
wtpinfo->macaddress=realloc(wtpinfo->macaddress,sublen);
@@ -41,10 +41,10 @@ static void wtpinfo_readsubelems_wtp_board_data(struct wtpinfo * wtpinfo,uint8_t
wtpinfo->macaddress_len=sublen;
break;
case CWBOARDDATA_BOARDID:
- cw_setstr(&wtpinfo->board_id,msgelem+i,sublen);
+ bstr_replace(&wtpinfo->board_id,bstr_create(msgelem+i,sublen));
break;
case CWBOARDDATA_REVISION:
- cw_setstr(&wtpinfo->board_revision,msgelem+i,sublen);
+ bstr_replace(&wtpinfo->board_revision,bstr_create(msgelem+i,sublen));
default:
break;
}
diff --git a/src/capwap/wtpinfo_readelem_wtp_descriptor.c b/src/capwap/wtpinfo_readelem_wtp_descriptor.c
index 59f56c12..f4785822 100644
--- a/src/capwap/wtpinfo_readelem_wtp_descriptor.c
+++ b/src/capwap/wtpinfo_readelem_wtp_descriptor.c
@@ -26,7 +26,7 @@
-static int wtpinfo_readelem_wtp_descriptor_(struct wtpinfo * wtpinfo, int type, uint8_t *msgelem, int len, int cq)
+static int wtpinfo_readelem_wtp_descriptor_(struct wtpinfo * wtpinfo, int type, uint8_t *msgelem, int len, int capwap_mode)
{
if (type != CWMSGELEM_WTP_DESCRIPTOR)
return 0;
@@ -37,19 +37,31 @@ static int wtpinfo_readelem_wtp_descriptor_(struct wtpinfo * wtpinfo, int type,
wtpinfo->max_radios=*msgelem;
wtpinfo->radios_in_use=*(msgelem+1);
- int ncrypt = *(msgelem+2);
- int i;
- if (ncrypt == 0 ){
- /* non-conform */
- cw_dbg(DBG_CW_RFC,"Non-standard-conform WTP descriptor detected (See RFC 5415)");
- if (!cq)
- i=3;
- else
+ int ncrypt;
+ int i=2;
+
+ switch (capwap_mode){
+ case CWMODE_CISCO:
+ wtpinfo->encryption_cap = ntohs( *((uint16_t*)(msgelem+2)) );
i=4;
+ break;
+ default:
+ {
+ ncrypt= *(msgelem+2);
+ if (ncrypt == 0 ){
+ /* non-conform */
+ cw_dbg(DBG_CW_RFC,"Non-standard-conform WTP descriptor detected (See RFC 5415)");
+ i=3;
+ }
+ else
+ i=ncrypt*3+3;
+
+ }
+
+
+
}
- else{
- i=ncrypt*3+3;
- }
+
do {
if (i+8>len)
@@ -101,10 +113,11 @@ static int wtpinfo_readelem_wtp_descriptor_(struct wtpinfo * wtpinfo, int type,
int wtpinfo_readelem_wtp_descriptor(struct wtpinfo * wtpinfo, int type, uint8_t *msgelem, int len)
{
- int rc =wtpinfo_readelem_wtp_descriptor_(wtpinfo, type, msgelem, len,0);
+ int rc =wtpinfo_readelem_wtp_descriptor_(wtpinfo, type, msgelem, len,CWMODE_STD);
+
if (rc==-1){
- cw_dbg(DBG_CW_RFC,"Bad wtp descriptor, trying cisco hack");
- rc =wtpinfo_readelem_wtp_descriptor_(wtpinfo, type, msgelem, len,1);
+ cw_dbg(DBG_CW_RFC,"Bad wtp descriptor, trying cisco");
+ rc =wtpinfo_readelem_wtp_descriptor_(wtpinfo, type, msgelem, len,CWMODE_CISCO);
}
return rc;
diff --git a/src/wtp/conf_uci.c b/src/wtp/conf_uci.c
index 956b55aa..30ba0779 100644
--- a/src/wtp/conf_uci.c
+++ b/src/wtp/conf_uci.c
@@ -182,6 +182,18 @@ int read_config(const char * filename){
}
+ str = uci_lookup_option_string(ctx,section,"board_id");
+ if (str){
+ uint8_t * s = bstr_create_from_cfgstr(str);
+ bstr_replace(&conf_board_id,s);
+ }
+
+ str = uci_lookup_option_string(ctx,section,"board_revision");
+ if (str){
+ uint8_t * s = bstr_create_from_cfgstr(str);
+ bstr_replace(&conf_board_revision,s);
+ }
+
str = uci_lookup_option_string(ctx,section,"serial_no");
if (str){
diff --git a/src/wtp/discovery.c b/src/wtp/discovery.c
index e878165c..90e4a123 100644
--- a/src/wtp/discovery.c
+++ b/src/wtp/discovery.c
@@ -134,6 +134,9 @@ static int do_discover_conn(struct conn * conn,struct discovery_info * di)
struct radioinfo ri;
memset(&ri,0,sizeof(ri));
+ struct radioinfo * rip = &wtpinfo->radioinfo[0];
+
+/*
ri.rmac[0]=6;
ri.rmac[2]=14;
ri.rmac[3]=14;
@@ -141,7 +144,7 @@ static int do_discover_conn(struct conn * conn,struct discovery_info * di)
ri.rmac[5]=14;
ri.rmac[6]=14;
ri.rmac[7]=14;
-
+*/
#ifdef WITH_CW_LOG_DEBUG
char str[100];
@@ -153,7 +156,7 @@ static int do_discover_conn(struct conn * conn,struct discovery_info * di)
do {
conn->capwap_mode=CWMODE_CISCO;
- rc = cwsend_discovery_request(conn,&ri,wtpinfo);
+ rc = cwsend_discovery_request(conn,rip,wtpinfo);
if (rc<0){
if (errno == EINTR)
continue;
diff --git a/src/wtp/join.c b/src/wtp/join.c
index 2ad9bf1b..c45d9e14 100644
--- a/src/wtp/join.c
+++ b/src/wtp/join.c
@@ -20,6 +20,7 @@ void acinfo_log_(int level,const struct ac_info *acinfo,const char * xstr)
{
char str[8192];
acinfo_print(str,acinfo);
+ cw_dbg(DBG_CW_INFO,"%s",str);
// cw_log_debug(level,"%s\n%s",xstr,str);
return;
}
@@ -35,37 +36,54 @@ int join_state(struct conn * conn)
memset(&ri,0,sizeof(ri));
int rc;
+
+ struct radioinfo *rip = &(wtpinfo->radioinfo[0]);
+
#ifdef WITH_CW_LOG_DEBUG
char str[64];
sock_addrtostr(&conn->addr,str,64);
// cw_log_debug0("Sending join request to %s",str);
#endif
printf("Seqnum before = %i\n",conn->seqnum);
- rc = cwsend_join_request(conn,&ri,wtpinfo);
+ rc = cwsend_join_request(conn,rip,wtpinfo);
printf("Seqnum after = %i\n",conn->seqnum);
struct cwrmsg * cwrmsg;
// do {
+int i;
+for(int i=0; i<10; i++){
+
cwrmsg = conn_get_message(conn);
+ if ( cwrmsg)
+ break;
+}
printf("Received %08p\n",cwrmsg);
// }while(cwrmsg==0);
-exit(0);
+ printf("SEQQQQS %d %d\n",cwrmsg->seqnum,conn->seqnum);
// cw_log_debug0("Received message %i",cwrmsg->seqnum);
if (cwrmsg->type != CWMSG_JOIN_RESPONSE || cwrmsg->seqnum != conn->seqnum){
- printf("Wrong message\n");
+ printf("Wrong messagei %d %d\n",cwrmsg->seqnum,conn->seqnum);
+
}
struct ac_info acinfo;
memset(&acinfo,0,sizeof(acinfo));
+printf("cwrad\n");
+
cwread_join_response(&acinfo,cwrmsg->msgelems,cwrmsg->msgelems_len);
+printf("Done reading\n");
+
acinfo_log(0,&acinfo,"Connectet to the following AC");
+
+ printf("Result_code: %d\n",acinfo.result_code);
+
}
diff --git a/src/wtp/wtp_conf.c b/src/wtp/wtp_conf.c
index d87d10d6..ec1a600f 100644
--- a/src/wtp/wtp_conf.c
+++ b/src/wtp/wtp_conf.c
@@ -74,6 +74,13 @@ uint8_t * conf_model_no;
uint8_t * conf_serial_no;
+
+bstr_t conf_board_id;
+bstr_t conf_board_revision;
+
+
+
+
LONGSTRS conf_timer_cfgstrs[] = {
"max_discovery_interval",&conf_max_discovery_interval,
"discovery_interval",&conf_discovery_interval,
@@ -204,7 +211,8 @@ int wtpconf_preinit()
conf_software_version = bstr_create_from_cfgstr(CONF_DEFAULT_SOFTWARE_VERSION);
conf_serial_no = bstr_create_from_cfgstr(CONF_DEFAULT_SERIAL_NO);
-
+ conf_board_id = bstr_create_from_cfgstr(CONF_DEFAULT_BOARD_ID);
+ conf_board_revision = bstr_create_from_cfgstr(CONF_DEFAULT_BOARD_REVISION);
}
int wtpconf_init()
diff --git a/src/wtp/wtp_conf.h b/src/wtp/wtp_conf.h
index 9d35e4a4..0e4f1b4c 100644
--- a/src/wtp/wtp_conf.h
+++ b/src/wtp/wtp_conf.h
@@ -4,6 +4,10 @@
#include
#include "capwap/capwap.h"
+#include "capwap/bstr.h"
+
+
+
extern int read_config(const char * filename);
extern char * conf_wtpname;
@@ -25,6 +29,9 @@ extern uint8_t * conf_model_no;
extern uint8_t * conf_serial_no;
+extern bstr_t conf_board_id;
+extern bstr_t conf_board_revision;
+
extern struct sockaddr_storage * conf_preffered_ac_sa;
extern char * conf_primary_if;
@@ -71,8 +78,13 @@ extern uint8_t conf_macaddress_len;
#endif
+#ifndef CONF_DEFAULT_BOARD_ID
+ #define CONF_DEFAULT_BOARD_ID "00"
+#endif
-
+#ifndef CONF_DEFAULT_BOARD_REVISION
+ #define CONF_DEFAULT_BOARD_REVISION "00"
+#endif
#ifndef CONF_DEFAULT_MAX_DISCOVERY_INTERVAL
diff --git a/src/wtp/wtp_interface.c b/src/wtp/wtp_interface.c
index 650ce7a2..6afb443d 100644
--- a/src/wtp/wtp_interface.c
+++ b/src/wtp/wtp_interface.c
@@ -19,7 +19,8 @@ struct wtpinfo * get_wtpinfo()
wtpinfo=malloc(sizeof(struct wtpinfo));
memset(wtpinfo,0,sizeof(struct wtpinfo));
- wtpinfo->name = (uint8_t*)"wtpXY";
+ wtpinfo->name = conf_wtpname;
+
wtpinfo->location = (uint8_t*)"default location";
wtpinfo->max_radios=wtpdrv_get_num_radios();
@@ -29,6 +30,8 @@ struct wtpinfo * get_wtpinfo()
}
+ wtpinfo->encryption_cap=1;
+
wtpinfo->serial_no=conf_serial_no;
wtpinfo->vendor_id=conf_vendor_id;
@@ -45,6 +48,8 @@ struct wtpinfo * get_wtpinfo()
wtpinfo->bootloader_version=conf_bootloader_version;
+ wtpinfo->board_id = conf_board_id;
+ wtpinfo->board_revision = conf_board_revision;
wtpinfo->software_vendor_id=CW_VENDOR_ID_CISCO;
diff --git a/src/wtp/wtpdrv.c b/src/wtp/wtpdrv.c
index ecc7ca0e..05201bc1 100644
--- a/src/wtp/wtpdrv.c
+++ b/src/wtp/wtpdrv.c
@@ -1217,6 +1217,11 @@ 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};
+
+ radioinfo->rmac = bstr_create(rm,6);
+
radioinfo->type|=CW_IEEE80211_RADIO_TYPE_B; //CWRADIO_TYPE_N;
/*