diff --git a/actube.workspace b/actube.workspace index b8870938..e0162c79 100644 --- a/actube.workspace +++ b/actube.workspace @@ -3,9 +3,9 @@ - + - + diff --git a/src/ac/ac.conf b/src/ac/ac.conf index 4bd78d87..c71cc501 100644 --- a/src/ac/ac.conf +++ b/src/ac/ac.conf @@ -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 diff --git a/src/ac/config.ktv b/src/ac/config.ktv index 2a24996b..d6770dbe 100644 --- a/src/ac/config.ktv +++ b/src/ac/config.ktv @@ -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 + diff --git a/src/ac/shell.c b/src/ac/shell.c index 813710c1..d2454965 100644 --- a/src/ac/shell.c +++ b/src/ac/shell.c @@ -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); -} \ No newline at end of file + pthread_create (&thread, NULL, run_shell, + NULL); +} diff --git a/src/ac/wtpman.c b/src/ac/wtpman.c index 3ec00ad3..12f49cdc 100644 --- a/src/ac/wtpman.c +++ b/src/ac/wtpman.c @@ -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) diff --git a/src/cw/capwap.h b/src/cw/capwap.h index caac52be..23b683c8 100644 --- a/src/cw/capwap.h +++ b/src/cw/capwap.h @@ -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 }; diff --git a/src/cw/capwap_strings_state.c b/src/cw/capwap_strings_state.c index 02519f75..127d043f 100644 --- a/src/cw/capwap_strings_state.c +++ b/src/cw/capwap_strings_state.c @@ -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" }, }; diff --git a/src/cw/conn.h b/src/cw/conn.h index 631dc2df..e6e733ab 100644 --- a/src/cw/conn.h +++ b/src/cw/conn.h @@ -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 */ diff --git a/src/cw/conn_process_packet.c b/src/cw/conn_process_packet.c index dd751f32..d1014a03 100644 --- a/src/cw/conn_process_packet.c +++ b/src/cw/conn_process_packet.c @@ -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 */ diff --git a/src/cw/cw.h b/src/cw/cw.h index 43c59e34..9b5c3acf 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -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 ); diff --git a/src/cw/cw_out_generic.c b/src/cw/cw_out_generic.c index 8acf4764..0fbeb593 100644 --- a/src/cw/cw_out_generic.c +++ b/src/cw/cw_out_generic.c @@ -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 ) { diff --git a/src/cw/dbg.c b/src/cw/dbg.c index 1ced27f6..5f9dbfb7 100644 --- a/src/cw/dbg.c +++ b/src/cw/dbg.c @@ -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 - "}, diff --git a/src/cw/dbg.h b/src/cw/dbg.h index dbedfd14..8a49e99c 100644 --- a/src/cw/dbg.h +++ b/src/cw/dbg.h @@ -118,6 +118,8 @@ enum cw_dbg_levels{ /** Debug Mods */ DBG_MOD, + DBG_STATE, /**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 diff --git a/src/cw/msgset.h b/src/cw/msgset.h index 3b7ae301..6c391991 100644 --- a/src/cw/msgset.h +++ b/src/cw/msgset.h @@ -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); diff --git a/src/mod/capwap/capwap_actions_ac.c b/src/mod/capwap/capwap_actions_ac.c index ed20b482..0f873122 100644 --- a/src/mod/capwap/capwap_actions_ac.c +++ b/src/mod/capwap/capwap_actions_ac.c @@ -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); diff --git a/src/mod/capwap/capwap_in_vendor_specific_payload.c b/src/mod/capwap/capwap_in_vendor_specific_payload.c index 4b5052bb..eb156d0e 100644 --- a/src/mod/capwap/capwap_in_vendor_specific_payload.c +++ b/src/mod/capwap/capwap_in_vendor_specific_payload.c @@ -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; } diff --git a/src/mod/cisco/Makefile b/src/mod/cisco/Makefile index 59e0db76..111cb156 100644 --- a/src/mod/cisco/Makefile +++ b/src/mod/cisco/Makefile @@ -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 diff --git a/src/mod/cisco/capwap_cisco.h b/src/mod/cisco/capwap_cisco.h index 0b88f345..056e4b8f 100644 --- a/src/mod/cisco/capwap_cisco.h +++ b/src/mod/cisco/capwap_cisco.h @@ -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 diff --git a/src/mod/cisco/cisco_actions_ac.c b/src/mod/cisco/cisco_actions_ac.c index a5b2b7bc..ada2b335 100644 --- a/src/mod/cisco/cisco_actions_ac.c +++ b/src/mod/cisco/cisco_actions_ac.c @@ -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; } diff --git a/src/mod/cisco/cisco_in_spam_vendor_specific.c b/src/mod/cisco/cisco_in_spam_vendor_specific.c index 7a8d38f2..d9e8c666 100644 --- a/src/mod/cisco/cisco_in_spam_vendor_specific.c +++ b/src/mod/cisco/cisco_in_spam_vendor_specific.c @@ -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; } diff --git a/src/mod/cisco/lwapp_cisco.h b/src/mod/cisco/lwapp_cisco.h index 149c40e9..fb3b9643 100644 --- a/src/mod/cisco/lwapp_cisco.h +++ b/src/mod/cisco/lwapp_cisco.h @@ -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 diff --git a/src/wtp/cisco.ktv b/src/wtp/cisco.ktv index c174138f..c2988356 100644 --- a/src/wtp/cisco.ktv +++ b/src/wtp/cisco.ktv @@ -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 diff --git a/src/wtp/discovery.c b/src/wtp/discovery.c index aa9b2352..b2c82c73 100644 --- a/src/wtp/discovery.c +++ b/src/wtp/discovery.c @@ -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]; diff --git a/src/wtp/join.c b/src/wtp/join.c index 07e5e6f5..e4bae60b 100644 --- a/src/wtp/join.c +++ b/src/wtp/join.c @@ -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; } diff --git a/src/wtp/run.c b/src/wtp/run.c index 220db50b..376da582 100644 --- a/src/wtp/run.c +++ b/src/wtp/run.c @@ -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); /* diff --git a/src/wtp/wtp_main.c b/src/wtp/wtp_main.c index fe5487fd..734aca51 100644 --- a/src/wtp/wtp_main.c +++ b/src/wtp/wtp_main.c @@ -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 ==="); /*