ac descriptor, struct reader

FossilOrigin-Name: 3b8718025cc9d01c66afddbc09fda047e4c78427fe342d8a800ba066eae62270
bsdmakefiles
7u83@mail.ru 5 years ago
parent 54e852c6a1
commit c1f1d91b28
  1. 2
      libcw.project
  2. 1
      mod_capwap.project
  3. 11
      src/cw/capwap.h
  4. 16
      src/cw/cw.h
  5. 43
      src/cw/cw_in_ac_descriptor.c
  6. 9
      src/cw/cw_ktv_get.c
  7. 30
      src/cw/cw_ktv_read_struct.c
  8. 5
      src/cw/cw_out_wtp_descriptor.c
  9. 48
      src/cw/cw_read_ac_descriptor.c
  10. 3
      src/cw/cw_read_descriptor_subelems.c
  11. 26
      src/cw/fragman.c
  12. 21
      src/cw/ktv.h
  13. 34
      src/cw/mavl.h
  14. 15
      src/cw/mavl_add.c
  15. 8
      src/cw/mavl_create.c
  16. 1
      src/cw/mavl_get.c
  17. 1
      src/mod/capwap/Makefile
  18. 2
      src/mod/capwap/capwap_actions_ac.c
  19. 21
      src/mod/capwap/capwap_in_ac_descriptor.c
  20. 14
      src/mod/capwap/capwap_out_ac_descriptor.c
  21. 4
      src/mod/capwap/mod_capwap.h
  22. 2
      src/mod/cisco/capwap_cisco.h

@ -129,7 +129,6 @@
<File Name="src/cw/cwmsg_addelem_80211_add_wlan.c"/>
<File Name="src/cw/dot11.h"/>
<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_get.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/lw_put_bstr.c"/>
<File Name="src/cw/mavl_get_node_cmp..c"/>
<File Name="src/cw/cw_ktv_read_struct.c"/>
</VirtualDirectory>
</VirtualDirectory>
<Description/>

@ -23,6 +23,7 @@
<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_in_capwap_control_ip_address.c"/>
<File Name="src/mod/capwap/capwap_in_ac_descriptor.c"/>
</VirtualDirectory>
</VirtualDirectory>
</VirtualDirectory>

@ -299,8 +299,8 @@
#define CW_SUBELEM_WTP_BOOTLOADER_VERSION 2
#define CW_SUBELEM_WTP_OTHERSOFTWARE_VERSION 3
#define CW_SUBELEM_AC_HARDWARE_VERSION 4
#define CW_SUBELEM_AC_SOFTWARE_VERSION 5
#define CAPWAP_SUBELEM_AC_HARDWARE_VERSION 4
#define CAPWAP_SUBELEM_AC_SOFTWARE_VERSION 5
/* Frame tunnnel mode bits */
@ -524,7 +524,7 @@ enum cw_reboot_failure_types {
/*
struct cwimage_data {
uint8_t *data;
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_update_request(uint8_t * elems, int elems_len);
*/
/* 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_strelem(id) cw_strlist_get_str(capwap_strings_elem,id)
#define cw_strstate(id) cw_strlist_get_str(capwap_strings_state,id)

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

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

@ -1,6 +1,15 @@
#include "ktv.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 search, *result;

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

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

@ -1,43 +1,43 @@
#include "cw.h"
#include "cw.h"
#include "dbg.h"
#include "ktv.h"
static struct cw_DescriptorSubelemDef allowed_default[] = {
{0,CW_SUBELEM_AC_HARDWARE_VERSION, "ac_hardware_versision", 1024,1},
{0,CW_SUBELEM_AC_SOFTWARE_VERSION, "ac_software_version", 1024,1},
{0,CAPWAP_SUBELEM_AC_HARDWARE_VERSION, "hardware", 1024,1},
{0,CAPWAP_SUBELEM_AC_SOFTWARE_VERSION, "software", 1024,1},
{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)
{
char key[CW_KTV_MAX_KEY_LEN];
cw_KTV_t * stations, *limit;
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);*/
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)
{
cw_ktv_read_struct(params->conn->remote_cfg,acstatus,eh->key,data,len);
if (!allowed)
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);
}

@ -44,6 +44,9 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key,
/* search sub-element */
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*/)
break;
}

