mgw_fsm: refactor helper function handle_rab_release()

the function handle_rab_release() is difficult to read and it is not
immediately clear what happens and why. Lets split this up and add some
comments to improve this.

Related: OS#5916
Change-Id: I3595502b98ea5febbde7f2fab3999e2533766b48
This commit is contained in:
Philipp Maier 2023-03-20 15:47:28 +01:00
parent 065a719294
commit c6cef24546
1 changed files with 33 additions and 19 deletions

View File

@ -633,30 +633,42 @@ static struct osmo_fsm mgw_fsm = {
}; };
/* The MSC may ask to release a specific RAB within a RAB-AssignmentRequest */ /* The MSC may ask to release a specific RAB within a RAB-AssignmentRequest */
static int handle_rab_release(struct hnbgw_context_map *map, struct msgb *ranap_msg, ranap_message *message) static int release_mgw_fsm(struct hnbgw_context_map *map, struct msgb *ranap_msg)
{ {
bool rab_release_req;
struct osmo_fsm_inst *fi = map->mgw_fi; struct osmo_fsm_inst *fi = map->mgw_fi;
struct mgw_fsm_priv *mgw_fsm_priv = fi->priv;
int rc; int rc;
/* Check if the RAB that is handled by this FSM is addressed by the release request */
rab_release_req = ranap_rab_ass_req_ies_check_release(&message->msg.raB_AssignmentRequestIEs,
mgw_fsm_priv->rab_id);
if (!rab_release_req)
return -EINVAL;
LOGPFSML(map->mgw_fi, LOGL_NOTICE, "MSC asked to release RAB-ID %u\n", mgw_fsm_priv->rab_id);
/* Forward the unmodifed RAB-AssignmentRequest to HNB, so that the HNB is informed about the RAB release as /* Forward the unmodifed RAB-AssignmentRequest to HNB, so that the HNB is informed about the RAB release as
* well */ * well */
LOGPFSML(fi, LOGL_DEBUG, "forwarding unmodified RAB-AssignmentRequest to HNB\n"); LOGPFSML(fi, LOGL_DEBUG, "forwarding unmodified RAB-AssignmentRequest to HNB\n");
rc = map_rua_dispatch(map, MAP_RUA_EV_TX_DIRECT_TRANSFER, ranap_msg); rc = map_rua_dispatch(map, MAP_RUA_EV_TX_DIRECT_TRANSFER, ranap_msg);
if (rc < 0) {
LOGPFSML(fi, LOGL_DEBUG, "cannot forward RAB-AssignmentRequest to HNB\n");
return -EINVAL;
}
/* Release the FSM normally */ /* Release the FSM normally */
osmo_fsm_inst_state_chg(fi, MGW_ST_RELEASE, 0, 0); osmo_fsm_inst_state_chg(fi, MGW_ST_RELEASE, 0, 0);
return 0;
}
return rc; /* Check if the message contains a RAB-ReleaseItem that matches the RAB-ID that is managed by the given context map */
static bool is_our_rab_release(struct hnbgw_context_map *map, ranap_message *message)
{
bool rab_release_req;
struct osmo_fsm_inst *fi = map->mgw_fi;
struct mgw_fsm_priv *mgw_fsm_priv = fi->priv;
/* Check if the RAB that is handled by this FSM is addressed by the release request */
rab_release_req = ranap_rab_ass_req_ies_check_release(&message->msg.raB_AssignmentRequestIEs,
mgw_fsm_priv->rab_id);
if (!rab_release_req) {
LOGPFSML(map->mgw_fi, LOGL_ERROR, "RAB-AssignmentRequest does not contain any RAB-RelaseItem with RAB-ID %u\n", mgw_fsm_priv->rab_id);
return false;
}
LOGPFSML(map->mgw_fi, LOGL_NOTICE, "MSC asked to release RAB-ID %u\n", mgw_fsm_priv->rab_id);
return true;
} }
/*! Allocate MGW FSM and handle RANAP RAB AssignmentRequest. /*! Allocate MGW FSM and handle RANAP RAB AssignmentRequest.
@ -671,7 +683,6 @@ int handle_rab_ass_req(struct hnbgw_context_map *map, struct msgb *ranap_msg, ra
static bool initialized = false; static bool initialized = false;
struct mgw_fsm_priv *mgw_fsm_priv; struct mgw_fsm_priv *mgw_fsm_priv;
char fsm_name[255]; char fsm_name[255];
int rc;
/* Initialize FSM if not done yet */ /* Initialize FSM if not done yet */
if (!initialized) { if (!initialized) {
@ -683,13 +694,16 @@ int handle_rab_ass_req(struct hnbgw_context_map *map, struct msgb *ranap_msg, ra
* it may also be that the MSC decides to release the RAB with a dedicated RAB-AssignmentRequest that contains * it may also be that the MSC decides to release the RAB with a dedicated RAB-AssignmentRequest that contains
* a ReleaseList. In this case an FSM will already be present. */ * a ReleaseList. In this case an FSM will already be present. */
if (map->mgw_fi) { if (map->mgw_fi) {
/* A RAB Release might be in progress, handle it */ /* Check if the RAB-AssignmentRequest contains a RAB-ReleaseItem that matches the RAB-ID we are
rc = handle_rab_release(map, ranap_msg, message); * managing in this HNBGW context map. */
if (rc >= 0) if (is_our_rab_release(map, message))
return rc; return release_mgw_fsm(map, ranap_msg);
LOGPFSML(map->mgw_fi, LOGL_ERROR, /* The RAB-ReleaseItem in the incoming message should match the RAB ID we are managing. A mismatch may
"mgw_fsm_alloc_and_handle_rab_ass_req() unable to handle RAB-AssignmentRequest!\n"); * mean that there is an inconsistency between the HNBGW and the MSC state and the MGW FSM on the HNBGW
* side may serve an abandonned connection, which we will now close. However we must also assume that
* the incoming message may still contain a RAB-Assignment for a new RTP stream, so we still must
* continue with the message evaluation. */
osmo_fsm_inst_state_chg(map->mgw_fi, MGW_ST_FAILURE, 0, 0); osmo_fsm_inst_state_chg(map->mgw_fi, MGW_ST_FAILURE, 0, 0);
OSMO_ASSERT(map->mgw_fi == NULL); OSMO_ASSERT(map->mgw_fi == NULL);
} }