Compare commits

..

No commits in common. "add6ffa314f8d0cc3b4192c78765eba1794820da" and "9e54e46e45e8e8c4acb37094216d526995b7ecaa" have entirely different histories.

35 changed files with 2070 additions and 420 deletions

View File

@ -1,23 +1,16 @@
.OBJDIR: ./
all: ac wtp
all:
$(MAKE) -C src/cw
$(MAKE) -C src/mod
$(MAKE) -C src/ac
$(MAKE) -C src/wtp
clean:
$(MAKE) -C src/cw clean
$(MAKE) -C src/mod clean
$(MAKE) -C src/ac clean
$(MAKE) -C src/wtp clean
cw:
$(MAKE) -C src/cw
ac: cw mod
$(MAKE) -C src/ac
wtp: cw mod
$(MAKE) -C src/wtp
mod: cw
$(MAKE) -C src/mod

View File

@ -9,8 +9,6 @@ OBJS = \
socklist.o \
discovery_cache.o\
shell.o\
statemachine.o\
PRG=actube
LIBPATH=-L../../lib/$(KERNEL)/$(ARCH)/ -L/usr/local/lib -L/usr/lib

View File

@ -50,7 +50,7 @@
int ac_run(cw_Cfg_t * cfg);
#include "statemachine.h"
#include <getopt.h>
@ -184,11 +184,6 @@ int main (int argc, char *argv[])
/* parse arguments */
parse_args (argc, argv, &bootcfg);
cw_statemachine_run(NULL);
exit(0);
global_cfg=cw_cfg_create();
if (!global_cfg){
fprintf(stderr,"Can't create global_cfg: %s\n",strerror(errno));
@ -505,7 +500,6 @@ void process_cw_ctrl_packet (int index, struct sockaddr *addr, uint8_t * buffer,
wtpman_start (wtpman, preamble & 0xf);
}
printf("Got Packet with len: %d\n",len);
wtpman_addpacket (wtpman, buffer, len);
wtplist_unlock();

View File

@ -1,137 +0,0 @@
#include <stdint.h>
#include <mavl.h>
#include "cw/capwap.h"
#include "cw/dbg.h"
#include "statemachine.h"
static cw_StateMachineState_t statemachine_states[];
int cw_statemachine_run(struct cw_StateMachine * mach)
{
struct mavl * st = cw_statemachine_load_states(NULL,statemachine_states);
mavl_destroy(st);
return 0;
}
static cw_StateMachineState_t statemachine_states[]={
{ CW_STATE_NONE, CAPWAP_STATE_DISCOVERY, /* transition */
NULL,0 /* timer */
}
,
{
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}
};
static int cmp_statemachine_state(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;
}
struct mavl * cw_statemachine_load_states (struct mavl * statemachine_states, cw_StateMachineState_t * states)
{
cw_StateMachineState_t * s;
int replaced;
cw_dbg(DBG_STATE,"Loading State Machine States");
if (statemachine_states == NULL){
statemachine_states = mavl_create(cmp_statemachine_state,NULL,sizeof(cw_StateMachineState_t));
if (statemachine_states == NULL)
return NULL;
}
s=states;
while (s->state != 0){
const char * repstr;
mavl_replace(statemachine_states,s,&replaced);
if (replaced){
repstr = "Replacing";
}
else{
repstr = "Adding";
}
cw_dbg(DBG_STATE," %s: [%s->%s]",repstr,
cw_strstate(s->prevstate),
cw_strstate(s->state));
s++;
}
return 1;
}

View File

@ -1,13 +0,0 @@
#ifndef STATEMACHINE_H
#define STATEMACHINE_H
struct cw_StateMachine{
uint8_t prevstate,currentstate;
};
struct mavl * cw_statemachine_load_states (struct mavl * statemachine_states, cw_StateMachineState_t * states);
int cw_statemachine_run(struct cw_StateMachine * mach);
#endif

View File

@ -86,10 +86,6 @@ static void wtpman_remove(struct wtpman *wtpman)
static void wtpman_run_discovery(void *arg)
{
cw_dbg(DBG_STATE,"Run discovery");
exit(0);
struct wtpman *wtpman = (struct wtpman *) arg;
time_t timer = cw_timer_start(10);
@ -274,8 +270,6 @@ void *wtpman_run_data(void *wtpman_arg)
}
int cw_run_state_machine(struct cw_Conn *conn, time_t * timer)
{
@ -286,7 +280,7 @@ int cw_run_state_machine(struct cw_Conn *conn, time_t * timer)
while (1) {
search.state = conn->capwap_state;
search.prevstate = conn->capwap_prevstate;
result = mavl_get(conn->msgset->statemachine_states, &search);
result = mavl_get(conn->msgset->state_machine, &search);
cw_dbg(DBG_STATE, "State transition: [%s -> %s]",
cw_strstate(conn->capwap_prevstate),
@ -661,8 +655,7 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
wtpman = malloc(sizeof(struct wtpman));
if (!wtpman)
return 0;
memset(wtpman, 0, sizeof(struct wtpman));
if (socklist[socklistindex].type != SOCKLIST_UNICAST_SOCKET) {
@ -683,6 +676,11 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
sockfd = replyfd; /*//socklist[socklistindex].reply_sockfd; */
dbgaddrl = sizeof(dbgaddr);
getsockname(sockfd, &dbgaddr, &dbgaddrl);
@ -690,25 +688,26 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
sock_addr2str(&dbgaddr, sock_buf), sock_getport(&dbgaddr));
memset(wtpman, 0, sizeof(struct wtpman));
wtpman->global_cfg = global_cfg;
wtpman->conn = cw_conn_create(sockfd, srcaddr, 5);
if (!wtpman->conn) {
wtpman_destroy(wtpman);
return NULL;
}
wtpman->conn->role = CW_ROLE_AC;
wtpman->conn->data_sock = socklist[socklistindex].data_sockfd;
sock_copyaddr(&wtpman->conn->data_addr,
(struct sockaddr *) &wtpman->conn->addr);
if (!wtpman->conn) {
wtpman_destroy(wtpman);
return NULL;
}
// wtpman->conn->mods = conf_mods;
wtpman->conn->mods = conf_mods;
wtpman->conn->strict_capwap = conf_strict_capwap;
wtpman->conn->strict_hdr = conf_strict_headers;

View File

@ -31,12 +31,6 @@ struct wtpman {
cw_timer_t echointerval_timer;
cw_Cfg_t * global_cfg; /**< contains the cfg of AC,
visible to all wtpman threads.
The global cfg was initally read
from a .ckv file on startup.
*/
};

View File

@ -45,6 +45,7 @@ CWSRC=\
cw_put_elem_radio_operational_state.c\
cw_put_image_data.c\
cw_put_local_ip_address.c\
cw_put_msg.c\
cw_radio_set_admin_state.c\
cw_rand.c\
cw_randint.c\
@ -206,7 +207,6 @@ MISCSRC=\
# conn_init.c\
# conn_create.c\
# conn_send_request.c\
# cw_put_msg.c\
DTLSSRC+=\
dtls_bio.c\

View File

@ -641,10 +641,14 @@ struct cw_ac_status {
*/
enum capwap_states {
CW_STATE_NONE = 0,
CAPWAP_STATE_DISCOVERY, /**< Discovery State */
CAPWAP_STATE_JOIN, /**< Join State */
/** Discovery State */
CAPWAP_STATE_DISCOVERY,
/** Join State */
CAPWAP_STATE_JOIN,
CAPWAP_STATE_JOIN_COMPLETE,
CAPWAP_STATE_CONFIGURE, /**< Config State */
/** Config State */
CAPWAP_STATE_CONFIGURE,
CAPWAP_STATE_DTLS_SETUP, /**< DTLS Setup */
/** Image Data Upload */
CW_STATE_IMAGE_DATA,

View File

@ -2,7 +2,6 @@
#include "capwap.h"
struct cw_StrListElem capwap_strings_state[] = {
{ CW_STATE_NONE, "None"},
{ CAPWAP_STATE_DISCOVERY, "Discovery" },
{ CAPWAP_STATE_JOIN,"Join" },
{ CAPWAP_STATE_RUN,"Run" },
@ -12,5 +11,6 @@ struct cw_StrListElem capwap_strings_state[] = {
{ CAPWAP_STATE_DATA_CHECK, "Data Check" },
{ CAPWAP_STATE_TIMEOUT, "Timeout"},
{ CW_STR_STOP,"Undefined" },
};

View File

@ -491,17 +491,6 @@ int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def)
return v.val.boolean;
}
uint8_t cw_cfg_get_byte(cw_Cfg_t * cfg, char *key, const char * def)
{
struct cw_Val v;
const char *s = cw_cfg_get(cfg,key,def);
CW_TYPE_BYTE->from_str(&v,s);
return v.val.word;
}
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def)
{
struct cw_Val v;

View File

@ -32,7 +32,6 @@ void cw_cfg_iter_init(cw_Cfg_t * cfg, struct cw_Cfg_iter *cfi, const char *base)
int cw_cfg_get_bool(cw_Cfg_t * cfg, const char * key, const char *def);
uint16_t cw_cfg_get_word(cw_Cfg_t * cfg, char *key, const char * def);
void cw_cfg_set_int(cw_Cfg_t * cfg, const char * key, int val);
uint8_t cw_cfg_get_byte(cw_Cfg_t * cfg, char *key, const char * def);
#endif

View File

@ -1,5 +1,4 @@
#include <string.h>
#include <stdint.h>
#include "conn.h"
@ -18,12 +17,6 @@
#include "cw.h"
#include "dbg.h"
#include "msgset.h"
#include "mavltypes.h"
static int write_header(struct cw_ElemHandler * handler, uint8_t * dst, int len)
@ -39,144 +32,6 @@ static int header_len(struct cw_ElemHandler * handler)
return handler->vendor ? 10 : 4;
}
/**
* Put a message to a buffer
* This functions assumes, that a message header is
* alread initilaized in buffer
* Message alements are taken fom actiondef in #conn->action
*/
int cw_assemble_message(struct cw_Conn *conn, uint8_t * rawout)
{
char details[1024];
uint8_t *msgptr,*dst;
int type;
struct cw_MsgData * msg;
struct mlistelem * elem;
int len,l;
cw_dbg(DBG_INFO, "Number of elements in ktv: %d",conn->local_cfg->count);
/* cw_dbg_ktv_dump(conn->local_cfg,DBG_CFG_DMP,"Local CFG","LOCAL:","End Local CFG");*/
/* rawout is already initialized, so we can get
* msg type from buffer */
msgptr = rawout + cw_get_hdr_msg_offset(rawout);
type = cw_get_msg_type(msgptr);
/* look for message data */
msg = cw_msgset_get_msgdata(conn->msgset,type);
if (msg == NULL){
cw_log(LOG_ERR,"Error: Can't create message of type %d (%s) - no definition found.",
type, cw_strmsg(type));
return CAPWAP_RESULT_MSG_UNRECOGNIZED;
}
if (msg->preprocess){
msg->preprocess(conn);
}
cw_dbg(DBG_MSG_ASSEMBLY,"*** Assembling message of type %d (%s) ***",
msg->type, msg->name);
dst = msgptr+8;
len =0;
mlist_foreach(elem,msg->elements_list){
struct cw_ElemData * data;
struct cw_ElemHandler * handler;
struct cw_ElemHandlerParams params;
data = mlistelem_dataptr(elem);
handler = cw_msgset_get_elemhandler(conn->msgset,data->proto,data->vendor,data->id);
printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name);
if (handler==NULL){
cw_log(LOG_ERR,"Can't put message element %d %d %d, no handler defined.",
data->proto,data->vendor,data->id);
continue;
}
cw_dbg(DBG_X,"Hello!");
if (handler->put == NULL){
if (data->mand){
cw_log(LOG_ERR,"Error: Can't add mandatory message element %d - %s, no put method defined",
handler->id, handler->name);
}
continue;
}
/* params.conn=conn;*/
params.local_cfg=conn->local_cfg;
params.remote_cfg=conn->remote_cfg;
params.default_cfg=conn->default_cfg;
params.global_cfg=conn->global_cfg;
params.msgset=conn->msgset;
params.elemdata = data;
params.msgdata=msg;
params.debug_details=details;
*details=0;
/* if (strcmp(handler->key,"cisco/ap-led-flash-config")==0){
printf("flash config\n");
cisco/ap-led-flash-config/flash-enable
}*/
cw_dbg(DBG_X,"Calling Handler put for %s",handler->name);
l = handler->put(handler,&params,dst+len);
cw_dbg(DBG_X,"L = %d",l);
/* if(l>0)
cw_dbg_elem(DBG_ELEM_OUT,conn,type,handler,dst+len,l);
* if (strlen(details)){
cw_dbg(DBG_ELEM_DETAIL," %s",params.debug_details);
}
*/ len += l;
}
cw_set_msg_elems_len(msgptr, len);
cw_dbg(DBG_MSG_ASSEMBLY,"*** Done assenmbling message of type %d (%s) ***",
msg->type, msg->name);
if (type & 1) {
/* It's a request, so we have to set seqnum */
int s = conn_get_next_seqnum(conn);
cw_set_msg_seqnum(msgptr,s);
}
{
printf ("----------------------------------- redecode -----------------------------\n");
uint8_t *elems_ptr;
int offset = cw_get_hdr_msg_offset(rawout);
uint8_t *msg_ptr = rawout + offset;
int elems_len = cw_get_msg_elems_len(msg_ptr);
elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
mavl_t * cfg = cw_ktv_create();
struct cw_ElemHandlerParams params;
params.remote_cfg=cfg;
params.msgset=conn->msgset;
params.msgdata=msg;
cw_decode_elements( &params, elems_ptr,elems_len);
printf ("----------------------------------- end redecode -----------------------------\n");
}
return CAPWAP_RESULT_SUCCESS;
}
/**
* Basic initialization of a conn object

View File

@ -235,7 +235,7 @@ struct cw_Conn {
int detected;
// void * mods;
void * mods;
int (*msg_start)(struct cw_Conn*conn,struct cw_action_in *a,uint8_t*data,int len,struct sockaddr *from);

View File

@ -118,7 +118,7 @@ int cw_send_response(struct cw_Conn *conn, uint8_t * rawmsg, int len)
{
int rc;
cw_init_response(conn, rawmsg);
rc = cw_assemble_message(conn, conn->resp_buffer);
rc = cw_put_msg(conn, conn->resp_buffer);
if (!cw_result_is_ok(rc))
return 0;
conn_send_msg(conn, conn->resp_buffer);
@ -390,15 +390,16 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
params.cfg = cw_cfg_create();
cw_decode_elements(&params,elems_ptr, elems_len);
exit(0);
/* all message elements are processed, do now after processing
by calling the "end" function for the message */
cw_check_missing_mand(message, mand_found);
cw_dbg(DBG_MSG_PARSING, " *** End parsing message of type %d (%s) ***",
cw_dbg(DBG_MSG_PARSING, " *** Done parsing message of type %d (%s) ***",
message->type, message->name);
mavl_destroy(mand_found);
/* cw_dbg_ktv_dump(conn->remote_cfg,DBG_CFG_DMP,
@ -440,6 +441,7 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
*/
}
/*stravltree_destroy(conn->mand); */
return result_code;
@ -660,7 +662,6 @@ int cw_read_messages(struct cw_Conn *conn)
{
uint8_t buf[2024];
int len = 2024;
cw_dbg(DBG_X,"Conn cw_read_messages from dsco request");
int n = conn->read(conn, buf, len);
if (n < 0)

View File

@ -0,0 +1,64 @@
/*
This file is part of libcapwap.
libcapwap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
libcapwap is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
/**
*@file
*@brief conn_send_request
*/
#include "capwap.h"
#include "cw_util.h"
#include "log.h"
/**
* Send a request message and wait for its response
* @param conn the connection
*
* The message has to be prepared and put to conn->req_msg
*
*/
/*
struct cwrmsg * conn_send_request(struct conn * conn)
{
int i;
struct cwrmsg * cwrmsg;
struct cwmsg * cwmsg = &conn->req_msg;
for (i=0; i<conn->max_retransmit; i++) {
time_t r_timer = cw_timer_start(conn->retransmit_interval);
if (i!=0)
cw_dbg(DBG_MSG_ERR,"Retransmitting message, type=%d,seq=%d",cwmsg->type,cwmsg->seqnum);
conn_send_cwmsg(conn,&conn->req_msg);
cwrmsg = conn_wait_for_message(conn,r_timer);
if (cwrmsg){
if (cwrmsg->type == conn->req_msg.type+1){
return cwrmsg;
}
}
}
cw_dbg(DBG_MSG_ERR,"Max retransmit's reached, message type=%d,seq=%d",cwmsg->type,cwmsg->seqnum);
return 0;
}
*/

View File

@ -536,7 +536,7 @@ uint8_t *cw_init_data_keep_alive_msg(uint8_t * buffer,uint8_t *rmac);
int cw_put_elem_session_id(uint8_t *dst, uint8_t *session_id, int len);
int cw_result_is_ok( int rc );
int cw_assemble_message(struct cw_Conn *conn, uint8_t * rawout);
int cw_put_msg(struct cw_Conn *conn, uint8_t * rawout);
/**
* @}

View File

@ -21,6 +21,150 @@
* @brief implementation of cw_put_msg.
*/
#include "cw.h"
#include "conn.h"
#include "log.h"
#include "dbg.h"
#include "msgset.h"
#include "mavltypes.h"
/**
* Put a message to a buffer
* This functions assumes, that a message header is
* alread initilaized in buffer
* Message alements are taken fom actiondef in #conn->action
*/
int cw_put_msg(struct cw_Conn *conn, uint8_t * rawout)
{
char details[1024];
uint8_t *msgptr,*dst;
int type;
struct cw_MsgData * msg;
struct mlistelem * elem;
int len,l;
printf("Hello msg\n");
cw_dbg(DBG_INFO, "Number of elements in ktv: %d",conn->local_cfg->count);
/* cw_dbg_ktv_dump(conn->local_cfg,DBG_CFG_DMP,"Local CFG","LOCAL:","End Local CFG");*/
/* rawout is already initialized, so we can get
* msg type from buffer */
msgptr = rawout + cw_get_hdr_msg_offset(rawout);
type = cw_get_msg_type(msgptr);
/* look for message data */
msg = cw_msgset_get_msgdata(conn->msgset,type);
if (msg == NULL){
cw_log(LOG_ERR,"Error: Can't create message of type %d (%s) - no definition found.",
type, cw_strmsg(type));
return CAPWAP_RESULT_MSG_UNRECOGNIZED;
}
if (msg->preprocess){
msg->preprocess(conn);
}
cw_dbg(DBG_MSG_ASSEMBLY,"*** Assembling message of type %d (%s) ***",
msg->type, msg->name);
dst = msgptr+8;
len =0;
mlist_foreach(elem,msg->elements_list){
struct cw_ElemData * data;
struct cw_ElemHandler * handler;
struct cw_ElemHandlerParams params;
data = mlistelem_dataptr(elem);
handler = cw_msgset_get_elemhandler(conn->msgset,data->proto,data->vendor,data->id);
printf("Elem: %d %d %d %s\n", data->proto, data->vendor, data->id, handler->name);
if (handler==NULL){
cw_log(LOG_ERR,"Can't put message element %d %d %d, no handler defined.",
data->proto,data->vendor,data->id);
continue;
}
if (handler->put == NULL){
if (data->mand){
cw_log(LOG_ERR,"Error: Can't add mandatory message element %d - %s, no put method defined",
handler->id, handler->name);
}
continue;
}
/* params.conn=conn;*/
params.local_cfg=conn->local_cfg;
params.remote_cfg=conn->remote_cfg;
params.default_cfg=conn->default_cfg;
params.global_cfg=conn->global_cfg;
params.msgset=conn->msgset;
params.elemdata = data;
// params.elem=NULL;
params.msgdata=msg;
params.debug_details=details;
*details=0;
if (strcmp(handler->key,"cisco/ap-led-flash-config")==0){
printf("flash config\n");
/* cisco/ap-led-flash-config/flash-enable */
}
l = handler->put(handler,&params,dst+len);
/* if(l>0)
cw_dbg_elem(DBG_ELEM_OUT,conn,type,handler,dst+len,l);
* if (strlen(details)){
cw_dbg(DBG_ELEM_DETAIL," %s",params.debug_details);
}
*/ len += l;
}
cw_set_msg_elems_len(msgptr, len);
cw_dbg(DBG_MSG_ASSEMBLY,"*** Done assenmbling message of type %d (%s) ***",
msg->type, msg->name);
if (type & 1) {
/* It's a request, so we have to set seqnum */
int s = conn_get_next_seqnum(conn);
cw_set_msg_seqnum(msgptr,s);
}
{
printf ("----------------------------------- redecode -----------------------------\n");
uint8_t *elems_ptr;
int offset = cw_get_hdr_msg_offset(rawout);
uint8_t *msg_ptr = rawout + offset;
int elems_len = cw_get_msg_elems_len(msg_ptr);
elems_ptr = cw_get_msg_elems_ptr(msg_ptr);
mavl_t * cfg = cw_ktv_create();
struct cw_ElemHandlerParams params;
params.remote_cfg=cfg;
params.msgset=conn->msgset;
params.msgdata=msg;
cw_decode_elements( &params, elems_ptr,elems_len);
printf ("----------------------------------- end redecode -----------------------------\n");
}
return CAPWAP_RESULT_SUCCESS;
}
/**
* Put a message to a buffer

View File

@ -55,7 +55,7 @@ uint32_t cw_dbg_opt_level = 0;
static struct cw_StrListElem theme0[] = {
static struct cw_StrListElem color_on[] = {
{DBG_PKT_IN, ANSI_YELLOW},
{DBG_PKT_OUT, ANSI_YELLOW ANSI_ITALIC},
@ -86,7 +86,7 @@ static struct cw_StrListElem theme0[] = {
{DBG_INFO, ANSI_DEFAULT},
{DBG_STATE, ANSI_GREEN ANSI_BOLD},
{DBG_STATE, ANSI_BBLACK ANSI_BOLD },
{DBG_RFC, ANSI_BRED},
{DBG_X, "\x1b[31m"},
@ -98,9 +98,6 @@ static struct cw_StrListElem theme0[] = {
{CW_STR_STOP, ""}
};
static struct cw_StrListElem * color_on = theme0;
struct cw_StrListElem color_ontext[] = {
/* {DBG_ELEM_DMP, "\x1b[37m"},*/
@ -135,7 +132,7 @@ static struct cw_StrListElem prefix[] = {
{DBG_DTLS_DETAIL, " DTLS - "},
{DBG_WARN, " Warning - "},
{DBG_MOD, " Mod - "},
{DBG_STATE, " STATEMACHINE - "},
{DBG_STATE, " State Machine - "},
{DBG_CFG_SET, " Cfg Set - "},

View File

@ -120,7 +120,7 @@ enum cw_dbg_levels{
/** Debug Mods */
DBG_MOD,
DBG_STATE, /**<Debug State machine */
DBG_STATE, /**<Debug State machein */
DBG_ALL,

View File

@ -33,6 +33,28 @@
#include "cw.h"
#include "msgset.h"
/*
static void (*actions_registered_cb) (struct cw_Mod * capwap, struct cw_Mod * bindings,
struct cw_actiondef * actions) = NULL;
*/
/*
void mod_set_actions_registered_cb(void (*fun)
(struct cw_Mod *, struct cw_Mod *,
struct cw_actiondef *))
{
actions_registered_cb = fun;
}
*/
struct cache_item {
const char *capwap;
const char *bindings;
struct cw_MsgSet *msgset;
};
static struct mavl *msgset_cache = NULL;
/*
static int mod_null_register_actions(struct cw_actiondef *def, int mode)
@ -55,32 +77,94 @@ struct cw_Mod mod_null = {
static int cmp(const void *p1, const void *p2)
{
struct cache_item *c1 = ((struct cache_item **) p1)[0];
struct cache_item *c2 = ((struct cache_item **) p2)[0];
struct cw_MsgSet *cw_mod_get_msg_set(struct cw_Conn *conn,
int r;
r = strcmp(c1->capwap, c2->capwap);
if (r != 0)
return r;
return strcmp(c1->bindings, c2->bindings);
}
struct cw_actiondef *mod_cache_get(const char *capwap, const char *bindings)
{
return NULL;
}
struct cw_MsgSet *cw_mod_get_msg_set(struct conn *conn,
struct cw_Mod *capwap_mod,
struct cw_Mod *bindings_mod)
{
struct cache_item search;
struct cache_item *cached_set;
struct cw_MsgSet *set;
set = cw_msgset_create();
if (!set) {
cw_log(LOG_ERR, "Can't allocate memory for mod %s",
if (!msgset_cache) {
msgset_cache = mavl_create(cmp, NULL, sizeof(struct cache_item*));
if (!msgset_cache) {
cw_log(LOG_ERR, "Can't initialize msgset cache: %s",
strerror(errno));
return NULL;
}
}
search.capwap = capwap_mod->name;
search.bindings = bindings_mod->name;
cached_set = mavl_get_ptr(msgset_cache, &search);
if (cached_set) {
cw_dbg(DBG_INFO, "Using cached message set for %s,%s", capwap_mod->name,
bindings_mod->name);
return cached_set->msgset;
}
cached_set = malloc(sizeof(struct cache_item));
if (!cached_set) {
cw_log(LOG_ERR, "Can't allocate memory for mod cache item %s",
strerror(errno));
return NULL;
}
memset(cached_set, 0, sizeof(struct cache_item));
set = cw_msgset_create();
if (!set) {
free(cached_set);
cw_log(LOG_ERR, "Can't allocate memory for mod cache item %s",
strerror(errno));
return NULL;
}
cached_set->msgset = set;
cw_dbg(DBG_INFO, "Loading message set for %s,%s", capwap_mod->name,
bindings_mod->name);
cached_set->capwap = capwap_mod->name;
cached_set->bindings = bindings_mod->name;
if (capwap_mod != MOD_NULL) {
capwap_mod->register_messages(set, CW_MOD_MODE_CAPWAP);
capwap_mod->register_messages(cached_set->msgset, CW_MOD_MODE_CAPWAP);
}
if (bindings_mod != MOD_NULL) {
bindings_mod->register_messages(set, CW_MOD_MODE_BINDINGS);
bindings_mod->register_messages(cached_set->msgset, CW_MOD_MODE_BINDINGS);
}
return set;
/*
// if (actions_registered_cb)
// actions_registered_cb(capwap_mod, bindings_mod, &(cached_set->actions));
*/
mavl_insert_ptr(msgset_cache, cached_set);
return cached_set->msgset;
}
@ -217,7 +301,7 @@ struct cw_Mod *cw_mod_add_to_list(struct cw_Mod *mod)
return mlistelem_dataptr(elem);
}
struct cw_Mod *cw_mod_detect(struct cw_Conn *conn,
struct cw_Mod *cw_mod_detect(struct conn *conn,
uint8_t * rawmsg, int len,
int elems_len, struct sockaddr *from, int mode)
{

View File

@ -103,8 +103,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->statemachine_states)
mavl_destroy(set->statemachine_states);
if (set->state_machine)
mavl_destroy(set->state_machine);
free(set);
}
@ -160,8 +160,8 @@ struct cw_MsgSet *cw_msgset_create()
}
set->statemachine_states = mavl_create(cmp_machinestate,NULL,sizeof(cw_StateMachineState_t));
if (set->statemachine_states == NULL)
set->state_machine = mavl_create(cmp_machinestate,NULL,sizeof(cw_StateMachineState_t));
if (set->state_machine == NULL)
{
cw_msgset_destroy(set);
return NULL;
@ -359,7 +359,7 @@ int cw_msgset_add_states(struct cw_MsgSet * set, cw_StateMachineState_t * states
s=states;
while (s->state != 0){
const char * repstr;
mavl_replace(set->statemachine_states,s,&replaced);
mavl_replace(set->state_machine,s,&replaced);
if (replaced){
repstr = "Replacing";

View File

@ -68,7 +68,7 @@ struct cw_MsgSet {
mavl_t handlers_by_id;
mavl_t handlers_by_key;
mavl_t types_tree;
mavl_t statemachine_states;
mavl_t state_machine;
int (*write_header)(struct cw_ElemHandler * handler, uint8_t * dst, int len);
int (*header_len)(struct cw_ElemHandler *handler);
};

View File

@ -173,7 +173,7 @@ int cw_send_request(struct cw_Conn *conn,int msg_id)
int rc;
char sock_buf[SOCK_ADDR_BUFSIZE];
cw_init_request(conn, msg_id);
if ( cw_assemble_message(conn, conn->req_buffer) == -1 ){
if ( cw_put_msg(conn, conn->req_buffer) == -1 ){
errno=ENOMSG;
return -1;
}

View File

@ -3,7 +3,7 @@ include ../../Defs.mak
SOURCES=\
mod_capwap_ac.c \
capwap_actions.c \
capwap_actions_ac.c \
capwap_in_wtp_board_data.c \
capwap_in_ac_descriptor.c \
capwap_out_wtp_board_data.c \

View File

@ -0,0 +1,769 @@
#include "cw/cw.h"
#include "cw/action.h"
#include "cw/capwap_items.h"
#include "mod_capwap.h"
static cw_action_in_t actions_in[] = {
/* Message Discovery Response */
{
.capwap_state = CAPWAP_STATE_DISCOVERY,
.msg_id = CAPWAP_MSG_DISCOVERY_RESPONSE,
.end = cw_in_check_disc_resp
}
,
/* AC Descriptor - Discovery Response */
{
.capwap_state = CAPWAP_STATE_DISCOVERY,
.msg_id = CAPWAP_MSG_DISCOVERY_RESPONSE,
.elem_id = CAPWAP_ELEM_AC_DESCRIPTOR,
.item_id = CW_ITEM_AC_DESCRIPTOR,
.start = cw_in_ac_descriptor,
.min_len = 12,
.max_len = 8192,
.mand = 1
}
,
/* AC Name - Discovery Response */
{
.capwap_state = CAPWAP_STATE_DISCOVERY,
.msg_id = CAPWAP_MSG_DISCOVERY_RESPONSE,
.elem_id = CAPWAP_ELEM_AC_NAME,
.item_id = CW_ITEM_AC_NAME,
.start = cw_in_generic2,
.min_len = 1,
.max_len = 512,
.mand = 1
}
,
/* CAPWAP Control IPv4 Address - Discovery Response*/
{
.capwap_state = CAPWAP_STATE_DISCOVERY,
.msg_id = CAPWAP_MSG_DISCOVERY_RESPONSE,
.elem_id = CAPWAP_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS,
.item_id = CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST,
.start = cw_in_capwap_control_ip_address,
.min_len = 6,
.max_len = 6,
.mand = 1
}
,
/* CAPWAP Control IPv6 Address - Discovery Response*/
{
.capwap_state = CAPWAP_STATE_DISCOVERY,
.msg_id = CAPWAP_MSG_DISCOVERY_RESPONSE,
.elem_id = CAPWAP_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS,
.item_id = CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST,
.start = cw_in_capwap_control_ip_address, // Change to v6 handler
.min_len = 18,
.max_len = 18,
.mand = 1
}
,
/* Vendor Specific Payload - Discovery Response*/
{
.capwap_state = CAPWAP_STATE_DISCOVERY,
.msg_id = CAPWAP_MSG_DISCOVERY_RESPONSE,
.elem_id = CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD,
.start = cw_in_vendor_specific_payload
}
,
/* Result Code - Discovery Response */
{
/*
* The Result Code is not defined as part
* of Discovery Response
*/
.capwap_state = CAPWAP_STATE_DISCOVERY,
.msg_id = CAPWAP_MSG_DISCOVERY_RESPONSE,
.elem_id = CAPWAP_ELEM_RESULT_CODE,
.item_id = CW_ITEM_RESULT_CODE,
.start = cw_in_generic2,
.min_len = 4,
.max_len = 4,
.mand = 0
}
,
/* ----------------------------------------------------------------
* Message Join Response
*/
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.end = cw_in_check_generic_resp
}
,
/* Result Code - Join Response */
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_RESULT_CODE,
.item_id = CW_ITEM_RESULT_CODE,
.start = cw_in_generic2,
.min_len = 4,
.max_len = 4,
.mand = 1
}
,
/* AC Descriptor - Join Response */
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_AC_DESCRIPTOR,
.item_id = CW_ITEM_AC_DESCRIPTOR,
.start = cw_in_ac_descriptor,
.min_len = 12,
.max_len = 8192,
.mand = 1
}
,
/* AC Name - Join Response */
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_AC_NAME,
.item_id = CW_ITEM_AC_NAME,
.start = cw_in_generic2,
.min_len = 1,
.max_len = 512,
.mand = 1
}
,
/* ECN Support - Join Response */
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic2,
.min_len = 1,
.max_len = 1,
.mand = 1
}
,
/* CAPWAP Control IPv4 Address - Join Response*/
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_CAPWAP_CONTROL_IPV4_ADDRESS,
.item_id = CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST,
.start = cw_in_capwap_control_ip_address,
.min_len = 6,
.max_len = 6,
.mand = 1
}
,
/* CAPWAP Control IPv6 Address - Join Response*/
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_CAPWAP_CONTROL_IPV6_ADDRESS,
.item_id = CW_ITEM_CAPWAP_CONTROL_IP_ADDRESS_LIST,
.start = cw_in_capwap_control_ip_address, // Change to v6 handler
.min_len = 18,
.max_len = 18,
.mand = 1
}
,
/* Maximum Message Length - Join Response */
{
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_MAXIMUM_MESSAGE_LENGTH,
.start = cw_in_generic2,
.item_id = CW_ITEM_MAXIMUM_MESSAGE_LENGTH,
.min_len = 2,
.max_len = 2
}
,
/* ----------------------------------------------------------------
* Message Configuration Status Response - IN
*/
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.end = cw_in_check_generic_resp
}
,
/* Capwap Timers - Config Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_CAPWAP_TIMERS,
.item_id = CW_ITEM_CAPWAP_TIMERS,
.start = cw_in_generic2,
.min_len = 2,
.max_len = 2,
.mand = 1
}
,
/* Decryption Error Report - Config Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_DECRYPTION_ERROR_REPORT_PERIOD,
.item_id = CW_RADIOITEM_DECRYPTION_ERROR_REPORT_PERIOD,
.start = cw_in_radio_generic,
.min_len = 3,
.max_len = 3,
.mand = 1
}
,
/* Idle Timeout - Config Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_IDLE_TIMEOUT,
.item_id = CW_ITEM_IDLE_TIMEOUT,
.start = cw_in_generic2,
.min_len = 4,
.max_len = 4,
.mand = 1
}
,
/* WTP Fallback - Config Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_WTP_FALLBACK,
.item_id = CW_ITEM_WTP_FALLBACK,
.start = cw_in_generic2,
.min_len = 1,
.max_len = 1,
.mand = 1
}
,
/* Result Code - Config Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_RESULT_CODE,
.item_id = CW_ITEM_RESULT_CODE,
.start = cw_in_generic2,
.min_len = 4,
.max_len = 4,
.mand = 0
}
,
/* AC IPv4 List - Config Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_AC_IPV4_LIST,
.item_id = CW_ITEM_AC_IP_LIST,
.start = NULL,
.min_len = 4,
.max_len = 1024*4,
.mand = 0
}
,
/* Vendor Specific Payload - Cponfig Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD,
.start = cw_in_vendor_specific_payload
}
,
/* ----------------------------------------------------------------
* Change State Event Response - IN
*/
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CHANGE_STATE_EVENT_RESPONSE,
.end = cw_in_check_cfg_update_req
}
,
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CHANGE_STATE_EVENT_RESPONSE,
.elem_id = CAPWAP_ELEM_RESULT_CODE,
.item_id = CW_ITEM_RESULT_CODE,
.start = cw_in_generic2,
.min_len = 4,
.max_len = 4,
.mand = 1
}
,
/* ----------------------------------------------------------------
* Change State Event Response - IN Run State
*/
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CHANGE_STATE_EVENT_RESPONSE,
.end = cw_in_check_cfg_update_req
}
,
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CHANGE_STATE_EVENT_RESPONSE,
.elem_id = CAPWAP_ELEM_RESULT_CODE,
.item_id = CW_ITEM_RESULT_CODE,
.start = cw_in_generic2,
.min_len = 4,
.max_len = 4,
.mand = 1
}
,
/* ----------------------------------------------------------------
* Message Echo Response - IN
*/
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_ECHO_RESPONSE,
}
,
/* Vendor Specific Payload - Echo Response */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_ECHO_RESPONSE,
.elem_id = CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD,
.start = cw_in_vendor_specific_payload
}
,
/* ----------------------------------------------------------------
* Configuration Update Request - IN
*/
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
}
,
/* WTP Name - Config Update Req */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_NAME,
.item_id = CW_ITEM_WTP_NAME,
.start = cw_in_generic2,
.min_len = 1,
.max_len = 1024,
.mand = 0
}
,
/* Location Data - Config Update Req */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CAPWAP_ELEM_LOCATION_DATA,
.item_id = CW_ITEM_LOCATION_DATA,
.start = cw_in_generic2,
.min_len = 1,
.max_len = 1024,
.mand = 0
}
,
/* Radio Admin State - Config Update Request */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CAPWAP_ELEM_RADIO_ADMINISTRATIVE_STATE,
.item_id = CW_RADIOITEM_ADMIN_STATE,
.start = cw_in_radio_generic,
.min_len=2,
.max_len=2,
.mand = 0
}
,
/* Vendor Specific Payload - Config Update Req */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CAPWAP_ELEM_VENDOR_SPECIFIC_PAYLOAD,
.start = cw_in_vendor_specific_payload
}
,
};
static cw_action_out_t actions_out[] = {
/* ---------------------------------------------------------------
* Discovery Request - Out
*/
/* Discovery Type - Discovery Request */
{
.msg_id = CAPWAP_MSG_DISCOVERY_REQUEST,
.elem_id = CAPWAP_ELEM_DISCOVERY_TYPE,
.item_id = CW_ITEM_DISCOVERY_TYPE,
.out = cw_out_generic,
.get = cw_out_get_outgoing,
.mand = 1
}
,
/* WTP Board Data - Discovery Request */
{
.msg_id = CAPWAP_MSG_DISCOVERY_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_BOARD_DATA,
.item_id = CW_ITEM_WTP_BOARD_DATA,
.out = cw_out_wtp_board_data,
.get = cw_out_get_config,
.mand = 1
}
,
/* WTP Descriptor - Discover Request */
{
.msg_id = CAPWAP_MSG_DISCOVERY_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_DESCRIPTOR,
.item_id = CW_ITEM_WTP_DESCRIPTOR,
.out = capwap_out_wtp_descriptor,
//.get = cw_out_get_config,
.mand = 1
}
,
/* WTP Frame TunnelMode - Discovery Request */
{
.msg_id = CAPWAP_MSG_DISCOVERY_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_FRAME_TUNNEL_MODE,
.item_id = CW_ITEM_WTP_FRAME_TUNNEL_MODE,
.out = cw_out_generic,
.get = cw_out_get_local,
.mand = 1
}
,
/* WTP Mac Type - Discovery Request */
{
.msg_id = CAPWAP_MSG_DISCOVERY_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_MAC_TYPE,
.item_id = CW_ITEM_WTP_MAC_TYPE,
.out = cw_out_generic,
.get = cw_out_get_local,
.mand = 1
}
,
/* ---------------------------------------------------------------
* Join Request - Out
*/
/* Location Data - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_LOCATION_DATA,
.item_id = CW_ITEM_LOCATION_DATA,
.out = cw_out_generic,
.get = cw_out_get_config,
.mand = 1
}
,
/* WTP Board Data - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_BOARD_DATA,
.item_id = CW_ITEM_WTP_BOARD_DATA,
.out = cw_out_wtp_board_data,
.get = cw_out_get_config,
.mand = 1
}
,
/* WTP Descriptor - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_DESCRIPTOR,
.item_id = CW_ITEM_WTP_DESCRIPTOR,
.out = cw_out_wtp_descriptor,
.mand = 1
}
,
/* WTP Name - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_NAME,
.item_id = CW_ITEM_WTP_NAME,
.out = cw_out_generic,
.get = cw_out_get_config,
.mand = 1
}
,
/* Session ID - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_SESSION_ID,
.item_id = CW_ITEM_SESSION_ID,
.out = cw_out_generic,
.get = cw_out_get_session_id,
.mand = 1
}
,
/* WTP Frame Tunnel Mode - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_FRAME_TUNNEL_MODE,
.item_id = CW_ITEM_WTP_FRAME_TUNNEL_MODE,
.out = cw_out_generic,
.get = cw_out_get_local,
.mand = 1
}
,
/* WTP MAC Type - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_MAC_TYPE,
.item_id = CW_ITEM_WTP_MAC_TYPE,
.out = cw_out_generic,
.get = cw_out_get_local,
.mand = 1
}
,
/* ECN Support - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.out = cw_out_generic,
.get = cw_out_get_config,
.mand = 1
}
,
/* CAPWAP Local IP Address - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.item_id = CW_ITEM_CAPWAP_LOCAL_IP_ADDRESS,
.out = cw_out_capwap_local_ip_address,
.mand = 1
}
,
/* WTP Reboot Statistics - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_REBOOT_STATISTICS,
.item_id = CW_ITEM_WTP_REBOOT_STATISTICS,
.out = cw_out_wtp_reboot_statistics,
.get = cw_out_get_config,
.mand = 0
}
,
/* ---------------------------------------------------------------
* Configuration Status Request - Out
*/
/* AC Name - Config Status Request - OUT */
{
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.elem_id = CAPWAP_ELEM_AC_NAME,
.item_id = CW_ITEM_AC_NAME,
.out = cw_out_generic,
.get = cw_out_get_local,
.mand = 1
}
,
/* Radio Admin State - Config Status Request - OUT */
{
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.elem_id = CAPWAP_ELEM_RADIO_ADMINISTRATIVE_STATE,
.item_id = CW_RADIOITEM_ADMIN_STATE,
.out = cw_out_radio_generic,
// .out = cw_out_radio_administrative_states,
// .get = cw_out_get_config,
.mand = 1
}
,
/* WTP Reboot Statistics - Config Status Request */
{
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_REBOOT_STATISTICS,
.item_id = CW_ITEM_WTP_REBOOT_STATISTICS,
.out = cw_out_wtp_reboot_statistics,
.get = cw_out_get_config,
.mand = 1
}
,
/* Statistics Timer - Join Request */
{
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.elem_id = CAPWAP_ELEM_STATISTICS_TIMER,
.item_id = CW_ITEM_STATISTICS_TIMER,
.out = cw_out_generic,
.get = cw_out_get_config,
.mand = 1
}
,
/* ---------------------------------------------------------------
* Change State Event Request - Out
*/
/* Radio Operational State(s) - Change State Event */
{
.msg_id = CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST,
.elem_id = CAPWAP_ELEM_RADIO_OPERATIONAL_STATE,
.item_id = CW_RADIOITEM_OPER_STATE,
// .out = cw_out_radio_operational_state,
.out = cw_out_radio_generic,
.mand = 1
}
,
{
.msg_id = CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST,
.elem_id = CAPWAP_ELEM_RESULT_CODE,
.item_id = CW_ITEM_RESULT_CODE,
.out = cw_out_generic,
.get = cw_out_get_outgoing,
.mand = 1
}
,
/* ---------------------------------------------------------------
* Echo Request - Out
*/
/* Echo Request */
{
.msg_id = CAPWAP_MSG_ECHO_REQUEST,
}
,
/* ---------------------------------------------------------------
* Configuration Update REsponse - Out
*/
{
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_RESPONSE,
.mand = 1
}
,
/* Radio Ooerational State */
// {CW_MSG_CHANGE_STATE_EVENT_REQUEST, CW_ITEM_RADIO_OPER_STATE, 0,
// 0, NULL, cw_out_radio_operational_states, cw_out_get_config,1}
// ,
/* WTP Descriptor */
// {CW_MSG_JOIN_REQUEST, CW_ITEM_WTP_DESCRIPTOR, 0,
// CW_ELEM_WTP_DESCRIPTOR, NULL,cw_out_wtp_descriptor, NULL,1}
// ,
};
int capwap_register_actions_wtp(struct cw_actiondef *def)
{
def->in = cw_actionlist_in_create();
def->out = cw_actionlist_out_create();
def->strmsg = cw_strheap_create();
def->strelem = cw_strheap_create();
def->items = cw_itemdefheap_create();
def->radioitems = cw_itemdefheap_create();
int rc;
rc = cw_actionlist_in_register_actions(def->in, actions_in);
rc += cw_actionlist_out_register_actions(def->out, actions_out);
rc += cw_strheap_register_strings(def->strmsg, capwap_strings_msg);
rc += cw_strheap_register_strings(def->strelem, capwap_strings_elem);
rc += cw_itemdefheap_register(def->items,capwap_itemdefs);
rc += cw_itemdefheap_register(def->radioitems,capwap_radioitemdefs);
return rc;
}

