Compare commits
7 Commits
9e54e46e45
...
add6ffa314
Author | SHA1 | Date | |
---|---|---|---|
add6ffa314 | |||
ce4a1dd2df | |||
e5f5687b2b | |||
bf8a8c6d53 | |||
10b88b8f86 | |||
e6e8c8ed32 | |||
c5e1abb842 |
17
Makefile
17
Makefile
@ -1,16 +1,23 @@
|
||||
.OBJDIR: ./
|
||||
|
||||
all:
|
||||
$(MAKE) -C src/cw
|
||||
$(MAKE) -C src/mod
|
||||
$(MAKE) -C src/ac
|
||||
$(MAKE) -C src/wtp
|
||||
all: ac 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
|
||||
|
||||
|
@ -9,6 +9,8 @@ OBJS = \
|
||||
socklist.o \
|
||||
discovery_cache.o\
|
||||
shell.o\
|
||||
statemachine.o\
|
||||
|
||||
|
||||
PRG=actube
|
||||
LIBPATH=-L../../lib/$(KERNEL)/$(ARCH)/ -L/usr/local/lib -L/usr/lib
|
||||
|
@ -50,7 +50,7 @@
|
||||
|
||||
int ac_run(cw_Cfg_t * cfg);
|
||||
|
||||
|
||||
#include "statemachine.h"
|
||||
|
||||
#include <getopt.h>
|
||||
|
||||
@ -184,6 +184,11 @@ 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));
|
||||
@ -500,6 +505,7 @@ 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();
|
||||
|
137
src/ac/statemachine.c
Normal file
137
src/ac/statemachine.c
Normal file
@ -0,0 +1,137 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
|
13
src/ac/statemachine.h
Normal file
13
src/ac/statemachine.h
Normal file
@ -0,0 +1,13 @@
|
||||
#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
|
@ -86,6 +86,10 @@ 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);
|
||||
@ -270,6 +274,8 @@ void *wtpman_run_data(void *wtpman_arg)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
int cw_run_state_machine(struct cw_Conn *conn, time_t * timer)
|
||||
{
|
||||
|
||||
@ -280,7 +286,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->state_machine, &search);
|
||||
result = mavl_get(conn->msgset->statemachine_states, &search);
|
||||
|
||||
cw_dbg(DBG_STATE, "State transition: [%s -> %s]",
|
||||
cw_strstate(conn->capwap_prevstate),
|
||||
@ -655,7 +661,8 @@ 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) {
|
||||
|
||||
@ -676,11 +683,6 @@ struct wtpman *wtpman_create(int socklistindex, struct sockaddr *srcaddr,
|
||||
sockfd = replyfd; /*//socklist[socklistindex].reply_sockfd; */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
dbgaddrl = sizeof(dbgaddr);
|
||||
getsockname(sockfd, &dbgaddr, &dbgaddrl);
|
||||
|
||||
@ -688,26 +690,25 @@ 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);
|
||||
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->role = CW_ROLE_AC;
|
||||
|
||||
wtpman->conn->data_sock = socklist[socklistindex].data_sockfd;
|
||||
sock_copyaddr(&wtpman->conn->data_addr,
|
||||
(struct sockaddr *) &wtpman->conn->addr);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
wtpman->conn->mods = conf_mods;
|
||||
// wtpman->conn->mods = conf_mods;
|
||||
|
||||
wtpman->conn->strict_capwap = conf_strict_capwap;
|
||||
wtpman->conn->strict_hdr = conf_strict_headers;
|
||||
|
@ -31,6 +31,12 @@ 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.
|
||||
*/
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
@ -45,7 +45,6 @@ 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\
|
||||
@ -207,6 +206,7 @@ MISCSRC=\
|
||||
# conn_init.c\
|
||||
# conn_create.c\
|
||||
# conn_send_request.c\
|
||||
# cw_put_msg.c\
|
||||
|
||||
DTLSSRC+=\
|
||||
dtls_bio.c\
|
||||
|
@ -641,14 +641,10 @@ struct cw_ac_status {
|
||||
*/
|
||||
enum capwap_states {
|
||||
CW_STATE_NONE = 0,
|
||||
/** Discovery State */
|
||||
CAPWAP_STATE_DISCOVERY,
|
||||
/** Join State */
|
||||
CAPWAP_STATE_JOIN,
|
||||
CAPWAP_STATE_DISCOVERY, /**< Discovery State */
|
||||
CAPWAP_STATE_JOIN, /**< Join State */
|
||||
CAPWAP_STATE_JOIN_COMPLETE,
|
||||
|
||||
/** Config State */
|
||||
CAPWAP_STATE_CONFIGURE,
|
||||
CAPWAP_STATE_CONFIGURE, /**< Config State */
|
||||
CAPWAP_STATE_DTLS_SETUP, /**< DTLS Setup */
|
||||
/** Image Data Upload */
|
||||
CW_STATE_IMAGE_DATA,
|
||||
|
@ -2,6 +2,7 @@
|
||||
#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" },
|
||||
@ -11,6 +12,5 @@ struct cw_StrListElem capwap_strings_state[] = {
|
||||
{ CAPWAP_STATE_DATA_CHECK, "Data Check" },
|
||||
{ CAPWAP_STATE_TIMEOUT, "Timeout"},
|
||||
{ CW_STR_STOP,"Undefined" },
|
||||
|
||||
};
|
||||
|
||||
|
11
src/cw/cfg.c
11
src/cw/cfg.c
@ -491,6 +491,17 @@ 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;
|
||||
|
@ -32,6 +32,7 @@ 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
|
||||
|
145
src/cw/conn.c
145
src/cw/conn.c
@ -1,4 +1,5 @@
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
#include "conn.h"
|
||||
@ -17,6 +18,12 @@
|
||||
#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)
|
||||
@ -32,6 +39,144 @@ 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,¶ms,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( ¶ms, elems_ptr,elems_len);
|
||||
|
||||
printf ("----------------------------------- end redecode -----------------------------\n");
|
||||
|
||||
}
|
||||
|
||||
return CAPWAP_RESULT_SUCCESS;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Basic initialization of a conn object
|
||||
|
@ -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);
|
||||
|
@ -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_put_msg(conn, conn->resp_buffer);
|
||||
rc = cw_assemble_message(conn, conn->resp_buffer);
|
||||
if (!cw_result_is_ok(rc))
|
||||
return 0;
|
||||
conn_send_msg(conn, conn->resp_buffer);
|
||||
@ -390,16 +390,15 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
params.cfg = cw_cfg_create();
|
||||
cw_decode_elements(¶ms,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, " *** Done parsing message of type %d (%s) ***",
|
||||
cw_dbg(DBG_MSG_PARSING, " *** End parsing message of type %d (%s) ***",
|
||||
message->type, message->name);
|
||||
|
||||
|
||||
mavl_destroy(mand_found);
|
||||
|
||||
/* cw_dbg_ktv_dump(conn->remote_cfg,DBG_CFG_DMP,
|
||||
@ -441,7 +440,6 @@ static int process_elements(struct cw_Conn *conn, uint8_t * rawmsg, int len,
|
||||
*/
|
||||
}
|
||||
|
||||
/*stravltree_destroy(conn->mand); */
|
||||
|
||||
return result_code;
|
||||
|
||||
@ -662,6 +660,7 @@ 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)
|
||||
|
@ -1,64 +0,0 @@
|
||||
/*
|
||||
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;
|
||||
}
|
||||
*/
|
@ -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_put_msg(struct cw_Conn *conn, uint8_t * rawout);
|
||||
int cw_assemble_message(struct cw_Conn *conn, uint8_t * rawout);
|
||||
|
||||
/**
|
||||
* @}
|
||||
|
@ -21,150 +21,6 @@
|
||||
* @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,¶ms,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( ¶ms, elems_ptr,elems_len);
|
||||
|
||||
printf ("----------------------------------- end redecode -----------------------------\n");
|
||||
|
||||
}
|
||||
|
||||
return CAPWAP_RESULT_SUCCESS;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Put a message to a buffer
|
||||
|
@ -55,7 +55,7 @@ uint32_t cw_dbg_opt_level = 0;
|
||||
|
||||
|
||||
|
||||
static struct cw_StrListElem color_on[] = {
|
||||
static struct cw_StrListElem theme0[] = {
|
||||
{DBG_PKT_IN, ANSI_YELLOW},
|
||||
{DBG_PKT_OUT, ANSI_YELLOW ANSI_ITALIC},
|
||||
|
||||
@ -86,7 +86,7 @@ static struct cw_StrListElem color_on[] = {
|
||||
|
||||
{DBG_INFO, ANSI_DEFAULT},
|
||||
|
||||
{DBG_STATE, ANSI_BBLACK ANSI_BOLD },
|
||||
{DBG_STATE, ANSI_GREEN ANSI_BOLD},
|
||||
|
||||
{DBG_RFC, ANSI_BRED},
|
||||
{DBG_X, "\x1b[31m"},
|
||||
@ -98,6 +98,9 @@ static struct cw_StrListElem color_on[] = {
|
||||
{CW_STR_STOP, ""}
|
||||
};
|
||||
|
||||
static struct cw_StrListElem * color_on = theme0;
|
||||
|
||||
|
||||
struct cw_StrListElem color_ontext[] = {
|
||||
|
||||
/* {DBG_ELEM_DMP, "\x1b[37m"},*/
|
||||
@ -132,7 +135,7 @@ static struct cw_StrListElem prefix[] = {
|
||||
{DBG_DTLS_DETAIL, " DTLS - "},
|
||||
{DBG_WARN, " Warning - "},
|
||||
{DBG_MOD, " Mod - "},
|
||||
{DBG_STATE, " State Machine - "},
|
||||
{DBG_STATE, " STATEMACHINE - "},
|
||||
{DBG_CFG_SET, " Cfg Set - "},
|
||||
|
||||
|
||||
|
@ -120,7 +120,7 @@ enum cw_dbg_levels{
|
||||
/** Debug Mods */
|
||||
DBG_MOD,
|
||||
|
||||
DBG_STATE, /**<Debug State machein */
|
||||
DBG_STATE, /**<Debug State machine */
|
||||
|
||||
DBG_ALL,
|
||||
|
||||
|
96
src/cw/mod.c
96
src/cw/mod.c
@ -33,28 +33,6 @@
|
||||
#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)
|
||||
@ -77,94 +55,32 @@ 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];
|
||||
|
||||
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_MsgSet *cw_mod_get_msg_set(struct cw_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;
|
||||
|
||||
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",
|
||||
cw_log(LOG_ERR, "Can't allocate memory for mod %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(cached_set->msgset, CW_MOD_MODE_CAPWAP);
|
||||
capwap_mod->register_messages(set, CW_MOD_MODE_CAPWAP);
|
||||
}
|
||||
if (bindings_mod != MOD_NULL) {
|
||||
|
||||
bindings_mod->register_messages(cached_set->msgset, CW_MOD_MODE_BINDINGS);
|
||||
bindings_mod->register_messages(set, CW_MOD_MODE_BINDINGS);
|
||||
}
|
||||
/*
|
||||
// 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;
|
||||
return set;
|
||||
}
|
||||
|
||||
|
||||
@ -301,7 +217,7 @@ struct cw_Mod *cw_mod_add_to_list(struct cw_Mod *mod)
|
||||
return mlistelem_dataptr(elem);
|
||||
}
|
||||
|
||||
struct cw_Mod *cw_mod_detect(struct conn *conn,
|
||||
struct cw_Mod *cw_mod_detect(struct cw_Conn *conn,
|
||||
uint8_t * rawmsg, int len,
|
||||
int elems_len, struct sockaddr *from, int mode)
|
||||
{
|
||||
|
@ -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->state_machine)
|
||||
mavl_destroy(set->state_machine);
|
||||
if (set->statemachine_states)
|
||||
mavl_destroy(set->statemachine_states);
|
||||
free(set);
|
||||
}
|
||||
|
||||
@ -160,8 +160,8 @@ struct cw_MsgSet *cw_msgset_create()
|
||||
}
|
||||
|
||||
|
||||
set->state_machine = mavl_create(cmp_machinestate,NULL,sizeof(cw_StateMachineState_t));
|
||||
if (set->state_machine == NULL)
|
||||
set->statemachine_states = mavl_create(cmp_machinestate,NULL,sizeof(cw_StateMachineState_t));
|
||||
if (set->statemachine_states == 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->state_machine,s,&replaced);
|
||||
mavl_replace(set->statemachine_states,s,&replaced);
|
||||
|
||||
if (replaced){
|
||||
repstr = "Replacing";
|
||||
|
@ -68,7 +68,7 @@ struct cw_MsgSet {
|
||||
mavl_t handlers_by_id;
|
||||
mavl_t handlers_by_key;
|
||||
mavl_t types_tree;
|
||||
mavl_t state_machine;
|
||||
mavl_t statemachine_states;
|
||||
int (*write_header)(struct cw_ElemHandler * handler, uint8_t * dst, int len);
|
||||
int (*header_len)(struct cw_ElemHandler *handler);
|
||||
};
|
||||
|
@ -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_put_msg(conn, conn->req_buffer) == -1 ){
|
||||
if ( cw_assemble_message(conn, conn->req_buffer) == -1 ){
|
||||
errno=ENOMSG;
|
||||
return -1;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ include ../../Defs.mak
|
||||
|
||||
SOURCES=\
|
||||
mod_capwap_ac.c \
|
||||
capwap_actions_ac.c \
|
||||
capwap_actions.c \
|
||||
capwap_in_wtp_board_data.c \
|
||||
capwap_in_ac_descriptor.c \
|
||||
capwap_out_wtp_board_data.c \
|
||||
|
@ -1,769 +0,0 @@
|
||||
#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;
|
||||
}
|
@ -4,7 +4,7 @@ include ../../Defs.mak
|
||||
|
||||
SOURCES=\
|
||||
mod_cisco_ac.c \
|
||||
cisco_actions_ac.c \
|
||||
cisco_actions.c \
|
||||
cisco_in_wtp_descriptor.c \
|
||||
cisco_out_wtp_descriptor.c \
|
||||
cisco_in_ac_descriptor.c\
|
||||
|
@ -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,8 +2072,6 @@ static struct cw_ElemHandler handlers73[] = {
|
||||
}
|
||||
,
|
||||
|
||||
|
||||
|
||||
{
|
||||
"AP Venue Settings", /* name */
|
||||
CISCO_ELEM_AP_VENUE_SETTINGS, /* Element ID */
|
@ -1,174 +0,0 @@
|
||||
/*
|
||||
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;
|
||||
}
|
@ -1,577 +0,0 @@
|
||||
/*
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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(mavl_t global, mavl_t local, uint8_t *dst, const char * parent_key){
|
||||
static int put_ac_status(cw_Cfg_t * cfg, cw_Cfg_t * default_cfg, uint8_t *dst, const char * parent_key){
|
||||
|
||||
uint8_t *d = dst;
|
||||
uint8_t security;
|
||||
|
||||
char key[CW_KTV_MAX_KEY_LEN];
|
||||
char key[CW_CFG_MAX_KEY_LEN];
|
||||
|
||||
|
||||
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_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_byte(d,cw_ktv_get_byte(local,"ac-descriptor/security",0));
|
||||
d += cw_put_byte(d,cw_cfg_get_byte(cfg,"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(mavl_t global, mavl_t local, uint8_t *dst, const char *
|
||||
d += cw_put_byte(dst,security);
|
||||
*/
|
||||
sprintf(key,"%s/%s",parent_key,"ac-descriptor/r-mac-field");
|
||||
d += cw_put_byte(d,cw_ktv_get_byte(local,"ac-descriptor/r-mac-field",0));
|
||||
d += cw_put_byte(d,cw_cfg_get_byte(cfg,"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_ktv_get_byte(local,"ac-descriptor/dtls-policy",0));
|
||||
d += cw_put_byte(d,cw_cfg_get_byte(cfg,"ac-descriptor/dtls-policy",0));
|
||||
|
||||
return d - dst;
|
||||
}
|
||||
@ -58,10 +58,12 @@ int cisco_out_ac_descriptor(struct cw_ElemHandler * eh,
|
||||
{
|
||||
int len,l;
|
||||
uint8_t *d = dst+4;
|
||||
char key[CW_KTV_MAX_KEY_LEN];
|
||||
char key[CW_CFG_MAX_KEY_LEN];
|
||||
|
||||
d+=put_ac_status(params->local_cfg,
|
||||
params->global_cfg,
|
||||
cw_dbg(DBG_X,"Putting AC TATUS WIITH KEY: %s",eh->key);
|
||||
|
||||
d+=put_ac_status(params->cfg,
|
||||
params->default_cfg,
|
||||
d, eh->key);
|
||||
|
||||
/* it is important to send software version first,
|
||||
|
@ -1,165 +0,0 @@
|
||||
/*
|
||||
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";
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include "cfg.h"
|
||||
|
||||
|
||||
int configure(struct conn * conn)
|
||||
int configure(struct cw_Conn * conn)
|
||||
{
|
||||
char sockbuff[SOCK_ADDR_BUFSIZE];
|
||||
|
||||
|
@ -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_put_msg(conn, conn->req_buffer);
|
||||
cw_assemble_message(conn, conn->req_buffer);
|
||||
conn_send_msg(conn, conn->req_buffer);
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user