Work on Cisco elements

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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