View File

@ -4,7 +4,7 @@ include ../../Defs.mak
SOURCES=\
mod_cisco_ac.c \
cisco_actions.c \
cisco_actions_ac.c \
cisco_in_wtp_descriptor.c \
cisco_out_wtp_descriptor.c \
cisco_in_ac_descriptor.c\

View File

@ -0,0 +1,174 @@
/*
This file is part of libcapwap.
libcapwap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
libcapwap is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
#include "capwap/capwap.h"
#include "capwap/action.h"
#include "capwap/capwap_items.h"
#include "capwap_actions.h"
#include "capwap/strheap.h"
#include "capwap/radio.h"
#include "mod_capwap.h"
cw_action_in_t _capwap_actions_ac_in[] = {
/* ------------------------------------------------------------------------------- */
/* Message Discovery Request */
{
.capwap_state = CW_STATE_DISCOVERY,
.msg_id = CW_MSG_DISCOVERY_REQUEST,
.end = cw_in_check_disc_req
}
,
/* Element Discovery Type */
{
.capwap_state = CW_STATE_DISCOVERY,
.msg_id = CW_MSG_DISCOVERY_REQUEST,
.elem_id = CW_ELEM_DISCOVERY_TYPE,
.start = cw_in_generic2,
.item_id = "discovery_type",
.mand = 1,
.min_len = 1,
.max_len = 1
}
,
/* Element WTP Frame Tunnel Mode */
{
.capwap_state = CW_STATE_DISCOVERY,
.msg_id = CW_MSG_DISCOVERY_REQUEST,
.elem_id = CW_ELEM_WTP_FRAME_TUNNEL_MODE,
.start = cw_in_generic2,
.item_id = "wtp_frame_tunnel_mode",
.mand = 1,
.min_len = 1,
.max_len = 1
}
,
/* Element WTP Mac Type */
{
.capwap_state = CW_STATE_DISCOVERY,
.msg_id = CW_MSG_DISCOVERY_REQUEST,
.elem_id = CW_ELEM_WTP_MAC_TYPE,
.start = cw_in_generic2,
.item_id = "wtp_mac_type",
.mand = 1,
.min_len = 1,
.max_len = 1
}
,
/* Element WTP Descriptor */
{
.capwap_state = CW_STATE_DISCOVERY,
.msg_id = CW_MSG_DISCOVERY_REQUEST,
.elem_id = CW_ELEM_WTP_DESCRIPTOR,
.start = capwap_in_wtp_descriptor,
.item_id = "wtp_descriptor",
.mand = 1,
}
,
/* Element WTP Board Data */
{
.capwap_state = CW_STATE_DISCOVERY,
.msg_id = CW_MSG_DISCOVERY_REQUEST,
.elem_id = CW_ELEM_WTP_BOARD_DATA,
.start = capwap_in_wtp_board_data,
.item_id = "wtp_board_data",
.mand = 1,
}
// ,
/* Element WTP Board Data */
// {0, 0, CW_STATE_CONFIGURE, CW_MSG_DISCOVERY_REQUEST, CW_ACTION_IN_WTP_BOARD_DATA,
// 1}
,
/* Vendor Specific Payload */
{
.capwap_state = CW_STATE_DISCOVERY,
.msg_id = CW_MSG_DISCOVERY_REQUEST,
.elem_id = CW_ELEM_VENDOR_SPECIFIC_PAYLOAD,
},
/* Element WTP Name */
{
.capwap_state = CW_STATE_DISCOVERY,
.msg_id = CW_MSG_DISCOVERY_REQUEST,
.elem_id = CW_ELEM_WTP_NAME,
.start = cw_in_generic2,
.item_id = "wtp_name",
.mand = 0,
.min_len = 1,
.max_len = 1024
}
,
/* End of list */
{0, 0}
};
#include "capwap/item.h"
static struct cw_itemdef _capwap_itemdefs[] = {
{"wtp_name",CW_ITEM_NONE,MBAG_STR},
{"wtp_mac_type",CW_ITEM_NONE,MBAG_BYTE},
{"discovery_type",CW_ITEM_NONE,MBAG_BYTE},
{"wtp_frame_tunnel_mode",CW_ITEM_NONE,MBAG_BYTE},
{CW_ITEM_NONE}
};
int capwap_register_actions_ac(struct cw_actiondef *def)
{
def->in = cw_actionlist_in_create();
def->out = cw_actionlist_out_create();
def->strmsg = cw_strheap_create();
def->strelem = cw_strheap_create();
def->wbids = intavltree_create();
def->items = cw_itemdefheap_create();
def->radioitems = cw_itemdefheap_create();
int rc;
rc = cw_actionlist_in_register_actions(def->in, _capwap_actions_ac_in);
// rc += cw_actionlist_out_register_actions(def->out, capwap_actions_ac_out);
rc += cw_strheap_register_strings(def->strmsg, capwap_strings_msg);
rc += cw_strheap_register_strings(def->strelem, capwap_strings_elem);
rc += cw_itemdefheap_register(def->items, _capwap_itemdefs);
rc += cw_itemdefheap_register(def->radioitems, capwap_radioitemdefs);
intavltree_add(def->wbids, 0);
return rc;
}

