WTP can run discoveryw/o memory leaks
This commit is contained in:
@ -202,7 +202,9 @@ MISCSRC=\
|
||||
strheap.c\
|
||||
netconn.c\
|
||||
conn.c \
|
||||
val.c
|
||||
val.c \
|
||||
discovery.c\
|
||||
|
||||
|
||||
# conn_q_wait_packet.c\
|
||||
# conn_init.c\
|
||||
|
@ -625,6 +625,9 @@ int cw_cfg_set_val(cw_Cfg_t * cfg, const char *key, const struct cw_Type *type,
|
||||
return 1;
|
||||
}
|
||||
|
||||
//int cw_cfg_put(cw_Cfg_t *cfg, const char *key, const struct cw_Type *type,const void
|
||||
|
||||
|
||||
|
||||
void cw_cfg_copy(cw_Cfg_t *src, cw_Cfg_t *dst)
|
||||
{
|
||||
|
@ -155,6 +155,7 @@ int cw_assemble_message(struct cw_Conn *conn, uint8_t * rawout)
|
||||
|
||||
|
||||
cw_decode_elements( ¶ms, elems_ptr,elems_len);
|
||||
cw_cfg_destroy(cfg);
|
||||
|
||||
printf ("----------------------------------- end redecode -----------------------------\n");
|
||||
|
||||
@ -459,20 +460,6 @@ int cw_in_check_generic(struct cw_Conn *conn, struct cw_action_in *a, uint8_t *
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
void cw_read_elem(struct cw_ElemHandler * handler, struct cw_Conn * conn,
|
||||
uint8_t * elem_data, int elem_len, struct sockaddr * from){
|
||||
mavldata_t data, *result;
|
||||
char str[30];
|
||||
|
||||
result = handler->type->get(&data,elem_data,elem_len);
|
||||
|
||||
handler->type->to_str(result,str,30);
|
||||
printf("Read %d-%s: %s %s\n", handler->id, handler->name, handler->key, str);
|
||||
//mavl_insert(conn->remote_cfg
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
struct sockaddr *from)
|
||||
@ -638,7 +625,7 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
cw_dbg(DBG_MSG_PARSING, "*** Parsing message of type %d - (%s) ***",
|
||||
message->type, message->name);
|
||||
|
||||
params.cfg = cw_cfg_create(); //conn->remote_cfg;
|
||||
params.cfg = cw_cfg_create();
|
||||
params.cfg_list[0]=params.cfg;
|
||||
params.cfg_list[1]=conn->local_cfg;
|
||||
params.cfg_list[2]=conn->global_cfg;
|
||||
@ -705,7 +692,10 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
* Put further actions here, if needed.
|
||||
*/
|
||||
}
|
||||
|
||||
mlist_destroy(unrecognized);
|
||||
cw_cfg_destroy(params.cfg);
|
||||
conn->remote_cfg=NULL;
|
||||
|
||||
return result_code;
|
||||
|
||||
@ -955,6 +945,15 @@ void conn_destroy(struct cw_Conn * conn)
|
||||
if (conn->msg_callbacks)
|
||||
mavl_destroy(conn->msg_callbacks);
|
||||
|
||||
if (conn->base_rmac)
|
||||
free(conn->base_rmac);
|
||||
|
||||
if (conn->remote_cfg)
|
||||
cw_cfg_destroy(conn->remote_cfg);
|
||||
|
||||
if (conn->local_cfg)
|
||||
cw_cfg_destroy(conn->local_cfg);
|
||||
|
||||
free(conn);
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,7 @@ struct cw_Conn {
|
||||
|
||||
|
||||
mavl_t remote_cfg;
|
||||
mavl_t default_cfg;
|
||||
// mavl_t default_cfg;
|
||||
mavl_t update_cfg;
|
||||
mavl_t local_cfg;
|
||||
mavl_t global_cfg;
|
||||
|
@ -38,7 +38,7 @@ int cw_read_wtp_descriptor(mavl_t cfg, struct cw_Conn *conn,
|
||||
"Non standard conform WTP Descriptor, number of encryptoin elements is 0.");
|
||||
}
|
||||
|
||||
sprintf(key,"%s/%s",eh->key, CW_SKEY_MAX_RADIOS);
|
||||
sprintf(key,"%s/%s",eh->key, "max-radios");
|
||||
cw_ktv_add(cfg,key,CW_TYPE_BYTE,NULL,data,1);
|
||||
|
||||
sprintf(key,"%s/%s",eh->key, CW_SKEY_RADIOS_IN_USE);
|
||||
|
@ -29,7 +29,7 @@ int cw_read_wtp_descriptor_7(mavl_t cfg, struct cw_Conn *conn,
|
||||
int pos;
|
||||
char key[64];
|
||||
|
||||
sprintf(key,"%s/%s",eh->key, CW_SKEY_MAX_RADIOS);
|
||||
sprintf(key,"%s/%s",eh->key, "max-radios");
|
||||
cw_cfg_set_int(cfg,key,cw_get_byte(data));
|
||||
|
||||
sprintf(key,"%s/%s",eh->key, CW_SKEY_RADIOS_IN_USE);
|
||||
|
120
src/cw/discovery.c
Normal file
120
src/cw/discovery.c
Normal file
@ -0,0 +1,120 @@
|
||||
|
||||
#include "discovery.h"
|
||||
|
||||
#include "dbg.h"
|
||||
|
||||
static int cmp(const void *v1, const void *v2)
|
||||
{
|
||||
int rc;
|
||||
struct cw_DiscoveryResults_elem *e1,*e2;
|
||||
e1=(struct cw_DiscoveryResults_elem *)v1;
|
||||
e2=(struct cw_DiscoveryResults_elem *)v2;
|
||||
|
||||
rc = e1->prio - e2->prio;
|
||||
if (rc != 0)
|
||||
return rc;
|
||||
rc = e1->wtps - e2->wtps;
|
||||
if (rc != 0)
|
||||
return rc;
|
||||
|
||||
return e1->ctr-e2->ctr;
|
||||
}
|
||||
|
||||
static void del(void *r)
|
||||
{
|
||||
struct cw_DiscoveryResults_elem *e = (struct cw_DiscoveryResults_elem *)r;
|
||||
cw_cfg_destroy(e->cfg);
|
||||
}
|
||||
|
||||
struct cw_DiscoveryResults *cw_discovery_results_create()
|
||||
{
|
||||
struct cw_DiscoveryResults *dis;
|
||||
|
||||
dis = malloc(sizeof(struct cw_DiscoveryResults));
|
||||
if (dis == NULL)
|
||||
return NULL;
|
||||
|
||||
dis->nr = 0;
|
||||
dis->list =
|
||||
mavl_create(cmp, del, sizeof(struct cw_DiscoveryResults_elem));
|
||||
if (dis->list == NULL) {
|
||||
cw_discovery_results_destroy(dis);
|
||||
return NULL;
|
||||
}
|
||||
return dis;
|
||||
}
|
||||
|
||||
void cw_discovery_results_destroy(struct cw_DiscoveryResults *r)
|
||||
{
|
||||
if (r->list)
|
||||
mavl_destroy(r->list);
|
||||
free(r);
|
||||
}
|
||||
|
||||
void cw_discovery_results_add(struct cw_DiscoveryResults *dis,
|
||||
cw_Cfg_t * ac_cfg, cw_Cfg_t * wtp_cfg)
|
||||
{
|
||||
|
||||
const char *acname;
|
||||
char key[CW_CFG_MAX_KEY_LEN];
|
||||
struct cw_DiscoveryResults_elem e;
|
||||
int i;
|
||||
|
||||
/* get ac name */
|
||||
acname = cw_cfg_get(ac_cfg, "capwap/ac-name", NULL);
|
||||
if (acname == NULL) {
|
||||
/* this should not happen, because AC Name is a
|
||||
* amndatory message element */
|
||||
e.prio = 255;
|
||||
} else {
|
||||
/* Get priority for AC from
|
||||
* ac-name-with-priority list */
|
||||
sprintf(key, "ac-name-with-priority/%s", acname);
|
||||
e.prio = cw_cfg_get_byte(wtp_cfg, key, 255);
|
||||
}
|
||||
|
||||
/* for each control ip address the AC has sent */
|
||||
i = 0;
|
||||
do {
|
||||
const char *ipval;
|
||||
|
||||
sprintf(key, "capwap-control-ip-address.%d/wtps", i);
|
||||
e.wtps = cw_cfg_get_word(ac_cfg, key, 65535);
|
||||
|
||||
|
||||
// cw_dbg(DBG_X, "WTPS %d, K: %s", e.wtps);
|
||||
if (e.wtps == 65535)
|
||||
break;
|
||||
|
||||
sprintf(key, "capwap-control-ip-address.%d/address", i);
|
||||
ipval = cw_cfg_get(ac_cfg, key, "");
|
||||
|
||||
sprintf(key, "%04d%05d%04d", e.prio, e.wtps, dis->nr);
|
||||
|
||||
e.ctr=dis->list->count;
|
||||
|
||||
i++;
|
||||
e.cfg = cw_cfg_create();
|
||||
if (e.cfg == NULL)
|
||||
continue;
|
||||
|
||||
cw_cfg_copy(ac_cfg,e.cfg);
|
||||
|
||||
strcpy(e.ip,ipval);
|
||||
|
||||
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++;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
29
src/cw/discovery.h
Normal file
29
src/cw/discovery.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef DISCOVERY_H
|
||||
#define DISCOVERY_H
|
||||
|
||||
#include <mavl.h>
|
||||
|
||||
#include "cfg.h"
|
||||
|
||||
|
||||
struct cw_DiscoveryResults_elem {
|
||||
uint32_t key;
|
||||
char ip[64];
|
||||
cw_Cfg_t * cfg;
|
||||
int prio;
|
||||
int wtps;
|
||||
int ctr;
|
||||
};
|
||||
|
||||
struct cw_DiscoveryResults
|
||||
{
|
||||
int nr;
|
||||
struct mavl * list;
|
||||
};
|
||||
|
||||
void cw_discovery_results_destroy(struct cw_DiscoveryResults *dis);
|
||||
struct cw_DiscoveryResults * cw_discovery_results_create();
|
||||
void cw_discovery_results_add(struct cw_DiscoveryResults *dis, cw_Cfg_t *ac_cfg, cw_Cfg_t * wtp_cfg);
|
||||
void cw_discovery_results_destroy(struct cw_DiscoveryResults * r);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user