Work on Cisco elements

FossilOrigin-Name: e85120145936b3c53bef57144667078010c2e22d7db08797259bbc2670eb0a4b
This commit is contained in:
7u83@mail.ru 2018-05-07 08:57:12 +00:00
parent dd1d3f4dbc
commit 1bdaa652a4
28 changed files with 569 additions and 199 deletions

View File

@ -3,9 +3,9 @@
<Project Name="ac" Path="ac.project" Active="No"/>
<Project Name="wtp" Path="wtp.project" Active="No"/>
<Project Name="mod_cipwap" Path="mod_cipwap.project" Active="No"/>
<Project Name="mod_capwap" Path="mod_capwap.project" Active="Yes"/>
<Project Name="mod_capwap" Path="mod_capwap.project" Active="No"/>
<Project Name="mod_cisco" Path="mod_cisco.project" Active="No"/>
<Project Name="libcw" Path="libcw.project" Active="No"/>
<Project Name="libcw" Path="libcw.project" Active="Yes"/>
<Project Name="mod_capwap80211" Path="mod_capwap80211.project" Active="No"/>
<Project Name="mod_fortinet" Path="mod_fortinet.project" Active="No"/>
<BuildMatrix>

View File

@ -137,6 +137,7 @@ strict_capwap = off
# Defalut:
#listen = 192.168.0.14:1027
#listen = 192.168.56.1
#listen = 192.168.0.14
# broadcast_listen - Broadcast listen address
# If ommited, the boraadcast listen adresses a determined automatically
@ -211,7 +212,7 @@ ssl_cert="../../ssl/certs/ac-cisco.pem"
dbg += pkt_in # CAPWAP packets received
dbg += pkt_out # CAPWAP packets sent
dbg += pkt # CAPWAP packets both sent and received
# dbg += pkt_dmp # Hex dump CAPWAP packets.
dbg += pkt_dmp # Hex dump CAPWAP packets.
dbg += pkt_err # Show messages about malformed packets when detected
dbg += dtls # Messages concerning DTLS
# dbg += dtls_detail # DTLS in more detail
@ -220,6 +221,7 @@ ssl_cert="../../ssl/certs/ac-cisco.pem"
dbg += warn # misc warnings
dbg += mod # Debugs specific to mod
dbg += cfg_dmp
dbg += state
#
# dbg += all # all of the above
# dbg += err # Same as dbg_err and pkt_err

View File

@ -30,6 +30,7 @@ ac-descriptor/software/version :Bstr16: .x07036500
ac-descriptor/station-limit :Word: 1000
ac-descriptor/stations :Word: 0
capwap-control-ip-address/address.0 :IPAddress: 192.168.0.14
#capwap-control-ip-address/address.0 :IPAddress: 192.168.42.51
capwap-control-ip-address/wtps.0 :Word: 2
cisco/mwar-type :Byte: 0
maximum-message-length :Word: 4096
@ -50,8 +51,8 @@ capwap-control-ip-address/wtps.0:Word:0
cisco/ssl-keyfile:Str:"../../ssl/certs/cisco-ac.key"
cisco/ssl-certfile:Str:"../../ssl/certs/cisco-ac.pem"
cisco/ssl-cipher:Str:NORMAL
#+DHE-RSA:+AES-256-CBC:+AES-128-CBC:+SHA1:+PSK
cisco/ssl-cipher:Str:NORMAL
#cisco/ssl-cipher:Str:+DHE-RSA:+AES-256-CBC:+AES-128-CBC:+SHA1:+PSK
cisco/ssl-dhbits:Word:2048
capwap/ssl-cipher:Str:+DHE-RSA:+RSA:+AES-256-CBC:+AES-128-CBC:+SHA1:+PSK
@ -71,6 +72,14 @@ actube/listen:Bstr16:192.168.0.1
wait-dtls:Word:12
wait-join:Word:3
wait-join:Word:7
capwap-timers/change-state-pending-timer: Word: 3
capwap-timers/data-check-timer: Word: 10
capwap-timers/echo-interval :Byte: 30
capwap-timers/max-discovery-interval :Byte: 10
radio.255/admin-state :Str: enabled
radio.255/operational-state/cause :Str: Normal
radio.255/operational-state/state :Str: enabled

View File

