pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-hnbgw/+/40275?usp=email )
Change subject: WIP: Support PS RAB ASS REQ (REL) ......................................................................
WIP: Support PS RAB ASS REQ (REL)
Change-Id: Iea7f2cea4aa1fbab12cb8bf0275cd43d9e0713c2 --- M src/osmo-hnbgw/ps_rab_ass_fsm.c 1 file changed, 48 insertions(+), 16 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-hnbgw refs/changes/75/40275/1
diff --git a/src/osmo-hnbgw/ps_rab_ass_fsm.c b/src/osmo-hnbgw/ps_rab_ass_fsm.c index 68bf58a..fc3b605 100644 --- a/src/osmo-hnbgw/ps_rab_ass_fsm.c +++ b/src/osmo-hnbgw/ps_rab_ass_fsm.c @@ -220,6 +220,7 @@ RANAP_RAB_AssignmentRequestIEs_t *ies = &message->msg.raB_AssignmentRequestIEs; int i; struct ps_rab_ass *rab_ass; + int rc;
rab_ass = ps_rab_ass_alloc(map); talloc_steal(rab_ass, message); @@ -231,26 +232,57 @@ goto no_rab; }
- /* Make sure we indeed deal with a setup-or-modify list */ - if (!(ies->presenceMask & RAB_ASSIGNMENTREQUESTIES_RANAP_RAB_SETUPORMODIFYLIST_PRESENT)) { - LOG_MAP(map, DLPFCP, LOGL_ERROR, "RANAP PS RAB AssignmentRequest lacks setup-or-modify list\n"); - goto no_rab; + /* setup-or-modify list */ + if (ies->presenceMask & RAB_ASSIGNMENTREQUESTIES_RANAP_RAB_SETUPORMODIFYLIST_PRESENT) { + /* Multiple RABs may be set up, assemble in list map->ps_rab_list. */ + for (i = 0; i < ies->raB_SetupOrModifyList.list.count; i++) { + RANAP_ProtocolIE_ContainerPair_t *protocol_ie_container_pair; + RANAP_ProtocolIE_FieldPair_t *protocol_ie_field_pair; + + protocol_ie_container_pair = ies->raB_SetupOrModifyList.list.array[i]; + protocol_ie_field_pair = protocol_ie_container_pair->list.array[0]; + if (!protocol_ie_field_pair) + goto no_rab; + if (protocol_ie_field_pair->id != RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyItem) + goto no_rab; + + if (ps_rab_setup_core_remote(rab_ass, protocol_ie_field_pair)) + goto no_rab; + } }
- /* Multiple RABs may be set up, assemble in list map->ps_rab_list. */ - for (i = 0; i < ies->raB_SetupOrModifyList.list.count; i++) { - RANAP_ProtocolIE_ContainerPair_t *protocol_ie_container_pair; - RANAP_ProtocolIE_FieldPair_t *protocol_ie_field_pair; + /* release list */ + if (ies->presenceMask & RAB_ASSIGNMENTREQUESTIES_RANAP_RAB_RELEASELIST_PRESENT) { + /* Multiple RABs may be set up, assemble in list map->ps_rab_list. */ + for (i = 0; i < ies->raB_ReleaseList.raB_ReleaseList_ies.list.count; i++) { + RANAP_IE_t *release_list_ie; + RANAP_RAB_ReleaseItemIEs_t *items_ies = NULL; + RANAP_RAB_ReleaseItem_t *rab_release_item; + uint8_t rab_id_decoded; + struct ps_rab *rab;
- protocol_ie_container_pair = ies->raB_SetupOrModifyList.list.array[i]; - protocol_ie_field_pair = protocol_ie_container_pair->list.array[0]; - if (!protocol_ie_field_pair) - goto no_rab; - if (protocol_ie_field_pair->id != RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyItem) - goto no_rab; + release_list_ie = ies->raB_ReleaseList.raB_ReleaseList_ies.list.array[i]; + if (!release_list_ie) + goto no_rab; + if (release_list_ie->id != RANAP_ProtocolIE_ID_id_RAB_ReleaseItem) + goto no_rab;
- if (ps_rab_setup_core_remote(rab_ass, protocol_ie_field_pair)) - goto no_rab; + rc = ranap_decode_rab_releaseitemies_fromlist(items_ies, &release_list_ie->value); + if (rc < 0) + return -EINVAL; + + rab_release_item = &items_ies->raB_ReleaseItem; + /* The RAB-ID is defined as a bitstring with a size of 8 (1 byte), + * See also RANAP-IEs.asn, RAB-ID ::= BIT STRING (SIZE (8)) */ + rab_id_decoded = rab_release_item->rAB_ID.buf[0]; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RANAP_RAB_ReleaseItem, items_ies); + + rab = ps_rab_get(map, rab_id_decoded); + if (rab) + ps_rab_release(rab); + else + LOG_MAP(map, DLPFCP, LOGL_NOTICE, "Rx RAB ASS REQ (REL) for unknwon rab_id %u\n", rab_id_decoded); + } }
/* Got all RABs' state and their Core side GTP info in map->ps_rab_list. For each, a ps_rab_fsm has been started and