<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/23296">View Change</a></p><div style="white-space:pre-wrap">Approvals:
laforge: Looks good to me, approved
osmith: Looks good to me, but someone else must approve
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Handle GPRS_NS2_AFF_CAUSE_FAILURE<br><br>When a complete NSE becomes unavailable gbproxy should notify the other<br>side (bss/sgsn).<br>The current code blocks every PtP-BVC (belonging to that BSS) on all SGSNs if<br>a BSS goes down.<br><br>The BSS-side should not be blocked unless no more SGSN connections are<br>present. We could also remove all BSS nse and wait for those to reconnect.<br>This is not yet implemented.<br><br>Related: OS#4897<br>Change-Id: I6354a190ec1090a35c27671c72dab9126d0ad794<br>---<br>M src/gb_proxy.c<br>1 file changed, 34 insertions(+), 24 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb_proxy.c b/src/gb_proxy.c</span><br><span>index c98dbdd..f448c0b 100644</span><br><span>--- a/src/gb_proxy.c</span><br><span>+++ b/src/gb_proxy.c</span><br><span>@@ -1523,7 +1523,7 @@</span><br><span> */</span><br><span> </span><br><span> struct gbproxy_bvc *bvc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gbproxy_nse *sgsn_nse;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gbproxy_nse *nse;</span><br><span> </span><br><span> switch (nsp->u.status.cause) {</span><br><span> case GPRS_NS2_AFF_CAUSE_SNS_FAILURE:</span><br><span>@@ -1532,44 +1532,54 @@</span><br><span> </span><br><span> case GPRS_NS2_AFF_CAUSE_RECOVERY:</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "NS-NSE %d became available\n", nsp->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">- sgsn_nse = gbproxy_nse_by_nsei(cfg, nsp->nsei, NSE_F_SGSN);</span><br><span style="color: hsl(0, 100%, 40%);">- if (sgsn_nse) {</span><br><span style="color: hsl(120, 100%, 40%);">+ nse = gbproxy_nse_by_nsei(cfg, nsp->nsei, NSE_F_SGSN);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (nse) {</span><br><span> // Update the NSE max SDU len</span><br><span style="color: hsl(0, 100%, 40%);">- sgsn_nse->max_sdu_len = nsp->u.status.mtu;</span><br><span style="color: hsl(120, 100%, 40%);">+ nse->max_sdu_len = nsp->u.status.mtu;</span><br><span> </span><br><span> uint8_t cause = BSSGP_CAUSE_OML_INTERV;</span><br><span style="color: hsl(0, 100%, 40%);">- bvc = gbproxy_bvc_by_bvci(sgsn_nse, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ bvc = gbproxy_bvc_by_bvci(nse, 0);</span><br><span> if (bvc) {</span><br><span style="color: hsl(0, 100%, 40%);">- bssgp_bvc_fsm_set_max_pdu_len(bvc->fi, sgsn_nse->max_sdu_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ bssgp_bvc_fsm_set_max_pdu_len(bvc->fi, nse->max_sdu_len);</span><br><span> osmo_fsm_inst_dispatch(bvc->fi, BSSGP_BVCFSM_E_REQ_RESET, &cause);</span><br><span> }</span><br><span> }</span><br><span> break;</span><br><span> case GPRS_NS2_AFF_CAUSE_FAILURE:</span><br><span style="color: hsl(0, 100%, 40%);">-#if 0</span><br><span style="color: hsl(0, 100%, 40%);">- if (gbproxy_is_sgsn_nsei(cfg, nsp->nsei)) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* sgsn */</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: BSVC: block all PtP towards bss */</span><br><span style="color: hsl(120, 100%, 40%);">+ nse = gbproxy_nse_by_nsei(cfg, nsp->nsei, NSE_F_BSS | NSE_F_SGSN);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!nse) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DGPRS, LOGL_ERROR, "Unknown NSE(%05d) became unavailable\n", nsp->nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (nse->sgsn_facing) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: When to block all PtP towards bss? Only if all SGSN are down? */</span><br><span> rate_ctr_inc(&cfg->ctrg-></span><br><span> ctr[GBPROX_GLOB_CTR_RESTART_RESET_SGSN]);</span><br><span> } else {</span><br><span style="color: hsl(0, 100%, 40%);">- /* bss became unavailable</span><br><span style="color: hsl(0, 100%, 40%);">- * TODO: Block all BVC belonging to that NSE */</span><br><span style="color: hsl(0, 100%, 40%);">- bvc = gbproxy_bvc_by_nsei(cfg, nsp->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!bvc) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: use primitive name + status cause name */</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DGPRS, LOGL_NOTICE, "Received ns2 primitive %d for unknown bvc NSEI=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">- nsp->u.status.cause, nsp->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* BSS became unavailable</span><br><span style="color: hsl(120, 100%, 40%);">+ * Block matching PtP-BVCs on SGSN-side */</span><br><span style="color: hsl(120, 100%, 40%);">+ hash_for_each(nse->bvcs, i, bvc, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bvc->bvci == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Get BVC for each SGSN and send block request */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gbproxy_cell *cell = bvc->cell;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (int j = 0; j < GBPROXY_MAX_NR_SGSN; j++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gbproxy_bvc *sgsn_bvc = cell->sgsn_bvc[j];</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!sgsn_bvc)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Block BVC, indicate BSS equipment failure */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t cause = BSSGP_CAUSE_EQUIP_FAIL;</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(sgsn_bvc->fi, BSSGP_BVCFSM_E_REQ_BLOCK, &cause);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (!bvc->blocked)</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- hash_for_each(cfg->sgsn_nses, _sgsn, sgsn_nse, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_BLOCK, sgsn_nse->nsei, bvc->bvci, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(120, 100%, 40%);">+ /* This frees the BVCs for us as well */</span><br><span style="color: hsl(120, 100%, 40%);">+ gbproxy_nse_free(nse);</span><br><span> LOGP(DGPRS, LOGL_NOTICE, "NS-NSE %d became unavailable\n", nsp->nsei);</span><br><span> break;</span><br><span> default:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/23296">change 23296</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gbproxy/+/23296"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-gbproxy </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6354a190ec1090a35c27671c72dab9126d0ad794 </div>
<div style="display:none"> Gerrit-Change-Number: 23296 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>