l2tpd_fsm: move TC/ALTC logic into own fsm
This commit is contained in:
parent
d54ccaf083
commit
02af3b5089
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue