* net.location to get/set the geographical location of the network
  format is <tstamp>,<lat>,<lon>,<height>
* per trx rf_locked command (net.bts0.trx0.rf_locked)
* network-wide rf_locked command (net.rf_locked)
---
 openbsc/src/osmo-bsc/osmo_bsc_main.c |  164 ++++++++++++++++++++++++++++++++++
 1 files changed, 164 insertions(+), 0 deletions(-)

diff --git a/openbsc/src/osmo-bsc/osmo_bsc_main.c 
b/openbsc/src/osmo-bsc/osmo_bsc_main.c
index 64daaf4..5041a35 100644
--- a/openbsc/src/osmo-bsc/osmo_bsc_main.c
+++ b/openbsc/src/osmo-bsc/osmo_bsc_main.c
@@ -18,6 +18,7 @@
  *
  */
 
+#include <openbsc/control_cmd.h>
 #include <openbsc/debug.h>
 #include <openbsc/gsm_data.h>
 #include <openbsc/osmo_bsc.h>
@@ -25,10 +26,12 @@
 #include <openbsc/osmo_msc_data.h>
 #include <openbsc/signal.h>
 #include <openbsc/vty.h>
+#include <openbsc/ipaccess.h>
 
 #include <osmocom/core/application.h>
 #include <osmocom/core/talloc.h>
 #include <osmocom/core/process.h>
+#include <osmocom/gsm/protocol/gsm_12_21.h>
 
 #include <osmocom/sccp/sccp.h>
 
@@ -175,6 +178,164 @@ static void signal_handler(int signal)
        }
 }
 
+struct location {
+       double lat;
+       double lon;
+       double height;
+       unsigned long age;
+};
+
+static struct location myloc;
+
+CTRL_CMD_DEFINE(net_loc, "location");
+int get_net_loc(struct ctrl_cmd *cmd, void *data)
+{
+       cmd->reply = talloc_asprintf(cmd, "%lu,%f,%f,%f", myloc.age, myloc.lat, 
myloc.lon, myloc.height);
+       if (!cmd->reply) {
+               cmd->reply = "OOM";
+               return CTRL_CMD_ERROR;
+       }
+
+       return CTRL_CMD_REPLY;
+}
+
+int set_net_loc(struct ctrl_cmd *cmd, void *data)
+{
+       char *saveptr, *lat, *lon, *height, *age, *tmp;
+
+       tmp = talloc_strdup(cmd, cmd->value);
+       if (!tmp)
+               goto oom;
+
+
+       age = strtok_r(tmp, ",", &saveptr);
+       lat = strtok_r(NULL, ",", &saveptr);
+       lon = strtok_r(NULL, ",", &saveptr);
+       height = strtok_r(NULL, "\0", &saveptr);
+
+       myloc.age = atol(age);
+       myloc.lat = atof(lat);
+       myloc.lon = atof(lon);
+       myloc.height = atof(height);
+       talloc_free(tmp);
+
+       return get_net_loc(cmd, data);
+oom:
+       cmd->reply = "OOM";
+       return CTRL_CMD_ERROR;
+}
+
+int verify_net_loc(struct ctrl_cmd *cmd, const char *value, void *data)
+{
+       char *saveptr, *latstr, *lonstr, *heightstr, *agestr, *tmp;
+       int  ret = 0;
+       unsigned long age;
+       double lat, lon, height;
+
+       tmp = talloc_strdup(cmd, value);
+       if (!tmp)
+               return 1;
+
+       agestr = strtok_r(tmp, ",", &saveptr);
+       latstr = strtok_r(NULL, ",", &saveptr);
+       lonstr = strtok_r(NULL, ",", &saveptr);
+       heightstr = strtok_r(NULL, "\0", &saveptr);
+
+       if ((agestr == 0) || (latstr == 0) || (lonstr == 0) || (heightstr == 0))
+               ret = 1;
+
+       age = atol(agestr);
+       lat = atof(latstr);
+       lon = atof(lonstr);
+       height = atof(heightstr);
+       talloc_free(tmp);
+
+       if ((age == 0) || (lat < -90) || (lat > 90) || (lon < -180) || (lon > 
180))
+               return 1;
+
+       return ret;
+}
+
+CTRL_CMD_DEFINE(trx_rf_lock, "rf_locked");
+int get_trx_rf_lock(struct ctrl_cmd *cmd, void *data)
+{
+       struct gsm_bts_trx *trx = cmd->node;
+       if (!trx) {
+               cmd->reply = "trx not found.";
+               return CTRL_CMD_ERROR;
+       }
+
+       cmd->reply = talloc_asprintf(cmd, "%u", trx->nm_state.administrative == 
NM_STATE_LOCKED ? 1 : 0);
+       return CTRL_CMD_REPLY;
+}
+
+int set_trx_rf_lock(struct ctrl_cmd *cmd, void *data)
+{
+       int locked = atoi(cmd->value);
+       struct gsm_bts_trx *trx = cmd->node;
+       if (!trx) {
+               cmd->reply = "trx not found.";
+               return CTRL_CMD_ERROR;
+       }
+
+       gsm_trx_lock_rf(trx, locked);
+
+       return get_trx_rf_lock(cmd, data);
+}
+
+int verify_trx_rf_lock(struct ctrl_cmd *cmd, const char *value, void *data)
+{
+       int locked = atoi(cmd->value);
+
+       if ((locked != 0) && (locked != 1))
+               return 1;
+
+       return 0;
+}
+
+CTRL_CMD_DEFINE(net_rf_lock, "rf_locked");
+int get_net_rf_lock(struct ctrl_cmd *cmd, void *data)
+{
+       cmd->reply = "get only works for the individual trx properties.";
+       return CTRL_CMD_ERROR;
+}
+
+int set_net_rf_lock(struct ctrl_cmd *cmd, void *data)
+{
+       int locked = atoi(cmd->value);
+       struct gsm_network *net = cmd->node;
+       struct gsm_bts *bts;
+       if (!net) {
+               cmd->reply = "net not found.";
+               return CTRL_CMD_ERROR;
+       }
+
+       llist_for_each_entry(bts, &net->bts_list, list) {
+               struct gsm_bts_trx *trx;
+               llist_for_each_entry(trx, &bts->trx_list, list) {
+                       gsm_trx_lock_rf(trx, locked);
+               }
+       }
+
+       cmd->reply = talloc_asprintf(cmd, "%u", locked);
+       if (!cmd->reply) {
+               cmd->reply = "OOM.";
+               return CTRL_CMD_ERROR;
+       }
+
+       return CTRL_CMD_REPLY;
+}
+
+int verify_net_rf_lock(struct ctrl_cmd *cmd, const char *value, void *data)
+{
+       int locked = atoi(cmd->value);
+
+       if ((locked != 0) && (locked != 1))
+               return 1;
+
+       return 0;
+}
+
 int main(int argc, char **argv)
 {
        struct osmo_msc_data *data;
@@ -213,6 +374,9 @@ int main(int argc, char **argv)
        bsc_api_init(bsc_gsmnet, osmo_bsc_api());
 
        controlif_setup(bsc_gsmnet, 4249);
+       ctrl_cmd_install(CTRL_NODE_NET, &cmd_net_loc);
+       ctrl_cmd_install(CTRL_NODE_NET, &cmd_net_rf_lock);
+       ctrl_cmd_install(CTRL_NODE_TRX, &cmd_trx_rf_lock);
 
        data = bsc_gsmnet->msc_data;
        if (rf_ctl)
-- 
1.7.5.rc3


Reply via email to