Compare commits
No commits in common. "b54f4fb9faf9cb74bf49960b1cb2eca62235981e" and "a051ba41deda5a1f4e01bf177bc4018b84729f99" have entirely different histories.
b54f4fb9fa
...
a051ba41de
@ -4,7 +4,6 @@
|
||||
#include "cw/mlist.h"
|
||||
#include "mavl.h"
|
||||
#include "cw/mod.h"
|
||||
#include "cw/dbg.h"
|
||||
|
||||
#include "discovery_cache.h"
|
||||
struct cw_DiscoveryCacheElem{
|
||||
@ -109,23 +108,13 @@ errX:
|
||||
void discovery_cache_add(struct cw_DiscoveryCache *cache,
|
||||
struct sockaddr * addr, struct cw_Mod * mod_capwap, struct cw_Mod * mod_bindings)
|
||||
{
|
||||
|
||||
{
|
||||
cw_dbg(DBG_X,"////////////////////////// ADDD CAHCE ///////////////////////");
|
||||
char str[128];
|
||||
sock_addrtostr(addr,str,128,1);
|
||||
printf("Add addr: %s\n",str);
|
||||
}
|
||||
|
||||
struct cw_DiscoveryCacheElem * cur = cache->queue+cache->qpos;
|
||||
if (cur->cmod!=NULL){
|
||||
/* delete here */
|
||||
|
||||
cw_dbg(DBG_X,"DOIN MAVL DEL ----- ///////////");
|
||||
|
||||
void * ptr = &cur;
|
||||
mavl_del(cache->byaddr,ptr);
|
||||
mavl_del(cache->byaddrp,ptr);
|
||||
mavl_del(cache->byaddr,ptr);
|
||||
|
||||
}
|
||||
|
||||
cur->cmod=mod_capwap;
|
||||
@ -155,24 +144,9 @@ int discovery_cache_get(struct cw_DiscoveryCache * cache,struct sockaddr *addr,
|
||||
sock_copyaddr(&search.addr,addr);
|
||||
search.ctrhi=search.ctrlo=0;
|
||||
|
||||
{
|
||||
cw_dbg(DBG_X,"DISCOVERY CACHE ---------------------------- GET ENTER");
|
||||
char str[128];
|
||||
sock_addrtostr(addr,str,128,1);
|
||||
printf("Add addr: %s\n",str);
|
||||
}
|
||||
|
||||
search_ptr = &search;
|
||||
result = mavl_get(cache->byaddrp ,&search_ptr);
|
||||
if (result != NULL){
|
||||
{
|
||||
cw_dbg(DBG_X,"DISCOVERY CACHE ---------------------------- FOUND 1 with Port");
|
||||
char str[128];
|
||||
sock_addrtostr(addr,str,128,1);
|
||||
printf("Add addr: %s\n",str);
|
||||
}
|
||||
|
||||
|
||||
elem = *result;
|
||||
if (elem != NULL){
|
||||
mavl_del(cache->byaddr,result);
|
||||
@ -192,37 +166,14 @@ int discovery_cache_get(struct cw_DiscoveryCache * cache,struct sockaddr *addr,
|
||||
result = mavl_get_first(cache->byaddr, &search_ptr);
|
||||
if (result == NULL)
|
||||
return 0;
|
||||
{
|
||||
cw_dbg(DBG_X,"DISCOVERY CACHE ---------------------------- DOUND BY ADDR");
|
||||
char str[128];
|
||||
sock_addrtostr(addr,str,128,1);
|
||||
printf("Add addr: %s\n",str);
|
||||
}
|
||||
|
||||
|
||||
elem = *result;
|
||||
if (elem != NULL){
|
||||
cw_dbg(DBG_X,"elem != NULL");
|
||||
|
||||
{
|
||||
cw_dbg(DBG_X,"DISCOVERY CACHE ---------------------------- DOUND BY ADDR");
|
||||
char str[128];
|
||||
sock_addrtostr(&elem->addr,str,128,1);
|
||||
printf("ELEM addr: %s\n",str);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (sock_cmpaddr((struct sockaddr*)&elem->addr,addr,0)!=0)
|
||||
return 0;
|
||||
|
||||
cw_dbg(DBG_X,"DOIN MAVL DEL HERO ----- ///////////");
|
||||
mavl_del(cache->byaddr,&elem);
|
||||
cw_dbg(DBG_X,"DOIN MAVL DEL HERXXXXXXO ----- ///////////");
|
||||
mavl_del(cache->byaddrp,&elem);
|
||||
cw_dbg(DBG_X,"DOIN MAVL DEL HERO 0000 ----- ///////////");
|
||||
mavl_del(cache->byaddr,result);
|
||||
mavl_del(cache->byaddrp,result);
|
||||
|
||||
*modcapwap=elem->cmod;
|
||||
*modbindings=elem->bmod;
|
||||
|
@ -310,7 +310,7 @@ static void *wtpman_main(void *arg)
|
||||
wtpman->conn->seqnum = 0;
|
||||
conn = wtpman->conn;
|
||||
|
||||
// wtpman->conn->remote_cfg = cw_cfg_create();
|
||||
wtpman->conn->remote_cfg = cw_cfg_create();
|
||||
|
||||
|
||||
if (!wtpman->dtlsmode) {
|
||||
@ -358,6 +358,32 @@ static void *wtpman_main(void *arg)
|
||||
|
||||
|
||||
while (!cw_timer_timeout(timer)) {
|
||||
if (conn->update_cfg != NULL) {
|
||||
mavl_t tmp;
|
||||
|
||||
|
||||
tmp = conn->local_cfg;
|
||||
|
||||
/* mavl_merge(conn->default_cfg, conn->local_cfg);*/
|
||||
/* mavl_merge(conn->default_cfg, conn->remote_cfg);*/
|
||||
|
||||
conn->local_cfg = conn->update_cfg;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cw_dbg(DBG_INFO, "Updating WTP %s",
|
||||
sock_addr2str(&conn->addr, sock_buf));
|
||||
|
||||
rc = cw_send_request(conn,
|
||||
CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST);
|
||||
mavl_merge(conn->remote_cfg, conn->update_cfg);
|
||||
|
||||
conn->update_cfg = NULL;
|
||||
conn->local_cfg = tmp;
|
||||
}
|
||||
|
||||
|
||||
rc = cw_read_messages(wtpman->conn);
|
||||
if (rc < 0) {
|
||||
@ -601,16 +627,13 @@ void wtpman_destroy(struct wtpman *wtpman)
|
||||
static void copy(struct cw_ElemHandlerParams * params)
|
||||
{
|
||||
struct wtpman * wtpman;
|
||||
struct cw_Conn * conn;
|
||||
wtpman = (struct wtpman*)params->conn->data;
|
||||
conn = (struct cw_Conn*)params->conn;
|
||||
|
||||
|
||||
cw_dbg(DBG_X,"------------- Here is the config we ve got from WTP ---------------- ");
|
||||
cw_cfg_dump(params->cfg);
|
||||
cw_dbg(DBG_X,"------------- This was the config we ve got from WTP ---------------- ");
|
||||
cw_dbg(DBG_X,"Now copying:");
|
||||
cw_cfg_copy(params->cfg,conn->local_cfg);
|
||||
cw_cfg_copy(params->cfg,wtpman->wtp_cfg);
|
||||
cw_dbg(DBG_X,"Copying done.");
|
||||
}
|
||||
|
||||
@ -624,32 +647,17 @@ static int discovery_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_pt
|
||||
|
||||
static int join_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
|
||||
{
|
||||
struct cw_Conn * conn = (struct cw_Conn*)params->conn;
|
||||
char filename[200];
|
||||
|
||||
cw_dbg(DBG_X,"JOIN Callback");
|
||||
copy(params);
|
||||
const char * wtpname = cw_cfg_get(conn->local_cfg,"wtp-name","default");
|
||||
sprintf(filename,"wtp-join-%s.ckv",wtpname);
|
||||
cw_cfg_save(filename,params->cfg);
|
||||
cw_cfg_clear(params->cfg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int update_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
|
||||
{
|
||||
struct cw_Conn * conn = (struct cw_Conn*)params->conn;
|
||||
char filename[200];
|
||||
|
||||
|
||||
|
||||
cw_dbg(DBG_X,"UPDATE Callback");
|
||||
copy(params);
|
||||
|
||||
const char * wtpname = cw_cfg_get(conn->local_cfg,"wtp-name","default");
|
||||
sprintf(filename,"wtp-status-%s.ckv",wtpname);
|
||||
cw_cfg_save(filename,params->cfg);
|
||||
|
||||
cw_cfg_clear(params->cfg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
VERSION="1.2.0"
|
||||
VERSION="1.1.0a"
|
||||
|
||||
wget -O libmavl-${VERSION}.tgz ftp://ftp.planix.org/pub/planix/libmavl-${VERSION}.tgz
|
||||
tar xzvf libmavl-${VERSION}.tgz
|
||||
|
@ -34,6 +34,7 @@ CWSRC=\
|
||||
cw_load_file.c\
|
||||
cw_out_generic_with_index.c\
|
||||
cw_out_radio_administrative_states.c\
|
||||
cw_process_element.c\
|
||||
cw_put_elem_radio_administrative_state.c\
|
||||
cw_put_elem_radio_operational_state.c\
|
||||
cw_put_image_data.c\
|
||||
@ -76,7 +77,6 @@ CWSRC=\
|
||||
# cw_in_generic.c\
|
||||
# cw_out_generic.c\
|
||||
#
|
||||
# cw_process_element.c\
|
||||
|
||||
KTVSRC=\
|
||||
cw_ktv_add.c\
|
||||
@ -181,6 +181,7 @@ MISCSRC=\
|
||||
conn_create_noq.c\
|
||||
connlist.c\
|
||||
conn_prepare_image_data_request.c\
|
||||
cw_decode_msg.c \
|
||||
conn_q_add_packet.c\
|
||||
conn_q_get_packet.c\
|
||||
conn_q_recv_packet.c\
|
||||
@ -193,6 +194,7 @@ MISCSRC=\
|
||||
format.c\
|
||||
format_is_utf8.c\
|
||||
fragman.c\
|
||||
intavltree.c\
|
||||
md5sum.c\
|
||||
mod.c\
|
||||
msgset.c\
|
||||
@ -202,11 +204,8 @@ MISCSRC=\
|
||||
conn.c \
|
||||
val.c \
|
||||
discovery.c\
|
||||
message.c\
|
||||
|
||||
|
||||
# intavltree.c\
|
||||
|
||||
# conn_q_wait_packet.c\
|
||||
# conn_init.c\
|
||||
# conn_create.c\
|
||||
|
77
src/cw/cfg.c
77
src/cw/cfg.c
@ -127,7 +127,6 @@ const char *cw_cfg_get_l(cw_Cfg_t ** cfg, const char * key, const char *def)
|
||||
int i;
|
||||
struct cw_Cfg_entry e, *r;
|
||||
for(i=0; cfg[i]!=NULL; i++){
|
||||
// cw_dbg(DBG_X,"GET_L IN: %p",cfg[i]);
|
||||
e.key = key;
|
||||
r = mavl_get(cfg[i], &e);
|
||||
if (r!=NULL)
|
||||
@ -457,6 +456,7 @@ int cw_cfg_read_from_file(FILE * f, cw_Cfg_t * cfg)
|
||||
return errs;
|
||||
}
|
||||
|
||||
|
||||
int cw_cfg_load(const char *filename, cw_Cfg_t * cfg)
|
||||
{
|
||||
int errs;
|
||||
@ -471,42 +471,6 @@ int cw_cfg_load(const char *filename, cw_Cfg_t * cfg)
|
||||
return errno;
|
||||
}
|
||||
|
||||
int cw_cfg_write_to_file(FILE *f, cw_Cfg_t * cfg)
|
||||
{
|
||||
mavliter_t it;
|
||||
struct cw_Cfg_entry *e;
|
||||
mavliter_init(&it, cfg);
|
||||
mavliter_foreach(&it) {
|
||||
int n;
|
||||
e = mavliter_get(&it);
|
||||
n=strlen(e->val);
|
||||
if (n>0)
|
||||
n-=1;
|
||||
|
||||
//printf("Write %s: \"%s\" - %d %d (%02x)\n",e->key,e->val,n,isspace(e->val[n]),e->val[n]);
|
||||
if(isspace(e->val[0]) || isspace(e->val[n]))
|
||||
fprintf(f,"%s: \"%s\"\n", e->key, e->val);
|
||||
else
|
||||
fprintf(f,"%s: %s\n", e->key, e->val);
|
||||
|
||||
//cw_dbg(dbglevel,"%s%s :%s: %s",prefix,data->key,type->get_type_name(data), value);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int cw_cfg_save(const char *filename, cw_Cfg_t *cfg)
|
||||
{
|
||||
int rc;
|
||||
FILE *f = fopen(filename, "wb");
|
||||
if (!f)
|
||||
return errno;
|
||||
rc = cw_cfg_write_to_file(f, cfg);
|
||||
fclose(f);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base)
|
||||
{
|
||||
@ -560,12 +524,10 @@ const char *cw_cfg_iter_next(struct cw_Cfg_iter *cfi, const char *key)
|
||||
}
|
||||
|
||||
|
||||
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, int def)
|
||||
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def)
|
||||
{
|
||||
struct cw_Val v;
|
||||
const char *s = cw_cfg_get(cfg,key,NULL);
|
||||
if (s==NULL)
|
||||
return def;
|
||||
const char *s = cw_cfg_get(cfg,key,def);
|
||||
CW_TYPE_BOOL->from_str(&v,s);
|
||||
return v.val.boolean;
|
||||
}
|
||||
@ -726,48 +688,19 @@ void cw_cfg_clear(cw_Cfg_t *cfg)
|
||||
int cw_cfg_base_exists(cw_Cfg_t * cfg, const char *key)
|
||||
{
|
||||
struct cw_Cfg_entry e, *result;
|
||||
//cw_dbg(DBG_X,"LOOX FOR: %s",key);
|
||||
|
||||
e.key=key;
|
||||
result = mavl_get_first(cfg,&e);
|
||||
if (result == NULL)
|
||||
return 0;
|
||||
//cw_dbg(DBG_X,"BASEXXX: %s",result->key);
|
||||
|
||||
if (strlen(result->key)<strlen(key))
|
||||
return 0;
|
||||
//cw_dbg(DBG_X,"BASEXXX1: %d",strlen(key));
|
||||
if (result->key[strlen(key)]!='/' && result->key[strlen(key)]!='.')
|
||||
return 0;
|
||||
//cw_dbg(DBG_X,"BASEXXX2: ");
|
||||
if (strncmp(result->key,key,strlen(key))==0)
|
||||
return 1;
|
||||
cw_dbg(DBG_X,"BASEXXX3: ");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cw_cfg_base_exists_l(cw_Cfg_t ** cfgs, const char *key)
|
||||
{
|
||||
int i;
|
||||
for(i=0; cfgs[i]; i++){
|
||||
if (cw_cfg_base_exists(cfgs[i],key))
|
||||
return 1;
|
||||
}
|
||||
cw_dbg(DBG_X,"NOX EXISIS: %s in %d",key,i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
cw_Val_t * cw_cfg_get_val_l(cw_Cfg_t ** cfgs, const char *key, const struct cw_Type *type)
|
||||
{
|
||||
const char *s;
|
||||
cw_Val_t * val;
|
||||
s = cw_cfg_get_l(cfgs,key,NULL);
|
||||
val = malloc(sizeof(cw_Val_t));
|
||||
if (val==NULL)
|
||||
return NULL;
|
||||
val->type=type;
|
||||
val->type->from_str(val,s);
|
||||
return val;
|
||||
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ const char * cw_cfg_get(cw_Cfg_t * cfg, const char *key, const char *def);
|
||||
const char *cw_cfg_iter_next(struct cw_Cfg_iter *cfi, const char *key);
|
||||
void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base);
|
||||
|
||||
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, int def);
|
||||
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def);
|
||||
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, uint16_t def);
|
||||
void cw_cfg_set_int(cw_Cfg_t * cfg, const char * key, int val);
|
||||
uint8_t cw_cfg_get_byte(cw_Cfg_t * cfg, char *key, uint8_t def);
|
||||
@ -44,10 +44,6 @@ void cw_cfg_destroy(cw_Cfg_t *cfg);
|
||||
void cw_cfg_clear(cw_Cfg_t *cfg);
|
||||
int cw_cfg_base_exists(cw_Cfg_t * cfg, const char *key);
|
||||
uint8_t cw_cfg_get_byte_l(cw_Cfg_t ** cfgs, char *key, uint8_t def);
|
||||
cw_Val_t * cw_cfg_get_val_l(cw_Cfg_t ** cfgs, const char *key, const struct cw_Type *type);
|
||||
int cw_cfg_base_exists_l(cw_Cfg_t ** cfgs, const char *key);
|
||||
int cw_cfg_save(const char *filename, cw_Cfg_t *cfg);
|
||||
|
||||
|
||||
|
||||
|
||||
|
186
src/cw/conn.c
186
src/cw/conn.c
@ -25,6 +25,148 @@
|
||||
#include "dtls.h"
|
||||
|
||||
|
||||
/**
|
||||
* Put a message to a buffer
|
||||
* This functions assumes, that a message header is
|
||||
* alread initilaized in buffer
|
||||
* Message alements are taken fom actiondef in #conn->action
|
||||
*/
|
||||
int cw_assemble_message(struct cw_Conn *conn, uint8_t * rawout)
|
||||
{
|
||||
char details[1024];
|
||||
uint8_t *msgptr,*dst;
|
||||
int type;
|
||||
struct cw_MsgData * msg;
|
||||
struct mlistelem * elem;
|
||||
int len,l;
|
||||
|
||||
/* rawout is already initialized, so we can get
|
||||
* msg type from buffer */
|
||||
msgptr = rawout + cw_get_hdr_msg_offset(rawout);
|
||||
type = cw_get_msg_type(msgptr);
|
||||
|
||||
/* look for message data */
|
||||
msg = cw_msgset_get_msgdata(conn->msgset,type);
|
||||
if (msg == NULL){
|
||||
cw_log(LOG_ERR,"Error: Can't create message of type %d (%s) - no definition found.",
|
||||
type, cw_strmsg(type));
|
||||
return CAPWAP_RESULT_MSG_UNRECOGNIZED;
|
||||
}
|
||||
|
||||
if (msg->preprocess){
|
||||
msg->preprocess(conn);
|
||||
}
|
||||
|
||||
cw_dbg(DBG_MSG_ASSEMBLY,"*** Assembling message of type %d (%s) ***",
|
||||
msg->type, msg->name);
|
||||
|
||||
dst = msgptr+8;
|
||||
len =0;
|
||||
mlist_foreach(elem,msg->elements_list){
|
||||
struct cw_ElemData * data;
|
||||
struct cw_ElemHandler * handler;
|
||||
struct cw_ElemHandlerParams params;
|
||||
|
||||
data = mlistelem_dataptr(elem);
|
||||
handler = cw_msgset_get_elemhandler(conn->msgset,data->proto,data->vendor,data->id);
|
||||
cw_dbg(DBG_MSG_ASSEMBLY," Add Elem: %d %d %d %s", data->proto, data->vendor, data->id, handler->name);
|
||||
if (handler==NULL){
|
||||
cw_log(LOG_ERR,"Can't put message element %d %d %d, no handler defined.",
|
||||
data->proto,data->vendor,data->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (handler->put == NULL){
|
||||
if (data->mand){
|
||||
cw_log(LOG_ERR,"Error: Can't add mandatory message element %d - %s, no put method defined",
|
||||
handler->id, handler->name);
|
||||
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
params.conn=conn;
|
||||
params.cfg=conn->remote_cfg;
|
||||
params.cfg_list[0]=params.cfg;
|
||||
params.cfg_list[1]=conn->local_cfg;
|
||||
params.cfg_list[2]=conn->global_cfg;
|
||||
params.cfg_list[3]=NULL;
|
||||
|
||||
|
||||
params.msgset=conn->msgset;
|
||||
|
||||
|
||||
|
||||
params.elemdata = data;
|
||||
params.msgdata=msg;
|
||||
params.debug_details=details;
|
||||
*details=0;
|
||||
|
||||
/* if (strcmp(handler->key,"cisco/ap-led-flash-config")==0){
|
||||
printf("flash config\n");
|
||||
cisco/ap-led-flash-config/flash-enable
|
||||
}*/
|
||||
|
||||
if (!data->mand){
|
||||
if (!cw_cfg_base_exists(params.cfg,handler->key)){
|
||||
cw_dbg(DBG_X,"nothing todo");
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
l = handler->put(handler,¶ms,dst+len);
|
||||
|
||||
|
||||
/* if(l>0)
|
||||
cw_dbg_elem(DBG_ELEM_OUT,conn,type,handler,dst+len,l);
|
||||
* if (strlen(details)){
|
||||
cw_dbg(DBG_ELEM_DETAIL," %s",params.debug_details);
|
||||
}
|
||||
*/ len += l;
|
||||
}
|
||||
|
||||
cw_set_msg_elems_len(msgptr, len);
|
||||
cw_dbg(DBG_MSG_ASSEMBLY,"*** Done assenmbling message of type %d (%s) ***",
|
||||
msg->type, msg->name);
|
||||
if (type & 1) {
|
||||
/* It's a request, so we have to set seqnum */
|
||||
int s = conn_get_next_seqnum(conn);
|
||||
cw_set_msg_seqnum(msgptr,s);
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
printf ("----------------------------------- redecode -----------------------------\n");
|
||||
uint8_t *elems_ptr;
|
||||
|
||||
int offset = cw_get_hdr_msg_offset(rawout);
|
||||
|
||||
uint8_t *msg_ptr = rawout + offset;
|
||||
int elems_len = cw_get_msg_elems_len(msg_ptr);
|
||||
elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
|
||||
cw_Cfg_t * cfg = cw_cfg_create();
|
||||
|
||||
struct cw_ElemHandlerParams params;
|
||||
|
||||
params.cfg=cfg;
|
||||
params.msgset=conn->msgset;
|
||||
params.msgdata=msg;
|
||||
|
||||
|
||||
cw_decode_elements( ¶ms, elems_ptr,elems_len);
|
||||
cw_cfg_destroy(cfg);
|
||||
|
||||
printf ("----------------------------------- end redecode -----------------------------\n");
|
||||
|
||||
}
|
||||
|
||||
return CAPWAP_RESULT_SUCCESS;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct msg_callback{
|
||||
int type; /**< message type */
|
||||
@ -57,11 +199,6 @@ void cw_conn_init(struct cw_Conn * conn)
|
||||
conn->process_message=process_message;
|
||||
|
||||
conn->msg_callbacks = mavl_create(msg_callback_cmp,NULL,sizeof(struct msg_callback));
|
||||
|
||||
conn->update_cfg = cw_cfg_create();
|
||||
cw_dbg(DBG_X,"Update CFG ist %p",conn->update_cfg);
|
||||
conn->remote_cfg = cw_cfg_create();
|
||||
conn->local_cfg = cw_cfg_create();
|
||||
}
|
||||
|
||||
int cw_conn_set_msg_cb(struct cw_Conn *conn, int type, cw_MsgCallbackFun fun)
|
||||
@ -241,7 +378,7 @@ int cw_send_response(struct cw_Conn *conn, uint8_t * rawmsg, int len)
|
||||
{
|
||||
int rc;
|
||||
cw_init_response(conn, rawmsg);
|
||||
rc = cw_compose_message(conn, conn->resp_buffer);
|
||||
rc = cw_assemble_message(conn, conn->resp_buffer);
|
||||
if (!cw_result_is_ok(rc))
|
||||
return 0;
|
||||
conn_send_msg(conn, conn->resp_buffer);
|
||||
@ -327,6 +464,8 @@ int cw_in_check_generic(struct cw_Conn *conn, struct cw_action_in *a, uint8_t *
|
||||
static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
struct sockaddr *from)
|
||||
{
|
||||
mavl_t mand_found;
|
||||
mlist_t unrecognized;
|
||||
struct cw_MsgData search;
|
||||
struct cw_MsgData *message;
|
||||
int result_code;
|
||||
@ -476,14 +615,16 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
|
||||
|
||||
|
||||
|
||||
mand_found = mavl_create_conststr();
|
||||
unrecognized = mlist_create(NULL, NULL, sizeof(uint8_t *));
|
||||
|
||||
|
||||
|
||||
|
||||
cw_dbg(DBG_MSG_PARSING, "*** Parsing message of type %d - (%s) ***",
|
||||
message->type, message->name);
|
||||
|
||||
memset(¶ms,0,sizeof(struct cw_ElemHandlerParams));
|
||||
|
||||
params.mand_found = mavl_create_conststr();
|
||||
params.unrecognized = mlist_create(NULL, NULL, sizeof(uint8_t *));
|
||||
|
||||
params.cfg = cw_cfg_create();
|
||||
params.cfg_list[0]=params.cfg;
|
||||
params.cfg_list[1]=conn->local_cfg;
|
||||
@ -492,6 +633,7 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
|
||||
params.from = from;
|
||||
params.msgdata = message;
|
||||
params.mand_found = mand_found;
|
||||
params.msgset=conn->msgset;
|
||||
params.conn = conn;
|
||||
|
||||
@ -500,14 +642,13 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
/* all message elements are processed, do now after processing
|
||||
by calling the "end" function for the message */
|
||||
|
||||
if (params.mand_found)
|
||||
cw_check_missing_mand(message, params.mand_found,conn->msgset->handlers_by_key);
|
||||
cw_check_missing_mand(message, mand_found);
|
||||
|
||||
cw_dbg(DBG_MSG_PARSING, "*** End parsing message of type %d (%s) ***",
|
||||
message->type, message->name);
|
||||
|
||||
if (params.mand_found)
|
||||
mavl_destroy(params.mand_found);
|
||||
|
||||
mavl_destroy(mand_found);
|
||||
|
||||
if (message->postprocess) {
|
||||
message->postprocess(¶ms,elems_ptr, elems_len);
|
||||
@ -518,10 +659,10 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
result_code = cb_fun(¶ms,elems_ptr, elems_len);
|
||||
}
|
||||
else{
|
||||
cw_cfg_clear(conn->update_cfg);
|
||||
cw_cfg_clear(params.cfg);
|
||||
}
|
||||
|
||||
// conn->remote_cfg=params.cfg;
|
||||
conn->remote_cfg=params.cfg;
|
||||
|
||||
/* if we've got a request message, we always have to send a response message */
|
||||
if (message->type & 1) {
|
||||
@ -531,7 +672,7 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
|
||||
cw_send_error_response(conn, rawmsg, result_code);
|
||||
} else if (result_code == 0) {
|
||||
cw_cfg_set_int(conn->update_cfg, "result-code",
|
||||
cw_cfg_set_int(params.cfg, "result-code",
|
||||
result_code);
|
||||
if (ui->next) {
|
||||
conn->capwap_prevstate = conn->capwap_state;
|
||||
@ -552,10 +693,9 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
*/
|
||||
}
|
||||
|
||||
if (params.unrecognized)
|
||||
mlist_destroy(params.unrecognized);
|
||||
mlist_destroy(unrecognized);
|
||||
cw_cfg_destroy(params.cfg);
|
||||
// conn->remote_cfg=NULL;
|
||||
conn->remote_cfg=NULL;
|
||||
|
||||
return result_code;
|
||||
|
||||
@ -815,8 +955,8 @@ void conn_destroy(struct cw_Conn * conn)
|
||||
if (conn->local_cfg)
|
||||
cw_cfg_destroy(conn->local_cfg);
|
||||
|
||||
if (conn->update_cfg)
|
||||
cw_cfg_destroy(conn->update_cfg);
|
||||
|
||||
|
||||
free(conn);
|
||||
}
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
|
||||
/*#include "mbag.h"*/
|
||||
|
||||
#include "intavltree.h"
|
||||
#include "bstr.h"
|
||||
#include "msgset.h"
|
||||
|
||||
@ -71,21 +72,11 @@ struct cw_Conn {
|
||||
int recv_timeout;
|
||||
|
||||
|
||||
cw_Cfg_t * global_cfg; /**< This should set the global cfg of the program
|
||||
which is using this conn object.
|
||||
Teh global_cfg has to be treated read-only. */
|
||||
|
||||
cw_Cfg_t * local_cfg; /**< local_cfg contains overrides for global_cfg
|
||||
wich are related to this conn object. */
|
||||
|
||||
mavl_t remote_cfg; /**< contains the configuration we now from the
|
||||
device this conn object ist connected to.
|
||||
Typically this is what we have got from discovery
|
||||
response or join response in WTP mode.
|
||||
And in AC mode this contains date receive from
|
||||
configuration status request. */
|
||||
|
||||
mavl_t remote_cfg;
|
||||
// mavl_t default_cfg;
|
||||
mavl_t update_cfg;
|
||||
mavl_t local_cfg;
|
||||
mavl_t global_cfg;
|
||||
|
||||
bstr16_t session_id;
|
||||
|
||||
@ -99,6 +90,9 @@ struct cw_Conn {
|
||||
uint8_t wbid;
|
||||
|
||||
|
||||
/** Counter for mandatory message elements */
|
||||
/* struct avltree *mand;*/
|
||||
|
||||
|
||||
/** Actionsdefs - this defines the possible actions for
|
||||
this conn object, so in the end this is the specification
|
||||
@ -125,6 +119,10 @@ struct cw_Conn {
|
||||
int last_seqnum_received;
|
||||
int last_message_id_received;
|
||||
|
||||
|
||||
// struct cwmsg req_msg;
|
||||
// struct cwmsg resp_msg;
|
||||
|
||||
/** Buffer for outgoing request messages */
|
||||
uint8_t req_buffer[CONN_MAX_MSG_LENGTH];
|
||||
|
||||
@ -143,10 +141,17 @@ struct cw_Conn {
|
||||
int (*recv_packet) (struct cw_Conn*, uint8_t *, int);
|
||||
int (*recv_packet_peek) (struct cw_Conn*, uint8_t *, int);
|
||||
int (*send_packet) (struct cw_Conn*, const uint8_t *, int);
|
||||
/*
|
||||
// int (*recv_data_packet) (struct cw_Conn*, uint8_t *,int);
|
||||
// int (*send_data_packet) (struct cw_Conn*, const uint8_t *, int);
|
||||
*/
|
||||
|
||||
int (*readfrom) (struct cw_Conn*, uint8_t *, int, struct sockaddr_storage *);
|
||||
int (*read) (struct cw_Conn*, uint8_t *, int);
|
||||
int (*write) (struct cw_Conn*, const uint8_t *, int);
|
||||
|
||||
/*
|
||||
// int (*write_data) (struct cw_Conn*, const uint8_t *, int);
|
||||
*/
|
||||
/* optional packet queue */
|
||||
uint8_t **q;
|
||||
int qsize;
|
||||
|
74
src/cw/conn_init.c
Normal file
74
src/cw/conn_init.c
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
This file is part of libcapwap.
|
||||
|
||||
libcapwap is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
libcapwap is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief conn_init
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#include "conn.h"
|
||||
#include "capwap.h"
|
||||
#include "cw.h"
|
||||
|
||||
/*
|
||||
static int write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
|
||||
{
|
||||
if (handler->vendor)
|
||||
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
|
||||
|
||||
return len + cw_put_elem_hdr(dst, handler->id, len);
|
||||
}
|
||||
|
||||
static int header_len(struct cw_ElemHandler * handler)
|
||||
{
|
||||
return handler->vendor ? 10 : 4;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* Basic initialization of a conn object
|
||||
* @param conn conn object to initialize
|
||||
*/
|
||||
void conn_init(struct cw_Conn * conn)
|
||||
{
|
||||
memset(conn,0,sizeof(struct cw_Conn ));
|
||||
conn->retransmit_interval=CAPWAP_RETRANSMIT_INTERVAL;
|
||||
conn->max_retransmit=CAPWAP_MAX_RETRANSMIT;
|
||||
conn->wait_dtls=CAPWAP_WAIT_DTLS;
|
||||
conn->wait_join=CAPWAP_WAIT_JOIN;
|
||||
conn->mtu_discovery=1;
|
||||
// conn->capwap_mode = 0;
|
||||
conn->strict_capwap=1;
|
||||
|
||||
|
||||
|
||||
conn->process_packet=conn_process_packet;
|
||||
conn->process_message=process_message;
|
||||
/*
|
||||
conn->write_header = write_header;
|
||||
conn->header_len = header_len;
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
40
src/cw/conn_process_packet.c
Normal file
40
src/cw/conn_process_packet.c
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
This file is part of libcapwap.
|
||||
|
||||
libcapwap is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
libcapwap is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "cw.h"
|
||||
#include "dbg.h"
|
||||
|
||||
#include "log.h"
|
||||
#include "cw_util.h"
|
||||
|
||||
#include "conn.h"
|
||||
#include "sock.h"
|
||||
|
||||
/*#include "stravltree.h"*/
|
||||
#include "mod.h"
|
||||
#include "msgset.h"
|
||||
|
||||
#include "val.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
34
src/cw/cw.c
34
src/cw/cw.c
@ -41,8 +41,6 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
|
||||
|
||||
int start, len, l;
|
||||
|
||||
// cw_dbg(DBG_X,"cw_out_generic (%s)%s",((struct cw_Type*)handler->type)->name,handler->key);
|
||||
|
||||
// cw_dbg(DBG_X,"Generic out!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
|
||||
// cw_cfg_dump(params->cfg);
|
||||
// cw_dbg(DBG_X,"Generic out!!!!!!!!!!!!!!!!!!!!!!!!!!!! ENDDUMP");
|
||||
@ -50,7 +48,7 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
|
||||
start = params->msgset->header_len(handler);
|
||||
len = ((const cw_Type_t*)(handler->type))->
|
||||
write(params->cfg_list,handler->key,dst+start,handler->param);
|
||||
// cw_dbg(DBG_X, "Type result is %d",len);
|
||||
|
||||
|
||||
if (len == -1) {
|
||||
const char *vendor="";
|
||||
@ -71,7 +69,6 @@ int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams
|
||||
, cw_strmsg(a->msg_id),a->item_id);
|
||||
*/
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -117,20 +114,18 @@ int cw_out_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerP
|
||||
int radios;
|
||||
len =0;
|
||||
|
||||
radios = cw_cfg_get_byte_l(params->cfg_list,"wtp-descriptor/max-radios",0);
|
||||
radios = cw_cfg_get_byte(params->cfg,"wtp-descriptor/max-radios",0);
|
||||
for(i=0;i<radios;i++){
|
||||
l=0;
|
||||
|
||||
type = (struct cw_Type*)handler->type;
|
||||
start = params->msgset->header_len(handler)+len;
|
||||
|
||||
sprintf(key,"radio.%d/%s",i,handler->key);
|
||||
// cw_dbg(DBG_X,"KEY: %s",key);
|
||||
cw_dbg(DBG_X,"KEY: %s",key);
|
||||
|
||||
l = type->write(params->cfg_list, key,dst+start+1,handler->param);
|
||||
if (l==-1)
|
||||
continue;
|
||||
|
||||
l += cw_put_byte(dst+start,i);
|
||||
l += cw_put_byte(dst+start+l,i);
|
||||
l += type->write(params->cfg_list, key,dst+start+l,handler->param);
|
||||
|
||||
l = params->msgset->write_header(handler,dst+len,l);
|
||||
len+=l;
|
||||
@ -139,20 +134,3 @@ int cw_out_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerP
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
int cw_write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
|
||||
{
|
||||
if (handler->vendor)
|
||||
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
|
||||
|
||||
return len + cw_put_elem_hdr(dst, handler->id, len);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cw_header_len(struct cw_ElemHandler * handler)
|
||||
{
|
||||
return handler->vendor ? 10 : 4;
|
||||
}
|
||||
|
||||
|
||||
|
@ -348,8 +348,7 @@ struct cw_DescriptorSubelemDef {
|
||||
|
||||
|
||||
|
||||
//int cw_check_missing_mand(struct cw_MsgData *msgdata, mavl_t keys );
|
||||
int cw_check_missing_mand(struct cw_MsgData *msgdata, mavl_t keys, mavl_t handlers_by_key );
|
||||
int cw_check_missing_mand(struct cw_MsgData *msgdata, mavl_t keys );
|
||||
|
||||
|
||||
|
||||
@ -366,7 +365,7 @@ int cw_read_wtp_descriptor(mavl_t mbag, struct cw_Conn *conn,
|
||||
struct cw_ElemHandler *eh, uint8_t * data, int len,
|
||||
struct cw_DescriptorSubelemDef *allowed);
|
||||
|
||||
int cw_write_descriptor_subelem (uint8_t *dst, cw_Cfg_t ** cfg_list,
|
||||
int cw_write_descriptor_subelem (uint8_t *dst, mavl_t ktvstore,
|
||||
int subelem_id, const char * parent_key);
|
||||
|
||||
int cw_write_radio_element(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params, int idx,
|
||||
@ -551,9 +550,6 @@ int cw_stricmp(char const *a, char const *b);
|
||||
int cw_write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len);
|
||||
int cw_header_len(struct cw_ElemHandler * handler);
|
||||
|
||||
int cw_compose_message(struct cw_Conn *conn, uint8_t * rawout);
|
||||
|
||||
|
||||
/**
|
||||
*@}
|
||||
*/
|
||||
|
@ -3,7 +3,7 @@
|
||||
#include "dbg.h"
|
||||
#include "log.h"
|
||||
|
||||
int cw_check_missing_mand(struct cw_MsgData *msgdata, mavl_t keys, mavl_t handlers_by_key )
|
||||
int cw_check_missing_mand(struct cw_MsgData *msgdata, mavl_t keys )
|
||||
{
|
||||
mlistelem_t * elem;
|
||||
char *mandkey, *result;
|
||||
@ -26,22 +26,7 @@ int cw_check_missing_mand(struct cw_MsgData *msgdata, mavl_t keys, mavl_t handle
|
||||
}
|
||||
|
||||
mlist_foreach(elem,missing){
|
||||
const char * str;
|
||||
struct cw_ElemHandler search, *result;
|
||||
|
||||
str = mlistelem_get_str(elem);
|
||||
|
||||
search.key = str;
|
||||
result = mavl_get(handlers_by_key,&search);
|
||||
if (result == NULL){
|
||||
cw_log(LOG_ERR,"Can't find handler for for key %s",str);
|
||||
}
|
||||
else {
|
||||
cw_dbg(DBG_RFC,"Missing mandatory message element: %s: %d - %s",
|
||||
str,result->id, result->name);
|
||||
}
|
||||
|
||||
|
||||
cw_dbg(DBG_RFC," Missing mandatory message element: %s", mlistelem_get_str(elem));
|
||||
}
|
||||
|
||||
count = missing->count;
|
||||
|
127
src/cw/cw_decode_msg.c
Normal file
127
src/cw/cw_decode_msg.c
Normal file
@ -0,0 +1,127 @@
|
||||
#include "cw.h"
|
||||
#include "dbg.h"
|
||||
#include "log.h"
|
||||
#include "msgset.h"
|
||||
|
||||
int cw_decode_element(struct cw_ElemHandlerParams *params, int proto,
|
||||
int vendor, int elem_id, uint8_t * data, int len)
|
||||
{
|
||||
|
||||
struct cw_ElemHandler *handler;
|
||||
struct cw_ElemData *elem_data, elem_data_search;
|
||||
int rc;
|
||||
|
||||
//params->elem = NULL;
|
||||
|
||||
/* try to retrieve a handler for this message element */
|
||||
handler =
|
||||
cw_msgset_get_elemhandler(params->msgset, proto, vendor,
|
||||
elem_id);
|
||||
if (!handler) {
|
||||
|
||||
cw_dbg(DBG_ELEM_ERR,
|
||||
"Unrecognized message element: %d, ignoring", elem_id);
|
||||
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
|
||||
}
|
||||
|
||||
/* check if this message element in the current message allowed */
|
||||
elem_data_search.id = elem_id;
|
||||
elem_data_search.proto = proto;
|
||||
elem_data_search.vendor = vendor;
|
||||
elem_data = mavl_get(params->msgdata->elements_tree, &elem_data_search);
|
||||
if (!elem_data) {
|
||||
cw_dbg(DBG_ELEM_ERR, "Element %d - %s, not allowed here",
|
||||
elem_id, handler->name);
|
||||
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
|
||||
}
|
||||
|
||||
/* check the length of the message */
|
||||
if (len < handler->min_len) {
|
||||
cw_dbg(DBG_ELEM_ERR,
|
||||
"%d (%s) message element too short, len=%d, min len=%d",
|
||||
handler->id, handler->name, len, handler->min_len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if (elem_data->mand) {
|
||||
mavl_add_str(params->mand_found, handler->key);
|
||||
}
|
||||
|
||||
|
||||
if (len > handler->max_len && handler->max_len) {
|
||||
cw_dbg(DBG_ELEM_ERR,
|
||||
"%d (%s) message element too big, len=%d, max len=%d",
|
||||
handler->id, handler->name, len, handler->max_len);
|
||||
/* TODO XXX truncate the element instead of return */
|
||||
return -1;
|
||||
}
|
||||
|
||||
cw_dbg_elem(DBG_ELEM_IN, NULL, params->msgdata->type, handler,
|
||||
data, len);
|
||||
|
||||
if (handler->get == NULL) {
|
||||
cw_log(LOG_ERR, "No get method defined for %d %s", handler->id,
|
||||
handler->name);
|
||||
return CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT;
|
||||
}
|
||||
|
||||
rc = handler->get(handler, params, data, len);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
int cw_decode_elements(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
|
||||
{
|
||||
uint8_t *elem;
|
||||
mavl_t mand_found;
|
||||
mlist_t unrecognized;
|
||||
|
||||
mand_found = mavl_create_conststr();
|
||||
unrecognized = mlist_create(NULL,NULL,sizeof(uint8_t*));
|
||||
|
||||
cw_foreach_elem(elem, elems_ptr, elems_len) {
|
||||
int rc;
|
||||
|
||||
int elem_len, elem_id, max_len;
|
||||
uint8_t * elem_data;
|
||||
|
||||
|
||||
elem_len = cw_get_elem_len(elem);
|
||||
elem_data=cw_get_elem_data(elem);
|
||||
elem_id = cw_get_elem_id(elem);
|
||||
|
||||
max_len=elems_len-(elem_data-elems_ptr);
|
||||
if (elem_len > max_len){
|
||||
cw_dbg(DBG_RFC,
|
||||
"Messag element claims size of %d bytes, but only %d bytes are left in the payload, truncating.",
|
||||
elem_len,max_len-4);
|
||||
}
|
||||
|
||||
|
||||
|
||||
params->from=NULL; /*from;*/
|
||||
params->mand_found=mand_found;
|
||||
|
||||
rc = cw_decode_element(params,0,0,elem_id,elem_data,elem_len);
|
||||
|
||||
|
||||
if (cw_result_is_ok(rc))
|
||||
continue;
|
||||
|
||||
if (rc == CAPWAP_RESULT_UNRECOGNIZED_MESSAGE_ELEMENT){
|
||||
mlist_append(unrecognized,&elem);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rc < 0 ){
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
mavl_destroy(mand_found);
|
||||
mlist_destroy(unrecognized);
|
||||
return 0;
|
||||
}
|
43
src/cw/cw_in_check_disc_req.c
Normal file
43
src/cw/cw_in_check_disc_req.c
Normal file
@ -0,0 +1,43 @@
|
||||
|
||||
#include "capwap.h"
|
||||
|
||||
|
||||
#include "intavltree.h"
|
||||
#include "log.h"
|
||||
#include "dbg.h"
|
||||
#include "sock.h"
|
||||
|
||||
int cw_in_check_disc_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
|
||||
int len,struct sockaddr *from)
|
||||
{
|
||||
/*
|
||||
char sock_buf[SOCK_ADDR_BUFSIZE];
|
||||
|
||||
cw_action_in_t *mlist[120];
|
||||
int n = cw_check_missing_mand(mlist, conn, a);
|
||||
|
||||
conn->capwap_state = CW_STATE_NONE;
|
||||
|
||||
|
||||
if (n && conn->strict_capwap) {
|
||||
cw_dbg_missing_mand(DBG_MSG_ERR, conn, mlist, n, a);
|
||||
// if mandatory elements are missing, in strict
|
||||
// mode send no discovery response
|
||||
cw_dbg(DBG_MSG_ERR,
|
||||
"Ignoring Discovery Request from %s - missing mandatory elements.",
|
||||
sock_addr2str(from,sock_buf));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( n ) {
|
||||
// put a warning here
|
||||
cw_dbg_missing_mand(DBG_RFC, conn, mlist, n, a);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ok, send response
|
||||
conn->capwap_state = CAPWAP_STATE_JOIN;
|
||||
*/
|
||||
return 0;
|
||||
}
|
44
src/cw/cw_in_check_join_req.c
Normal file
44
src/cw/cw_in_check_join_req.c
Normal file
@ -0,0 +1,44 @@
|
||||
|
||||
#include "capwap.h"
|
||||
#include "intavltree.h"
|
||||
#include "dbg.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "format.h"
|
||||
#include "connlist.h"
|
||||
|
||||
int cw_in_check_join_req(struct conn *conn, struct cw_action_in *a, uint8_t * data,
|
||||
int len,struct sockaddr *from)
|
||||
{
|
||||
/*
|
||||
cw_action_in_t * mlist[60];
|
||||
|
||||
//Check for mandatory elements
|
||||
int n = cw_check_missing_mand(mlist,conn,a);
|
||||
if (n) {
|
||||
if ( conn->strict_capwap ){
|
||||
cw_dbg_missing_mand(DBG_MSG_ERR,conn,mlist,n,a);
|
||||
conn->capwap_state=CAPWAP_STATE_JOIN;
|
||||
return CW_RESULT_MISSING_MAND_ELEM;
|
||||
}
|
||||
cw_dbg_missing_mand(DBG_RFC,conn,mlist,n,a);
|
||||
}
|
||||
|
||||
connlist_lock(conn->connlist);
|
||||
struct conn *cc = connlist_get_by_session_id(conn->connlist,conn);
|
||||
if (!cc){
|
||||
connlist_add_by_session_id(conn->connlist,conn);
|
||||
}
|
||||
connlist_unlock(conn->connlist);
|
||||
if (cc){
|
||||
cw_dbg(DBG_ELEM_ERR,"Session already in use %s",format_bin2hex(conn->session_id,16));
|
||||
conn->capwap_state=CAPWAP_STATE_JOIN;
|
||||
return CW_RESULT_JOIN_FAILURE_SESSION_ALREADY_IN_USE;
|
||||
}
|
||||
|
||||
// set result code to ok and change to configure state
|
||||
mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);
|
||||
conn->capwap_state = CW_STATE_CONFIGURE;
|
||||
*/
|
||||
return 0;
|
||||
}
|
47
src/cw/cw_in_check_join_resp.c
Normal file
47
src/cw/cw_in_check_join_resp.c
Normal file
@ -0,0 +1,47 @@
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "capwap.h"
|
||||
#include "intavltree.h"
|
||||
#include "dbg.h"
|
||||
#include "log.h"
|
||||
|
||||
|
||||
int cw_in_check_join_resp(struct conn *conn, struct cw_action_in *a, uint8_t * data,
|
||||
int len,struct sockaddr *from)
|
||||
{
|
||||
/*
|
||||
cw_action_in_t * mlist[60];
|
||||
|
||||
mbag_item_t * jresult = mbag_get(conn->incomming,CW_ITEM_RESULT_CODE);
|
||||
if (jresult ) {
|
||||
if (!cw_result_is_ok(jresult->u2.dword)){
|
||||
return jresult->u2.dword;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Check for mandatory elements
|
||||
int n = cw_check_missing_mand(mlist,conn,a);
|
||||
if (n && conn->strict_capwap) {
|
||||
cw_dbg_missing_mand(DBG_MSG_ERR,conn,mlist,n,a);
|
||||
conn->capwap_state=CAPWAP_STATE_JOIN;
|
||||
errno=EAGAIN;
|
||||
return -1; //CW_RESULT_MISSING_MAND_ELEM;
|
||||
}
|
||||
if (n){
|
||||
cw_dbg_missing_mand(DBG_RFC,conn,mlist,n,a);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if ( jresult ) {
|
||||
return jresult->u2.dword;
|
||||
}
|
||||
|
||||
// set result code to ok and change to configure state
|
||||
// mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);
|
||||
*/
|
||||
return 0;
|
||||
}
|
@ -1,18 +1,17 @@
|
||||
#include "cw.h"
|
||||
#include"dbg.h"
|
||||
#include "cfg.h"
|
||||
|
||||
|
||||
int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||
, uint8_t * dst)
|
||||
{
|
||||
// cw_dbg(DBG_X,"Fix: cw_out_generic_indexed_enum %s",handler->key);
|
||||
// stop();
|
||||
|
||||
cw_dbg(DBG_X,"Fix: cw_out_generic_indexed_enum");
|
||||
stop();
|
||||
|
||||
/*
|
||||
char key[CW_CFG_MAX_KEY_LEN];
|
||||
int i;
|
||||
// cw_Val_t * result;
|
||||
cw_Val_t * result;
|
||||
int len,start;
|
||||
uint8_t * ob;
|
||||
const cw_ValIndexed_t *ie;
|
||||
@ -27,42 +26,34 @@ int cw_out_generic_indexed_enum(struct cw_ElemHandler * handler, struct cw_ElemH
|
||||
e = ie->type;
|
||||
|
||||
for(i=0; e[i].name!=NULL; i++) {
|
||||
int b;
|
||||
sprintf(key,"%s/%s",handler->key,e[i].name);
|
||||
|
||||
cw_dbg(DBG_X,"Her is the Key: %s %s\n",key,e[i].name);
|
||||
//printf("Her is the Key: %s - %s\n",key, );
|
||||
|
||||
b = cw_cfg_base_exists_l(params->cfg_list,handler->key);
|
||||
if (!b){
|
||||
stop();
|
||||
result = cw_ktv_base_exists(params->cfg,key);
|
||||
if (result==NULL)
|
||||
continue;
|
||||
}
|
||||
start = params->msgset->header_len(handler);
|
||||
len = 0;
|
||||
if (ie->idxpos==0)
|
||||
len = 1;
|
||||
|
||||
if (e[i].fun_out==NULL){
|
||||
stop();
|
||||
// result =
|
||||
// len += result->type->put(result,ob+start+len);
|
||||
}
|
||||
else{
|
||||
len += ((cw_Type_t*)e[i].type)->write(params->cfg_list,key,ob+start+len,e[i].param);
|
||||
// len += cw_ktv_write_struct(params->cfg,
|
||||
// NULL,e[i].type,key,ob+start+len);
|
||||
}
|
||||
if (e[i].fun_out==NULL)
|
||||
len += result->type->put(result,ob+start+len);
|
||||
else
|
||||
len += cw_ktv_write_struct(params->cfg,
|
||||
NULL,e[i].type,key,ob+start+len);
|
||||
|
||||
cw_set_byte(ob+start+ie->idxpos,e[i].value);
|
||||
if (ie->idxpos==len)
|
||||
len++;
|
||||
|
||||
ob += params->msgset->write_header(handler,ob,len);
|
||||
// cw_val_destroy(result);
|
||||
|
||||
}
|
||||
|
||||
return ob-dst;
|
||||
|
||||
*/
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ int cw_read_ac_descriptor(mavl_t store,
|
||||
{
|
||||
|
||||
CW_TYPE_STRUCT->read(params->cfg,eh->key,data,len,acstatus);
|
||||
// cw_ktv_read_struct(params->remote_cfg,acstatus,eh->key,data,len);
|
||||
|
||||
if (!allowed)
|
||||
allowed=allowed_default;
|
||||
|
@ -39,12 +39,10 @@ int cw_read_wtp_descriptor(mavl_t cfg, struct cw_Conn *conn,
|
||||
}
|
||||
|
||||
sprintf(key,"%s/%s",eh->key, "max-radios");
|
||||
// cw_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data,1);
|
||||
CW_TYPE_BYTE->read(cfg,key,data,1,eh->param);
|
||||
cw_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data,1);
|
||||
|
||||
sprintf(key,"%s/%s",eh->key, CW_SKEY_RADIOS_IN_USE);
|
||||
// cw_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data+1,1);
|
||||
CW_TYPE_BYTE->read(cfg,key,data,1,eh->param);
|
||||
cw_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data+1,1);
|
||||
|
||||
|
||||
|
||||
|
@ -21,7 +21,6 @@
|
||||
#include "format.h"
|
||||
#include "cw.h"
|
||||
#include "val.h"
|
||||
#include "dbg.h"
|
||||
|
||||
|
||||
static void del ( struct cw_Val * data )
|
||||
|
@ -105,10 +105,6 @@ static int bread(cw_Cfg_t *cfg, const char * key, const uint8_t *src, int len, c
|
||||
return l;
|
||||
}
|
||||
|
||||
static int bwrite(cw_Cfg_t ** cfgs, const char *key, uint8_t *dst, const void * param)
|
||||
{
|
||||
return cw_generic_write_l(cfgs,CW_TYPE_STR,key,dst,param);
|
||||
}
|
||||
|
||||
|
||||
const struct cw_Type cw_type_str = {
|
||||
@ -123,8 +119,6 @@ const struct cw_Type cw_type_str = {
|
||||
get_type_name, /* get_type_name */
|
||||
NULL,
|
||||
bread,
|
||||
bwrite,
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
@ -115,7 +115,7 @@ static int write_struct(cw_Cfg_t ** cfgs, const cw_ValStruct_t * stru, const ch
|
||||
else{
|
||||
struct cw_Type * type;
|
||||
type = (struct cw_Type *)stru[i].type;
|
||||
wrlen = type->write(cfgs,key,dst+pos,stru[i].valguard);
|
||||
wrlen = type->write(cfgs,stru[i].key,dst+pos,stru[i].valguard);
|
||||
|
||||
|
||||
/* result->valguard=stru[i].valguard;
|
||||
@ -142,6 +142,7 @@ static int bwrite(cw_Cfg_t **cfgs, const char *key, uint8_t *dst, const void *
|
||||
{
|
||||
return write_struct(cfgs,param,key,dst);
|
||||
|
||||
cw_dbg(DBG_X,"Key: %s",key);
|
||||
stop();
|
||||
|
||||
/*
|
||||
|
@ -5,23 +5,22 @@
|
||||
#include "dbg.h"
|
||||
#include "cfg.h"
|
||||
|
||||
int cw_write_descriptor_subelem (uint8_t *dst, cw_Cfg_t ** cfg_list,
|
||||
int cw_write_descriptor_subelem (uint8_t *dst, cw_Cfg_t * cfg,
|
||||
int subelem_id, const char * parent_key )
|
||||
{
|
||||
char key[256];
|
||||
uint32_t vendor;
|
||||
//bstr16_t version;
|
||||
bstr16_t version;
|
||||
const char *vendor_s;
|
||||
|
||||
uint8_t *d;
|
||||
|
||||
|
||||
/* d += cw_put_dword(d, bstrv_get_vendor_id(v));
|
||||
d += cw_put_dword(d, (subelem_id << 16) | bstrv_len(v));
|
||||
d += cw_put_data(d, bstrv_data(v), bstrv_len(v));
|
||||
*/
|
||||
sprintf (key, "%s/%s", parent_key, CW_SKEY_VENDOR);
|
||||
vendor_s = cw_cfg_get_l (cfg_list, key, NULL);
|
||||
vendor_s = cw_cfg_get (cfg, key, NULL);
|
||||
|
||||
if (vendor_s == NULL) {
|
||||
cw_log (LOG_ERR, "Can't put subelem %s, no value of type Dword found.", key);
|
||||
@ -30,15 +29,10 @@ int cw_write_descriptor_subelem (uint8_t *dst, cw_Cfg_t ** cfg_list,
|
||||
|
||||
vendor = atoi(vendor_s);
|
||||
|
||||
|
||||
|
||||
sprintf (key, "%s/%s", parent_key, CW_SKEY_VERSION);
|
||||
cw_Val_t * val = cw_cfg_get_val_l(cfg_list, key, CW_TYPE_BSTR16);
|
||||
version = cw_cfg_get_bstr16 (cfg, key, NULL);
|
||||
|
||||
//version = cw_cfg_get_bstr16 (cfg, key, NULL);
|
||||
|
||||
|
||||
if (val == NULL) {
|
||||
if (version == NULL) {
|
||||
cw_log (LOG_ERR, "Can't put subelem %s, no value of type Bstr16 found.", key);
|
||||
return 0;
|
||||
}
|
||||
@ -50,13 +44,10 @@ int cw_write_descriptor_subelem (uint8_t *dst, cw_Cfg_t ** cfg_list,
|
||||
|
||||
/* put version */
|
||||
|
||||
d += cw_put_dword (d, (subelem_id << 16) | val->type->len(val));
|
||||
// d += cw_put_bstr16(d, version);
|
||||
d += val->type->put(val,d);
|
||||
d += cw_put_dword (d, (subelem_id << 16) | bstr16_len(version));
|
||||
d += cw_put_bstr16(d, version);
|
||||
|
||||
cw_val_destroy(val);
|
||||
|
||||
// free(version);
|
||||
free(version);
|
||||
|
||||
return d-dst;
|
||||
}
|
||||
|
20
src/cw/cw_write_header.c
Normal file
20
src/cw/cw_write_header.c
Normal file
@ -0,0 +1,20 @@
|
||||
#include "conn.h"
|
||||
#include "msgset.h"
|
||||
#include "cw.h"
|
||||
|
||||
int cw_write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
|
||||
{
|
||||
if (handler->vendor)
|
||||
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
|
||||
|
||||
return len + cw_put_elem_hdr(dst, handler->id, len);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cw_header_len(struct cw_ElemHandler * handler)
|
||||
{
|
||||
return handler->vendor ? 10 : 4;
|
||||
}
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
#include "cw.h"
|
||||
#include "dbg.h"
|
||||
#include "log.h"
|
||||
|
||||
|
||||
|
||||
int cw_write_radio_element(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params, int idx
|
||||
, uint8_t * dst)
|
||||
{
|
||||
stop();
|
||||
return 0;
|
||||
|
||||
char key[CW_CFG_MAX_KEY_LEN];
|
||||
cw_Val_t *elem, search;
|
||||
@ -16,58 +16,32 @@ int cw_write_radio_element(struct cw_ElemHandler * handler, struct cw_ElemHandle
|
||||
len =0;
|
||||
sprintf(key,"radio.%d/%s",idx,handler->key);
|
||||
|
||||
// printf("Looking for readio key: %s\n",key);
|
||||
printf("Looking for readio key: %s\n",key);
|
||||
|
||||
// search.key=key;
|
||||
// elem = mavl_get(params->cfg, &search);
|
||||
// elem = cw_cfg_get_val_l(params->cfg_list, key, handler->type);
|
||||
search.key=key;
|
||||
elem = mavl_get(params->cfg, &search);
|
||||
|
||||
|
||||
// if (elem==NULL){
|
||||
// printf("Nothing found\n");
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
/* Size for msg elem header depends on
|
||||
vendor specific payload */
|
||||
// d = handler->vendor ? dst+10 : dst+4;
|
||||
d = dst + params->msgset->header_len(handler);
|
||||
|
||||
/* put radio id */
|
||||
|
||||
len = cw_generic_write_l(params->cfg_list,((const cw_Type_t*)(handler->type)),
|
||||
key, d, handler->param);
|
||||
if (len==-1){
|
||||
const char *vendor="";
|
||||
if ( handler->vendor ) {
|
||||
vendor=cw_strvendor(handler->vendor);
|
||||
}
|
||||
if ( params->elemdata->mand) {
|
||||
cw_log(LOG_ERR,
|
||||
"Can't put mandatory element %s %d-(%s) into %s. No value for '%s' found.",
|
||||
vendor, handler->id, handler->name, params->msgdata->name
|
||||
, handler->key
|
||||
);
|
||||
}
|
||||
if (elem==NULL){
|
||||
printf("Nothing found\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Size for msg elem header depends on
|
||||
vendor specific payload */
|
||||
d = handler->vendor ? dst+10 : dst+4;
|
||||
|
||||
/* put radio id */
|
||||
|
||||
printf("Putting put byte index: %d\n",idx);
|
||||
|
||||
len += cw_put_byte(d+len,idx);
|
||||
|
||||
// len += ((const cw_Type_t*)(handler->type))->put(elem,d+len);
|
||||
len += ((const cw_Type_t*)(handler->type))->put(elem,d+len);
|
||||
/* l = len + cw_put_elem_hdr(dst, handler->id, len);*/
|
||||
|
||||
return params->msgset->write_header(handler,dst,len);
|
||||
|
||||
/*
|
||||
if (handler->vendor)
|
||||
return len + cw_put_elem_vendor_hdr(dst, handler->vendor, handler->id, len);
|
||||
|
||||
return len + cw_put_elem_hdr(dst, handler->id, len);*/
|
||||
|
||||
return len + cw_put_elem_hdr(dst, handler->id, len);
|
||||
}
|
||||
|
||||
|
@ -104,6 +104,12 @@ void cw_discovery_results_add(struct cw_DiscoveryResults *dis,
|
||||
|
||||
mavl_insert(dis->list,&e,NULL);
|
||||
|
||||
/* cw_ktv_add(dis->prio_ip, key, CW_TYPE_SYSPTR, NULL, (uint8_t *) (&ipval),
|
||||
sizeof(ipval));
|
||||
cw_ktv_add(dis->prio_ac, key, CW_TYPE_SYSPTR, NULL, (uint8_t *)(&remote_cfg),
|
||||
sizeof(remote_cfg)); */
|
||||
|
||||
// cw_dbg(DBG_X, "KEY: %s: %s", key, ipval);
|
||||
|
||||
} while (i < 255);
|
||||
dis->nr++;
|
||||
|
35
src/cw/intavltree.c
Normal file
35
src/cw/intavltree.c
Normal file
@ -0,0 +1,35 @@
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "intavltree.h"
|
||||
|
||||
|
||||
static int cmp(const void *v1,const void*v2)
|
||||
{
|
||||
return *((int*)v1) - *((int*)v2);
|
||||
}
|
||||
|
||||
static void del(void* d)
|
||||
{
|
||||
free (d);
|
||||
return;
|
||||
}
|
||||
|
||||
struct mavl * intavltree_create()
|
||||
{
|
||||
return mavl_create(cmp,del,100);
|
||||
}
|
||||
|
||||
int * intavltree_add(struct mavl * t, int val)
|
||||
{
|
||||
int *v = mavl_get(t,&val);
|
||||
if (v)
|
||||
return v;
|
||||
|
||||
v = malloc(sizeof(int));
|
||||
if (!v)
|
||||
return NULL;
|
||||
*v=val;
|
||||
return mavl_insert(t,v,NULL);
|
||||
}
|
15
src/cw/intavltree.h
Normal file
15
src/cw/intavltree.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef __INTAVLTREE_H
|
||||
#define __INTAVLTREE_H
|
||||
|
||||
#include <mavl.h>
|
||||
|
||||
extern struct mavl * intavltree_create();
|
||||
typedef struct mavl * intavltree_t;
|
||||
int * intavltree_add(struct mavl * t, int val);
|
||||
|
||||
#define intavltree_destroy(t) mavl_destroy(t)
|
||||
#define intavltree_foreach_asc(t,f,p) mavl_foreach_asc(t,f,p)
|
||||
#define intavltree_foreach_desc(t,f,p) mavl_foreach_desc(t,f,p)
|
||||
|
||||
|
||||
#endif
|
@ -30,7 +30,6 @@ struct cw_ElemHandlerParams {
|
||||
struct cw_ElemData * elemdata;
|
||||
struct sockaddr *from;
|
||||
mavl_t mand_found;
|
||||
mlist_t unrecognized;
|
||||
// cw_Val_t * elem;
|
||||
char * debug_details;
|
||||
cw_Cfg_t * cfg;
|
||||
|
@ -173,7 +173,7 @@ int cw_send_request(struct cw_Conn *conn,int msg_id)
|
||||
int rc;
|
||||
char sock_buf[SOCK_ADDR_BUFSIZE];
|
||||
cw_init_request(conn, msg_id);
|
||||
if ( cw_compose_message(conn, conn->req_buffer) == -1 ){
|
||||
if ( cw_assemble_message(conn, conn->req_buffer) == -1 ){
|
||||
errno=ENOMSG;
|
||||
return -1;
|
||||
}
|
||||
|
@ -249,7 +249,6 @@ struct cw_Val_Reader {
|
||||
void cw_ktv_init_str_reader(struct cw_Val_Reader *r, const char * str, int len);
|
||||
int cw_ktv_parse_string(struct cw_Val_Reader *r, char *key, char *type, char *val);
|
||||
int cw_generic_write_l(cw_Cfg_t **cfg, const struct cw_Type*type, const char *key, uint8_t *dst, const void * param);
|
||||
void cw_val_destroy(cw_Val_t *val);
|
||||
|
||||
/**
|
||||
* @} KTV
|
||||
|
@ -338,7 +338,7 @@ static struct cw_ElemHandler handlers[] = {
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"wtp-reboot-statistics", /* Key */
|
||||
cw_in_generic, /* handler */
|
||||
cw_out_generic, /* put */
|
||||
cw_out_generic_struct, /* put */
|
||||
NULL,
|
||||
NULL,
|
||||
wtp_reboot_statistics
|
||||
|
@ -37,7 +37,7 @@ int capwap_in_vendor_specific_payload(struct cw_ElemHandler *handler,
|
||||
// cw_dbg_elem(DBG_ELEM_IN,params->conn,0,vhandler, data+6,len-6);
|
||||
//vhandler->get(vhandler, params, data+6, len-6);
|
||||
*/
|
||||
cw_decode_element(params,0,vendor_id,elem_id,data+6,len-6);
|
||||
cw_process_element(params,0,vendor_id,elem_id,data+6,len-6);
|
||||
|
||||
return 1;
|
||||
|
||||
|
@ -26,6 +26,8 @@
|
||||
int capwap_in_wtp_descriptor(struct cw_ElemHandler *eh, struct cw_ElemHandlerParams *params, uint8_t * data,
|
||||
int len)
|
||||
{
|
||||
stop();
|
||||
|
||||
int rc;
|
||||
/*rc =cw_read_wtp_descriptor(params->remote_cfg, params->conn, eh, data, len, NULL);*/
|
||||
rc =cw_read_wtp_descriptor(params->cfg, NULL, eh, data, len, NULL);
|
||||
|
@ -11,7 +11,7 @@ int capwap_out_capwap_local_ip_address(struct cw_ElemHandler * eh,
|
||||
memset(&ip,0,sizeof(cw_Val_t));
|
||||
ip.type=CW_TYPE_IPADDRESS;
|
||||
|
||||
ipstr = cw_cfg_get_l(params->cfg_list,eh->key,NULL);
|
||||
ipstr = cw_cfg_get(params->cfg,eh->key,NULL);
|
||||
if (ipstr==NULL){
|
||||
return 0;
|
||||
}
|
||||
|
@ -45,7 +45,6 @@ int capwap_out_wtp_descriptor(struct cw_ElemHandler * eh,
|
||||
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_RADIOS_IN_USE);
|
||||
val = cw_cfg_get_byte_l(params->cfg_list,key, 0);
|
||||
cw_dbg("WTP-DESCRIPTOR: radios in use: %d",val);
|
||||
d+=cw_put_byte(d,val); /*radios in use*/
|
||||
|
||||
/* d+=cw_put_encryption_capabilities_7(d,1); */
|
||||
@ -57,17 +56,17 @@ cw_dbg("WTP-DESCRIPTOR: radios in use: %d",val);
|
||||
|
||||
/* hardware version sub element */
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_HARDWARE);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg_list,
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg,
|
||||
CW_SUBELEM_WTP_HARDWARE_VERSION, key);
|
||||
|
||||
/* software version sub element */
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_SOFTWARE);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg_list,
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg,
|
||||
CW_SUBELEM_WTP_SOFTWARE_VERSION, key);
|
||||
|
||||
/* bootloader version sub element */
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_BOOTLOADER);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg_list,
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg,
|
||||
CW_SUBELEM_WTP_BOOTLOADER_VERSION, key);
|
||||
|
||||
len = d-dst-4;
|
||||
|
@ -110,8 +110,8 @@ static cw_ValStruct_t cisco_ap_led_state_config73[] = {
|
||||
};
|
||||
|
||||
static cw_ValEnum_t cisco_ap_telnet_ssh_enum[] ={
|
||||
{0, "telnet", CW_TYPE_BOOL, cw_in_generic, cw_out_generic },
|
||||
{1, "ssh", CW_TYPE_BOOL, cw_in_generic, cw_out_generic },
|
||||
{0, "telnet", CW_TYPE_BOOL, cw_in_generic, NULL },
|
||||
{1, "ssh", CW_TYPE_BOOL, cw_in_generic, NULL },
|
||||
{0,0,0,0}
|
||||
};
|
||||
|
||||
@ -119,7 +119,8 @@ static cw_ValIndexed_t cisco_ap_telnet_ssh = {
|
||||
1,cisco_ap_telnet_ssh_enum
|
||||
};
|
||||
|
||||
static cw_ValStruct_t cisco_multi_domain_capability[]={
|
||||
static cw_ValStruct_t cisco_multi_domain_cabability[]={
|
||||
{CW_TYPE_BYTE, "radio-id", 1, -1},
|
||||
{CW_TYPE_BYTE, "reserved", 1, -1},
|
||||
{CW_TYPE_WORD, "first-channel", 2, -1},
|
||||
{CW_TYPE_WORD, "number-of-channels", 2, -1},
|
||||
@ -191,6 +192,7 @@ static cw_ValStruct_t cisco_ap_regulatory_domain5[]={
|
||||
|
||||
|
||||
static cw_ValStruct_t cisco_mac_operation70[]={
|
||||
{CW_TYPE_BYTE,"radio-id",1,-1},
|
||||
{CW_TYPE_BYTE,"reserved",1,-1},
|
||||
{CW_TYPE_WORD,"rts-threshold",2,-1},
|
||||
{CW_TYPE_BYTE,"short-retry",1,-1},
|
||||
@ -252,23 +254,24 @@ int cisco_out_ap_regulatory_domain(struct cw_ElemHandler * eh,
|
||||
char testkey[CW_CFG_MAX_KEY_LEN];
|
||||
int idx;
|
||||
void * type;
|
||||
cw_Val_t * result;
|
||||
cw_Val_t * result, search;
|
||||
int len,start;
|
||||
uint8_t * ob;
|
||||
|
||||
|
||||
stop();
|
||||
|
||||
idx = 0;
|
||||
ob = dst;
|
||||
|
||||
stop();
|
||||
|
||||
type = NULL;
|
||||
result = cw_cfg_get_val_l(params->cfg_list,"wtp-descriptor/software/version",CW_TYPE_BSTR16);
|
||||
result = cw_ktv_get(params->cfg,"ac-descriptor/software/version",CW_TYPE_BSTR16);
|
||||
if (result!=NULL){
|
||||
if(result->type->len(result)==4){
|
||||
uint32_t rv;
|
||||
rv = cw_get_dword(result->type->data(result));
|
||||
cw_dbg(DBG_X,"Version is %08X",rv);
|
||||
if (rv >= 0x07056600){
|
||||
type = cisco_ap_regulatory_domain5;
|
||||
}
|
||||
@ -278,33 +281,32 @@ cw_dbg(DBG_X,"Version is %08X",rv);
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
stop();
|
||||
}
|
||||
|
||||
cw_val_destroy(result);
|
||||
|
||||
do {
|
||||
sprintf(key,"%s.%d",eh->key,idx);
|
||||
if (!cw_cfg_base_exists_l(params->cfg_list,key))
|
||||
search.key=key;
|
||||
result = mavl_get_first(params->cfg,&search);
|
||||
if (result==NULL)
|
||||
break;
|
||||
if (strncmp(result->key,key,strlen(key))!=0)
|
||||
break;
|
||||
|
||||
if(type == NULL){
|
||||
sprintf(testkey,"%s/%s",key,"band-id");
|
||||
stop();
|
||||
result = cw_ktv_get_val_l(params->cfg_list,key,CW_TYPE_BYTE);
|
||||
result = cw_ktv_get(params->cfg,key,CW_TYPE_BYTE);
|
||||
if (result==NULL){
|
||||
type = cisco_ap_regulatory_domain4;
|
||||
}
|
||||
else{
|
||||
type = cisco_ap_regulatory_domain5;
|
||||
cw_val_destroy(result);
|
||||
}
|
||||
}
|
||||
|
||||
start = params->msgset->header_len(eh);
|
||||
len = CW_TYPE_STRUCT->write(params->cfg_list,key,ob+start,type);
|
||||
// len = cw_ktv_write_struct(params->cfg,NULL,type,key,ob+start);
|
||||
stop();
|
||||
len = cw_ktv_write_struct(params->cfg,NULL,type,key,ob+start);
|
||||
ob += params->msgset->write_header(eh,ob,len);
|
||||
|
||||
idx++;
|
||||
@ -347,6 +349,7 @@ static cw_ValStruct_t cisco_antenna_payload70[]={
|
||||
|
||||
|
||||
static cw_ValStruct_t cisco_wtp_radio_config70[]={
|
||||
{CW_TYPE_BYTE,"radio-id",1,-1},
|
||||
{CW_TYPE_BYTE,"cfg-type",1,-1},
|
||||
{CW_TYPE_WORD,"occupancy-limit",2,-1},
|
||||
{CW_TYPE_BYTE,"cfg-period",1,-1},
|
||||
@ -398,6 +401,7 @@ static cw_ValStruct_t cisco_wtp_radio_config75[]={
|
||||
|
||||
|
||||
static cw_ValStruct_t cisco_tx_power[]={
|
||||
{CW_TYPE_BYTE,"radio-id",1,-1},
|
||||
{CW_TYPE_BYTE,"reserved",1,-1},
|
||||
{CW_TYPE_WORD,"current-tx-power",2,-1},
|
||||
{NULL,NULL,0,0}
|
||||
@ -574,7 +578,6 @@ static int cw_mkradiokey(const char *pkey, uint8_t*data, int len, char *dst)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
static int cisoc_add_wlan_mkkey(const char *pkey, uint8_t*data, int len, char *dst)
|
||||
{
|
||||
int wlan_id,radio_id;
|
||||
@ -584,7 +587,7 @@ static int cisoc_add_wlan_mkkey(const char *pkey, uint8_t*data, int len, char *d
|
||||
sprintf(dst,"radio.%d/wlan.%d/add-wlan",radio_id,wlan_id);
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
static int cisoc_add_wlan_mkkey70(const char *pkey, uint8_t*data, int len, char *dst)
|
||||
{
|
||||
@ -828,7 +831,7 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
CW_TYPE_DWORD, /* type */
|
||||
"wtp-radio-information", /* Key */
|
||||
cw_in_radio_generic, /* get */
|
||||
cw_out_radio_generic /* put */
|
||||
cisco_out_radio_generic /* put */
|
||||
}
|
||||
,
|
||||
{
|
||||
@ -955,7 +958,7 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"cisco/loghost-config", /* Key */
|
||||
cw_in_generic, /* get */
|
||||
cw_out_generic, /* put */
|
||||
cw_out_generic_struct, /* put */
|
||||
NULL,
|
||||
NULL,
|
||||
cisco_loghost_config, /* type */
|
||||
@ -1006,11 +1009,11 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
8,8, /* min/max length */
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"cisco/multi-domain-capability", /* Key */
|
||||
cw_in_radio_generic, /* get */
|
||||
cw_out_radio_generic, /* put */
|
||||
cw_in_generic, /* get */
|
||||
NULL, /* put */
|
||||
cw_mkradiokey,
|
||||
NULL,
|
||||
NULL,
|
||||
cisco_multi_domain_capability,
|
||||
cisco_multi_domain_cabability,
|
||||
|
||||
}
|
||||
,
|
||||
@ -1077,7 +1080,7 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"cisco/ap-mode-and-type", /* Key */
|
||||
cw_in_generic, /* get */
|
||||
cw_out_generic, /* put */
|
||||
cw_out_generic_struct, /* put */
|
||||
NULL,
|
||||
NULL,
|
||||
cisco_ap_mode_and_type,
|
||||
@ -1163,7 +1166,7 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"cisco/ap-model", /* Key */
|
||||
cw_in_generic, /* get */
|
||||
cw_out_generic, /* put */
|
||||
cw_out_generic_struct, /* put */
|
||||
NULL,
|
||||
NULL,
|
||||
cisco_ap_model,
|
||||
@ -1188,9 +1191,9 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
25,25, /* min/max length */
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"cisco/wtp-radio-config", /* Key */
|
||||
cw_in_radio_generic, /* get */
|
||||
cw_out_radio_generic, /* put */
|
||||
NULL,
|
||||
cw_in_generic, /* get */
|
||||
cw_out_generic, /* put */
|
||||
cw_mkradiokey,
|
||||
NULL,
|
||||
cisco_wtp_radio_config70,
|
||||
|
||||
@ -1250,9 +1253,9 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
16,16, /* min/max length */
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"cisco/mac-operation", /* Key */
|
||||
cw_in_radio_generic, /* get */
|
||||
cw_out_radio_generic, /* put */
|
||||
NULL,
|
||||
cw_in_generic, /* get */
|
||||
cw_out_radio_generic_struct, /* put */
|
||||
cw_mkradiokey,
|
||||
NULL,
|
||||
cisco_mac_operation70,
|
||||
|
||||
@ -1266,9 +1269,9 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
4,4, /* min/max length */
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"cisco/tx-power", /* Key */
|
||||
cw_in_radio_generic, /* get */
|
||||
cw_out_radio_generic, /* put */
|
||||
NULL,
|
||||
cw_in_generic, /* get */
|
||||
cw_out_radio_generic_struct, /* put */
|
||||
cw_mkradiokey,
|
||||
NULL,
|
||||
cisco_tx_power,
|
||||
|
||||
@ -1281,9 +1284,9 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
5,150, /* min/max length */
|
||||
CW_TYPE_BSTR16, /* type */
|
||||
"cisco/tx-power-levels", /* Key */
|
||||
cw_in_radio_generic, /* get */
|
||||
cw_in_generic, /* get */
|
||||
cw_out_radio_generic, /* put */
|
||||
NULL,
|
||||
cw_mkradiokey,
|
||||
NULL,
|
||||
|
||||
|
||||
@ -1552,19 +1555,19 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
}
|
||||
,
|
||||
|
||||
// {
|
||||
// "Add Cisco WLAN", /* name */
|
||||
/// CISCO_ELEM_ADD_WLAN, /* Element ID */
|
||||
/// CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
|
||||
/// 7,1117, /* min/max length */
|
||||
// cisco_add_wlan70, /* type */
|
||||
// "radio/wlan/add-wlan", /* Key */
|
||||
/// cw_in_generic_struct, /* get */
|
||||
// cw_out_traverse, /* put */
|
||||
// cisoc_add_wlan_mkkey70,
|
||||
// cisco_patch_add_wlan70
|
||||
// }
|
||||
// ,
|
||||
{
|
||||
"Add Cisco WLAN", /* name */
|
||||
CISCO_ELEM_ADD_WLAN, /* Element ID */
|
||||
CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
|
||||
7,1117, /* min/max length */
|
||||
cisco_add_wlan70, /* type */
|
||||
"radio/wlan/add-wlan", /* Key */
|
||||
cw_in_generic_struct, /* get */
|
||||
cw_out_traverse, /* put */
|
||||
cisoc_add_wlan_mkkey70,
|
||||
cisco_patch_add_wlan70
|
||||
}
|
||||
,
|
||||
|
||||
{
|
||||
"Add Cisco WLAN (LWAPP)", /* name */
|
||||
@ -1639,14 +1642,10 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
CISCO_LWELEM_HARDWARE_INFO, /* Element ID */
|
||||
CW_VENDOR_ID_CISCO,CW_PROTO_LWAPP, /* Vendor / Proto */
|
||||
17,417, /* min/max length */
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
cisco_hardware_info, /* type */
|
||||
"cisco/hardware-info", /* Key */
|
||||
cw_in_generic, /* get */
|
||||
cw_out_generic, /* put */
|
||||
NULL,
|
||||
NULL,
|
||||
cisco_hardware_info,
|
||||
|
||||
cw_in_generic_struct, /* get */
|
||||
cw_out_generic_struct /* put */
|
||||
},
|
||||
|
||||
{
|
||||
@ -1657,7 +1656,7 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
"cisco/cisco-discovery-protocol", /* Key */
|
||||
cw_in_generic, /* get */
|
||||
cw_out_generic, /* put */
|
||||
cw_out_generic_struct, /* put */
|
||||
NULL,
|
||||
NULL,
|
||||
cisco_discovery_protocol,
|
||||
@ -1696,13 +1695,10 @@ static struct cw_ElemHandler handlers70[] = {
|
||||
CISCO_ELEM_80211_ASSOC_LIMIT, /* Element ID */
|
||||
CW_VENDOR_ID_CISCO, 0, /* Vendor / Proto */
|
||||
4, 4, /* min/max length */
|
||||
CW_TYPE_STRUCT, /* type */
|
||||
cisco_80211_assoc_limit, /* type */
|
||||
"cisco-8011-assoc-limit", /* Key */
|
||||
cw_in_generic, /* get */
|
||||
cw_out_generic, /* put */
|
||||
NULL,
|
||||
NULL,
|
||||
cisco_80211_assoc_limit
|
||||
cw_in_generic_struct, /* get */
|
||||
cw_out_generic_struct /* put */
|
||||
}
|
||||
,
|
||||
|
||||
@ -2366,15 +2362,11 @@ static int preprocess_join_request(struct cw_Conn *conn)
|
||||
use_ac_version = cw_cfg_get_bool(conn->global_cfg,"cisco/wtp-use-ac-version",0);
|
||||
if (use_ac_version){
|
||||
ver = cw_cfg_get_bstr16(conn->remote_cfg,"ac-descriptor/software/version",NULL );
|
||||
if (ver != NULL){
|
||||
cw_cfg_set_bstr16(conn->local_cfg,"wtp-descriptor/software/version",ver);
|
||||
|
||||
cw_format_version(verstr,bstr16_data(ver),bstr16_len(ver));
|
||||
cw_dbg(DBG_INFO, "Cisco WTP - Using AC's software version: %s", verstr);
|
||||
free(ver);
|
||||
}
|
||||
else{
|
||||
cw_dbg(DBG_X,"No version defined");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
47
src/mod/cisco/cisco_in_ap_regulatory_domain.c
Normal file
47
src/mod/cisco/cisco_in_ap_regulatory_domain.c
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
This file is part of actube.
|
||||
|
||||
actube is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
libcapwap is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief Implements cw_in_capwap_control_ip_address
|
||||
*/
|
||||
|
||||
#include "mod_capwap.h"
|
||||
|
||||
|
||||
int cisco_in_ap_regulatory_domain(struct cw_ElemHandler *eh,
|
||||
struct cw_ElemHandlerParams *params,
|
||||
uint8_t * data, int len)
|
||||
{
|
||||
char key[CW_KTV_MAX_KEY_LEN];
|
||||
int idx;
|
||||
|
||||
sprintf(key,"%s/address",eh->key);
|
||||
idx = cw_ktv_idx_get(params->conn->remote_cfg,key);
|
||||
|
||||
/* printf("SKEY is %s , idx: %d\n",key,idx);*/
|
||||
|
||||
sprintf(key,"%s/address.%d",eh->key,idx+1);
|
||||
cw_ktv_add(params->conn->remote_cfg,key,CW_TYPE_IPADDRESS,data,len-2);
|
||||
|
||||
sprintf(key,"%s/wtps.%d",eh->key,idx+1);
|
||||
cw_ktv_add(params->conn->remote_cfg,key,CW_TYPE_WORD,data+len-2,2);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -25,5 +25,5 @@ int cisco_in_spam_vendor_specific(struct cw_ElemHandler *eh,
|
||||
|
||||
}
|
||||
|
||||
return cw_decode_element(params,CW_PROTO_LWAPP,vendor_id,elem_id,data+6,len-6);
|
||||
return cw_process_element(params,CW_PROTO_LWAPP,vendor_id,elem_id,data+6,len-6);
|
||||
}
|
||||
|
@ -66,11 +66,11 @@ int cisco_out_ac_descriptor(struct cw_ElemHandler * eh,
|
||||
/* it is important to send software version first,
|
||||
* because APs don't check the type */
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_SOFTWARE);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg_list,
|
||||
d+=cw_write_descriptor_subelem (d, params->conn->local_cfg,
|
||||
1, key);
|
||||
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_HARDWARE);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg_list,
|
||||
d+=cw_write_descriptor_subelem (d, params->conn->local_cfg,
|
||||
0, key);
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@ int cisco_out_radio_generic(struct cw_ElemHandler * handler, struct cw_ElemHandl
|
||||
int radios;
|
||||
len =0;
|
||||
|
||||
radios = cw_cfg_get_byte_l(params->cfg_list,"wtp-descriptor/max-radios",0);
|
||||
radios = cw_cfg_get_byte(params->cfg,"wtp-descriptor/max-radios",0);
|
||||
cw_dbg(DBG_X,"NUM RADIOS: %d",radios);
|
||||
for(i=0;i<radios+0;i++){
|
||||
l = cw_write_radio_element(handler,params,i,dst+len);
|
||||
|
@ -20,33 +20,23 @@ int cisco_out_wtp_descriptor(struct cw_ElemHandler * eh,
|
||||
rc = cw_generic_write_l(params->cfg_list, CW_TYPE_BYTE,key,
|
||||
d, eh->param);
|
||||
|
||||
const char *
|
||||
xxx = cw_cfg_get_l(params->cfg_list, key, NULL);
|
||||
cw_dbg(DBG_X,"What??? %s: %s",key,xxx);
|
||||
|
||||
// val = cw_ktv_get(params->cfg,key, CW_TYPE_BYTE);
|
||||
if (rc==-1){
|
||||
cw_dbg(DBG_WARN,"Cannot get value for %s, setting to 0", key);
|
||||
d+=cw_put_byte(d,0);
|
||||
}
|
||||
else {
|
||||
int yyy = cw_get_byte(d);
|
||||
cw_dbg(DBG_X,"Verify: %d",yyy);
|
||||
d+=rc;
|
||||
}
|
||||
|
||||
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_RADIOS_IN_USE);
|
||||
|
||||
xxx = cw_cfg_get_l(params->cfg_list, key, NULL);
|
||||
cw_dbg(DBG_X,"What??? %s: %s",key,xxx);
|
||||
|
||||
rc = cw_generic_write_l(params->cfg_list, CW_TYPE_BYTE,key,
|
||||
d, eh->param);
|
||||
|
||||
|
||||
// val = cw_ktv_get(params->cfg,key, CW_TYPE_BYTE);
|
||||
if (rc == -1){
|
||||
if (rc != -1){
|
||||
cw_dbg(DBG_WARN,"Cannot get value for %s, setting to 0", key);
|
||||
d+=cw_put_byte(d,0);
|
||||
}
|
||||
@ -56,20 +46,20 @@ int cisco_out_wtp_descriptor(struct cw_ElemHandler * eh,
|
||||
|
||||
d+=cw_put_encryption_capabilities_7(d,1);
|
||||
|
||||
cw_dbg(DBG_X,"befor subelem ^p",params->cfg_list);
|
||||
|
||||
/* hardware version sub element */
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_HARDWARE);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg_list,
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg,
|
||||
CW_SUBELEM_WTP_HARDWARE_VERSION, key);
|
||||
|
||||
/* software version sub element */
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_SOFTWARE);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg_list,
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg,
|
||||
CW_SUBELEM_WTP_SOFTWARE_VERSION, key);
|
||||
|
||||
/* bootloader version sub element */
|
||||
sprintf(key,"%s/%s",eh->key,CW_SKEY_BOOTLOADER);
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg_list,
|
||||
d+=cw_write_descriptor_subelem (d, params->cfg,
|
||||
CW_SUBELEM_WTP_BOOTLOADER_VERSION, key);
|
||||
|
||||
len = d-dst-4;
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "cw/capwap.h"
|
||||
|
||||
#include "cw/conn.h"
|
||||
#include "cw/dbg.h"
|
||||
|
||||
|
||||
#include "wtp_interface.h"
|
||||
@ -17,7 +16,6 @@ int changestate(struct conn * conn)
|
||||
|
||||
/*// mbag_set_dword(conn->outgoing,CW_ITEM_RESULT_CODE,0);*/
|
||||
|
||||
cw_dbg(DBG_X,"CHANGE STATE");
|
||||
|
||||
/* Change State ... */
|
||||
int rc = cw_send_request(conn,CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST);
|
||||
|
@ -0,0 +1,377 @@
|
||||
ac-descriptor/active-wtps :Word: 2
|
||||
ac-descriptor/dtls-policy :Byte: 0
|
||||
ac-descriptor/hardware/vendor :Dword: 4232704
|
||||
ac-descriptor/hardware/version :Bstr16: .x01000001
|
||||
ac-descriptor/max-wtps :Word: 12
|
||||
ac-descriptor/r-mac-field :Byte: 1
|
||||
ac-descriptor/reserved1 :Byte: 0
|
||||
ac-descriptor/security :Byte: 2
|
||||
ac-descriptor/software/vendor :Dword: 4232704
|
||||
ac-descriptor/software/version :Bstr16: .x07007400
|
||||
ac-descriptor/station-limit :Word: 1000
|
||||
ac-descriptor/stations :Word: 0
|
||||
ac-name :Bstr16: Cisco_e2:60:a0
|
||||
ac-name-with-index.0 :Bstr16: tabbe88
|
||||
ac-name-with-index.1 :Bstr16: nudelnudel
|
||||
ac-name-with-index.2 :Bstr16: nadelnalde
|
||||
ac-name-with-priority/X1 :Byte: 3
|
||||
ac-name-with-priority/ac2 :Byte: 5
|
||||
capwap-control-ip-address/address.0 :IPAddress: 192.168.0.162
|
||||
capwap-control-ip-address/address.1 :IPAddress: d96c:4c0a:da6c:4c0a:db6c:4c0a:dc6c:4c0a
|
||||
capwap-control-ip-address/address.2 :IPAddress: 192.168.0.162
|
||||
capwap-control-ip-address/wtps.0 :Word: 0
|
||||
capwap-control-ip-address/wtps.1 :Word: 10
|
||||
capwap-control-ip-address/wtps.2 :Word: 0
|
||||
capwap-local-ip-address :IPAddress: 192.168.0.14
|
||||
capwap-timers/echo-interval :Byte: 30
|
||||
capwap-timers/max-discovery-interval :Byte: 10
|
||||
capwap-timers/min-discovery-interval :Byte: 0
|
||||
cisco-8011-assoc-limit/enable :Bool: false
|
||||
cisco-8011-assoc-limit/interval :Word: 500
|
||||
cisco-8011-assoc-limit/limit :Byte: 25
|
||||
cisco/ac-ip-addr-with-index.0 :IPAddress: 1.1.1.1
|
||||
cisco/ac-ip-addr-with-index.1 :IPAddress: 9.9.9.9
|
||||
cisco/ac-ip-addr-with-index.2 :IPAddress: 3.3.3.3
|
||||
cisco/ap-core-dump/compression :Bool: false
|
||||
cisco/ap-core-dump/enable :Bool: false
|
||||
cisco/ap-core-dump/filename :Str:
|
||||
cisco/ap-core-dump/tftp-server :IPAddress: 0.0.0.0
|
||||
cisco/ap-failover-priority :Byte: 1
|
||||
cisco/ap-group-name :Bstr16: default-group
|
||||
cisco/ap-led-state-config/led-state :Byte: 1
|
||||
cisco/ap-led-state-config/save-flag :Byte: 1
|
||||
cisco/ap-log-facility :Byte: 0
|
||||
cisco/ap-mode-and-type/mode :Byte: 0
|
||||
cisco/ap-mode-and-type/type :Byte: 0
|
||||
cisco/ap-model/model :Str: AIR-LAP1131AG-E-K9
|
||||
cisco/ap-power-injector-config/selection :Byte: 0
|
||||
cisco/ap-power-injector-config/sitch-mac-address :Bstr16: .x000000000000
|
||||
cisco/ap-power-injector-config/state :Byte: 17
|
||||
cisco/ap-pre-std-switch-config :Byte: 0
|
||||
cisco/ap-regulatory-domain.0/band-id :Byte: 0
|
||||
cisco/ap-regulatory-domain.0/code0 :Byte: 0
|
||||
cisco/ap-regulatory-domain.0/code1 :Byte: 1
|
||||
cisco/ap-regulatory-domain.0/set :Bool: true
|
||||
cisco/ap-regulatory-domain.0/slot :Byte: 0
|
||||
cisco/ap-regulatory-domain.1/band-id :Byte: 0
|
||||
cisco/ap-regulatory-domain.1/code0 :Byte: 0
|
||||
cisco/ap-regulatory-domain.1/code1 :Byte: 1
|
||||
cisco/ap-regulatory-domain.1/set :Bool: true
|
||||
cisco/ap-regulatory-domain.1/slot :Byte: 0
|
||||
cisco/ap-sub-mode :Byte: 0
|
||||
cisco/ap-telnet-ssh/ssh :Bool: false
|
||||
cisco/ap-telnet-ssh/telnet :Bool: false
|
||||
cisco/ap-timesync/timestamp :Dword: 1469886778
|
||||
cisco/ap-timesync/type :Byte: 0
|
||||
cisco/ap-username-and-password/802.1x-credentials/option :Word: 2
|
||||
cisco/ap-username-and-password/802.1x-credentials/password :Str:
|
||||
cisco/ap-username-and-password/802.1x-credentials/username :Str:
|
||||
cisco/ap-username-and-password/login-credentials/enable-password :Str: $1$nPEe$k81RL0xZkiYryiUh.yM2J1
|
||||
cisco/ap-username-and-password/login-credentials/option :Word: 1025
|
||||
cisco/ap-username-and-password/login-credentials/password :Str: $1$R1hh$.3Jgrg.1DHuxmiQVDNqxB.
|
||||
cisco/ap-username-and-password/login-credentials/username :Str: admin
|
||||
cisco/ap-venue-settings/group :Word: 2
|
||||
cisco/ap-venue-settings/language :Str: en
|
||||
cisco/ap-venue-settings/name :Str:
|
||||
cisco/ap-venue-settings/type :Byte: 1
|
||||
cisco/board-data-options :Dword: 16777217
|
||||
cisco/cisco-discovery-protocol/data :Word: 0
|
||||
cisco/cisco-discovery-protocol/enabled :Bool: false
|
||||
cisco/elem132 :Bstr16: .x0100000000
|
||||
cisco/hash/hash :Bstr16: c4084177cd95ddbba1237bfcb3de6780fdf48214
|
||||
cisco/hash/validate :Bool: true
|
||||
cisco/loghost-config/last-joined-ap :Str:
|
||||
cisco/loghost-config/loghost.0 :IPAddress: 7.7.1.3
|
||||
cisco/loghost-config/loghost.1 :IPAddress: 0.0.0.0
|
||||
cisco/loghost-config/loghost.2 :IPAddress: 0.0.0.0
|
||||
cisco/loghost-config/loghost.3 :IPAddress: 0.0.0.0
|
||||
cisco/mcast-mgid-info :Bstr16: .x0000000d0000000000000000000000000000000101000000
|
||||
cisco/mwar-addr/address :IPAddress: 192.168.0.162
|
||||
cisco/mwar-addr/mwar-type :Byte: 0
|
||||
cisco/mwar-addr/unknown :Word: 0
|
||||
cisco/mwar-hash-value :Bstr16: c4084177cd95ddbba1237bfcb3de6780fdf48214
|
||||
cisco/mwar-type :Byte: 1
|
||||
cisco/rouge-and-mss/enable :Bool: false
|
||||
cisco/rouge-and-mss/mss :Word: 666
|
||||
cisco/rouge-and-mss/roge-detection :Bool: true
|
||||
cisco/rouge-and-mss/tcp-adjust-mss :Word: 0
|
||||
cisco/rouge-detection/rest :Bstr16: .x000aff800000
|
||||
cisco/rouge-detection/rouge-detection :Bool: false
|
||||
cisco/sig-toogle :Bool: true
|
||||
cisco/spam-domain-secret :Bstr16: .xe1ffd18a8f15b3b59c0a47a7f17a96e7cb36174f00
|
||||
cisco/ssl-certfile :Str: ../../ssl/certs/wtpc.crt
|
||||
cisco/ssl-cipher :Str: RSA:AES-128-CBC:SHA1
|
||||
cisco/ssl-keyfile :Str: ../../ssl/certs/wtpc.key
|
||||
cisco/vlan/id :Word: 0
|
||||
cisco/vlan/tagging :Bool: false
|
||||
cisco/wtp-board-data/card-id :Word: 0
|
||||
cisco/wtp-board-data/card-revision :Word: 0
|
||||
cisco/wtp-board-data/ethernet-mac-address :Bstr16: .x0800276edf58
|
||||
cisco/wtp-board-data/failover-priority :Bstr16: .x01010003
|
||||
cisco/wtp-board-data/options/ant-type :Byte: 1
|
||||
cisco/wtp-board-data/options/ap-type :Byte: 0
|
||||
cisco/wtp-board-data/options/failover-priority :Byte: 1
|
||||
cisco/wtp-board-data/options/flex-connect :Byte: 1
|
||||
cisco/wtp-board-data/wtp-model-hi :Dword: 0
|
||||
cisco/wtp-board-data/wtp-model-lo :Dword: 0
|
||||
cisco/wtp-board-data/wtp-serial-number :Str: FCZ1406W232
|
||||
cisco/wtp-use-ac-version :Bool: true
|
||||
discovery-type :Byte: 0
|
||||
idle-timeout :Dword: 300
|
||||
location-data :Bstr16: Berlin
|
||||
lwapp20 :Bstr16: .x000001
|
||||
maximum-message-length :Word: 4096
|
||||
radio.0/admin-state :Byte: reserved
|
||||
radio.0/cisco-multi-domain-capability/first-channel :Word: 1
|
||||
radio.0/cisco-multi-domain-capability/max-tx-power-level :Word: 65535
|
||||
radio.0/cisco-multi-domain-capability/number-of-channels :Word: 13
|
||||
radio.0/cisco-multi-domain-capability/reserved :Byte: 1
|
||||
radio.0/cisco/air-space-capability :Byte: 0
|
||||
radio.0/cisco/antenna-payload/802-11n-rx-antennas :Byte: 7
|
||||
radio.0/cisco/antenna-payload/802-11n-tx-antennas :Byte: 0
|
||||
radio.0/cisco/antenna-payload/antenna-1 :Byte: 1
|
||||
radio.0/cisco/antenna-payload/antenna-2 :Byte: 1
|
||||
radio.0/cisco/antenna-payload/antenna-mode :Byte: 3
|
||||
radio.0/cisco/antenna-payload/diversity-selection :Byte: 255
|
||||
radio.0/cisco/antenna-payload/number-of-antennas :Byte: 2
|
||||
radio.0/cisco/antenna-payload/unknown :Byte: 3
|
||||
radio.0/cisco/channel-power :Bstr16: .x08080d0108221c16100a04fefe0208221c16100a04fefe0308221c16100a04fefe0408221c16100a04fefe0508221c16100a04fefe0608221c16100a04fefe0708221c16100a04fefe0808221c16100a04fefe0908221c16100a04fefe0a08221c16100a04fefe0b08221c16100a04fefe0c08221c16100a04fefe0d08221c16100a04fefe
|
||||
radio.0/cisco/direct-sequence-control/cfg-type :Byte: 1
|
||||
radio.0/cisco/direct-sequence-control/current-cca-mode :Byte: 0
|
||||
radio.0/cisco/direct-sequence-control/current-channel :Byte: 1
|
||||
radio.0/cisco/direct-sequence-control/energy-detect-threshold :Dword: -50
|
||||
radio.0/cisco/direct-sequence-control/unknown :Byte: 1
|
||||
radio.0/cisco/elem19 :Bstr16: .xc0a800a10001000bc0a800a103000101001ecd774fc43bd27db633509934957d3acb000000000000000052464d000000000000000000000000000000000000000000000000000000000001060b010101
|
||||
radio.0/cisco/elem22 :Bstr16: .x0d00b400320102030405060708090a0b0c0d
|
||||
radio.0/cisco/elem24 :Bstr16: .x003c000c
|
||||
radio.0/cisco/elem81 :Bstr16: .x00000000010101010a001e0a02051cbfffbfff0a00
|
||||
radio.0/cisco/lwelem9 :Bstr16: .x0100000000000000000000000000000000
|
||||
radio.0/cisco/mac-operation/byte75 :Byte: 0
|
||||
radio.0/cisco/mac-operation/fragmentation-threshold :Word: 2346
|
||||
radio.0/cisco/mac-operation/long-retry :Byte: 4
|
||||
radio.0/cisco/mac-operation/reserved :Byte: 0
|
||||
radio.0/cisco/mac-operation/rts-threshold :Word: 2347
|
||||
radio.0/cisco/mac-operation/rx-msdu-lifetime :Dword: 512
|
||||
radio.0/cisco/mac-operation/short-retry :Byte: 7
|
||||
radio.0/cisco/mac-operation/tx-msdu-lifetime :Dword: 512
|
||||
radio.0/cisco/multi-domain-capability/first-channel :Word: 1
|
||||
radio.0/cisco/multi-domain-capability/max-tx-power-level :Word: 20
|
||||
radio.0/cisco/multi-domain-capability/number-of-channels :Word: 13
|
||||
radio.0/cisco/multi-domain-capability/reserved :Byte: 1
|
||||
radio.0/cisco/rad-extended-config/beacon-interval :Word: 25600
|
||||
radio.0/cisco/rad-extended-config/beacon-range :Word: 0
|
||||
radio.0/cisco/rad-extended-config/c-ccat :Word: 0
|
||||
radio.0/cisco/rad-extended-config/multicast-buffer :Word: 0
|
||||
radio.0/cisco/rad-extended-config/multicast-data-range :Word: 0
|
||||
radio.0/cisco/rad-extended-config/rx-sensop-threshold :Word: 0
|
||||
radio.0/cisco/tx-power-levels :Bstr16: .x070011000e000b000800050002ffff0000
|
||||
radio.0/cisco/tx-power/current-tx-power :Word: 1
|
||||
radio.0/cisco/tx-power/reserved :Byte: 1
|
||||
radio.0/cisco/wtp-radio-config/beacon-period :Word: 100
|
||||
radio.0/cisco/wtp-radio-config/bss-id :Bstr16: .x0800276edf58
|
||||
radio.0/cisco/wtp-radio-config/cfg-period :Byte: 4
|
||||
radio.0/cisco/wtp-radio-config/cfg-type :Byte: 1
|
||||
radio.0/cisco/wtp-radio-config/cfp-maximum-duration :Word: 60
|
||||
radio.0/cisco/wtp-radio-config/country-str1 :Str: DE
|
||||
radio.0/cisco/wtp-radio-config/country-str2 :Str: DE
|
||||
radio.0/cisco/wtp-radio-config/gpr-period :Byte: 10
|
||||
radio.0/cisco/wtp-radio-config/max-stations :Byte: 200
|
||||
radio.0/cisco/wtp-radio-config/occupancy-limit :Word: 100
|
||||
radio.0/cisco/wtp-radio-config/reg :Dword: 167772416
|
||||
radio.0/cisco/wtp-radio-config/unknown75 :Byte: 0
|
||||
radio.0/decryption-error-report-period :Word: 120
|
||||
radio.0/operational-state/cause :Byte: Normal
|
||||
radio.0/operational-state/state :Byte: enabled
|
||||
radio.0/rate_set :Bstr16: .x82848b960c1218243048606c
|
||||
radio.0/wlan.0/add-lw-wlan/misc :Bstr16: .x3e9904fac0000100
|
||||
radio.0/wlan.0/add-lw-wlan/misc2 :Word: 4
|
||||
radio.0/wlan.0/add-lw-wlan/ssid :Str: TubeSSID
|
||||
radio.0/wlan.0/add-wlan/broadcast-ssid :Bool: true
|
||||
radio.0/wlan.0/add-wlan/dtim-period :Byte: 1
|
||||
radio.0/wlan.0/add-wlan/encryption-policy :Dword: 4
|
||||
radio.0/wlan.0/add-wlan/profile-name :Str: tubeC
|
||||
radio.0/wlan.0/add-wlan/qos :Byte: 0
|
||||
radio.0/wlan.0/add-wlan/radio-id :Byte: 0
|
||||
radio.0/wlan.0/add-wlan/scan-defer-time :Word: 100
|
||||
radio.0/wlan.0/add-wlan/session-timout :Word: 1800
|
||||
radio.0/wlan.0/add-wlan/ssid :Str:
|
||||
radio.0/wlan.0/add-wlan/wep-encryption :Bool: false
|
||||
radio.0/wlan.0/add-wlan/wep-key :Bstr16: .x25c544f95684f1f8687a411ca5
|
||||
radio.0/wlan.0/add-wlan/wep-key-index :Byte: 1
|
||||
radio.0/wlan.0/add-wlan/wlan-capability :Word: 1073
|
||||
radio.0/wlan.0/add-wlan/wlan-id :Byte: 1
|
||||
radio.0/wlan.0/allow-aaa-override :Byte: 0
|
||||
radio.0/wlan.0/broadcast-ssid :Bool: true
|
||||
radio.0/wlan.0/dtim-period :Byte: 1
|
||||
radio.0/wlan.0/encryption :Byte: 0
|
||||
radio.0/wlan.0/encryption-policy :Dword: 16777216
|
||||
radio.0/wlan.0/max-stations :Byte: 200
|
||||
radio.0/wlan.0/radio-id :Byte: 0
|
||||
radio.0/wlan.0/session-timout :Word: 1800
|
||||
radio.0/wlan.0/ssid-a :Str: Schlosspark
|
||||
radio.0/wlan.0/wep-key :Bstr16: .xaa0c0a02000000000000000000
|
||||
radio.0/wlan.0/wlan-capability :Word: 1057
|
||||
radio.0/wlan.0/wlan-id :Byte: 0
|
||||
radio.0/wlan.1/add-wlan/aironet-ie :Bool: true
|
||||
radio.0/wlan.1/add-wlan/broadcast-ssid :Bool: true
|
||||
radio.0/wlan.1/add-wlan/dtim-period :Byte: 1
|
||||
radio.0/wlan.1/add-wlan/encryption-policy :Dword: 4
|
||||
radio.0/wlan.1/add-wlan/hreap-local-switch :Byte: 0
|
||||
radio.0/wlan.1/add-wlan/profile-name :Str: tubeC
|
||||
radio.0/wlan.1/add-wlan/qos :Byte: 0
|
||||
radio.0/wlan.1/add-wlan/radio-id :Byte: 0
|
||||
radio.0/wlan.1/add-wlan/scan-defer-period :Word: 28784
|
||||
radio.0/wlan.1/add-wlan/scan-defer-time :Word: 100
|
||||
radio.0/wlan.1/add-wlan/session-timout :Word: 1800
|
||||
radio.0/wlan.1/add-wlan/ssid :Str: tubeC
|
||||
radio.0/wlan.1/add-wlan/wep-encryption :Bool: false
|
||||
radio.0/wlan.1/add-wlan/wep-key :Bstr16: .xc3616fee42fcf74fa02bff3d87
|
||||
radio.0/wlan.1/add-wlan/wep-key-index :Byte: 1
|
||||
radio.0/wlan.1/add-wlan/wlan-capability :Word: 1073
|
||||
radio.0/wlan.1/add-wlan/wlan-id :Byte: 1
|
||||
radio.0/wlan.13/add-wlan/aironet-ie :Bool: true
|
||||
radio.0/wlan.13/add-wlan/broadcast-ssid :Bool: true
|
||||
radio.0/wlan.13/add-wlan/dtim-period :Byte: 19
|
||||
radio.0/wlan.13/add-wlan/encryption-policy :Dword: 1
|
||||
radio.0/wlan.13/add-wlan/hreap-local-switch :Byte: 16
|
||||
radio.0/wlan.13/add-wlan/profile-name :Str: SuerWLAN
|
||||
radio.0/wlan.13/add-wlan/qos :Byte: 0
|
||||
radio.0/wlan.13/add-wlan/radio-id :Byte: 0
|
||||
radio.0/wlan.13/add-wlan/scan-defer-period :Word: 15420
|
||||
radio.0/wlan.13/add-wlan/scan-defer-time :Word: 100
|
||||
radio.0/wlan.13/add-wlan/session-timout :Word: 1800
|
||||
radio.0/wlan.13/add-wlan/ssid :Str: SuperSSID
|
||||
radio.0/wlan.13/add-wlan/wep-encryption :Bool: false
|
||||
radio.0/wlan.13/add-wlan/wep-key :Bstr16: .x00000000000000000000000000
|
||||
radio.0/wlan.13/add-wlan/wep-key-index :Byte: 1
|
||||
radio.0/wlan.13/add-wlan/wlan-capability :Word: 1057
|
||||
radio.0/wlan.13/add-wlan/wlan-id :Byte: 13
|
||||
radio.0/wtp-radio-information :Dword: 1
|
||||
radio.1/admin-state :Byte: reserved
|
||||
radio.1/cisco-multi-domain-capability/first-channel :Word: 36
|
||||
radio.1/cisco-multi-domain-capability/max-tx-power-level :Word: 65535
|
||||
radio.1/cisco-multi-domain-capability/number-of-channels :Word: 16
|
||||
radio.1/cisco-multi-domain-capability/reserved :Byte: 1
|
||||
radio.1/cisco/air-space-capability :Byte: 0
|
||||
radio.1/cisco/antenna-payload/802-11n-rx-antennas :Byte: 7
|
||||
radio.1/cisco/antenna-payload/802-11n-tx-antennas :Byte: 0
|
||||
radio.1/cisco/antenna-payload/antenna-1 :Byte: 1
|
||||
radio.1/cisco/antenna-payload/antenna-2 :Byte: 1
|
||||
radio.1/cisco/antenna-payload/antenna-mode :Byte: 3
|
||||
radio.1/cisco/antenna-payload/diversity-selection :Byte: 255
|
||||
radio.1/cisco/antenna-payload/number-of-antennas :Byte: 2
|
||||
radio.1/cisco/antenna-payload/unknown :Byte: 3
|
||||
radio.1/cisco/channel-power :Bstr16: .x0808102408221c16100a04fefe2808221c16100a04fefe2c08221c16100a04fefe3008221c16100a04fefe3408221c16100a04fefe3808221c16100a04fefe3c08221c16100a04fefe4008221c16100a04fefe6408221c16100a04fefe6808221c16100a04fefe6c08221c16100a04fefe7008221c16100a04fefe7408221c16100a04fefe8408221c16100a04fefe8808221c16100a04fefe8c08221c16100a04fefe
|
||||
radio.1/cisco/elem15 :Bstr16: .x027007ffffffce010001
|
||||
radio.1/cisco/elem19 :Bstr16: .xc0a800a10001000ac0a800a110000101001ecd774fc43bd27db633509934957d3acb000000000000000052464d000000000000000000000000000000000000000000000000000000000024282c3034383c4064686c707484888c01010101010101010101010101010101
|
||||
radio.1/cisco/elem22 :Bstr16: .x1000b4003224282c3034383c4064686c707484888c
|
||||
radio.1/cisco/elem24 :Bstr16: .x003c000c
|
||||
radio.1/cisco/elem47 :Bstr16: .x01ccb0000c000f42401999ba1040000003
|
||||
radio.1/cisco/elem81 :Bstr16: .x00000000010101010a001e0a02050fbfffbfff0a00
|
||||
radio.1/cisco/lwelem9 :Bstr16: .x0100000000000000000000000000000000
|
||||
radio.1/cisco/mac-operation/byte75 :Byte: 0
|
||||
radio.1/cisco/mac-operation/fragmentation-threshold :Word: 2346
|
||||
radio.1/cisco/mac-operation/long-retry :Byte: 4
|
||||
radio.1/cisco/mac-operation/reserved :Byte: 1
|
||||
radio.1/cisco/mac-operation/rts-threshold :Word: 2347
|
||||
radio.1/cisco/mac-operation/rx-msdu-lifetime :Dword: 512
|
||||
radio.1/cisco/mac-operation/short-retry :Byte: 7
|
||||
radio.1/cisco/mac-operation/tx-msdu-lifetime :Dword: 512
|
||||
radio.1/cisco/multi-domain-capability/first-channel :Word: 36
|
||||
radio.1/cisco/multi-domain-capability/max-tx-power-level :Word: 20
|
||||
radio.1/cisco/multi-domain-capability/number-of-channels :Word: 4
|
||||
radio.1/cisco/multi-domain-capability/reserved :Byte: 1
|
||||
radio.1/cisco/tx-power-levels :Bstr16: .x070011000e000b000800050002ffff0000
|
||||
radio.1/cisco/tx-power/current-tx-power :Word: 1
|
||||
radio.1/cisco/tx-power/reserved :Byte: 1
|
||||
radio.1/cisco/wtp-radio-config/beacon-period :Word: 100
|
||||
radio.1/cisco/wtp-radio-config/bss-id :Bstr16: .x04fe7f499b90
|
||||
radio.1/cisco/wtp-radio-config/cfg-period :Byte: 4
|
||||
radio.1/cisco/wtp-radio-config/cfg-type :Byte: 1
|
||||
radio.1/cisco/wtp-radio-config/cfp-maximum-duration :Word: 60
|
||||
radio.1/cisco/wtp-radio-config/country-str1 :Str: DE
|
||||
radio.1/cisco/wtp-radio-config/country-str2 :Str: DE
|
||||
radio.1/cisco/wtp-radio-config/gpr-period :Byte: 10
|
||||
radio.1/cisco/wtp-radio-config/max-stations :Byte: 200
|
||||
radio.1/cisco/wtp-radio-config/occupancy-limit :Word: 100
|
||||
radio.1/cisco/wtp-radio-config/reg :Dword: 167772416
|
||||
radio.1/cisco/wtp-radio-config/unknown75 :Byte: 1
|
||||
radio.1/decryption-error-report-period :Word: 120
|
||||
radio.1/operational-state/cause :Byte: Normal
|
||||
radio.1/operational-state/state :Byte: enabled
|
||||
radio.1/rate_set :Bstr16: .x8c129824b048606c
|
||||
radio.1/wlan.1/add-wlan/aironet-ie :Bool: true
|
||||
radio.1/wlan.1/add-wlan/broadcast-ssid :Bool: true
|
||||
radio.1/wlan.1/add-wlan/dtim-period :Byte: 1
|
||||
radio.1/wlan.1/add-wlan/encryption-policy :Dword: 4
|
||||
radio.1/wlan.1/add-wlan/hreap-local-switch :Byte: 0
|
||||
radio.1/wlan.1/add-wlan/profile-name :Str: tubeC
|
||||
radio.1/wlan.1/add-wlan/qos :Byte: 0
|
||||
radio.1/wlan.1/add-wlan/radio-id :Byte: 1
|
||||
radio.1/wlan.1/add-wlan/scan-defer-period :Word: 28784
|
||||
radio.1/wlan.1/add-wlan/scan-defer-time :Word: 100
|
||||
radio.1/wlan.1/add-wlan/session-timout :Word: 1800
|
||||
radio.1/wlan.1/add-wlan/ssid :Str: tubeC
|
||||
radio.1/wlan.1/add-wlan/wep-encryption :Bool: false
|
||||
radio.1/wlan.1/add-wlan/wep-key :Bstr16: .xcac80297ec10e7a8da2c9b1f03
|
||||
radio.1/wlan.1/add-wlan/wep-key-index :Byte: 1
|
||||
radio.1/wlan.1/add-wlan/wlan-capability :Word: 17
|
||||
radio.1/wlan.1/add-wlan/wlan-id :Byte: 1
|
||||
radio.1/wlan.13/add-wlan/aironet-ie :Bool: true
|
||||
radio.1/wlan.13/add-wlan/broadcast-ssid :Bool: true
|
||||
radio.1/wlan.13/add-wlan/dtim-period :Byte: 19
|
||||
radio.1/wlan.13/add-wlan/encryption-policy :Dword: 1
|
||||
radio.1/wlan.13/add-wlan/hreap-local-switch :Byte: 16
|
||||
radio.1/wlan.13/add-wlan/profile-name :Str: SuerWLAN
|
||||
radio.1/wlan.13/add-wlan/qos :Byte: 0
|
||||
radio.1/wlan.13/add-wlan/radio-id :Byte: 1
|
||||
radio.1/wlan.13/add-wlan/scan-defer-period :Word: 15420
|
||||
radio.1/wlan.13/add-wlan/scan-defer-time :Word: 100
|
||||
radio.1/wlan.13/add-wlan/session-timout :Word: 1800
|
||||
radio.1/wlan.13/add-wlan/ssid :Str: SuperSSID
|
||||
radio.1/wlan.13/add-wlan/wep-encryption :Bool: false
|
||||
radio.1/wlan.13/add-wlan/wep-key :Bstr16: .x00000000000000000000000000
|
||||
radio.1/wlan.13/add-wlan/wep-key-index :Byte: 1
|
||||
radio.1/wlan.13/add-wlan/wlan-capability :Word: 1
|
||||
radio.1/wlan.13/add-wlan/wlan-id :Byte: 13
|
||||
radio.1/wtp-radio-information :Dword: 2
|
||||
radio.255/admin-state :Byte: reserved
|
||||
radio.255/operational-state/cause :Byte: Normal
|
||||
radio.255/operational-state/state :Byte: enabled
|
||||
radio/wlan/encryption-policy :Dword: 16777216
|
||||
radio/wlan/radio-od :Byte: 1
|
||||
radio/wlan/wlan-capability :Word: 17
|
||||
radio/wlan/wlan-id :Byte: 0
|
||||
result-code :Dword: 0
|
||||
session-id :Bstr16: .x00006215
|
||||
statistics-timer :Word: 60
|
||||
tube.0/main :Byte: 12
|
||||
tube.0/zumsel :Byte: 12
|
||||
tube.1/main :Byte: 12
|
||||
tube.1/zumsel :Byte: 12
|
||||
wtp-board-data/board-id :Bstr16: .x0000
|
||||
wtp-board-data/mac-address :Bstr16: .x0800276edf58
|
||||
wtp-board-data/model-no :Bstr16: AIR-LAP1131AG-E-K9
|
||||
wtp-board-data/revision :Bstr16: B0
|
||||
wtp-board-data/serial-no :Bstr16: FCZ1441Q0XZ
|
||||
wtp-board-data/vendor :Dword: 4232704
|
||||
wtp-descriptor/bootloader/vendor :Dword: 4232704
|
||||
wtp-descriptor/bootloader/version :Bstr16: .x0c030800
|
||||
wtp-descriptor/hardware/vendor :Dword: 4232704
|
||||
wtp-descriptor/hardware/version :Bstr16: .x01000000
|
||||
wtp-descriptor/max-radios :Byte: 2
|
||||
wtp-descriptor/radios-in-use :Byte: 2
|
||||
wtp-descriptor/software/vendor :Dword: 4232704
|
||||
wtp-descriptor/software/version :Bstr16: .x07007400
|
||||
wtp-fallback :Byte: 1
|
||||
wtp-frame-tunnel-mode :Byte: 4
|
||||
wtp-mac-type :Byte: 1
|
||||
wtp-name :Bstr16: Supertube
|
||||
wtp-reboot-statistics/ac-initiated-count :Word: 2
|
||||
wtp-reboot-statistics/hw-failure-count :Word: 0
|
||||
wtp-reboot-statistics/last-failure-type :Byte: 0
|
||||
wtp-reboot-statistics/link-failure-count :Word: 522
|
||||
wtp-reboot-statistics/other-failure-count :Word: 13
|
||||
wtp-reboot-statistics/reboot-count :Word: 0
|
||||
wtp-reboot-statistics/sw-failure-count :Word: 0
|
||||
wtp-reboot-statistics/unknown-failure-count :Word: 0
|
@ -10,23 +10,11 @@
|
||||
#include "cfg.h"
|
||||
|
||||
|
||||
static int config_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_ptr, int elems_len)
|
||||
{
|
||||
struct cw_DiscoveryResults *results = (struct cw_DiscoveryResults *)params->conn->data;
|
||||
cw_dbg(DBG_X,"Configurations status response received");
|
||||
cw_cfg_dump(params->cfg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int configure(struct cw_Conn * conn)
|
||||
{
|
||||
char sockbuff[SOCK_ADDR_BUFSIZE];
|
||||
|
||||
// cw_dbg_ktv_dump(conn->local_cfg,DBG_INFO,"KTV DUMP ----------------","LOCAL:", "DUMP done -------");
|
||||
|
||||
cw_conn_set_msg_cb(conn,CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,config_cb);
|
||||
cw_dbg_ktv_dump(conn->local_cfg,DBG_INFO,"KTV DUMP ----------------","LOCAL:", "DUMP done -------");
|
||||
|
||||
int rc;
|
||||
rc = cw_send_request(conn, CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST);
|
||||
@ -47,7 +35,7 @@ int configure(struct cw_Conn * conn)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"Config ***","CFG: ", "End config ***");
|
||||
cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"Config ***","CFG: ", "End config ***");
|
||||
|
||||
// cw_ktv_set_byte(conn->remote_cfg,"
|
||||
/*exit(0);*/
|
||||
|
@ -29,6 +29,7 @@ static int discovery_cb(struct cw_ElemHandlerParams * params, uint8_t * elems_pt
|
||||
// cw_cfg_copy(params->cfg,cfg);
|
||||
|
||||
cw_discovery_results_add(results,params->cfg,params->conn->global_cfg);
|
||||
printf("Have Discovery %d\n",results->nr);
|
||||
|
||||
// cw_cfg_dump(params->cfg);
|
||||
// mlist_append_ptr(dis->results, cfg);
|
||||
@ -45,9 +46,9 @@ static struct cw_DiscoveryResults * run_discovery(struct cw_Conn *conn)
|
||||
results = cw_discovery_results_create();
|
||||
|
||||
|
||||
min = cw_cfg_get_byte(conn->global_cfg,"capwap-timers/min-discovery-interval",
|
||||
min = cw_cfg_get_byte(conn->local_cfg,"capwap-timers/min-discovery-interval",
|
||||
CAPWAP_MIN_DISCOVERY_INTERVAL);
|
||||
max = cw_cfg_get_byte(conn->global_cfg,"capwap-timers/max-discovery-interval",
|
||||
max = cw_cfg_get_byte(conn->local_cfg,"capwap-timers/max-discovery-interval",
|
||||
CAPWAP_MAX_DISCOVERY_INTERVAL);
|
||||
|
||||
delay = cw_randint(min,max);
|
||||
@ -59,12 +60,15 @@ static struct cw_DiscoveryResults * run_discovery(struct cw_Conn *conn)
|
||||
|
||||
conn->capwap_state = CAPWAP_STATE_DISCOVERY;
|
||||
|
||||
conn->remote_cfg=cw_cfg_create();
|
||||
/* create and send a discovery request message */
|
||||
cw_init_request(conn, CAPWAP_MSG_DISCOVERY_REQUEST);
|
||||
cw_compose_message(conn, conn->req_buffer);
|
||||
cw_assemble_message(conn, conn->req_buffer);
|
||||
|
||||
|
||||
conn_send_msg(conn, conn->req_buffer);
|
||||
cw_cfg_destroy(conn->remote_cfg);
|
||||
conn->remote_cfg=NULL;
|
||||
|
||||
|
||||
|
||||
@ -81,6 +85,7 @@ static struct cw_DiscoveryResults * run_discovery(struct cw_Conn *conn)
|
||||
while (!cw_timer_timeout(timer)
|
||||
&& conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
|
||||
int rc;
|
||||
cw_dbg(DBG_X,"READ NOW");
|
||||
// conn->remote_cfg = cw_ktv_create();
|
||||
// if (conn->remote_cfg == NULL) {
|
||||
// cw_log_errno("Can't allocate memory for remote_cfg");
|
||||
|
@ -154,10 +154,10 @@ static int run_join_d(struct cw_Conn * conn, struct sockaddr *sa,cw_Cfg_t * cfg)
|
||||
cw_dbg(DBG_DTLS, "DTLS Connection successful established with %s",
|
||||
sock_addr2str(sa,addrstr));
|
||||
|
||||
// conn->remote_cfg=cfg;
|
||||
rc = run_join(conn);
|
||||
// conn->remote_cfg=NULL;
|
||||
return rc;
|
||||
conn->remote_cfg=cfg;
|
||||
run_join(conn);
|
||||
conn->remote_cfg=NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@ -214,16 +214,53 @@ int join(struct cw_Conn * conn, struct cw_DiscoveryResults * results)
|
||||
|
||||
sock_strtoaddr(e->ip,(struct sockaddr*)(&sockaddr));
|
||||
sock_setport((struct sockaddr*)&sockaddr,5246);
|
||||
|
||||
cw_cfg_clear(conn->remote_cfg);
|
||||
cw_cfg_copy(e->cfg,conn->remote_cfg);
|
||||
rc = run_join_d(conn,(struct sockaddr*)(&sockaddr),e->cfg);
|
||||
if (rc)
|
||||
return 1;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
stop();
|
||||
/*
|
||||
mavliter_t ii;
|
||||
mavliter_init(&ii,dis->prio_ip);
|
||||
|
||||
mavliter_foreach(&ii){
|
||||
int rc;
|
||||
cw_Val_t * val,*ac;
|
||||
mavl_t rcfg;
|
||||
char * rk;
|
||||
char ipstr[100];
|
||||
char ac_name[CAPWAP_MAX_AC_NAME_LEN];
|
||||
struct sockaddr_storage sockaddr;
|
||||
|
||||
val = mavliter_get(&ii);
|
||||
rk = val->key;
|
||||
val = val->val.ptr;
|
||||
val->type->to_str(val, ipstr, 100);
|
||||
|
||||
rcfg = cw_ktv_get_sysptr(dis->prio_ac,rk,NULL);
|
||||
|
||||
ac=cw_ktv_get(rcfg,"ac-name",CW_TYPE_BSTR16);
|
||||
if (ac != NULL){
|
||||
ac->type->to_str(ac,ac_name,sizeof(ac_name));
|
||||
}
|
||||
else{
|
||||
strcpy(ac_name,"");
|
||||
}
|
||||
|
||||
|
||||
cw_dbg(DBG_INFO, "Going to join CAPWAP controller '%s' at %s.",ac_name,ipstr);
|
||||
|
||||
conn->remote_cfg=rcfg;
|
||||
|
||||
sock_strtoaddr(ipstr,(struct sockaddr*)(&sockaddr));
|
||||
sock_setport((struct sockaddr*)&sockaddr,5246);
|
||||
rc = run_join_d(conn,(struct sockaddr*)(&sockaddr));
|
||||
if (rc)
|
||||
return 1;
|
||||
|
||||
}*/
|
||||
return 0;
|
||||
}
|
||||
|
@ -3,7 +3,6 @@
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "cw/cw.h"
|
||||
#include "cw/capwap.h"
|
||||
#include "cw/conn.h"
|
||||
#include "cw/radioinfo.h"
|
||||
@ -150,7 +149,7 @@ int run(struct cw_Conn * conn)
|
||||
|
||||
do {
|
||||
|
||||
int echo_interval = cw_cfg_get_byte(conn->global_cfg,"capwap-timers/echo-interval",CAPWAP_ECHO_INTERVAL);
|
||||
int echo_interval = cw_ktv_get_byte(conn->local_cfg,"capwap-timers/echo-interval",CAPWAP_ECHO_INTERVAL);
|
||||
|
||||
/*mbag_get_word(conn->config,CW_ITEM_CAPWAP_TIMERS,CW_TIMERS)&0xff;*/
|
||||
|
||||
@ -174,12 +173,12 @@ printf("---------------------- cwrsult is not ok\n");
|
||||
}
|
||||
|
||||
printf("lalalala\n");
|
||||
//cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"KTV DUMP ----------------","Remote:", "DUMP done -------");
|
||||
cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"KTV DUMP ----------------","Remote:", "DUMP done -------");
|
||||
|
||||
// printf("Saving Config\n");
|
||||
// mavl_merge(conn->local_cfg,conn->remote_cfg);
|
||||
// cw_ktv_save(conn->local_cfg,"cisco.ktv");
|
||||
// clean_cfg(conn->remote_cfg);
|
||||
printf("Saving Config\n");
|
||||
mavl_merge(conn->local_cfg,conn->remote_cfg);
|
||||
cw_ktv_save(conn->local_cfg,"cisco.ktv");
|
||||
clean_cfg(conn->remote_cfg);
|
||||
|
||||
cw_dbg(DBG_X,"We hav a message processed");
|
||||
update=1;
|
||||
|
@ -145,6 +145,7 @@ int main (int argc, char **argv)
|
||||
conn->dtls_mtu = 1200;
|
||||
conn->msgset=msgset;
|
||||
conn->global_cfg = global_cfg;
|
||||
conn->local_cfg = cw_cfg_create();
|
||||
//conn->remote_cfg = cw_cfg_create();
|
||||
|
||||
conn->role = CW_ROLE_WTP;
|
||||
@ -182,27 +183,28 @@ int main (int argc, char **argv)
|
||||
results = cw_run_discovery(conn, "255.255.255.255","192.168.0.14");
|
||||
|
||||
// mavl_del_all(conn->remote_cfg);
|
||||
if (!join(conn,results)){
|
||||
join(conn,results);
|
||||
|
||||
cw_discovery_results_destroy(results);
|
||||
rc = 0;
|
||||
printf("Goto errx 0");
|
||||
goto errX;
|
||||
}
|
||||
|
||||
configure(conn);
|
||||
|
||||
cw_discovery_results_destroy(results);
|
||||
|
||||
// clean_cfg(conn->remote_cfg);
|
||||
// mavl_merge(conn->local_cfg,conn->remote_cfg);
|
||||
|
||||
mavl_del_all(conn->remote_cfg);
|
||||
printf("JOIN CONF\n");
|
||||
configure(conn);
|
||||
clean_cfg(conn->remote_cfg);
|
||||
mavl_merge(conn->local_cfg,conn->remote_cfg);
|
||||
|
||||
|
||||
changestate(conn);
|
||||
|
||||
|
||||
run(conn);
|
||||
rc = 0;
|
||||
printf("Goto errx 0\n");
|
||||
goto errX;
|
||||
|
||||
|
||||
// cw_discovery_free_results(&dis);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user