diff --git a/doc/capwap_cisco.txt b/doc/capwap_cisco.txt index d8ac13b3..7b0b38f6 100644 --- a/doc/capwap_cisco.txt +++ b/doc/capwap_cisco.txt @@ -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 diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c index 8768ad10..24832e2f 100644 --- a/src/ac/ac_main.c +++ b/src/ac/ac_main.c @@ -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){ diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index 133d7240..361a9f09 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -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); diff --git a/src/capwap/Makefile b/src/capwap/Makefile index b0083298..5b3b214b 100644 --- a/src/capwap/Makefile +++ b/src/capwap/Makefile @@ -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)) diff --git a/src/capwap/acinfo.c b/src/capwap/acinfo.c index 8ece11e0..7b36e881 100644 --- a/src/capwap/acinfo.c +++ b/src/capwap/acinfo.c @@ -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) diff --git a/src/capwap/capwap_cisco.h b/src/capwap/capwap_cisco.h index 328376fe..68d62039 100644 --- a/src/capwap/capwap_cisco.h +++ b/src/capwap/capwap_cisco.h @@ -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 diff --git a/src/capwap/conn_process_packet.c b/src/capwap/conn_process_packet.c index 9e453925..07b7b41c 100644 --- a/src/capwap/conn_process_packet.c +++ b/src/capwap/conn_process_packet.c @@ -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; diff --git a/src/capwap/cw_foreach_msgelem.c b/src/capwap/cw_foreach_msgelem.c index 30149ded..13a7ea39 100644 --- a/src/capwap/cw_foreach_msgelem.c +++ b/src/capwap/cw_foreach_msgelem.c @@ -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; diff --git a/src/capwap/cw_log_debug.c b/src/capwap/cw_log_debug.c index 15cdfbfb..e8a047c2 100644 --- a/src/capwap/cw_log_debug.c +++ b/src/capwap/cw_log_debug.c @@ -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", diff --git a/src/capwap/cw_log_str2dbglevel.c b/src/capwap/cw_log_str2dbglevel.c index cbe779bf..73206edc 100644 --- a/src/capwap/cw_log_str2dbglevel.c +++ b/src/capwap/cw_log_str2dbglevel.c @@ -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}, diff --git a/src/capwap/cw_msgelemtostr.c b/src/capwap/cw_msgelemtostr.c index 5cb687aa..7c7e55ea 100644 --- a/src/capwap/cw_msgelemtostr.c +++ b/src/capwap/cw_msgelemtostr.c @@ -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 diff --git a/src/capwap/cw_msgtostr.c b/src/capwap/cw_msgtostr.c index 1bd75fa0..256681cb 100644 --- a/src/capwap/cw_msgtostr.c +++ b/src/capwap/cw_msgtostr.c @@ -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"; diff --git a/src/capwap/cw_readelem_ac_descriptor.c b/src/capwap/cw_readelem_ac_descriptor.c index 82f8f0a7..92ecb3d2 100644 --- a/src/capwap/cw_readelem_ac_descriptor.c +++ b/src/capwap/cw_readelem_ac_descriptor.c @@ -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) diff --git a/src/capwap/cw_readelem_ac_name.c b/src/capwap/cw_readelem_ac_name.c index d11b1d6f..43beb9de 100644 --- a/src/capwap/cw_readelem_ac_name.c +++ b/src/capwap/cw_readelem_ac_name.c @@ -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 ) { diff --git a/src/capwap/cw_readelem_capwap_local_ip_addr.c b/src/capwap/cw_readelem_capwap_local_ip_addr.c index c461be30..43e57695 100644 --- a/src/capwap/cw_readelem_capwap_local_ip_addr.c +++ b/src/capwap/cw_readelem_capwap_local_ip_addr.c @@ -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; diff --git a/src/capwap/cw_readelem_vendor_specific_payload.c b/src/capwap/cw_readelem_vendor_specific_payload.c index 44dea9e8..1c1b3129 100644 --- a/src/capwap/cw_readelem_vendor_specific_payload.c +++ b/src/capwap/cw_readelem_vendor_specific_payload.c @@ -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); } diff --git a/src/capwap/cw_util.h b/src/capwap/cw_util.h index 6cacdc4c..ed0c9795 100644 --- a/src/capwap/cw_util.h +++ b/src/capwap/cw_util.h @@ -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<> (32 - start - len))) diff --git a/src/capwap/cwmsg.h b/src/capwap/cwmsg.h index 234c6acc..7452b54f 100644 --- a/src/capwap/cwmsg.h +++ b/src/capwap/cwmsg.h @@ -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 diff --git a/src/capwap/cwmsg_addelem_ac_descriptor.c b/src/capwap/cwmsg_addelem_ac_descriptor.c index 788cc875..aad17772 100644 --- a/src/capwap/cwmsg_addelem_ac_descriptor.c +++ b/src/capwap/cwmsg_addelem_ac_descriptor.c @@ -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); } diff --git a/src/capwap/cwmsg_addelem_ac_timestamp.c b/src/capwap/cwmsg_addelem_ac_timestamp.c index fbf4cd17..374e2a5f 100644 --- a/src/capwap/cwmsg_addelem_ac_timestamp.c +++ b/src/capwap/cwmsg_addelem_ac_timestamp.c @@ -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); } diff --git a/src/capwap/cwmsg_addelem_cw_local_ip_addr.c b/src/capwap/cwmsg_addelem_cw_local_ip_addr.c index 6c5ce46b..37899579 100644 --- a/src/capwap/cwmsg_addelem_cw_local_ip_addr.c +++ b/src/capwap/cwmsg_addelem_cw_local_ip_addr.c @@ -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; diff --git a/src/capwap/cwmsg_addelem_vendor_cisco_ap_timesync.c b/src/capwap/cwmsg_addelem_vendor_cisco_ap_timesync.c index 73c6ef53..75501dbe 100644 --- a/src/capwap/cwmsg_addelem_vendor_cisco_ap_timesync.c +++ b/src/capwap/cwmsg_addelem_vendor_cisco_ap_timesync.c @@ -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)); } diff --git a/src/capwap/cwmsg_addelem_vendor_cisco_mwar_addr.c b/src/capwap/cwmsg_addelem_vendor_cisco_mwar_addr.c index d563dc62..2dea284c 100644 --- a/src/capwap/cwmsg_addelem_vendor_cisco_mwar_addr.c +++ b/src/capwap/cwmsg_addelem_vendor_cisco_mwar_addr.c @@ -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, diff --git a/src/capwap/cwmsg_addelem_vendor_specific_payload.c b/src/capwap/cwmsg_addelem_vendor_specific_payload.c index e8918137..6c7456a4 100644 --- a/src/capwap/cwmsg_addelem_vendor_specific_payload.c +++ b/src/capwap/cwmsg_addelem_vendor_specific_payload.c @@ -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); } diff --git a/src/capwap/cwmsg_init.c b/src/capwap/cwmsg_init.c index 91adf7b6..95a520da 100644 --- a/src/capwap/cwmsg_init.c +++ b/src/capwap/cwmsg_init.c @@ -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; } diff --git a/src/capwap/cwread_configuration_status_request.c b/src/capwap/cwread_configuration_status_request.c index 57375c85..77b37004 100644 --- a/src/capwap/cwread_configuration_status_request.c +++ b/src/capwap/cwread_configuration_status_request.c @@ -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, diff --git a/src/capwap/cwread_discovery_response.c b/src/capwap/cwread_discovery_response.c index 0a7c107a..513423eb 100644 --- a/src/capwap/cwread_discovery_response.c +++ b/src/capwap/cwread_discovery_response.c @@ -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, diff --git a/src/capwap/cwsend_conf_status_response.c b/src/capwap/cwsend_conf_status_response.c index 36027982..c835c7e6 100644 --- a/src/capwap/cwsend_conf_status_response.c +++ b/src/capwap/cwsend_conf_status_response.c @@ -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); /* diff --git a/src/capwap/cwsend_discovery_request.c b/src/capwap/cwsend_discovery_request.c index a8e10b91..24995200 100644 --- a/src/capwap/cwsend_discovery_request.c +++ b/src/capwap/cwsend_discovery_request.c @@ -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: diff --git a/src/capwap/cwsend_discovery_response.c b/src/capwap/cwsend_discovery_response.c index 73891b87..465a770b 100644 --- a/src/capwap/cwsend_discovery_response.c +++ b/src/capwap/cwsend_discovery_response.c @@ -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; diff --git a/src/capwap/cwsend_join_request.c b/src/capwap/cwsend_join_request.c index 9b152675..845f7bbc 100644 --- a/src/capwap/cwsend_join_request.c +++ b/src/capwap/cwsend_join_request.c @@ -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); } diff --git a/src/capwap/cwsend_join_response.c b/src/capwap/cwsend_join_response.c index 0c09b22b..ebb12a9a 100644 --- a/src/capwap/cwsend_join_response.c +++ b/src/capwap/cwsend_join_response.c @@ -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); diff --git a/src/capwap/dtls_gnutls_connect.c b/src/capwap/dtls_gnutls_connect.c index bc36e3ce..214cb31f 100644 --- a/src/capwap/dtls_gnutls_connect.c +++ b/src/capwap/dtls_gnutls_connect.c @@ -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); diff --git a/src/capwap/hdr_print.c b/src/capwap/hdr_print.c index 62d129ab..05eae248 100644 --- a/src/capwap/hdr_print.c +++ b/src/capwap/hdr_print.c @@ -21,14 +21,14 @@ #include #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; } diff --git a/src/capwap/lw_checksum.c b/src/capwap/lw_checksum.c index 18c3cbe0..427b603d 100644 --- a/src/capwap/lw_checksum.c +++ b/src/capwap/lw_checksum.c @@ -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; diff --git a/src/capwap/lw_readelem_wtp_board_data.c b/src/capwap/lw_readelem_wtp_board_data.c index cd2ffef7..22710dc1 100644 --- a/src/capwap/lw_readelem_wtp_board_data.c +++ b/src/capwap/lw_readelem_wtp_board_data.c @@ -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 ) { diff --git a/src/capwap/lw_readelem_wtp_name.c b/src/capwap/lw_readelem_wtp_name.c index ecdec9e3..626e1429 100644 --- a/src/capwap/lw_readelem_wtp_name.c +++ b/src/capwap/lw_readelem_wtp_name.c @@ -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; diff --git a/src/capwap/lwapp.h b/src/capwap/lwapp.h index b6d94b55..1424a769 100644 --- a/src/capwap/lwapp.h +++ b/src/capwap/lwapp.h @@ -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; dsession_id = bstr_create(msgelem,len); diff --git a/src/wtp/configure.c b/src/wtp/configure.c index caa94abd..584023a0 100644 --- a/src/wtp/configure.c +++ b/src/wtp/configure.c @@ -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); } diff --git a/src/wtp/discovery.c b/src/wtp/discovery.c index d43aa796..9f4b2a69 100644 --- a/src/wtp/discovery.c +++ b/src/wtp/discovery.c @@ -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; } diff --git a/src/wtp/join.c b/src/wtp/join.c index d7911a55..a0c46f51 100644 --- a/src/wtp/join.c +++ b/src/wtp/join.c @@ -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; diff --git a/src/wtp/run.c b/src/wtp/run.c index 8eb70084..42ecd133 100644 --- a/src/wtp/run.c +++ b/src/wtp/run.c @@ -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); } diff --git a/src/wtp/wtp_conf.c b/src/wtp/wtp_conf.c index 16185c44..71db203a 100644 --- a/src/wtp/wtp_conf.c +++ b/src/wtp/wtp_conf.c @@ -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() diff --git a/src/wtp/wtp_interface.c b/src/wtp/wtp_interface.c index 21408097..5c264c47 100644 --- a/src/wtp/wtp_interface.c +++ b/src/wtp/wtp_interface.c @@ -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() { diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index bc602071..8bdea795 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -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; } diff --git a/src/wtp/wtpdrv.c b/src/wtp/wtpdrv.c index cb4d70b8..d1d9c9a4 100644 --- a/src/wtp/wtpdrv.c +++ b/src/wtp/wtpdrv.c @@ -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];