From b5bacff6a3421cadfb9010075ba1614ddcb9a709 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sun, 15 Mar 2015 19:53:21 +0000 Subject: [PATCH] More documentation and Cisco support. FossilOrigin-Name: 0a22e4c44b2df5712b2f8edaea0712fcc7fc0ca953e86179c0a653a484197a43 --- src/ac/Makefile | 2 +- src/ac/ac.default.conf | 35 +++++++++++++- src/ac/ac_interface.c | 6 +-- src/ac/conf.c | 48 ++++++++++++++----- src/ac/conf.h | 14 ++++-- src/ac/wtpman.c | 29 +++++++++-- src/capwap/acinfo.c | 12 ++++- src/capwap/acinfo.h | 21 ++++++-- src/capwap/acinfo_print.c | 23 ++++++++- src/capwap/bstr.h | 27 ++++++++++- src/capwap/bstr_create.c | 13 +++++ src/capwap/bstr_create_from_cfgstr.c | 16 ++++++- src/capwap/bstr_replace.c | 2 +- src/capwap/capwap.h | 4 +- src/capwap/capwap_cisco.h | 29 +++++++---- src/capwap/cw_log.h | 16 ++++++- src/capwap/cw_log_debug.c | 35 ++++++++++---- src/capwap/cw_readelem_ac_descriptor.c | 8 ++-- .../cw_readelem_vendor_specific_payload.c | 44 ++++++++++++++++- src/capwap/cw_util.h | 22 +++++++-- src/capwap/cwmsg_addelem_ac_descriptor.c | 7 ++- src/capwap/cwmsg_addelem_wtp_radio_infos.c | 2 +- .../cwread_change_state_event_request.c | 7 ++- .../cwread_configuration_status_request.c | 24 +++++++++- src/capwap/cwread_discovery_response.c | 2 +- src/capwap/cwread_join_response.c | 3 +- src/capwap/cwsend_discovery_response.c | 13 +++-- src/capwap/cwsend_join_response.c | 4 +- src/capwap/fragman.c | 8 ++-- src/capwap/lwapp.h | 14 ++++-- src/wtp/discovery.c | 4 +- src/wtp/join.c | 2 - 32 files changed, 400 insertions(+), 96 deletions(-) diff --git a/src/ac/Makefile b/src/ac/Makefile index b3525c08..682cdd83 100644 --- a/src/ac/Makefile +++ b/src/ac/Makefile @@ -11,7 +11,7 @@ ifndef ARCH endif LDFLAGS+=-g -D_REENTRANT -L/usr/local/lib -L../capwap/$(ARCH) -CFLAGS += -Wall -g -O3 -D_REENTRANT -DIPV6 -I/usr/local/include -I../capwap +CFLAGS += -Wall -g -O0 -D_REENTRANT -DIPV6 -I/usr/local/include -I../capwap LIBS+=-lcapwap diff --git a/src/ac/ac.default.conf b/src/ac/ac.default.conf index 9bf6041b..9b9c4185 100644 --- a/src/ac/ac.default.conf +++ b/src/ac/ac.default.conf @@ -15,12 +15,45 @@ # ac_id -# A unique id for this AC +# A unique ID for this AC # If not specified, an id is build from macaddress. # # Default: # ac_id = +# hardware_version +# Hardware version for the AC +# If ommited, the hardware version is build from +# the underlying OS +# +# Default: +# hardware_version = + +# software_version +# Software version for this AC +# If not specified, the compiled in software version is used. +# +# Default: +# software_version = + + +# cisco_hardware_version +# Hardware version sent, when AC operates in cisco-mode +# +# Default: +# cisco_hardware_version = .x01000001 + +# cisco_software_version +# Software version sent, when operating in cisco-mode +# +# Default: +# cisco_software_version = .x08006E00 + + + + + + # --------------------------------------------------- # Network related diff --git a/src/ac/ac_interface.c b/src/ac/ac_interface.c index d2ac4170..c318769d 100644 --- a/src/ac/ac_interface.c +++ b/src/ac/ac_interface.c @@ -80,10 +80,10 @@ struct ac_info * get_acinfo() acinfo->vendor_id=conf_vendor_id; acinfo->hardware_version=(uint8_t*)conf_hardware_version; - acinfo->hardware_version_len=conf_hardware_version_len; - acinfo->software_version=(uint8_t*)conf_software_version; - acinfo->software_version_len=conf_software_version_len; + acinfo->cisco_hardware_version=(uint8_t*)conf_cisco_hardware_version; + acinfo->cisco_software_version=(uint8_t*)conf_cisco_software_version; + if (conf_dtls_psk) acinfo->security|=AC_SECURITY_S; diff --git a/src/ac/conf.c b/src/ac/conf.c index aa638fc5..ba9d21d8 100644 --- a/src/ac/conf.c +++ b/src/ac/conf.c @@ -74,11 +74,17 @@ char * conf_dtls_psk=NULL; int conf_security=0; long conf_vendor_id=CONF_DEFAULT_VENDOR_ID; -char * conf_hardware_version=NULL; -int conf_hardware_version_len=0; -char * conf_software_version=NULL; -int conf_software_version_len=0; +bstr_t conf_hardware_version=NULL; +bstr_t conf_software_version=NULL; + +bstr_t conf_cisco_hardware_version=NULL; +bstr_t conf_cisco_software_version=NULL; + + +//int conf_hardware_version_len=0; + +//int conf_software_version_len=0; int conf_use_loopback = 0; @@ -168,7 +174,7 @@ static int init_vendor_id() return 1; } - +/* static int convert_version_string(char * si[], int *l) { char * s = *si; @@ -231,31 +237,47 @@ static int convert_version_string(char * si[], int *l) return 1; } +*/ static int init_version() { + + /* Init hardware version */ if (!conf_hardware_version) { struct utsname u; int rc = uname(&u); if (rc<0) - conf_hardware_version=CONF_DEFAULT_HARDWARE_VERSION; + conf_hardware_version=(bstr_t)strdup(CONF_DEFAULT_HARDWARE_VERSION); else{ char str[265]; sprintf(str,"%s / %s %s",u.machine,u.sysname,u.release); - conf_hardware_version=strdup(str); + conf_hardware_version=(bstr_t)strdup(str); } } - conf_hardware_version_len=strlen(conf_hardware_version); - convert_version_string(&conf_hardware_version,&conf_hardware_version_len); + bstr_replace(&conf_hardware_version,bstr_create_from_cfgstr((char*)conf_hardware_version)); + /* software version */ if (!conf_software_version) - conf_software_version=CONF_DEFAULT_SOFTWARE_VERSION; - conf_software_version_len=strlen(conf_software_version); + conf_software_version=(bstr_t)strdup(CONF_DEFAULT_SOFTWARE_VERSION); + bstr_replace(&conf_software_version,bstr_create_from_cfgstr((char*)conf_software_version)); + + + /* Cisco hardware version */ + if (!conf_cisco_hardware_version) + conf_cisco_hardware_version=(bstr_t)strdup(CONF_DEFAULT_CISCO_HARDWARE_VERSION); + bstr_replace(&conf_cisco_hardware_version,bstr_create_from_cfgstr((char*)conf_cisco_hardware_version)); + + /* Cisco software version */ + if (!conf_cisco_software_version) + conf_cisco_software_version=(bstr_t)strdup(CONF_DEFAULT_CISCO_SOFTWARE_VERSION); + bstr_replace(&conf_cisco_software_version,bstr_create_from_cfgstr((char*)conf_cisco_software_version)); + + + - convert_version_string(&conf_software_version,&conf_software_version_len); return 1; } @@ -529,7 +551,7 @@ static int conf_read_dbg_level(cfg_t *cfg) for (i=0; irmac),bstr_len(cwrmsg->rmac) cwsend_discovery_response(wtpman->conn,cwrmsg->seqnum,&radioinfo,acinfo,&wtpman->wtpinfo); + wtpman_remove(wtpman); } @@ -553,10 +554,9 @@ static int wtpman_join(void *arg,time_t timer) struct radioinfo radioinfo; radioinfo.rid = cwrmsg->rid; - memcpy (radioinfo.rmac, cwrmsg->rmac,8); +// memcpy (radioinfo.rmac, cwrmsg->rmac,8); struct ac_info * acinfo = get_acinfo(); -sleep(10); int result_code = 0; cw_dbg(DBG_CW_MSG,"Sending join response to %s",CLIENT_IP); @@ -600,9 +600,26 @@ static void wtpman_run(void *arg) return; } + /* here the WTP has joined, now image update or change state event */ - int msgs[] = { CWMSG_IMAGE_DATA_REQUEST, CWMSG_CHANGE_STATE_EVENT_REQUEST, -1 }; + int msgs[] = { CWMSG_IMAGE_DATA_REQUEST, CWMSG_CONFIGURATION_STATUS_REQUEST, -1 }; + cwrmsg = conn_wait_for_request(wtpman->conn, msgs, timer); + + if (!cwrmsg){ + cw_dbg(DBG_CW_MSG_ERR,"No config uration status request from %s after %d seconds, WTP died.", + sock_addr2str(&wtpman->conn->addr),wtpman->conn->wait_join); + wtpman_remove(wtpman); + return; + } + + cwread_configuration_status_request(&wtpman->wtpinfo,cwrmsg->msgelems, cwrmsg->msgelems_len); +// cwsend_conf_status_response(wtpman->conn,cwrmsg->seqnum,result_code,&radioinfo,acinfo,&wtpman->wtpinfo); + + +exit(0); + +// msgs = { CWMSG_IMAGE_DATA_REQUEST, CWMSG_CHANGE_STATE_EVENT_REQUEST, -1 }; cwrmsg = conn_wait_for_request(wtpman->conn, msgs, timer); if (!cwrmsg){ @@ -610,7 +627,10 @@ static void wtpman_run(void *arg) return; } -exit(0); + + + + switch (cwrmsg->type){ case CWMSG_CHANGE_STATE_EVENT_REQUEST: @@ -635,7 +655,6 @@ exit(0); printf("WTP is joined now\n"); - exit(0); int result_code = 0; struct radioinfo * radioinfo; diff --git a/src/capwap/acinfo.c b/src/capwap/acinfo.c index f9244e3e..6ab39780 100644 --- a/src/capwap/acinfo.c +++ b/src/capwap/acinfo.c @@ -69,6 +69,10 @@ int acinfo_readelem_ac_descriptor(struct ac_info * acinfo,int type, uint8_t *msg int sub=12; int sublen; + + +printf("Now trying sublens\n"); + while (sub>16; +printf("sublen type = %d\n",subtype); if (sub+sublen>len) return -1; diff --git a/src/capwap/acinfo.h b/src/capwap/acinfo.h index fdb117f4..2417a1fc 100644 --- a/src/capwap/acinfo.h +++ b/src/capwap/acinfo.h @@ -1,3 +1,8 @@ +/** + *@file + *@brief acinfo definitions. + */ + #ifndef __ACINFO_H #define __ACINFO_H @@ -37,12 +42,18 @@ struct ac_info{ int rmac; int dtls_policy; int vendor_id; - uint8_t * hardware_version; - int hardware_version_len; - uint8_t * software_version; - int software_version_len; -// const char * acname; + /** Hardware version to use in capwap-mode */ + bstr_t hardware_version; + /** Software version to use in capwap-mode */ + bstr_t software_version; + + /** Hardware version to use if in cisco-mode */ + bstr_t cisco_hardware_version; + /** Software version to use if in cisco-mode */ + bstr_t cisco_software_version; + + struct sockaddr * salist; int salist_len; diff --git a/src/capwap/acinfo_print.c b/src/capwap/acinfo_print.c index 55eb387d..61105015 100644 --- a/src/capwap/acinfo_print.c +++ b/src/capwap/acinfo_print.c @@ -1,3 +1,9 @@ + +/** + * @file + * @breif defines acinfo_print function + */ + #include #include @@ -6,14 +12,27 @@ #include "acinfo.h" +#include "cw_util.h" + +/** + * Formats an acinfo object. + * + */ int acinfo_print(char *str,const struct ac_info *acinfo) { char *s = str; s+=sprintf(s,"\tAC name: %s\n",acinfo->ac_name); - s+=sprintf(s,"\tHardware version: %s\n",acinfo->hardware_version); - s+=sprintf(s,"\tSoftware version: %s\n",acinfo->software_version); + + s+=sprintf(s,"\tHardware version: "); + s+=cw_format_version(s,acinfo->hardware_version,0,"-"); + s+=sprintf(s,"\n"); + + s+=sprintf(s,"\tSoftware version: "); + s+=cw_format_version(s,acinfo->software_version,0,"-"); + s+=sprintf(s,"\n"); + s+=sprintf(s,"\tStations: %i\n",acinfo->stations); s+=sprintf(s,"\tSation limit: %i\n",acinfo->limit); s+=sprintf(s,"\tActive WTPs: %i\n",acinfo->active_wtps); diff --git a/src/capwap/bstr.h b/src/capwap/bstr.h index eb2c479c..43b6985d 100644 --- a/src/capwap/bstr.h +++ b/src/capwap/bstr.h @@ -16,25 +16,50 @@ */ +/** + * @file + * @brief Definitions for bstr functions + */ + #ifndef __BSTR_H #define __BSTR_H #include +/** + * bstr typeS + * + * bstr_t serves as binary string where the first byte cponntains + * the length of the string. + */ typedef uint8_t* bstr_t; 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 uint8_t * bstr_replace( bstr_t * dst, uint8_t * bstr); extern int bstr_to_str(char *dst, bstr_t str,char * def); +/** + * Return the length of a bstr_t string. + */ #define bstr_len(s) (*(s)) + +/** + * Return the data of a bstr_t string. + */ #define bstr_data(s) (s+1) + +/** + * Return the actual size in memory a bstr_t string needs. + */ #define bstr_size(len) (len+1) +/** + * Max. length of a bstr_t string. + */ #define BSTR_MAX_LEN 254 diff --git a/src/capwap/bstr_create.c b/src/capwap/bstr_create.c index 5fb9fe1c..fc10149f 100644 --- a/src/capwap/bstr_create.c +++ b/src/capwap/bstr_create.c @@ -16,11 +16,24 @@ */ +/** + * @file + * @brief + */ #include #include #include +/** + * Creates a bstr_t string. + * @param data source data to create the string from + * @param len length of the string + * @return the created bstr_t string. + * + * The bstr_t string returned is allocated by malloc. So remember to free + * this resource if you don't need it anymore. + */ uint8_t * bstr_create(uint8_t *data, uint8_t len) { uint8_t * str = malloc(len*sizeof(uint8_t)); diff --git a/src/capwap/bstr_create_from_cfgstr.c b/src/capwap/bstr_create_from_cfgstr.c index 793cb26e..ebd489ae 100644 --- a/src/capwap/bstr_create_from_cfgstr.c +++ b/src/capwap/bstr_create_from_cfgstr.c @@ -16,6 +16,10 @@ */ +/** + * @file + * @brief bstr_create_from_cfgstr function + */ #include #include @@ -24,7 +28,17 @@ #include "bstr.h" - +/** + * Create a bstr_t string from a string read from config file. + * + * @param s String from config file. + * @return The create bstr_t string. + * + * The string from config file is an ASCII-text which is interpreted + * as hexadecimal string if it starts with ".x" + * + * @see bstr_t + */ uint8_t * bstr_create_from_cfgstr(const char * s) { int l = strlen(s); diff --git a/src/capwap/bstr_replace.c b/src/capwap/bstr_replace.c index fa011c5e..b37eac96 100644 --- a/src/capwap/bstr_replace.c +++ b/src/capwap/bstr_replace.c @@ -2,7 +2,7 @@ #include "bstr.h" -uint8_t * bstr_replace( uint8_t ** dst, uint8_t * bstr) +uint8_t * bstr_replace( bstr_t * dst, uint8_t * bstr) { if (*dst) free(*dst); diff --git a/src/capwap/capwap.h b/src/capwap/capwap.h index fbd828ab..9a01f2b3 100644 --- a/src/capwap/capwap.h +++ b/src/capwap/capwap.h @@ -34,7 +34,9 @@ #define CAPWAP_CONTROL_PORT_STR "5246" - +/** + * CAPWAP modes + */ enum capwapmodes { CWMODE_STD = 0, CWMODE_CISCO, diff --git a/src/capwap/capwap_cisco.h b/src/capwap/capwap_cisco.h index 06544a66..cc729b30 100644 --- a/src/capwap/capwap_cisco.h +++ b/src/capwap/capwap_cisco.h @@ -21,16 +21,29 @@ #include -#define CWVENDOR_CISCO_MWAR_ADDR 2 -#define CWVENDOR_CISCO_RAD 3 -#define CWVENDOR_CISCO_RAD_SLOT 4 -#define CWVENDOR_CISCO_RAD_NAME 5 -#define CWVENDOR_CISCO_MWAR 6 +#include "lwapp.h" -#define CWVENDOR_CISCO_AP_GROUP_NAME 123 -#define CWVENDOR_CISCO_AP_TIMESYNC 151 +#define CWVENDOR_CISCO_MWAR_ADDR 2 +#define CWVENDOR_CISCO_RAD 3 +#define CWVENDOR_CISCO_RAD_SLOT 4 +#define CWVENDOR_CISCO_RAD_NAME 5 +#define CWVENDOR_CISCO_MWAR 6 -#define CWVENDOR_CISCO_PL207 207 +#define CWVENDOR_CISCO_BOARD DATA LWMSGELEM_WTP_BOARD_DATA /* 50 */ +#define CWVENDER_CISCO_AP_MODE_AND_TYPE 54 + +#define CWVENDOR_CISCO_SPAM_VENDOR_SPECIFIC 104 + +#define CWVENDOR_CISCO_AP_GROUP_NAME 123 +#define CWVENDOR_CISCO_AP_LED_STATE_CONFIG 125 + + +#define CWVENDOR_CISCO_AP_PRE_STD_SWITCH_CONFIG 137 +#define CWVENDOR_CISCO_AP_POWER_INJECTOR_CONFIG 138 + +#define CWVENDOR_CISCO_AP_TIMESYNC 151 + +#define CWVENDOR_CISCO_PL207 207 extern void cwmsg_addelem_vendor_cisco_ap_timesync(struct cwmsg * cwmsg); diff --git a/src/capwap/cw_log.h b/src/capwap/cw_log.h index cc695af4..3f0ca02a 100644 --- a/src/capwap/cw_log.h +++ b/src/capwap/cw_log.h @@ -15,6 +15,12 @@ along with Foobar. If not, see . */ + +/** + *@file + *@brief Definitions for logging and debugging. + */ + #ifndef __CW_LOG_H #define __CW_LOG_H @@ -22,7 +28,11 @@ #include #include -/* CAPWAP specific debugs */ +/** + * \defgroup Debug options + * @{ + */ + #define DBG_CW_MSG 0x00000001 #define DBG_CW_MSGELEM 0x00000002 #define DBG_CW_MSGELEM_DMP 0x00000004 @@ -36,7 +46,7 @@ #define DBG_CW_PKT_ERR 0x00000200 #define DBG_CW_MSG_ERR 0x00000400 -/* drive specific debugs */ +/* driver specific debugs */ #define DBG_DRV 0x00010000 #define DBG_DRV_ERR 0x00020000 @@ -57,6 +67,8 @@ #define DBG_DETAIL_ALL 0xffffffff #define DBG_ERR (DBG_CW_MSG_ERR | DBG_CW_PKT_ERR) +/**@}*/ + #ifndef CW_LOG_DUMP_ROW_LEN #define CW_LOG_DUMP_ROW_LEN 32 diff --git a/src/capwap/cw_log_debug.c b/src/capwap/cw_log_debug.c index 68c57e41..15cdfbfb 100644 --- a/src/capwap/cw_log_debug.c +++ b/src/capwap/cw_log_debug.c @@ -16,6 +16,12 @@ */ +/** + *@file + *@brief Debug helpers + */ + + #include #include #include @@ -26,6 +32,16 @@ #include "cw_util.h" +int cw_dbg_opt_detail = 0; +int cw_dbg_opt_level = 0; + + + +int cw_log_debug_level = 0; + + + + static void cw_log_debug0_(const char *format, ...) { if (cw_log_debug_level < 0) @@ -49,6 +65,7 @@ static void cw_log_debug1_(const char *format, ...) closelog(); } + static void cw_log_debug2_(const char *format, ...) { if (cw_log_debug_level < 2) @@ -62,6 +79,7 @@ static void cw_log_debug2_(const char *format, ...) + int cw_log_debug_dump_(int level, const uint8_t * data, int len, const char *format, ...) { @@ -110,13 +128,6 @@ int cw_log_debug_dump_(int level, const uint8_t * data, int len, } -int cw_log_debug_level = 0; - - - -int cw_dbg_opt_detail = 0; -int cw_dbg_opt_level = 0; - void cw_log_dbg_(int level, const char *file, int line, const char *format, ...) @@ -242,6 +253,7 @@ cw_log_debug0_, cw_log_debug1_, cw_log_debug2_}; + /** * print debug info for message elements */ @@ -276,6 +288,8 @@ void cw_dbg_msgelem_(int msg, int msgelem, const uint8_t * msgbuf, int len) cw_msgtostr(msg), msgelem, elemname, len); } + + void cw_dbg_missing_mand_elems_(struct conn *conn, int msgtype, int *mand) { if (!cw_dbg_is_level(DBG_CW_RFC)) @@ -289,5 +303,8 @@ void cw_dbg_missing_mand_elems_(struct conn *conn, int msgtype, int *mand) } } -//cw_dbg(DBG_CW_MSGELEM,"Process discovery req msgelem, type=%d (%s), len=%d",type,cw_msgelemtostr(type),len); -//cw_dbg_dmp(DBG_CW_MSGELEM_DMP,msgelem,len,"Dump for msgelem ..."); + + + + + diff --git a/src/capwap/cw_readelem_ac_descriptor.c b/src/capwap/cw_readelem_ac_descriptor.c index 20796e3f..5d0e9583 100644 --- a/src/capwap/cw_readelem_ac_descriptor.c +++ b/src/capwap/cw_readelem_ac_descriptor.c @@ -31,13 +31,13 @@ static int read_subelem_cisco(struct ac_info* acinfo,int subtype,uint8_t * elem, { switch (subtype) { case 0: - /* software version */ - bstr_replace(&acinfo->software_version,bstr_create(elem,len)); - break; - case 1: /* hardware version */ bstr_replace(&acinfo->hardware_version,bstr_create(elem,len)); break; + case 1: + /* software version */ + bstr_replace(&acinfo->software_version,bstr_create(elem,len)); + break; default: printf("What? %d\n",subtype); diff --git a/src/capwap/cw_readelem_vendor_specific_payload.c b/src/capwap/cw_readelem_vendor_specific_payload.c index 71b62540..a3233e24 100644 --- a/src/capwap/cw_readelem_vendor_specific_payload.c +++ b/src/capwap/cw_readelem_vendor_specific_payload.c @@ -2,9 +2,37 @@ #include #include "capwap.h" +#include "lwapp.h" + #include "cw_log.h" -#include //tube +#include + + + +int cw_readelem_cisco_payload(void *data,int msgtype,int elem_id,uint8_t *msgelem, int len) +{ + + + switch (msgtype) { + case CWMSG_CONFIGURATION_STATUS_REQUEST: + { + if (lw_readelem_wtp_board_data((struct wtpinfo*)data,elem_id,msgelem,len)) + return 1; + + + return 0; + } + default: + return 0; + + + + } + + return 0; + +} @@ -18,7 +46,19 @@ int cw_readelem_vendor_specific_payload(void * data,int msgtype,int elemtype,uin return 1; } -// uint32_t vendor_id = ntohl( *((uint32_t*)msgelem) ); + + uint32_t vendor_id = ntohl( *((uint32_t*)msgelem) ); + uint16_t elem_id = ntohs( *( (uint16_t*)(msgelem+4) )); + int elem_len = len - 6; + + switch (vendor_id) { + + case CW_VENDOR_ID_CISCO: + return cw_readelem_cisco_payload(data,msgtype,elem_id,msgelem+6,elem_len); + + } + + return 1; diff --git a/src/capwap/cw_util.h b/src/capwap/cw_util.h index 9f97e5ad..e76ffac8 100644 --- a/src/capwap/cw_util.h +++ b/src/capwap/cw_util.h @@ -16,11 +16,27 @@ */ +/** + *@file + *@brief Definitions for imisc. cw_utill functions. + */ + +#ifndef __CW_UTIL_H +#define __CW_UTIL_H + #include #include -extern uint8_t * cw_setstr(uint8_t ** dst, const uint8_t *src, int len); +#include "bstr.h" +extern int cw_format_version(char *s, bstr_t version, uint32_t vendor, char * def); +extern int cw_is_printable(const uint8_t * s,int len); + + + + + +extern uint8_t * cw_setstr(uint8_t ** dst, const uint8_t *src, int len); extern int cw_foreach_msgelem(uint8_t * msgelems, int len, int (*callback)(void*,int,uint8_t*,int),void *arg ); @@ -28,14 +44,13 @@ extern int cw_foreach_msgelem(uint8_t * msgelems, int len, extern int cw_rand(uint8_t*dst, int len); -extern int cw_is_printable(const uint8_t * s,int len); #define cw_timer_start(t) (time(NULL)+t) #define cw_timer_timeout(t) (time(NULL)>t ? 1 : 0) -/* generic macroto to isolate bits from a dword */ +/** Generic macroto to isolate bits from a dword */ #define cw_get_dword_bits(src,start,len) ((~(0xFFFFFFFF<> (32 - start - len))) @@ -44,3 +59,4 @@ void cw_mand_elem_found(int *l,int type); int cw_is_missing_mand_elems(int *l); void cw_get_missing_mand_elems(char *dst, int *l); +#endif diff --git a/src/capwap/cwmsg_addelem_ac_descriptor.c b/src/capwap/cwmsg_addelem_ac_descriptor.c index a4eae27c..7c4074ab 100644 --- a/src/capwap/cwmsg_addelem_ac_descriptor.c +++ b/src/capwap/cwmsg_addelem_ac_descriptor.c @@ -57,10 +57,13 @@ void cwmsg_addelem_ac_descriptor(struct cwmsg *msg,struct ac_info * acinfo) case CWMODE_CISCO: len+=add_subelem(buffer+len,0,CW_VENDOR_ID_CISCO,acinfo->cisco_hardware_version); len+=add_subelem(buffer+len,1,CW_VENDOR_ID_CISCO,acinfo->cisco_software_version); + //len+=add_subelem(buffer+len,5,CW_VENDOR_ID_CISCO,acinfo->cisco_software_version); + break; default: - len+=add_subelem(buffer+len,0,0,acinfo->hardware_version); - len+=add_subelem(buffer+len,1,0,acinfo->software_version); + len+=add_subelem(buffer+len,4,0,acinfo->hardware_version); + len+=add_subelem(buffer+len,5,0,acinfo->software_version); + break; } diff --git a/src/capwap/cwmsg_addelem_wtp_radio_infos.c b/src/capwap/cwmsg_addelem_wtp_radio_infos.c index a8f77990..a3c7e01e 100644 --- a/src/capwap/cwmsg_addelem_wtp_radio_infos.c +++ b/src/capwap/cwmsg_addelem_wtp_radio_infos.c @@ -35,7 +35,7 @@ void cwmsg_addelem_wtp_radio_info(struct cwmsg * msg,struct radioinfo *radioinfo void cwmsg_addelem_wtp_radio_infos(struct cwmsg * msg,struct radioinfo * radioinfos) { int i; - for (i=1; i<=4; i++) + for (i=0; i<=1; i++) { // if (radioinfos[i].rid!=0) cwmsg_addelem_wtp_radio_info(msg,&radioinfos[i]); diff --git a/src/capwap/cwread_change_state_event_request.c b/src/capwap/cwread_change_state_event_request.c index 32169d08..fc326e9b 100644 --- a/src/capwap/cwread_change_state_event_request.c +++ b/src/capwap/cwread_change_state_event_request.c @@ -20,7 +20,6 @@ * @file * @brief Defines cwread_change_state_even_request function. * - * Full text */ #include @@ -56,7 +55,11 @@ foundX: } /** - * @brief Read elements of a Change State Event Request message. + * Read elements of a Change State Event Request message. + * @param wtpinfo wtpinfo where the results are stored. + * @param msg a pointer to the message + * @param len length of the message + * @return result code */ int cwread_change_state_event_request(struct wtpinfo * wtpinfo, uint8_t * msg, int len) { diff --git a/src/capwap/cwread_configuration_status_request.c b/src/capwap/cwread_configuration_status_request.c index 6a4b8473..57375c85 100644 --- a/src/capwap/cwread_configuration_status_request.c +++ b/src/capwap/cwread_configuration_status_request.c @@ -16,6 +16,11 @@ */ +/** + * @file + * @brief Implents configuration status request + */ + #include #include "capwap.h" @@ -34,15 +39,30 @@ static int readelem(void * eparm,int type,uint8_t* msgelem,int len) cw_dbg_msgelem(CWMSG_CONFIGURATION_STATUS_REQUEST, type, msgelem,len); /* mandatory elements */ + + /* ac name */ if (cw_readelem_ac_name(&e->wtpinfo->ac_name,type,msgelem,len)) goto foundX; - if (cw_readelem_wtp_reboot_statistics(&e->wtpinfo->reboot_statistics,type,msgelem,len)) - goto foundX; + + /* radio administrative state */ if (cw_readelem_radio_administrative_state(e->wtpinfo->radioinfo, type,msgelem,len)) goto foundX; + + /* statistics timer */ if (cw_readelem_statistics_timer(&e->wtpinfo->statistics_timer, type,msgelem,len)) goto foundX; + /* reboot statistics */ + if (cw_readelem_wtp_reboot_statistics(&e->wtpinfo->reboot_statistics,type,msgelem,len)) + goto foundX; + + /* non-mantatory elements */ + + if (cw_readelem_vendor_specific_payload + (e->wtpinfo, CWMSG_CONFIGURATION_STATUS_REQUEST, type, msgelem, len)) + return 1; + + return 0; foundX: cw_mand_elem_found(e->mand,type); diff --git a/src/capwap/cwread_discovery_response.c b/src/capwap/cwread_discovery_response.c index 7de9deaf..0a7c107a 100644 --- a/src/capwap/cwread_discovery_response.c +++ b/src/capwap/cwread_discovery_response.c @@ -44,7 +44,7 @@ static int acinfo_readelem_discovery_resp(void * eparm,int type,uint8_t* msgelem struct eparm *e = (struct eparm *) eparm; - if (acinfo_readelem_ac_descriptor(e->acinfo,type,msgelem,len)) + if (cw_readelem_ac_descriptor(e->acinfo,type,msgelem,len)) goto foundX; if (acinfo_readelem_ac_name(e->acinfo,type,msgelem,len)) diff --git a/src/capwap/cwread_join_response.c b/src/capwap/cwread_join_response.c index d8fa9b7b..4a663937 100644 --- a/src/capwap/cwread_join_response.c +++ b/src/capwap/cwread_join_response.c @@ -25,7 +25,6 @@ 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; @@ -38,7 +37,7 @@ printf("Here we are reading\n"); if (acinfo_readelem_ecn_support(acinfo,type,msgelem,len)) goto foundX; - if (acinfo_readelem_ac_descriptor(acinfo,type,msgelem,len)) + if (cw_readelem_ac_descriptor(acinfo,type,msgelem,len)) goto foundX; if (acinfo_readelem_ac_name(acinfo,type,msgelem,len)) diff --git a/src/capwap/cwsend_discovery_response.c b/src/capwap/cwsend_discovery_response.c index f928e258..a4d705ad 100644 --- a/src/capwap/cwsend_discovery_response.c +++ b/src/capwap/cwsend_discovery_response.c @@ -35,6 +35,7 @@ void cwsend_discovery_response(struct conn * conn,int seqnum, struct radioinfo * struct cwmsg * cwmsg = &conn->resp_msg; cwmsg_init(cwmsg,conn->resp_buffer,CWMSG_DISCOVERY_RESPONSE,seqnum,NULL); + cwmsg->capwap_mode = conn->capwap_mode; cwmsg_addelem_ac_descriptor(cwmsg,acinfo); @@ -45,9 +46,15 @@ void cwsend_discovery_response(struct conn * conn,int seqnum, struct radioinfo * /* Send Cisco-specific message elements if needed */ -// if (conn->capwap_mode == CWMODE_CISCO){ - // cwmsg_addelem_vendor_cisco_ap_timesync(cwmsg); -// } + switch (cwmsg->capwap_mode) { + case CWMODE_CISCO: + case CWMODE_CIPWAP: + cwmsg_addelem_vendor_cisco_ap_timesync(cwmsg); + break; + default: + break; + + } diff --git a/src/capwap/cwsend_join_response.c b/src/capwap/cwsend_join_response.c index 7067b146..75e4171d 100644 --- a/src/capwap/cwsend_join_response.c +++ b/src/capwap/cwsend_join_response.c @@ -10,6 +10,7 @@ void cwsend_join_response(struct conn * conn,int seqnum, int rc, struct radioinf { struct cwmsg * cwmsg = &conn->resp_msg; cwmsg_init(cwmsg,conn->resp_buffer,CWMSG_JOIN_RESPONSE,seqnum,NULL); + cwmsg->capwap_mode=conn->capwap_mode; /* mandatory messagesg elements */ cwmsg_addelem_result_code(cwmsg,rc); @@ -24,7 +25,6 @@ void cwsend_join_response(struct conn * conn,int seqnum, int rc, struct radioinf cwmsg_addelem_image_identifier(cwmsg,CW_VENDOR_ID_CISCO,(uint8_t*)"/tobias",strlen("/tobias")); - uint8_t buffer[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; buffer[0]=0; /* Mwar Type */ buffer[1]=1; /* h/w version */ @@ -41,7 +41,7 @@ void cwsend_join_response(struct conn * conn,int seqnum, int rc, struct radioinf *((uint16_t*)(buffer+9+2))=htons(23); /* Supported MS */ *((uint16_t*)(buffer+9+4))=htons(5); /* Active RAD's */ *((uint16_t*)(buffer+9+6))=htons(15); /* Supported RAD's */ - cwmsg_addelem_vendor_specific_payload(cwmsg,CW_VENDOR_ID_CISCO, CWVENDOR_CISCO_MWAR, buffer,34); +// cwmsg_addelem_vendor_specific_payload(cwmsg,CW_VENDOR_ID_CISCO, CWVENDOR_CISCO_MWAR, buffer,34); conn_send_response(conn,cwmsg,seqnum); diff --git a/src/capwap/fragman.c b/src/capwap/fragman.c index 8db9eb2c..97c19631 100644 --- a/src/capwap/fragman.c +++ b/src/capwap/fragman.c @@ -18,8 +18,8 @@ /* - * This file implements a simple fragment management system - * for the capwap protocol. + * @file + * @brief This file implements a simple fragment management system for the capwap protocol. * * Usage goes as follows. * @@ -52,7 +52,7 @@ #include "capwap.h" #include "fragman.h" -/* +/** * check if we keep already fragments belonging to the * specified fragment id */ @@ -70,7 +70,7 @@ static struct frag * frag_get(struct frag * frags, int fragid) return NULL; } -/* +/** * create a new fragment */ static struct frag * frag_new(struct frag * frags, int fragid) diff --git a/src/capwap/lwapp.h b/src/capwap/lwapp.h index 7256cb27..05ca28e4 100644 --- a/src/capwap/lwapp.h +++ b/src/capwap/lwapp.h @@ -16,6 +16,10 @@ */ +#ifndef __LWAPP_H +#define __LWAPP_H + + #include @@ -92,19 +96,19 @@ */ +/* LWAPP message elements */ -#define LWMSGELEM_WTP_DESCRIPTOR 3 - +#define LWMSGELEM_WTP_DESCRIPTOR 3 +#define LWMSGELEM_WTP_BOARD_DATA 50 /* function proto types */ uint16_t lw_checksum(uint8_t *d,int len); +int lw_readelem_wtp_board_data(struct wtpinfo *wtpinfo, int type, uint8_t *msgelem, int len); - - - +#endif diff --git a/src/wtp/discovery.c b/src/wtp/discovery.c index 4f9d27bb..d43aa796 100644 --- a/src/wtp/discovery.c +++ b/src/wtp/discovery.c @@ -94,8 +94,8 @@ static int msg_cb(void *priv,struct cwrmsg * cwrmsg) printf("AC INFO\n%s",ai); -printf("CWRHW: %s\n",sock_hwaddr2str(bstr_data(cwrmsg->rmac),bstr_len(cwrmsg->rmac))); -exit(0); +//printf("CWRHW: %s\n",sock_hwaddr2str(bstr_data(cwrmsg->rmac),bstr_len(cwrmsg->rmac))); +///exit(0); /* diff --git a/src/wtp/join.c b/src/wtp/join.c index c45d9e14..f33eac74 100644 --- a/src/wtp/join.c +++ b/src/wtp/join.c @@ -75,10 +75,8 @@ for(int i=0; i<10; i++){ 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");