diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index 361a9f09..b95b4a5c 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -443,7 +443,7 @@ static void wtpman_run_run(void *arg) cwmsg_addelem(&conn->req_msg,CWMSGELEM_WTP_NAME,(uint8_t*)"Tube7u83",strlen("Tube7u83")+1); cwmsg_addelem(&conn->req_msg,CWMSGELEM_LOCATION_DATA,(uint8_t*)"Berlin",strlen("Berlin")+1); - cwmsg_addelem_vendor_specific_payload(&conn->req_msg,CW_VENDOR_ID_CISCO,CWVENDOR_CISCO_RAD_NAME,(uint8_t*)"Schlumpf",strlen("Schlumpf")); + cwmsg_addelem_vendor_specific_payload(&conn->req_msg,CW_VENDOR_ID_CISCO,CW_CISCO_RAD_NAME,(uint8_t*)"Schlumpf",strlen("Schlumpf")); cwrmsg = conn_send_request(conn); diff --git a/src/capwap/Makefile b/src/capwap/Makefile index 5b3b214b..71569f41 100644 --- a/src/capwap/Makefile +++ b/src/capwap/Makefile @@ -61,6 +61,7 @@ UTILOBJS= \ # LWAPP objs LWAPPOBJS = \ lw_checksum.o \ + lw_put_ac_descriptor.o \ lw_readelem_wtp_name.o \ # LWAPP cisco vendor specific objs @@ -86,7 +87,7 @@ CAPWAPOBJS= \ cwmsg_addelem_mtu_discovery_padding.o \ cwmsg_addelem_result_code.o \ cwmsg_addelem_ac_timestamp.o \ - cwmsg_addelem_vendor_specific_payload.o \ + cw_addelem_vendor_specific_payload.o \ cwmsg_addelem_maximum_message_length.o \ cwmsg_addelem_image_identifier.o \ cwmsg_addelem_radio_operational_state.o \ @@ -145,9 +146,11 @@ CAPWAPOBJS= \ cw_readelem_vendor_specific_payload.o \ cw_readelem_capwap_local_ip_addr.o \ cw_readelem_wtp_reboot_statistics.o\ - cwmsg_addelem_vendor_cisco_ap_timesync.o \ cwmsg_addelem_vendor_cisco_mwar_addr.o \ - lw_readelem_wtp_board_data.o \ + lw_readelem_wtp_board_data.o + +# cwmsg_addelem_vendor_cisco_ap_timesync.o \ +# cwmsg_addelem_vendor_specific_payload.o \ #cwmsg_addelem_session_id.o # process_msgelems_discovery_request.o \ diff --git a/src/capwap/capwap.h b/src/capwap/capwap.h index 77b6f8e5..3a38a989 100644 --- a/src/capwap/capwap.h +++ b/src/capwap/capwap.h @@ -16,6 +16,12 @@ */ +/** + * @file + * @brief CAPWAP desfinitions + */ + + #ifndef __CAPWAP_H #define __CAPWAP_H @@ -517,58 +523,111 @@ extern void cw_send_image_file(struct conn *conn, FILE * infile); /* Use some macros from LWAPP */ -#define cw_put_dword lw_put_dword +#define cw_put_byte lw_put_byte #define cw_put_word lw_put_word +#define cw_put_dword lw_put_dword +#define cw_put_data lw_put_data -static inline int cw_put_elem_hdr(uint8_t * dst, uint16_t type, uint16_t len) -{ - *((uint32_t *) (dst)) = htonl(type << 16 | len); - return 4 + len; -} - - -static inline int cw_addelem(uint8_t *dst, uint16_t type,uint8_t*data,uint16_t len) -{ - memcpy(dst+4,data,len); - return cw_put_elem_hdr(dst,type,len); -} +/** + * Put a message element headder to buffer + * @param dst pointer to buffer (uint8_t) + * @param type tpe of message element + * @param len length of message element data + * @return the number bytes put (always 4) + */ +#define cw_put_elem_hdr(dst,type,len) \ + (cw_put_dword(dst, (((uint32_t)type)<<16) | (len)),4) /* -static inline int cw_addbyteelem(uint8_t *dst, uint16_t type, uint8_t byte) +static inline int cw_put_elem_hdr(uint8_t * dst, uint8_t type, uint16_t len) { -// *(dst+3)=byte; -// return cw_put_elem_hdr( + cw_put_word(dst, type); + cw_put_word(dst + 4, len); + return 4; } */ -static inline int cw_addelem_vendor_specific_payload(uint8_t * dst, uint32_t vendor_id, uint16_t type, - uint8_t * data, uint16_t len) -{ - cw_put_dword(dst+4, vendor_id); - cw_put_word(dst + 8, type); - memcpy(dst + 10, data, len); - return cw_put_elem_hdr(dst, CW_ELEM_VENDOR_SPECIFIC_PAYLOAD, len + 10-4); + +/** + * Put a message element header for a message to contain a vendor specific payload + * @param dst pointer to destination buffer + * @param vendorid vendorid + * @param elementid element id of vendor specific data + * @len length of vendor specific data + * @return the number of bytes put (always 10) + */ +static inline int cw_put_elem_vendor_hdr(uint8_t *dst,uint32_t vendorid,uint16_t elemid,uint16_t len){ + + cw_put_elem_hdr(dst,CW_ELEM_VENDOR_SPECIFIC_PAYLOAD,len+6); + cw_put_dword(dst+4,vendorid); + cw_put_word(dst+8,elemid); + return 10; } +/** + * Add a message element to a buffer + * @param dst pointer to buffer + * @type message element type + * @data pointer to data + * @length of message element + * @return the number of bytes put + */ +static inline int cw_addelem(uint8_t * dst, uint16_t type, uint8_t * data, uint16_t len) +{ + int l = cw_put_elem_hdr(dst, type, len); + return l + cw_put_data(dst+l, data, len); +} + + +static inline int cw_addelem_bstr(uint8_t *dst, uint16_t type, const bstr_t bstr) +{ + return cw_addelem(dst,type,bstr_data(bstr),bstr_len(bstr)); +} + +/* +#define cw_put_elem_vendor_hdr(dst,vendorid,elemid,len)\ + (cw_put_elem_hdr(dst,CW_ELEM_VENDOR_SPECIFIC_PAYLOAD, \ + cw_put_dword(dst+4,vendorid) + cw_put_word(dst+8,elemid) +len )) + + + + + +#define cw_addelem(dst,type,data,len)\ + (cw_put_elem_hdr(dst,type,len)+cw_put_data(dst+4,data,len)) +*/ + +/* +#define cw_addelem_vendor_specific_payload(dst,vendorid,elemid,data,len)\ + (cw_put_elem_vendor_hdr(dst,vendorid,elemid,len) + \ + cw_put_data(dst+10,data,len)) +*/ + +extern int cw_addelem_vendor_specific_payload(uint8_t * dst, uint32_t vendorid, uint16_t elemid, + uint8_t * data, uint16_t len); + + + + #define cw_addelem_ac_name(dst,name) \ cw_addelem(dst,CW_ELEM_AC_NAME,name,strlen((char*)(name))) #define cw_addelem_session_id(dst,sessid)\ - cw_addelem(dst,CW_ELEM_SESSION_ID,bstr_data(sessid),bstr_len(sessid)) + cw_addelem_bstr(dst,CW_ELEM_SESSION_ID,sessid) /* cwmsg methods */ -#define cwmsg_addelem_vendor_s_payload(cwmsg,vendor_id, type, data,len) \ +#define cwmsg_addelem_vendor_specific_payload(cwmsg,vendor_id, type, data,len) \ (cwmsg)->pos+=cw_addelem_vendor_specific_payload((cwmsg)->msgelems+(cwmsg)->pos,vendor_id,type,data,len) #define cwmsg_addelem_ac_name(cwmsg,name) \ (cwmsg)->pos+=cw_addelem_ac_name((cwmsg)->msgelems+(cwmsg)->pos,name) - + #define cwmsg_addelem_session_id(cwmsg,sessid) \ (cwmsg)->pos+=cw_addelem_session_id((cwmsg)->msgelems+(cwmsg)->pos,sessid) diff --git a/src/capwap/cwmsg_addelem_vendor_cisco_mwar_addr.c b/src/capwap/cwmsg_addelem_vendor_cisco_mwar_addr.c index 2dea284c..8691de3c 100644 --- a/src/capwap/cwmsg_addelem_vendor_cisco_mwar_addr.c +++ b/src/capwap/cwmsg_addelem_vendor_cisco_mwar_addr.c @@ -21,7 +21,7 @@ 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]=1; /* mwar type */ + data[0]=2; /* mwar type */ data[5]=0; data[6]=0; diff --git a/src/capwap/cwsend_discovery_request.c b/src/capwap/cwsend_discovery_request.c index 24995200..f5ea410f 100644 --- a/src/capwap/cwsend_discovery_request.c +++ b/src/capwap/cwsend_discovery_request.c @@ -66,7 +66,7 @@ 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); + cwmsg_addelem_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, diff --git a/src/capwap/cwsend_discovery_response.c b/src/capwap/cwsend_discovery_response.c index 465a770b..cf0a15ed 100644 --- a/src/capwap/cwsend_discovery_response.c +++ b/src/capwap/cwsend_discovery_response.c @@ -53,9 +53,9 @@ void cwsend_discovery_response(struct conn *conn, int seqnum, struct radioinfo * 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); + cwmsg_addelem_cisco_ap_timesync(cwmsg,time(NULL),0); + //uint8_t mwtype=1; + //cwmsg_addelem_vendor_s_payload(cwmsg,CW_VENDOR_ID_CISCO,CW_CISCO_MWAR_TYPE,&mwtype,1); break; } default: diff --git a/src/capwap/cwsend_join_request.c b/src/capwap/cwsend_join_request.c index 845f7bbc..5603df44 100644 --- a/src/capwap/cwsend_join_request.c +++ b/src/capwap/cwsend_join_request.c @@ -100,7 +100,7 @@ int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct w */ - cwmsg_addelem_vendor_s_payload(&cwmsg, CW_VENDOR_ID_CISCO, + cwmsg_addelem_vendor_specific_payload(&cwmsg, CW_VENDOR_ID_CISCO, CW_CISCO_AP_GROUP_NAME,(uint8_t *)"default-group",strlen("default-group")); @@ -121,17 +121,18 @@ int cwsend_join_request(struct conn *conn, struct radioinfo *radioinfo, struct w case CWMODE_CISCO: { uint8_t mtu[2048]; - int l = lw_put_cisco_path_mtu(mtu,1485,1101); + int l = lw_put_cisco_path_mtu(mtu,1485,11); - printf("Len = %d\n",l); + // 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; +printf("Adding mwar\n"); extern struct ac_info wtp_acinfo; + // cwmsg_addelem_cisco_mwar(&cwmsg,&wtp_acinfo); // memset(&acinfo,0,sizeof(struct ac_info)); // cwmsg_addelem_ac_descriptor(&cwmsg,&wtp_acinfo,wtpinfo); diff --git a/src/wtp/configure.c b/src/wtp/configure.c index 584023a0..6f7c922f 100644 --- a/src/wtp/configure.c +++ b/src/wtp/configure.c @@ -3,11 +3,13 @@ int configure() { +sleep(10); struct conn * conn = get_conn(); struct wtpinfo * wtpinfo = get_wtpinfo(); cw_prepare_configuration_status_request(conn,wtpinfo); conn_send_request(conn); +exit(0); } diff --git a/src/wtp/join.c b/src/wtp/join.c index a0c46f51..5524bbdf 100644 --- a/src/wtp/join.c +++ b/src/wtp/join.c @@ -39,11 +39,11 @@ int join_state(struct conn * conn) struct radioinfo *rip = &(wtpinfo->radioinfo[0]); -#ifdef WITH_CW_LOG_DEBUG - char str[64]; - sock_addrtostr(&conn->addr,str,64); +//#ifdef WITH_CW_LOG_DEBUG +// char str[64]; +// sock_addrtostr(&conn->addr,str,64); // cw_log_debug0("Sending join request to %s",str); -#endif +//#endif printf("Seqnum before = %i\n",conn->seqnum); rc = cwsend_join_request(conn,rip,wtpinfo); printf("Seqnum after = %i\n",conn->seqnum); diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index 8bdea795..cca478c7 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -82,8 +82,13 @@ int do_connect(void *priv,void *data) return 1; printf("Sleep after oin\n"); -sleep(5); printf("Go conf\n"); + extern struct conn * get_conn(); + extern join_state(struct conn * conn); + struct conn * conn = get_conn(); +printf("Join conn = %p\n",conn); + +// join_state(conn); // rc = join(&ip->ip);