<p>lynxis lazus has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/22210">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: implement BLOCK/UNBLOCK of a NSVC by vty<br><br>The vty should be able to block or unblock a specific NSVC.<br>Further more this case is special for the UNITDATA as those<br>can be still received until the other side response to the BLOCK PDU.<br><br>TODO: unit or ttcn3 tests<br><br>Related: OS#4939<br>Change-Id: Ic0ce3c5fabc8644cc1ee71a8f6dd783fadf7b84d<br>---<br>M src/gb/gprs_ns2_internal.h<br>M src/gb/gprs_ns2_vc_fsm.c<br>M src/gb/gprs_ns2_vty2.c<br>3 files changed, 107 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/10/22210/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h</span><br><span>index c33f7f8..954671f 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -311,6 +311,8 @@</span><br><span> int gprs_ns2_vc_rx(struct gprs_ns2_vc *nsvc, struct msgb *msg, struct tlv_parsed *tp);</span><br><span> int gprs_ns2_vc_is_alive(struct gprs_ns2_vc *nsvc);</span><br><span> int gprs_ns2_vc_is_unblocked(struct gprs_ns2_vc *nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_vc_block(struct gprs_ns2_vc *nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_vc_unblock(struct gprs_ns2_vc *nsvc);</span><br><span> </span><br><span> /* nse */</span><br><span> void ns2_nse_notify_unblocked(struct gprs_ns2_vc *nsvc, bool unblocked);</span><br><span>diff --git a/src/gb/gprs_ns2_vc_fsm.c b/src/gb/gprs_ns2_vc_fsm.c</span><br><span>index 641fcc3..4af4700 100644</span><br><span>--- a/src/gb/gprs_ns2_vc_fsm.c</span><br><span>+++ b/src/gb/gprs_ns2_vc_fsm.c</span><br><span>@@ -59,6 +59,10 @@</span><br><span>          * It can change during runtime. The side which blocks an unblocked side.*/</span><br><span>  bool initiate_block;</span><br><span>         bool initiate_reset;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* if blocked by O&M/vty */</span><br><span style="color: hsl(120, 100%, 40%);">+       bool om_blocked;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* if unitdata is forwarded to the user */</span><br><span style="color: hsl(120, 100%, 40%);">+    bool accept_unitdata;</span><br><span> </span><br><span>    /* the alive counter is present in all states */</span><br><span>     struct {</span><br><span>@@ -112,6 +116,8 @@</span><br><span>       GPRS_NS2_EV_UNITDATA,</span><br><span> </span><br><span>    GPRS_NS2_EV_FORCE_UNCONFIGURED, /* called via vty for tests */</span><br><span style="color: hsl(120, 100%, 40%);">+        GPRS_NS2_EV_OM_BLOCK, /* vty cmd: block */</span><br><span style="color: hsl(120, 100%, 40%);">+    GPRS_NS2_EV_OM_UNBLOCK, /* vty cmd: unblock*/</span><br><span> };</span><br><span> </span><br><span> static const struct value_string gprs_ns2_vc_event_names[] = {</span><br><span>@@ -127,6 +133,8 @@</span><br><span>      { GPRS_NS2_EV_STATUS,                   "STATUS" },</span><br><span>        { GPRS_NS2_EV_UNITDATA,                 "UNITDATA" },</span><br><span>      { GPRS_NS2_EV_FORCE_UNCONFIGURED,       "FORCE_UNCONFIGURED" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { GPRS_NS2_EV_OM_BLOCK,                 "O&M_BLOCK"},</span><br><span style="color: hsl(120, 100%, 40%);">+   { GPRS_NS2_EV_OM_UNBLOCK,               "O&M_UNBLOCK"},</span><br><span>        { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -245,6 +253,7 @@</span><br><span>  if (old_state != GPRS_NS2_ST_RESET)</span><br><span>          priv->N = 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   priv->accept_unitdata = false;</span><br><span>    if (priv->initiate_reset)</span><br><span>                 ns2_tx_reset(priv->nsvc, NS_CAUSE_OM_INTERVENTION);</span><br><span> </span><br><span>@@ -283,8 +292,12 @@</span><br><span>    if (old_state != GPRS_NS2_ST_BLOCKED)</span><br><span>                priv->N = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if (priv->initiate_block)</span><br><span style="color: hsl(0, 100%, 40%);">-            ns2_tx_unblock(priv->nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (priv->initiate_block) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (priv->om_blocked)</span><br><span style="color: hsl(120, 100%, 40%);">+                      ns2_tx_block(priv->nsvc, NS_CAUSE_OM_INTERVENTION);</span><br><span style="color: hsl(120, 100%, 40%);">+                else</span><br><span style="color: hsl(120, 100%, 40%);">+                  ns2_tx_unblock(priv->nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span> </span><br><span>       start_test_procedure(priv);</span><br><span> }</span><br><span>@@ -293,7 +306,24 @@</span><br><span> {</span><br><span>         struct gprs_ns2_vc_priv *priv = fi->priv;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (priv->initiate_block) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (priv->om_blocked) {</span><br><span style="color: hsl(120, 100%, 40%);">+            switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+              case GPRS_NS2_EV_BLOCK_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+                   priv->accept_unitdata = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_timer_del(&fi->timer);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case GPRS_NS2_EV_BLOCK:</span><br><span style="color: hsl(120, 100%, 40%);">+                       priv->accept_unitdata = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                     ns2_tx_block_ack(priv->nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_timer_del(&fi->timer);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case GPRS_NS2_EV_UNBLOCK:</span><br><span style="color: hsl(120, 100%, 40%);">+                     priv->accept_unitdata = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                     ns2_tx_block(priv->nsvc, NS_CAUSE_OM_INTERVENTION);</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_timer_add(&fi->timer);</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%);">+     } else if (priv->initiate_block) {</span><br><span>                switch (event) {</span><br><span>             case GPRS_NS2_EV_BLOCK:</span><br><span>                      /* TODO: BLOCK is a UNBLOCK_NACK */</span><br><span>@@ -303,6 +333,7 @@</span><br><span>                    ns2_tx_unblock_ack(priv->nsvc);</span><br><span>                   /* fall through */</span><br><span>           case GPRS_NS2_EV_UNBLOCK_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+                 priv->accept_unitdata = true;</span><br><span>                     osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_UNBLOCKED,</span><br><span>                                           0, NS_TOUT_TNS_TEST);</span><br><span>                        break;</span><br><span>@@ -325,6 +356,7 @@</span><br><span>         struct gprs_ns2_vc *nsvc = priv->nsvc;</span><br><span>    struct gprs_ns2_nse *nse = nsvc->nse;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  priv->accept_unitdata = true;</span><br><span>     ns2_nse_notify_unblocked(nsvc, true);</span><br><span>        ns2_prim_status_ind(nse, nsvc, 0, NS_AFF_CAUSE_VC_RECOVERY);</span><br><span> }</span><br><span>@@ -446,10 +478,19 @@</span><br><span>    case GPRS_NS2_ST_BLOCKED:</span><br><span>            if (priv->initiate_block) {</span><br><span>                       priv->N++;</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (priv->N <= nsi->timeout[NS_TOUT_TNS_BLOCK_RETRIES]) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_BLOCKED, nsi->timeout[NS_TOUT_TNS_BLOCK], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (priv->om_blocked) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            if (priv->N <= nsi->timeout[NS_TOUT_TNS_BLOCK_RETRIES]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_BLOCKED, nsi->timeout[NS_TOUT_TNS_BLOCK], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                              } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      /* 7.2 stop accepting data when BLOCK PDU not responded */</span><br><span style="color: hsl(120, 100%, 40%);">+                                    priv->accept_unitdata = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span>                    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_RESET, nsi->timeout[NS_TOUT_TNS_RESET], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                                if (priv->N <= nsi->timeout[NS_TOUT_TNS_BLOCK_RETRIES]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_BLOCKED, nsi->timeout[NS_TOUT_TNS_BLOCK], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                              } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_RESET, nsi->timeout[NS_TOUT_TNS_RESET], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                                }</span><br><span>                    }</span><br><span>            }</span><br><span>            break;</span><br><span>@@ -550,7 +591,7 @@</span><br><span>                 switch (fi->state) {</span><br><span>              case GPRS_NS2_ST_BLOCKED:</span><br><span>                    /* 7.2.1: the BLOCKED_ACK might be lost */</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (priv->initiate_block) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (priv->accept_unitdata) {</span><br><span>                              gprs_ns2_recv_unitdata(fi, msg);</span><br><span>                             return;</span><br><span>                      }</span><br><span>@@ -576,6 +617,20 @@</span><br><span>                     return;</span><br><span>              }</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GPRS_NS2_EV_OM_BLOCK:</span><br><span style="color: hsl(120, 100%, 40%);">+            /* vty cmd: block */</span><br><span style="color: hsl(120, 100%, 40%);">+          priv->initiate_block = true;</span><br><span style="color: hsl(120, 100%, 40%);">+               priv->om_blocked = true;</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_BLOCKED, nsi->timeout[NS_TOUT_TNS_BLOCK], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GPRS_NS2_EV_OM_UNBLOCK:</span><br><span style="color: hsl(120, 100%, 40%);">+          /* vty cmd: unblock*/</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!priv->om_blocked)</span><br><span style="color: hsl(120, 100%, 40%);">+                     return;</span><br><span style="color: hsl(120, 100%, 40%);">+               priv->om_blocked = false;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fi->state == GPRS_NS2_ST_BLOCKED)</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_fsm_inst_state_chg(fi, GPRS_NS2_ST_BLOCKED, nsi->timeout[NS_TOUT_TNS_BLOCK], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span>@@ -653,6 +708,22 @@</span><br><span>    return osmo_fsm_inst_dispatch(nsvc->fi, GPRS_NS2_EV_FORCE_UNCONFIGURED, NULL);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Block a NS-VC.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param nsvc the virtual circuit</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \return 0 on success; negative on error */</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_vc_block(struct gprs_ns2_vc *nsvc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return osmo_fsm_inst_dispatch(nsvc->fi, GPRS_NS2_EV_BLOCK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Unblock a NS-VC.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param nsvc the virtual circuit</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \return 0 on success; negative on error */</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_vc_unblock(struct gprs_ns2_vc *nsvc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return osmo_fsm_inst_dispatch(nsvc->fi, GPRS_NS2_EV_UNBLOCK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! entry point for messages from the driver/VL</span><br><span>  *  \param nsvc virtual circuit on which the message was received</span><br><span>  *  \param msg message that was received</span><br><span>diff --git a/src/gb/gprs_ns2_vty2.c b/src/gb/gprs_ns2_vty2.c</span><br><span>index 5af8fbc..87e891d 100644</span><br><span>--- a/src/gb/gprs_ns2_vty2.c</span><br><span>+++ b/src/gb/gprs_ns2_vty2.c</span><br><span>@@ -1503,6 +1503,32 @@</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(nsvc_block, nsvc_block_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "nsvci <0-65535> (block|unblock)",</span><br><span style="color: hsl(120, 100%, 40%);">+      "NS Virtual Connection\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "NS Virtual Connection\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Block or Unblock a NSVC. As cause code O&M intervention will be used.\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_ns2_inst *nsi = vty_nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gprs_ns2_vc *nsvc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t id = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        nsvc = gprs_ns2_nsvc_by_nsvci(nsi, id);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "Could not find NSVCI %u%s", id, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!strcmp(argv[1], "block")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ns2_vc_block(nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              ns2_vc_unblock(nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void log_set_nse_filter(struct log_target *target,</span><br><span>                                struct gprs_ns2_nse *nse)</span><br><span> {</span><br><span>@@ -1608,6 +1634,7 @@</span><br><span>       install_lib_element_ve(&logging_fltr_nsvc_cmd);</span><br><span> </span><br><span>      install_lib_element(ENABLE_NODE, &nsvc_force_unconf_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_lib_element(ENABLE_NODE, &nsvc_block_cmd);</span><br><span> </span><br><span>   install_lib_element(CFG_LOG_NODE, &logging_fltr_nse_cmd);</span><br><span>        install_lib_element(CFG_LOG_NODE, &logging_fltr_nsvc_cmd);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/22210">change 22210</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/libosmocore/+/22210"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic0ce3c5fabc8644cc1ee71a8f6dd783fadf7b84d </div>
<div style="display:none"> Gerrit-Change-Number: 22210 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>