@ -16,7 +16,30 @@
#include "wtplist.h"
void show_aps(FILE *out){
void show_cfg (FILE *out, mavl_t ktv)
{
char value[500];
struct cw_KTV * data;
mavliter_t it;
const struct cw_Type * type;
mavliter_init(&it,ktv);
mavliter_foreach(&it){
data = mavliter_get(&it);
type = data->type;
type->to_str(data,value,0);
fprintf(out,"%s :%s: %s\n",data->key,type->get_type_name(data), value);
}
}
void show_aps (FILE *out)
{
struct connlist * cl;
mavliter_t it;
@ -27,75 +50,82 @@ void show_aps(FILE *out){
cl = wtplist_get_connlist();
mavliter_init(&it,cl->by_addr);
fprintf(out,"IP\t\t\twtp-name\n");
mavliter_foreach(&it){
mavliter_init (&it, cl->by_addr);
fprintf (out, "IP\t\t\twtp-name\n");
mavliter_foreach (&it) {
cw_KTV_t * result;
char addr[SOCK_ADDR_BUFSIZE];
char wtp_name[CAPWAP_MAX_WTP_NAME_LEN];
struct conn * conn;
conn = mavliter_get_ptr(&it);
conn = mavliter_get_ptr (&it);
sock_addr2str_p(&conn->addr,addr);
sock_addr2str_p (&conn->addr, addr);
result = cw_ktv_get(conn->remote_cfg,"wtp-name",NULL);
if (result==NULL){
strcpy(wtp_name,"");
}
else{
result->type->to_str(result,wtp_name,CAPWAP_MAX_WTP_NAME_LEN);
}
result = cw_ktv_get (conn->remote_cfg, "wtp-name", NULL);
fprintf(out,"%s\t\t%s\n",addr,wtp_name);
if (result == NULL) {
strcpy (wtp_name, "");
} else {
result->type->to_str (result, wtp_name, CAPWAP_MAX_WTP_NAME_LEN);
}
fprintf (out, "%s\t\t%s\n", addr, wtp_name);
fprintf(out,"================= Local CFG: =================== \n");
show_cfg(out,conn->local_cfg);
fprintf(out,"================= Remote CFG: ================== \n");
show_cfg(out,conn->remote_cfg);
fprintf(out,"\n");
}
wtplist_unlock();
}
void execute_cmd(FILE * out, const char *str)
void execute_cmd (FILE * out, const char *str)
{
char cmd[1024];
char args[1024];
sscanf(str,"%s%s",cmd,args);
printf("CMD: %s, ARGS:\n",cmd);
sscanf (str, "%s%s", cmd, args);
/*printf("CMD: %s, ARGS:\n",cmd);*/
show_aps(out);
if (strcmp (cmd, "s") == 0) {
show_aps (out);
return;
}
}
void shell_loop(FILE *file)
void shell_loop (FILE *file)
{
int c;
/* setvbuf(file,NULL,_IONBF,0);
fflush(file);
*/
char str[2048];
do {
fprintf(file,"actube[%d]:>",fileno(file));
/* setvbuf(file,NULL,_IONBF,0);
fflush(file);
*/
char str[2048];
do {
fprintf (file, "actube[%d]:>", fileno (file));
fflush (file);
fgets(str,sizeof(str),file);
execute_cmd(file,str);
}while (c!=EOF);
fgets (str, sizeof (str), file);
execute_cmd (file, str);
} while (c != EOF);
}
void * run_shell(void * arg)
void * run_shell (void * arg)
{
struct sockaddr_storage server, client;
socklen_t client_size;
@ -106,47 +136,50 @@ void * run_shell(void * arg)
int sockfd, clientsock;
int yes;
rc = sock_strtoaddr(addr,(struct sockaddr*)&server);
if (! rc ){
cw_log(LOG_ERR,"Can't parse address '%s', %s",addr,strerror(errno));
rc = sock_strtoaddr (addr, (struct sockaddr*) &server);
if (! rc) {
cw_log (LOG_ERR, "Can't parse address '%s', %s", addr, strerror (errno));
}
sockfd = socket(((struct sockaddr*)&server)->sa_family,SOCK_STREAM,0);
sockfd = socket ( ( (struct sockaddr*) &server)->sa_family, SOCK_STREAM, 0);
yes = 1;
/* reuse address */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof (yes));
/* bind address */
rc = bind(sockfd,(struct sockaddr*)&server,sizeof(server));
if (rc ){
cw_log(LOG_ERR,"Can't bind socket address '%s', %s",addr,strerror(errno));
rc = bind (sockfd, (struct sockaddr*) &server, sizeof (server));
if (rc) {
cw_log (LOG_ERR, "Can't bind socket address '%s', %s", addr, strerror (errno));
}
rc = listen(sockfd,5);
if (rc ){
cw_log(LOG_ERR,"Can't listen on address '%s', %s",addr,strerror(errno));
rc = listen (sockfd, 5);
if (rc) {
cw_log (LOG_ERR, "Can't listen on address '%s', %s", addr, strerror (errno));
}
client_size = sizeof(client);
clientsock = accept(sockfd,(struct sockaddr*)&client,&client_size);
if (clientsock>0){
sock_addr2str_p(&client,sockstr);
cw_dbg(DBG_INFO, "Acceptiong session from %s",sockstr);
shell_loop(fdopen(clientsock,"a+"));
close(clientsock);
client_size = sizeof (client);
clientsock = accept (sockfd, (struct sockaddr*) &client, &client_size);
if (clientsock > 0) {
sock_addr2str_p (&client, sockstr);
cw_dbg (DBG_INFO, "Acceptiong session from %s", sockstr);
shell_loop (fdopen (clientsock, "a+"));
close (clientsock);
}
printf("Accepting %i, %s",rc,strerror(errno));
printf ("Accepting %i, %s", rc, strerror (errno));
return NULL;
}
@ -154,6 +187,6 @@ void * run_shell(void * arg)
void start_shell()
{
pthread_t thread;
pthread_create(&thread, NULL, run_shell,
NULL);
}
pthread_create (&thread, NULL, run_shell,
NULL);
}

View File

@ -90,15 +90,15 @@ static void wtpman_run_discovery(void *arg)
time_t timer = cw_timer_start(10);
wtpman->conn->capwap_transition = CAPWAP_STATE_DISCOVERY;
wtpman->conn->capwap_state = CAPWAP_STATE_DISCOVERY;
while (!cw_timer_timeout(timer)
&& wtpman->conn->capwap_transition == CAPWAP_STATE_DISCOVERY) {
&& wtpman->conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
int rc;
rc = cw_read_messages(wtpman->conn);
if (cw_result_is_ok(rc)){
wtpman->conn->capwap_transition=CAPWAP_STATE_JOIN;
wtpman->conn->capwap_state=CAPWAP_STATE_JOIN;
cw_dbg(DBG_INFO,"Discovery has detected mods: %s %s",
wtpman->conn->cmod->name,wtpman->conn->bmod->name);
@ -166,7 +166,7 @@ static int wtpman_join(void *arg)
timer = cw_timer_start(wait_join);
while (!cw_timer_timeout(timer) && wtpman->conn->capwap_transition == CAPWAP_STATE_JOIN) {
while (!cw_timer_timeout(timer) && wtpman->conn->capwap_state == CAPWAP_STATE_JOIN) {
rc = cw_read_messages(wtpman->conn);
if (rc < 0) {
if (errno == EAGAIN)
@ -185,7 +185,7 @@ static int wtpman_join(void *arg)
}
if (wtpman->conn->capwap_transition != CAPWAP_STATE_JOIN_COMPLETE) {
if (wtpman->conn->capwap_state != CAPWAP_STATE_JOIN_COMPLETE) {
cw_dbg(DBG_MSG_ERR, "No join request from %s after %d seconds, WTP died.",
sock_addr2str(&wtpman->conn->addr,sock_buf), wait_join);
@ -279,6 +279,49 @@ void * wtpman_run_data(void *wtpman_arg)
}
int cw_run_state_machine(struct conn * conn, time_t *timer)
{
int timerval;
cw_StateMachineState_t search, *result;
while(1){
search.state = conn->capwap_state;
search.prevstate = conn->capwap_prevstate;
result = mavl_get(conn->msgset->state_machine,&search);
cw_dbg(DBG_STATE,"State transition: [%s -> %s]",
cw_strstate(conn->capwap_prevstate),
cw_strstate(conn->capwap_state)
);
if (result == NULL){
cw_log(LOG_ERR,"State not found");
return 0;
}
if (result->jump_state){
conn->capwap_state = result->jump_state;
conn->capwap_prevstate = result->jump_prevstate;
cw_dbg(DBG_STATE,"Jump to state: [%s->%s]",
cw_strstate(conn->capwap_prevstate),
cw_strstate(conn->capwap_state));
continue;
}
if (result->dbgmsg){
cw_dbg(DBG_STATE,"%s",result->dbgmsg);
}
if (result->timer_key){
timerval = cw_ktv_get_word(conn->local_cfg,result->timer_key,result->timer_default);
*timer = cw_timer_start(timerval);
cw_dbg(DBG_STATE,"Starting timer: [%s] - %d seconds.",result->timer_key,timerval);
}
return result->retval;
}
}
/*#define CW_TRANSITION(prestate,state) (prestate<<16|state)*/
@ -315,7 +358,7 @@ static void * wtpman_main(void *arg)
return NULL;
}
conn->capwap_transition = CAPWAP_STATE_DTLS_SETUP;
conn->capwap_state = CAPWAP_STATE_DTLS_SETUP;
/* establish dtls session */
if (!wtpman_dtls_setup(wtpman)) {
wtpman_remove(wtpman);
@ -325,7 +368,8 @@ static void * wtpman_main(void *arg)
/*last_state = conn->capwap_state;
conn->capwap_state = CAPWAP_STATE_JOIN;
*/
conn->capwap_transition = CW_TRANSITION(CAPWAP_STATE_DTLS_SETUP, CAPWAP_STATE_JOIN);
conn->capwap_prevstate = CAPWAP_STATE_DTLS_SETUP;
conn->capwap_state = CAPWAP_STATE_JOIN;
rc = 0;
while (1){
@ -333,8 +377,16 @@ static void * wtpman_main(void *arg)
int wait_join;
int wait_change_state;
if (!cw_run_state_machine(conn, &timer)){
cw_dbg(DBG_INFO,"WTP died");
wtpman_remove(wtpman);
return NULL;
};
/*
switch (conn->capwap_transition){
case CW_TRANSITION(CAPWAP_STATE_DTLS_SETUP, CAPWAP_STATE_JOIN):
{
@ -369,10 +421,6 @@ static void * wtpman_main(void *arg)
wait_change_state = cw_ktv_get_word(conn->global_cfg,
"capwap-timers/change-state-pending-timer",
CAPWAP_TIMER_CHANGE_STATE_PENDING_TIMER);
/* printf("Capwap state configure\n");
exit(0);
*/
break;
}
case CW_TRANSITION(CAPWAP_STATE_CONFIGURE,CAPWAP_STATE_TIMEOUT):
@ -386,7 +434,7 @@ static void * wtpman_main(void *arg)
}
*/
while (!cw_timer_timeout(timer)) {
rc = cw_read_messages(wtpman->conn);
@ -398,8 +446,8 @@ static void * wtpman_main(void *arg)
}
if(rc<0){
conn->capwap_transition =
CW_TRANSITION(conn->capwap_transition,CAPWAP_STATE_TIMEOUT);
conn->capwap_prevstate = conn->capwap_state;
conn->capwap_state = CAPWAP_STATE_TIMEOUT;
}
}
@ -427,7 +475,7 @@ static void * wtpman_main(void *arg)
/* dtls is established, goto join state */
conn->capwap_transition = CAPWAP_STATE_JOIN;
conn->capwap_state = CAPWAP_STATE_JOIN;
if (!wtpman_join(wtpman)) {
wtpman_remove(wtpman);
return NULL;
@ -454,7 +502,7 @@ exit(0);
rc = 0;
while (!cw_timer_timeout(timer)
&& wtpman->conn->capwap_transition == CAPWAP_STATE_CONFIGURE) {
&& wtpman->conn->capwap_state == CAPWAP_STATE_CONFIGURE) {
rc = cw_read_messages(wtpman->conn);
if (rc < 0) {
if (errno != EAGAIN)
@ -472,14 +520,14 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
}
if (conn->capwap_transition == CW_STATE_IMAGE_DATA) {
if (conn->capwap_state == CW_STATE_IMAGE_DATA) {
wtpman_image_data(wtpman);
return NULL;
}
conn->capwap_transition = CAPWAP_STATE_RUN;
conn->capwap_state = CAPWAP_STATE_RUN;
/*
// XXX testing ...
// DBGX("Cofig to sql", "");
@ -492,7 +540,7 @@ cw_dbg_ktv_dump(conn->remote_cfg,DBG_INFO,"-------------dump------------","DMP",
reset_echointerval_timer(wtpman);
rc = 0;
while (wtpman->conn->capwap_transition == CAPWAP_STATE_RUN) {
while (wtpman->conn->capwap_state == CAPWAP_STATE_RUN) {
rc = cw_read_messages(wtpman->conn);
if (rc < 0) {
if (errno != EAGAIN)

View File

@ -379,6 +379,7 @@
#define CAPWAP_WAIT_JOIN 60
#define CAPWAP_TIMER_CHANGE_STATE_PENDING_TIMER 25
#define CAPWAP_TIMER_DATA_CHECK_TIMER 30
#define CAPWAP_IDLE_TIMEOUT 300
@ -592,8 +593,8 @@ extern struct cw_StrListElem capwap_strings_board[];
#define cw_strmsg(id) cw_strlist_get_str(capwap_strings_msg,id)
#define cw_strelem(id) cw_strlist_get_str(capwap_strings_elem,id)
#define cw_strprestate(id) cw_strlist_get_str(capwap_strings_state,id >> 8)
#define cw_strstate(id) cw_strlist_get_str(capwap_strings_state,id & 0xff)
#define cw_strstate(id) cw_strlist_get_str(capwap_strings_state,id)
#define cw_strvendor(id) cw_strlist_get_str(capwap_strings_vendor,id)
#define cw_strresult(id) cw_strlist_get_str(capwap_strings_result,id)
@ -656,6 +657,7 @@ enum capwap_states {
CW_STATE_UPDATE,
/** Run State */
CAPWAP_STATE_RUN,
CAPWAP_STATE_DATA_CHECK,
CAPWAP_STATE_TIMEOUT
};

View File

@ -8,6 +8,8 @@ struct cw_StrListElem capwap_strings_state[] = {
{ CAPWAP_STATE_CONFIGURE,"Configure" },
{ CW_STATE_IMAGE_DATA,"Image Data" },
{ CAPWAP_STATE_DTLS_SETUP, "DTLS Setup" },
{ CAPWAP_STATE_DATA_CHECK, "Data Check" },
{ CAPWAP_STATE_TIMEOUT, "Timeout"},
{ CW_STR_STOP,"Undefined" },
};

View File

@ -73,6 +73,7 @@ struct conn {
mavl_t remote_cfg;
/* mavl_t default_cfg;*/
mavl_t local_cfg;
mavl_t global_cfg;
@ -113,9 +114,12 @@ struct conn {
struct cw_MsgSet * msgset;
uint8_t capwap_prevstate;
/** Current CAPWAP state */
uint16_t capwap_transition;
uint8_t capwap_state;
/** The framgent manager used on this connection */

View File

@ -219,7 +219,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
struct cw_MsgData search;
struct cw_MsgData * message;
int result_code;
uint16_t *ui;
cw_State_t *ui;
uint8_t *elems_ptr;
uint8_t *elem;
@ -299,7 +300,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
cw_dbg(DBG_MSG_ERR,
"Message type %d [%s] unrecognized, sending response.",
search.type, cw_strmsg(search.type),
cw_strstate(conn->capwap_transition));
cw_strstate(conn->capwap_state));
result_code = CAPWAP_RESULT_MSG_UNRECOGNIZED;
cw_send_error_response(conn, rawmsg, result_code);
@ -309,7 +310,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
cw_dbg(DBG_MSG_ERR,
"Message type %d [%s] unrecognized, discarding.",
search.type, cw_strmsg(search.type),
cw_strstate(conn->capwap_transition));
cw_strstate(conn->capwap_state));
errno = EAGAIN;
return -1;
@ -321,29 +322,29 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
* */
if (!(message->receiver & conn->role)) {
cw_dbg(DBG_MSG_ERR,
"Message type %d (%s) unexpected/illegal in %s->%s State, discarding.",
"Message type %d (%s) unexpected/illegal in %s State, discarding.",
search.type, cw_strmsg(search.type),
cw_strprestate(conn->capwap_transition),
cw_strstate(conn->capwap_transition));
cw_strstate(conn->capwap_state));
errno = EAGAIN;
return -1;
}
/* Check if current state is in state of message */
ui = message->states;
for (ui=message->states; *ui; ui++){
printf("Comparing %d and %d\n", conn->capwap_transition, *ui);
if(*ui==conn->capwap_transition)
for (ui=message->states; ui->state; ui++){
printf("Comparing %d and %d\n", conn->capwap_state, ui->state);
if(ui->state==conn->capwap_state){
break;
}
}
if (!*ui){
if (!ui->state){
/* Message found, but it was in wrong state */
cw_dbg(DBG_MSG_ERR,
"Message type %d (%s) not allowed in %s->%s State, sending response.",
"Message type %d (%s) not allowed in %s State, sending response.",
search.type,cw_strmsg(search.type),
cw_strprestate(conn->capwap_transition),
cw_strstate(conn->capwap_transition));
cw_strstate(conn->capwap_state));
result_code = CAPWAP_RESULT_MSG_INVALID_IN_CURRENT_STATE;
cw_send_error_response(conn, rawmsg, result_code);
errno = EAGAIN;
@ -417,7 +418,6 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
continue;
}
}
/* all message elements are processed, do now after processing
@ -449,10 +449,9 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
cw_send_error_response(conn, rawmsg, result_code);
} else if (result_code == 0) {
cw_ktv_set_dword(conn->local_cfg,"result-code",result_code);
if (message->next_state){
conn->capwap_transition =
CW_TRANSITION(conn->capwap_transition,message->next_state);
if (ui->next){
conn->capwap_prevstate = conn->capwap_state;
conn->capwap_state = ui->next;
}
/* All is ok, send regular response message */

View File

@ -340,7 +340,7 @@ struct cw_DescriptorSubelemDef {
#define CW_IGNORE 5
#define CW_TRANSITION(prestate,state) (prestate<<8|state)
int cw_check_missing_mand(struct cw_MsgData *msgdata, mavl_t keys );

View File

@ -11,15 +11,16 @@
int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
, uint8_t * dst)
{
/* char detail[128];*/
struct cw_KTV * elem, search;
int start, len, l;
/* Get the element to put */
/* Get the element */
search.key=(char*)handler->key;
elem = mavl_get(params->conn->local_cfg, &search);
/* if (elem == NULL && params->conn->default_cfg !=NULL)
elem = mavl_get(params->conn->default_cfg, &search);
*/
if (elem == NULL) {
const char *vendor="";
if ( handler->vendor ) {

View File

@ -86,6 +86,8 @@ static struct cw_StrListElem color_on[] = {
{DBG_INFO, ANSI_DEFAULT},
{DBG_STATE, ANSI_BBLACK ANSI_BOLD },
{DBG_RFC, ANSI_BRED},
{DBG_X, "\x1b[31m"},
{DBG_WARN, ANSI_CYAN},
@ -130,6 +132,7 @@ static struct cw_StrListElem prefix[] = {
{DBG_DTLS_DETAIL, " DTLS - "},
{DBG_WARN, " Warning - "},
{DBG_MOD, " Mod - "},
{DBG_STATE, " State - "},
{DBG_X, "XXXXX - "},

View File

@ -118,6 +118,8 @@ enum cw_dbg_levels{
/** Debug Mods */
DBG_MOD,
DBG_STATE, /**<Debug State machein */
DBG_ALL,
DBG_PKT_DMP_OUT,

View File

@ -68,6 +68,7 @@ struct cw_StrListElem cw_dbg_strings[] = {
{ DBG_WARN, "warn" },
{ DBG_MOD,"mod"},
{ DBG_STATE, "state" },
{ DBG_ALL, "all"},
{ CW_STR_STOP, NULL }

View File

@ -58,6 +58,18 @@ static int cmp_elemdata(const void *elem1, const void *elem2)
}
static int cmp_machinestate(const void *state1, const void *state2)
{
const struct cw_StateMachineState *s1 = state1;
const struct cw_StateMachineState *s2 = state2;
int rc;
rc = s1->state - s2->state;
if (rc!=0)
return rc;
return s1->prevstate-s2->prevstate;
}
static void msgdata_destroy(struct cw_MsgData *data)
{
if (!data)
@ -67,6 +79,7 @@ static void msgdata_destroy(struct cw_MsgData *data)
if (data->elements_tree)
mavl_destroy(data->elements_tree);
free(data);
}
@ -89,6 +102,8 @@ void cw_msgset_destroy(struct cw_MsgSet *set)
mavl_destroy(set->handlers_by_id);
if (set->handlers_by_key)
mavl_destroy(set->handlers_by_key);
if (set->state_machine)
mavl_destroy(set->state_machine);
free(set);
}
@ -105,6 +120,8 @@ struct cw_MsgSet *cw_msgset_create()
return NULL;
memset(set, 0, sizeof(struct cw_MsgSet));
/* create mavl for all_elems by id */
set->handlers_by_id = mavl_create(cmp_cw_elemhandler_by_id, NULL,
@ -135,6 +152,13 @@ struct cw_MsgSet *cw_msgset_create()
cw_msgset_destroy(set);
return NULL;
}
set->state_machine = mavl_create(cmp_machinestate,NULL,sizeof(cw_StateMachineState_t));
if (set->state_machine == NULL)
{
cw_msgset_destroy(set);
return NULL;
}
return set;
}
@ -292,9 +316,9 @@ int cw_msgset_add(struct cw_MsgSet *set,
msg->postprocess = msgdef->postprocess;
if (msgdef->preprocess != NULL)
msg->preprocess = msgdef->preprocess;
if (msgdef->next_state)
/* if (msgdef->next_state)
msg->next_state=msgdef->next_state;
*/
msg->receiver = msgdef->receiver;
@ -319,6 +343,30 @@ int cw_msgset_add(struct cw_MsgSet *set,
return 0;
}
int cw_msgset_add_states(struct cw_MsgSet * set, cw_StateMachineState_t * states)
{
cw_StateMachineState_t * s;
int replaced;
s=states;
while (s->state != 0){
const char * repstr;
mavl_replace(set->state_machine,s,&replaced);
if (replaced){
repstr = "Replacing";
}
else{
repstr = "Adding";
}
cw_dbg(DBG_MOD,"%s machine state : [%s->%s]",repstr,
cw_strstate(s->prevstate),
cw_strstate(s->state));
s++;
}
return 1;
}
/**
* @brief Find message data to a specific message
* @param set message set

View File

@ -12,7 +12,7 @@ struct cw_MsgSet {
mavl_t handlers_by_id;
mavl_t handlers_by_key;
mavl_t types_tree;
mavl_t state_machine;
};
struct cw_ElemDef{
@ -62,24 +62,32 @@ struct cw_ElemHandler {
};
struct cw_State{
uint8_t state;
uint8_t next;
};
typedef struct cw_State cw_State_t;
struct cw_MsgDef{
const char * name;
int type; /**< Message type */
int receiver; /**< Who can receive this message */
uint16_t * states; /**< states in wich the message is allowed */
cw_State_t * states; /**< states in wich the message is allowed */
struct cw_ElemDef * elements;
int (*preprocess)(struct conn * conn);
int (*postprocess)(struct conn * conn);
uint8_t next_state;
/* uint8_t next_state;*/
};
struct cw_MsgData{
int type;
const char * name;
uint16_t * states;
cw_State_t * states;
int receiver;
mavl_t elements_tree;
mlist_t elements_list;
@ -87,18 +95,32 @@ struct cw_MsgData{
int (*preprocess)(struct conn * conn);
int (*postprocess)(struct conn * conn);
uint8_t next_state;
/* uint8_t next_state;*/
};
struct cw_StateMachineState{
uint8_t prevstate;
uint8_t state;
const char * timer_key;
int timer_default;
int retval;
const char *dbgmsg;
uint8_t jump_prevstate;
uint8_t jump_state;
};
typedef struct cw_StateMachineState cw_StateMachineState_t;
extern struct cw_MsgSet * cw_msgset_create();
extern void cw_msgset_destroy(struct cw_MsgSet * set);
extern int cw_msgset_add(struct cw_MsgSet * set,
void cw_msgset_destroy(struct cw_MsgSet * set);
int cw_msgset_add(struct cw_MsgSet * set,
struct cw_MsgDef messages[], struct cw_ElemHandler handlers[]);
int cw_msgset_add_states(struct cw_MsgSet * set, cw_StateMachineState_t * states);
/*mlist_t cw_msgset_get_msg(struct cw_MsgSet * set, int type);*/
struct cw_MsgData * cw_msgset_get_msgdata(struct cw_MsgSet *set,int type);

View File

@ -401,7 +401,10 @@ static struct cw_ElemHandler handlers[] = {
};
static uint16_t discovery_request_states[] = {CAPWAP_STATE_DISCOVERY,0};
static cw_State_t discovery_request_states[] = {
{CAPWAP_STATE_DISCOVERY,CAPWAP_STATE_DISCOVERY},
{0,0}
};
static struct cw_ElemDef discovery_request_elements[] ={
{0,0,CAPWAP_ELEM_DISCOVERY_TYPE, 1, 0},
{0,0,CAPWAP_ELEM_WTP_BOARD_DATA, 1, 0},
@ -414,7 +417,10 @@ static struct cw_ElemDef discovery_request_elements[] ={
};
static uint16_t discovery_response_states[] = {CAPWAP_STATE_DISCOVERY,0};
static cw_State_t discovery_response_states[] = {
{CAPWAP_STATE_DISCOVERY,CAPWAP_STATE_DISCOVERY},
{0,0}
};
static struct cw_ElemDef discovery_response_elements[] ={
{0,0,CAPWAP_ELEM_AC_DESCRIPTOR, 1, 0},
{0,0,CAPWAP_ELEM_AC_NAME, 1, 0},
@ -425,9 +431,10 @@ static struct cw_ElemDef discovery_response_elements[] ={
};
static uint16_t join_request_states[] = {
CW_TRANSITION(CAPWAP_STATE_DTLS_SETUP,CAPWAP_STATE_JOIN),
0};
static cw_State_t join_request_states[] = {
{CAPWAP_STATE_JOIN, CAPWAP_STATE_JOIN},
{0,0}
};
static struct cw_ElemDef join_request_elements[] ={
{0,0,CAPWAP_ELEM_LOCATION_DATA, 1, 0},
{0,0,CAPWAP_ELEM_WTP_BOARD_DATA, 1, 0},
@ -446,7 +453,10 @@ static struct cw_ElemDef join_request_elements[] ={
{0,0,0,0,0}
};
static uint16_t join_response_states[] = {CAPWAP_STATE_JOIN,0};
static cw_State_t join_response_states[] = {
{CAPWAP_STATE_JOIN,CAPWAP_STATE_JOIN},
{0,0}
};
static struct cw_ElemDef join_response_elements[] ={
{0,0,CAPWAP_ELEM_RESULT_CODE, 1, 0},
{0,0,CAPWAP_ELEM_AC_DESCRIPTOR, 1, 0},
@ -465,9 +475,10 @@ static struct cw_ElemDef join_response_elements[] ={
};
static uint16_t configuration_status_request_states[] = {
CW_TRANSITION(CAPWAP_STATE_JOIN, CAPWAP_STATE_JOIN),
0};
static cw_State_t configuration_status_request_states[] = {
{CAPWAP_STATE_JOIN, CAPWAP_STATE_CONFIGURE},
{0,0}
};
static struct cw_ElemDef configuration_status_request_elements[] ={
{0,0,CAPWAP_ELEM_AC_NAME, 1, 0},
{0,0,CAPWAP_ELEM_RADIO_ADMINISTRATIVE_STATE, 1, 0},
@ -479,7 +490,10 @@ static struct cw_ElemDef configuration_status_request_elements[] ={
{0,0,0,0,0}
};
static uint16_t configuration_status_response_states[] = {CAPWAP_STATE_JOIN,0};
static cw_State_t configuration_status_response_states[] = {
{CAPWAP_STATE_JOIN,CAPWAP_STATE_JOIN},
{0,0}
};
static struct cw_ElemDef configuration_status_response_elements[] ={
{0,0,CAPWAP_ELEM_CAPWAP_TIMERS, 1, 0},
{0,0,CAPWAP_ELEM_DECRYPTION_ERROR_REPORT_PERIOD, 1, 0},
@ -491,7 +505,10 @@ static struct cw_ElemDef configuration_status_response_elements[] ={
};
static uint16_t configuration_update_request_states[] = {CAPWAP_STATE_RUN,0};
static cw_State_t configuration_update_request_states[] = {
{CAPWAP_STATE_RUN,CAPWAP_STATE_RUN},
{0,0}
};
static struct cw_ElemDef configuration_update_request_elements[] ={
{0,0,CAPWAP_ELEM_RADIO_ADMINISTRATIVE_STATE, 0, 0},
@ -505,16 +522,21 @@ static struct cw_ElemDef configuration_update_request_elements[] ={
static uint16_t configuration_update_response_states[] = {CAPWAP_STATE_RUN,0};
static cw_State_t configuration_update_response_states[] = {
{CAPWAP_STATE_RUN,CAPWAP_STATE_RUN},
{0,0}
};
static struct cw_ElemDef configuration_update_response_elements[] ={
{0,0,CAPWAP_ELEM_RESULT_CODE, 1, 0},
{0,0,0,0,0}
};
static uint16_t change_state_event_request_states[] = {
CW_TRANSITION(CAPWAP_STATE_JOIN, CAPWAP_STATE_CONFIGURE),
0};
static cw_State_t change_state_event_request_states[] = {
{CAPWAP_STATE_CONFIGURE,CAPWAP_STATE_DATA_CHECK},
{CAPWAP_STATE_RUN,CAPWAP_STATE_RUN},
{0,0}
};
static struct cw_ElemDef change_state_event_request_elements[] ={
{0,0,CAPWAP_ELEM_RADIO_OPERATIONAL_STATE, 1,0},
@ -524,7 +546,10 @@ static struct cw_ElemDef change_state_event_request_elements[] ={
{0,0,0,0,0}
};
static uint16_t change_state_event_response_states[] = {CAPWAP_STATE_JOIN,0};
static cw_State_t change_state_event_response_states[] = {
{CAPWAP_STATE_JOIN,CAPWAP_STATE_JOIN},
{0,0}
};
static struct cw_ElemDef change_state_event_response_elements[] ={
{0,0,CAPWAP_ELEM_RESULT_CODE, 1, 0},
@ -532,14 +557,20 @@ static struct cw_ElemDef change_state_event_response_elements[] ={
};
static uint16_t wtp_event_request_states[] = {CAPWAP_STATE_JOIN,0};
static cw_State_t wtp_event_request_states[] = {
{CAPWAP_STATE_RUN,CAPWAP_STATE_RUN},
{0,0}
};
static struct cw_ElemDef wtp_event_request_elements[] ={
{0,0,CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD, 0, CW_IGNORE},
{0,0,0,0,0}
};
static uint16_t wtp_event_response_states[] = {CAPWAP_STATE_JOIN,0};
static cw_State_t wtp_event_response_states[] = {
{CAPWAP_STATE_JOIN,0},
{0,0}
};
static struct cw_ElemDef wtp_event_response_elements[] ={
{0,0,CAPWAP_ELEM_RESULT_CODE, 1, 0},
@ -547,13 +578,19 @@ static struct cw_ElemDef wtp_event_response_elements[] ={
};
static uint16_t echo_request_states[] = {CAPWAP_STATE_RUN,0};
static cw_State_t echo_request_states[] = {
{CAPWAP_STATE_RUN,CAPWAP_STATE_RUN},
{0,0}
};
static struct cw_ElemDef echo_request_elements[] ={
{0,0,CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD, 0, CW_IGNORE},
{0,0,0,0,0}
};
static uint16_t echo_response_states[] = {CAPWAP_STATE_RUN,0};
static cw_State_t echo_response_states[] = {
{CAPWAP_STATE_RUN,0},
{0,0}
};
static struct cw_ElemDef echo_response_elements[] ={
{0,0,CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD, 0, CW_IGNORE},
{0,0,0,0,0}
@ -587,8 +624,6 @@ static struct cw_MsgDef messages[] = {
join_request_elements,
NULL,
postprocess_join_request,
CAPWAP_STATE_JOIN,
},
{
@ -607,7 +642,6 @@ static struct cw_MsgDef messages[] = {
configuration_status_request_elements, /* msg elements */
NULL,
NULL,
CAPWAP_STATE_CONFIGURE
},
{
@ -639,10 +673,9 @@ static struct cw_MsgDef messages[] = {
CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST, /* msg type */
CW_ROLE_AC, /* role */
change_state_event_request_states, /* allowed states */
change_state_event_request_elements /* msg elements */
change_state_event_request_elements, /* msg elements */
NULL,
NULL,
CAPWAP_STATE_DATA_CHECK
},
{
@ -698,6 +731,72 @@ static int postprocess_join_request(struct conn *conn)
}
static cw_StateMachineState_t statemachine_states[]={
{
CAPWAP_STATE_DTLS_SETUP, CAPWAP_STATE_JOIN, /* transition */
"wait-join",CAPWAP_WAIT_JOIN, /* timer */
1 /* retval */
}
,
{
CAPWAP_STATE_JOIN,CAPWAP_STATE_TIMEOUT,
NULL,0,
0, "WTP Join timeout"
}
,
{
CAPWAP_STATE_JOIN, CAPWAP_STATE_JOIN,
NULL,0,
1, "WTP has joined"
}
,
{
CAPWAP_STATE_JOIN, CAPWAP_STATE_CONFIGURE,
"capwap-timers/change-state-pending-timer",CAPWAP_TIMER_CHANGE_STATE_PENDING_TIMER,
1, NULL
}
,
{
CAPWAP_STATE_CONFIGURE,CAPWAP_STATE_TIMEOUT,
NULL,0,
0, "WTP change state timeout"
}
,
{
CAPWAP_STATE_CONFIGURE,CAPWAP_STATE_DATA_CHECK,
"capwap-timers/data-check-timer",CAPWAP_TIMER_DATA_CHECK_TIMER,
1, NULL
}
,
{
CAPWAP_STATE_DATA_CHECK,CAPWAP_STATE_TIMEOUT,
NULL,0,
0, "WTP data check timeout"
}
,
{
CAPWAP_STATE_DATA_CHECK,CAPWAP_STATE_RUN,
"capwap-timers/echo-interval",CAPWAP_ECHO_INTERVAL,
1, NULL
}
,
{
CAPWAP_STATE_RUN,CAPWAP_STATE_RUN,
"capwap-timers/echo-interval",CAPWAP_ECHO_INTERVAL,
1, NULL
}
,
{
CAPWAP_STATE_RUN,CAPWAP_STATE_TIMEOUT,
NULL,0,
0, "WTP echo timout"
}
,
{0,0,0}
};
struct cw_MsgSet * capwap_register_msg_set(struct cw_MsgSet * set, int mode){
@ -707,6 +806,9 @@ struct cw_MsgSet * capwap_register_msg_set(struct cw_MsgSet * set, int mode){
cw_dbg(DBG_INFO,"CAPWAP: Register messages");
cw_msgset_add(set,messages, handlers);
cw_msgset_add_states(set,statemachine_states);
mavl_add_ptr(set->types_tree,CW_TYPE_BSTR16);
mavl_add_ptr(set->types_tree,CW_TYPE_BYTE);
mavl_add_ptr(set->types_tree,CW_TYPE_DWORD);

View File

@ -29,7 +29,7 @@ int capwap_in_vendor_specific_payload(struct cw_ElemHandler *handler,
cw_dbg(DBG_WARN,
"Can't handle Vendor Specific Payload %s/%d, in msg %d (%s) in %s state.",
cw_strvendor(vendor_id), elem_id, params->msgdata->type,
params->msgdata->name, cw_strstate(params->conn->capwap_transition));
params->msgdata->name, cw_strstate(params->conn->capwap_state));
return 0;
}

View File

@ -44,7 +44,7 @@ OBJDIR := ../../../obj/mod_cisco/$(ARCH)
SNAME := $(LIBARCHDIR)/libmod_cisco.a
DNAME := $(LIBARCHDIR)/mod_cisco.so
MODNAME := $(LIBDIR)/mod_cisco.so
SLIBS := -lcw -lmod_capwap -lconfuse
SLIBS := -lcw -lconfuse
include ../Mod.mak

View File

@ -102,7 +102,7 @@
#define CW_CISCO_TLV_PAYLOAD 215
#define CISCO_ELEM_AP_LOG_FACILITY 224
#define CW_CISCO_OPER_STATE_DETAIL_CAUSE 235
#define CISCO_ELEM_OPER_STATE_DETAIL_CAUSE 235
#define CW_CISCO_AP_RETRANSMIT_PARAM 240

View File

@ -1333,12 +1333,35 @@ static struct cw_ElemHandler handlers73[] = {
cw_out_generic_struct /* put */
}
,
{
"AP DTLS Data CFG", /* name */
CISCO_LWELEM_AP_DTLS_DATA_CFG, /* Element ID */
CW_VENDOR_ID_CISCO, CW_PROTO_LWAPP, /* Vendor / Proto */
3, 3, /* min/max length */
CW_TYPE_BSTR16, /* type */
"cisco/ap-dtls-data-cfg", /* Key */
cw_in_generic, /* get */
cw_out_generic /* put */
}
,
{
"Operational State Detail Cause", /* name */
CISCO_ELEM_OPER_STATE_DETAIL_CAUSE, /* Element ID */
CW_VENDOR_ID_CISCO, 0, /* Vendor / Proto */
4, 4, /* min/max length */
CW_TYPE_WORD, /* type */
"cisco/operational-state-detail-cause", /* Key */
cw_in_radio_generic, /* get */
cw_out_radio_generic /* put */
}
,
{0,0,0,0,0,0,0,0}
};
static uint16_t discovery_request_states[] = {CAPWAP_STATE_DISCOVERY,0};
/*static uint16_t discovery_request_states[] = {CAPWAP_STATE_DISCOVERY,0};*/
static struct cw_ElemDef discovery_request_elements[] ={
/* {0,0, CAPWAP_ELEM_WTP_DESCRIPTOR, 1, 0},*/
{0,0, CAPWAP_ELEM_WTP_BOARD_DATA, 0, 0},
@ -1348,7 +1371,7 @@ static struct cw_ElemDef discovery_request_elements[] ={
};
static uint16_t discovery_response_states[] = {CAPWAP_STATE_DISCOVERY,0};
/*static uint16_t discovery_response_states[] = {CAPWAP_STATE_DISCOVERY,0};*/
static struct cw_ElemDef discovery_response_elements[] ={
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_TIMESYNC, 1, 0},
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_MWAR_TYPE, 0, 0},
@ -1378,7 +1401,7 @@ static struct cw_ElemDef join_request_elements[] ={
};
static uint16_t join_response_states[] = {CAPWAP_STATE_JOIN,0};
/*static uint16_t join_response_states[] = {CAPWAP_STATE_JOIN,0};*/
static struct cw_ElemDef join_response_elements[] ={
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_SPAM_VENDOR_SPECIFIC,0, CW_IGNORE},
@ -1415,6 +1438,8 @@ static struct cw_ElemDef configuration_status_request_elements[] ={
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AC_NAME_WITH_INDEX, 0, CW_IGNORE},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_CORE_DUMP, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_VENUE_SETTINGS, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_MAC_OPERATION, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_TX_POWER, 0, 0},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_AP_USERNAME_PASSWORD, 1, 0},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_AP_LOGHOST_CONFIG, 1, 0},
@ -1426,14 +1451,14 @@ static struct cw_ElemDef configuration_status_request_elements[] ={
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_TCP_ADJUST_MSS, 0, 0},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_HARDWARE_INFO, 0, 0},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_ROUGE_DETECTION, 0, 0},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_AP_DTLS_DATA_CFG, 0, 0},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_DISCOVERY_PROTOCOL, 1, 0},
{0,0,0,00}
};
static uint16_t configuration_status_response_states[] = {CAPWAP_STATE_JOIN,0};
/*static uint16_t configuration_status_response_states[] = {CAPWAP_STATE_JOIN,0};*/
static struct cw_ElemDef configuration_status_response_elements[] ={
{0,0, CAPWAP_ELEM_RADIO_ADMINISTRATIVE_STATE, 1,0},
{0,0, CAPWAP_ELEM_RADIO_OPERATIONAL_STATE, 1,0},
@ -1455,7 +1480,7 @@ static struct cw_ElemDef configuration_status_response_elements[] ={
};
static uint16_t configuration_update_request_states[] = {CAPWAP_STATE_RUN,0};
/*static uint16_t configuration_update_request_states[] = {CAPWAP_STATE_RUN,0};*/
static struct cw_ElemDef configuration_update_request_elements[] ={
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_SPAM_VENDOR_SPECIFIC,0, CW_IGNORE},
@ -1513,21 +1538,47 @@ static struct cw_ElemDef configuration_update_request_elements[] ={
};
static uint16_t wtp_event_request_states[] = {CAPWAP_STATE_JOIN,0};
/*static uint16_t wtp_event_request_states[] = {CAPWAP_STATE_JOIN,0};*/
static struct cw_ElemDef wtp_event_request_elements[] ={
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_SPAM_VENDOR_SPECIFIC,0, CW_IGNORE},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_ADD_WLAN, 0, CW_IGNORE},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_HARDWARE_INFO, 0, 0},
{0,0,0,0,0}
};
static uint16_t wtp_event_response_states[] = {CAPWAP_STATE_JOIN,0};
/*static uint16_t wtp_event_response_states[] = {CAPWAP_STATE_JOIN,0};*/
static struct cw_ElemDef wtp_event_response_elements[] ={
/* {0,0,CAPWAP_ELEM_RESULT_CODE, 1, 0},*/
{0,0,0,0,0}
};
static uint16_t wtp_echo_response_states[] = {CAPWAP_STATE_RUN,0};
static struct cw_ElemDef change_state_event_request_elements[] ={
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_SPAM_VENDOR_SPECIFIC, 0, CW_IGNORE},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_ADD_WLAN, 0, CW_IGNORE},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_OPER_STATE_DETAIL_CAUSE, 0, CW_IGNORE},
{CW_PROTO_LWAPP, CW_VENDOR_ID_CISCO, CISCO_LWELEM_HARDWARE_INFO, 0, 0},
{0,0,0,0,0}
};
/*static uint16_t wtp_event_response_states[] = {CAPWAP_STATE_JOIN,0};*/
static struct cw_ElemDef change_state_event_response_elements[] ={
/* {0,0,CAPWAP_ELEM_RESULT_CODE, 1, 0},*/
{0,0,0,0,0}
};
/*static uint16_t wtp_echo_response_states[] = {CAPWAP_STATE_RUN,0};*/
static struct cw_ElemDef wtp_echo_response_elements[] ={
{0,CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_TIMESYNC, 1, 0},
{0,0,0,0,0}
@ -1539,7 +1590,7 @@ static struct cw_MsgDef messages[] = {
NULL, /* name */
CAPWAP_MSG_DISCOVERY_REQUEST, /* type */
CW_ROLE_AC, /* role */
discovery_request_states, /* states */
NULL, /* states */
discovery_request_elements, /* elements */
NULL, /* preprocess fun */
postprocess_discovery /* postprocess fun */
@ -1548,7 +1599,7 @@ static struct cw_MsgDef messages[] = {
NULL, /* name */
CAPWAP_MSG_DISCOVERY_RESPONSE, /* type */
CW_ROLE_WTP,
discovery_response_states,
NULL,
discovery_response_elements,
},
@ -1565,7 +1616,7 @@ static struct cw_MsgDef messages[] = {
NULL, /* name */
CAPWAP_MSG_JOIN_RESPONSE, /* type */
CW_ROLE_WTP,
join_response_states,
NULL,
join_response_elements
},
@ -1583,7 +1634,7 @@ static struct cw_MsgDef messages[] = {
NULL, /* name */
CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE, /* type */
CW_ROLE_WTP,
configuration_status_response_states,
NULL,
configuration_status_response_elements,
NULL /* postprocess */
},
@ -1592,7 +1643,7 @@ static struct cw_MsgDef messages[] = {
NULL, /* name */
CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST, /* type */
CW_ROLE_WTP,
configuration_update_request_states,
NULL,
configuration_update_request_elements,
NULL /* postprocess */
},
@ -1602,7 +1653,7 @@ static struct cw_MsgDef messages[] = {
NULL, /* name */
CAPWAP_MSG_WTP_EVENT_REQUEST, /* msg type */
CW_ROLE_AC, /* role */
wtp_event_request_states, /* allowed states */
NULL, /* allowed states */
wtp_event_request_elements /* msg elements */
},
@ -1610,16 +1661,33 @@ static struct cw_MsgDef messages[] = {
NULL, /* name */
CAPWAP_MSG_WTP_EVENT_RESPONSE, /* msg type */
CW_ROLE_WTP, /* role */
wtp_event_response_states, /* allowed states */
NULL, /* allowed states */
wtp_event_response_elements /* msg elements */
},
{
NULL, /* name */
CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST, /* msg type */
CW_ROLE_AC, /* role */
NULL, /* allowed states */
change_state_event_request_elements /* msg elements */
},
{
NULL, /* name */
CAPWAP_MSG_CHANGE_STATE_EVENT_RESPONSE, /* msg type */
CW_ROLE_WTP, /* role */
NULL, /* allowed states */
change_state_event_response_elements /* msg elements */
},
{
NULL, /* name */
CAPWAP_MSG_ECHO_RESPONSE, /* msg type */
CW_ROLE_WTP, /* role */
wtp_echo_response_states, /* allowed states */
NULL, /* allowed states */
wtp_echo_response_elements /* msg elements */
},
@ -1641,7 +1709,7 @@ static struct cw_ElemHandler handlers75[] = {
}
,
{
"Mac Operation (Version >= 7.5", /* name */
"Mac Operation (Version >= 7.5)", /* name */
CISCO_ELEM_MAC_OPERATION, /* Element ID */
CW_VENDOR_ID_CISCO,0, /* Vendor / Proto */
17,17, /* min/max length */
@ -1654,15 +1722,35 @@ static struct cw_ElemHandler handlers75[] = {
{0,0,0,0,0,0,0,0}
};
static struct cw_MsgDef messages75[] = {
{0,0,0,0}
};
static cw_StateMachineState_t statemachine_states[]={
{
CAPWAP_STATE_CONFIGURE,CAPWAP_STATE_DATA_CHECK,
NULL,0,
1, NULL,
CAPWAP_STATE_DATA_CHECK,CAPWAP_STATE_RUN
}
,
{0,0,0}
};
struct cw_MsgSet * cisco_register_msg_set(struct cw_MsgSet * set, int mode){
if (mode != CW_MOD_MODE_CAPWAP)
return NULL;
cw_msgset_add(set,messages, handlers73);
cw_msgset_add_states(set,statemachine_states);
return set;
}

View File

@ -20,7 +20,7 @@ int cisco_in_spam_vendor_specific(struct cw_ElemHandler *eh,
cw_dbg(DBG_WARN,
"Can't handle Vendor Specific LWAPP Payload %s/%d, in msg %d (%s) in %s state.",
cw_strvendor(vendor_id), elem_id, params->msgdata->type,
params->msgdata->name, cw_strstate(params->conn->capwap_transition));
params->msgdata->name, cw_strstate(params->conn->capwap_state));
return 0;
}

View File

@ -49,10 +49,11 @@
#define CISCO_LWELEM_PATH_MTU 73
#define CISCO_LWELEM_TCP_ADJUST_MSS 77
#define LW_CISCO_PRIMED_JOIN_TIMEOUT 85
#define LW_CISCO_AP_DTLS_DATA_CFG 74
#define CISCO_LWELEM_AP_DTLS_DATA_CFG 74
#define CISCO_LWELEM_RAD_EXTENDED_CONFIG 111
#define CISCO_LWELEM_ADD_WLAN 128
#define CISCO_LWELEM_AP_DNS_SERV_IP_ADD 121
#define CISCO_LWELEM_VLAN 123
#define CISCO_LWELEM_SSC_HASH_VALIDATION 133

View File

@ -1,5 +1,5 @@
ac-descriptor/active-wtps :Word: 1
ac-descriptor/dtls-policy :Byte: 0
ac-descriptor/dtls-policy :Byte: 1
ac-descriptor/hardware/vendor :Dword: 4232704
ac-descriptor/hardware/version :Bstr16: .x01000001
ac-descriptor/max-wtps :Word: 200
@ -7,19 +7,19 @@ 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: .x07056600
ac-descriptor/software/version :Bstr16: .x08007900
ac-descriptor/station-limit :Word: 1000
ac-descriptor/stations :Word: 0
ac-name :Bstr16: CisAC175
ac-name :Bstr16: CisAC
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.175
capwap-control-ip-address/address.1 :IPAddress: 192.168.0.175
capwap-control-ip-address/address.0 :IPAddress: 192.168.0.180
capwap-control-ip-address/address.1 :IPAddress: 192.168.0.180
capwap-control-ip-address/address.2 :IPAddress: 192.168.0.173
capwap-control-ip-address/wtps.0 :Word: 1
capwap-control-ip-address/wtps.0 :Word: 0
capwap-control-ip-address/wtps.1 :Word: 1
capwap-control-ip-address/wtps.2 :Word: 1
capwap-local-ip-address :IPAddress: 192.168.56.1
@ -61,7 +61,7 @@ cisco/ap-regulatory-domain.1/slot :Byte: 1
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: 1525354079
cisco/ap-timesync/timestamp :Dword: 1525620931
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:
@ -77,7 +77,7 @@ 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/hash/hash :Bstr16: 88ba29f4725fcbc8fd02843186b94692f107ecb0
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
@ -89,12 +89,12 @@ cisco/lw_path_mtu/max :Word: 1485
cisco/mwar-addr/address :IPAddress: 192.168.0.180
cisco/mwar-addr/mwar-type :Byte: 1
cisco/mwar-addr/unknown :Word: 0
cisco/mwar-hash-value :Bstr16: 88ba29f4725fcbc8fd02843186b94692f107ecb0
cisco/mwar-type :Byte: 1
cisco/rouge-and-mss/enable :Bool: true
cisco/mwar-hash-value :Bstr16: c4084177cd95ddbba1237bfcb3de6780fdf48214
cisco/mwar-type :Byte: 0
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: 1234
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
@ -127,7 +127,7 @@ 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/mac-operation/byte75 :Byte: 0
radio.0/cisco/mac-operation/fragmentation-threshold :Word: 1234
radio.0/cisco/mac-operation/fragmentation-threshold :Word: 2346
radio.0/cisco/mac-operation/long-retry :Byte: 4
radio.0/cisco/mac-operation/reserved :Word: 1
radio.0/cisco/mac-operation/rts-threshold :Word: 2347
@ -182,7 +182,7 @@ 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/mac-operation/byte75 :Byte: 0
radio.1/cisco/mac-operation/fragmentation-threshold :Word: 1233
radio.1/cisco/mac-operation/fragmentation-threshold :Word: 2346
radio.1/cisco/mac-operation/long-retry :Byte: 4
radio.1/cisco/mac-operation/reserved :Word: 257
radio.1/cisco/mac-operation/rts-threshold :Word: 2347
@ -195,7 +195,7 @@ 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/current-tx-power :Word: 0
radio.1/cisco/tx-power/reserved :Byte: 1
radio.1/cisco/wtp-radio-config/beacon-period :Word: 700
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
@ -203,7 +203,7 @@ 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: 13
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: 65536
radio.1/cisco/wtp-radio-config/unknown75 :Byte: 1
@ -219,7 +219,7 @@ radio.1/wlan.0/encryption-policy :Dword: 16777216
radio.1/wlan.0/max-stations :Byte: 200
radio.1/wlan.0/radio-id :Byte: 1
radio.1/wlan.0/session-timout :Word: 1800
radio.1/wlan.0/ssid :Str: Superlan
radio.1/wlan.0/ssid :Str: TubeSSID
radio.1/wlan.0/ssid-a :Str: Schlosspark
radio.1/wlan.0/wep-key :Bstr16: .xaa0c0a02000000000000000000
radio.1/wlan.0/wlan-capability :Word: 1
@ -269,7 +269,7 @@ 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: .x07056600
wtp-descriptor/software/version :Bstr16: .x08007900
wtp-fallback :Byte: 1
wtp-frame-tunnel-mode :Byte: 4
wtp-mac-type :Byte: 1

View File

@ -148,7 +148,7 @@ static int run_discovery(struct conn *conn, struct cw_DiscoveryResult * dis)
}
conn->capwap_transition = CAPWAP_STATE_DISCOVERY;
conn->capwap_state = CAPWAP_STATE_DISCOVERY;
/* create and send a discovery request message */
@ -164,7 +164,7 @@ static int run_discovery(struct conn *conn, struct cw_DiscoveryResult * dis)
while (!cw_timer_timeout(timer)
&& conn->capwap_transition == CAPWAP_STATE_DISCOVERY) {
&& conn->capwap_state == CAPWAP_STATE_DISCOVERY) {
int rc;
char addr_str[SOCK_ADDR_BUFSIZE];

View File

@ -116,7 +116,7 @@ int run_join_d(struct conn * conn, struct sockaddr *sa)
}
/* setup a socket */
conn->capwap_transition = CAPWAP_STATE_JOIN;
conn->capwap_state = CAPWAP_STATE_JOIN;
sockfd = socket(sa->sa_family, SOCK_DGRAM, 0);
if (sockfd == -1) {
cw_log(LOG_ERR, "Can't create socket: %s\n", strerror(errno));
@ -155,6 +155,7 @@ int run_join_d(struct conn * conn, struct sockaddr *sa)
cw_dbg(DBG_DTLS, "DTLS Connection successful established with %s",
sock_addr2str(sa,addrstr));
run_join(conn);
return 1;
}

View File

@ -140,7 +140,7 @@ int run(struct conn * conn)
conn->capwap_transition = CAPWAP_STATE_RUN;
conn->capwap_state = CAPWAP_STATE_RUN;
/* conn->msg_end=handle_update_req;*/
@ -156,7 +156,7 @@ int run(struct conn * conn)
while (!cw_timer_timeout(timer) && conn->capwap_transition == CAPWAP_STATE_RUN) {
while (!cw_timer_timeout(timer) && conn->capwap_state == CAPWAP_STATE_RUN) {
mavl_del_all(conn->remote_cfg);
rc = cw_read_messages(conn);
if (rc < 0 && errno == EAGAIN) {
@ -196,7 +196,7 @@ int run(struct conn * conn)
} while (conn->capwap_transition == CAPWAP_STATE_RUN);
} while (conn->capwap_state == CAPWAP_STATE_RUN);
/*

View File

@ -193,7 +193,9 @@ exit(0);
cw_discovery_init_results(&dis);
/*cw_run_discovery(conn, "255.255.255.255","192.168.56.1", &dis);*/
cw_run_discovery(conn, "255.255.255.255",NULL, &dis);
/* cw_run_discovery(conn, "255.255.255.255",NULL, &dis);*/
cw_run_discovery(conn, "255.255.255.255","192.168.0.14", &dis);
cw_dbg_ktv_dump(dis.prio_ip, DBG_INFO, "=== IP list ===", "IP", "=== END IP List ===");
/*