diff --git a/ac.project b/ac.project
index f5cbdfed..89e35b07 100644
--- a/ac.project
+++ b/ac.project
@@ -22,7 +22,6 @@
-
diff --git a/src/wtp/discovery.c b/src/wtp/discovery.c
index 33e817f6..2005c06e 100644
--- a/src/wtp/discovery.c
+++ b/src/wtp/discovery.c
@@ -17,20 +17,26 @@
#include "wtp.h"
-mavl_t cw_select_ac(mavl_t local_cfg, mlist_t aclist)
+
+
+
+int cw_select_ac(mavl_t local_cfg, struct cw_DiscoveryResult * dis)
{
mlistelem_t *e;
- mavl_t iplist;
+ /*mavl_t iplist;*/
int en;
- iplist = cw_ktv_create();
- if (iplist == NULL)
- return 0;
+ /*iplist = cw_ktv_create();
+ if (iplist == NULL){
+ cw_log_errno("cw_select_ac: Can't allocate memory for aciplist");
+ return NULL;
+ }
+ */
en = 0;
/* for each discovery response */
- mlist_foreach(e, aclist) {
+ mlist_foreach(e, dis->results) {
char acname[CAPWAP_MAX_AC_NAME_LEN + 1];
char key[CW_KTV_MAX_KEY_LEN];
mavl_t remote_cfg;
@@ -61,13 +67,12 @@ mavl_t cw_select_ac(mavl_t local_cfg, mlist_t aclist)
if (val == NULL)
break;
-
sprintf(key, "%s.%d", "capwap-control-ip-address/address", i);
ipval = cw_ktv_get(remote_cfg, key, CW_TYPE_IPADDRESS);
sprintf(key, "%04d%05d%04d", prio, val->val.word, en);
- cw_ktv_add(iplist, key, CW_TYPE_SYSPTR, (uint8_t *) (&ipval),
+ cw_ktv_add(dis->prio_ip, key, CW_TYPE_SYSPTR, (uint8_t *) (&ipval),
sizeof(ipval));
i++;
en++;
@@ -75,32 +80,48 @@ mavl_t cw_select_ac(mavl_t local_cfg, mlist_t aclist)
}
- cw_dbg_ktv_dump(iplist, DBG_INFO, "=== IP list ===", "IP", "=== END IP List ===");
- {
- mavliter_t i;
- mavliter_init(&i, iplist);
- mavliter_foreach(&i) {
- char ipstr[100];
- char *rk;
- cw_KTV_t *val;
- val = mavliter_get(&i);
- rk = val->key;
- val = val->val.ptr;
- val->type->to_str(val, ipstr, 100);
- printf("PTRVAL(%s): %s - %s\n", rk, val->key, ipstr);
- }
- }
+ return 1;
+}
+
+
+void cw_discovery_free_results(struct cw_DiscoveryResult * dis)
+{
+ if (dis->prio_ac != NULL)
+ mavl_destroy(dis->prio_ac);
+ if (dis->prio_ip != NULL)
+ mavl_destroy(dis->prio_ip);
+ if (dis->results != NULL)
+ mlist_destroy(dis->results);
+}
+
+
+
+int cw_discovery_init_results(struct cw_DiscoveryResult *dis)
+{
+ dis->results = mlist_create(NULL, NULL, sizeof(void *));
+ if (dis->results==NULL)
+ goto errX;
+ dis->prio_ac=cw_ktv_create();
+ if (dis->prio_ac==NULL)
+ goto errX;
+ dis->prio_ip=cw_ktv_create();
+ if (dis->prio_ac==NULL)
+ goto errX;
+ return 1;
+errX:
+ cw_discovery_free_results(dis);
return 0;
}
-static int run_discovery(struct conn *conn)
+
+static int run_discovery(struct conn *conn, struct cw_DiscoveryResult * dis)
{
time_t timer;
- mlist_t discovery_results;
struct sockaddr_storage from;
int delay, min, max;
+
min = cw_ktv_get_byte(conn->local_cfg,"capwap-timers/min-discovery-interval",
@@ -127,7 +148,9 @@ static int run_discovery(struct conn *conn)
timer = cw_timer_start(cw_ktv_get_byte(conn->local_cfg, "discovery-interval",
CAPWAP_DISCOVERY_INTERVAL))-1;
- discovery_results = mlist_create(NULL, NULL, sizeof(void *));
+ /*discovery_results = mlist_create(NULL, NULL, sizeof(void *));*/
+
+
while (!cw_timer_timeout(timer)
&& conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
int rc;
@@ -149,26 +172,35 @@ static int run_discovery(struct conn *conn)
}
cw_dbg(DBG_INFO, "Received Discovery Response from %s",
sock_addr2str(&from, addr_str));
- mlist_append_ptr(discovery_results, conn->remote_cfg);
+ mlist_append_ptr(dis->results, conn->remote_cfg);
}
- cw_select_ac(conn->local_cfg, discovery_results);
+ cw_select_ac(conn->local_cfg, dis);
return 1;
}
+
+
+
/**
* Run discovery for on address (eg broadcast 255.255.255.255)
*/
-int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
+int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr,
+ struct cw_DiscoveryResult * dis)
{
char sock_buf[SOCK_ADDR_BUFSIZE];
struct sockaddr_storage dstaddr;
char caddr[256], control_port[64];
int rc;
+ /*struct cw_DiscoveryResult dis;*/
+
+
+ /*dis.results = mlist_create(NULL, NULL, sizeof(void *));*/
+
/* get addr of destination */
struct addrinfo hints;
@@ -258,7 +290,7 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
cw_dbg(DBG_INFO, "Discovery to %s",
sock_addr2str_p(&conn->addr, sock_buf));
- run_discovery(conn);
+ run_discovery(conn, dis);
conn->readfrom = NULL;
close(sockfd);
diff --git a/src/wtp/wtp.h b/src/wtp/wtp.h
index 9d1ba92a..3d1c12da 100644
--- a/src/wtp/wtp.h
+++ b/src/wtp/wtp.h
@@ -14,9 +14,20 @@ extern int configure();
extern int run();
extern int changestate();
-int cw_run_discovery(struct conn *conn, const char *acaddr, const char *bindaddr);
+struct cw_DiscoveryResult{
+ mavl_t prio_ip;
+ mavl_t prio_ac;
+ mlist_t results;
+};
+
+int cw_run_discovery(struct conn *conn, const char *acaddr, const char *bindaddr,
+ struct cw_DiscoveryResult * dis);
+
+int cw_discovery_init_results(struct cw_DiscoveryResult *dis);
+void cw_discovery_free_results(struct cw_DiscoveryResult * dis);
+
struct conn * get_conn();
#endif
diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c
index 5f1cf759..483b7b7d 100644
--- a/src/wtp/wtp_main.c
+++ b/src/wtp/wtp_main.c
@@ -156,7 +156,29 @@ int main (int argc, char **argv)
conn->receiver = CW_RECEIVER_WTP;
conn->wbid=1;
- cw_run_discovery(conn, "255.255.255.255",NULL);
+ struct cw_DiscoveryResult dis;
+ cw_discovery_init_results(&dis);
+
+
+
+ cw_run_discovery(conn, "255.255.255.255",NULL, &dis);
+
+ cw_dbg_ktv_dump(dis.prio_ip, DBG_INFO, "=== IP list ===", "IP", "=== END IP List ===");
+ {
+ mavliter_t i;
+ mavliter_init(&i, dis.prio_ip);
+
+ mavliter_foreach(&i) {
+ char ipstr[100];
+ char *rk;
+ cw_KTV_t *val;
+ val = mavliter_get(&i);
+ rk = val->key;
+ val = val->val.ptr;
+ val->type->to_str(val, ipstr, 100);
+ printf("PTRVAL(%s): %s - %s\n", rk, val->key, ipstr);
+ }
+ }
return (EXIT_SUCCESS);