laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/41630?usp=email )
Change subject: MGW control: migrate to new API for codecs and payload types ......................................................................
MGW control: migrate to new API for codecs and payload types
struct mgcp_conn_peer in libosmo-mgcp-client API used to have a mandatory codecs[] array for codec specification and an optional ptmap[] array to be used only when the default payload type needs to be overridden. But now the codecs[] array is deprecated, and new API features (see following patches) require the use of ptmap[] array, with mandatory specification of payload type by the MGCP client. Convert osmo-bsc to this new API.
Change-Id: Iafc38a3da64ce7c2f060a32864174dcde9f57b56 --- M src/osmo-bsc/lchan_rtp_fsm.c 1 file changed, 59 insertions(+), 17 deletions(-)
Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved fixeria: Looks good to me, but someone else must approve
diff --git a/src/osmo-bsc/lchan_rtp_fsm.c b/src/osmo-bsc/lchan_rtp_fsm.c index 559a30b..c348833 100644 --- a/src/osmo-bsc/lchan_rtp_fsm.c +++ b/src/osmo-bsc/lchan_rtp_fsm.c @@ -21,6 +21,7 @@ */
#include <osmocom/core/fsm.h> +#include <osmocom/gsm/protocol/gsm_48_103.h> #include <osmocom/gsm/rtp_extensions.h> #include <osmocom/netif/rtp.h> #include <osmocom/mgcp_client/mgcp_client_endpoint_fsm.h> @@ -894,9 +895,36 @@ } }
+static int chan_mode_to_mgcp_aoip_pt(enum mgcp_codecs codec) +{ + switch (codec) { + case CODEC_GSM_8000_1: + return OSMO_AOIP_RTP_PT_FR1; + + case CODEC_GSMEFR_8000_1: + return OSMO_AOIP_RTP_PT_EFR; + + case CODEC_GSMHR_8000_1: + return OSMO_AOIP_RTP_PT_HR1; + + case CODEC_AMR_8000_1: + return OSMO_AOIP_RTP_PT_AMR; + + case CODEC_CLEARMODE: + return OSMO_AOIP_RTP_PT_CSD; + + default: + /* Error: unknown codec */ + return -1; + } +} + static int chan_mode_to_mgcp_bss_pt(enum mgcp_codecs codec) { switch (codec) { + case CODEC_GSM_8000_1: + return RTP_PT_GSM_FULL; + case CODEC_GSMHR_8000_1: return RTP_PT_GSM_HALF;
@@ -906,9 +934,11 @@ case CODEC_AMR_8000_1: return RTP_PT_AMR;
+ case CODEC_CLEARMODE: + return RTP_PT_CSDATA; + default: - /* Not an error, we just leave it to libosmo-mgcp-client to - * decide over the PT. */ + /* Error: unknown codec */ return -1; } } @@ -917,34 +947,46 @@ { enum mgcp_codecs codec = chan_mode_to_mgcp_codec(lchan->activate.ch_mode_rate.chan_mode, lchan->type == GSM_LCHAN_TCH_H? false : true); - int custom_pt; + int pt;
if (codec < 0) { LOG_LCHAN(lchan, LOGL_ERROR, "Unable to determine MGCP codec type for %s in chan-mode %s\n", gsm_chan_t_name(lchan->type), gsm48_chan_mode_name(lchan->activate.ch_mode_rate.chan_mode)); - verb_info->codecs_len = 0; + verb_info->ptmap_len = 0; return; }
- verb_info->codecs[0] = codec; - verb_info->codecs_len = 1; - - /* Setup custom payload types (only for BSS side and when required) */ - custom_pt = chan_mode_to_mgcp_bss_pt(codec); - if (bss_side && custom_pt > 0) { - verb_info->ptmap[0].codec = codec; - verb_info->ptmap[0].pt = custom_pt; - verb_info->ptmap_len = 1; + /* The new libosmo-mgcp-client API requires us to provide explicit + * payload type number for every codec - no more internal defaulting. + * Legacy payload types used on IPA/Osmocom Abis-IP are defined in + * <osmocom/netif/rtp.h> as RTP_PT_*, new TS 48.103 (AoIP user plane) + * payload types are defined in <osmocom/gsm/protocol/gsm_48_103.h> + * as OSMO_AOIP_RTP_PT_*. + */ + if (bss_side) + pt = chan_mode_to_mgcp_bss_pt(codec); + else + pt = chan_mode_to_mgcp_aoip_pt(codec); + if (pt < 0) { + LOG_LCHAN(lchan, LOGL_ERROR, + "Unable to determine RTP payload type for %s in chan-mode %s\n", + gsm_chan_t_name(lchan->type), gsm48_chan_mode_name(lchan->activate.ch_mode_rate.chan_mode)); + verb_info->ptmap_len = 0; + return; }
+ verb_info->ptmap[0].codec = codec; + verb_info->ptmap[0].pt = pt; + verb_info->ptmap_len = 1; + /* AMR requires additional parameters to be set up (framing mode) */ - if (verb_info->codecs[0] == CODEC_AMR_8000_1) { + if (codec == CODEC_AMR_8000_1) { verb_info->param_present = true; verb_info->param.amr_octet_aligned_present = true; }
- if (bss_side && verb_info->codecs[0] == CODEC_AMR_8000_1) { + if (bss_side && codec == CODEC_AMR_8000_1) { /* FIXME: At the moment all BTSs we support are using the * octet-aligned payload format. However, in the future * we may support BTSs that are using bandwidth-efficient @@ -952,7 +994,7 @@ * that distinguishes by the BTS model which mode to use. */ verb_info->param.amr_octet_aligned = true; } - else if (!bss_side && verb_info->codecs[0] == CODEC_AMR_8000_1) { + else if (!bss_side && codec == CODEC_AMR_8000_1) { verb_info->param.amr_octet_aligned = lchan->conn->sccp.msc->amr_octet_aligned; }
@@ -988,5 +1030,5 @@
bool mgcp_codec_is_picked(const struct mgcp_conn_peer *verb_info, enum mgcp_codecs codec) { - return verb_info->codecs[0] == codec; + return verb_info->ptmap[0].codec == codec; }