fixeria submitted this change.
2 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.
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(-)
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
...
To view, visit change 40822. To unsubscribe, or for help writing mail filters, visit settings.