Morre VM stuff...

FossilOrigin-Name: 70d234975ad74061e733f7df43912369c406662c45736ca81135c3b8a5ea6991
This commit is contained in:
7u83@mail.ru 2015-03-31 17:54:13 +00:00
parent 474763a3eb
commit b63692f46e
6 changed files with 150 additions and 3 deletions

View File

@ -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}
};

View File

@ -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);

View File

@ -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
};

View File

@ -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
}

View File

@ -0,0 +1,71 @@
#include <stdlib.h>
#include <string.h>
#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(i<len);
}
int cw_in_wtp_board_data(struct conn *conn,struct cw_action * a,uint8_t *data,int len)
{
if (len<4){
cw_dbg(DBG_ELEM_ERR,"Discarding WTP_BOARD_DATA msgelem, wrong size, type=%d, len=%d\n",type,len);
return 1;
}
/*
wtpinfo->vendor_id = ntohl(*((uint32_t*)msgelem));
wtpinfo_readsubelems_wtp_board_data(wtpinfo,msgelem+4,len-4);
*/
return 1;
}

View File

@ -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;
}