aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2014-08-24 10:44:31 +0200
committerHarald Welte <laforge@gnumonks.org>2014-08-24 16:42:02 +0200
commitd9a2aa8d9909d93d96e421c7cb727932445fa8ab (patch)
treea5d58e1a563ed7feb35ce7bc7d973f0e4038686e
parente43feaf231e08f108aafa26a7829820fad3447cb (diff)
add control interface to common BTS (for thermal attenuation)
Using this control interface, an external program can request attentuation of the transmitter for thermal management reasons. The external application doesn't have to know anthing about the actual transmit power, but it can just configure a certian value of milli-dB (1/10000 bel) and update (increase/decrease) that value depending on the thermal environment.
-rw-r--r--include/osmo-bts/control_if.h3
-rw-r--r--src/common/Makefile.am2
-rw-r--r--src/common/bts_ctrl_commands.c78
-rw-r--r--src/common/bts_ctrl_lookup.c103
-rw-r--r--src/osmo-bts-sysmo/main.c5
5 files changed, 190 insertions, 1 deletions
diff --git a/include/osmo-bts/control_if.h b/include/osmo-bts/control_if.h
new file mode 100644
index 00000000..e50238a4
--- /dev/null
+++ b/include/osmo-bts/control_if.h
@@ -0,0 +1,3 @@
+#pragma once
+
+struct ctrl_handle *bts_controlif_setup(struct gsm_bts *bts, uint16_t port);
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
index 77f73b47..10627e2a 100644
--- a/src/common/Makefile.am
+++ b/src/common/Makefile.am
@@ -7,4 +7,4 @@ libbts_a_SOURCES = gsm_data_shared.c sysinfo.c logging.c abis.c oml.c bts.c \
rsl.c vty.c paging.c measurement.c amr.c lchan.c \
load_indication.c pcu_sock.c handover.c msg_utils.c \
load_indication.c pcu_sock.c handover.c msg_utils.c \
- tx_power.c
+ tx_power.c bts_ctrl_commands.c bts_ctrl_lookup.c
diff --git a/src/common/bts_ctrl_commands.c b/src/common/bts_ctrl_commands.c
new file mode 100644
index 00000000..6d223ff7
--- /dev/null
+++ b/src/common/bts_ctrl_commands.c
@@ -0,0 +1,78 @@
+/* Control Interface for osmo-bts */
+
+/* (C) 2014 by Harald Welte <laforge@gnumonks.org>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdint.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <osmocom/ctrl/control_cmd.h>
+
+#include <osmo-bts/logging.h>
+#include <osmo-bts/gsm_data.h>
+#include <osmo-bts/tx_power.h>
+
+CTRL_CMD_DEFINE(therm_att, "thermal-attenuation");
+static int get_therm_att(struct ctrl_cmd *cmd, void *data)
+{
+ struct gsm_bts_trx *trx = cmd->node;
+ struct trx_power_params *tpp = &trx->power_params;
+
+ cmd->reply = talloc_asprintf(cmd, "%d", tpp->thermal_attenuation_mdB);
+
+ return CTRL_CMD_REPLY;
+}
+
+static int set_therm_att(struct ctrl_cmd *cmd, void *data)
+{
+ struct gsm_bts_trx *trx = cmd->node;
+ struct trx_power_params *tpp = &trx->power_params;
+ int val = atoi(cmd->value);
+
+ printf("set_therm_att(trx=%p, tpp=%p)\n", trx, tpp);
+
+ tpp->thermal_attenuation_mdB = val;
+
+ power_ramp_start(trx, tpp->p_total_cur_mdBm, 0);
+
+ return get_therm_att(cmd, data);
+}
+
+static int verify_therm_att(struct ctrl_cmd *cmd, const char *value, void *data)
+{
+ int val = atoi(value);
+
+ /* permit between 0 to 40 dB attenuation */
+ if (val < 0 || val > to_mdB(40))
+ return 1;
+
+ return 0;
+}
+
+
+int bts_ctrl_cmds_install(struct gsm_bts *bts)
+{
+ int rc = 0;
+
+ rc |= ctrl_cmd_install(CTRL_NODE_TRX, &cmd_therm_att);
+
+ return rc;
+}
diff --git a/src/common/bts_ctrl_lookup.c b/src/common/bts_ctrl_lookup.c
new file mode 100644
index 00000000..ec6434e0
--- /dev/null
+++ b/src/common/bts_ctrl_lookup.c
@@ -0,0 +1,103 @@
+/* Control Interface for osmo-bts */
+
+/* (C) 2014 by Harald Welte <laforge@gnumonks.org>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <errno.h>
+
+#include <osmocom/vty/command.h>
+#include <osmocom/ctrl/control_if.h>
+#include <osmo-bts/logging.h>
+#include <osmo-bts/gsm_data.h>
+
+extern vector ctrl_node_vec;
+
+/*! \brief control interface lookup function for bsc/bts gsm_data
+ * \param[in] data Private data passed to controlif_setup()
+ * \param[in] vline Vector of the line holding the command string
+ * \param[out] node_type type (CTRL_NODE_) that was determined
+ * \param[out] node_data private dta of node that was determined
+ * \param i Current index into vline, up to which it is parsed
+ */
+static int bts_ctrl_node_lookup(void *data, vector vline, int *node_type,
+ void **node_data, int *i)
+{
+ struct gsm_bts *bts = data;
+ struct gsm_bts_trx *trx = NULL;
+ struct gsm_bts_trx_ts *ts = NULL;
+ char *token = vector_slot(vline, *i);
+ long num;
+
+ /* TODO: We need to make sure that the following chars are digits
+ * and/or use strtol to check if number conversion was successful
+ * Right now something like net.bts_stats will not work */
+ if (!strcmp(token, "trx")) {
+ if (*node_type != CTRL_NODE_ROOT || !*node_data)
+ goto err_missing;
+ bts = *node_data;
+ (*i)++;
+ if (!ctrl_parse_get_num(vline, *i, &num))
+ goto err_index;
+
+ trx = gsm_bts_trx_num(bts, num);
+ if (!trx)
+ goto err_missing;
+ *node_data = trx;
+ *node_type = CTRL_NODE_TRX;
+ } else if (!strcmp(token, "ts")) {
+ if (*node_type != CTRL_NODE_TRX || !*node_data)
+ goto err_missing;
+ trx = *node_data;
+ (*i)++;
+ if (!ctrl_parse_get_num(vline, *i, &num))
+ goto err_index;
+
+ if ((num >= 0) && (num < TRX_NR_TS))
+ ts = &trx->ts[num];
+ if (!ts)
+ goto err_missing;
+ *node_data = ts;
+ *node_type = CTRL_NODE_TS;
+ } else
+ return 0;
+
+ return 1;
+err_missing:
+ return -ENODEV;
+err_index:
+ return -ERANGE;
+}
+
+struct ctrl_handle *bts_controlif_setup(struct gsm_bts *bts, uint16_t port)
+{
+ struct ctrl_handle *hdl;
+ int rc = 0;
+
+ hdl = ctrl_interface_setup(bts, port, bts_ctrl_node_lookup);
+ if (!hdl)
+ return NULL;
+
+ rc = bts_ctrl_cmds_install(bts);
+ if (rc) {
+ /* FIXME: close control interface */
+ return NULL;
+ }
+
+ return hdl;
+}
diff --git a/src/osmo-bts-sysmo/main.c b/src/osmo-bts-sysmo/main.c
index d12421df..8c930965 100644
--- a/src/osmo-bts-sysmo/main.c
+++ b/src/osmo-bts-sysmo/main.c
@@ -45,6 +45,7 @@
#include <osmo-bts/vty.h>
#include <osmo-bts/bts_model.h>
#include <osmo-bts/pcu_if.h>
+#include <osmo-bts/control_if.h>
#define SYSMOBTS_RF_LOCK_PATH "/var/lock/bts_rf_lock"
@@ -290,6 +291,8 @@ static int write_pid_file(char *procname)
return 0;
}
+extern int sysmobts_ctrlif_inst_cmds(void);
+
int main(int argc, char **argv)
{
struct stat st;
@@ -348,6 +351,8 @@ int main(int argc, char **argv)
}
write_pid_file("osmo-bts");
+ bts_controlif_setup(bts, 3333);
+
rc = telnet_init(tall_bts_ctx, NULL, 4241);
if (rc < 0) {
fprintf(stderr, "Error initializing telnet\n");