diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-08-29 16:41:10 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-08-30 11:27:24 +0200 |
commit | c1d7bb69082b25fc2b33c2ff37cb027aacc71cbc (patch) | |
tree | e4e9404a44cb65441e1a296fb0faa35828e6e763 | |
parent | 94426aae6121ae67b624f6907ed675df573f49fb (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.h | 3 | ||||
-rw-r--r-- | src/osmo-bsc/bsc_vty.c | 15 | ||||
-rw-r--r-- | src/osmo-bsc/meas_feed.c | 16 |
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)); |