diff --git a/src/ac/ac_main.c b/src/ac/ac_main.c index c6609c77..7ce603aa 100644 --- a/src/ac/ac_main.c +++ b/src/ac/ac_main.c @@ -135,12 +135,13 @@ cw_action_t discovery_actions[] = { { CW_VENDOR_ID_CISCO,0,CW_STATE_DISCOVERY,CW_MSG_DISCOVERY_REQUEST, CW_CISCO_RAD_NAME, cw_in_wtp_name,0 }, - +/* { 0,0,CW_STATE_DISCOVERY,CW_MSG_DISCOVERY_REQUEST, CW_ELEM_WTP_BOARD_DATA}, { 0,0,CW_STATE_DISCOVERY,CW_MSG_DISCOVERY_REQUEST, CW_ELEM_WTP_DESCRIPTOR}, { 0,0,CW_STATE_DISCOVERY,CW_MSG_DISCOVERY_REQUEST, CW_ELEM_WTP_FRAME_TUNNEL_MODE}, { 0,0,CW_STATE_DISCOVERY,CW_MSG_DISCOVERY_REQUEST, CW_ELEM_WTP_MAC_TYPE}, +*/ { 0,0,0} }; diff --git a/src/capwap/capwap.h b/src/capwap/capwap.h index 7e3bb0a4..beb83158 100644 --- a/src/capwap/capwap.h +++ b/src/capwap/capwap.h @@ -717,6 +717,7 @@ extern struct cw_strlist capwap_strings_vendor[]; #define cw_strmsg(id) cw_strlist_get_str(capwap_strings_msg,id) #define cw_strstate(id) cw_strlist_get_str(capwap_strings_state,id) +#define cw_strvendor(id) cw_strlist_get_str(cawpap_strings_vendor,id) int cw_process_msg(struct conn * conn,uint8_t * rawmsg,int len); diff --git a/src/capwap/capwap_items.h b/src/capwap/capwap_items.h index 135e3fd4..fa32a192 100644 --- a/src/capwap/capwap_items.h +++ b/src/capwap/capwap_items.h @@ -3,6 +3,11 @@ enum capwap_items { CW_ITEM_NONE=0, CW_ITEM_DISCOVERY_TYPE, CW_ITEM_WTP_NAME - + CW_ITEM_WTP_BOARD_VENDOR, + CW_ITEM_WTP_BOARD_MODELNO, + CW_ITEM_WTP_BOARD_MACADDRESS, + CW_ITEM_WTP_BOARD_ID, + CW_ITEM_WTP_BOARD_REVISISON, + CW_ITEM_WTP_BOARD_SERIALNO }; diff --git a/src/capwap/capwap_strings_elem.c b/src/capwap/capwap_strings_elem.c new file mode 100644 index 00000000..1cfb6db6 --- /dev/null +++ b/src/capwap/capwap_strings_elem.c @@ -0,0 +1,69 @@ + + +struct cw_strlist capwap_strings_elem[] = { + + CW_ELEM_AC_DESCRIPTOR,"AC Descriptor", + CW_ELEM_AC_IPV4_LIST,"AC IPv4 List", + CW_ELEM_AC_IPV6_LIST,"AC IPv6 List", + CW_ELEM_AC_NAME,"AC Name", + CW_ELEM_AC_NAME_WITH_PRIORITY,"AC Name with Priority", + CW_ELEM_AC_NAME_WITH_INDEX,"AC Name width Index", + CW_ELEM_AC_TIMESTAMP,"AC Timestamp", + CW_ELEM_ADD_MAC_ACL_ENTRY,"Add MAC ACL Entry", + CW_ELEM_ADD_STATION,"Add Station", + CW_ELEM_RESERVED_9,"Reserved 9", + CW_ELEM_CONTROL_IPV4_ADDRESS,"Control IPv4 Address", + CWMSGELEM_CONTROL_IPV6_ADDRESS,"Controll IPv6 Address", + CWMSGELEM_CAPWAP_LOCAL_IPV4_ADDRESS 30 + CWMSGELEM_CAPWAP_LOCAL_IPV6_ADDRESS 50 + CW_ELEM_CAPWAP_TIMERS 12 + CW_ELEM_CAPWAP_TRANSPORT_PROTOCOL 51 /* not in draft 7 */ + CW_ELEM_DATA_TRANSFER_DATA 13 + CW_ELEM_DATA_TRANSFER_MODE 14 + CW_ELEM_DECRYPTION_ERROR_REPORT 15 + CW_ELEM_DECRYPTION_ERROR_REPORT_PERIOD 16 + CW_ELEM_DELETE_MAC_ACL_ENTRY 17 + CW_ELEM_DELETE_STATION 18 + CW_ELEM_RESEERVED_19 19 + CW_ELEM_DISCOVERY_TYPE 20 + CW_ELEM_DUPLICATE_IPV4_ADDRESS 21 + CW_ELEM_DUPLICATE_IPV6_ADRESS 22 + CWMSGELEM_ECN_SUPPORT 53 + CW_ELEM_IDLE_TIMEOUT 23 + CW_ELEM_IMAGE_DATA 24 + CW_ELEM_IMAGE_IDENTIFIER 25 + CW_ELEM_IMAGE_INFORMATION 26 + CW_ELEM_INITIATE_DOWNLOAD 27 + CWMSGELEM_LOCATION_DATA 28 + CWMSGELEM_MAXIMUM_MESSAGE_LENGTH 29 + CWMSGELEM_MTU_DISCOVERY_PADDING 52 + CWMSGELEM_RADIO_ADMINISTRATIVE_STATE 31 + CW_ELEM_RADIO_OPERATIONAL_STATE 32 + CW_ELEM_RESULT_CODE 33 + CW_ELEM_RETURNED_MESSAGE_ELEMENT 34 + CW_ELEM_SESSION_ID 35 + CW_ELEM_STATISTICS_TIMER 36 + CW_ELEM_VENDOR_SPECIFIC_PAYLOAD 37 + CW_ELEM_WTP_BOARD_DATA 38 + CW_ELEM_WTP_DESCRIPTOR 39 + CW_ELEM_WTP_FALLBACK 40 + CW_ELEM_WTP_FRAME_TUNNEL_MODE 41 + CW_ELEM_RESERVED_42 42 + CW_ELEM_RESERVED_43 43 + CW_ELEM_WTP_MAC_TYPE 44 + CW_ELEM_WTP_NAME 45 + CW_ELEM_RESERVED_46 46 + CW_ELEM_WTP_RADIO_STATISTICS 47 + CWMSGELEM_WTP_REBOOT_STATISTICS 48 + CW_ELEM_WTP_STATIC_IP_ADDRESS_INFORMATION 49 + CW_ELEM_WTP_STATIC_IP_ADDR_INFO 49 + + +/* Cisco's CAPWAP definitions (CAPWAP draft 7) */ + CW_ELEM_WTP_IPV4_IP_ADDRESS 42 + CW_ELEM_WTP_IPV6_IP_ADDRESS 43 + + + +} + diff --git a/src/capwap/cw_in_wtp_board_data.c b/src/capwap/cw_in_wtp_board_data.c new file mode 100644 index 00000000..3e913bf6 --- /dev/null +++ b/src/capwap/cw_in_wtp_board_data.c @@ -0,0 +1,71 @@ + +#include +#include + + +#include "wtpinfo.h" + +#include "capwap.h" + +#include "cw_util.h" +#include "cw_log.h" + + + +static void wtpinfo_readsubelems_wtp_board_data(struct wtpinfo * wtpinfo,uint8_t * msgelem,int len) +{ + int i=0; + uint32_t val; + do { + val = ntohl(*((uint32_t*)(msgelem+i))); + int subtype= (val>>16)&0xffff; + int sublen = val&0xffff; + i+=4; + if (sublen+i>len){ + cw_dbg(DBG_ELEM,"WTP Board data sub-element too long, type=%d,len=%d",subtype,sublen); + return; + } + + cw_dbg(DBG_ELEM,"Reading WTP board data sub-element, type=%d, len=%d",subtype,sublen); + + switch(subtype){ + case CWBOARDDATA_MODELNO: + bstr_replace(&wtpinfo->model_no,bstr_create(msgelem+i,sublen)); + break; + case CWBOARDDATA_SERIALNO: + bstr_replace(&wtpinfo->serial_no,bstr_create(msgelem+i,sublen)); + break; + case CWBOARDDATA_MACADDRESS: + wtpinfo->macaddress=realloc(wtpinfo->macaddress,sublen); + memcpy(wtpinfo->macaddress,msgelem+i,sublen); + wtpinfo->macaddress_len=sublen; + break; + case CWBOARDDATA_BOARDID: + bstr_replace(&wtpinfo->board_id,bstr_create(msgelem+i,sublen)); + break; + case CWBOARDDATA_REVISION: + bstr_replace(&wtpinfo->board_revision,bstr_create(msgelem+i,sublen)); + default: + break; + } + i+=sublen; + + }while(ivendor_id = ntohl(*((uint32_t*)msgelem)); + wtpinfo_readsubelems_wtp_board_data(wtpinfo,msgelem+4,len-4); +*/ + return 1; +} + diff --git a/src/capwap/cw_process_msg.c b/src/capwap/cw_process_msg.c index f6b2f874..76df698b 100644 --- a/src/capwap/cw_process_msg.c +++ b/src/capwap/cw_process_msg.c @@ -83,7 +83,7 @@ int cw_process_msg(struct conn * conn,uint8_t * rawmsg,int len) af = cw_actionlist_get(conn->msgtr,&as); if (!af) { - printf("Wrong Elem: %d, %d\n",as.elem_id,elem_len); + cw_dbg(DBG_ELEM_ERR,"Element %d not aallowed in msg %d (%s)",as.elem_id,as.msg_id,cw_strmsg(as.msg_id)); continue; }