Stae MAchine
This commit is contained in:
parent
e5f5687b2b
commit
ce4a1dd2df
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
|
Loading…
Reference in New Issue
Block a user