WTP work...
FossilOrigin-Name: c770fa37c379da9fb78feebb463e2843ba8179e3f9026687dcfb44b4c7c47388
This commit is contained in:
@ -633,6 +633,8 @@ extern int cw_readmsg_configuration_update_request(uint8_t * elems, int elems_le
|
||||
#define cw_set_hdr_preamble(th,v) ((*th)=v)
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Set the HLEN field of a CAWAP Header
|
||||
* @param th pointer to the header
|
||||
@ -726,6 +728,32 @@ static inline int cw_get_hdr_msg_total_len(uint8_t * rawmsg)
|
||||
return offset + cw_get_msg_elems_len(rawmsg + offset) + 8;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline int cw_set_hdr_rmac(uint8_t * th,bstr_t rmac)
|
||||
{
|
||||
if (!rmac){
|
||||
cw_set_hdr_flags(th,CW_FLAG_HDR_M,0);
|
||||
cw_set_hdr_hlen(th, 2);
|
||||
return 0;
|
||||
}
|
||||
int rmac_len = bstr_len(rmac);
|
||||
memcpy(cw_get_hdr_rmac(th),rmac,rmac_len+1);
|
||||
cw_set_hdr_flags(th,CW_FLAG_HDR_M,1);
|
||||
|
||||
int hlen = 4+rmac_len/4;
|
||||
|
||||
if (rmac_len %4 != 0) {
|
||||
hlen++;
|
||||
}
|
||||
cw_set_hdr_hlen(th,hlen);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get length of a CAPWAP message elemet
|
||||
* @param e pointer to element (uint8_t*)
|
||||
|
@ -38,11 +38,19 @@ struct cw_item *cw_out_get_local(struct conn *conn, struct cw_action_out *a)
|
||||
struct cw_item * cw_out_get_session_id(struct conn *conn,struct cw_action_out * a)
|
||||
{
|
||||
uint8_t session_id[16];
|
||||
int l = cw_rand(session_id,16);
|
||||
if ( l!=16 ) {
|
||||
|
||||
int slen;
|
||||
if ( conn->capwap_mode == CW_MODE_CISCO){
|
||||
slen=4;
|
||||
}
|
||||
else
|
||||
slen=16;
|
||||
|
||||
int l = cw_rand(session_id,slen);
|
||||
if ( l!=slen ) {
|
||||
cw_log(LOG_ERR,"Can't init session ID.");
|
||||
return NULL;
|
||||
}
|
||||
return cw_itemstore_set_bstrn(conn->local,CW_ITEM_SESSION_ID,session_id,16);
|
||||
return cw_itemstore_set_bstrn(conn->local,CW_ITEM_SESSION_ID,session_id,slen);
|
||||
}
|
||||
|
||||
|
@ -111,13 +111,23 @@ cw_action_out_t capwap_actions_wtp_out[] = {
|
||||
{CW_MSG_DISCOVERY_REQUEST, CW_ITEM_DISCOVERY_TYPE, 0,
|
||||
CW_ELEM_DISCOVERY_TYPE, NULL,cw_out_generic, cw_out_get_outgoing}
|
||||
,
|
||||
{CW_MSG_DISCOVERY_REQUEST, CW_ITEM_WTP_FRAME_TUNNEL_MODE, 0,
|
||||
CW_ELEM_WTP_FRAME_TUNNEL_MODE, NULL,cw_out_generic, cw_out_get_local,1}
|
||||
,
|
||||
|
||||
{CW_MSG_DISCOVERY_REQUEST, CW_ITEM_WTP_MAC_TYPE, 0,
|
||||
CW_ELEM_WTP_MAC_TYPE, NULL,cw_out_generic, cw_out_get_local,1}
|
||||
,
|
||||
|
||||
/* WTP Board Data */
|
||||
{CW_MSG_DISCOVERY_REQUEST, CW_ITEM_WTP_BOARD_DATA, 0,
|
||||
CW_ELEM_WTP_BOARD_DATA, NULL,cw_out_wtp_board_data, cw_out_get_outgoing}
|
||||
CW_ELEM_WTP_BOARD_DATA, NULL,cw_out_wtp_board_data, cw_out_get_outgoing,1}
|
||||
,
|
||||
|
||||
/* WTP Descriptor */
|
||||
{CW_MSG_DISCOVERY_REQUEST, CW_ITEM_WTP_DESCRIPTOR, 0,
|
||||
CW_ELEM_WTP_DESCRIPTOR, NULL,cw_out_wtp_descriptor, NULL,1}
|
||||
,
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------------
|
||||
* Join Request OUT
|
||||
|
@ -53,7 +53,7 @@ enum capwap_items {
|
||||
|
||||
/* Other Items */
|
||||
CW_ITEM_AC_IMAGE_DIR, /* Path where WTP images are stored */
|
||||
CW_ITEM_IMAGE_FILENAME, /* Full path of image filename */
|
||||
CW_ITEM_IMAGE_FILENAME, /* Full path of image filename */
|
||||
CW_ITEM_DISCOVERIES,
|
||||
CW_ITEM_AC_PRIO_LIST, /* AC Name with Priority list */
|
||||
CW_ITEM_IMAGE_FILEHANDLE /* FILE handle for uploading and downloading images */
|
||||
|
@ -21,7 +21,7 @@
|
||||
cw_in_cipwap_wtp_descriptor, 0, /* start/end callback */ \
|
||||
0, \
|
||||
CW_ITEM_WTP_DESCRIPTOR, \
|
||||
0,0
|
||||
8,1028
|
||||
|
||||
/* For CIPWAP we allow a
|
||||
Session ID with 4 .. 16 bytes length */
|
||||
|
@ -53,6 +53,8 @@ struct conn {
|
||||
cw_itemstore_t remote;
|
||||
cw_itemstore_t local;
|
||||
|
||||
/** base_mac */
|
||||
bstr_t base_rmac;
|
||||
|
||||
/** Wireless Binding ID of this connection */
|
||||
uint8_t wbid;
|
||||
|
@ -52,8 +52,14 @@ void cw_init_response(struct conn *conn, uint8_t * req)
|
||||
int shbytes = cw_get_hdr_msg_offset(req);
|
||||
int dhbytes;
|
||||
memcpy(buffer, req, shbytes);
|
||||
cw_set_hdr_hlen(buffer, 2);
|
||||
cw_set_hdr_flags(buffer, CW_FLAG_HDR_M, 1);
|
||||
|
||||
|
||||
cw_set_hdr_rmac(buffer,conn->base_rmac);
|
||||
// cw_set_hdr_hlen(buffer, 2);
|
||||
// cw_set_hdr_flags(buffer, CW_FLAG_HDR_M, 1);
|
||||
|
||||
|
||||
|
||||
dhbytes = cw_get_hdr_msg_offset(buffer);
|
||||
|
||||
uint8_t *msgptr = req + shbytes;
|
||||
@ -74,10 +80,15 @@ void cw_init_request(struct conn *conn, int msg_id)
|
||||
|
||||
/* unencrypted */
|
||||
cw_set_hdr_preamble(buffer, CAPWAP_VERSION << 4 | 0);
|
||||
|
||||
cw_set_hdr_rmac(buffer,conn->base_rmac);
|
||||
//cw_set_hdr_hlen(buffer, 2);
|
||||
|
||||
|
||||
cw_set_hdr_hlen(buffer, 2);
|
||||
cw_set_hdr_wbid(buffer, 1);
|
||||
cw_set_hdr_rid(buffer, 0);
|
||||
|
||||
|
||||
uint8_t *msgptr = cw_get_hdr_msg_offset(buffer) + buffer;
|
||||
cw_set_msg_type(msgptr, msg_id);
|
||||
cw_set_msg_flags(msgptr, 0);
|
||||
|
@ -36,6 +36,8 @@
|
||||
static void readsubelems_wtp_board_data(cw_itemstore_t itemstore, uint8_t * msgelem,
|
||||
int len)
|
||||
{
|
||||
if (len<4)
|
||||
return;
|
||||
|
||||
int i = 0;
|
||||
uint32_t val;
|
||||
|
@ -32,7 +32,8 @@ static int cw_read_wtp_descriptor_versions(cw_itemstore_t itemstore, uint8_t * d
|
||||
int len, int silent)
|
||||
{
|
||||
int i = 0;
|
||||
do {
|
||||
while (i<len) {
|
||||
|
||||
if (i + 8 > len) {
|
||||
if (!silent)
|
||||
cw_dbg(DBG_ELEM_ERR,
|
||||
@ -51,7 +52,7 @@ static int cw_read_wtp_descriptor_versions(cw_itemstore_t itemstore, uint8_t * d
|
||||
if (sublen + i > len) {
|
||||
if (!silent)
|
||||
cw_dbg(DBG_ELEM_ERR,
|
||||
"WTP Descriptor subelement too long, length = %d",
|
||||
"WTP Descriptor sub-element too long, length = %d",
|
||||
sublen);
|
||||
return 0;
|
||||
}
|
||||
@ -82,8 +83,9 @@ static int cw_read_wtp_descriptor_versions(cw_itemstore_t itemstore, uint8_t * d
|
||||
break;
|
||||
case CW_SUBELEM_WTP_SOFTWARE_VERSION:
|
||||
|
||||
cw_itemstore_set_vendorstr(itemstore,CW_ITEM_WTP_SOFTWARE_VERSION,
|
||||
vendor_id,data+i,sublen);
|
||||
cw_itemstore_set_vendorstr(itemstore,
|
||||
CW_ITEM_WTP_SOFTWARE_VERSION,
|
||||
vendor_id, data + i, sublen);
|
||||
/*
|
||||
cw_itemstore_set_dword(itemstore,
|
||||
CW_ITEM_WTP_SOFTWARE_VENDOR,
|
||||
@ -111,7 +113,7 @@ static int cw_read_wtp_descriptor_versions(cw_itemstore_t itemstore, uint8_t * d
|
||||
}
|
||||
i += sublen;
|
||||
|
||||
} while (i < len);
|
||||
} //while (i < len);
|
||||
|
||||
return 1;
|
||||
|
||||
|
@ -9,9 +9,9 @@
|
||||
int cw_out_wtp_board_data(struct conn *conn, struct cw_action_out *a, uint8_t * dst)
|
||||
{
|
||||
cw_itemstore_t board_data =
|
||||
cw_itemstore_get_avltree(conn->outgoing, CW_ITEM_WTP_BOARD_DATA);
|
||||
cw_itemstore_get_avltree(conn->local, CW_ITEM_WTP_BOARD_DATA);
|
||||
if (!board_data) {
|
||||
cw_log(LOG_ERR, "Error: Can't send WTP Board Data element - not defined");
|
||||
cw_log(LOG_ERR, "Error: Can't send WTP Board Data element. WTP Board Data is not defined.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@ int cw_out_wtp_board_data(struct conn *conn, struct cw_action_out *a, uint8_t *
|
||||
d += cw_put_data(d, bstr16_data(i->data), bstr16_len(i->data));
|
||||
} else {
|
||||
cw_log(LOG_ERR,
|
||||
"Error: Can't set sub-element \"Model No.\" in WTP Board Data.");
|
||||
"Error: Can't set sub-element \"WTP Model Number\" in WTP Board Data.");
|
||||
}
|
||||
|
||||
i = cw_itemstore_get(board_data, CW_ITEM_WTP_BOARD_SERIALNO);
|
||||
@ -41,8 +41,12 @@ int cw_out_wtp_board_data(struct conn *conn, struct cw_action_out *a, uint8_t *
|
||||
d += cw_put_word(d, CW_BOARDDATA_SERIALNO);
|
||||
d += cw_put_word(d, bstr16_len(i->data));
|
||||
d += cw_put_data(d, bstr16_data(i->data), bstr16_len(i->data));
|
||||
}else {
|
||||
cw_log(LOG_ERR,
|
||||
"Error: Can't set sub-element \"WTP Serial Number\" in WTP Board Data.");
|
||||
}
|
||||
|
||||
|
||||
i = cw_itemstore_get(board_data, CW_ITEM_WTP_BOARD_ID);
|
||||
if (i) {
|
||||
d += cw_put_word(d, CW_BOARDDATA_BOARDID);
|
||||
|
@ -5,9 +5,11 @@
|
||||
#include "capwap_items.h"
|
||||
#include "capwap.h"
|
||||
|
||||
|
||||
static int cw_put_enc_subelems(uint8_t *dst)
|
||||
static int cw_put_encryption_subelems(uint8_t *dst)
|
||||
{
|
||||
cw_put_word(dst,0x01);
|
||||
return 2;
|
||||
|
||||
int n=2;
|
||||
|
||||
dst+=cw_put_byte(dst,n);
|
||||
@ -29,9 +31,9 @@ int cw_out_wtp_descriptor(struct conn *conn, struct cw_action_out *a, uint8_t *
|
||||
// XXX Dummy WTP Descriptor Header
|
||||
uint8_t *d = dst+4;
|
||||
|
||||
d+=cw_put_byte(d,2);
|
||||
d+=cw_put_byte(d,0);
|
||||
d+=cw_put_enc_subelems(dst);
|
||||
d+=cw_put_byte(d,2); //max radios
|
||||
d+=cw_put_byte(d,0); //radios in use
|
||||
d+=cw_put_encryption_subelems(d);
|
||||
|
||||
cw_item_t * i;
|
||||
i = cw_itemstore_get(conn->outgoing,CW_ITEM_WTP_HARDWARE_VERSION);
|
||||
|
Reference in New Issue
Block a user