Work on v5x_le_port_fsm.c

This commit is contained in:
Andreas Eversberg 2022-12-26 14:45:33 +01:00
parent 58937c291b
commit ba46786de7
2 changed files with 379 additions and 331 deletions

View File

@ -75,57 +75,30 @@ static const struct value_string v5x_le_ctrl_port_fsm_event_names[] = {
};
/***********************************************************************/
/* upper layer interface */
/* Messages to other layers */
/***********************************************************************/
static void v5x_mph_rcv(struct osmo_fsm_inst *fi, enum v5x_mph_prim prim, uint8_t perf_grading)
/* send message to management layer */
static void mph_rcv(struct osmo_fsm_inst *fi, enum v5x_mph_prim prim, uint8_t perf_grading)
{
struct v5x_user_port *v5up = fi->priv;
v5x_mph_rcv_an(v5up, prim, perf_grading);
v5x_le_port_mph_rcv(v5up, prim, perf_grading);
}
void v5x_mph_snd(struct v5x_user_port *v5up, enum v5x_mph_prim prim)
static void ctrl_snd(struct osmo_fsm_inst *fi, enum v5x_ctrl_func_el prim)
{
struct osmo_fsm_inst *fi = v5up->port_fi;
enum v5x_le_ctrl_port_fsm_event event;
struct v5x_user_port *v5up = fi->priv;
switch (prim) {
case MPH_UBR:
event = V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ;
break;
case MPH_BI:
event = V5X_CUP_LE_MPH_BI_BLOCK_CMD;
break;
case MPH_AR:
event = V5X_CUP_LE_MPH_AR_ACTIVATE_ACCESS_REQ;
break;
case MPH_DR:
event = V5X_CUP_LE_MPH_DR_DEACTIVATE_ACCESS_REQ;
break;
case MPH_DB:
event = V5X_CUP_LE_MPH_DB_BLOCK_DCHAN_REQ;
break;
case MPH_DU:
event = V5X_CUP_LE_MPH_DU_BLOCK_DCHAN_REQ;
break;
default:
LOGP(DV5PORT, LOGL_NOTICE, "Got invalid prim %d at this protocol\n", prim);
return;
}
/* send event to FSM */
osmo_fsm_inst_dispatch(fi, event, NULL);
v5x_le_ctrl_port_snd(v5up, prim);
}
/***********************************************************************/
/* ISDN port state FSM */
/***********************************************************************/
static void isdn_up_le10_blocked(struct osmo_fsm_inst *fi, uint32_t event, void *data)
static void isdn_up_le10_blocked(struct osmo_fsm_inst *fi, uint32_t event, void __attribute__((unused)) *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_FE102_ACTIV_INIT_USER_IND:
case V5X_CUP_LE_FE103_DS_ACTIVATED_IND:
@ -137,16 +110,16 @@ static void isdn_up_le10_blocked(struct osmo_fsm_inst *fi, uint32_t event, void
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE11_NOP_LOCAL_UNBLOCK, 0, 0);
/* Send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
/* Send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE12_NOP_REMOTE_UNBLOCK, 0, 0);
/* Send MPU-UBR */
v5x_mph_rcv(fi, MPH_UBR, 0);
mph_rcv(fi, MPH_UBR, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
case V5X_CUP_LE_FE205_BLOCK_REQ:
@ -158,15 +131,13 @@ static void isdn_up_le10_blocked(struct osmo_fsm_inst *fi, uint32_t event, void
}
static void isdn_up_le11_local_unblock(struct osmo_fsm_inst *fi, uint32_t event, void *data)
static void isdn_up_le11_local_unblock(struct osmo_fsm_inst *fi, uint32_t event, void __attribute__((unused)) *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_FE102_ACTIV_INIT_USER_IND:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE21_OP_ACTIVATION_INITIATED, 0, 0);
/* send MPG-AWI */
v5x_mph_rcv(fi, MPH_AWI, 0);
mph_rcv(fi, MPH_AWI, 0);
break;
case V5X_CUP_LE_FE103_DS_ACTIVATED_IND:
/* ignore */
@ -174,7 +145,7 @@ static void isdn_up_le11_local_unblock(struct osmo_fsm_inst *fi, uint32_t event,
case V5X_CUP_LE_FE104_ACCESS_ACTIVATED_IND:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE22_OP_ACCESS_ACTIVATED, 0, 0);
/* send MPH-AI */
v5x_mph_rcv(fi, MPH_AI, 0);
mph_rcv(fi, MPH_AI, 0);
break;
case V5X_CUP_LE_MPH_DR_DEACTIVATE_ACCESS_REQ:
case V5X_CUP_LE_FE106_ACCESS_DEACTIVATED_IND:
@ -182,22 +153,22 @@ static void isdn_up_le11_local_unblock(struct osmo_fsm_inst *fi, uint32_t event,
break;
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
/* send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED, 0, 0);
/* send MPH-UBI */
v5x_mph_rcv(fi, MPH_UBI, 0);
mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* send MPH-BI */
v5x_mph_rcv(fi, MPH_BI, 0);
mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* ignore */
@ -207,10 +178,8 @@ static void isdn_up_le11_local_unblock(struct osmo_fsm_inst *fi, uint32_t event,
}
}
static void isdn_up_le12_remote_unblock(struct osmo_fsm_inst *fi, uint32_t event, void *data)
static void isdn_up_le12_remote_unblock(struct osmo_fsm_inst *fi, uint32_t event, void __attribute__((unused)) *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_FE103_DS_ACTIVATED_IND:
/* ignore */
@ -222,23 +191,23 @@ static void isdn_up_le12_remote_unblock(struct osmo_fsm_inst *fi, uint32_t event
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED, 0, 0);
/* send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
/* send MPH-UBI */
v5x_mph_rcv(fi, MPH_UBI, 0);
mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
/* send MPH-UBR */
v5x_mph_rcv(fi, MPH_UBR, 0);
mph_rcv(fi, MPH_UBR, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* send MPH-BI */
v5x_mph_rcv(fi, MPH_BI, 0);
mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* ignore */
@ -251,18 +220,16 @@ static void isdn_up_le12_remote_unblock(struct osmo_fsm_inst *fi, uint32_t event
/* LE 2.0 Operational deactivated */
static void isdn_up_le20_op_deact(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_MPH_AR_ACTIVATE_ACCESS_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE21_OP_ACTIVATION_INITIATED, 0, 0);
/* Send FE101 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE101_ACTIVATE_ACCESS);
ctrl_snd(fi, V5X_CTRL_FE101_ACTIVATE_ACCESS);
break;
case V5X_CUP_LE_FE102_ACTIV_INIT_USER_IND:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE21_OP_ACTIVATION_INITIATED, 0, 0);
/* Send MPH-AWI */
v5x_mph_rcv(fi, MPH_AWI, 0);
mph_rcv(fi, MPH_AWI, 0);
break;
case V5X_CUP_LE_FE103_DS_ACTIVATED_IND:
/* ignore */
@ -270,41 +237,41 @@ static void isdn_up_le20_op_deact(struct osmo_fsm_inst *fi, uint32_t event, void
case V5X_CUP_LE_FE104_ACCESS_ACTIVATED_IND:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE22_OP_ACCESS_ACTIVATED, 0, 0);
/* Send MPH-AI */
v5x_mph_rcv(fi, MPH_AI, 0);
mph_rcv(fi, MPH_AI, 0);
break;
case V5X_CUP_LE_MPH_DR_DEACTIVATE_ACCESS_REQ:
/* Send FE105 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE105_DEACTIVATE_ACCESS);
ctrl_snd(fi, V5X_CTRL_FE105_DEACTIVATE_ACCESS);
break;
case V5X_CUP_LE_FE106_ACCESS_DEACTIVATED_IND:
/* Send MPH-DI */
v5x_mph_rcv(fi, MPH_DI, 0);
mph_rcv(fi, MPH_DI, 0);
break;
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
/* Send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* Send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
/* Send MPH-UBI */
v5x_mph_rcv(fi, MPH_UBI, 0);
mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* Send MPH-BI */
v5x_mph_rcv(fi, MPH_BI, 0);
mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* Send MPH-BR */
v5x_mph_rcv(fi, MPH_BR, 0);
mph_rcv(fi, MPH_BR, 0);
break;
case V5X_CUP_LE_FE206_PREFORMANCE_GRADING_IND:
/* Send MPH-GI */
v5x_mph_rcv(fi, MPH_GI, *(uint8_t *)data);
mph_rcv(fi, MPH_GI, *(uint8_t *)data);
break;
default:
OSMO_ASSERT(0);
@ -314,8 +281,6 @@ static void isdn_up_le20_op_deact(struct osmo_fsm_inst *fi, uint32_t event, void
/* LE 2.1 Access initiated */
static void isdn_up_le21_op_act_init(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_MPH_AR_ACTIVATE_ACCESS_REQ:
case V5X_CUP_LE_FE102_ACTIV_INIT_USER_IND:
@ -323,52 +288,52 @@ static void isdn_up_le21_op_act_init(struct osmo_fsm_inst *fi, uint32_t event, v
break;
case V5X_CUP_LE_FE103_DS_ACTIVATED_IND:
/* Send MPH-DSAI */
v5x_mph_rcv(fi, MPH_DSAI, 0);
mph_rcv(fi, MPH_DSAI, 0);
break;
case V5X_CUP_LE_FE104_ACCESS_ACTIVATED_IND:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE22_OP_ACCESS_ACTIVATED, 0, 0);
/* Send MPH-AI */
v5x_mph_rcv(fi, MPH_AI, 0);
mph_rcv(fi, MPH_AI, 0);
break;
case V5X_CUP_LE_MPH_DR_DEACTIVATE_ACCESS_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED, 0, 0);
/* Send FE105 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE105_DEACTIVATE_ACCESS);
ctrl_snd(fi, V5X_CTRL_FE105_DEACTIVATE_ACCESS);
/* Send MPH-DI */
v5x_mph_rcv(fi, MPH_DI, 0);
mph_rcv(fi, MPH_DI, 0);
break;
case V5X_CUP_LE_FE106_ACCESS_DEACTIVATED_IND:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED, 0, 0);
/* Send MPH-DI */
v5x_mph_rcv(fi, MPH_DI, 0);
mph_rcv(fi, MPH_DI, 0);
break;
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
/* Send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* Send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
/* Send MPH-UBI */
v5x_mph_rcv(fi, MPH_UBI, 0);
mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* Send MPH-BI */
v5x_mph_rcv(fi, MPH_BI, 0);
mph_rcv(fi, MPH_BI, 0);
/* Send MPH-DI */
v5x_mph_rcv(fi, MPH_DI, 0);
mph_rcv(fi, MPH_DI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* Send MPH-BR */
v5x_mph_rcv(fi, MPH_BR, 0);
mph_rcv(fi, MPH_BR, 0);
break;
case V5X_CUP_LE_FE206_PREFORMANCE_GRADING_IND:
/* Send MPH-GI */
v5x_mph_rcv(fi, MPH_GI, *(uint8_t *)data);
mph_rcv(fi, MPH_GI, *(uint8_t *)data);
break;
default:
OSMO_ASSERT(0);
@ -379,8 +344,6 @@ static void isdn_up_le21_op_act_init(struct osmo_fsm_inst *fi, uint32_t event, v
/* LE 2.2 Access activated */
static void isdn_up_le22_op_acc_act(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_FE104_ACCESS_ACTIVATED_IND:
/* ignore */
@ -388,52 +351,52 @@ static void isdn_up_le22_op_acc_act(struct osmo_fsm_inst *fi, uint32_t event, vo
case V5X_CUP_LE_MPH_DR_DEACTIVATE_ACCESS_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED, 0, 0);
/* Send FE105 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE105_DEACTIVATE_ACCESS);
ctrl_snd(fi, V5X_CTRL_FE105_DEACTIVATE_ACCESS);
/* Send MPH-DI */
v5x_mph_rcv(fi, MPH_DI, 0);
mph_rcv(fi, MPH_DI, 0);
break;
case V5X_CUP_LE_FE106_ACCESS_DEACTIVATED_IND:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED, 0, 0);
/* Send MPH-DI */
v5x_mph_rcv(fi, MPH_DI, 0);
mph_rcv(fi, MPH_DI, 0);
break;
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
/* Send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
/* Send MPH-AI */
v5x_mph_rcv(fi, MPH_AI, 0);
mph_rcv(fi, MPH_AI, 0);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* Send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
/* Send MPH-UBI */
v5x_mph_rcv(fi, MPH_UBI, 0);
mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_I_S_LE10_NOP_BLOCKED, 0, 0);
/* Send MPH-BI */
v5x_mph_rcv(fi, MPH_BI, 0);
mph_rcv(fi, MPH_BI, 0);
/* Send MPH-DI */
v5x_mph_rcv(fi, MPH_DI, 0);
mph_rcv(fi, MPH_DI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* Send MPH-BR */
v5x_mph_rcv(fi, MPH_BR, 0);
mph_rcv(fi, MPH_BR, 0);
break;
case V5X_CUP_LE_FE206_PREFORMANCE_GRADING_IND:
/* Send MPH-GI */
v5x_mph_rcv(fi, MPH_GI, *(uint8_t *)data);
mph_rcv(fi, MPH_GI, *(uint8_t *)data);
break;
case V5X_CUP_LE_MPH_DB_BLOCK_DCHAN_REQ:
/* Send FE207 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE207_D_CHANNEL_BLOCK);
ctrl_snd(fi, V5X_CTRL_FE207_D_CHANNEL_BLOCK);
break;
case V5X_CUP_LE_MPH_DU_BLOCK_DCHAN_REQ:
/* Send FE208 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE208_D_CHANNEL_UNBLOCK);
ctrl_snd(fi, V5X_CTRL_FE208_D_CHANNEL_UNBLOCK);
break;
default:
OSMO_ASSERT(0);
@ -443,7 +406,7 @@ static void isdn_up_le22_op_acc_act(struct osmo_fsm_inst *fi, uint32_t event, vo
/* Table 38/G.964 LE (ISDN port) FSM for ISDN basic access user ports */
static const struct osmo_fsm_state v5x_le_ctrl_isdn_port_fsm_states[] = {
[V5X_LE_UP_I_S_LE10_NOP_BLOCKED] = {
.name = "LE1.0_BLOCKED",
.name = "Blocked (LE1.0)",
.in_event_mask = S(V5X_CUP_LE_FE102_ACTIV_INIT_USER_IND) |
S(V5X_CUP_LE_FE103_DS_ACTIVATED_IND) |
S(V5X_CUP_LE_FE104_ACCESS_ACTIVATED_IND) |
@ -459,7 +422,7 @@ static const struct osmo_fsm_state v5x_le_ctrl_isdn_port_fsm_states[] = {
.action = isdn_up_le10_blocked,
},
[V5X_LE_UP_I_S_LE11_NOP_LOCAL_UNBLOCK] = {
.name = "LE1.1_LOCAL_UNBLOCK",
.name = "Local unblock (LE1.1)",
.in_event_mask = S(V5X_CUP_LE_FE102_ACTIV_INIT_USER_IND) |
S(V5X_CUP_LE_FE103_DS_ACTIVATED_IND) |
S(V5X_CUP_LE_FE104_ACCESS_ACTIVATED_IND) |
@ -477,7 +440,7 @@ static const struct osmo_fsm_state v5x_le_ctrl_isdn_port_fsm_states[] = {
.action = isdn_up_le11_local_unblock,
},
[V5X_LE_UP_I_S_LE12_NOP_REMOTE_UNBLOCK] = {
.name = "LE1.2_REMOTE_UNBLOCK",
.name = "Remote unblock (LE1.2)",
.in_event_mask = S(V5X_CUP_LE_FE103_DS_ACTIVATED_IND) |
S(V5X_CUP_LE_MPH_DR_DEACTIVATE_ACCESS_REQ) |
S(V5X_CUP_LE_FE106_ACCESS_DEACTIVATED_IND) |
@ -491,7 +454,7 @@ static const struct osmo_fsm_state v5x_le_ctrl_isdn_port_fsm_states[] = {
.action = isdn_up_le12_remote_unblock,
},
[V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED] = {
.name = "LE2.0_OPERATIONAL_DEACTIVATED",
.name = "Operational deactivated (LE2.0)",
.in_event_mask = S(V5X_CUP_LE_MPH_AR_ACTIVATE_ACCESS_REQ) |
S(V5X_CUP_LE_FE102_ACTIV_INIT_USER_IND) |
S(V5X_CUP_LE_FE103_DS_ACTIVATED_IND) |
@ -510,7 +473,7 @@ static const struct osmo_fsm_state v5x_le_ctrl_isdn_port_fsm_states[] = {
.action = isdn_up_le20_op_deact,
},
[V5X_LE_UP_I_S_LE21_OP_ACTIVATION_INITIATED] = {
.name = "LE2.1_ACTIVATION_INITIATED",
.name = "Activation initiated (LE2.1)",
.in_event_mask = S(V5X_CUP_LE_MPH_AR_ACTIVATE_ACCESS_REQ) |
S(V5X_CUP_LE_FE102_ACTIV_INIT_USER_IND) |
S(V5X_CUP_LE_FE103_DS_ACTIVATED_IND) |
@ -528,7 +491,7 @@ static const struct osmo_fsm_state v5x_le_ctrl_isdn_port_fsm_states[] = {
.action = isdn_up_le21_op_act_init,
},
[V5X_LE_UP_I_S_LE22_OP_ACCESS_ACTIVATED] = {
.name = "LE2.2_ACCESS_ACTIVATED",
.name = "Access activated (LE2.2)",
.in_event_mask = S(V5X_CUP_LE_FE104_ACCESS_ACTIVATED_IND) |
S(V5X_CUP_LE_MPH_DR_DEACTIVATE_ACCESS_REQ) |
S(V5X_CUP_LE_FE106_ACCESS_DEACTIVATED_IND) |
@ -571,7 +534,287 @@ struct osmo_fsm_inst *v5x_le_port_isdn_create(struct v5x_user_port *v5up, uint16
return fi;
}
void v5x_le_port_isdn_rcv(struct v5x_user_port *v5up, uint8_t cfe, uint8_t perf_grading)
bool v5x_le_port_isdn_is_operational(struct osmo_fsm_inst *fi)
{
return (fi->state >= V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED);
}
void v5x_le_port_isdn_block(struct osmo_fsm_inst *fi)
{
LOGP(DV5PORT, LOGL_DEBUG, "Put ISDN port into blocked state\n");
fi->state = V5X_LE_UP_I_S_LE10_NOP_BLOCKED;
}
void v5x_le_port_isdn_unblock(struct osmo_fsm_inst *fi)
{
LOGP(DV5PORT, LOGL_DEBUG, "Put ISDN port into unblocked state\n");
fi->state = V5X_LE_UP_I_S_LE20_OP_OPERATIONAL_DEACTIVTED;
}
const char *v5x_le_port_isdn_state_name(struct osmo_fsm_inst *fi)
{
return v5x_le_ctrl_isdn_port_fsm_states[fi->state].name;
}
/***********************************************************************/
/* PSTN port state FSM */
/***********************************************************************/
static void pstn_up_le10_blocked(struct osmo_fsm_inst *fi, uint32_t event, void __attribute__((unused)) *data)
{
switch (event) {
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE11_NOP_LOCAL_UNBLOCK, 0, 0);
/* Send FE201 */
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
/* Send FE203 */
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE12_NOP_REMOTE_UNBLOCK, 0, 0);
/* Send MPU-UBR */
mph_rcv(fi, MPH_UBR, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* ignore */
break;
default:
OSMO_ASSERT(0);
}
}
static void pstn_up_le11_local_unblock(struct osmo_fsm_inst *fi, uint32_t event, void __attribute__((unused)) *data)
{
switch (event) {
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
/* send FE201 */
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* send FE203 */
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE20_OPERATIONAL, 0, 0);
/* send MPH-UBI */
mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* send MPH-BI */
mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* ignore */
break;
default:
OSMO_ASSERT(0);
}
}
static void pstn_up_le12_remote_unblock(struct osmo_fsm_inst *fi, uint32_t event, void __attribute__((unused)) *data)
{
switch (event) {
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE20_OPERATIONAL, 0, 0);
/* send FE201 */
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
/* send MPH-UBI */
mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* send FE203 */
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
/* send MPH-UBR */
mph_rcv(fi, MPH_UBR, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* send MPH-BI */
mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* ignore */
break;
default:
OSMO_ASSERT(0);
}
}
/* LE 2.0 Operational deactivated */
static void pstn_up_le20_operational(struct osmo_fsm_inst *fi, uint32_t event, void __attribute__((unused)) *data)
{
switch (event) {
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
/* Send FE201 */
ctrl_snd(fi, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* Send FE203 */
ctrl_snd(fi, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
/* Send MPH-UBI */
mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* Send MPH-BI */
mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* Send MPH-BR */
mph_rcv(fi, MPH_BR, 0);
break;
default:
OSMO_ASSERT(0);
}
}
/* Table 43/G.964 LE (ISDN port) FSM for PSTN user ports */
static const struct osmo_fsm_state v5x_le_ctrl_pstn_port_fsm_states[] = {
[V5X_LE_UP_P_S_LE10_NOP_BLOCKED] = {
.name = "Blocked (LE1.0)",
.in_event_mask = S(V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ) |
S(V5X_CUP_LE_MPH_BI_BLOCK_CMD) |
S(V5X_CUP_LE_FE202_UNBLOCK) |
S(V5X_CUP_LE_FE204_BLOCK_CMD) |
S(V5X_CUP_LE_FE205_BLOCK_REQ),
.out_state_mask = S(V5X_LE_UP_P_S_LE11_NOP_LOCAL_UNBLOCK) |
S(V5X_LE_UP_P_S_LE12_NOP_REMOTE_UNBLOCK),
.action = pstn_up_le10_blocked,
},
[V5X_LE_UP_P_S_LE11_NOP_LOCAL_UNBLOCK] = {
.name = "Local unblock (LE1.1)",
.in_event_mask = S(V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ) |
S(V5X_CUP_LE_MPH_BI_BLOCK_CMD) |
S(V5X_CUP_LE_FE202_UNBLOCK) |
S(V5X_CUP_LE_FE204_BLOCK_CMD) |
S(V5X_CUP_LE_FE205_BLOCK_REQ),
.out_state_mask = S(V5X_LE_UP_P_S_LE10_NOP_BLOCKED) |
S(V5X_LE_UP_P_S_LE20_OPERATIONAL),
.action = pstn_up_le11_local_unblock,
},
[V5X_LE_UP_P_S_LE12_NOP_REMOTE_UNBLOCK] = {
.name = "Remote unblock (LE1.2)",
.in_event_mask = S(V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ) |
S(V5X_CUP_LE_MPH_BI_BLOCK_CMD) |
S(V5X_CUP_LE_FE202_UNBLOCK) |
S(V5X_CUP_LE_FE204_BLOCK_CMD) |
S(V5X_CUP_LE_FE205_BLOCK_REQ),
.out_state_mask = S(V5X_LE_UP_P_S_LE20_OPERATIONAL) |
S(V5X_LE_UP_P_S_LE10_NOP_BLOCKED),
.action = pstn_up_le12_remote_unblock,
},
[V5X_LE_UP_P_S_LE20_OPERATIONAL] = {
.name = "Operational (LE2.0)",
.in_event_mask = S(V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ) |
S(V5X_CUP_LE_MPH_BI_BLOCK_CMD) |
S(V5X_CUP_LE_FE202_UNBLOCK) |
S(V5X_CUP_LE_FE204_BLOCK_CMD) |
S(V5X_CUP_LE_FE205_BLOCK_REQ),
.out_state_mask = S(V5X_LE_UP_P_S_LE10_NOP_BLOCKED),
.action = pstn_up_le20_operational,
},
};
struct osmo_fsm v5x_le_ctrl_pstn_port_fsm = {
.name = "V5X_CTRL_PSTN",
.states = v5x_le_ctrl_pstn_port_fsm_states,
.num_states = ARRAY_SIZE(v5x_le_ctrl_pstn_port_fsm_states),
.allstate_event_mask = 0,
.allstate_action = NULL,
.cleanup = NULL,
.log_subsys = DV5PORT,
.event_names = v5x_le_ctrl_port_fsm_event_names,
};
struct osmo_fsm_inst *v5x_le_port_pstn_create(struct v5x_user_port *v5up, uint16_t nr)
{
struct osmo_fsm_inst *fi;
OSMO_ASSERT(v5up);
fi = osmo_fsm_inst_alloc(&v5x_le_ctrl_pstn_port_fsm, v5up, v5up, LOGL_DEBUG, NULL);
if (!fi)
return NULL;
osmo_fsm_inst_update_id_f(fi, "%d", nr);
return fi;
}
void v5x_le_port_init(void)
{
int rc;
rc = osmo_fsm_register(&v5x_le_ctrl_isdn_port_fsm);
OSMO_ASSERT(!rc);
rc = osmo_fsm_register(&v5x_le_ctrl_pstn_port_fsm);
OSMO_ASSERT(!rc);
LOGP(DV5PORT, LOGL_NOTICE, "Using V5x port control protocol\n");
}
bool v52_le_port_pstn_is_operational(struct osmo_fsm_inst *fi)
{
return (fi->state >= V5X_LE_UP_P_S_LE20_OPERATIONAL);
}
void v5x_le_port_pstn_block(struct osmo_fsm_inst *fi)
{
LOGP(DV5PORT, LOGL_DEBUG, "Put PSTN port into blocked state\n");
fi->state = V5X_LE_UP_P_S_LE10_NOP_BLOCKED;
}
void v5x_le_port_pstn_unblock(struct osmo_fsm_inst *fi)
{
LOGP(DV5PORT, LOGL_DEBUG, "Put PSTN port into unblocked state\n");
fi->state = V5X_LE_UP_P_S_LE20_OPERATIONAL;
}
const char *v5x_le_port_pstn_state_name(struct osmo_fsm_inst *fi)
{
return v5x_le_ctrl_pstn_port_fsm_states[fi->state].name;
}
/***********************************************************************
* Messages from other layers
***********************************************************************/
/* message from DL layer */
void v5x_le_port_pstn_fe_rcv(struct v5x_user_port *v5up, uint8_t cfe)
{
struct osmo_fsm_inst *fi = v5up->port_fi;
enum v5x_le_ctrl_port_fsm_event event;
switch (cfe) {
case V5X_CTRL_FE201_UNBLOCK: // actually FE202
event = V5X_CUP_LE_FE202_UNBLOCK;
break;
case V5X_CTRL_FE203_BLOCK: // actually FE204
event = V5X_CUP_LE_FE204_BLOCK_CMD;
break;
case V5X_CTRL_FE205_BLOCK_REQ:
event = V5X_CUP_LE_FE205_BLOCK_REQ;
break;
default:
LOGP(DV5PORT, LOGL_NOTICE, "Received cfe %d not valid at this protocol\n", cfe);
}
/* send event to FSM */
osmo_fsm_inst_dispatch(fi, event, NULL);
}
/* message from DL layer */
void v5x_le_port_isdn_fe_rcv(struct v5x_user_port *v5up, uint8_t cfe, uint8_t perf_grading)
{
enum v5x_le_ctrl_port_fsm_event event;
@ -609,240 +852,36 @@ void v5x_le_port_isdn_rcv(struct v5x_user_port *v5up, uint8_t cfe, uint8_t perf_
osmo_fsm_inst_dispatch(v5up->port_fi, event, &perf_grading);
}
/***********************************************************************/
/* PSTN port state FSM */
/***********************************************************************/
static void pstn_up_le10_blocked(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE11_NOP_LOCAL_UNBLOCK, 0, 0);
/* Send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
/* Send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE12_NOP_REMOTE_UNBLOCK, 0, 0);
/* Send MPU-UBR */
v5x_mph_rcv(fi, MPH_UBR, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* ignore */
break;
default:
OSMO_ASSERT(0);
}
}
static void pstn_up_le11_local_unblock(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
/* send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE20_OPERATIONAL, 0, 0);
/* send MPH-UBI */
v5x_mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* send MPH-BI */
v5x_mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* ignore */
break;
default:
OSMO_ASSERT(0);
}
}
static void pstn_up_le12_remote_unblock(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE20_OPERATIONAL, 0, 0);
/* send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
/* send MPH-UBI */
v5x_mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
/* send MPH-UBR */
v5x_mph_rcv(fi, MPH_UBR, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* send MPH-BI */
v5x_mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* ignore */
break;
default:
OSMO_ASSERT(0);
}
}
/* LE 2.0 Operational deactivated */
static void pstn_up_le20_operational(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct v5x_user_port *v5up = fi->priv;
switch (event) {
case V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ:
/* Send FE201 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE201_UNBLOCK);
break;
case V5X_CUP_LE_MPH_BI_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* Send FE203 */
v5x_le_ctrl_port_snd(v5up, V5X_CTRL_FE203_BLOCK);
break;
case V5X_CUP_LE_FE202_UNBLOCK:
/* Send MPH-UBI */
v5x_mph_rcv(fi, MPH_UBI, 0);
break;
case V5X_CUP_LE_FE204_BLOCK_CMD:
osmo_fsm_inst_state_chg(fi, V5X_LE_UP_P_S_LE10_NOP_BLOCKED, 0, 0);
/* Send MPH-BI */
v5x_mph_rcv(fi, MPH_BI, 0);
break;
case V5X_CUP_LE_FE205_BLOCK_REQ:
/* Send MPH-BR */
v5x_mph_rcv(fi, MPH_BR, 0);
break;
default:
OSMO_ASSERT(0);
}
}
/* Table 43/G.964 LE (ISDN port) FSM for PSTN user ports */
static const struct osmo_fsm_state v5x_le_ctrl_pstn_port_fsm_states[] = {
[V5X_LE_UP_P_S_LE10_NOP_BLOCKED] = {
.name = "LE1.0_BLOCKED",
.in_event_mask = S(V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ) |
S(V5X_CUP_LE_MPH_BI_BLOCK_CMD) |
S(V5X_CUP_LE_FE202_UNBLOCK) |
S(V5X_CUP_LE_FE204_BLOCK_CMD) |
S(V5X_CUP_LE_FE205_BLOCK_REQ),
.out_state_mask = S(V5X_LE_UP_P_S_LE11_NOP_LOCAL_UNBLOCK) |
S(V5X_LE_UP_P_S_LE12_NOP_REMOTE_UNBLOCK),
.action = pstn_up_le10_blocked,
},
[V5X_LE_UP_P_S_LE11_NOP_LOCAL_UNBLOCK] = {
.name = "LE1.1_LOCAL_UNBLOCK",
.in_event_mask = S(V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ) |
S(V5X_CUP_LE_MPH_BI_BLOCK_CMD) |
S(V5X_CUP_LE_FE202_UNBLOCK) |
S(V5X_CUP_LE_FE204_BLOCK_CMD) |
S(V5X_CUP_LE_FE205_BLOCK_REQ),
.out_state_mask = S(V5X_LE_UP_P_S_LE10_NOP_BLOCKED) |
S(V5X_LE_UP_P_S_LE20_OPERATIONAL),
.action = pstn_up_le11_local_unblock,
},
[V5X_LE_UP_P_S_LE12_NOP_REMOTE_UNBLOCK] = {
.name = "LE1.2_REMOTE_UNBLOCK",
.in_event_mask = S(V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ) |
S(V5X_CUP_LE_MPH_BI_BLOCK_CMD) |
S(V5X_CUP_LE_FE202_UNBLOCK) |
S(V5X_CUP_LE_FE204_BLOCK_CMD) |
S(V5X_CUP_LE_FE205_BLOCK_REQ),
.out_state_mask = S(V5X_LE_UP_P_S_LE20_OPERATIONAL) |
S(V5X_LE_UP_P_S_LE10_NOP_BLOCKED),
.action = pstn_up_le12_remote_unblock,
},
[V5X_LE_UP_P_S_LE20_OPERATIONAL] = {
.name = "LE2.0_OPERATIONAL",
.in_event_mask = S(V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ) |
S(V5X_CUP_LE_MPH_BI_BLOCK_CMD) |
S(V5X_CUP_LE_FE202_UNBLOCK) |
S(V5X_CUP_LE_FE204_BLOCK_CMD) |
S(V5X_CUP_LE_FE205_BLOCK_REQ),
.out_state_mask = S(V5X_LE_UP_P_S_LE10_NOP_BLOCKED),
.action = pstn_up_le20_operational,
},
};
struct osmo_fsm v5x_le_ctrl_pstn_port_fsm = {
.name = "V5X_CTRL_PSTN",
.states = v5x_le_ctrl_pstn_port_fsm_states,
.num_states = ARRAY_SIZE(v5x_le_ctrl_pstn_port_fsm_states),
.allstate_event_mask = 0,
.allstate_action = NULL,
.cleanup = NULL,
.log_subsys = DV5PORT,
.event_names = v5x_le_ctrl_port_fsm_event_names,
};
struct osmo_fsm_inst *v5x_le_port_pstn_create(struct v5x_user_port *v5up, uint16_t nr)
{
struct osmo_fsm_inst *fi;
OSMO_ASSERT(v5up);
fi = osmo_fsm_inst_alloc(&v5x_le_ctrl_pstn_port_fsm, v5up, v5up, LOGL_DEBUG, NULL);
if (!fi)
return NULL;
osmo_fsm_inst_update_id_f(fi, "%d", nr);
return fi;
}
void v5x_le_port_pstn_rcv(struct v5x_user_port *v5up, uint8_t cfe)
/* message from management layer */
void v5x_port_mph_snd(struct v5x_user_port *v5up, enum v5x_mph_prim prim)
{
struct osmo_fsm_inst *fi = v5up->port_fi;
enum v5x_le_ctrl_port_fsm_event event;
switch (cfe) {
case V5X_CTRL_FE201_UNBLOCK: // actually FE202
event = V5X_CUP_LE_FE202_UNBLOCK;
switch (prim) {
case MPH_UBR:
event = V5X_CUP_LE_MPH_UBR_UNBLOCK_REQ;
break;
case V5X_CTRL_FE203_BLOCK: // actually FE204
event = V5X_CUP_LE_FE204_BLOCK_CMD;
case MPH_BI:
event = V5X_CUP_LE_MPH_BI_BLOCK_CMD;
break;
case V5X_CTRL_FE205_BLOCK_REQ:
event = V5X_CUP_LE_FE205_BLOCK_REQ;
case MPH_AR:
event = V5X_CUP_LE_MPH_AR_ACTIVATE_ACCESS_REQ;
break;
case MPH_DR:
event = V5X_CUP_LE_MPH_DR_DEACTIVATE_ACCESS_REQ;
break;
case MPH_DB:
event = V5X_CUP_LE_MPH_DB_BLOCK_DCHAN_REQ;
break;
case MPH_DU:
event = V5X_CUP_LE_MPH_DU_BLOCK_DCHAN_REQ;
break;
default:
LOGP(DV5PORT, LOGL_NOTICE, "Received cfe %d not valid at this protocol\n", cfe);
LOGP(DV5PORT, LOGL_NOTICE, "Got invalid prim %d at this protocol\n", prim);
return;
}
/* send event to FSM */
osmo_fsm_inst_dispatch(fi, event, NULL);
}
void v5x_le_port_init(void)
{
int rc;
rc = osmo_fsm_register(&v5x_le_ctrl_isdn_port_fsm);
OSMO_ASSERT(!rc);
rc = osmo_fsm_register(&v5x_le_ctrl_pstn_port_fsm);
OSMO_ASSERT(!rc);
LOGP(DV5PORT, LOGL_NOTICE, "Using V5x port control protocol\n");
}

View File

@ -1,9 +1,18 @@
void v5x_mph_snd(struct v5x_user_port *v5up, enum v5x_mph_prim prim);
void v5x_port_mph_snd(struct v5x_user_port *v5up, enum v5x_mph_prim prim);
struct osmo_fsm_inst *v5x_le_port_isdn_create(struct v5x_user_port *v5up, uint16_t nr);
void v5x_le_port_isdn_rcv(struct v5x_user_port *v5up, uint8_t cfe, uint8_t perf_grading);
struct osmo_fsm_inst *v5x_le_port_pstn_create(struct v5x_user_port *v5up, uint16_t nr);
void v5x_le_port_pstn_rcv(struct v5x_user_port *v5up, uint8_t cfe);
bool v5x_le_port_isdn_is_operational(struct osmo_fsm_inst *fi);
void v5x_le_port_isdn_block(struct osmo_fsm_inst *fi);
void v5x_le_port_isdn_unblock(struct osmo_fsm_inst *fi);
bool v5x_le_port_pstn_is_operational(struct osmo_fsm_inst *fi);
void v5x_le_port_pstn_block(struct osmo_fsm_inst *fi);
void v5x_le_port_pstn_unblock(struct osmo_fsm_inst *fi);
const char *v5x_le_port_isdn_state_name(struct osmo_fsm_inst *fi);
const char *v5x_le_port_pstn_state_name(struct osmo_fsm_inst *fi);
void v5x_le_port_isdn_fe_rcv(struct v5x_user_port *v5up, uint8_t cfe, uint8_t perf_grading);
void v5x_le_port_pstn_fe_rcv(struct v5x_user_port *v5up, uint8_t cfe);
void v5x_le_port_init(void);