diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2023-05-04 17:46:48 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2023-07-21 13:33:39 +0200 |
commit | 55860eed89d6abaf783cc0a16514e2b13b702339 (patch) | |
tree | 71fb5c5c0784fd63e5cf94f37dee1a92a6272be7 | |
parent | a0230990df7c5841433bddb329a1301f58db8a35 (diff) |
ASCI: Forward lchan activation states to VGCS FSM
Change-Id: I757b562e02480c1a68446d91217910069f17d060
Related: OS#4852
-rw-r--r-- | src/osmo-bsc/lchan_fsm.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c index 12d980aa6..70fb81161 100644 --- a/src/osmo-bsc/lchan_fsm.c +++ b/src/osmo-bsc/lchan_fsm.c @@ -43,6 +43,7 @@ #include <osmocom/bsc/bts.h> #include <osmocom/bsc/bsc_stats.h> #include <osmocom/bsc/lchan.h> +#include <osmocom/bsc/vgcs_fsm.h> static struct osmo_fsm lchan_fsm; @@ -191,6 +192,23 @@ static void _lchan_on_activation_failure(struct gsm_lchan *lchan, enum lchan_act _osmo_fsm_inst_dispatch(for_conn->ho.fi, HO_EV_LCHAN_ERROR, lchan, file, line); break; + case ACTIVATE_FOR_VGCS_CHANNEL: + LOG_LCHAN(lchan, LOGL_NOTICE, "Signalling VGCS Assignment FSM of error (%s)\n", + lchan->last_error ? : "unknown error"); + if (!for_conn) { + LOG_LCHAN(lchan, LOGL_ERROR, + "lchan activation for VGCS Assignment failed, but activation request has no conn\n"); + break; + } + if (!for_conn->vgcs_chan.fi) { + LOG_LCHAN(lchan, LOGL_ERROR, + "lchan activation for VGCS Assignment failed, but conn has no ongoing" + " assignment procedure\n"); + break; + } + _osmo_fsm_inst_dispatch(for_conn->vgcs_chan.fi, VGCS_EV_LCHAN_ERROR, lchan, file, line); + break; + case ACTIVATE_FOR_VTY: LOG_LCHAN(lchan, LOGL_ERROR, "VTY user invoked lchan activation failed (%s)\n", lchan->last_error ? : "unknown error"); @@ -278,6 +296,22 @@ static void lchan_on_fully_established(struct gsm_lchan *lchan) * we will try to roll back a modified RTP connection. */ break; + case ACTIVATE_FOR_VGCS_CHANNEL: + if (!lchan->conn) { + LOG_LCHAN(lchan, LOGL_ERROR, + "lchan activation for VGCS assignment succeeded, but lchan has no conn\n"); + lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL); + break; + } + if (!lchan->conn->vgcs_chan.fi) { + LOG_LCHAN(lchan, LOGL_ERROR, + "lchan Activation for VGCS assignment requested, but conn has no VGCS resource FSM.\n"); + lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL); + break; + } + osmo_fsm_inst_dispatch(lchan->conn->vgcs_chan.fi, VGCS_EV_LCHAN_ACTIVE, lchan); + break; + case ACTIVATE_FOR_MODE_MODIFY_RTP: lchan_on_mode_modify_success(lchan); break; @@ -412,6 +446,28 @@ void lchan_activate(struct gsm_lchan *lchan, struct lchan_activate_info *info) } break; + case ACTIVATE_FOR_VGCS_CHANNEL: + if (!info->for_conn + || !info->for_conn->fi) { + LOG_LCHAN(lchan, LOGL_ERROR, "Activation requested, but no conn\n"); + goto abort; + } + if (!info->for_conn->vgcs_chan.fi) { + LOG_LCHAN(lchan, LOGL_ERROR, + "Activation for VGCS assignment requested, but conn has no VGCS resource FSM.\n"); + goto abort; + } + if (info->for_conn->vgcs_chan.new_lchan != lchan) { + LOG_LCHAN(lchan, LOGL_ERROR, + "Activation for VGCS assignment requested, but conn's VGCS assignment state does" + " not reflect this lchan to be activated (instead: %s)\n", + info->for_conn->vgcs_chan.new_lchan ? + gsm_lchan_name(info->for_conn->vgcs_chan.new_lchan) + : "NULL"); + goto abort; + } + break; + default: break; } @@ -856,6 +912,7 @@ static void lchan_fsm_wait_activ_ack_onenter(struct osmo_fsm_inst *fi, uint32_t ho_ref = lchan->conn->ho.ho_ref; break; case ACTIVATE_FOR_ASSIGNMENT: + case ACTIVATE_FOR_VGCS_CHANNEL: default: act_type = RSL_ACT_INTRA_NORM_ASS; break; |