<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>