fixeria has submitted this change. ( https://gerrit.osmocom.org/c/osmo-sgsn/+/40822?usp=email )
(
2 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: gprs_sm: QoS: make max-sdu-size configurable ......................................................................
gprs_sm: QoS: make max-sdu-size configurable
Some phones, such as the Sony Ericsson Z520, reject or ignore the Activate PDP Context Accept if they dislike the max-sdu-size value in the QoS profile. Make this value configurable via the VTY so it can be adjusted to accommodate such devices.
Change-Id: I0819da18dafecf322f8902643dae8dbcaa5dc98b Related: OS#6735 --- M src/sgsn/gprs_sm.c M src/sgsn/sgsn_vty.c M tests/osmo-sgsn_test-nodes.vty 3 files changed, 79 insertions(+), 7 deletions(-)
Approvals: lynxis lazus: Looks good to me, approved Jenkins Builder: Verified
diff --git a/src/sgsn/gprs_sm.c b/src/sgsn/gprs_sm.c index 4f55b57..acb1579 100644 --- a/src/sgsn/gprs_sm.c +++ b/src/sgsn/gprs_sm.c @@ -63,7 +63,7 @@ }, };
-static struct gsm48_qos default_qos = { +struct gsm48_qos gprs_sm_default_qos = { .delay_class = 4, /* best effort */ .reliab_class = GSM48_QOS_RC_LLC_UN_RLC_ACK_DATA_PROT, .peak_tput = GSM48_QOS_PEAK_TPUT_32000bps, @@ -209,13 +209,13 @@
/* qos_req.l is encoded as 1 (ARP byte) + N QoS profile bytes in GTP. * Mirror back the same QoS profile length the UE requested, capped at - * sizeof(default_qos) (14 bytes, covering up to R99/R7 QoS format). */ - uint8_t qos_len = sizeof(default_qos); + * sizeof(gprs_sm_default_qos) (14 bytes, covering up to R99/R7 QoS format). */ + uint8_t qos_len = sizeof(gprs_sm_default_qos); if (pdp->lib->qos_req.l > 1) qos_len = pdp->lib->qos_req.l - 1; - if (qos_len > sizeof(default_qos)) - qos_len = sizeof(default_qos); - msgb_lv_put(msg, qos_len, (uint8_t *)&default_qos); + if (qos_len > sizeof(gprs_sm_default_qos)) + qos_len = sizeof(gprs_sm_default_qos); + msgb_lv_put(msg, qos_len, (uint8_t *)&gprs_sm_default_qos);
/* Radio priority 10.5.7.2 */ msgb_v_put(msg, pdp->lib->radio_pri); diff --git a/src/sgsn/sgsn_vty.c b/src/sgsn/sgsn_vty.c index b4bfb2c..ff14589 100644 --- a/src/sgsn/sgsn_vty.c +++ b/src/sgsn/sgsn_vty.c @@ -66,6 +66,8 @@ #include <osmocom/sgsn/iu_client.h> #endif
+extern struct gsm48_qos gprs_sm_default_qos; + static struct sgsn_config *g_cfg = NULL;
const struct value_string sgsn_auth_pol_strs[] = { @@ -383,6 +385,28 @@ } else vty_out(vty, " no compression v42bis%s", VTY_NEWLINE);
+#define QOS_SM_DEFAULT_CMD "qos-sm default" +#define QOS_SM_DEFAULT_CMD_DOC \ + "QoS (Quality of Service) configuration for the GPRS SM layer\n" \ + "Default QoS parameters\n" + + /* QoS defaults */ + switch (gprs_sm_default_qos.max_sdu_size) { + case GSM48_QOS_MAXSDU_1502: + vty_out(vty, " " QOS_SM_DEFAULT_CMD " max-sdu-size 1502%s", VTY_NEWLINE); + break; + case GSM48_QOS_MAXSDU_1510: + vty_out(vty, " " QOS_SM_DEFAULT_CMD " max-sdu-size 1510%s", VTY_NEWLINE); + break; + case GSM48_QOS_MAXSDU_1520: + vty_out(vty, " " QOS_SM_DEFAULT_CMD " max-sdu-size 1520%s", VTY_NEWLINE); + break; + default: + vty_out(vty, " " QOS_SM_DEFAULT_CMD " max-sdu-size %u%s", + gprs_sm_default_qos.max_sdu_size * 10, VTY_NEWLINE); + break; + } + llist_for_each_entry(mme, &sgsn->mme_list, list) { config_write_mme(vty, mme, " "); } @@ -1622,6 +1646,49 @@ return CMD_SUCCESS; }
+DEFUN(cfg_qos_sm_default_max_sdu_size, + cfg_qos_sm_default_max_sdu_size_cmd, + QOS_SM_DEFAULT_CMD " max-sdu-size (<10-1500>)", + QOS_SM_DEFAULT_CMD_DOC + "Maximum SDU (Service Data Unit) size\n" + "SDU size (must be a multiple of 10)\n") +{ + int size = atoi(argv[0]); + + switch (size) { + case 1502: + gprs_sm_default_qos.max_sdu_size = GSM48_QOS_MAXSDU_1502; + break; + case 1510: + gprs_sm_default_qos.max_sdu_size = GSM48_QOS_MAXSDU_1510; + break; + case 1520: + gprs_sm_default_qos.max_sdu_size = GSM48_QOS_MAXSDU_1520; + break; + default: + if (size < 1 || size > 1500) + return CMD_WARNING; + if (size % 10 != 0) { + vty_out(vty, "%% SDU size in range 1..1500 " + "must be a multiple of 10%s", VTY_NEWLINE); + return CMD_WARNING; + } + gprs_sm_default_qos.max_sdu_size = size / 10; + break; + } + + return CMD_SUCCESS; +} + +ALIAS(cfg_qos_sm_default_max_sdu_size, + cfg_qos_sm_default_max_sdu_size_15xx_cmd, + QOS_SM_DEFAULT_CMD " max-sdu-size (1502|1510|1520)", + QOS_SM_DEFAULT_CMD_DOC + "Maximum SDU (Service Data Unit) size\n" + "1502 octets\n" + "1510 octets\n" + "1520 octets\n"); + #if BUILD_IU DEFUN(cfg_sgsn_cs7_instance_iu, cfg_sgsn_cs7_instance_iu_cmd, @@ -1896,6 +1963,9 @@ install_element(SGSN_NODE, &cfg_comp_v42bis_cmd); install_element(SGSN_NODE, &cfg_comp_v42bisp_cmd);
+ install_element(SGSN_NODE, &cfg_qos_sm_default_max_sdu_size_cmd); + install_element(SGSN_NODE, &cfg_qos_sm_default_max_sdu_size_15xx_cmd); + install_element(SGSN_NODE, &cfg_sgsn_mme_cmd); install_element(SGSN_NODE, &cfg_sgsn_no_mme_cmd); install_node(&mme_node, NULL); diff --git a/tests/osmo-sgsn_test-nodes.vty b/tests/osmo-sgsn_test-nodes.vty index 3b914c8..df2544b 100644 --- a/tests/osmo-sgsn_test-nodes.vty +++ b/tests/osmo-sgsn_test-nodes.vty @@ -65,6 +65,8 @@ no compression v42bis compression v42bis active direction (ms|sgsn|both) codewords <512-65535> strlen <6-250> compression v42bis passive + qos-sm default max-sdu-size (<10-1500>) + qos-sm default max-sdu-size (1502|1510|1520) ...
OsmoSGSN(config-sgsn)# mme test0 @@ -116,7 +118,7 @@ ... sgsn ... - no compression v42bis + qos-sm default max-sdu-size 1520 mme test1 gtp remote-ip 5.6.7.8 ...