falconia has uploaded this change for review. ( 
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(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/30/41630/1

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;
 }

--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/41630?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: Iafc38a3da64ce7c2f060a32864174dcde9f57b56
Gerrit-Change-Number: 41630
Gerrit-PatchSet: 1
Gerrit-Owner: falconia <[email protected]>

Reply via email to