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"?>
|
||||
<CodeLite_Workspace Name="actube" Database="">
|
||||
<Project Name="ac" Path="ac.project" Active="Yes"/>
|
||||
<Project Name="wtp" Path="wtp.project" Active="No"/>
|
||||
<Project Name="ac" Path="ac.project" Active="No"/>
|
||||
<Project Name="wtp" Path="wtp.project" Active="Yes"/>
|
||||
<Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/>
|
||||
<Project Name="mod_capwap" Path="mod_capwap.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_write_radio_element.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>
|
||||
<Description/>
|
||||
|
@ -89,6 +89,7 @@ CWSRC=\
|
||||
cw_put_msg.c\
|
||||
cw_radio_set_admin_state.c\
|
||||
cw_rand.c\
|
||||
cw_randint.c\
|
||||
cw_read_ac_descriptor.c\
|
||||
cw_read_descriptor_subelems.c\
|
||||
cw_readelem_statistics_timer.c\
|
||||
@ -186,6 +187,7 @@ SOCKSRC=\
|
||||
LOGSRC=\
|
||||
log.c\
|
||||
log_file.c\
|
||||
log_errno.c\
|
||||
log_syslog.c\
|
||||
dbg.c\
|
||||
dbg_strings.c\
|
||||
|
@ -349,8 +349,10 @@
|
||||
|
||||
|
||||
/* capwap timer default values */
|
||||
#define CW_DISCOVERY_INTERVAL 5
|
||||
#define CW_MAX_DISCOVERY_INTERVAL 20
|
||||
#define CAPWAP_DISCOVERY_INTERVAL 5
|
||||
#define CAPWAP_MAX_DISCOVERY_INTERVAL 20
|
||||
#define CAPWAP_MIN_DISCOVERY_INTERVAL 2
|
||||
|
||||
#define CAPWAP_RETRANSMIT_INTERVAL 3
|
||||
#define CAPWAP_MAX_DISCOVERIES 10
|
||||
#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(int level, const char *format, ...);
|
||||
void cw_log_errno(char * format, ...);
|
||||
|
||||
extern const char *cw_log_name;
|
||||
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 */
|
||||
void *data;
|
||||
|
||||
int (*setup_cfg)(struct conn *conn);
|
||||
};
|
||||
|
||||
|
||||
|
@ -1,7 +1,10 @@
|
||||
#ifndef __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
|
||||
|
||||
|
@ -74,12 +74,18 @@ typedef time_t cw_timer_t;
|
||||
* and #cw_clock_lap.
|
||||
* @param c name of the variable
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
* Example
|
||||
* @code{.c}
|
||||
* #include "cw/timer.h"
|
||||
*
|
||||
* CW_CLOCK_DEFINE(clk);
|
||||
* int t;
|
||||
*
|
||||
* cw_clock_start(clk);
|
||||
*
|
||||
* @startcomment do something ... @endcomment
|
||||
* int t = cw_clock_lap(clk);
|
||||
*
|
||||
* t = cw_clock_lap(clk);
|
||||
* printf("Caclulation took %d seconds\n",t);
|
||||
* @endcode
|
||||
*
|
||||
|
@ -11,6 +11,11 @@
|
||||
static int init(struct cw_Mod * mod, mavl_t global_cfg, int role)
|
||||
{
|
||||
cw_dbg(DBG_INFO,"CAPWAP: Inititalizing mod_capwap.");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
switch (role){
|
||||
case CW_ROLE_AC:{
|
||||
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;
|
||||
}
|
||||
|
||||
int static setup_cfg(struct conn * conn)
|
||||
{
|
||||
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
struct cw_Mod mod_capwap = {
|
||||
"capwap", /* name */
|
||||
@ -49,12 +62,6 @@ struct cw_Mod mod_capwap = {
|
||||
detect, /* detect */
|
||||
capwap_register_msg_set, /* register_messages */
|
||||
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
|
||||
@ -39,4 +37,10 @@ ac-name-with-priority/TubesACx:Byte:3
|
||||
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,11 +12,13 @@
|
||||
#include "cw/dbg.h"
|
||||
#include "cw/timer.h"
|
||||
#include "cw/cw.h"
|
||||
#include "cw/rand.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;
|
||||
mavl_t iplist;
|
||||
int en;
|
||||
@ -43,8 +45,7 @@ int cw_select_ac(mavl_t local_cfg,mlist_t aclist){
|
||||
/* this should not happen, because AC Name is a
|
||||
* amndatory message element */
|
||||
prio = 255;
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
/* Get priority for AC from
|
||||
* ac-name-with-priority list */
|
||||
val->type->to_str(val, acname, CAPWAP_MAX_AC_NAME_LEN);
|
||||
@ -66,7 +67,8 @@ int cw_select_ac(mavl_t local_cfg,mlist_t aclist){
|
||||
|
||||
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++;
|
||||
en++;
|
||||
} while (1);
|
||||
@ -95,32 +97,47 @@ int cw_select_ac(mavl_t local_cfg,mlist_t aclist){
|
||||
|
||||
static int run_discovery(struct conn *conn)
|
||||
{
|
||||
/*// conn->incomming = mbag_create();*/
|
||||
time_t timer;
|
||||
/* uint8_t dtype=0;*/
|
||||
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",
|
||||
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;
|
||||
|
||||
|
||||
/*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_put_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 *));
|
||||
while (!cw_timer_timeout(timer)
|
||||
&& conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
|
||||
int rc;
|
||||
char addr_str[SOCK_ADDR_BUFSIZE];
|
||||
/*mavl_del_all(conn->incomming);*/
|
||||
|
||||
conn->remote_cfg = cw_ktv_create();
|
||||
if (conn->remote_cfg == NULL) {
|
||||
cw_log_errno("Can't allocate memory for remote_cfg");
|
||||
break;
|
||||
}
|
||||
|
||||
rc = cw_read_from(conn, &from);
|
||||
if (rc < 0) {
|
||||
@ -130,42 +147,15 @@ static int run_discovery(struct conn *conn)
|
||||
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));
|
||||
cw_dbg(DBG_INFO, "Received Discovery Response from %s",
|
||||
sock_addr2str(&from, addr_str));
|
||||
mlist_append_ptr(discovery_results, conn->remote_cfg);
|
||||
conn->remote_cfg=cw_ktv_create();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -204,8 +194,7 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
||||
sprintf(control_port, "%d", iport);
|
||||
else
|
||||
sprintf(control_port, "%d", CAPWAP_CONTROL_PORT);
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
char *port;
|
||||
/* converting went wrong, so the address string might
|
||||
* be a DNS entry. Look for a colon to find the port. */
|
||||
@ -213,8 +202,7 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
||||
if (port) {
|
||||
strncpy(control_port, port + 1, sizeof(control_port));
|
||||
caddr[port - addr] = 0;
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
sprintf(control_port, "%d", CAPWAP_CONTROL_PORT);
|
||||
}
|
||||
}
|
||||
@ -256,7 +244,8 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
||||
sock_strtoaddr(bindaddr, &bind_address);
|
||||
brc = bind(sockfd, &bind_address, sock_addrlen(&bind_address));
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -266,7 +255,8 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
||||
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);
|
||||
|
||||
@ -280,6 +270,3 @@ int cw_run_discovery(struct conn *conn, const char *addr, const char *bindaddr)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -93,7 +93,7 @@ extern uint8_t conf_macaddress_len;
|
||||
|
||||
|
||||
#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
|
||||
|
||||
#ifndef CONF_DEFAULT_SILENT_INTERVAL
|
||||
@ -101,7 +101,7 @@ extern uint8_t conf_macaddress_len;
|
||||
#endif
|
||||
|
||||
#ifndef CONF_DEFAULT_DISCOVERY_INTERVAL
|
||||
#define CONF_DEFAULT_DISCOVERY_INTERVAL CW_DISCOVERY_INTERVAL
|
||||
#define CONF_DEFAULT_DISCOVERY_INTERVAL CAPWAP_DISCOVERY_INTERVAL
|
||||
#endif
|
||||
|
||||
#ifndef CONF_DEFAULT_MAX_DISCOVERIES
|
||||
|
@ -13,8 +13,9 @@
|
||||
|
||||
#include "wtp.h"
|
||||
|
||||
#define MAX_MODS 32
|
||||
struct bootcfg{
|
||||
const char * modnames[32];
|
||||
const char * modnames[MAX_MODS];
|
||||
int nmods;
|
||||
const char * modpath;
|
||||
const char * cfgfilename;
|
||||
@ -43,6 +44,10 @@ static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
|
||||
break;
|
||||
}
|
||||
case 'm':
|
||||
if (bootcfg->nmods>MAX_MODS){
|
||||
fprintf(stderr,"Too many modules\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
bootcfg->modnames[bootcfg->nmods++] = optarg;
|
||||
break;
|
||||
case 'p':
|
||||
@ -63,7 +68,7 @@ static int parse_args (int argc, char *argv[], struct bootcfg * bootcfg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#include "cw/rand.h"
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
@ -76,6 +81,7 @@ int main (int argc, char **argv)
|
||||
const cw_Type_t ** ti;
|
||||
int i;
|
||||
|
||||
|
||||
bootcfg.nmods=0;
|
||||
|
||||
/* read command line args, results are in bootcfg */
|
||||
@ -146,7 +152,7 @@ int main (int argc, char **argv)
|
||||
conn->dtls_mtu = 12000;
|
||||
conn->msgset=msgset;
|
||||
conn->local_cfg = global_cfg;
|
||||
conn->remote_cfg = cw_ktv_create();
|
||||
conn->remote_cfg = NULL;
|
||||
conn->receiver = CW_RECEIVER_WTP;
|
||||
conn->wbid=1;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user