ac descriptor, struct reader

FossilOrigin-Name: 3b8718025cc9d01c66afddbc09fda047e4c78427fe342d8a800ba066eae62270
This commit is contained in:
7u83@mail.ru 2018-03-25 06:34:32 +00:00
parent 54e852c6a1
commit c1f1d91b28
22 changed files with 176 additions and 145 deletions

View File

@ -129,7 +129,6 @@
<File Name="src/cw/cwmsg_addelem_80211_add_wlan.c"/> <File Name="src/cw/cwmsg_addelem_80211_add_wlan.c"/>
<File Name="src/cw/dot11.h"/> <File Name="src/cw/dot11.h"/>
<File Name="src/cw/cw_in_check_generic_resp.c"/> <File Name="src/cw/cw_in_check_generic_resp.c"/>
<File Name="src/cw/cw_in_ac_descriptor.c"/>
<File Name="src/cw/mavl_foreach_lr.c"/> <File Name="src/cw/mavl_foreach_lr.c"/>
<File Name="src/cw/mavl_get.c"/> <File Name="src/cw/mavl_get.c"/>
<File Name="src/cw/sock_setport.c"/> <File Name="src/cw/sock_setport.c"/>
@ -300,6 +299,7 @@
<File Name="src/cw/cw_ktv_idx_get.c"/> <File Name="src/cw/cw_ktv_idx_get.c"/>
<File Name="src/cw/lw_put_bstr.c"/> <File Name="src/cw/lw_put_bstr.c"/>
<File Name="src/cw/mavl_get_node_cmp..c"/> <File Name="src/cw/mavl_get_node_cmp..c"/>
<File Name="src/cw/cw_ktv_read_struct.c"/>
</VirtualDirectory> </VirtualDirectory>
</VirtualDirectory> </VirtualDirectory>
<Description/> <Description/>

View File

@ -23,6 +23,7 @@
<File Name="src/mod/capwap/capwap_out_wtp_descriptor.c"/> <File Name="src/mod/capwap/capwap_out_wtp_descriptor.c"/>
<File Name="src/mod/capwap/capwap_out_capwap_control_ip_address.c"/> <File Name="src/mod/capwap/capwap_out_capwap_control_ip_address.c"/>
<File Name="src/mod/capwap/capwap_in_capwap_control_ip_address.c"/> <File Name="src/mod/capwap/capwap_in_capwap_control_ip_address.c"/>
<File Name="src/mod/capwap/capwap_in_ac_descriptor.c"/>
</VirtualDirectory> </VirtualDirectory>
</VirtualDirectory> </VirtualDirectory>
</VirtualDirectory> </VirtualDirectory>

View File

