Working on Cisoc support.

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

View File

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

View File

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

View File

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

View File

@ -56,9 +56,22 @@ UTILOBJS= \
cw_util.o \ cw_util.o \
cw_format_version.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\ # cw_tohex.o\
#capwap_parse_ctrlhdr.o \ #capwap_parse_ctrlhdr.o \
CAPWAPOBJS= \ CAPWAPOBJS= \
cwmsg_init.o \ cwmsg_init.o \
cwmsg_init_echo_request.o \ cwmsg_init_echo_request.o \
@ -134,9 +147,7 @@ CAPWAPOBJS= \
cw_readelem_wtp_reboot_statistics.o\ cw_readelem_wtp_reboot_statistics.o\
cwmsg_addelem_vendor_cisco_ap_timesync.o \ cwmsg_addelem_vendor_cisco_ap_timesync.o \
cwmsg_addelem_vendor_cisco_mwar_addr.o \ cwmsg_addelem_vendor_cisco_mwar_addr.o \
lw_checksum.o \
lw_readelem_wtp_board_data.o \ lw_readelem_wtp_board_data.o \
lw_readelem_wtp_name.o
#cwmsg_addelem_session_id.o #cwmsg_addelem_session_id.o
# process_msgelems_discovery_request.o \ # process_msgelems_discovery_request.o \
@ -188,6 +199,7 @@ CONNOBJS= conn_create.o \
conn_get_message.o \ conn_get_message.o \
conn_get_response.o \ conn_get_response.o \
conn_prepare_configuration_update_request.o \ conn_prepare_configuration_update_request.o \
cw_prepare_configuration_status_request.o \
conn_prepare_request.o \ conn_prepare_request.o \
conn_prepare_image_data_request.o \ conn_prepare_image_data_request.o \
conn_send_request.o \ conn_send_request.o \
@ -204,7 +216,11 @@ BSTROBJS= bstr_create.o \
FRAGOBJS=fragman.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); O:=$(OBJS);
OBJS:=$(patsubst %.o,$(ARCH)/%.o,$(OBJS)) OBJS:=$(patsubst %.o,$(ARCH)/%.o,$(OBJS))

View File

