aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-08-29 16:41:10 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-08-30 11:27:24 +0200
commitc1d7bb69082b25fc2b33c2ff37cb027aacc71cbc (patch)
treee4e9404a44cb65441e1a296fb0faa35828e6e763
parent94426aae6121ae67b624f6907ed675df573f49fb (diff)
meas_feed: Increase wqueue max_len to 100 and make it vty-configurable
The previous amount of 10 messages may be small if the BSC is processing lots of measurements from lots of BTS connected to it. Increase it to 100 by default, and allow changing the write_queue length through the VTY. Related: SYS#6550 Change-Id: Ib2e3591498c038b8e59f3ad447ac1f65928d6da8
-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));