l2tpd_fsm: move TC/ALTC logic into own fsm

This commit is contained in:
Alexander Couzens 2016-10-30 19:08:57 +01:00 committed by Harald Welte
parent d54ccaf083
commit 02af3b5089
2 changed files with 138 additions and 76 deletions

View File

@ -28,47 +28,15 @@ static void l2tp_ctrl_s_wait_ctl_conn(struct osmo_fsm_inst *fi, uint32_t event,
switch (event) {
case L2CC_E_RX_SCCCN:
if (!l2tp_tx_tc_rq(l2c))
osmo_fsm_inst_state_chg(fi, L2CC_S_WAIT_FOR_TCRP, 0, 0);
osmo_fsm_inst_state_chg(fi, L2CC_S_ESTABLISHED, 0, 0);
break;
}
}
static void l2tp_ctrl_s_established(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct l2tpd_connection *l2c = fi->priv;
if (!l2tp_tx_tc_rq(l2c)) {
osmo_fsm_inst_state_chg(fi, L2CC_S_WAIT_FOR_TCRP, 0, 0);
}
}
static void l2tp_ctrl_s_wait_for_tcrp(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct l2tpd_connection *l2c = fi->priv;
switch (event) {
case L2CC_E_RX_TCRP:
l2tp_tx_altc_rq_timeslot(l2c);
osmo_fsm_inst_state_chg(fi, L2CC_S_WAIT_FOR_ALTCRP, 0, 0);
break;
}
}
static void l2tp_ctrl_s_wait_for_altcrp(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct l2tpd_connection *l2c = fi->priv;
switch (event) {
case L2CC_E_RX_ALTCRP:
l2tp_tx_ack(l2c);
osmo_fsm_inst_state_chg(fi, L2CC_S_ESTABLISHED_CONFIGURED, 0, 0);
break;
}
}
static void l2tp_ctrl_s_established_configured(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
}
static void l2tp_ctrl_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
@ -97,8 +65,6 @@ static const struct value_string l2tp_cc_events[] = {
{ L2CC_E_RX_SCCRP, "RX-SCCRP" },
{ L2CC_E_RX_SCCCN, "RX-SCCCN" },
{ L2CC_E_RX_STOP_CCN, "RX-STOPCCN" },
{ L2CC_E_RX_TCRP, "RX-TCRP" },
{ L2CC_E_RX_ALTCRP, "RX-ALTCRP" },
{ L2CC_E_RX_HELLO, "RX-HELLO" },
{ 0, NULL }
};
@ -113,38 +79,16 @@ static const struct osmo_fsm_state l2tp_ctrl_states[] = {
[L2CC_S_WAIT_CTL_CONN] = {
.in_event_mask = S(L2CC_E_RX_SCCCN),
.out_state_mask = S(L2CC_S_ESTABLISHED) |
S(L2CC_S_WAIT_FOR_TCRP) |
S(L2CC_S_INIT),
.name = "WAIT_CTL_CONN",
.action = l2tp_ctrl_s_wait_ctl_conn,
},
[L2CC_S_ESTABLISHED] = {
.in_event_mask = 0,
.out_state_mask = S(L2CC_S_WAIT_FOR_TCRP) |
S(L2CC_S_INIT),
.out_state_mask = S(L2CC_S_INIT),
.name = "ESTABLISHED",
.action = l2tp_ctrl_s_established,
},
[L2CC_S_WAIT_FOR_TCRP] = {
.in_event_mask = S(L2CC_E_RX_TCRP),
.out_state_mask = S(L2CC_S_WAIT_FOR_ALTCRP) |
S(L2CC_S_INIT),
.name = "WAIT_FOR_TCRP",
.action = l2tp_ctrl_s_wait_for_tcrp,
},
[L2CC_S_WAIT_FOR_ALTCRP] = {
.in_event_mask = S(L2CC_E_RX_ALTCRP),
.out_state_mask = S(L2CC_S_ESTABLISHED_CONFIGURED) |
S(L2CC_S_INIT),
.name = "WAIT_FOR_ALTCRP",
.action = l2tp_ctrl_s_wait_for_altcrp,
},
[L2CC_S_ESTABLISHED_CONFIGURED] = {
.in_event_mask = 0,
.out_state_mask = S(L2CC_S_INIT),
.name = "ESTABLISHED_CONFIGURED",
.action = l2tp_ctrl_s_established_configured,
},
}
};
struct osmo_fsm l2tp_cc_fsm = {
@ -157,7 +101,103 @@ struct osmo_fsm l2tp_cc_fsm = {
.allstate_action = l2tp_ctrl_allstate,
};
/* l2tp conf fsm */
static void l2tp_conf_s_wait_for_tcrp(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct l2tpd_connection *l2c = fi->priv;
switch (event) {
case L2CC_E_RX_TCRP:
l2tp_tx_altc_rq_timeslot(l2c);
osmo_fsm_inst_state_chg(fi, L2CONF_S_WAIT_FOR_ALTCRP, 0, 0);
break;
}
}
static void l2tp_conf_s_wait_for_altcrp(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct l2tpd_connection *l2c = fi->priv;
switch (event) {
case L2CC_E_RX_ALTCRP:
l2tp_tx_ack(l2c);
osmo_fsm_inst_state_chg(fi, L2CONF_S_ESTABLISHED, 0, 0);
break;
}
}
static void l2tp_conf_s_established(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
}
static void l2tp_conf_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
switch (event) {
case L2CONF_E_LOCAL_CLOSE_REQ:
osmo_fsm_inst_state_chg(fi, L2CONF_S_INIT, 0, 0);
/* FIXME: teardown instead of INIT */
break;
}
}
static const struct value_string l2tp_conf_events[] = {
{ L2CONF_E_LOCAL_CLOSE_REQ, "LOCAL-CLOSE" },
{ L2CONF_E_TX_TCRQ, "RX-TCRP" },
{ L2CONF_E_RX_TCRP, "RX-TCRP" },
{ L2CONF_E_RX_ALTCRP, "RX-ALTCRP" },
{ L2IC_E_RX_ICCN, "RX-InCall-Connect" },
{ 0, NULL }
};
static const struct osmo_fsm_state l2tp_conf_states[] = {
[L2CONF_S_INIT] = {
.in_event_mask = S(L2CONF_E_RX_TCRP),
.out_state_mask = S(L2CONF_S_WAIT_FOR_ALTCRP) |
S(L2CONF_S_INIT),
.name = "WAIT_FOR_TCRP",
.action = l2tp_conf_s_wait_for_tcrp,
},
[L2CONF_S_WAIT_FOR_TCRP] = {
.in_event_mask = S(L2CONF_E_RX_TCRP),
.out_state_mask = S(L2CONF_S_WAIT_FOR_ALTCRP) |
S(L2CONF_S_INIT),
.name = "WAIT_FOR_TCRP",
.action = l2tp_conf_s_wait_for_tcrp,
},
[L2CONF_S_WAIT_FOR_TC_SESSIONS] = {
.in_event_mask = S(L2CONF_E_RX_TCRP),
.out_state_mask = S(L2CONF_S_WAIT_FOR_ALTCRP) |
S(L2CONF_S_INIT),
.name = "WAIT_FOR_TCRP",
.action = l2tp_conf_s_wait_for_tcrp,
},
[L2CONF_S_WAIT_FOR_ALTCRP] = {
.in_event_mask = S(L2CONF_E_RX_ALTCRP),
.out_state_mask = S(L2CONF_S_ESTABLISHED) |
S(L2CONF_S_INIT),
.name = "WAIT_FOR_ALTCRP",
.action = l2tp_conf_s_wait_for_altcrp,
},
[L2CONF_S_ESTABLISHED] = {
.in_event_mask = 0,
.out_state_mask = S(L2CONF_S_INIT),
.name = "ESTABLISHED",
.action = l2tp_conf_s_established,
},
};
struct osmo_fsm l2tp_conf_fsm = {
.name = "L2TP-CONF",
.states = l2tp_conf_states,
.num_states = ARRAY_SIZE(l2tp_conf_states),
.log_subsys = 0,
.event_names = l2tp_conf_events,
.allstate_event_mask = S(L2CC_E_LOCAL_CLOSE_REQ),
.allstate_action = l2tp_conf_allstate,
};
/* l2tp ic/session fsm */
static void l2tp_ic_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
switch (event) {

View File

@ -23,6 +23,15 @@ enum l2tpd_ctrl_con_event {
L2CC_E_RX_HELLO,
};
enum l2tpd_ctrl_con_state {
/* Before we receive SCCRQ*/
L2CC_S_INIT,
/* After we sent SCCRP, waiting for SCCCN */
L2CC_S_WAIT_CTL_CONN,
/* Control Conncetion is established */
L2CC_S_ESTABLISHED,
};
enum l2tpd_in_call_event {
#if 0
L2IC_E_START,
@ -40,21 +49,7 @@ enum l2tpd_in_call_event {
/* Local Close Request */
L2IC_E_LOCAL_CLOSE_REQ,
};
enum l2tpd_ctrl_con_state {
/* Before we receive SCCRQ*/
L2CC_S_INIT,
/* After we sent SCCRP, waiting for SCCCN */
L2CC_S_WAIT_CTL_CONN,
/* Control Conncetion is established */
L2CC_S_ESTABLISHED,
/* After we sent a TCRQ, waiting for TCRP */
L2CC_S_WAIT_FOR_TCRP,
/* After we sent a ALTTCRQ, waiting for ALTCRP */
L2CC_S_WAIT_FOR_ALTCRP,
/* We configured the SIU to start sessions */
L2CC_S_ESTABLISHED_CONFIGURED
};
extern struct osmo_fsm l2tp_cc_fsm;
/* ICRQ recipient */
enum l2tpd_in_call_state {
@ -64,6 +59,33 @@ enum l2tpd_in_call_state {
L2IC_S_WAIT_CONN,
L2IC_S_ESTABLISHED,
};
extern struct osmo_fsm l2tp_ic_fsm;
extern struct osmo_fsm l2tp_cc_fsm;
enum l2tpd_configure_event {
/* sent the TC rq within state machine */
L2CONF_E_TX_TCRQ,
/* received TC RP */
L2CONF_E_RX_TCRP,
/* l2tp session setted up */
L2CONF_E_RX_ICCN,
/* received ALTC RP */
L2CONF_E_RX_ALTCRP,
/* Local Close Request */
L2CONF_E_LOCAL_CLOSE_REQ,
};
enum l2tpd_configure_state {
/* initial state, sent out TCRQ */
L2CONF_S_INIT,
/* Waiting for TCRP */
L2CONF_S_WAIT_FOR_TCRP,
/* Wait until all l2tp sessions of tcrp setted up. Afterwards sent out ALTCRQ */
L2CONF_S_WAIT_FOR_TC_SESSIONS,
/* Waiting for ALTCRP */
L2CONF_S_WAIT_FOR_ALTCRP,
/* Wait until all l2tp session altcr setted up */
L2CONF_S_WAIT_FOR_ALTC_SESSIONS,
/* Established */
L2CONF_S_ESTABLISHED
};
extern struct osmo_fsm l2tp_conf_fsm;