@ -43,7 +43,7 @@ int acinfo_readelem_ac_name(struct ac_info * acinfo,int type, uint8_t *msgelem,
int acinfo_readelem_ac_descriptor(struct ac_info * acinfo,int type, uint8_t *msgelem, int len) 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; return 0;
if (len<12) if (len<12)

View File

@ -31,29 +31,27 @@
#define CWVENDOR_CISCO_MWAR_ADDR 2 #define CWVENDOR_CISCO_MWAR_ADDR 2
#define CWVENDOR_CISCO_RAD 3 #define CWVENDOR_CISCO_RAD 3
#define CWVENDOR_CISCO_RAD_SLOT 4 #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_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 CWVENDER_CISCO_AP_MODE_AND_TYPE 54
#define CWVENDOR_CISCO_AP_IP_ADDR 83 #define CWVENDOR_CISCO_AP_IP_ADDR 83
#define CWVENDOR_CISCO_SPAM_VENDOR_SPECIFIC 104 #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_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_PRE_STD_SWITCH_CONFIG 137
#define CWVENDOR_CISCO_AP_POWER_INJECTOR_CONFIG 138 #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 CW_CISCO_BOARD_DATA_OPTIONS 207
#define CW_CISCO_MWAR_TYPE 208
#define CWVENDOR_CISCO_MWAR_TYPE 208

View File

@ -127,20 +127,24 @@ static int process_message(struct conn * conn,struct cwrmsg *cwrmsg,int (*cb)(vo
static void cw_dbg_packet(struct conn * conn, uint8_t * packet, int len) 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; return;
printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Header printer\n");
/* print the header */ /* print the header */
char hdr[200]; char hdr[200];
hdr_print(hdr,packet,len); hdr_print(hdr,packet,len);
if (!cw_dbg_is_level(DBG_CW_PKT_DMP)){ 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; 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:", 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 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) 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; return;
} }
printf("Debug packet **************************************************************************\n");
cw_dbg_packet(conn,packet,len);
int hlen = 4*((val >> 19) & 0x1f); 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) if (f==NULL)
return; return;
cw_dbg_packet(conn,f+4,*(uint32_t*)f);
if (!cwrmsg_init_ctrlhdr(conn,&cwrmsg,f+4,*(uint32_t*)f)){ if (!cwrmsg_init_ctrlhdr(conn,&cwrmsg,f+4,*(uint32_t*)f)){
free(f); free(f);
return; return;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -77,7 +77,7 @@ static int read_subelem(struct ac_info* acinfo,int subtype,uint8_t *elem, int le
*/ */
int cw_readelem_ac_descriptor(struct ac_info * acinfo,int type, uint8_t *msgelem, int len) 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; return 0;
if (len<12) if (len<12)

View File

@ -23,7 +23,7 @@
int cw_readelem_ac_name(uint8_t **dst, int type,uint8_t *msgelem, int len) 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; return 0;
if (len > 512 ) { if (len > 512 ) {

View File

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

View File

@ -15,7 +15,7 @@ int cw_readelem_cisco_payload(void *data,int msgtype,int elem_id,uint8_t *msgele
switch (msgtype) { 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)) if (lw_readelem_wtp_board_data((struct wtpinfo*)data,elem_id,msgelem,len))
return 1; 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) 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; return 0;
if (len < 6){ 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: case CW_VENDOR_ID_CISCO:
return cw_readelem_cisco_payload(data,msgtype,elem_id,msgelem+6,elem_len); return cw_readelem_cisco_payload(data,msgtype,elem_id,msgelem+6,elem_len);
default:
cw_dbg(DBG_ERR,"Can't read vendor specific payload. Vendor ID %d",vendor_id);
} }

View File

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

View File

@ -41,7 +41,5 @@ extern void cwmsg_addelem_radio_operational_state(struct cwmsg * cwmsg, struct r
extern void cwmsg_addelem_vendor_cisco_mwar_addr(struct cwmsg *msg, struct conn *conn); 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 #endif

View File

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

View File

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

View File

@ -27,6 +27,7 @@
#include "cwmsg.h" #include "cwmsg.h"
#include "conn.h" #include "conn.h"
#include "sock.h" //Tube
void cwmsg_addelem_cw_local_ip_addr(struct cwmsg *msg, struct conn * conn) 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); getsockname (conn->sock,(struct sockaddr *)&a,&alen);
int cw_mode = msg->capwap_mode; int cw_mode = msg->capwap_mode;
cw_mode = CWMODE_CISCO;
switch (((struct sockaddr*)&a)->sa_family){ switch (((struct sockaddr*)&a)->sa_family){
case AF_INET: 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; struct sockaddr_in * sain = (struct sockaddr_in*)&a;
int id; int id;
if (cw_mode == CWMODE_CISCO) if (cw_mode == CWMODE_CISCO)
id = CWMSGELEM_WTP_IPV4_IP_ADDR; id = CW_ELEM_WTP_IPV4_IP_ADDRESS;
else else
id = CWMSGELEM_CAPWAP_LOCAL_IPV4_ADDRESS; 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); cwmsg_addelem(msg,id,(uint8_t*)&sain->sin_addr,4);
break; break;
@ -56,7 +61,7 @@ void cwmsg_addelem_cw_local_ip_addr(struct cwmsg *msg, struct conn * conn)
{ {
int id; int id;
if (cw_mode == CWMODE_CISCO) if (cw_mode == CWMODE_CISCO)
id = CWMSGELEM_WTP_IPV6_IP_ADDR; id = CW_ELEM_WTP_IPV6_IP_ADDRESS;
else else
id = CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS; id = CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS;
struct sockaddr_in6 * sain = (struct sockaddr_in6*)&a; struct sockaddr_in6 * sain = (struct sockaddr_in6*)&a;

View File

@ -25,6 +25,6 @@ void cwmsg_addelem_vendor_cisco_ap_timesync(struct cwmsg *cwmsg)
{ {
//time_t t = htonl(time(NULL)); //time_t t = htonl(time(NULL));
uint32_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)); (uint8_t *) & t, sizeof(t));
} }

View File

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

View File

@ -36,7 +36,7 @@ void cwmsg_addelem_vendor_specific_payload(struct cwmsg *msg,int vendor_id, int
memcpy(buffer+6,payload,len); 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); free(buffer);
} }

View File

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

View File

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

View File

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

View File

@ -14,7 +14,7 @@ void cwmsg_addelem_capwap_timers(struct cwmsg *msg,int discovery,int echo_reques
void cwsend_conf_status_response(struct conn * conn,int seqnum, int rc, struct radioinfo * radioinfo, struct ac_info * acinfo, struct wtpinfo * wtpinfo) 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; 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); cwmsg_addelem_capwap_timers(cwmsg,120,15);
/* /*

View File

@ -35,7 +35,7 @@ int cwsend_discovery_request(struct conn *conn, struct radioinfo *radioinfo,
struct cwmsg cwmsg; struct cwmsg cwmsg;
cwmsg_init(&cwmsg, buffer, CWMSG_DISCOVERY_REQUEST, conn_get_next_seqnum(conn), cwmsg_init(&cwmsg, buffer, CWMSG_DISCOVERY_REQUEST, conn_get_next_seqnum(conn),
NULL /*radioinfo */ ); radioinfo );
cwmsg.capwap_mode = conn->capwap_mode; cwmsg.capwap_mode = conn->capwap_mode;
@ -67,6 +67,12 @@ int cwsend_discovery_request(struct conn *conn, struct radioinfo *radioinfo,
switch (cwmsg.capwap_mode) { switch (cwmsg.capwap_mode) {
case CWMODE_CISCO: case CWMODE_CISCO:
cwmsg_addelem_vendor_cisco_rad_name(&cwmsg, (uint8_t *) wtpinfo->name); 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; break;
default: default:

View File

@ -41,7 +41,7 @@ void cwsend_discovery_response(struct conn *conn, int seqnum, struct radioinfo *
cwmsg_addelem_ac_descriptor(cwmsg, acinfo,wtpinfo); cwmsg_addelem_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)); strlen((char *) acinfo->ac_name));
cwmsg_addelem_wtp_radio_infos(cwmsg, acinfo->radioinfos); 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) { switch (cwmsg->capwap_mode) {
case CWMODE_CISCO: case CWMODE_CISCO:
case CWMODE_CIPWAP: case CWMODE_CIPWAP:
{
cwmsg_addelem_vendor_cisco_ap_timesync(cwmsg); 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; break;
}
default: default:
break; break;

View File

@ -21,17 +21,30 @@
#include "capwap.h" #include "capwap.h"
#include "capwap_cisco.h" #include "capwap_cisco.h"
#include "lwapp_cisco.h"
#include "conn.h" #include "conn.h"
#include "cwmsg.h" #include "cwmsg.h"
#include "sock.h"
#include "acinfo.h" //Tube
int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct wtpinfo *wtpinfo) int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct wtpinfo *wtpinfo)
{ {
uint8_t buffer[CWMSG_MAX_SIZE]; uint8_t buffer[CWMSG_MAX_SIZE];
struct cwmsg cwmsg; struct cwmsg cwmsg;
//radioinfo->rmac=0;
cwmsg_init(&cwmsg, buffer, CWMSG_JOIN_REQUEST, conn_get_next_seqnum(conn), radioinfo); cwmsg_init(&cwmsg, buffer, CWMSG_JOIN_REQUEST, conn_get_next_seqnum(conn), radioinfo);
cwmsg.capwap_mode = conn->capwap_mode; cwmsg.capwap_mode = conn->capwap_mode;
// printf("Rad info rmac %s\n",sock_hwaddr2str(bstr_data(radioinfo->rmac),bstr_len(radioinfo->rmac)));
/* Mandatory elements */ /* Mandatory elements */
/* location data */ /* location data */
@ -57,20 +70,38 @@ int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct w
/* WTP MAC type */ /* WTP MAC type */
cwmsg_addelem(&cwmsg, CWMSGELEM_WTP_MAC_TYPE, &wtpinfo->mac_type, sizeof(uint8_t)); 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) { switch (conn->capwap_mode) {
case CWMODE_CISCO: case CWMODE_CISCO:
cwmsg_addelem_vendor_cisco_mwar_addr(&cwmsg,conn); 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, 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")); 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; break;
@ -80,15 +111,38 @@ int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct w
sizeof(uint8_t)); sizeof(uint8_t));
} }
/* local ip address */ /* WTP radio information elements */
cwmsg_addelem_cw_local_ip_addr(&cwmsg, conn); cwmsg_addelem_wtp_radio_infos(&cwmsg, wtpinfo->radioinfo);
/* Non-mandatory elements */ /* Non-mandatory elements */
/* maximum message length */ switch (conn->capwap_mode) {
uint16_t l = htons(wtpinfo->max_msg_len); case CWMODE_CISCO:
cwmsg_addelem(&cwmsg, CWMSGELEM_MAXIMUM_MESSAGE_LENGTH, (uint8_t *) & l, sizeof(l)); {
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); return conn_send_cwmsg(conn, &cwmsg);
} }