@ -80,9 +80,10 @@ static struct frag * frag_get(struct frag * frags, int fragid)
static struct frag * frag_new(struct frag * frags, int fragid)
{
struct timespec t;
int i;
clock_gettime(CLOCK_REALTIME,&t);
int i;
for (i=0; i<FRAG_MAXIDS; i++){
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;
uint32_t val0,val1;
int fragid,fragoffset;
int dst;
int ti;
/* read the transport header dword 0,
* contains hlen*/
val0 = ntohl(*((uint32_t*)packet));
// int hlen = (val0 >> 19) & 0x1f;
/* int hlen = (val0 >> 19) & 0x1f;*/
/* read the transport header dword 1,
* contains fragid and fragoffset */
val1 = ntohl(*(((uint32_t*)packet)+1));
int fragid = val1>>16;
int fragoffset=(val1 >>3) & 0x1fff;
fragid = val1>>16;
fragoffset=(val1 >>3) & 0x1fff;
// printf("Fragid = %i, offset = %i\n",fragid,fragoffset);
/*// printf("Fragid = %i, offset = %i\n",fragid,fragoffset);*/
/* determine size of payload */
/* 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;
int dst = fragoffset*8;
dst = fragoffset*8;
/* copy fragment*/
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;
}
int 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){
uint8_t * r=f->buffer;
f->buffer=0;
// printf("last bytes need %i\n",f->bytesneeded);
/*// printf("last bytes need %i\n",f->bytesneeded);*/
*((uint32_t*)(r))=f->bytesneeded;
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;
}

@ -20,11 +20,19 @@
#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 {
/** The key for this element. A string. */
char *key;
/** Teh type of this element. */
const struct cw_Type *type;
/** The value for this element */
union {
uint32_t dword;
uint32_t dword;
uint16_t word;
uint8_t byte;
void *ptr;
@ -72,6 +80,17 @@ struct cw_Type {
};
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_word;
extern const struct cw_Type cw_type_dword;

@ -25,6 +25,9 @@
/**
* @addtogroup DATAMGMT
* @{
*
* @defgroup MAVL Mavl Tree
* @{
*/
@ -40,26 +43,13 @@
/**
* @defgroup MAVL_CONSTANTS Constants
* @{
*/
/** Maximum AVL Tree depth.
The number of nodes is calculated by 2^depth.
So a value of 32 should be enough for around 4
billion nodes. */
#define MAVL_MAX_DEPTH 32
/**
* @}
*/
/**
* @addtogroup MAVLStructures Structures
* @{
*/
/**
@ -97,9 +87,6 @@ struct mavl {
size_t data_size;
};
/**
* @}
*/
/**
* MAVL AVL Tree type
@ -107,10 +94,6 @@ struct mavl {
typedef struct mavl * mavl_t;
/**
* @defgroup MAVL_FUNCTIONS Functions
* @{
*/
/**
* @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 *mavl_add ( struct mavl *t, const void *data, int *exists );
/*void *mavl_add ( struct mavl *t, const void *data );*/
void * mavl_get ( 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)
@ -292,9 +273,10 @@ void * mavl_add_ptr ( mavl_t tree, const void *ptr );
#define mavliter_get_str(iter) ((char*)(mavliter_get_ptr(iter)))
/**
* @} MAVL
*
* @} DATAMGMT
*
* @}
* datamanag
*/

@ -1,3 +1,8 @@
/**
* @file
* @brief Implementation of mavl_add
*/
#include "mavl.h"
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
*
* @param t mavl
* @param data pointer to the element to add
* @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
* exist, the variable ist to 0.
* @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,
* the pointer points to the existing element. mavl_add returns thero, if
* something else went wrong. Therefore consult errno.
* @example mavl_add_example.c
*
*
*/
void *mavl_add ( struct mavl *t, const void *data, int *exists )
{
const void * d;
@ -232,3 +238,6 @@ void *mavl_add ( struct mavl *t, const void *data)
return mavl_add_exists(t,data,NULL);
}
*/

@ -19,8 +19,6 @@
/**
*@file
*@brief Implementation of mavl_create
*@addtogroup MavlFunctions
*@{
*/
#include "mavl.h"
@ -30,7 +28,9 @@
* @param cmp pointer to compare function
* @param del pointer to delete function which is called when an element
* 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 *),
void (*del) (void *), size_t data_size)
@ -46,5 +46,5 @@ struct mavl *mavl_create(int (*cmp) (const void *, const void *),
return t;
}
/**@}*/

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

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

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

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

@ -1,12 +1,11 @@
#include "cw/log.h"
#include "cw/dbg.h"
#include "cw/conn.h"
#include "cw/capwap.h"
#include "cw/cw.h"
#include "cw/ktv.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,
struct cw_ElemHandlerParams * params, uint8_t * dst)
{
int len;
int len,l;
uint8_t *d = dst+4;
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);
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);
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;
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;
}

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

@ -34,7 +34,7 @@
#define CW_CISCO_MWAR_ADDR LW_ELEM_AC_ADDRESS /* 2 */
#define CW_CISCO_RAD 3
#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_ADD_WLAN LW_ELEM_80211_ADD_WLAN /* 7 */
#define CW_CISCO_WTP_RADIO_CFG 8

Loading…
Cancel
Save