aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/bsc/meas_feed.h3
-rw-r--r--src/osmo-bsc/bsc_vty.c15
-rw-r--r--src/osmo-bsc/meas_feed.c16
3 files changed, 33 insertions, 1 deletions
diff --git a/include/osmocom/bsc/meas_feed.h b/include/osmocom/bsc/meas_feed.h
index 353278e71..f2bd4baae 100644
--- a/include/osmocom/bsc/meas_feed.h
+++ b/include/osmocom/bsc/meas_feed.h
@@ -35,9 +35,12 @@ enum meas_feed_msgtype {
};
#define MEAS_FEED_VERSION 1
+#define MEAS_FEED_WQUEUE_MAX_LEN_DEFAULT 100
int meas_feed_cfg_set(const char *dst_host, uint16_t dst_port);
void meas_feed_scenario_set(const char *name);
+void meas_feed_wqueue_max_length_set(unsigned int max_length);
void meas_feed_cfg_get(char **host, uint16_t *port);
const char *meas_feed_scenario_get(void);
+unsigned int meas_feed_wqueue_max_length_get(void);
diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c
index 7918d81c0..02f708e2e 100644
--- a/src/osmo-bsc/bsc_vty.c
+++ b/src/osmo-bsc/bsc_vty.c
@@ -385,6 +385,7 @@ static int config_write_net(struct vty *vty)
uint16_t meas_port;
char *meas_host;
const char *meas_scenario;
+ unsigned int max_len = meas_feed_wqueue_max_length_get();
meas_feed_cfg_get(&meas_host, &meas_port);
meas_scenario = meas_feed_scenario_get();
@@ -395,6 +396,9 @@ static int config_write_net(struct vty *vty)
if (strlen(meas_scenario) > 0)
vty_out(vty, " meas-feed scenario %s%s",
meas_scenario, VTY_NEWLINE);
+ if (max_len != MEAS_FEED_WQUEUE_MAX_LEN_DEFAULT)
+ vty_out(vty, " meas-feed write-queue-max-length %u%s",
+ max_len, VTY_NEWLINE);
}
if (gsmnet->allow_unusable_timeslots)
@@ -2416,6 +2420,16 @@ DEFUN_ATTR(cfg_net_meas_feed_scenario, cfg_net_meas_feed_scenario_cmd,
return CMD_SUCCESS;
}
+DEFUN_ATTR(cfg_net_meas_feed_wqueue_max_len, cfg_net_meas_feed_wqueue_max_len_cmd,
+ "meas-feed write-queue-max-length <1-65535>",
+ MEAS_FEED_STR "Set the maximum length of the message write queue towards the UDP socket\n"
+ "Maximum number of messages to be queued waiting for transmission\n",
+ CMD_ATTR_IMMEDIATE)
+{
+ meas_feed_wqueue_max_length_set(atoi(argv[0]));
+ return CMD_SUCCESS;
+}
+
static void legacy_timers(struct vty *vty, const char **T_arg)
{
if (!strcmp((*T_arg), "T993111") || !strcmp((*T_arg), "t993111")) {
@@ -3580,6 +3594,7 @@ int bsc_vty_init(struct gsm_network *network)
install_element(GSMNET_NODE, &cfg_net_dyn_ts_allow_tch_f_cmd);
install_element(GSMNET_NODE, &cfg_net_meas_feed_dest_cmd);
install_element(GSMNET_NODE, &cfg_net_meas_feed_scenario_cmd);
+ install_element(GSMNET_NODE, &cfg_net_meas_feed_wqueue_max_len_cmd);
install_element(GSMNET_NODE, &cfg_net_timer_cmd);
install_element(GSMNET_NODE, &cfg_net_allow_unusable_timeslots_cmd);
install_element(GSMNET_NODE, &cfg_net_pcu_sock_cmd);
diff --git a/src/osmo-bsc/meas_feed.c b/src/osmo-bsc/meas_feed.c
index fbfd5536c..23b7d0418 100644
--- a/src/osmo-bsc/meas_feed.c
+++ b/src/osmo-bsc/meas_feed.c
@@ -24,6 +24,7 @@
struct meas_feed_state {
struct osmo_wqueue wqueue;
+ unsigned int wqueue_max_len;
char scenario[31+1];
char *dst_host;
uint16_t dst_port;
@@ -31,6 +32,7 @@ struct meas_feed_state {
static struct meas_feed_state g_mfs = {
.wqueue.bfd.fd = -1,
+ .wqueue_max_len = MEAS_FEED_WQUEUE_MAX_LEN_DEFAULT,
};
static int process_meas_rep(struct gsm_meas_rep *mr)
@@ -152,7 +154,7 @@ int meas_feed_cfg_set(const char *dst_host, uint16_t dst_port)
meas_feed_close();
}
- osmo_wqueue_init(&g_mfs.wqueue, 10);
+ osmo_wqueue_init(&g_mfs.wqueue, g_mfs.wqueue_max_len);
g_mfs.wqueue.write_cb = feed_write_cb;
g_mfs.wqueue.read_cb = feed_read_cb;
@@ -179,6 +181,18 @@ void meas_feed_cfg_get(char **host, uint16_t *port)
*host = g_mfs.dst_host;
}
+void meas_feed_wqueue_max_length_set(unsigned int max_length)
+{
+ g_mfs.wqueue_max_len = max_length;
+ if (g_mfs.wqueue.bfd.fd)
+ g_mfs.wqueue.max_length = max_length;
+}
+
+unsigned int meas_feed_wqueue_max_length_get(void)
+{
+ return g_mfs.wqueue_max_len;
+}
+
void meas_feed_scenario_set(const char *name)
{
osmo_strlcpy(g_mfs.scenario, name, sizeof(g_mfs.scenario));