View File

@ -17,7 +17,7 @@ void cwsend_join_response(struct conn *conn, int seqnum, int rc, struct radioinf
cwmsg_addelem_result_code(cwmsg, rc); cwmsg_addelem_result_code(cwmsg, rc);
cwmsg_addelem_ac_descriptor(cwmsg, acinfo,wtpinfo); 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(cwmsg, CWMSGELEM_ECN_SUPPORT, &acinfo->ecn_support, sizeof(uint8_t));
cwmsg_addelem_ctrl_ip_addrs(cwmsg, acinfo); cwmsg_addelem_ctrl_ip_addrs(cwmsg, acinfo);
// cwmsg_addelem_cw_local_ip_addr(cwmsg,conn); // cwmsg_addelem_cw_local_ip_addr(cwmsg,conn);

View File

@ -1,10 +1,15 @@
#include "gnutls/dtls.h"
#include "dtls.h" #include "dtls.h"
#include "dtls_gnutls.h" #include "dtls_gnutls.h"
#include "conn.h" #include "conn.h"
#include "cw_log.h" #include "cw_log.h"
int dtls_gnutls_connect(struct conn *conn) int dtls_gnutls_connect(struct conn *conn)
{ {
struct dtls_gnutls_data * d; 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_dh_set_prime_bits(d->session, 512);
gnutls_handshake_set_timeout(d->session,GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT); 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; int rc;
do { do {
rc = gnutls_handshake(d->session); rc = gnutls_handshake(d->session);

View File

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

View File

@ -16,13 +16,20 @@
*/ */
/**
*@file
*@brief Implements lw_checksum.
*/
#include "lwapp.h" #include "lwapp.h"
/** /**
* Calculate the 16-bit checksum for LWAPP image data message * Calculate the 16-bit checksum for LWAPP image data message
* elements with opcode 3 - also used by Cisco in CAPWAP * 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) uint16_t lw_checksum(uint8_t * d, int len)
{ {
int32_t sum = 0; int32_t sum = 0;

View File

@ -22,7 +22,7 @@
*/ */
int lw_readelem_wtp_board_data(struct wtpinfo *wtpinfo, int type, uint8_t *msgelem, int len) 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; return 0;
if ( len != 46 ) { if ( len != 46 ) {

View File

@ -37,7 +37,7 @@
*/ */
int lw_readelem_wtp_name(uint8_t ** dst, int type, uint8_t * msgelem, int len) 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; return 0;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,6 +6,7 @@
#include "capwap/acinfo.h" #include "capwap/acinfo.h"
#include "capwap/conn.h" #include "capwap/conn.h"
#include "capwap/capwap_80211.h" #include "capwap/capwap_80211.h"
#include "capwap/cw_log.h"
#include "wtp_conf.h" #include "wtp_conf.h"
#include "wtp_interface.h" #include "wtp_interface.h"
@ -30,6 +31,8 @@ struct wtpinfo * get_wtpinfo()
} }
wtpinfo->radios_in_use=2;
wtpinfo->encryption_cap=1; wtpinfo->encryption_cap=1;
wtpinfo->serial_no=conf_serial_no; wtpinfo->serial_no=conf_serial_no;
@ -56,17 +59,22 @@ struct wtpinfo * get_wtpinfo()
wtpinfo->macaddress=conf_macaddress; wtpinfo->macaddress=conf_macaddress;
wtpinfo->macaddress_len=conf_macaddress_len; 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 = malloc(8);
// wtpinfo->session_id_len = cw_rand(wtpinfo->session_id,8); // wtpinfo->session_id_len = cw_rand(wtpinfo->session_id,8);
uint8_t sessid[4]; uint8_t sessid[4];
int sidl = cw_rand(sessid,4); memset(sessid,0,4);
wtpinfo->session_id = bstr_create(sessid,sidl); 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; 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; static struct conn * conn=0;
struct conn * get_conn() struct conn * get_conn()
{ {

View File

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

View File

@ -1218,11 +1218,13 @@ int wtpdrv_get_radioinfo(int rid,struct radioinfo * radioinfo)
radioinfo->rid=rid; radioinfo->rid=rid;
//uint8_t rm[8]="12345600"; //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->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]; struct wpa_driver_ops * drv = wpa_drivers[0];