aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src
diff options
context:
space:
mode:
authorDaniel Willmann <daniel@totalueberwachung.de>2011-02-18 16:17:58 +0100
committerHarald Welte <laforge@gnumonks.org>2011-07-13 14:07:10 +0200
commitbc07090af2b6e31ac66d6d4150ac65df00ac7d1d (patch)
tree6d30922dbf28a7a21141756cdeb894dd077a5c86 /openbsc/src
parentf7d557cdf2af0e39d5b9592dcb74d3d1c79030a9 (diff)
osmo_bsc: Add some libctrl commands
* 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)
Diffstat (limited to 'openbsc/src')
-rw-r--r--openbsc/src/osmo-bsc/osmo_bsc_main.c164
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 6deed3009..248944b6c 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>
@@ -170,6 +173,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;
@@ -207,6 +368,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)