Discovery with wait an select ist ready...
FossilOrigin-Name: 115fa489fbb4aa197e8390d40abcea80a8d4f954fecab348ce2862d2a20523c2
This commit is contained in:
parent
d0e8d2c6fd
commit
bbc64dd0a7
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<CodeLite_Workspace Name="actube" Database="">
|
<CodeLite_Workspace Name="actube" Database="">
|
||||||
<Project Name="ac" Path="ac.project" Active="Yes"/>
|
<Project Name="ac" Path="ac.project" Active="No"/>
|
||||||
<Project Name="wtp" Path="wtp.project" Active="No"/>
|
<Project Name="wtp" Path="wtp.project" Active="Yes"/>
|
||||||
<Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/>
|
<Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/>
|
||||||
<Project Name="mod_capwap" Path="mod_capwap.project" Active="No"/>
|
<Project Name="mod_capwap" Path="mod_capwap.project" Active="No"/>
|
||||||
<Project Name="mod_cisco" Path="mod_cisco.project" Active="No"/>
|
<Project Name="mod_cisco" Path="mod_cisco.project" Active="No"/>
|
||||||
|
@ -265,6 +265,8 @@
|
|||||||
<File Name="src/cw/cw_read_from.c"/>
|
<File Name="src/cw/cw_read_from.c"/>
|
||||||
<File Name="src/cw/cw_write_radio_element.c"/>
|
<File Name="src/cw/cw_write_radio_element.c"/>
|
||||||
<File Name="src/cw/cw_type_sysptr.c"/>
|
<File Name="src/cw/cw_type_sysptr.c"/>
|
||||||
|
<File Name="src/cw/log_errno.c"/>
|
||||||
|
<File Name="src/cw/cw_randint.c"/>
|
||||||
</VirtualDirectory>
|
</VirtualDirectory>
|
||||||
</VirtualDirectory>
|
</VirtualDirectory>
|
||||||
<Description/>
|
<Description/>
|
||||||
|
@ -89,6 +89,7 @@ CWSRC=\
|
|||||||
cw_put_msg.c\
|
cw_put_msg.c\
|
||||||
cw_radio_set_admin_state.c\
|
cw_radio_set_admin_state.c\
|
||||||
cw_rand.c\
|
cw_rand.c\
|
||||||
|
cw_randint.c\
|
||||||
cw_read_ac_descriptor.c\
|
cw_read_ac_descriptor.c\
|
||||||
cw_read_descriptor_subelems.c\
|
cw_read_descriptor_subelems.c\
|
||||||
cw_readelem_statistics_timer.c\
|
cw_readelem_statistics_timer.c\
|
||||||
@ -186,6 +187,7 @@ SOCKSRC=\
|
|||||||
LOGSRC=\
|
LOGSRC=\
|
||||||
log.c\
|
log.c\
|
||||||
log_file.c\
|
log_file.c\
|
||||||
|
log_errno.c\
|
||||||
log_syslog.c\
|
log_syslog.c\
|
||||||
dbg.c\
|
dbg.c\
|
||||||
dbg_strings.c\
|
dbg_strings.c\
|
||||||
|
@ -349,8 +349,10 @@
|
|||||||
|
|
||||||
|
|
||||||
/* capwap timer default values */
|
/* capwap timer default values */
|
||||||
#define CW_DISCOVERY_INTERVAL 5
|
#define CAPWAP_DISCOVERY_INTERVAL 5
|
||||||
#define CW_MAX_DISCOVERY_INTERVAL 20
|
#define CAPWAP_MAX_DISCOVERY_INTERVAL 20
|
||||||
|
#define CAPWAP_MIN_DISCOVERY_INTERVAL 2
|
||||||
|
|
||||||
#define CAPWAP_RETRANSMIT_INTERVAL 3
|
#define CAPWAP_RETRANSMIT_INTERVAL 3
|
||||||
#define CAPWAP_MAX_DISCOVERIES 10
|
#define CAPWAP_MAX_DISCOVERIES 10
|
||||||
#define CAPWAP_MAX_RETRANSMIT 5
|
#define CAPWAP_MAX_RETRANSMIT 5
|
||||||
|
25
src/cw/cw_randint.c
Normal file
25
src/cw/cw_randint.c
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "rand.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get e random integer in a specific range.
|
||||||
|
* @param min minimum value
|
||||||
|
* @param max maximum value
|
||||||
|
* @return The random number, which is greater or equal to min and
|
||||||
|
* less than max.
|
||||||
|
*/
|
||||||
|
uint16_t cw_randint(int min,int max)
|
||||||
|
{
|
||||||
|
uint16_t randval;
|
||||||
|
uint32_t diff;
|
||||||
|
|
||||||
|
diff = max-min;
|
||||||
|
|
||||||
|
cw_rand((uint8_t*)(&randval),sizeof(randval));
|
||||||
|
|
||||||
|
|
||||||
|
return min+diff * randval / 0xffff;
|
||||||
|
}
|
@ -52,6 +52,7 @@ extern struct cw_LogWriter cw_log_console_writer;
|
|||||||
|
|
||||||
void cw_log_init();
|
void cw_log_init();
|
||||||
void cw_log(int level, const char *format, ...);
|
void cw_log(int level, const char *format, ...);
|
||||||
|
void cw_log_errno(char * format, ...);
|
||||||
|
|
||||||
extern const char *cw_log_name;
|
extern const char *cw_log_name;
|
||||||
extern struct cw_LogWriter * cw_log_writers[];
|
extern struct cw_LogWriter * cw_log_writers[];
|
||||||
|
20
src/cw/log_errno.c
Normal file
20
src/cw/log_errno.c
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
void cw_log_errno(char * format, ...)
|
||||||
|
{
|
||||||
|
char str[2048];
|
||||||
|
int err=errno;
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
va_start(args,format);
|
||||||
|
vsprintf(str,format,args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
cw_log(LOG_ERR,"%s: %s",str,strerror(err));
|
||||||
|
|
||||||
|
}
|
@ -74,6 +74,8 @@ struct cw_Mod {
|
|||||||
|
|
||||||
/** used for private data */
|
/** used for private data */
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
|
int (*setup_cfg)(struct conn *conn);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#ifndef __CW_RAND_H
|
#ifndef __CW_RAND_H
|
||||||
#define __CW_RAND_H
|
#define __CW_RAND_H
|
||||||
|
|
||||||
extern int cw_rand(uint8_t*dst, int len);
|
#include <stdint.h>
|
||||||
|
|
||||||
|
int cw_rand(uint8_t*dst, int len);
|
||||||
|
uint16_t cw_randint(int min,int max);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -74,12 +74,18 @@ typedef time_t cw_timer_t;
|
|||||||
* and #cw_clock_lap.
|
* and #cw_clock_lap.
|
||||||
* @param c name of the variable
|
* @param c name of the variable
|
||||||
*
|
*
|
||||||
* Example:
|
* Example
|
||||||
* @code
|
* @code{.c}
|
||||||
|
* #include "cw/timer.h"
|
||||||
|
*
|
||||||
* CW_CLOCK_DEFINE(clk);
|
* CW_CLOCK_DEFINE(clk);
|
||||||
|
* int t;
|
||||||
|
*
|
||||||
* cw_clock_start(clk);
|
* cw_clock_start(clk);
|
||||||
|
*
|
||||||
* @startcomment do something ... @endcomment
|
* @startcomment do something ... @endcomment
|
||||||
* int t = cw_clock_lap(clk);
|
*
|
||||||
|
* t = cw_clock_lap(clk);
|
||||||
* printf("Caclulation took %d seconds\n",t);
|
* printf("Caclulation took %d seconds\n",t);
|
||||||
* @endcode
|
* @endcode
|
||||||
*
|
*
|
||||||
|
@ -11,6 +11,11 @@
|
|||||||
static int init(struct cw_Mod * mod, mavl_t global_cfg, int role)
|
static int init(struct cw_Mod * mod, mavl_t global_cfg, int role)
|
||||||
{
|
{
|
||||||
cw_dbg(DBG_INFO,"CAPWAP: Inititalizing mod_capwap.");
|
cw_dbg(DBG_INFO,"CAPWAP: Inititalizing mod_capwap.");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch (role){
|
switch (role){
|
||||||
case CW_ROLE_AC:{
|
case CW_ROLE_AC:{
|
||||||
cw_dbg(DBG_MOD, "CAPWAP: Initialiazing mod_capwap in AC mode");
|
cw_dbg(DBG_MOD, "CAPWAP: Initialiazing mod_capwap in AC mode");
|
||||||
@ -42,6 +47,14 @@ static int detect(struct conn *conn, const uint8_t * rawmsg, int rawlen, int ele
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int static setup_cfg(struct conn * conn)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct cw_Mod mod_capwap = {
|
struct cw_Mod mod_capwap = {
|
||||||
"capwap", /* name */
|
"capwap", /* name */
|
||||||
@ -49,12 +62,6 @@ struct cw_Mod mod_capwap = {
|
|||||||
detect, /* detect */
|
detect, /* detect */
|
||||||
capwap_register_msg_set, /* register_messages */
|
capwap_register_msg_set, /* register_messages */
|
||||||
NULL, /* dll_handle */
|
NULL, /* dll_handle */
|
||||||
NULL /* data */
|
NULL, /* data */
|
||||||
|
setup_cfg /* setup_cfg */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
struct cw_Mod * mod_capwap(){
|
|
||||||
return &capwap_data;
|
|
||||||
}
|
|
||||||
*/
|
|
@ -1,5 +1,3 @@
|
|||||||
capwap/vars/MaxDiscoveries:Word:10
|
|
||||||
capwap/vars/MaxRetransmit:Word:4
|
|
||||||
|
|
||||||
|
|
||||||
windows:Word:124
|
windows:Word:124
|
||||||
@ -39,4 +37,10 @@ ac-name-with-priority/TubesACx:Byte:3
|
|||||||
ac-name-with-priority/"ac2":Byte:01
|
ac-name-with-priority/"ac2":Byte:01
|
||||||
|
|
||||||
|
|
||||||
|
capwap-timers/max-discovery-interval:Byte:0
|
||||||
|
capwap-timers/min-discovery-interval:Byte:0
|
||||||
|
capwap-timers/echo-interval:Byte:3
|
||||||
|
|
||||||
|
"discovery-interval":Byte:1
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,81 +12,83 @@
|
|||||||
#include "cw/dbg.h"
|
#include "cw/dbg.h"
|
||||||
#include "cw/timer.h"
|
#include "cw/timer.h"
|
||||||
#include "cw/cw.h"
|
#include "cw/cw.h"
|
||||||
|
#include "cw/rand.h"
|
||||||
|
|
||||||
#include "wtp.h"
|
#include "wtp.h"
|
||||||
|
|
||||||
|
|
||||||
int cw_select_ac(mavl_t local_cfg,mlist_t aclist){
|
mavl_t cw_select_ac(mavl_t local_cfg, mlist_t aclist)
|
||||||
mlistelem_t * e;
|
{
|
||||||
|
mlistelem_t *e;
|
||||||
mavl_t iplist;
|
mavl_t iplist;
|
||||||
int en;
|
int en;
|
||||||
|
|
||||||
iplist=cw_ktv_create();
|
iplist = cw_ktv_create();
|
||||||
if (iplist == NULL)
|
if (iplist == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
en=0;
|
en = 0;
|
||||||
|
|
||||||
/* for each discovery response */
|
/* for each discovery response */
|
||||||
mlist_foreach(e,aclist){
|
mlist_foreach(e, aclist) {
|
||||||
char acname[CAPWAP_MAX_AC_NAME_LEN+1];
|
char acname[CAPWAP_MAX_AC_NAME_LEN + 1];
|
||||||
char key[CW_KTV_MAX_KEY_LEN];
|
char key[CW_KTV_MAX_KEY_LEN];
|
||||||
mavl_t remote_cfg;
|
mavl_t remote_cfg;
|
||||||
cw_KTV_t * val, *ipval;
|
cw_KTV_t *val, *ipval;
|
||||||
int prio,i;
|
int prio, i;
|
||||||
|
|
||||||
remote_cfg = mlistelem_get_ptr(e);
|
remote_cfg = mlistelem_get_ptr(e);
|
||||||
|
|
||||||
/* get ac name */
|
/* get ac name */
|
||||||
val = cw_ktv_get(remote_cfg,"ac-name", CW_TYPE_BSTR16);
|
val = cw_ktv_get(remote_cfg, "ac-name", CW_TYPE_BSTR16);
|
||||||
if (val==NULL){
|
if (val == NULL) {
|
||||||
/* this should not happen, because AC Name is a
|
/* this should not happen, because AC Name is a
|
||||||
* amndatory message element */
|
* amndatory message element */
|
||||||
prio=255;
|
prio = 255;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
/* Get priority for AC from
|
/* Get priority for AC from
|
||||||
* ac-name-with-priority list */
|
* ac-name-with-priority list */
|
||||||
val->type->to_str(val,acname,CAPWAP_MAX_AC_NAME_LEN);
|
val->type->to_str(val, acname, CAPWAP_MAX_AC_NAME_LEN);
|
||||||
sprintf(key,"ac-name-with-priority/%s",acname);
|
sprintf(key, "ac-name-with-priority/%s", acname);
|
||||||
prio = cw_ktv_get_byte(local_cfg,key,255);
|
prio = cw_ktv_get_byte(local_cfg, key, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for each control ip address the AC has sent */
|
/* for each control ip address the AC has sent */
|
||||||
i=0;
|
i = 0;
|
||||||
do {
|
do {
|
||||||
sprintf(key,"%s.%d","capwap-control-ip-address/wtps",i);
|
sprintf(key, "%s.%d", "capwap-control-ip-address/wtps", i);
|
||||||
val = cw_ktv_get(remote_cfg,key,CW_TYPE_WORD);
|
val = cw_ktv_get(remote_cfg, key, CW_TYPE_WORD);
|
||||||
if (val == NULL)
|
if (val == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
sprintf(key,"%s.%d","capwap-control-ip-address/address",i);
|
sprintf(key, "%s.%d", "capwap-control-ip-address/address", i);
|
||||||
ipval = cw_ktv_get(remote_cfg,key,CW_TYPE_IPADDRESS);
|
ipval = cw_ktv_get(remote_cfg, key, CW_TYPE_IPADDRESS);
|
||||||
|
|
||||||
sprintf(key,"%04d%05d%04d",prio,val->val.word,en);
|
sprintf(key, "%04d%05d%04d", prio, val->val.word, en);
|
||||||
|
|
||||||
cw_ktv_add(iplist,key,CW_TYPE_SYSPTR,(uint8_t*)(&ipval),sizeof(ipval));
|
cw_ktv_add(iplist, key, CW_TYPE_SYSPTR, (uint8_t *) (&ipval),
|
||||||
|
sizeof(ipval));
|
||||||
i++;
|
i++;
|
||||||
en++;
|
en++;
|
||||||
}while(1);
|
} while (1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cw_dbg_ktv_dump(iplist,DBG_INFO,"=== IP list ===", "IP", "=== END IP List ===");
|
cw_dbg_ktv_dump(iplist, DBG_INFO, "=== IP list ===", "IP", "=== END IP List ===");
|
||||||
{
|
{
|
||||||
mavliter_t i;
|
mavliter_t i;
|
||||||
mavliter_init(&i,iplist);
|
mavliter_init(&i, iplist);
|
||||||
|
|
||||||
mavliter_foreach(&i){
|
mavliter_foreach(&i) {
|
||||||
char ipstr[100];
|
char ipstr[100];
|
||||||
char *rk;
|
char *rk;
|
||||||
cw_KTV_t * val;
|
cw_KTV_t *val;
|
||||||
val = mavliter_get(&i);
|
val = mavliter_get(&i);
|
||||||
rk = val->key;
|
rk = val->key;
|
||||||
val = val->val.ptr;
|
val = val->val.ptr;
|
||||||
val->type->to_str(val,ipstr,100);
|
val->type->to_str(val, ipstr, 100);
|
||||||
printf("PTRVAL(%s): %s - %s\n",rk,val->key,ipstr);
|
printf("PTRVAL(%s): %s - %s\n", rk, val->key, ipstr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,77 +97,65 @@ int cw_select_ac(mavl_t local_cfg,mlist_t aclist){
|
|||||||
|
|
||||||
static int run_discovery(struct conn *conn)
|
static int run_discovery(struct conn *conn)
|
||||||
{
|
{
|
||||||
/*// conn->incomming = mbag_create();*/
|
|
||||||
time_t timer;
|
time_t timer;
|
||||||
/* uint8_t dtype=0;*/
|
|
||||||
mlist_t discovery_results;
|
mlist_t discovery_results;
|
||||||
struct sockaddr_storage from;
|
struct sockaddr_storage from;
|
||||||
|
int delay, min, max;
|
||||||
|
|
||||||
|
|
||||||
|
min = cw_ktv_get_byte(conn->local_cfg,"capwap-timers/min-discovery-interval",
|
||||||
|
CAPWAP_MIN_DISCOVERY_INTERVAL);
|
||||||
|
max = cw_ktv_get_byte(conn->local_cfg,"capwap-timers/max-discovery-interval",
|
||||||
|
CAPWAP_MAX_DISCOVERY_INTERVAL);
|
||||||
|
|
||||||
|
delay = cw_randint(min,max);
|
||||||
|
if (delay>0){
|
||||||
|
cw_dbg(DBG_INFO,"Sleeping for %d seconds before sending Discovery Request.", delay);
|
||||||
|
sleep(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
conn->capwap_state = CAPWAP_STATE_DISCOVERY;
|
conn->capwap_state = CAPWAP_STATE_DISCOVERY;
|
||||||
|
|
||||||
|
|
||||||
/*cw_ktv_add(conn->local_cfg, "discovery-type", CW_TYPE_BYTE, &dtype,17);*/
|
/* create and send a discovery request message */
|
||||||
|
|
||||||
|
|
||||||
cw_init_request(conn, CAPWAP_MSG_DISCOVERY_REQUEST);
|
cw_init_request(conn, CAPWAP_MSG_DISCOVERY_REQUEST);
|
||||||
cw_put_msg(conn, conn->req_buffer);
|
cw_put_msg(conn, conn->req_buffer);
|
||||||
conn_send_msg(conn, conn->req_buffer);
|
conn_send_msg(conn, conn->req_buffer);
|
||||||
|
|
||||||
|
|
||||||
timer = cw_timer_start(0);
|
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)
|
while (!cw_timer_timeout(timer)
|
||||||
&& conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
|
&& conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
|
||||||
int rc;
|
int rc;
|
||||||
char addr_str[SOCK_ADDR_BUFSIZE];
|
char addr_str[SOCK_ADDR_BUFSIZE];
|
||||||
/*mavl_del_all(conn->incomming);*/
|
|
||||||
|
|
||||||
rc = cw_read_from(conn, &from);
|
conn->remote_cfg = cw_ktv_create();
|
||||||
if (rc<0) {
|
if (conn->remote_cfg == NULL) {
|
||||||
if (errno==EAGAIN)
|
cw_log_errno("Can't allocate memory for remote_cfg");
|
||||||
continue;
|
|
||||||
|
|
||||||
cw_log(LOG_ERROR,"Error reading messages: %s",strerror(errno));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cw_dbg(DBG_INFO,"Received Discovery Response from %s", sock_addr2str(&from,addr_str));
|
|
||||||
mlist_append_ptr(discovery_results,conn->remote_cfg);
|
rc = cw_read_from(conn, &from);
|
||||||
conn->remote_cfg=cw_ktv_create();
|
if (rc < 0) {
|
||||||
|
if (errno == EAGAIN)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
cw_log(LOG_ERROR, "Error reading messages: %s", strerror(errno));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cw_dbg(DBG_INFO, "Received Discovery Response from %s",
|
||||||
|
sock_addr2str(&from, addr_str));
|
||||||
|
mlist_append_ptr(discovery_results, conn->remote_cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
cw_select_ac(conn->local_cfg,discovery_results);
|
cw_select_ac(conn->local_cfg, discovery_results);
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
mbag_t discs;
|
|
||||||
discs = mbag_get_mavl(conn->remote, CW_ITEM_DISCOVERIES);
|
|
||||||
|
|
||||||
|
|
||||||
if (!discs) {
|
|
||||||
cw_log(LOG_ERR,"No discovery responses received");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
cw_aciplist_t list = cw_select_ac(conn, discs);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DEFINE_AVLITER(ii,list);
|
|
||||||
avliter_foreach(&ii){
|
|
||||||
cw_acip_t * ip = avliter_get(&ii);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mavl_del_all(conn->remote);
|
|
||||||
|
|
||||||
mbag_set_mavl(conn->local,CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST,list);
|
|
||||||
*/
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,32 +185,30 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
|||||||
strncpy(caddr, addr, sizeof(caddr));
|
strncpy(caddr, addr, sizeof(caddr));
|
||||||
|
|
||||||
/* try to convert the given address string to sockaddr */
|
/* try to convert the given address string to sockaddr */
|
||||||
rc = sock_strtoaddr(caddr,(struct sockaddr*)&dstaddr);
|
rc = sock_strtoaddr(caddr, (struct sockaddr *) &dstaddr);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
int iport;
|
int iport;
|
||||||
/* converting to socaddr was successful */
|
/* converting to socaddr was successful */
|
||||||
iport = sock_getport((struct sockaddr*)&dstaddr);
|
iport = sock_getport((struct sockaddr *) &dstaddr);
|
||||||
if (iport != 0)
|
if (iport != 0)
|
||||||
sprintf(control_port, "%d", iport);
|
sprintf(control_port, "%d", iport);
|
||||||
else
|
else
|
||||||
sprintf(control_port,"%d", CAPWAP_CONTROL_PORT);
|
sprintf(control_port, "%d", CAPWAP_CONTROL_PORT);
|
||||||
}
|
} else {
|
||||||
else{
|
char *port;
|
||||||
char * port;
|
|
||||||
/* converting went wrong, so the address string might
|
/* converting went wrong, so the address string might
|
||||||
* be a DNS entry. Look for a colon to find the port. */
|
* be a DNS entry. Look for a colon to find the port. */
|
||||||
port = strchr(addr,':');
|
port = strchr(addr, ':');
|
||||||
if (port){
|
if (port) {
|
||||||
strncpy(control_port,port+1,sizeof(control_port));
|
strncpy(control_port, port + 1, sizeof(control_port));
|
||||||
caddr[port-addr]=0;
|
caddr[port - addr] = 0;
|
||||||
}
|
} else {
|
||||||
else{
|
sprintf(control_port, "%d", CAPWAP_CONTROL_PORT);
|
||||||
sprintf(control_port,"%d", CAPWAP_CONTROL_PORT);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*printf("Addr: %s, Port: %s\n",caddr,control_port);*/
|
/*printf("Addr: %s, Port: %s\n",caddr,control_port); */
|
||||||
|
|
||||||
rc = getaddrinfo(caddr, control_port, &hints, &res0);
|
rc = getaddrinfo(caddr, control_port, &hints, &res0);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
@ -249,14 +237,15 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
|||||||
sock_copyaddr(&conn->addr, res->ai_addr);
|
sock_copyaddr(&conn->addr, res->ai_addr);
|
||||||
|
|
||||||
|
|
||||||
if (bindaddr){
|
if (bindaddr) {
|
||||||
int brc;
|
int brc;
|
||||||
|
|
||||||
struct sockaddr bind_address;
|
struct sockaddr bind_address;
|
||||||
sock_strtoaddr(bindaddr,&bind_address);
|
sock_strtoaddr(bindaddr, &bind_address);
|
||||||
brc = bind(sockfd,&bind_address,sock_addrlen(&bind_address));
|
brc = bind(sockfd, &bind_address, sock_addrlen(&bind_address));
|
||||||
if (brc<0) {
|
if (brc < 0) {
|
||||||
cw_log(LOG_ERR,"Can't bind to %s",sock_addr2str(&bind_address,sock_buf));
|
cw_log(LOG_ERR, "Can't bind to %s",
|
||||||
|
sock_addr2str(&bind_address, sock_buf));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -266,11 +255,12 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
|||||||
conn->readfrom = conn_recvfrom_packet;
|
conn->readfrom = conn_recvfrom_packet;
|
||||||
|
|
||||||
|
|
||||||
cw_dbg(DBG_INFO,"Discovery to %s", sock_addr2str_p(&conn->addr,sock_buf));
|
cw_dbg(DBG_INFO, "Discovery to %s",
|
||||||
|
sock_addr2str_p(&conn->addr, sock_buf));
|
||||||
|
|
||||||
run_discovery(conn);
|
run_discovery(conn);
|
||||||
|
|
||||||
conn->readfrom=NULL;
|
conn->readfrom = NULL;
|
||||||
close(sockfd);
|
close(sockfd);
|
||||||
|
|
||||||
|
|
||||||
@ -280,6 +270,3 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ extern uint8_t conf_macaddress_len;
|
|||||||
|
|
||||||
|
|
||||||
#ifndef CONF_DEFAULT_MAX_DISCOVERY_INTERVAL
|
#ifndef CONF_DEFAULT_MAX_DISCOVERY_INTERVAL
|
||||||
#define CONF_DEFAULT_MAX_DISCOVERY_INTERVAL CW_MAX_DISCOVERY_INTERVAL
|
#define CONF_DEFAULT_MAX_DISCOVERY_INTERVAL CAPWAP_MAX_DISCOVERY_INTERVAL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONF_DEFAULT_SILENT_INTERVAL
|
#ifndef CONF_DEFAULT_SILENT_INTERVAL
|
||||||
@ -101,7 +101,7 @@ extern uint8_t conf_macaddress_len;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONF_DEFAULT_DISCOVERY_INTERVAL
|
#ifndef CONF_DEFAULT_DISCOVERY_INTERVAL
|
||||||
#define CONF_DEFAULT_DISCOVERY_INTERVAL CW_DISCOVERY_INTERVAL
|
#define CONF_DEFAULT_DISCOVERY_INTERVAL CAPWAP_DISCOVERY_INTERVAL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONF_DEFAULT_MAX_DISCOVERIES
|
#ifndef CONF_DEFAULT_MAX_DISCOVERIES
|
||||||
|
@ -13,8 +13,9 @@
|
|||||||
|
|
||||||
#include "wtp.h"
|
#include "wtp.h"
|
||||||
|
|
||||||
|
#define MAX_MODS 32
|
||||||
struct bootcfg{
|
struct bootcfg{
|
||||||
const char * modnames[32];
|
const char * modnames[MAX_MODS];
|
||||||
int nmods;
|
int nmods;
|
||||||
const char * modpath;
|
const char * modpath;
|
||||||
const char * cfgfilename;
|
const char * cfgfilename;
|
||||||
@ -43,6 +44,10 @@ static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'm':
|
case 'm':
|
||||||
|
if (bootcfg->nmods>MAX_MODS){
|
||||||
|
fprintf(stderr,"Too many modules\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
bootcfg->modnames[bootcfg->nmods++] = optarg;
|
bootcfg->modnames[bootcfg->nmods++] = optarg;
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
@ -63,7 +68,7 @@ static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "cw/rand.h"
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -76,6 +81,7 @@ int main (int argc, char **argv)
|
|||||||
const cw_Type_t ** ti;
|
const cw_Type_t ** ti;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
|
||||||
bootcfg.nmods=0;
|
bootcfg.nmods=0;
|
||||||
|
|
||||||
/* read command line args, results are in bootcfg */
|
/* read command line args, results are in bootcfg */
|
||||||
@ -146,7 +152,7 @@ int main (int argc, char **argv)
|
|||||||
conn->dtls_mtu = 12000;
|
conn->dtls_mtu = 12000;
|
||||||
conn->msgset=msgset;
|
conn->msgset=msgset;
|
||||||
conn->local_cfg = global_cfg;
|
conn->local_cfg = global_cfg;
|
||||||
conn->remote_cfg = cw_ktv_create();
|
conn->remote_cfg = NULL;
|
||||||
conn->receiver = CW_RECEIVER_WTP;
|
conn->receiver = CW_RECEIVER_WTP;
|
||||||
conn->wbid=1;
|
conn->wbid=1;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user