Projects
osmocom:master
osmo-hnbgw
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 144
View file
commit_225a215b09bba8daf67c85fe875fc85e3043323d.txt
Deleted
View file
commit_6679c49133c25a4fc9c788bc7cd9b2d653bc3502.txt
Added
View file
osmo-hnbgw_1.7.0.46.225a.dsc -> osmo-hnbgw_1.7.0.54.6679.dsc
Changed
@@ -2,7 +2,7 @@ Source: osmo-hnbgw Binary: osmo-hnbgw, osmo-hnbgw-dbg, osmo-hnbgw-doc Architecture: any all -Version: 1.7.0.46.225a +Version: 1.7.0.54.6679 Maintainer: Osmocom team <openbsc@lists.osmocom.org> Homepage: https://projects.osmocom.org/projects/osmo-hnbgw Standards-Version: 3.9.8 @@ -14,8 +14,8 @@ osmo-hnbgw-dbg deb debug extra arch=any osmo-hnbgw-doc deb doc optional arch=all Checksums-Sha1: - 45904cc5e7a286c4cd274a9e87d1f635299b54cf 124740 osmo-hnbgw_1.7.0.46.225a.tar.xz + dbabf2a78a527c306fd878eaf87ef4b7f8ba2f48 125456 osmo-hnbgw_1.7.0.54.6679.tar.xz Checksums-Sha256: - 9fe714ca64dea79479719737852f613ae03d41e49247c8b21e978b50c56634f8 124740 osmo-hnbgw_1.7.0.46.225a.tar.xz + 295a0fc7b6c98bd17ddda520dd143a78c905a53d47a3808c8582649eb53880a1 125456 osmo-hnbgw_1.7.0.54.6679.tar.xz Files: - caf3992c9fe06602ce9b78092e1b213f 124740 osmo-hnbgw_1.7.0.46.225a.tar.xz + 47186aa6a3f49f1e804b76c3301f1115 125456 osmo-hnbgw_1.7.0.54.6679.tar.xz
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/.tarball-version -> osmo-hnbgw_1.7.0.54.6679.tar.xz/.tarball-version
Changed
@@ -1 +1 @@ -1.7.0.46-225a +1.7.0.54-6679
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/debian/changelog -> osmo-hnbgw_1.7.0.54.6679.tar.xz/debian/changelog
Changed
@@ -1,8 +1,8 @@ -osmo-hnbgw (1.7.0.46.225a) unstable; urgency=medium +osmo-hnbgw (1.7.0.54.6679) unstable; urgency=medium * Automatically generated changelog entry for building the Osmocom master feed - -- Osmocom OBS scripts <info@osmocom.org> Mon, 12 May 2025 11:45:19 +0000 + -- Osmocom OBS scripts <info@osmocom.org> Mon, 12 May 2025 15:10:40 +0000 osmo-hnbgw (1.7.0) unstable; urgency=medium
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/include/osmocom/hnbgw/cnlink.h -> osmo-hnbgw_1.7.0.54.6679.tar.xz/include/osmocom/hnbgw/cnlink.h
Changed
@@ -104,6 +104,7 @@ struct hnbgw_cnlink *hnbgw_cnlink_alloc(struct hnbgw_cnpool *cnpool, int nr); void hnbgw_cnlink_term_and_free(struct hnbgw_cnlink *cnlink); void hnbgw_cnlink_drop_sccp(struct hnbgw_cnlink *cnlink); +int hnbgw_cnlink_set_name(struct hnbgw_cnlink *cnlink, const char *name); int hnbgw_cnlink_tx_ranap_reset(struct hnbgw_cnlink *cnlink); int hnbgw_cnlink_tx_ranap_reset_ack(struct hnbgw_cnlink *cnlink);
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/include/osmocom/hnbgw/context_map.h -> osmo-hnbgw_1.7.0.54.6679.tar.xz/include/osmocom/hnbgw/context_map.h
Changed
@@ -200,15 +200,15 @@ * and Request and Response don't necessarily match the RAB IDs contained. In practice I only ever see a single * RAB matching in Request and Response, but we cannot rely on that to always be true. * - * The state of each RAB's PFCP negotiation is kept separately in the list ps_rabs, and as soon as all RABs + * The state of each RAB's PFCP negotiation is kept separately in the field ps_rab_list, and as soon as all RABs * appearing in a PS RAB Assignment message have completed their PFCP setup, we can replace the GTP info for the * RAB IDs and forward the RAB Assignment Request to HNB / the RAB Assignment Response to CN. */ - struct llist_head ps_rab_ass; + struct llist_head ps_rab_ass_list; /* All PS RABs and their GTP tunnel mappings. list of struct ps_rab. Each ps_rab FSM handles the PFCP * communication for one particular RAB ID. */ - struct llist_head ps_rabs; + struct llist_head ps_rab_list; /* RAB state tracking. As RAB-ID is an 8-bit integer, we need 256 elements in the array */ uint8_t rab_state256;
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/include/osmocom/hnbgw/hnb_persistent.h -> osmo-hnbgw_1.7.0.54.6679.tar.xz/include/osmocom/hnbgw/hnb_persistent.h
Changed
@@ -39,12 +39,18 @@ HNB_CTR_RANAP_PS_RAB_ACT_REQ, HNB_CTR_RANAP_CS_RAB_ACT_REQ, + HNB_CTR_RANAP_PS_RAB_ACT_REQ_UNEXP, + HNB_CTR_RANAP_CS_RAB_ACT_REQ_UNEXP, HNB_CTR_RANAP_PS_RAB_ACT_CNF, HNB_CTR_RANAP_CS_RAB_ACT_CNF, + HNB_CTR_RANAP_PS_RAB_ACT_CNF_UNEXP, + HNB_CTR_RANAP_CS_RAB_ACT_CNF_UNEXP, HNB_CTR_RANAP_PS_RAB_ACT_FAIL, HNB_CTR_RANAP_CS_RAB_ACT_FAIL, + HNB_CTR_RANAP_PS_RAB_ACT_FAIL_UNEXP, + HNB_CTR_RANAP_CS_RAB_ACT_FAIL_UNEXP, HNB_CTR_RANAP_PS_RAB_MOD_REQ, HNB_CTR_RANAP_CS_RAB_MOD_REQ, @@ -59,12 +65,18 @@ HNB_CTR_RANAP_CS_RAB_REL_REQ, HNB_CTR_RANAP_PS_RAB_REL_REQ_ABNORMAL, HNB_CTR_RANAP_CS_RAB_REL_REQ_ABNORMAL, + HNB_CTR_RANAP_PS_RAB_REL_REQ_UNEXP, + HNB_CTR_RANAP_CS_RAB_REL_REQ_UNEXP, HNB_CTR_RANAP_PS_RAB_REL_CNF, HNB_CTR_RANAP_CS_RAB_REL_CNF, + HNB_CTR_RANAP_PS_RAB_REL_CNF_UNEXP, + HNB_CTR_RANAP_CS_RAB_REL_CNF_UNEXP, HNB_CTR_RANAP_PS_RAB_REL_FAIL, HNB_CTR_RANAP_CS_RAB_REL_FAIL, + HNB_CTR_RANAP_PS_RAB_REL_FAIL_UNEXP, + HNB_CTR_RANAP_CS_RAB_REL_FAIL_UNEXP, HNB_CTR_RANAP_PS_RAB_REL_IMPLICIT, HNB_CTR_RANAP_CS_RAB_REL_IMPLICIT,
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/include/osmocom/hnbgw/ps_rab_ass_fsm.h -> osmo-hnbgw_1.7.0.54.6679.tar.xz/include/osmocom/hnbgw/ps_rab_ass_fsm.h
Changed
@@ -6,6 +6,7 @@ PS_RAB_ASS_EV_LOCAL_F_TEIDS_RX, PS_RAB_ASS_EV_RAB_ASS_RESP, PS_RAB_ASS_EV_RAB_ESTABLISHED, + PS_RAB_ASS_EV_RAB_RELEASED, PS_RAB_ASS_EV_RAB_FAIL, };
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/include/osmocom/hnbgw/ps_rab_fsm.h -> osmo-hnbgw_1.7.0.54.6679.tar.xz/include/osmocom/hnbgw/ps_rab_fsm.h
Changed
@@ -85,7 +85,7 @@ struct ps_rab *ps_rab_get(struct hnbgw_context_map *map, uint8_t rab_id); bool ps_rab_is_established(const struct ps_rab *rab); -void ps_rab_release(struct ps_rab *rab); +void ps_rab_release(struct ps_rab *rab, struct osmo_fsm_inst *notify_fi); struct ps_rab_rx_args { struct addr_teid f_teid;
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/src/osmo-hnbgw/cnlink.c -> osmo-hnbgw_1.7.0.54.6679.tar.xz/src/osmo-hnbgw/cnlink.c
Changed
@@ -230,6 +230,17 @@ return cnlink; } +int hnbgw_cnlink_set_name(struct hnbgw_cnlink *cnlink, const char *name) +{ + talloc_free(cnlink->name); + cnlink->name = talloc_strdup(cnlink, name); + osmo_fsm_inst_update_id_f_sanitize(cnlink->fi, '-', cnlink->name); + /* Update rate_ctr/stats to report by name instead of index: */ + rate_ctr_group_set_name(cnlink->ctrs, cnlink->name); + osmo_stat_item_group_set_name(cnlink->statg, cnlink->name); + return 0; +} + void hnbgw_cnlink_drop_sccp(struct hnbgw_cnlink *cnlink) { struct hnbgw_context_map *map, *map2;
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/src/osmo-hnbgw/context_map.c -> osmo-hnbgw_1.7.0.54.6679.tar.xz/src/osmo-hnbgw/context_map.c
Changed
@@ -88,8 +88,8 @@ map->hnb_ctx = hnb; map->rua_ctx_id = rua_ctx_id; map->is_ps = is_ps; - INIT_LLIST_HEAD(&map->ps_rab_ass); - INIT_LLIST_HEAD(&map->ps_rabs); + INIT_LLIST_HEAD(&map->ps_rab_ass_list); + INIT_LLIST_HEAD(&map->ps_rab_list); map_rua_fsm_alloc(map);
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/src/osmo-hnbgw/hnb_persistent.c -> osmo-hnbgw_1.7.0.54.6679.tar.xz/src/osmo-hnbgw/hnb_persistent.c
Changed
@@ -63,16 +63,28 @@ "ranap:ps:rab_act:req", "PS RAB Activations requested" }, HNB_CTR_RANAP_CS_RAB_ACT_REQ = { "ranap:cs:rab_act:req", "CS RAB Activations requested" }, + HNB_CTR_RANAP_PS_RAB_ACT_REQ_UNEXP = { + "ranap:ps:rab_act:req_unexp", "PS RAB Activations requested in unexpected state" }, + HNB_CTR_RANAP_CS_RAB_ACT_REQ_UNEXP = { + "ranap:cs:rab_act:req_unexp", "CS RAB Activations requested in unexpected state" }, HNB_CTR_RANAP_PS_RAB_ACT_CNF = { "ranap:ps:rab_act:cnf", "PS RAB Activations confirmed" }, HNB_CTR_RANAP_CS_RAB_ACT_CNF = { "ranap:cs:rab_act:cnf", "CS RAB Activations confirmed" }, + HNB_CTR_RANAP_PS_RAB_ACT_CNF_UNEXP = { + "ranap:ps:rab_act:cnf_unexp", "PS RAB Activations confirmed in unexpected state" }, + HNB_CTR_RANAP_CS_RAB_ACT_CNF_UNEXP = { + "ranap:cs:rab_act:cnf_unexp", "CS RAB Activations confirmed in unexpected state" }, HNB_CTR_RANAP_PS_RAB_ACT_FAIL = { "ranap:ps:rab_act:fail", "PS RAB Activations failed" }, HNB_CTR_RANAP_CS_RAB_ACT_FAIL = { "ranap:cs:rab_act:fail", "CS RAB Activations failed" }, + HNB_CTR_RANAP_PS_RAB_ACT_FAIL_UNEXP = { + "ranap:ps:rab_act:fail_unexp", "PS RAB Activations failed in unexpected state" }, + HNB_CTR_RANAP_CS_RAB_ACT_FAIL_UNEXP = { + "ranap:cs:rab_act:fail_unexp", "CS RAB Activations failed in unexpected state" }, HNB_CTR_RANAP_PS_RAB_MOD_REQ = { @@ -98,16 +110,28 @@ "ranap:ps:rab_rel:req:abnormal", "PS RAB Release requested (by CN), abnormal" }, HNB_CTR_RANAP_CS_RAB_REL_REQ_ABNORMAL = { "ranap:cs:rab_rel:req:abnormal", "CS RAB Release requested (by CN), abnormal" }, + HNB_CTR_RANAP_PS_RAB_REL_REQ_UNEXP = { + "ranap:ps:rab_rel:req:unexp", "PS RAB Release requested (by CN) in unexpected state" }, + HNB_CTR_RANAP_CS_RAB_REL_REQ_UNEXP = { + "ranap:cs:rab_rel:req:unexp", "CS RAB Release requested (by CN) in unexpected state" }, HNB_CTR_RANAP_PS_RAB_REL_CNF = { "ranap:ps:rab_rel:cnf", "PS RAB Release confirmed" }, HNB_CTR_RANAP_CS_RAB_REL_CNF = { "ranap:cs:rab_rel:cnf", "CS RAB Release confirmed" }, + HNB_CTR_RANAP_PS_RAB_REL_CNF_UNEXP = { + "ranap:ps:rab_rel:cnf_unexp", "PS RAB Release confirmed in unexpected state" }, + HNB_CTR_RANAP_CS_RAB_REL_CNF_UNEXP = { + "ranap:cs:rab_rel:cnf_unexp", "CS RAB Release confirmed in unexpected state" }, HNB_CTR_RANAP_PS_RAB_REL_FAIL = { "ranap:ps:rab_rel:fail", "PS RAB Release failed" }, HNB_CTR_RANAP_CS_RAB_REL_FAIL = { "ranap:cs:rab_rel:fail", "CS RAB Release failed" }, + HNB_CTR_RANAP_PS_RAB_REL_FAIL_UNEXP = { + "ranap:ps:rab_rel:fail_unexp", "PS RAB Release failed in unexpected state" }, + HNB_CTR_RANAP_CS_RAB_REL_FAIL_UNEXP = { + "ranap:cs:rab_rel:fail_unexp", "CS RAB Release failed in unexpected state" }, HNB_CTR_RANAP_PS_RAB_REL_IMPLICIT = { "ranap:ps:rab_rel:implicit:normal", "PS RAB Release implicit (during Iu Release), normal" },
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/src/osmo-hnbgw/hnbgw_vty.c -> osmo-hnbgw_1.7.0.54.6679.tar.xz/src/osmo-hnbgw/hnbgw_vty.c
Changed
@@ -149,7 +149,8 @@ return; } - vty_out(vty, "%s <->", + vty_out(vty, "%s: %s <->", + cnlink->name, osmo_sccp_user_name(cnlink->hnbgw_sccp_user->sccp_user)); vty_out(vty, " %s%s%s%s", cnlink->use.remote_addr_name ? : "", @@ -526,6 +527,18 @@ /* 'msc 0' / 'remote-addr my-msc' and * 'sgsn 0' / 'remote-addr my-sgsn' */ +DEFUN(cfg_cnlink_name, + cfg_cnlink_name_cmd, + "name NAME", + "Set user defined name for this msc/sgsn\n" + "The user defined name to be set for this msc/sgsn\n") +{ + struct hnbgw_cnlink *cnlink = vty->index; + if (hnbgw_cnlink_set_name(cnlink, argv0) < 0) + return CMD_WARNING; + return CMD_SUCCESS; +} + DEFUN(cfg_cnlink_remote_addr, cfg_cnlink_remote_addr_cmd, "remote-addr NAME", @@ -1057,6 +1070,7 @@ llist_for_each_entry(cnlink, &cnpool->cnlinks, entry) { vty_out(vty, "%s %d%s", cnpool->peer_name, cnlink->nr, VTY_NEWLINE); + vty_out(vty, " name %s%s", cnlink->name, VTY_NEWLINE); if (cnlink->vty.remote_addr_name) vty_out(vty, " remote-addr %s%s", cnlink->vty.remote_addr_name, VTY_NEWLINE); cnlink_write_nri(vty, cnlink, false); @@ -1098,6 +1112,7 @@ static void install_cnlink_elements(int node) { + install_element(node, &cfg_cnlink_name_cmd); install_element(node, &cfg_cnlink_remote_addr_cmd); install_element(node, &cfg_cnlink_nri_add_cmd); install_element(node, &cfg_cnlink_nri_del_cmd);
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/src/osmo-hnbgw/kpi_ranap.c -> osmo-hnbgw_1.7.0.54.6679.tar.xz/src/osmo-hnbgw/kpi_ranap.c
Changed
@@ -52,18 +52,16 @@ /* When Iu is released, all RABs are released implicitly */ for (unsigned int i = 0; i < ARRAY_SIZE(map->rab_state); i++) { - unsigned int ctr_num; switch (map->rab_statei) { case RAB_STATE_ACTIVE: if (cause->present == RANAP_Cause_PR_nAS || cause->choice.nAS == RANAP_CauseNAS_normal_release) { - ctr_num = HNB_CTR_RANAP_PS_RAB_REL_IMPLICIT; + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_IMPLICIT : + HNB_CTR_RANAP_CS_RAB_REL_IMPLICIT); } else { - ctr_num = HNB_CTR_RANAP_PS_RAB_REL_IMPLICIT_ABNORMAL; + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_IMPLICIT_ABNORMAL : + HNB_CTR_RANAP_CS_RAB_REL_IMPLICIT_ABNORMAL); } - if (!map->is_ps) - ctr_num++; - HNBP_CTR_INC(hnbp, ctr_num); break; } } @@ -108,13 +106,17 @@ * new, it is a setup */ switch (map->rab_staterab_id) { case RAB_STATE_ACTIVE: - HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_MOD_REQ : HNB_CTR_RANAP_CS_RAB_MOD_REQ); + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_MOD_REQ : + HNB_CTR_RANAP_CS_RAB_MOD_REQ); break; case RAB_STATE_INACTIVE: - HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_REQ : HNB_CTR_RANAP_CS_RAB_ACT_REQ); + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_REQ : + HNB_CTR_RANAP_CS_RAB_ACT_REQ); map->rab_staterab_id = RAB_STATE_ACT_REQ; break; default: + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_REQ_UNEXP : + HNB_CTR_RANAP_CS_RAB_ACT_REQ_UNEXP); LOG_MAP(map, DRANAP, LOGL_NOTICE, "Unexpected RAB Activation/Modification Req for RAB in state %s\n", hnbgw_rab_state_name(map->rab_staterab_id)); @@ -132,7 +134,6 @@ RANAP_RAB_ReleaseItemIEs_t _rab_rel_item_ies = {}; RANAP_RAB_ReleaseItemIEs_t *rab_rel_item_ies = &_rab_rel_item_ies; RANAP_RAB_ReleaseItem_t *rab_rel_item; - unsigned int ctr_num; uint8_t rab_id; if (!release_list_ie) @@ -153,15 +154,16 @@ case RAB_STATE_ACTIVE: if (rab_rel_item->cause.present == RANAP_Cause_PR_nAS && rab_rel_item->cause.choice.nAS == RANAP_CauseNAS_normal_release) { - ctr_num = HNB_CTR_RANAP_PS_RAB_REL_REQ; + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_REQ : + HNB_CTR_RANAP_CS_RAB_REL_REQ); } else { - ctr_num = HNB_CTR_RANAP_PS_RAB_REL_REQ_ABNORMAL; + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_REQ_ABNORMAL : + HNB_CTR_RANAP_CS_RAB_REL_REQ_ABNORMAL); } - if (!map->is_ps) - ctr_num++; - HNBP_CTR_INC(hnbp, ctr_num); break; default: + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_REQ_UNEXP : + HNB_CTR_RANAP_CS_RAB_REL_REQ_UNEXP); LOG_MAP(map, DRANAP, LOGL_NOTICE, "Unexpected RAB Release Req in state %s\n", hnbgw_rab_state_name(map->rab_staterab_id)); @@ -251,13 +253,17 @@ /* differentiate modify / activate */ switch (map->rab_staterab_id) { case RAB_STATE_ACT_REQ: - HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_CNF : HNB_CTR_RANAP_CS_RAB_ACT_CNF); + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_CNF : + HNB_CTR_RANAP_CS_RAB_ACT_CNF); map->rab_staterab_id = RAB_STATE_ACTIVE; break; case RAB_STATE_ACTIVE: - HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_MOD_CNF : HNB_CTR_RANAP_CS_RAB_MOD_CNF); + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_MOD_CNF : + HNB_CTR_RANAP_CS_RAB_MOD_CNF); break; default: + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_CNF_UNEXP : + HNB_CTR_RANAP_CS_RAB_ACT_CNF_UNEXP); LOG_MAP(map, DRANAP, LOGL_NOTICE, "Unexpected RAB Activation/Modification Conf for RAB in state %s\n", hnbgw_rab_state_name(map->rab_staterab_id)); @@ -271,8 +277,6 @@ if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_RELEASEDLIST_PRESENT) { RANAP_RAB_ReleasedList_t *r_list = &ies->raB_ReleasedList; /* increment number of released RABs, we don't need to do that individually during iteration */ - HNBP_CTR_ADD(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_CNF : HNB_CTR_RANAP_CS_RAB_REL_CNF, - r_list->raB_ReleasedList_ies.list.count); for (unsigned int i = 0; i < r_list->raB_ReleasedList_ies.list.count; i++) { RANAP_IE_t *released_list_ie = r_list->raB_ReleasedList_ies.list.arrayi; RANAP_RAB_ReleasedItemIEs_t _rab_rel_item_ies = {}; @@ -296,8 +300,12 @@ switch (map->rab_staterab_id) { case RAB_STATE_REL_REQ: + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_CNF : + HNB_CTR_RANAP_CS_RAB_REL_CNF); break; default: + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_CNF_UNEXP : + HNB_CTR_RANAP_CS_RAB_REL_CNF_UNEXP); LOG_MAP(map, DRANAP, LOGL_NOTICE, "Unexpected RAB Release Conf for RAB in state %s\n", hnbgw_rab_state_name(map->rab_staterab_id)); @@ -339,14 +347,18 @@ /* differentiate modify / activate */ switch (map->rab_staterab_id) { case RAB_STATE_ACT_REQ: - HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_FAIL : HNB_CTR_RANAP_CS_RAB_ACT_FAIL); + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_FAIL : + HNB_CTR_RANAP_CS_RAB_ACT_FAIL); map->rab_staterab_id = RAB_STATE_INACTIVE; break; case RAB_STATE_ACTIVE: - HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_MOD_FAIL : HNB_CTR_RANAP_CS_RAB_MOD_FAIL); + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_MOD_FAIL : + HNB_CTR_RANAP_CS_RAB_MOD_FAIL); // FIXME: does it remain active after modification failure? break; default: + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_FAIL_UNEXP : + HNB_CTR_RANAP_CS_RAB_ACT_FAIL_UNEXP); LOG_MAP(map, DRANAP, LOGL_NOTICE, "Unexpected RAB Activation/Modification Failed for RAB in state %s\n", hnbgw_rab_state_name(map->rab_staterab_id)); @@ -360,8 +372,6 @@ if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_RELEASEFAILEDLIST_PRESENT) { RANAP_RAB_ReleaseFailedList_t *rf_list = &ies->raB_ReleaseFailedList; /* increment number of released RABs, we don't need to do that individually during iteration */ - HNBP_CTR_ADD(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_FAIL : HNB_CTR_RANAP_CS_RAB_REL_FAIL, - rf_list->raB_FailedList_ies.list.count); for (unsigned int i = 0; i < rf_list->raB_FailedList_ies.list.count; i++) { RANAP_IE_t *failed_list_ie = rf_list->raB_FailedList_ies.list.arrayi; RANAP_RAB_FailedItemIEs_t _rab_failed_item_ies = {}; @@ -386,14 +396,18 @@ /* differentiate modify / activate */ switch (map->rab_staterab_id) { case RAB_STATE_ACT_REQ: - HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_ACT_FAIL : HNB_CTR_RANAP_CS_RAB_ACT_FAIL); + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_FAIL : + HNB_CTR_RANAP_CS_RAB_REL_FAIL); map->rab_staterab_id = RAB_STATE_INACTIVE; break; case RAB_STATE_ACTIVE: - HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_MOD_FAIL : HNB_CTR_RANAP_CS_RAB_MOD_FAIL); + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_FAIL : + HNB_CTR_RANAP_CS_RAB_REL_FAIL); // FIXME: does it remain active after modification failure? break; default: + HNBP_CTR_INC(hnbp, map->is_ps ? HNB_CTR_RANAP_PS_RAB_REL_FAIL_UNEXP : + HNB_CTR_RANAP_CS_RAB_REL_FAIL_UNEXP); LOG_MAP(map, DRANAP, LOGL_NOTICE, "Unexpected RAB Release Failed for RAB in state %s\n", hnbgw_rab_state_name(map->rab_staterab_id));
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/src/osmo-hnbgw/ps_rab_ass_fsm.c -> osmo-hnbgw_1.7.0.54.6679.tar.xz/src/osmo-hnbgw/ps_rab_ass_fsm.c
Changed
@@ -61,6 +61,7 @@ OSMO_VALUE_STRING(PS_RAB_ASS_EV_LOCAL_F_TEIDS_RX), OSMO_VALUE_STRING(PS_RAB_ASS_EV_RAB_ASS_RESP), OSMO_VALUE_STRING(PS_RAB_ASS_EV_RAB_ESTABLISHED), + OSMO_VALUE_STRING(PS_RAB_ASS_EV_RAB_RELEASED), OSMO_VALUE_STRING(PS_RAB_ASS_EV_RAB_FAIL), {} }; @@ -81,10 +82,10 @@ * This structure manages the RAB Assignment procedures, and the currently set up RABs: * * - hnbgw_context_map - * - .ps_rab_ass: list of PS RAB Assignment procedures + * - .ps_rab_ass_list: list of PS RAB Assignment procedures * - ps_rab_ass_fsm: one RANAP PS RAB Assignment procedure * - ... - * - .ps_rabs: list of individual PS RABs + * - .ps_rab_list: list of individual PS RABs * - ps_rab_fsm: one GTP mapping with PFCP session to the UPF, for a single RAB * - ... * @@ -111,6 +112,9 @@ * ps_rab_fsms, without iterating the RAB Assignment message every time (minor optimisation). */ int rabs_count; int rabs_done_count; + + unsigned int rabs_rel_count; + unsigned int rabs_rel_done_count; }; struct osmo_tdef_state_timeout ps_rab_ass_fsm_timeouts32 = { @@ -118,7 +122,7 @@ /* PS_RAB_ASS_ST_WAIT_RABS_ESTABLISHED is terminated by PFCP timeouts via ps_rab_fsm */ }; -#define ps_rab_ass_fsm_state_chg(state) \ +#define ps_rab_ass_fsm_state_chg(fi, state) \ osmo_tdef_fsm_inst_state_chg(fi, state, ps_rab_ass_fsm_timeouts, hnbgw_T_defs, -1) static struct osmo_fsm ps_rab_ass_fsm; @@ -140,7 +144,7 @@ }; fi->priv = rab_ass; - llist_add_tail(&rab_ass->entry, &map->ps_rab_ass); + llist_add_tail(&rab_ass->entry, &map->ps_rab_ass_list); return rab_ass; } @@ -219,12 +223,9 @@ { RANAP_RAB_AssignmentRequestIEs_t *ies = &message->msg.raB_AssignmentRequestIEs; int i; - struct ps_rab_ass *rab_ass; - struct osmo_fsm_inst *fi; rab_ass = ps_rab_ass_alloc(map); - talloc_steal(rab_ass, message); rab_ass->ranap_rab_ass_req_message = message; /* Now rab_ass owns message and will clean it up */ @@ -234,33 +235,39 @@ 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.arrayi; + protocol_ie_field_pair = protocol_ie_container_pair->list.array0; + if (!protocol_ie_field_pair) + goto no_rab; + if (protocol_ie_field_pair->id != RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyItem) + goto no_rab; - /* Multiple RABs may be set up, assemble in list rab_ass->ps_rabs. */ - 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; + if (ps_rab_setup_core_remote(rab_ass, protocol_ie_field_pair)) + goto no_rab; + } + } - protocol_ie_container_pair = ies->raB_SetupOrModifyList.list.arrayi; - protocol_ie_field_pair = protocol_ie_container_pair->list.array0; - if (!protocol_ie_field_pair) - goto no_rab; - if (protocol_ie_field_pair->id != RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyItem) - goto no_rab; + /* Note: ReleaseList is handled at RAB Assign Response time. */ - if (ps_rab_setup_core_remote(rab_ass, protocol_ie_field_pair)) - goto no_rab; + if (rab_ass->rabs_count > 0) { + /* 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 each will call back with + * PS_RAB_ASS_EV_LOCAL_F_TEIDS_RX or PS_RAB_ASS_EV_RAB_FAIL. */ + return ps_rab_ass_fsm_state_chg(rab_ass->fi, PS_RAB_ASS_ST_WAIT_LOCAL_F_TEIDS); } - /* Got all RABs' state and their Core side GTP info in map->ps_rabs. For each, a ps_rab_fsm has been started and - * each will call back with PS_RAB_ASS_EV_LOCAL_F_TEIDS_RX or PS_RAB_ASS_EV_RAB_FAIL. */ - fi = rab_ass->fi; - return ps_rab_ass_fsm_state_chg(PS_RAB_ASS_ST_WAIT_LOCAL_F_TEIDS); - + /* No Setup-or-modify, only Release RABs. Forward the message as is, + * RABs will be released at RAB ASS Response time. */ + map_rua_dispatch(map, MAP_RUA_EV_TX_DIRECT_TRANSFER, ranap_msg); + osmo_fsm_inst_term(rab_ass->fi, OSMO_FSM_TERM_REGULAR, NULL); + return 0; no_rab: ps_rab_ass_failure(rab_ass); return -1; @@ -413,70 +420,127 @@ * each other, we are able to handle mismatching RAB IDs in request and response messages. */ + RANAP_RAB_AssignmentResponseIEs_t *ies = &message->msg.raB_AssignmentResponseIEs; int rc; int i; struct ps_rab_ass *rab_ass; - struct osmo_fsm_inst *fi; - RANAP_RAB_AssignmentResponseIEs_t *ies; - - /* Make sure we indeed deal with a setup-or-modify list */ - ies = &message->msg.raB_AssignmentResponseIEs; - if (!(ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_SETUPORMODIFIEDLIST_PRESENT)) { - LOG_MAP(map, DRUA, LOGL_ERROR, "RANAP PS RAB AssignmentResponse lacks setup-or-modify list\n"); - return -1; - } rab_ass = ps_rab_ass_alloc(map); - talloc_steal(rab_ass, message); rab_ass->ranap_rab_ass_resp_message = message; - talloc_steal(rab_ass, ranap_msg); rab_ass->ranap_rab_ass_resp_msgb = ranap_msg; /* Now rab_ass owns message and will clean it up */ if (!osmo_pfcp_cp_peer_is_associated(g_hnbgw->pfcp.cp_peer)) { LOG_PS_RAB_ASS(rab_ass, LOGL_ERROR, "PFCP is not associated, cannot set up GTP mapping\n"); - ps_rab_ass_failure(rab_ass); - return -1; + goto no_rab; } - LOG_PS_RAB_ASS(rab_ass, LOGL_INFO, "PS RAB-AssignmentResponse received, updating RABs\n"); + /* setup-or-modify list */ + if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_SETUPORMODIFIEDLIST_PRESENT) { - /* Multiple RABs may be set up, bump matching FSMs in list rab_ass->ps_rabs. */ - for (i = 0; i < ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.count; i++) { - RANAP_IE_t *list_ie; - RANAP_RAB_SetupOrModifiedItemIEs_t item_ies; + LOG_PS_RAB_ASS(rab_ass, LOGL_INFO, "PS RAB-AssignmentResponse received, updating RABs\n"); - list_ie = ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.arrayi; - if (!list_ie) - continue; + /* Multiple RABs may be set up, bump matching FSMs in list map->ps_rab_list. */ + for (i = 0; i < ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.count; i++) { + RANAP_IE_t *list_ie; + RANAP_RAB_SetupOrModifiedItemIEs_t item_ies; + + list_ie = ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.arrayi; + if (!list_ie) + continue; + + rc = ranap_decode_rab_setupormodifieditemies_fromlist(&item_ies, + &list_ie->value); + if (rc < 0) { + LOG_PS_RAB_ASS(rab_ass, LOGL_ERROR, "Failed to decode PS RAB-AssignmentResponse" + " SetupOrModifiedItemIEs with list index %d\n", i); + goto continue_cleanloop; + } + + if (ps_rab_setup_access_remote(rab_ass, &item_ies.raB_SetupOrModifiedItem)) + LOG_PS_RAB_ASS(rab_ass, LOGL_ERROR, "Failed to apply PS RAB-AssignmentResponse" + " SetupOrModifiedItemIEs with list index %d\n", i); + rab_ass->rabs_count++; - rc = ranap_decode_rab_setupormodifieditemies_fromlist(&item_ies, - &list_ie->value); - if (rc < 0) { - LOG_PS_RAB_ASS(rab_ass, LOGL_ERROR, "Failed to decode PS RAB-AssignmentResponse" - " SetupOrModifiedItemIEs with list index %d\n", i); - goto continue_cleanloop; +continue_cleanloop: + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RANAP_RAB_SetupOrModifiedItem, &item_ies); } + } - if (ps_rab_setup_access_remote(rab_ass, &item_ies.raB_SetupOrModifiedItem)) - LOG_PS_RAB_ASS(rab_ass, LOGL_ERROR, "Failed to apply PS RAB-AssignmentResponse" - " SetupOrModifiedItemIEs with list index %d\n", i); - rab_ass->rabs_count++; + /* release list */ + if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_RELEASEDLIST_PRESENT) { + /* Multiple RABs may be set up, assemble in list map->ps_rab_list. */ + RANAP_RAB_ReleasedList_t *r_list = &ies->raB_ReleasedList; + for (i = 0; i < r_list->raB_ReleasedList_ies.list.count; i++) { + RANAP_IE_t *released_list_ie = r_list->raB_ReleasedList_ies.list.arrayi; + RANAP_RAB_ReleasedItemIEs_t _rab_rel_item_ies = {}; + RANAP_RAB_ReleasedItemIEs_t *rab_rel_item_ies = &_rab_rel_item_ies; + RANAP_RAB_ReleasedItem_t *rab_rel_item; + uint8_t rab_id; + struct ps_rab *rab; + + if (!released_list_ie) + goto no_rab; + if (released_list_ie->id != RANAP_ProtocolIE_ID_id_RAB_ReleasedItem) + goto no_rab; + + rc = ranap_decode_rab_releaseditemies_fromlist(rab_rel_item_ies, &released_list_ie->value); + if (rc < 0) { + LOG_MAP(map, DLPFCP, LOGL_NOTICE, "Rx RAB ASS REQ (REL): Failed decoding ReleaseItem %u\n", i); + goto no_rab; + } + + rab_rel_item = &rab_rel_item_ies->raB_ReleasedItem; + /* 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 = rab_rel_item->rAB_ID.buf0; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RANAP_RAB_ReleasedItem, rab_rel_item_ies); + + rab = ps_rab_get(map, rab_id); + if (rab) { + rab_ass->rabs_rel_count++; + ps_rab_release(rab, rab_ass->fi); + } else { + LOG_MAP(map, DLPFCP, LOGL_NOTICE, "Rx RAB ASS REQ (REL) for unknown rab_id %u\n", rab_id); + } + } + } -continue_cleanloop: - ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RANAP_RAB_SetupOrModifiedItem, &item_ies); + if (rab_ass->rabs_count > 0 || rab_ass->rabs_rel_count > 0) { + /* Got all RABs' state and updated their Access side GTP info in map->ps_rab_list. + * For each RAB ID, the matching ps_rab_fsm has been instructed to tell the UPF about + * the Access Remote GTP F-TEID. Each will call back with PS_RAB_ASS_EV_RAB_ESTABLISHED + * or PS_RAB_ASS_EV_RAB_FAIL. */ + return ps_rab_ass_fsm_state_chg(rab_ass->fi, PS_RAB_ASS_ST_WAIT_RABS_ESTABLISHED); + } + + /* No Setup-or-modify nor Release RABs. Forward the message as is. */ + rc = map_sccp_dispatch(map, MAP_SCCP_EV_TX_DATA_REQUEST, ranap_msg); + if (rc < 0) { + LOG_PS_RAB_ASS(rab_ass, LOGL_ERROR, "Sending RANAP PS RAB-AssignmentResponse failed\n"); + goto no_rab; } + /* The request message has been forwarded. We are done. */ + osmo_fsm_inst_term(rab_ass->fi, OSMO_FSM_TERM_REGULAR, NULL); + return 0; - /* Got all RABs' state and updated their Access side GTP info in map->ps_rabs. For each RAB ID, the matching - * ps_rab_fsm has been instructed to tell the UPF about the Access Remote GTP F-TEID. Each will call back with - * PS_RAB_ASS_EV_RAB_ESTABLISHED or PS_RAB_ASS_EV_RAB_FAIL. */ - fi = rab_ass->fi; - return ps_rab_ass_fsm_state_chg(PS_RAB_ASS_ST_WAIT_RABS_ESTABLISHED); +no_rab: + ps_rab_ass_failure(rab_ass); + return -1; } static void ps_rab_ass_resp_send_if_ready(struct ps_rab_ass *rab_ass); +static void ps_rab_ass_resp_send_if_ready_quick(struct ps_rab_ass *rab_ass) +{ + /* some RABs are still pending, postpone going through the message until all are done. */ + if (rab_ass->rabs_done_count < rab_ass->rabs_count) + return; + if (rab_ass->rabs_rel_done_count < rab_ass->rabs_rel_count) + return; + ps_rab_ass_resp_send_if_ready(rab_ass); +} static void ps_rab_ass_fsm_wait_rabs_established(struct osmo_fsm_inst *fi, uint32_t event, void *data) { @@ -485,12 +549,13 @@ switch (event) { case PS_RAB_ASS_EV_RAB_ESTABLISHED: rab_ass->rabs_done_count++; - if (rab_ass->rabs_done_count < rab_ass->rabs_count) { - /* some RABs are still pending, postpone going through the message until all are done. */ - return; - } /* All RABs have succeeded, ready to forward */ - ps_rab_ass_resp_send_if_ready(rab_ass); + ps_rab_ass_resp_send_if_ready_quick(rab_ass); + return; + + case PS_RAB_ASS_EV_RAB_RELEASED: + rab_ass->rabs_rel_done_count++; + ps_rab_ass_resp_send_if_ready_quick(rab_ass); return; case PS_RAB_ASS_EV_RAB_FAIL: @@ -607,8 +672,8 @@ if (rc < 0) { LOG_PS_RAB_ASS(rab_ass, LOGL_ERROR, "Sending RANAP PS RAB-AssignmentResponse failed\n"); ps_rab_ass_failure(rab_ass); + return; } - /* The request message has been forwarded. We are done. */ osmo_fsm_inst_term(rab_ass->fi, OSMO_FSM_TERM_REGULAR, NULL); } @@ -618,14 +683,14 @@ struct ps_rab_ass *rab_ass = fi->priv; struct ps_rab *rab; - llist_for_each_entry(rab, &rab_ass->map->ps_rabs, entry) { + llist_for_each_entry(rab, &rab_ass->map->ps_rab_list, entry) { if (rab->req_fi == fi) rab->req_fi = NULL; if (rab->resp_fi == fi) rab->resp_fi = NULL; } - /* remove from map->ps_rab_ass */ + /* remove from map->ps_rab_ass_list */ llist_del(&rab_ass->entry); } @@ -633,10 +698,10 @@ { struct ps_rab_ass *rab_ass, *next; struct ps_rab *rab, *next2; - llist_for_each_entry_safe(rab, next2, &map->ps_rabs, entry) { - ps_rab_release(rab); + llist_for_each_entry_safe(rab, next2, &map->ps_rab_list, entry) { + ps_rab_release(rab, NULL); } - llist_for_each_entry_safe(rab_ass, next, &map->ps_rab_ass, entry) { + llist_for_each_entry_safe(rab_ass, next, &map->ps_rab_ass_list, entry) { osmo_fsm_inst_term(rab_ass->fi, OSMO_FSM_TERM_REGULAR, NULL); } } @@ -664,6 +729,7 @@ .action = ps_rab_ass_fsm_wait_rabs_established, .in_event_mask = 0 | S(PS_RAB_ASS_EV_RAB_ESTABLISHED) + | S(PS_RAB_ASS_EV_RAB_RELEASED) | S(PS_RAB_ASS_EV_RAB_FAIL) , },
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/src/osmo-hnbgw/ps_rab_fsm.c -> osmo-hnbgw_1.7.0.54.6679.tar.xz/src/osmo-hnbgw/ps_rab_fsm.c
Changed
@@ -107,7 +107,7 @@ OSMO_ASSERT(osmo_use_count_get_put(&rab->use_count, PS_RAB_USE_ACTIVE, 1) == 0); - llist_add_tail(&rab->entry, &map->ps_rabs); + llist_add_tail(&rab->entry, &map->ps_rab_list); return rab; } @@ -121,7 +121,7 @@ struct hnbgw_context_map *map; llist_for_each_entry(map, &hnb->map_list, hnb_list) { struct ps_rab *rab; - llist_for_each_entry(rab, &map->ps_rabs, entry) { + llist_for_each_entry(rab, &map->ps_rab_list, entry) { uint64_t rab_seid = is_cp_seid ? rab->cp_seid : rab->up_f_seid.seid; if (rab_seid == seid) return rab; @@ -154,7 +154,7 @@ struct ps_rab *ps_rab_get(struct hnbgw_context_map *map, uint8_t rab_id) { struct ps_rab *rab; - llist_for_each_entry(rab, &map->ps_rabs, entry) { + llist_for_each_entry(rab, &map->ps_rab_list, entry) { if (rab->rab_id != rab_id) continue; return rab; @@ -173,7 +173,7 @@ osmo_fsm_inst_dispatch(rab->req_fi, PS_RAB_ASS_EV_RAB_FAIL, rab); if (rab->resp_fi) osmo_fsm_inst_dispatch(rab->resp_fi, PS_RAB_ASS_EV_RAB_FAIL, rab); - ps_rab_release(rab); + ps_rab_release(rab, NULL); } struct ps_rab *ps_rab_start(struct hnbgw_context_map *map, uint8_t rab_id, @@ -672,6 +672,8 @@ static void ps_rab_fsm_wait_use_count_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct ps_rab *rab = fi->priv; + if (rab->resp_fi) + osmo_fsm_inst_dispatch(rab->resp_fi, PS_RAB_ASS_EV_RAB_RELEASED, rab); OSMO_ASSERT(osmo_use_count_get_put(&rab->use_count, PS_RAB_USE_ACTIVE, -1) == 0); } @@ -692,7 +694,7 @@ static void ps_rab_forget_map(struct ps_rab *rab) { - /* remove from map->ps_rabs */ + /* remove from map->ps_rab_list */ if (rab->map) llist_del(&rab->entry); rab->map = NULL; @@ -704,10 +706,12 @@ ps_rab_forget_map(rab); } -void ps_rab_release(struct ps_rab *rab) +/* notify_fi can be NULL, in which case no event PS_RAB_ASS_EV_RAB_RELEASED event will be dispatched */ +void ps_rab_release(struct ps_rab *rab, struct osmo_fsm_inst *notify_fi) { struct osmo_fsm_inst *fi = rab->fi; ps_rab_forget_map(rab); + rab->resp_fi = notify_fi; switch (fi->state) { case PS_RAB_ST_RX_CORE_REMOTE_F_TEID: /* No session requested yet. Nothing to be deleted. */
View file
osmo-hnbgw_1.7.0.46.225a.tar.xz/tests/cnpool.vty -> osmo-hnbgw_1.7.0.54.6679.tar.xz/tests/cnpool.vty
Changed
@@ -135,7 +135,9 @@ OsmoHNBGW(config)# show running-config ... msc 0 + name msc-0 sgsn 0 + name sgsn-0 ... OsmoHNBGW(config)# msc 1 @@ -224,9 +226,13 @@ OsmoHNBGW(config)# show running-config ... msc 0 + name msc-0 msc 1 + name msc-1 sgsn 0 + name sgsn-0 sgsn 1 + name sgsn-1 ... OsmoHNBGW(config)# ### Add {msc,sgsn}x{2,3} @@ -252,18 +258,26 @@ OsmoHNBGW(config)# show running-config ... msc 0 + name msc-0 msc 1 + name msc-1 msc 2 + name msc-2 remote-addr addr-msc2 no allow-attach msc 3 + name msc-3 remote-addr addr-msc3 allow-emergency sgsn 0 + name sgsn-0 sgsn 1 + name sgsn-1 sgsn 2 + name sgsn-2 remote-addr addr-sgsn2 sgsn 3 + name sgsn-3 remote-addr addr-sgsn3 ... @@ -282,16 +296,24 @@ OsmoHNBGW(config)# show running-config ... msc 0 + name msc-0 msc 1 + name msc-1 msc 2 + name msc-2 remote-addr addr-msc2 msc 3 + name msc-3 remote-addr addr-msc4 sgsn 0 + name sgsn-0 sgsn 1 + name sgsn-1 sgsn 2 + name sgsn-2 remote-addr addr-sgsn4 sgsn 3 + name sgsn-3 remote-addr addr-sgsn3 ... @@ -321,18 +343,26 @@ hnbgw ... msc 0 + name msc-0 remote-addr addr-msc0 msc 1 + name msc-1 msc 2 + name msc-2 remote-addr addr-msc2 msc 3 + name msc-3 remote-addr addr-msc4 sgsn 0 + name sgsn-0 remote-addr addr-sgsn0 sgsn 1 + name sgsn-1 sgsn 2 + name sgsn-2 remote-addr addr-sgsn4 sgsn 3 + name sgsn-3 remote-addr addr-sgsn3 ...
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.