dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/30630 )
Change subject: abis_rsl: signal HR GSM RTP format to BTS via RSL ......................................................................
abis_rsl: signal HR GSM RTP format to BTS via RSL
There are two RTP formats that can be used to transfer HR GSM audio (RFC 5339 and ETSI TS 101.318)
Change-Id: I16804364d95da9e1f5ac3b831c31079a7409e58d Related: OS#5688 --- M include/osmocom/bsc/bts.h M src/osmo-bsc/abis_rsl.c M src/osmo-bsc/bts_vty.c 3 files changed, 86 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/30/30630/1
diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index 1a84a0e..ed43138 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -326,6 +326,12 @@ struct gprs_rlc_cfg rlc_cfg; };
+enum hr_gsm_rtp_fmt { + RTP_FMT_NATIVE, + RTP_FMT_SPEECH_H_V1_TS101318, + RTP_FMT_SPEECH_H_V1_RFC5993, +}; + /* One BTS */ struct gsm_bts { /* list header in net->bts_list */ @@ -646,6 +652,9 @@ TOP_ACCH_CHAN_MODE_SPEECH_V3, /* Speech channels using AMR codec */ } top_acch_chan_mode;
+ /* Specifies which HR GSM format to use (RFC 5993 or ETSI TS 101.813) */ + enum hr_gsm_rtp_fmt hr_gsm_rtp_fmt; + /* MS/BS Power Control parameters */ struct gsm_power_ctrl_params ms_power_ctrl; struct gsm_power_ctrl_params bs_power_ctrl; diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c index bb1c5d6..864b42d 100644 --- a/src/osmo-bsc/abis_rsl.c +++ b/src/osmo-bsc/abis_rsl.c @@ -582,6 +582,33 @@ (void *)&bts->top_acch_cap); }
+/* indicate which RTP format to use for HR GSM, SPEECH V1 */ +static void put_hr_gsm_rtp_fmt_ie(const struct gsm_lchan *lchan, + const struct rsl_ie_chan_mode *cm, + struct msgb *msg) +{ + struct gsm_bts_trx *trx = lchan->ts->trx; + struct gsm_bts *bts = trx->bts; + uint8_t val[1]; + + /* This setting is only applicable for cassic SPEECH V1 in HR mode */ + if (cm->chan_rate != RSL_CMOD_SP_GSM1 || lchan->type != GSM_LCHAN_TCH_H) + return; + + switch (bts->hr_gsm_rtp_fmt) { + case RTP_FMT_SPEECH_H_V1_TS101318: + val[0] = 0x00; + break; + case RTP_FMT_SPEECH_H_V1_RFC5993: + val[0] = 0x01; + break; + default: + return; + } + + msgb_tlv_put(msg, RSL_IE_OSMO_HR_GSM_RTP_FMT, sizeof(val), val); +} + /* Write RSL_IE_OSMO_TRAINING_SEQUENCE to msgb. The tsc_set argument's range is 1-4, tsc argument range is 0-7. */ static void put_osmo_training_sequence_ie(struct msgb *msg, uint8_t tsc_set, uint8_t tsc) { @@ -716,6 +743,7 @@
put_rep_acch_cap_ie(lchan, msg); put_top_acch_cap_ie(lchan, &cm, msg); + put_hr_gsm_rtp_fmt_ie(lchan, &cm, msg);
/* Selecting a specific TSC Set is only applicable to VAMOS mode */ if (lchan->activate.info.vamos && lchan->activate.tsc_set >= 1) @@ -788,6 +816,7 @@
put_rep_acch_cap_ie(lchan, msg); put_top_acch_cap_ie(lchan, &cm, msg); + put_hr_gsm_rtp_fmt_ie(lchan, &cm, msg);
/* Selecting a specific TSC Set is only applicable to VAMOS mode. Send this Osmocom specific IE only to OsmoBTS * types. */ diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c index 50e49b8..89665b1 100644 --- a/src/osmo-bsc/bts_vty.c +++ b/src/osmo-bsc/bts_vty.c @@ -984,6 +984,45 @@ return CMD_SUCCESS; }
+DEFUN_USRATTR(cfg_bts_hr_gsm_rtp, + cfg_bts_hr_gsm_rtp_cmd, + X(BSC_VTY_ATTR_NEW_LCHAN), + "hr-gsm-rtp (rfc5993|ts101318)", + "Set RTP payload format for HR GSM\n" + "Payload as specified by RFC 5993 (with TOC header byte)\n" + "Payload as specified by TS 101.318 (TIPHON)\n") +{ + struct gsm_bts *bts = vty->index; + + if (bts->model->type != GSM_BTS_TYPE_OSMOBTS) { + vty_out(vty, "%% HR GSM format selection is not supported by BTS %u%s", + bts->nr, VTY_NEWLINE); + return CMD_WARNING; + } + + if (!strcmp(argv[0], "rfc5993")) + bts->hr_gsm_rtp_fmt = RTP_FMT_SPEECH_H_V1_RFC5993; + else if (!strcmp(argv[0], "ts101318")) + bts->hr_gsm_rtp_fmt = RTP_FMT_SPEECH_H_V1_TS101318; + else + return CMD_WARNING; + + return CMD_SUCCESS; +} + +DEFUN_USRATTR(cfg_bts_no_hr_gsm_rtp, + cfg_bts_no_hr_gsm_rtp_cmd, + X(BSC_VTY_ATTR_NEW_LCHAN), + "no hr-gsm-rtp", + "Disable HR GSM RTP payload format setting)\n") +{ + struct gsm_bts *bts = vty->index; + + bts->hr_gsm_rtp_fmt = RTP_FMT_NATIVE; + + return CMD_SUCCESS; +} + #define CD_STR "Channel Description\n"
DEFUN_USRATTR(cfg_bts_chan_desc_att, @@ -4660,6 +4699,13 @@ || bts->rep_acch_cap.dl_facch_cmd) vty_out(vty, " repeat rxqual %u%s", bts->rep_acch_cap.rxqual, VTY_NEWLINE);
+ if (bts->hr_gsm_rtp_fmt != RTP_FMT_NATIVE) { + if (bts->hr_gsm_rtp_fmt == RTP_FMT_SPEECH_H_V1_RFC5993) + vty_out(vty, " hr-gsm-rtp rfc5993%s", VTY_NEWLINE); + if (bts->hr_gsm_rtp_fmt == RTP_FMT_SPEECH_H_V1_TS101318) + vty_out(vty, " hr-gsm-rtp ts101318%s", VTY_NEWLINE); + } + if (bts->interf_meas_params_cfg.avg_period != interf_meas_params_def.avg_period) { vty_out(vty, " interference-meas avg-period %u%s", bts->interf_meas_params_cfg.avg_period, @@ -4876,6 +4922,8 @@ install_element(BTS_NODE, &cfg_bts_top_no_dl_acch_cmd); install_element(BTS_NODE, &cfg_bts_top_dl_acch_rxqual_cmd); install_element(BTS_NODE, &cfg_bts_top_dl_acch_chan_mode_cmd); + install_element(BTS_NODE, &cfg_bts_hr_gsm_rtp_cmd); + install_element(BTS_NODE, &cfg_bts_no_hr_gsm_rtp_cmd); install_element(BTS_NODE, &cfg_bts_interf_meas_avg_period_cmd); install_element(BTS_NODE, &cfg_bts_interf_meas_level_bounds_cmd); install_element(BTS_NODE, &cfg_bts_srvcc_fast_return_cmd);