diff --git a/src/ac/statemachine.c b/src/ac/statemachine.c new file mode 100644 index 00000000..850463ff --- /dev/null +++ b/src/ac/statemachine.c @@ -0,0 +1,137 @@ +#include + +#include + +#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; +} + + diff --git a/src/ac/statemachine.h b/src/ac/statemachine.h new file mode 100644 index 00000000..68606fd9 --- /dev/null +++ b/src/ac/statemachine.h @@ -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