This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
laforge gerrit-no-reply at lists.osmocom.orglaforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-sgsn/+/21696 ) Change subject: gbproxy: Implement scaling of BVC flow control in SGSN pool ...................................................................... gbproxy: Implement scaling of BVC flow control in SGSN pool When there are multiple SGSNs inside a pool, we need to decide how much of the per-BVC capacity advertised by the BSS in its BVC-FLOW-CONTROL we should announce to each of the pool members. A conservative approach would be to advertise 1/num_sgsn, but there may also be use case where over-provisioning (announcing more than an equal share of the capacity) is useful. Hence, let's introduce "pool bvc-flow-control-ratio <1-100>" in order to allow the administrator to decide. Related: OS#4891 Change-Id: Ibe5addf657e7237499ca0205bacfe999ecd1e771 --- M doc/manuals/chapters/gbproxy-configuration.adoc M include/osmocom/sgsn/gb_proxy.h M src/gbproxy/gb_proxy.c M src/gbproxy/gb_proxy_vty.c 4 files changed, 65 insertions(+), 3 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/96/21696/1 diff --git a/doc/manuals/chapters/gbproxy-configuration.adoc b/doc/manuals/chapters/gbproxy-configuration.adoc index 599b3f7..e61af48 100644 --- a/doc/manuals/chapters/gbproxy-configuration.adoc +++ b/doc/manuals/chapters/gbproxy-configuration.adoc @@ -4,3 +4,29 @@ Osmocom has very limited funding and support resources; Feel free to help us completing this documentation by contributing with code, documentation or by supporting the developers financially. + + +=== SGSN pool support + +In a SGSN pool, osmo-gbproxy is facing the problem of dividing the downlink +capacity of a cell towards the SGSN. The BSS advertises the per-BVC capacity +by means of the BSSGP FLOW-CONTROL-BVC messages, but as there are multiple +SGSN in a pool, they all have to share / divide that total capacity. + +By default, osmo-gbproxy advertises the full capacity to _each_ of the SGSN +pool members, which results in significant over-provisioning and can lead to +overload situations. + +The administrator can configure the _percentage_ of the overall BSS-advertised +capacity that shall be reported to each pool member SGSN using the +`pool bvc-flow-control-ratio <1-100>` configuration command. + +A setting of 100 means that each pool member is informed of 100% of the +BSS side capacity. + +A setting of 25 means that each pool member is informed of 25% of the +BSS side capacity. This would make most sense in a set-up with four +SGSN of equal share. + +More complex capacity division schemes are so far not supported by +osmo-gbproxy. diff --git a/include/osmocom/sgsn/gb_proxy.h b/include/osmocom/sgsn/gb_proxy.h index 8892cf4..200a539 100644 --- a/include/osmocom/sgsn/gb_proxy.h +++ b/include/osmocom/sgsn/gb_proxy.h @@ -52,6 +52,11 @@ /* NS instance of libosmogb */ struct gprs_ns2_inst *nsi; + struct { + /* percentage of BVC flow control advertised to each SGSN in the pool */ + uint8_t bvc_fc_ratio; + } pool; + /* Linked list of all BSS side Gb peers */ DECLARE_HASHTABLE(bss_nses, 8); diff --git a/src/gbproxy/gb_proxy.c b/src/gbproxy/gb_proxy.c index a976d25..53aecdf 100644 --- a/src/gbproxy/gb_proxy.c +++ b/src/gbproxy/gb_proxy.c @@ -40,6 +40,7 @@ #include <osmocom/gprs/gprs_ns2.h> #include <osmocom/gprs/gprs_bssgp.h> +#include <osmocom/gprs/gprs_bssgp2.h> #include <osmocom/gprs/gprs_bssgp_bss.h> #include <osmocom/gprs/bssgp_bvc_fsm.h> @@ -566,15 +567,28 @@ /* BVC FSM informs us about BVC-FC PDU receive */ static void bss_ptp_bvc_fc_bvc(uint16_t nsei, uint16_t bvci, const struct bssgp2_flow_ctrl *fc, void *priv) { + struct bssgp2_flow_ctrl fc_reduced; struct gbproxy_bvc *bss_bvc = priv; - struct gbproxy_cell *cell = bss_bvc->cell; + struct gbproxy_cell *cell; + struct gbproxy_config *cfg; + OSMO_ASSERT(bss_bvc); + OSMO_ASSERT(fc); + + cell = bss_bvc->cell; if (!cell) return; - /* FIXME: actually split the bandwidth among the SGSNs! */ + cfg = cell->cfg; - dispatch_to_all_sgsn_bvc(cell, BSSGP_BVCFSM_E_REQ_FC_BVC, (void *) fc); + /* reduce / scale according to configuration to make sure we only advertise a fraction + * of the capacity to each of the SGSNs in the pool */ + fc_reduced = *fc; + fc_reduced.bucket_size_max = (fc->bucket_size_max * cfg->pool.bvc_fc_ratio) / 100; + fc_reduced.bucket_leak_rate = (fc->bucket_leak_rate * cfg->pool.bvc_fc_ratio) / 100; + /* we don't modify the per-MS related values as any single MS is only served by one SGSN */ + + dispatch_to_all_sgsn_bvc(cell, BSSGP_BVCFSM_E_REQ_FC_BVC, (void *) &fc_reduced); } static const struct bssgp_bvc_fsm_ops bss_ptp_bvc_fsm_ops = { @@ -1270,6 +1284,8 @@ { struct timespec tp; + /* by default we advertise 100% of the BSS-side capacity to _each_ SGSN */ + cfg->pool.bvc_fc_ratio = 100; hash_init(cfg->bss_nses); cfg->ctrg = rate_ctr_group_alloc(tall_sgsn_ctx, &global_ctrg_desc, 0); if (!cfg->ctrg) { diff --git a/src/gbproxy/gb_proxy_vty.c b/src/gbproxy/gb_proxy_vty.c index a9db596..49ec91c 100644 --- a/src/gbproxy/gb_proxy_vty.c +++ b/src/gbproxy/gb_proxy_vty.c @@ -76,6 +76,9 @@ vty_out(vty, "gbproxy%s", VTY_NEWLINE); + if (g_cfg->pool.bvc_fc_ratio != 100) + vty_out(vty, " pool bvc-flow-control-ratio %u%s", g_cfg->pool.bvc_fc_ratio, VTY_NEWLINE); + hash_for_each(g_cfg->sgsn_nses, i, nse, list) { vty_out(vty, " sgsn nsei %u%s", nse->nsei, VTY_NEWLINE); } @@ -134,6 +137,17 @@ return CMD_WARNING; } +DEFUN(cfg_pool_bvc_fc_ratio, + cfg_pool_bvc_fc_ratio_cmd, + "pool bvc-flow-control-ratio <1-100>", + "SGSN Pool related configuration\n" + "Ratio of BSS-advertised bucket size + leak rate advertised to each SGSN\n" + "Ratio of BSS-advertised bucket size + leak rate advertised to each SGSN (Percent)\n") +{ + g_cfg->pool.bvc_fc_ratio = atoi(argv[0]); + return CMD_SUCCESS; +} + static void log_set_bvc_filter(struct log_target *target, const uint16_t *bvci) { @@ -315,6 +329,7 @@ install_element(CONFIG_NODE, &cfg_gbproxy_cmd); install_node(&gbproxy_node, config_write_gbproxy); install_element(GBPROXY_NODE, &cfg_nsip_sgsn_nsei_cmd); + install_element(GBPROXY_NODE, &cfg_pool_bvc_fc_ratio_cmd); return 0; } -- To view, visit https://gerrit.osmocom.org/c/osmo-sgsn/+/21696 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-sgsn Gerrit-Branch: master Gerrit-Change-Id: Ibe5addf657e7237499ca0205bacfe999ecd1e771 Gerrit-Change-Number: 21696 Gerrit-PatchSet: 1 Gerrit-Owner: laforge <laforge at osmocom.org> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201212/fa948921/attachment.htm>