@ -299,8 +299,8 @@
#define CW_SUBELEM_WTP_BOOTLOADER_VERSION 2 #define CW_SUBELEM_WTP_BOOTLOADER_VERSION 2
#define CW_SUBELEM_WTP_OTHERSOFTWARE_VERSION 3 #define CW_SUBELEM_WTP_OTHERSOFTWARE_VERSION 3
#define CW_SUBELEM_AC_HARDWARE_VERSION 4 #define CAPWAP_SUBELEM_AC_HARDWARE_VERSION 4
#define CW_SUBELEM_AC_SOFTWARE_VERSION 5 #define CAPWAP_SUBELEM_AC_SOFTWARE_VERSION 5
/* Frame tunnnel mode bits */ /* Frame tunnnel mode bits */
@ -524,7 +524,7 @@ enum cw_reboot_failure_types {
/*
struct cwimage_data { struct cwimage_data {
uint8_t *data; uint8_t *data;
uint8_t type; uint8_t type;
@ -546,7 +546,7 @@ extern void cw_send_image_file(struct conn *conn, FILE * infile);
extern int cw_readmsg_configuration_status_response(uint8_t * elems, int elems_len); extern int cw_readmsg_configuration_status_response(uint8_t * elems, int elems_len);
extern int cw_readmsg_configuration_update_request(uint8_t * elems, int elems_len); extern int cw_readmsg_configuration_update_request(uint8_t * elems, int elems_len);
*/
/* Message to text stuff */ /* Message to text stuff */
@ -561,9 +561,6 @@ extern struct cw_StrListElem mbag_item_strings[];
#define cw_strmsg(id) cw_strlist_get_str(capwap_strings_msg,id) #define cw_strmsg(id) cw_strlist_get_str(capwap_strings_msg,id)
#define cw_strelem(id) cw_strlist_get_str(capwap_strings_elem,id) #define cw_strelem(id) cw_strlist_get_str(capwap_strings_elem,id)
#define cw_strstate(id) cw_strlist_get_str(capwap_strings_state,id) #define cw_strstate(id) cw_strlist_get_str(capwap_strings_state,id)

View File

@ -345,20 +345,18 @@ extern int cw_read_wtp_descriptor_7(mavl_t mbag, struct conn *conn,
struct cw_ElemHandler *eh, uint8_t * data, int len, struct cw_ElemHandler *eh, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *allowed); struct cw_DescriptorSubelemDef *allowed);
/*
extern int cw_read_ac_descriptor(mbag_t store, uint8_t * data, int len,
struct cw_DescriptorSubelemDef *allowed);
extern int cw_read_wtp_descriptor_versions(mbag_t mbag, uint8_t * data, int len); int cw_read_ac_descriptor(mavl_t store,
struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams * params,
uint8_t *data, int len,
struct cw_DescriptorSubelemDef *allowed);
extern int cw_in_check_generic_resp(struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len, struct sockaddr *from);
extern int cw_in_check_generic_req(struct conn *conn, struct cw_action_in *a,
uint8_t * data, int len, struct sockaddr *from);
*/
/** /**
* @defgroup CWELEMIN Input Handlers for Message Elements * @defgroup CWELEMIN Input Handlers for Message Elements

View File

@ -1,43 +0,0 @@
#include "cw.h"
#include "dbg.h"
/*
int cw_in_ac_descriptor(struct conn *conn, struct cw_action_in *a, uint8_t * data,
int len, struct sockaddr *from)
{
return cw_read_ac_descriptor(conn->config,data,len,NULL);
struct cw_ac_status *status = malloc(sizeof(struct cw_ac_status));
if (!status)
return 0;
status->stations = cw_get_word(data);
status->limit = cw_get_word(data + 2);
status->active_wtps = cw_get_word(data + 4);
status->max_wtps = cw_get_word(data + 6);
status->security = cw_get_byte(data + 8);
status->rmac_field = cw_get_byte(data + 9);
status->dtls_policy = cw_get_byte(data + 11);
cw_dbg(DBG_SUBELEM,
"AC Descriptor: WTPs:%d/%d, Stations:%d/%d, Security:%d, Rmac:%d, DTLS-Policy:%d",
status->active_wtps, status->max_wtps, status->stations, status->limit,
status->security, status->rmac_field, status->dtls_policy);
mbag_set_ptr(conn->incomming, CW_ITEM_AC_STATUS, status);
static struct cw_DescriptorSubelemDef allowed[] = {
{0,CW_SUBELEM_AC_HARDWARE_VERSION, CW_ITEM_WTP_HARDWARE_VERSION, 1024,1},
{0,CW_SUBELEM_AC_SOFTWARE_VERSION, CW_ITEM_WTP_SOFTWARE_VERSION, 1024,1},
{0,0, NULL,0, 0}
};
cw_read_descriptor_subelems(conn->config,"ackey" , data + 12, len - 12, allowed);
return 1;
}
*/

View File