View File

@ -1822,7 +1822,7 @@ static struct cw_ElemDef configuration_update_request_elements[] ={
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_CORE_DUMP, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_STATISTICS_TIMER, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AC_NAME_WITH_INDEX, 0, 0},
// {0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_VENUE_SETTINGS, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_AP_VENUE_SETTINGS, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_80211_ASSOC_LIMIT, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_SIG_TOGGLE, 0, 0},
{0, CW_VENDOR_ID_CISCO, CISCO_ELEM_MAC_OPERATION, 0, 0},
@ -2072,6 +2072,8 @@ static struct cw_ElemHandler handlers73[] = {
}
,
{
"AP Venue Settings", /* name */
CISCO_ELEM_AP_VENUE_SETTINGS, /* Element ID */

View File

@ -0,0 +1,577 @@
/*
This file is part of libcapwap.
libcapwap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
libcapwap is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
#include "cw/strheap.h"
#include "cw/radio.h"
#include "cw/capwap_cisco.h"
#include "cw/capwap80211.h"
#include "cw/lwapp_cisco.h"
/*#include "mod_cisco.h"*/
#include "cisco.h"
#include "cisco80211.h"
static cw_action_in_t actions_in[] = {
/* ----------------------------------------------------------------
* Discovery Response
*/
/* AC Descriptor - Discovery Response */
{
.capwap_state = CAPWAP_STATE_DISCOVERY,
.msg_id = CAPWAP_MSG_DISCOVERY_RESPONSE,
.elem_id = CAPWAP_ELEM_AC_DESCRIPTOR,
.item_id = CW_ITEM_AC_DESCRIPTOR,
.start = cisco_in_ac_descriptor,
.min_len = 12,
.max_len = 8192,
.mand = 1
}
,
/* ----------------------------------------------------------------
* Join Response
*/
/* ECN Support - Join Response */
{
/* Make ECN Support non-mand */
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.start = cw_in_generic,
.mand = 0,
.min_len = 1,
.max_len = 1
}
,
/* AC Descriptor - Join Response */
{
/* Cisco's AC Descriptor */
.capwap_state = CAPWAP_STATE_JOIN,
.msg_id = CAPWAP_MSG_JOIN_RESPONSE,
.elem_id = CAPWAP_ELEM_AC_DESCRIPTOR,
.item_id = CW_ITEM_AC_DESCRIPTOR,
.start = cisco_in_ac_descriptor,
.min_len = 12,
.max_len = 8192,
.mand = 1
}
,
/* ----------------------------------------------------------------
* Configuration Update Request
*/
/* Location Data - Conf Update Req */
{
.capwap_state = CW_STATE_RUN,
.vendor_id = CW_VENDOR_ID_CISCO,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = LW_ELEM_LOCATION_DATA,
.item_id = CW_ITEM_LOCATION_DATA,
.start = cw_in_generic,
.min_len = 0,
.max_len = 1024,
.mand = 0
}
,
/* WTP Name - Conf Update Req */
{
.capwap_state = CW_STATE_RUN,
.vendor_id = CW_VENDOR_ID_CISCO,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CISCO_ELEM_RAD_NAME,
.item_id = CW_ITEM_WTP_NAME,
.start = cw_in_generic,
.min_len = 0,
.max_len = 1024,
.mand = 0
}
,
/* WTP Name - Conf Update Req */
{
.capwap_state = CW_STATE_RUN,
.vendor_id = CW_VENDOR_ID_CISCO,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CISCO_ELEM_AP_GROUP_NAME,
.item_id = CIPWAP_ITEM_WTP_GROUP_NAME,
.start = cw_in_generic,
.min_len = 0,
.max_len = 1024,
.mand = 0
}
,
/* Radio Admin State - Config Update Request */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CAPWAP_ELEM_RADIO_ADMINISTRATIVE_STATE,
.item_id = CW_RADIOITEM_ADMIN_STATE,
.start = cisco_in_radio_administrative_state,
.min_len=2,
.max_len=2,
.mand = 0
}
,
/* AP Mode and Type */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_AP_MODE_AND_TYPE,
.item_id = CISCO_ITEM_AP_MODE_AND_TYPE,
.start = cw_in_generic
}
,
/* Element Cisco 802.11 Radio Config - Config Update Resp */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_WTP_RADIO_CFG,
.start=cisco80211_in_wtp_radio_configuration,
.item_id = "cisco_radio_cfg",
}
,
/* ----------------------------------------------------------------
* Configuration Status Response
*/
/* Element Cisco 802.11 Radio Conffig - Config Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_WTP_RADIO_CFG,
.start=cisco80211_in_wtp_radio_configuration,
.item_id = "cisco_radio_cfg",
}
,
/* Radio Admin State - Config Status Response */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_RADIO_ADMINISTRATIVE_STATE,
.item_id = CW_RADIOITEM_ADMIN_STATE,
// .start = cw_in_radio_generic,
.start = cisco_in_radio_administrative_state,
.mand = 1
}
,
/* Cisco's Vendor specific encapsulation
* of LWAPP elements */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CISCO_ELEM_SPAM_VENDOR_SPECIFIC,
.start = lw_in_vendor_specific,
}
,
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CISCO_ELEM_SPAM_VENDOR_SPECIFIC,
.start = lw_in_vendor_specific,
}
,
/* LWAPP Vendor spec Messages */
/* MWAR Hash Value */
{
.proto = CW_ACTION_PROTO_LWAPP,
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.vendor_id = LW_VENDOR_ID_CISCO,
.elem_id = CISCO_LWELEM_MWAR_HASH_VALUE,
.item_id = CIPWAP_ITEM_AC_HASH_VALUE,
.start = cw_in_generic, //cisco_in_telnet_ssh
}
,
/* End of list */
{0, 0}
};
static cw_action_out_t actions_out[]={
/* ----------------------------------------------------------------
* Message Discover Request
*/
/* WTP Descriptor - Discovery */
{
.msg_id = CAPWAP_MSG_DISCOVERY_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_DESCRIPTOR,
.item_id = CW_ITEM_WTP_DESCRIPTOR,
.out = cisco_out_wtp_descriptor,
.mand = 1
}
,
/* Cisco RAD Name (WTP Name) - Discovery */
{
.msg_id = CAPWAP_MSG_DISCOVERY_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CISCO_ELEM_RAD_NAME,
.item_id = CW_ITEM_WTP_NAME,
.out = cw_out_generic,
/* .get = cw_out_get_config,*/
.mand = 1
}
,
/* ----------------------------------------------------------------
* Message Join Rquest
*/
/* CAPWAP Local IP Address - Join Request */
{
/* use draft 7 elem ids */
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.item_id = CW_ITEM_CAPWAP_LOCAL_IP_ADDRESS,
.out = cw_out_capwap_local_ip_address_7,
.mand = 1
}
,
/* WTP Descriptor - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_WTP_DESCRIPTOR,
.item_id = CW_ITEM_WTP_DESCRIPTOR,
.out = cisco_out_wtp_descriptor,
.mand = 1
}
,
/* WTP Group Name (WTP Name) - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CISCO_ELEM_AP_GROUP_NAME,
.item_id = CIPWAP_ITEM_WTP_GROUP_NAME,
.out = cw_out_generic,
/*.get = cw_out_get_config,*/
.mand = 1
}
,
/* WTP Board Data Options - Join Request */
{
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_BOARD_DATA_OPTIONS,
.item_id = CW_ITEM_CISCO_BOARD_DATA_OPTIONS,
.out = cisco_out_board_data_options,
/* .get = cw_out_get_config,*/
.mand = 1
}
,
/* ECN Support - Join Request */
{
/* Cisco doesn't know ECN support, so we
define no output method */
.msg_id = CAPWAP_MSG_JOIN_REQUEST,
.elem_id = CAPWAP_ELEM_ECN_SUPPORT,
.item_id = CW_ITEM_ECN_SUPPORT,
.mand = 0
}
,
/* AP Mode and Type - Configuration Status Request OUT */
{
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_AP_MODE_AND_TYPE,
.item_id = CISCO_ITEM_AP_MODE_AND_TYPE,
.out = cw_out_generic,
/* .get = cw_out_get_config,*/
.mand = 1
}
,
/* Cisco WTP Admin state - OUT */
{
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.item_id = CISCO_ITEM_WTP_ADMIN_STATE,
.out = cisco_out_wtp_administrative_state,
}
,
/* Cisco Admin state - OUT */
/* {
.msg_id = CW_MSG_CONFIGURATION_STATUS_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
// .elem_id = CW_CISCO_AP_MODE_AND_TYPE,
.item_id = CISCO_ITEM_WTP_ADMIN_STATE,
.out = cisco_out_wtp_administrative_state,
// .get = cw_out_get_outgoming,
}
,
*/
/* Cisco WTP Operational state - OUT */
{
.msg_id = CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
// .elem_id = CW_CISCO_AP_MODE_AND_TYPE,
.item_id = CISCO_ITEM_WTP_OPER_STATE,
// .out = cisco_out_wtp_operational_state,
// .get = cw_out_get_outgoming,
}
,
/* Radio Operational State - OUT */
{
.msg_id = CAPWAP_MSG_CHANGE_STATE_EVENT_REQUEST,
.elem_id = CAPWAP_ELEM_RADIO_OPERATIONAL_STATE,
.item_id = CW_RADIOITEM_OPER_STATE,
.out = cisco_out_radio_operational_state,
.mand = 1
}
,
{0,0}
};
static cw_action_in_t actions80211_in[] = {
/* Radio Operational State - Status Resp */
{
.capwap_state = CAPWAP_STATE_CONFIGURE,
.msg_id= CAPWAP_MSG_CONFIGURATION_STATUS_RESPONSE,
.elem_id = CAPWAP_ELEM_RADIO_OPERATIONAL_STATE,
.item_id = CW_RADIOITEM_OPER_STATE,
// .start = cw_in_radio_generic, //operational_state,
.start = cisco_in_radio_operational_state, //operational_state,
.min_len=3,
.max_len=3,
.mand = 0
}
,
/* Radio Operational State - Update Req */
{
.capwap_state = CW_STATE_RUN,
.msg_id= CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.elem_id = CAPWAP_ELEM_RADIO_OPERATIONAL_STATE,
.item_id = CW_RADIOITEM_OPER_STATE,
// .start = cw_in_radio_generic, //operational_state,
.start = cisco_in_radio_operational_state, //operational_state,
.min_len=3,
.max_len=3,
.mand = 0
}
,
/* Add WLAN */
{
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.vendor_id = CW_VENDOR_ID_CISCO,
.elem_id = CW_CISCO_ADD_WLAN,
// .item_id = CISCO_ITEM_ADD_WLAN,
.start = cisco_in_add_wlan
}
,
/* Add WLAN - LWAP Vendor Specific */
{
.proto = CW_ACTION_PROTO_LWAPP,
.capwap_state = CW_STATE_RUN,
.msg_id = CAPWAP_MSG_CONFIGURATION_UPDATE_REQUEST,
.vendor_id = LW_VENDOR_ID_CISCO,
.elem_id = CISCO_LWELEM_ADD_WLAN,
// .item_id = CIPWAP_ITEM_AC_HASH_VALUE,
// .start = cw_in_generic, //cisco_in_telnet_ssh
.start = cisco_in_add_wlan
}
};
static cw_action_out_t actions80211_out[]={
/* ----------------------------------------------------------------
* Configuration Status Request
*/
{
.vendor_id = CW_VENDOR_ID_CISCO,
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.elem_id = CAPWAP80211_ELEM_WTP_RADIO_INFORMATION,
.item_id = CW_RADIOITEM80211_WTP_RADIO_INFORMATION,
.out = cisco_out_80211_wtp_radio_cfg,
/*.get = cw_out_get_config,*/
.mand = 1
}
,
{
.msg_id = CAPWAP_MSG_CONFIGURATION_STATUS_REQUEST,
.item_id = CW_RADIO_SUPPORTED_RATES ,
.elem_id = CW_ELEM80211_SUPPORTED_RATES,
.mand = 0,
}
};
#include "cw/item.h"
static struct cw_itemdef _capwap_itemdefs[] = {
{"wtp_name_cisco",CW_ITEM_NONE,MBAG_STR},
/* {"wtp_mac_type",CW_ITEM_NONE,MBAG_BYTE},
{"discovery_type",CW_ITEM_NONE,MBAG_BYTE},
{"wtp_frame_tunnel_mode",CW_ITEM_NONE,MBAG_BYTE},
*/ {CW_ITEM_NONE}
};
#include "../modload.h"
int cisco_register_actions_wtp(struct cw_actiondef *def)
{
int rc;
rc = cw_actionlist_in_register_actions(def->in, actions_in);
rc += cw_actionlist_out_register_actions(def->out, actions_out);
rc += cw_strheap_register_strings(def->strmsg, capwap_strings_msg);
rc += cw_strheap_register_strings(def->strelem, cipwap_strings_elem);
rc += cw_itemdefheap_register(def->items, _capwap_itemdefs);
rc += cw_itemdefheap_register(def->radioitems, capwap_radioitemdefs);
// intavltree_add(def->wbids, 0);
return rc;
}
int cisco_register_actions80211_wtp(struct cw_actiondef *def)
{
int rc;
rc=0;
rc = cw_actionlist_in_register_actions(def->in, actions80211_in);
rc += cw_actionlist_out_register_actions(def->out, actions80211_out);
rc += cw_itemdefheap_register(def->items, cisco_itemdefs);
rc += cw_itemdefheap_register(def->radioitems, cisco_radioitemdefs);
/* rc += cw_strheap_register_strings(def->strmsg, capwap_strings_msg);
rc += cw_strheap_register_strings(def->strelem, cipwap_strings_elem);
rc += cw_itemdefheap_register(def->items, _capwap_itemdefs);
rc += cw_itemdefheap_register(def->radioitems, capwap_radioitemdefs);
intavltree_add(def->wbids, 0);
*/
return rc;
}

