<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25387">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add CTRL 'rf_states' and 'bts.N.rf_states'<br><br>These commands return a listing of OML state, RF policy as well as RSL<br>connection status for each TRX in the form:<br><br> <bts_nr>,<trx_nr>,<opstate>,<adminstate>,<rf_policy>,<rsl_status>;<bts_nr>,<trx_nr>,...<br><br>For example, the root node 'rf_states' may return:<br><br> 0,0,operational,unlocked,on,rsl-up;1,0,operational,unlocked,on,rsl-down;2,0,inoperational,locked,on,rsl-down;<br><br>A 'bts.N.rf_states' returns the same form of string, but lists only the<br>TRX for the given BTS nr.<br><br>Related: SYS#5542<br>Related: I01e6f391a5e71b0606c42be9b57f8a1687d59bcb (osmo-ttcn3-hacks)<br>Change-Id: I14fa2678fc8f2c11a879c5e9615ac552782c5b7e<br>---<br>M include/osmocom/bsc/osmo_bsc_rf.h<br>M src/osmo-bsc/bsc_ctrl_commands.c<br>M src/osmo-bsc/bsc_rf_ctrl.c<br>3 files changed, 119 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/87/25387/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/osmo_bsc_rf.h b/include/osmocom/bsc/osmo_bsc_rf.h</span><br><span>index 56ac980..f88ccbf 100644</span><br><span>--- a/include/osmocom/bsc/osmo_bsc_rf.h</span><br><span>+++ b/include/osmocom/bsc/osmo_bsc_rf.h</span><br><span>@@ -60,7 +60,12 @@</span><br><span> enum osmo_bsc_rf_opstate osmo_bsc_rf_get_opstate_by_bts(struct gsm_bts *bts);</span><br><span> enum osmo_bsc_rf_adminstate osmo_bsc_rf_get_adminstate_by_bts(struct gsm_bts *bts);</span><br><span> enum osmo_bsc_rf_policy osmo_bsc_rf_get_policy_by_bts(struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_bsc_rf_opstate osmo_bsc_rf_get_opstate_by_trx(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_bsc_rf_adminstate osmo_bsc_rf_get_adminstate_by_trx(struct gsm_bts_trx *trx);</span><br><span> struct osmo_bsc_rf *osmo_bsc_rf_create(const char *path, struct gsm_network *net);</span><br><span> void osmo_bsc_rf_schedule_lock(struct osmo_bsc_rf *rf, char cmd);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+char *bsc_rf_states_of_bts_c(void *ctx, struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+char *bsc_rf_states_c(void *ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif</span><br><span>diff --git a/src/osmo-bsc/bsc_ctrl_commands.c b/src/osmo-bsc/bsc_ctrl_commands.c</span><br><span>index be83b1b..3b8125a 100644</span><br><span>--- a/src/osmo-bsc/bsc_ctrl_commands.c</span><br><span>+++ b/src/osmo-bsc/bsc_ctrl_commands.c</span><br><span>@@ -420,6 +420,42 @@</span><br><span> }</span><br><span> CTRL_CMD_DEFINE_RO(bts_rf_state, "rf_state");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Return a list of the states of each TRX for a given BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+ * <bts_nr>,<trx_nr>,<opstate>,<adminstate>,<rf_policy>;<bts_nr>,<trx_nr>,...</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_bts_rf_states(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts = cmd->node;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+           cmd->reply = "bts not found.";</span><br><span style="color: hsl(120, 100%, 40%);">+           return CTRL_CMD_ERROR;</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%);">+   cmd->reply = bsc_rf_states_of_bts_c(cmd, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!cmd->reply) {</span><br><span style="color: hsl(120, 100%, 40%);">+         cmd->reply = "OOM.";</span><br><span style="color: hsl(120, 100%, 40%);">+             return CTRL_CMD_ERROR;</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 CTRL_CMD_REPLY;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+CTRL_CMD_DEFINE_RO(bts_rf_states, "rf_states");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Return a list of the states of each TRX for all BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+ * <bts_nr>,<trx_nr>,<opstate>,<adminstate>,<rf_policy>;<bts_nr>,<trx_nr>,...</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_net_rf_states(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      cmd->reply = bsc_rf_states_c(cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cmd->reply) {</span><br><span style="color: hsl(120, 100%, 40%);">+         cmd->reply = "OOM.";</span><br><span style="color: hsl(120, 100%, 40%);">+             return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return CTRL_CMD_REPLY;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+CTRL_CMD_DEFINE_RO(net_rf_states, "rf_states");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int get_net_rf_lock(struct ctrl_cmd *cmd, void *data)</span><br><span> {</span><br><span>  struct gsm_network *net = cmd->node;</span><br><span>@@ -609,6 +645,7 @@</span><br><span>        rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_mcc_mnc_apply);</span><br><span>  rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_rf_lock);</span><br><span>        rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_bts_num);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_net_rf_states);</span><br><span> </span><br><span>  rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_lac);</span><br><span>     rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_ci);</span><br><span>@@ -619,6 +656,7 @@</span><br><span>        rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_oml_up);</span><br><span>  rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_gprs_mode);</span><br><span>       rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_rf_state);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_rf_states);</span><br><span>       rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_c0_power_red);</span><br><span> </span><br><span>        rc |= ctrl_cmd_install(CTRL_NODE_TRX, &cmd_trx_max_power);</span><br><span>diff --git a/src/osmo-bsc/bsc_rf_ctrl.c b/src/osmo-bsc/bsc_rf_ctrl.c</span><br><span>index a845859..364e8f8 100644</span><br><span>--- a/src/osmo-bsc/bsc_rf_ctrl.c</span><br><span>+++ b/src/osmo-bsc/bsc_rf_ctrl.c</span><br><span>@@ -124,6 +124,82 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_bsc_rf_opstate osmo_bsc_rf_get_opstate_by_trx(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (trx->mo.nm_state.operational == NM_OPSTATE_ENABLED)</span><br><span style="color: hsl(120, 100%, 40%);">+            return OSMO_BSC_RF_OPSTATE_OPERATIONAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       return OSMO_BSC_RF_OPSTATE_INOPERATIONAL;</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%);">+enum osmo_bsc_rf_adminstate osmo_bsc_rf_get_adminstate_by_trx(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     if (trx->mo.nm_state.administrative == NM_STATE_UNLOCKED)</span><br><span style="color: hsl(120, 100%, 40%);">+          return OSMO_BSC_RF_ADMINSTATE_UNLOCKED;</span><br><span style="color: hsl(120, 100%, 40%);">+       return OSMO_BSC_RF_ADMINSTATE_LOCKED;</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 a string listing the state of the given TRX.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The string has the form:</span><br><span style="color: hsl(120, 100%, 40%);">+ *  <bts_nr>,<trx_nr>,<opstate>,<adminstate>,<rf_policy>,<rsl_status>;</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static int bsc_rf_state_of_trx_buf(char *buf, size_t buflen, struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_strbuf sb = { .buf = buf, .len = buflen };</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_STRBUF_PRINTF(sb, "%u,%u,%s,%s,%s,%s;",</span><br><span style="color: hsl(120, 100%, 40%);">+                           trx->bts->nr, trx->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_bsc_rf_get_opstate_name(osmo_bsc_rf_get_opstate_by_trx(trx)),</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_bsc_rf_get_adminstate_name(osmo_bsc_rf_get_adminstate_by_trx(trx)),</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_bsc_rf_get_policy_name(osmo_bsc_rf_get_policy_by_bts(trx->bts)),</span><br><span style="color: hsl(120, 100%, 40%);">+                      trx_is_usable(trx) && trx->rsl_link_primary ? "rsl-up" : "rsl-down");</span><br><span style="color: hsl(120, 100%, 40%);">+       return sb.chars_needed;</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%);">+static int bsc_rf_states_of_bts_buf(char *buf, size_t buflen, struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_strbuf sb = { .buf = buf, .len = buflen };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_STRBUF_APPEND(sb, bsc_rf_state_of_trx_buf, trx);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return sb.chars_needed;</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 a string listing the states of each TRX for the given BTS.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The string has the form:</span><br><span style="color: hsl(120, 100%, 40%);">+ * <bts_nr>,<trx_nr>,<opstate>,<adminstate>,<rf_policy>,<rsl_status>;<bts_nr>,<trx_nr>,...;...;</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param ctx  Talloc context to allocate the returned string from.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param bts  BTS of which to list the TRX states.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return talloc allocated string.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+char *bsc_rf_states_of_bts_c(void *ctx, struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_NAME_C_IMPL(ctx, 256, "ERROR", bsc_rf_states_of_bts_buf, bts);</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%);">+static int bsc_rf_states_buf(char *buf, size_t buflen)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_strbuf sb = { .buf = buf, .len = buflen };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+               OSMO_STRBUF_APPEND(sb, bsc_rf_states_of_bts_buf, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return sb.chars_needed;</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 a string listing the states of all TRX of all BTS.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The string has the form:</span><br><span style="color: hsl(120, 100%, 40%);">+ * <bts_nr>,<trx_nr>,<opstate>,<adminstate>,<rf_policy>,<rsl_status>;<bts_nr>,<trx_nr>,...;...;</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param ctx  Talloc context to allocate the returned string from.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param bts  BTS of which to list the TRX states, or NULL to list all TRX of all BTS.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return talloc allocated string.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+char *bsc_rf_states_c(void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_NAME_C_IMPL(ctx, 4096, "ERROR", bsc_rf_states_buf);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int lock_each_trx(struct gsm_network *net, bool lock)</span><br><span> {</span><br><span>         struct gsm_bts *bts;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25387">change 25387</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-bsc/+/25387"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I14fa2678fc8f2c11a879c5e9615ac552782c5b7e </div>
<div style="display:none"> Gerrit-Change-Number: 25387 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>