Work on Cisco elements
FossilOrigin-Name: e85120145936b3c53bef57144667078010c2e22d7db08797259bbc2670eb0a4b
This commit is contained in:
@ -379,6 +379,7 @@
|
||||
#define CAPWAP_WAIT_JOIN 60
|
||||
|
||||
#define CAPWAP_TIMER_CHANGE_STATE_PENDING_TIMER 25
|
||||
#define CAPWAP_TIMER_DATA_CHECK_TIMER 30
|
||||
|
||||
#define CAPWAP_IDLE_TIMEOUT 300
|
||||
|
||||
@ -592,8 +593,8 @@ extern struct cw_StrListElem capwap_strings_board[];
|
||||
#define cw_strmsg(id) cw_strlist_get_str(capwap_strings_msg,id)
|
||||
#define cw_strelem(id) cw_strlist_get_str(capwap_strings_elem,id)
|
||||
|
||||
#define cw_strprestate(id) cw_strlist_get_str(capwap_strings_state,id >> 8)
|
||||
#define cw_strstate(id) cw_strlist_get_str(capwap_strings_state,id & 0xff)
|
||||
|
||||
#define cw_strstate(id) cw_strlist_get_str(capwap_strings_state,id)
|
||||
#define cw_strvendor(id) cw_strlist_get_str(capwap_strings_vendor,id)
|
||||
|
||||
#define cw_strresult(id) cw_strlist_get_str(capwap_strings_result,id)
|
||||
@ -656,6 +657,7 @@ enum capwap_states {
|
||||
CW_STATE_UPDATE,
|
||||
/** Run State */
|
||||
CAPWAP_STATE_RUN,
|
||||
CAPWAP_STATE_DATA_CHECK,
|
||||
|
||||
CAPWAP_STATE_TIMEOUT
|
||||
};
|
||||
|
@ -8,6 +8,8 @@ struct cw_StrListElem capwap_strings_state[] = {
|
||||
{ CAPWAP_STATE_CONFIGURE,"Configure" },
|
||||
{ CW_STATE_IMAGE_DATA,"Image Data" },
|
||||
{ CAPWAP_STATE_DTLS_SETUP, "DTLS Setup" },
|
||||
{ CAPWAP_STATE_DATA_CHECK, "Data Check" },
|
||||
{ CAPWAP_STATE_TIMEOUT, "Timeout"},
|
||||
{ CW_STR_STOP,"Undefined" },
|
||||
|
||||
};
|
||||
|
@ -73,6 +73,7 @@ struct conn {
|
||||
|
||||
|
||||
mavl_t remote_cfg;
|
||||
/* mavl_t default_cfg;*/
|
||||
mavl_t local_cfg;
|
||||
mavl_t global_cfg;
|
||||
|
||||
@ -113,9 +114,12 @@ struct conn {
|
||||
|
||||
struct cw_MsgSet * msgset;
|
||||
|
||||
|
||||
uint8_t capwap_prevstate;
|
||||
|
||||
/** Current CAPWAP state */
|
||||
|
||||
uint16_t capwap_transition;
|
||||
uint8_t capwap_state;
|
||||
|
||||
|
||||
/** The framgent manager used on this connection */
|
||||
|
@ -219,7 +219,8 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
||||
struct cw_MsgData search;
|
||||
struct cw_MsgData * message;
|
||||
int result_code;
|
||||
uint16_t *ui;
|
||||
cw_State_t *ui;
|
||||
|
||||
uint8_t *elems_ptr;
|
||||
uint8_t *elem;
|
||||
|
||||
@ -299,7 +300,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
||||
cw_dbg(DBG_MSG_ERR,
|
||||
"Message type %d [%s] unrecognized, sending response.",
|
||||
search.type, cw_strmsg(search.type),
|
||||
cw_strstate(conn->capwap_transition));
|
||||
cw_strstate(conn->capwap_state));
|
||||
|
||||
result_code = CAPWAP_RESULT_MSG_UNRECOGNIZED;
|
||||
cw_send_error_response(conn, rawmsg, result_code);
|
||||
@ -309,7 +310,7 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
||||
cw_dbg(DBG_MSG_ERR,
|
||||
"Message type %d [%s] unrecognized, discarding.",
|
||||
search.type, cw_strmsg(search.type),
|
||||
cw_strstate(conn->capwap_transition));
|
||||
cw_strstate(conn->capwap_state));
|
||||
errno = EAGAIN;
|
||||
return -1;
|
||||
|
||||
@ -321,29 +322,29 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
||||
* */
|
||||
if (!(message->receiver & conn->role)) {
|
||||
cw_dbg(DBG_MSG_ERR,
|
||||
"Message type %d (%s) unexpected/illegal in %s->%s State, discarding.",
|
||||
"Message type %d (%s) unexpected/illegal in %s State, discarding.",
|
||||
search.type, cw_strmsg(search.type),
|
||||
cw_strprestate(conn->capwap_transition),
|
||||
cw_strstate(conn->capwap_transition));
|
||||
cw_strstate(conn->capwap_state));
|
||||
errno = EAGAIN;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Check if current state is in state of message */
|
||||
ui = message->states;
|
||||
for (ui=message->states; *ui; ui++){
|
||||
printf("Comparing %d and %d\n", conn->capwap_transition, *ui);
|
||||
if(*ui==conn->capwap_transition)
|
||||
|
||||
for (ui=message->states; ui->state; ui++){
|
||||
printf("Comparing %d and %d\n", conn->capwap_state, ui->state);
|
||||
if(ui->state==conn->capwap_state){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!*ui){
|
||||
if (!ui->state){
|
||||
/* Message found, but it was in wrong state */
|
||||
cw_dbg(DBG_MSG_ERR,
|
||||
"Message type %d (%s) not allowed in %s->%s State, sending response.",
|
||||
"Message type %d (%s) not allowed in %s State, sending response.",
|
||||
search.type,cw_strmsg(search.type),
|
||||
cw_strprestate(conn->capwap_transition),
|
||||
cw_strstate(conn->capwap_transition));
|
||||
cw_strstate(conn->capwap_state));
|
||||
result_code = CAPWAP_RESULT_MSG_INVALID_IN_CURRENT_STATE;
|
||||
cw_send_error_response(conn, rawmsg, result_code);
|
||||
errno = EAGAIN;
|
||||
@ -417,7 +418,6 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* all message elements are processed, do now after processing
|
||||
@ -449,10 +449,9 @@ static int process_elements(struct conn *conn, uint8_t * rawmsg, int len,
|
||||
cw_send_error_response(conn, rawmsg, result_code);
|
||||
} else if (result_code == 0) {
|
||||
cw_ktv_set_dword(conn->local_cfg,"result-code",result_code);
|
||||
if (message->next_state){
|
||||
conn->capwap_transition =
|
||||
CW_TRANSITION(conn->capwap_transition,message->next_state);
|
||||
|
||||
if (ui->next){
|
||||
conn->capwap_prevstate = conn->capwap_state;
|
||||
conn->capwap_state = ui->next;
|
||||
}
|
||||
|
||||
/* All is ok, send regular response message */
|
||||
|
@ -340,7 +340,7 @@ struct cw_DescriptorSubelemDef {
|
||||
#define CW_IGNORE 5
|
||||
|
||||
|
||||
#define CW_TRANSITION(prestate,state) (prestate<<8|state)
|
||||
|
||||
|
||||
|
||||
int cw_check_missing_mand(struct cw_MsgData *msgdata, mavl_t keys );
|
||||
|
@ -11,15 +11,16 @@
|
||||
int cw_out_generic(struct cw_ElemHandler * handler, struct cw_ElemHandlerParams * params
|
||||
, uint8_t * dst)
|
||||
{
|
||||
/* char detail[128];*/
|
||||
|
||||
struct cw_KTV * elem, search;
|
||||
int start, len, l;
|
||||
/* Get the element to put */
|
||||
|
||||
/* Get the element */
|
||||
search.key=(char*)handler->key;
|
||||
elem = mavl_get(params->conn->local_cfg, &search);
|
||||
|
||||
|
||||
/* if (elem == NULL && params->conn->default_cfg !=NULL)
|
||||
elem = mavl_get(params->conn->default_cfg, &search);
|
||||
*/
|
||||
if (elem == NULL) {
|
||||
const char *vendor="";
|
||||
if ( handler->vendor ) {
|
||||
|
@ -86,6 +86,8 @@ static struct cw_StrListElem color_on[] = {
|
||||
|
||||
{DBG_INFO, ANSI_DEFAULT},
|
||||
|
||||
{DBG_STATE, ANSI_BBLACK ANSI_BOLD },
|
||||
|
||||
{DBG_RFC, ANSI_BRED},
|
||||
{DBG_X, "\x1b[31m"},
|
||||
{DBG_WARN, ANSI_CYAN},
|
||||
@ -130,6 +132,7 @@ static struct cw_StrListElem prefix[] = {
|
||||
{DBG_DTLS_DETAIL, " DTLS - "},
|
||||
{DBG_WARN, " Warning - "},
|
||||
{DBG_MOD, " Mod - "},
|
||||
{DBG_STATE, " State - "},
|
||||
|
||||
{DBG_X, "XXXXX - "},
|
||||
|
||||
|
@ -118,6 +118,8 @@ enum cw_dbg_levels{
|
||||
/** Debug Mods */
|
||||
DBG_MOD,
|
||||
|
||||
DBG_STATE, /**<Debug State machein */
|
||||
|
||||
DBG_ALL,
|
||||
|
||||
DBG_PKT_DMP_OUT,
|
||||
|
@ -68,6 +68,7 @@ struct cw_StrListElem cw_dbg_strings[] = {
|
||||
{ DBG_WARN, "warn" },
|
||||
|
||||
{ DBG_MOD,"mod"},
|
||||
{ DBG_STATE, "state" },
|
||||
{ DBG_ALL, "all"},
|
||||
|
||||
{ CW_STR_STOP, NULL }
|
||||
|
@ -58,6 +58,18 @@ static int cmp_elemdata(const void *elem1, const void *elem2)
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int cmp_machinestate(const void *state1, const void *state2)
|
||||
{
|
||||
const struct cw_StateMachineState *s1 = state1;
|
||||
const struct cw_StateMachineState *s2 = state2;
|
||||
int rc;
|
||||
rc = s1->state - s2->state;
|
||||
if (rc!=0)
|
||||
return rc;
|
||||
return s1->prevstate-s2->prevstate;
|
||||
}
|
||||
|
||||
static void msgdata_destroy(struct cw_MsgData *data)
|
||||
{
|
||||
if (!data)
|
||||
@ -67,6 +79,7 @@ static void msgdata_destroy(struct cw_MsgData *data)
|
||||
|
||||
if (data->elements_tree)
|
||||
mavl_destroy(data->elements_tree);
|
||||
|
||||
free(data);
|
||||
}
|
||||
|
||||
@ -89,6 +102,8 @@ void cw_msgset_destroy(struct cw_MsgSet *set)
|
||||
mavl_destroy(set->handlers_by_id);
|
||||
if (set->handlers_by_key)
|
||||
mavl_destroy(set->handlers_by_key);
|
||||
if (set->state_machine)
|
||||
mavl_destroy(set->state_machine);
|
||||
free(set);
|
||||
}
|
||||
|
||||
@ -105,6 +120,8 @@ struct cw_MsgSet *cw_msgset_create()
|
||||
return NULL;
|
||||
|
||||
memset(set, 0, sizeof(struct cw_MsgSet));
|
||||
|
||||
|
||||
|
||||
/* create mavl for all_elems by id */
|
||||
set->handlers_by_id = mavl_create(cmp_cw_elemhandler_by_id, NULL,
|
||||
@ -135,6 +152,13 @@ struct cw_MsgSet *cw_msgset_create()
|
||||
cw_msgset_destroy(set);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
set->state_machine = mavl_create(cmp_machinestate,NULL,sizeof(cw_StateMachineState_t));
|
||||
if (set->state_machine == NULL)
|
||||
{
|
||||
cw_msgset_destroy(set);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return set;
|
||||
}
|
||||
@ -292,9 +316,9 @@ int cw_msgset_add(struct cw_MsgSet *set,
|
||||
msg->postprocess = msgdef->postprocess;
|
||||
if (msgdef->preprocess != NULL)
|
||||
msg->preprocess = msgdef->preprocess;
|
||||
if (msgdef->next_state)
|
||||
/* if (msgdef->next_state)
|
||||
msg->next_state=msgdef->next_state;
|
||||
|
||||
*/
|
||||
msg->receiver = msgdef->receiver;
|
||||
|
||||
|
||||
@ -319,6 +343,30 @@ int cw_msgset_add(struct cw_MsgSet *set,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cw_msgset_add_states(struct cw_MsgSet * set, cw_StateMachineState_t * states)
|
||||
{
|
||||
cw_StateMachineState_t * s;
|
||||
int replaced;
|
||||
|
||||
s=states;
|
||||
while (s->state != 0){
|
||||
const char * repstr;
|
||||
mavl_replace(set->state_machine,s,&replaced);
|
||||
|
||||
if (replaced){
|
||||
repstr = "Replacing";
|
||||
}
|
||||
else{
|
||||
repstr = "Adding";
|
||||
}
|
||||
cw_dbg(DBG_MOD,"%s machine state : [%s->%s]",repstr,
|
||||
cw_strstate(s->prevstate),
|
||||
cw_strstate(s->state));
|
||||
s++;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Find message data to a specific message
|
||||
* @param set message set
|
||||
|
@ -12,7 +12,7 @@ struct cw_MsgSet {
|
||||
mavl_t handlers_by_id;
|
||||
mavl_t handlers_by_key;
|
||||
mavl_t types_tree;
|
||||
|
||||
mavl_t state_machine;
|
||||
};
|
||||
|
||||
struct cw_ElemDef{
|
||||
@ -62,24 +62,32 @@ struct cw_ElemHandler {
|
||||
|
||||
};
|
||||
|
||||
struct cw_State{
|
||||
uint8_t state;
|
||||
uint8_t next;
|
||||
};
|
||||
typedef struct cw_State cw_State_t;
|
||||
|
||||
struct cw_MsgDef{
|
||||
const char * name;
|
||||
int type; /**< Message type */
|
||||
int receiver; /**< Who can receive this message */
|
||||
uint16_t * states; /**< states in wich the message is allowed */
|
||||
cw_State_t * states; /**< states in wich the message is allowed */
|
||||
|
||||
|
||||
struct cw_ElemDef * elements;
|
||||
int (*preprocess)(struct conn * conn);
|
||||
int (*postprocess)(struct conn * conn);
|
||||
uint8_t next_state;
|
||||
/* uint8_t next_state;*/
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
struct cw_MsgData{
|
||||
int type;
|
||||
const char * name;
|
||||
uint16_t * states;
|
||||
cw_State_t * states;
|
||||
int receiver;
|
||||
mavl_t elements_tree;
|
||||
mlist_t elements_list;
|
||||
@ -87,18 +95,32 @@ struct cw_MsgData{
|
||||
|
||||
int (*preprocess)(struct conn * conn);
|
||||
int (*postprocess)(struct conn * conn);
|
||||
uint8_t next_state;
|
||||
/* uint8_t next_state;*/
|
||||
};
|
||||
|
||||
|
||||
struct cw_StateMachineState{
|
||||
uint8_t prevstate;
|
||||
uint8_t state;
|
||||
const char * timer_key;
|
||||
int timer_default;
|
||||
int retval;
|
||||
const char *dbgmsg;
|
||||
uint8_t jump_prevstate;
|
||||
uint8_t jump_state;
|
||||
|
||||
|
||||
};
|
||||
typedef struct cw_StateMachineState cw_StateMachineState_t;
|
||||
|
||||
extern struct cw_MsgSet * cw_msgset_create();
|
||||
|
||||
extern void cw_msgset_destroy(struct cw_MsgSet * set);
|
||||
extern int cw_msgset_add(struct cw_MsgSet * set,
|
||||
void cw_msgset_destroy(struct cw_MsgSet * set);
|
||||
int cw_msgset_add(struct cw_MsgSet * set,
|
||||
struct cw_MsgDef messages[], struct cw_ElemHandler handlers[]);
|
||||
|
||||
int cw_msgset_add_states(struct cw_MsgSet * set, cw_StateMachineState_t * states);
|
||||
|
||||
/*mlist_t cw_msgset_get_msg(struct cw_MsgSet * set, int type);*/
|
||||
|
||||
struct cw_MsgData * cw_msgset_get_msgdata(struct cw_MsgSet *set,int type);
|
||||
|
Reference in New Issue
Block a user