diff options
-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)); |