View File

@ -9,23 +9,23 @@
#include "cw/cw.h"
#include "cw/val.h"
#include "cw/keys.h"
#include "cw/cfg.h"
static int put_ac_status(cw_Cfg_t * cfg, cw_Cfg_t * default_cfg, uint8_t *dst, const char * parent_key){
static int put_ac_status(mavl_t global, mavl_t local, uint8_t *dst, const char * parent_key){
uint8_t *d = dst;
uint8_t security;
char key[CW_CFG_MAX_KEY_LEN];
char key[CW_KTV_MAX_KEY_LEN];
d += cw_put_word(d,cw_cfg_get_word(cfg,"ac-descriptor/stations","0"));
d += cw_put_word(d,cw_cfg_get_word(cfg,"ac-descriptor/station-limit","0"));
d += cw_put_word(d,cw_cfg_get_word(cfg,"ac-descriptor/active-wtps","0"));
d += cw_put_word(d,cw_cfg_get_word(cfg,"ac-descriptor/max-wtps","0"));
d += cw_put_word(d,cw_ktv_get_word(local,"ac-descriptor/stations",0));
d += cw_put_word(d,cw_ktv_get_word(local,"ac-descriptor/station-limit",0));
d += cw_put_word(d,cw_ktv_get_word(local,"ac-descriptor/active-wtps",0));
d += cw_put_word(d,cw_ktv_get_word(local,"ac-descriptor/max-wtps",0));
d += cw_put_byte(d,cw_cfg_get_byte(cfg,"ac-descriptor/security",0));
d += cw_put_byte(d,cw_ktv_get_byte(local,"ac-descriptor/security",0));
/*
security = 0;
if (cw_ktv_get(local,"dtls-cert-file",CW_TYPE_BSTR16))
@ -40,14 +40,14 @@ static int put_ac_status(cw_Cfg_t * cfg, cw_Cfg_t * default_cfg, uint8_t *dst, c
d += cw_put_byte(dst,security);
*/
sprintf(key,"%s/%s",parent_key,"ac-descriptor/r-mac-field");
d += cw_put_byte(d,cw_cfg_get_byte(cfg,"ac-descriptor/r-mac-field",0));
d += cw_put_byte(d,cw_ktv_get_byte(local,"ac-descriptor/r-mac-field",0));
/*d += cw_put_byte(d,3);*/
d += cw_put_byte(d,0);
sprintf(key,"%s/%s",parent_key,CW_SKEY_DTLS_POLICY);
d += cw_put_byte(d,cw_cfg_get_byte(cfg,"ac-descriptor/dtls-policy",0));
d += cw_put_byte(d,cw_ktv_get_byte(local,"ac-descriptor/dtls-policy",0));
return d - dst;
}
@ -58,12 +58,10 @@ int cisco_out_ac_descriptor(struct cw_ElemHandler * eh,
{
int len,l;
uint8_t *d = dst+4;
char key[CW_CFG_MAX_KEY_LEN];
char key[CW_KTV_MAX_KEY_LEN];
cw_dbg(DBG_X,"Putting AC TATUS WIITH KEY: %s",eh->key);
d+=put_ac_status(params->cfg,
params->default_cfg,
d+=put_ac_status(params->local_cfg,
params->global_cfg,
d, eh->key);
/* it is important to send software version first,

View File

@ -0,0 +1,165 @@
/*
This file is part of libcapwap.
libcapwap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
libcapwap is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file
* @brief Implements cw_cisco_id_to_str
*/
#include "capwap_cisco.h"
/**
* Get a text representation of a Cisco vendor specific message element
* @param elem_id vendor specific message element
* @return pointer printable string
*/
const char * cw_cisco_id_to_str(int elem_id)
{
switch (elem_id) {
case CW_CISCO_AP_GROUP_NAME:
return "AP Group Name";
case CW_CISCO_RAD_NAME:
return "RAD Name";
case CW_CISCO_AP_TIMESYNC:
return "AP Timesync";
case CW_CISCO_MWAR_TYPE:
return "MWAR Type";
case CW_CISCO_SPAM_VENDOR_SPECIFIC:
return "LWAPP Vendor Specific";
case CW_CISCO_WTP_RADIO_CFG:
return "WTP Radio CFG";
case CW_CISCO_AP_REGULATORY_DOMAIN:
return "AP Regulatory Domain";
case CW_CISCO_WTP_BOARD_DATA:
return "WTP Board Data";
case CW_CISCO_MULTI_DOMAIN_CAPAB:
return "Multi Domain Capability";
case CW_CISCO_AP_STATIC_IP_ADDR:
return "AP Static IP Addr";
case CW_CISCO_AP_DOMAIN:
return "AP Domain";
case CW_CISCO_AP_DNS:
return "AP DNS";
case CW_CISCO_AC_NAME_WITH_INDEX:
return "AC Name with Index";
case CW_CISCO_AC_IPV4_LIST:
return "AC IPv4 List";
case CW_CISCO_LOCATION_DATA:
return "Location Data";
case CW_CISCO_STATISTICS_TIMER:
return "Statistics Timer";
case CW_CISCO_AP_MODE_AND_TYPE:
return "AP Mode and Type";
case CW_CISCO_ADD_WLAN:
return "Add WLAN";
case CW_CISCO_MWAR_ADDR:
return "MWAR Addr";
case CW_CISCO_BOARD_DATA_OPTIONS:
return "WTP Board Data Options";
case CW_CISCO_AP_RESET_BUTTON_STATE:
return "Reset Button State";
case CW_CISCO_MAC_OPERATION:
return "Mac Operation";
case CW_CISCO_TX_POWER:
return "TX Power";
case CW_CISCO_TX_POWER_LEVELS:
return "TX Power Levels";
case CW_CISCO_DIRECT_SEQUENCE_CONTROL:
return "Direct Sequence Control";
case CW_CISCO_AP_MODEL:
return "AP Model";
case CW_CISCO_AP_MINIOS_VERSION:
return "AP MiniOS Version";
case CW_CISCO_LWAPP_CHANNEL_POWER:
return "LWAPP Channel Power";
case CW_CISCO_ANTENNA_PAYLOAD:
return "Antenna Payload";
case CW_CISCO_SUPPORTED_RATES:
return "Supported Rates";
case CW_CISCO_SPAM_DOMAIN_SECRET:
return "SPAM Domain Secret";
case CW_CISCO_AP_LED_STATE_CONFIG:
return "SPAM AP LED State";
case CW_CISCO_AP_RETRANSMIT_PARAM:
return "AP Retransmit Param";
case CW_CISCO_AP_VENUE_SETTINGS:
return "AP Venue Settings";
case CW_CISCO_80211_DELETE_WLAN:
return "Delete WLAN";
case CW_CISCO_SIG_PAYLOAD:
return "Signature Payload";
case CW_CISCO_SIG_TOGGLE:
return "Signature Toggle";
case CW_CISCO_80211_ASSOC_LIMIT:
return "Assoc Limit";
case CW_CISCO_AP_QOS:
return "AP Quality of Services";
case CW_CISCO_TLV_PAYLOAD:
return "TLV Payload";
case CW_CISCO_AP_UPTIME:
return "AP Uptime";
case CW_CISCO_AP_POWER_INJECTOR_CONFIG:
return "AP Power Injector Config";
case CW_CISCO_AP_PRE_STD_SWITCH_CONFIG:
return "AP Pre Std Switch Config";
case CW_CISCO_AP_BACKUP_SOFTWARE_VERSION:
return "Backup Software Version";
case CW_CISCO_AP_LOG_FACILITY:
return "AP Log Facility";
case CW_CISCO_CAPWAP_TIMERS:
return "Capwap Timers";
case CW_CISCO_AP_CORE_DUMP:
return "AP Core Dump";
case CW_CISCO_AIRSPACE_CAPABILITY:
return "Airspace Capability";
case CW_CISCO_BCAST_SSID_MODE:
return "Broadcast SSID Mode";
case CW_CISCO_AP_LED_FLASH_CONFIG:
return "Spam AP LED Flash Config";
case CW_CISCO_OPER_STATE_DETAIL_CAUSE:
return "Radio Oper State Detail Cause";
case CW_CISCO_DOT11_CONFIG_CHECKER:
return "Dot11 Config Checker";
default:
return "Unknown";
}
}

View File

@ -10,7 +10,7 @@
#include "cfg.h"
int configure(struct cw_Conn * conn)
int configure(struct conn * conn)
{
char sockbuff[SOCK_ADDR_BUFSIZE];

View File

@ -153,7 +153,7 @@ static int run_discovery(struct cw_Conn *conn, struct cw_DiscoveryResult * dis)
/* create and send a discovery request message */
cw_init_request(conn, CAPWAP_MSG_DISCOVERY_REQUEST);
cw_assemble_message(conn, conn->req_buffer);
cw_put_msg(conn, conn->req_buffer);
conn_send_msg(conn, conn->req_buffer);