Configuration Request and Reponse
FossilOrigin-Name: 7ee0e857269b188cb3b1b720d5f9ea4be45c211ea8ccccb7abadcb74587b3870
This commit is contained in:
@ -130,6 +130,7 @@ KTVSRC=\
|
||||
cw_ktv_read_struct.c\
|
||||
cw_ktv_write_struct.c\
|
||||
cw_ktv_std_types.c\
|
||||
cw_ktv_base_exists.c\
|
||||
|
||||
|
||||
LWSRC=\
|
||||
@ -263,6 +264,7 @@ DTLSSRC+=\
|
||||
|
||||
RADIOSRC=\
|
||||
cw_out_radio_generic.c\
|
||||
cw_out_radio_generic_struct.c\
|
||||
cw_read_radio_generic.c\
|
||||
|
||||
|
||||
|
@ -217,10 +217,12 @@
|
||||
#define CW_ELEM_RESERVED_9 9
|
||||
#define CAPWAP_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS 10
|
||||
#define CAPWAP_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS 11
|
||||
#define CAPWAP_ELEM_CAPWAP_TIMERS 12
|
||||
|
||||
/**@}*/
|
||||
#define CAPWAP_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS 30
|
||||
#define CAPWAP_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS 50
|
||||
#define CW_ELEM_CAPWAP_TIMERS 12
|
||||
|
||||
#define CW_ELEM_CAPWAP_TRANSPORT_PROTOCOL 51 /* not in draft 7 */
|
||||
#define CW_ELEM_DATA_TRANSFER_DATA 13
|
||||
#define CW_ELEM_DATA_TRANSFER_MODE 14
|
||||
|
@ -56,7 +56,7 @@ enum radioelems {
|
||||
/** IEEE 802.11 OFDM Control */
|
||||
CW_ELEM80211_ODFM_CONTROL = 1033,
|
||||
/** IEEE 802.11 Supported WLAN Rates */
|
||||
CW_ELEM80211_RATE_SET = 1034,
|
||||
CAPWAP80211_ELEM_RATE_SET = 1034,
|
||||
/** IEEE 802.11 RSNA Error Report From Station */
|
||||
CW_ELEM80211_RSNA_ERROR_REPORT_FROM_STATION=1035,
|
||||
/** IEEE 802.11 Station */
|
||||
|
@ -17,7 +17,7 @@ struct cw_StrListElem capwap_strings_elem[] = {
|
||||
{CAPWAP_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS, "Control IPv6 Address"},
|
||||
{CAPWAP_ELEM_CAPWAP_LOCAL_IPV4_ADDRESS, "CAWPAP Local IPv4 Address"},
|
||||
{CAPWAP_ELEM_CAPWAP_LOCAL_IPV6_ADDRESS, "CAPWAP Local IPv6 Address"},
|
||||
{CW_ELEM_CAPWAP_TIMERS, "CAPWAP Timers"},
|
||||
{CAPWAP_ELEM_CAPWAP_TIMERS, "CAPWAP Timers"},
|
||||
{CW_ELEM_CAPWAP_TRANSPORT_PROTOCOL, "CAPWAP Transport Protocol"},
|
||||
{CW_ELEM_DATA_TRANSFER_DATA, "Data Transfer Data"},
|
||||
{CW_ELEM_DATA_TRANSFER_MODE, "Data Transfer Mode"},
|
||||
|
@ -6,7 +6,7 @@ struct cw_StrListElem capwap_strings_elem80211[] = {
|
||||
|
||||
{CW_ELEM80211_ADD_WLAN, "802.11 Add WLAN"},
|
||||
{CW_ELEM80211_ANTENNA, "802.11 Antenna"},
|
||||
{CW_ELEM80211_RATE_SET, "802.11 Rate Set"},
|
||||
{CAPWAP80211_ELEM_RATE_SET, "802.11 Rate Set"},
|
||||
{CW_ELEM80211_SUPPORTED_RATES,"802.11 Supported Rates"},
|
||||
|
||||
{CAPWAP80211_ELEM_WTP_RADIO_INFORMATION, " 802.11 WTP Radio Information"},
|
||||
|
@ -419,6 +419,9 @@ int cw_in_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHa
|
||||
|
||||
int cw_out_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||
, uint8_t * dst);
|
||||
|
||||
int cw_out_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||
, uint8_t * dst);
|
||||
|
||||
extern int cw_in_wtp_reboot_statistics(struct conn *conn, struct cw_action_in *a,
|
||||
uint8_t * data, int len, struct sockaddr *from);
|
||||
|
@ -17,7 +17,7 @@ int cw_in_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHa
|
||||
}
|
||||
|
||||
radio = cw_get_byte(elem_data);
|
||||
sprintf(key,"radio/%d/%s",radio,handler->key);
|
||||
sprintf(key,"radio.%d/%s",radio,handler->key);
|
||||
|
||||
cw_ktv_read_struct(params->conn->remote_cfg,handler->type,key,elem_data+1,elem_len-1);
|
||||
|
||||
|
29
src/cw/cw_ktv_base_exists.c
Normal file
29
src/cw/cw_ktv_base_exists.c
Normal file
@ -0,0 +1,29 @@
|
||||
#include "ktv.h"
|
||||
/**
|
||||
* @file
|
||||
* @description Implementation of cw_ktv_base_exisits
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @brief Check if elements with e certain baskey can be found in
|
||||
* in ktvstore.
|
||||
* @param ktvstore ktvstore to search in
|
||||
* @param basekey basekey to search for
|
||||
* @return The first ktv element belonging to the base eky,
|
||||
* otherwise NULL if no element was found.
|
||||
*
|
||||
*/
|
||||
cw_KTV_t * cw_ktv_base_exists(mavl_t ktvstore, const char *basekey)
|
||||
{
|
||||
cw_KTV_t * result, search;
|
||||
search.key=(char*)basekey;
|
||||
result = mavl_get_first(ktvstore,&search);
|
||||
if (result == NULL)
|
||||
return NULL;
|
||||
|
||||
if (strncmp(result->key,basekey,strlen(basekey))==0)
|
||||
return result;
|
||||
|
||||
return NULL;
|
||||
}
|
@ -43,9 +43,6 @@ void * ktvn(struct mavl *t ,const void *search)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int cw_ktv_idx_get(mavl_t ktv, const char *key)
|
||||
{
|
||||
char ikey[CW_KTV_MAX_KEY_LEN];
|
||||
|
@ -4,54 +4,64 @@
|
||||
#include "ktv.h"
|
||||
/**
|
||||
* @brief Default function to compare two values of type #cw_KTV_t.
|
||||
*
|
||||
*
|
||||
* @param v1
|
||||
* @param v2
|
||||
* @return
|
||||
* @return
|
||||
*/
|
||||
int cw_ktv_mavlcmp(const void *v1, const void *v2)
|
||||
int cw_ktv_mavlcmp (const void *v1, const void *v2)
|
||||
{
|
||||
char *d1,*d2;
|
||||
int l1,l2,rc,i1,i2;
|
||||
char *d1, *d2, *k1, *k2;
|
||||
int l1, l2, rc, i1, i2;
|
||||
|
||||
/* Find dots in both keys */
|
||||
d1 = strchr(((cw_KTV_t *) v1)->key,'.');
|
||||
d2 = strchr(((cw_KTV_t *) v2)->key,'.');
|
||||
k1 = ( (cw_KTV_t *) v1)->key;
|
||||
k2 = ( (cw_KTV_t *) v2)->key;
|
||||
|
||||
/* if there are no dots, compare keys as normal */
|
||||
if (d1==NULL || d2==NULL)
|
||||
return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key);
|
||||
|
||||
/* calculate the length of the key till dots */
|
||||
l1=d1-((cw_KTV_t *) v1)->key;
|
||||
l2=d2-((cw_KTV_t *) v2)->key;
|
||||
|
||||
/* if length differs do a normal compare */
|
||||
if (l1!=l2){
|
||||
return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key);
|
||||
}
|
||||
|
||||
|
||||
rc = strncmp(((cw_KTV_t *) v1)->key,((cw_KTV_t *) v2)->key,l1);
|
||||
if (rc!=0){
|
||||
return rc;
|
||||
}
|
||||
|
||||
d1++;
|
||||
d2++;
|
||||
i1 = atoi(d1);
|
||||
i2 = atoi(d2);
|
||||
|
||||
rc = i1-i2;
|
||||
if (rc != 0)
|
||||
return rc;
|
||||
|
||||
while (isdigit(*d1))
|
||||
while (1) {
|
||||
/* Find dots in both keys */
|
||||
d1 = strchr (k1, '.');
|
||||
d2 = strchr (k2, '.');
|
||||
|
||||
/* if there are no dots, compare keys as normal */
|
||||
if (d1 == NULL || d2 == NULL)
|
||||
return strcmp (k1, k2);
|
||||
|
||||
|
||||
/* calculate the length of the key till dots */
|
||||
l1 = d1 - k1; /*((cw_KTV_t *) v1)->key;*/
|
||||
l2 = d2 - k2; /*((cw_KTV_t *) v2)->key;*/
|
||||
|
||||
/* if length differs do a normal compare */
|
||||
if (l1 != l2) {
|
||||
return strcmp (k1, k2); /*((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key);*/
|
||||
}
|
||||
|
||||
|
||||
rc = strncmp (k1, k2, l1); /*((cw_KTV_t *) v1)->key,((cw_KTV_t *) v2)->key,l1);*/
|
||||
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
d1++;
|
||||
while (isdigit(*d2))
|
||||
d2++;
|
||||
|
||||
return strcmp(d1,d2);
|
||||
|
||||
|
||||
i1 = atoi (d1);
|
||||
i2 = atoi (d2);
|
||||
|
||||
rc = i1 - i2;
|
||||
|
||||
if (rc != 0)
|
||||
return rc;
|
||||
|
||||
while (isdigit (*d1))
|
||||
d1++;
|
||||
|
||||
while (isdigit (*d2))
|
||||
d2++;
|
||||
|
||||
k1=d1;
|
||||
k2=d2;
|
||||
/*return strcmp(d1,d2);*/
|
||||
/*return cw_ktv_mavlcmp(d1,d2);*/
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ int cw_out_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerP
|
||||
|
||||
radios = cw_ktv_get_byte(params->conn->local_cfg,"wtp-descriptor/max-radios",0);
|
||||
|
||||
for(i=1;i<radios+1;i++){
|
||||
for(i=0;i<radios;i++){
|
||||
l = cw_write_radio_element(handler,params,i,dst+len);
|
||||
cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,handler,dst,l);
|
||||
len+=l;
|
||||
|
41
src/cw/cw_out_radio_generic_struct.c
Normal file
41
src/cw/cw_out_radio_generic_struct.c
Normal file
@ -0,0 +1,41 @@
|
||||
|
||||
#include "cw.h"
|
||||
#include "dbg.h"
|
||||
|
||||
int cw_out_radio_generic_struct(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||
, uint8_t * dst)
|
||||
{
|
||||
int i,l, offset;
|
||||
int radios;
|
||||
uint8_t * cdst;
|
||||
|
||||
cdst = dst;
|
||||
|
||||
radios = cw_ktv_get_byte(params->conn->local_cfg,"wtp-descriptor/max-radios",0);
|
||||
|
||||
|
||||
offset = params->conn->header_len(handler);
|
||||
for(i=0;i<radios;i++){
|
||||
char basekey[CW_KTV_MAX_KEY_LEN];
|
||||
cw_KTV_t * result;
|
||||
sprintf(basekey,"radio.%d/%s",i,handler->key);
|
||||
|
||||
result = cw_ktv_base_exists(params->conn->local_cfg,basekey);
|
||||
if (result == NULL)
|
||||
continue;
|
||||
|
||||
|
||||
l=0;
|
||||
l+=cw_put_byte(cdst+offset+l,i);
|
||||
l+= cw_ktv_write_struct(params->conn->local_cfg,handler->type,basekey,cdst+offset+l);
|
||||
|
||||
|
||||
cdst+=params->conn->write_header(handler,cdst,l);
|
||||
|
||||
|
||||
/* l = cw_write_radio_element(handler,params,i,dst+len);
|
||||
cw_dbg_elem(DBG_ELEM_OUT,params->conn,params->msgdata->type,handler,dst,l);
|
||||
len+=l;*/
|
||||
}
|
||||
return cdst-dst;
|
||||
}
|
@ -19,7 +19,7 @@ int cw_in_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerPa
|
||||
}
|
||||
|
||||
radio=cw_get_byte(elem_data);
|
||||
sprintf(key,"radio/%d/%s",radio,handler->key);
|
||||
sprintf(key,"radio.%d/%s",radio,handler->key);
|
||||
|
||||
result = cw_ktv_add(params->conn->remote_cfg, key,
|
||||
handler->type, elem_data+1,elem_len-1);
|
||||
|
@ -11,7 +11,7 @@ int cw_write_radio_element(struct cw_ElemHandler * handler, struct cw_ElemHandle
|
||||
|
||||
len =0;
|
||||
|
||||
sprintf(key,"radio/%d/%s",idx,handler->key);
|
||||
sprintf(key,"radio.%d/%s",idx,handler->key);
|
||||
|
||||
/*printf("Looking for key: %s\n",key);*/
|
||||
|
||||
|
@ -39,6 +39,7 @@ struct cw_KTV {
|
||||
void *ptr;
|
||||
char *str;
|
||||
int boolean;
|
||||
float float_val;
|
||||
} val;
|
||||
};
|
||||
typedef struct cw_KTV cw_KTV_t;
|
||||
@ -170,7 +171,7 @@ void * cw_ktv_get_sysptr(mavl_t ktv,const char *key, void * def);
|
||||
char * cw_ktv_get_str(mavl_t ktv,const char *key, char * def);
|
||||
|
||||
int cw_ktv_idx_get(mavl_t ktv, const char *key);
|
||||
|
||||
cw_KTV_t * cw_ktv_base_exists(mavl_t ktvstore, const char *basekey);
|
||||
|
||||
extern const cw_Type_t * cw_ktv_std_types[];
|
||||
#define CW_KTV_STD_TYPES cw_ktv_std_types
|
||||
|
Reference in New Issue
Block a user