@ -1,6 +1,15 @@
#include "ktv.h" #include "ktv.h"
#include "mavl.h" #include "mavl.h"
/**
* @brief Get a ktv value from a ktv store
* @param ktv ktv store
* @param key key to search for
* @param type type to match
* @return A pointer to a #cw_KTV_t element, found in the ktv store or
* NULL if no element with matching key/type is found.
*/
cw_KTV_t * cw_ktv_get(mavl_t ktv, const char *key, const cw_Type_t * type) cw_KTV_t * cw_ktv_get(mavl_t ktv, const char *key, const cw_Type_t * type)
{ {
cw_KTV_t search, *result; cw_KTV_t search, *result;

View File

@ -0,0 +1,30 @@
#include "ktv.h"
#include "dbg.h"
int cw_ktv_read_struct(mavl_t ktv,cw_KTVStruct_t * stru, const char *pkey,
uint8_t * data, int len)
{
char key[CW_KTV_MAX_KEY_LEN];
int pos, i;
cw_KTV_t * result;
pos=0; i=0;
while (stru[i].type != NULL){
char dbstr[100];
sprintf(key,"%s/%s",pkey,stru[i].key);
result = cw_ktv_add(ktv,key,stru[i].type,data+pos,stru[i].len);
stru[i].type->to_str(result,dbstr,100);
cw_dbg(DBG_ELEM_DETAIL, "Read (%d): %s: %s",pos,key,dbstr);
if(stru[i].position == -1)
pos+=stru[i].len;
else
pos=stru[i].position;
i++;
}
return pos;
}

View File

@ -1,11 +1,6 @@
#include "log.h" #include "log.h"
#include "capwap.h" #include "capwap.h"
#include "conn.h" #include "conn.h"
#include "capwap.h"
//#include "itemstore.h"
#include "capwap.h"
#include "cw.h" #include "cw.h"
#define CW_MODE_CISCO 1 #define CW_MODE_CISCO 1

View File

@ -1,43 +1,43 @@
#include "cw.h"
#include "cw.h"
#include "dbg.h" #include "dbg.h"
#include "ktv.h" #include "ktv.h"
static struct cw_DescriptorSubelemDef allowed_default[] = { static struct cw_DescriptorSubelemDef allowed_default[] = {
{0,CW_SUBELEM_AC_HARDWARE_VERSION, "ac_hardware_versision", 1024,1}, {0,CAPWAP_SUBELEM_AC_HARDWARE_VERSION, "hardware", 1024,1},
{0,CW_SUBELEM_AC_SOFTWARE_VERSION, "ac_software_version", 1024,1}, {0,CAPWAP_SUBELEM_AC_SOFTWARE_VERSION, "software", 1024,1},
{0,0, NULL,0, 0} {0,0, NULL,0, 0}
}; };
cw_KTVStruct_t acstatus [] = {
/* type key len, pos */
{CW_TYPE_WORD, "stations", 2, -1},
{CW_TYPE_WORD, "station-limit", 2, -1},
{CW_TYPE_WORD, "avtive-wtps", 2, -1},
{CW_TYPE_WORD, "max-wtps", 2, -1},
{CW_TYPE_BYTE, "security", 1, -1},
{CW_TYPE_BYTE, "r-mac-field", 1, -1},
{CW_TYPE_BYTE, "reserved1", 1, -1},
{CW_TYPE_BYTE, "dtls-policy", 1, -1},
{NULL,NULL,0,0}
};
int cw_read_ac_descriptor(mavl_t store, uint8_t *data, int len,
struct cw_DescriptorSubelemDef *allowed)
int cw_read_ac_descriptor(mavl_t store,
struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams * params,
uint8_t *data, int len,
struct cw_DescriptorSubelemDef *allowed)
{ {
char key[CW_KTV_MAX_KEY_LEN];
cw_KTV_t * stations, *limit; cw_ktv_read_struct(params->conn->remote_cfg,acstatus,eh->key,data,len);
stations = cw_ktv_add(store,"ac-descriptor/stations",CW_TYPE_WORD,data,4);
/* status->stations = cw_get_word(data);
status->limit = cw_get_word(data + 2);
status->active_wtps = cw_get_word(data + 4);
status->max_wtps = cw_get_word(data + 6);
status->security = cw_get_byte(data + 8);
status->rmac_field = cw_get_byte(data + 9);
status->dtls_policy = cw_get_byte(data + 11);
cw_dbg(DBG_SUBELEM,
"AC Descriptor: WTPs:%d/%d, Stations:%d/%d, Security:%d, Rmac:%d, DTLS-Policy:%d",
status->active_wtps, status->max_wtps, status->stations, status->limit,
status->security, status->rmac_field, status->dtls_policy);
*/
/* mbag_set_ptr(store, CW_ITEM_AC_STATUS, status);*/
if (!allowed) if (!allowed)
allowed=allowed_default; allowed=allowed_default;
return cw_read_descriptor_subelems(store, "key", data + 12, len - 12, allowed); return cw_read_descriptor_subelems(store, eh->key, data + 12, len - 12, allowed);
} }

View File

@ -44,6 +44,9 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key,
/* search sub-element */ /* search sub-element */
for (i = 0; elems[i].maxlen; i++) { for (i = 0; elems[i].maxlen; i++) {
printf("subcmp: %d %d\n",elems[i].type,subtype);
if (elems[i].type == subtype /* && elems[i].vendor_id==vendor_id*/) if (elems[i].type == subtype /* && elems[i].vendor_id==vendor_id*/)
break; break;
} }

View File

@ -80,9 +80,10 @@ static struct frag * frag_get(struct frag * frags, int fragid)
static struct frag * frag_new(struct frag * frags, int fragid) static struct frag * frag_new(struct frag * frags, int fragid)
{ {
struct timespec t; struct timespec t;
int i;
clock_gettime(CLOCK_REALTIME,&t); clock_gettime(CLOCK_REALTIME,&t);
int i;
for (i=0; i<FRAG_MAXIDS; i++){ for (i=0; i<FRAG_MAXIDS; i++){
if (frags[i].buffer==NULL || (t.tv_sec - frags[i].t.tv_sec>FRAG_TTL) ){ if (frags[i].buffer==NULL || (t.tv_sec - frags[i].t.tv_sec>FRAG_TTL) ){
@ -126,19 +127,22 @@ uint8_t * fragman_add(frag_t * frags, uint8_t *packet, int hlen, int payloadlen)
{ {
struct frag * f; struct frag * f;
uint32_t val0,val1; uint32_t val0,val1;
int fragid,fragoffset;
int dst;
int ti;
/* read the transport header dword 0, /* read the transport header dword 0,
* contains hlen*/ * contains hlen*/
val0 = ntohl(*((uint32_t*)packet)); val0 = ntohl(*((uint32_t*)packet));
// int hlen = (val0 >> 19) & 0x1f; /* int hlen = (val0 >> 19) & 0x1f;*/
/* read the transport header dword 1, /* read the transport header dword 1,
* contains fragid and fragoffset */ * contains fragid and fragoffset */
val1 = ntohl(*(((uint32_t*)packet)+1)); val1 = ntohl(*(((uint32_t*)packet)+1));
int fragid = val1>>16; fragid = val1>>16;
int fragoffset=(val1 >>3) & 0x1fff; fragoffset=(val1 >>3) & 0x1fff;
// printf("Fragid = %i, offset = %i\n",fragid,fragoffset); /*// printf("Fragid = %i, offset = %i\n",fragid,fragoffset);*/
/* determine size of payload */ /* determine size of payload */
/* int payloadlen = len - hlen*4; /* int payloadlen = len - hlen*4;
@ -160,7 +164,7 @@ uint8_t * fragman_add(frag_t * frags, uint8_t *packet, int hlen, int payloadlen)
errno = 0; errno = 0;
int dst = fragoffset*8; dst = fragoffset*8;
/* copy fragment*/ /* copy fragment*/
if (dst + payloadlen < FRAG_MAXSIZE) { if (dst + payloadlen < FRAG_MAXSIZE) {
@ -172,9 +176,9 @@ uint8_t * fragman_add(frag_t * frags, uint8_t *packet, int hlen, int payloadlen)
f->bytesneeded=dst+payloadlen; f->bytesneeded=dst+payloadlen;
} }
int ti;
for (ti=0; ti<16; ti++){ for (ti=0; ti<16; ti++){
// printf("%02X ",(f->buffer+4)[ti]); /*// printf("%02X ",(f->buffer+4)[ti]);*/
} }
@ -182,12 +186,12 @@ uint8_t * fragman_add(frag_t * frags, uint8_t *packet, int hlen, int payloadlen)
if (f->bytesneeded>0 && f->bytesneeded<=f->bytesreceived){ if (f->bytesneeded>0 && f->bytesneeded<=f->bytesreceived){
uint8_t * r=f->buffer; uint8_t * r=f->buffer;
f->buffer=0; f->buffer=0;
// printf("last bytes need %i\n",f->bytesneeded); /*// printf("last bytes need %i\n",f->bytesneeded);*/
*((uint32_t*)(r))=f->bytesneeded; *((uint32_t*)(r))=f->bytesneeded;
return r; return r;
} }
// printf("Fragman bytes needed: %i, received %i\n",f->bytesneeded,f->bytesreceived); /*// printf("Fragman bytes needed: %i, received %i\n",f->bytesneeded,f->bytesreceived);*/
return NULL; return NULL;
} }

View File

@ -20,11 +20,19 @@
#define CW_KTV_MAX_KEY_LEN 1024 #define CW_KTV_MAX_KEY_LEN 1024
/**
* @struct cw_KTV
* @file ktv.h
* @brief Structure to store a key-type-value element.
*/
struct cw_KTV { struct cw_KTV {
/** The key for this element. A string. */
char *key; char *key;
/** Teh type of this element. */
const struct cw_Type *type; const struct cw_Type *type;
/** The value for this element */
union { union {
uint32_t dword; uint32_t dword;
uint16_t word; uint16_t word;
uint8_t byte; uint8_t byte;
void *ptr; void *ptr;
@ -72,6 +80,17 @@ struct cw_Type {
}; };
typedef struct cw_Type cw_Type_t; typedef struct cw_Type cw_Type_t;
struct cw_KTVStruct {
const struct cw_Type * type;
const char * key;
int len;
int position;
};
typedef struct cw_KTVStruct cw_KTVStruct_t;
int cw_ktv_read_struct(mavl_t ktv,cw_KTVStruct_t * stru, const char *pkey,
uint8_t * data, int len);
extern const struct cw_Type cw_type_byte; extern const struct cw_Type cw_type_byte;
extern const struct cw_Type cw_type_word; extern const struct cw_Type cw_type_word;
extern const struct cw_Type cw_type_dword; extern const struct cw_Type cw_type_dword;

View File

@ -25,6 +25,9 @@
/** /**
* @addtogroup DATAMGMT * @addtogroup DATAMGMT
* @{ * @{
*
* @defgroup MAVL Mavl Tree
* @{
*/ */
@ -40,26 +43,13 @@
/**
* @defgroup MAVL_CONSTANTS Constants
* @{
*/
/** Maximum AVL Tree depth. /** Maximum AVL Tree depth.
The number of nodes is calculated by 2^depth. The number of nodes is calculated by 2^depth.
So a value of 32 should be enough for around 4 So a value of 32 should be enough for around 4
billion nodes. */ billion nodes. */
#define MAVL_MAX_DEPTH 32 #define MAVL_MAX_DEPTH 32
/**
* @}
*/
/**
* @addtogroup MAVLStructures Structures
* @{
*/
/** /**
@ -97,9 +87,6 @@ struct mavl {
size_t data_size; size_t data_size;
}; };
/**
* @}
*/
/** /**
* MAVL AVL Tree type * MAVL AVL Tree type
@ -107,10 +94,6 @@ struct mavl {
typedef struct mavl * mavl_t; typedef struct mavl * mavl_t;
/**
* @defgroup MAVL_FUNCTIONS Functions
* @{
*/
/** /**
* @param node node * @param node node
@ -121,6 +104,7 @@ struct mavl *mavl_create ( int ( *cmp ) ( const void *, const void * ),
void ( *del ) ( void * ), size_t data_size ); void ( *del ) ( void * ), size_t data_size );
void *mavl_add ( struct mavl *t, const void *data, int *exists ); void *mavl_add ( struct mavl *t, const void *data, int *exists );
/*void *mavl_add ( struct mavl *t, const void *data );*/ /*void *mavl_add ( struct mavl *t, const void *data );*/
void * mavl_get ( struct mavl *t , const void *data ); void * mavl_get ( struct mavl *t , const void *data );
void *mavl_del ( struct mavl *t, const void *data ); void *mavl_del ( struct mavl *t, const void *data );
@ -148,9 +132,6 @@ int mavl_foreach_from_lr ( struct mavl *t, struct mavlnode *n, void *data,
/**
* @}
*/
@ -159,7 +140,7 @@ void *mavl_replace_data ( struct mavl *t, void *data, int len );
/** /**
* An alias gor #mavl_get * This macro is an alias for #mavl_get
*/ */
#define mavl_find(t,d) mavl_get(t,d) #define mavl_find(t,d) mavl_get(t,d)
@ -292,9 +273,10 @@ void * mavl_add_ptr ( mavl_t tree, const void *ptr );
#define mavliter_get_str(iter) ((char*)(mavliter_get_ptr(iter))) #define mavliter_get_str(iter) ((char*)(mavliter_get_ptr(iter)))
/** /**
* @} MAVL
*
* @} DATAMGMT
* *
* @}
* datamanag
*/ */

View File

@ -1,3 +1,8 @@
/**
* @file
* @brief Implementation of mavl_add
*/
#include "mavl.h" #include "mavl.h"
static struct mavlnode *mavlnode_create ( struct mavl *t, const void *data ) static struct mavlnode *mavlnode_create ( struct mavl *t, const void *data )
@ -179,20 +184,21 @@ static int mavl_add0 ( struct mavl *t, struct mavlnode **parent, const void ** d
/** /**
* @brief mavl add function
* Add an element to an AVL tree * Add an element to an AVL tree
*
* @param t mavl * @param t mavl
* @param data pointer to the element to add * @param data pointer to the element to add
* @param exists pointer to an interger vairable which wil be set to 1, if * @param exists pointer to an interger vairable which wil be set to 1, if
* the element to add already exists in the tree. If the element did't * the element to add already exists in the tree. If the element did't
* exist, the variable ist to 0. * exist, the variable ist to 0.
* @return A pointer to the element in the tree. If the element was added, * @return A pointer to the element in the tree. If the element was added,
* it the pointer to newly created element. If the element had already existed, * it the pointer to newly created element. If the element had already existed,
* the pointer points to the existing element. mavl_add returns thero, if * the pointer points to the existing element. mavl_add returns thero, if
* something else went wrong. Therefore consult errno. * something else went wrong. Therefore consult errno.
* @example mavl_add_example.c *
*
*/ */
void *mavl_add ( struct mavl *t, const void *data, int *exists ) void *mavl_add ( struct mavl *t, const void *data, int *exists )
{ {
const void * d; const void * d;
@ -232,3 +238,6 @@ void *mavl_add ( struct mavl *t, const void *data)
return mavl_add_exists(t,data,NULL); return mavl_add_exists(t,data,NULL);
} }
*/ */

View File

@ -19,8 +19,6 @@
/** /**
*@file *@file
*@brief Implementation of mavl_create *@brief Implementation of mavl_create
*@addtogroup MavlFunctions
*@{
*/ */
#include "mavl.h" #include "mavl.h"
@ -30,7 +28,9 @@
* @param cmp pointer to compare function * @param cmp pointer to compare function
* @param del pointer to delete function which is called when an element * @param del pointer to delete function which is called when an element
* will be deletet * will be deletet
* @return pointer to a #mavl struct * @param dta_size size of a data element
* @return pointer to a #mavl struct. If the return value is NULL something
* went wrong, and you should consult errno to get details.
*/ */
struct mavl *mavl_create(int (*cmp) (const void *, const void *), struct mavl *mavl_create(int (*cmp) (const void *, const void *),
void (*del) (void *), size_t data_size) void (*del) (void *), size_t data_size)
@ -46,5 +46,5 @@ struct mavl *mavl_create(int (*cmp) (const void *, const void *),
return t; return t;
} }
/**@}*/

View File

@ -25,6 +25,7 @@
/** /**
* Get an AVL tree element. * Get an AVL tree element.
* @param t pointer to mavl_t
* @param data Element to get * @param data Element to get
* @return pointer to element or NULL if not found. * @return pointer to element or NULL if not found.
*/ */

View File

@ -5,6 +5,7 @@ OBJS=\
mod_capwap_ac.o \ mod_capwap_ac.o \
capwap_actions_ac.o \ capwap_actions_ac.o \
capwap_in_wtp_board_data.o \ capwap_in_wtp_board_data.o \
capwap_in_ac_descriptor.o \
capwap_out_wtp_board_data.o \ capwap_out_wtp_board_data.o \
capwap_out_ac_descriptor.o \ capwap_out_ac_descriptor.o \
capwap_out_get_session_id.o \ capwap_out_get_session_id.o \

View File

@ -115,7 +115,7 @@ static struct cw_ElemHandler handlers[] = {
0,0, /* min/max length */ 0,0, /* min/max length */
NULL, /* type */ NULL, /* type */
CW_KEY_AC_DESCRIPTOR, /* Key */ CW_KEY_AC_DESCRIPTOR, /* Key */
NULL, /* get */ capwap_in_ac_descriptor, /* get */
capwap_out_ac_descriptor /* put */ capwap_out_ac_descriptor /* put */
} }
, ,

View File

@ -0,0 +1,21 @@
#include "cw/cw.h"
#include "cw/dbg.h"
#include "cw/vendors.h"
int capwap_in_ac_descriptor(struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams *params,
uint8_t * data, int len)
{
static struct cw_DescriptorSubelemDef allowed[] = {
{0,CAPWAP_SUBELEM_AC_HARDWARE_VERSION, "hardware", 1024,1},
{0,CAPWAP_SUBELEM_AC_SOFTWARE_VERSION, "software", 1024,1},
{0,0, NULL,0, 0}
};
return cw_read_ac_descriptor(params->conn->remote_cfg,eh,params,data,len,allowed);
}

View File

@ -1,12 +1,11 @@
#include "cw/log.h" #include "cw/log.h"
#include "cw/dbg.h"
#include "cw/conn.h" #include "cw/conn.h"
#include "cw/capwap.h" #include "cw/capwap.h"
#include "cw/cw.h" #include "cw/cw.h"
#include "cw/ktv.h" #include "cw/ktv.h"
#include "cw/keys.h" #include "cw/keys.h"
@ -54,7 +53,7 @@ static int put_ac_status(mavl_t global, mavl_t local, uint8_t *dst, const char *
int capwap_out_ac_descriptor(struct cw_ElemHandler * eh, int capwap_out_ac_descriptor(struct cw_ElemHandler * eh,
struct cw_ElemHandlerParams * params, uint8_t * dst) struct cw_ElemHandlerParams * params, uint8_t * dst)
{ {
int len; int len,l;
uint8_t *d = dst+4; uint8_t *d = dst+4;
char key[CW_KTV_MAX_KEY_LEN]; char key[CW_KTV_MAX_KEY_LEN];
@ -64,14 +63,17 @@ int capwap_out_ac_descriptor(struct cw_ElemHandler * eh,
sprintf(key,"%s/%s",eh->key,CW_SKEY_HARDWARE); sprintf(key,"%s/%s",eh->key,CW_SKEY_HARDWARE);
d+=cw_write_descriptor_subelem (d, params->conn->local_cfg, d+=cw_write_descriptor_subelem (d, params->conn->local_cfg,
CW_SUBELEM_AC_HARDWARE_VERSION, key); CAPWAP_SUBELEM_AC_HARDWARE_VERSION, key);
sprintf(key,"%s/%s",eh->key,CW_SKEY_SOFTWARE); sprintf(key,"%s/%s",eh->key,CW_SKEY_SOFTWARE);
d+=cw_write_descriptor_subelem (d, params->conn->local_cfg, d+=cw_write_descriptor_subelem (d, params->conn->local_cfg,
CW_SUBELEM_AC_HARDWARE_VERSION, key); CAPWAP_SUBELEM_AC_SOFTWARE_VERSION, key);
len = d-dst-4; len = d-dst-4;
return len + cw_put_elem_hdr(dst,eh->id,len); l = len + cw_put_elem_hdr(dst,eh->id,len);
cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,eh,dst,l);
return l;
} }

View File

@ -27,7 +27,9 @@ int capwap_in_capwap_control_ip_address(struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams *params, struct cw_ElemHandlerParams *params,
uint8_t * data, int len); uint8_t * data, int len);
int capwap_in_ac_descriptor(struct cw_ElemHandler *eh,
struct cw_ElemHandlerParams *params,
uint8_t * data, int len);
/* /*

View File

@ -34,7 +34,7 @@
#define CW_CISCO_MWAR_ADDR LW_ELEM_AC_ADDRESS /* 2 */ #define CW_CISCO_MWAR_ADDR LW_ELEM_AC_ADDRESS /* 2 */
#define CW_CISCO_RAD 3 #define CW_CISCO_RAD 3
#define CW_CISCO_RAD_SLOT 4 #define CW_CISCO_RAD_SLOT 4
#define CW_CISCO_RAD_NAME LW_ELEM_WTP_NAME /* 5 */ #define CW_CISCO_RAD_NAME LWAPP_ELEM_WTP_NAME /* 5 */
#define CW_CISCO_MWAR LW_ELEM_AC_DESCRIPTOR /* 6 */ #define CW_CISCO_MWAR LW_ELEM_AC_DESCRIPTOR /* 6 */
#define CW_CISCO_ADD_WLAN LW_ELEM_80211_ADD_WLAN /* 7 */ #define CW_CISCO_ADD_WLAN LW_ELEM_80211_ADD_WLAN /* 7 */
#define CW_CISCO_WTP_RADIO_CFG 8 #define CW_CISCO_WTP_RADIO_CFG 8