This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
laforge gerrit-no-reply at lists.osmocom.orglaforge has submitted this change. ( https://gerrit.osmocom.org/c/libosmocore/+/22282 ) Change subject: ns2: delay NS_AFF_CAUSE_RECOVERY until NS-VC for data + sig are unblocked ...................................................................... ns2: delay NS_AFF_CAUSE_RECOVERY until NS-VC for data + sig are unblocked Right now we end up in situations where only a NS-VC for data (BVCI != 0) becomes unblocked, but the BSSGP and/or user application code is notified that the NSE has recovered. In the case of osmo-gbproxy, this will trigger a BVC-RESET on the BVCI=0, but that obviously only works if the sig_weight > 0... Closes: OS#4956 Change-Id: I933ee3969c052394d61ec6cf8c7c21d17957d9ab --- M src/gb/gprs_ns2.c M src/gb/gprs_ns2_internal.h 2 files changed, 17 insertions(+), 16 deletions(-) Approvals: daniel: Looks good to me, but someone else must approve lynxis lazus: Looks good to me, approved Jenkins Builder: Verified diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c index 7c517aa..dc8ad8e 100644 --- a/src/gb/gprs_ns2.c +++ b/src/gb/gprs_ns2.c @@ -1121,13 +1121,18 @@ void ns2_nse_data_sum(struct gprs_ns2_nse *nse) { struct gprs_ns2_vc *nsvc; + nse->nsvc_count = 0; + nse->sum_data_weight = 0; + nse->sum_sig_weight = 0; llist_for_each_entry(nsvc, &nse->nsvc, list) { if (!gprs_ns2_vc_is_unblocked(nsvc)) continue; nse->nsvc_count++; + nse->sum_data_weight += nsvc->data_weight; + nse->sum_sig_weight += nsvc->sig_weight; } } @@ -1137,35 +1142,25 @@ void ns2_nse_notify_unblocked(struct gprs_ns2_vc *nsvc, bool unblocked) { struct gprs_ns2_nse *nse = nsvc->nse; - struct gprs_ns2_vc *tmp; ns2_nse_data_sum(nse); if (unblocked == nse->alive) return; - if (unblocked) { - /* this is the first unblocked NSVC on an unavailable NSE */ + /* wait until both data_weight and sig_weight are != 0 before declaring NSE as alive */ + if (unblocked && nse->sum_data_weight && nse->sum_sig_weight) { nse->alive = true; ns2_prim_status_ind(nse, NULL, 0, NS_AFF_CAUSE_RECOVERY); nse->first = false; return; } - /* check if there are any remaining alive vcs */ - llist_for_each_entry(tmp, &nse->nsvc, list) { - if (tmp == nsvc) - continue; - - if (gprs_ns2_vc_is_unblocked(tmp)) { - /* there is at least one remaining alive NSVC */ - return; - } + if (nse->alive && (nse->sum_data_weight == 0 || nse->sum_sig_weight == 0)) { + /* nse became unavailable */ + nse->alive = false; + ns2_prim_status_ind(nse, NULL, 0, NS_AFF_CAUSE_FAILURE); } - - /* nse became unavailable */ - nse->alive = false; - ns2_prim_status_ind(nse, NULL, 0, NS_AFF_CAUSE_FAILURE); } /*! Create a new GPRS NS instance diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h index 5dbc349..5404ed3 100644 --- a/src/gb/gprs_ns2_internal.h +++ b/src/gb/gprs_ns2_internal.h @@ -136,6 +136,12 @@ enum gprs_ns2_dialect dialect; struct osmo_fsm_inst *bss_sns_fi; + + /*! sum of all the data weight of _active_ NS-VCs */ + uint32_t sum_data_weight; + + /*! sum of all the signalling weight of _active_ NS-VCs */ + uint32_t sum_sig_weight; }; /*! Structure representing a single NS-VC */ -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/22282 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I933ee3969c052394d61ec6cf8c7c21d17957d9ab Gerrit-Change-Number: 22282 Gerrit-PatchSet: 3 Gerrit-Owner: laforge <laforge at osmocom.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: daniel <dwillmann at sysmocom.de> Gerrit-Reviewer: laforge <laforge at osmocom.org> Gerrit-Reviewer: lynxis lazus <lynxis at fe80.eu> Gerrit-MessageType: merged -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210118/eb795ec6/attachment.htm>