<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13082">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">AMR: Add option to convert between bw-effient and octet aligned mode<br><br>RFC3267 specifies two framing modes for AMR packets. An octet aligned<br>mode is specified where all fields of the AMR packets are aligned to<br>octet boundaries. The second framing mode is the bandwith efficient mode<br>where the fields are directly packed one after another.<br><br>Which format is used is usually communicated by out of band means,<br>however it is still possible to distinguish the framing mode by looking<br>at the frame. Once the framing mode is distinguished, the packet can be<br>converted into the opposite framing mode.<br><br>- Add new VTY rtp-patch options<br>- Add conversion function<br><br>Change-Id: Id46a3622a6b1995d5fce4bc611d409bcb4aef13b<br>Depends: libosmo-netif I5b5a0fa644d8dbb1f04f9d7e35312683c7b3d196<br>Related: OS#3807<br>---<br>M include/osmocom/mgcp/mgcp.h<br>M include/osmocom/mgcp/mgcp_internal.h<br>M src/libosmo-mgcp/mgcp_network.c<br>M src/libosmo-mgcp/mgcp_protocol.c<br>M src/libosmo-mgcp/mgcp_vty.c<br>5 files changed, 82 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/82/13082/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/mgcp/mgcp.h b/include/osmocom/mgcp/mgcp.h</span><br><span>index 5886a65..4c5ec7d 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp.h</span><br><span>@@ -191,6 +191,7 @@</span><br><span>         int force_constant_ssrc; /* 0: don't, 1: once */</span><br><span>         int force_aligned_timing;</span><br><span>    bool rfc5993_hr_convert;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool amr_oa_bwe_convert;</span><br><span> </span><br><span>         /* spec handling */</span><br><span>  int force_realloc;</span><br><span>diff --git a/include/osmocom/mgcp/mgcp_internal.h b/include/osmocom/mgcp/mgcp_internal.h</span><br><span>index a6239c2..c82c5e1 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_internal.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_internal.h</span><br><span>@@ -129,6 +129,7 @@</span><br><span>        /* should we perform align_rtp_timestamp_offset() (1) or not (0) */</span><br><span>  int force_aligned_timing;</span><br><span>    bool rfc5993_hr_convert;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool amr_oa_bwe_convert;</span><br><span> </span><br><span>         /* Each end has a separate socket for RTP and RTCP */</span><br><span>        struct osmo_fd rtp;</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_network.c b/src/libosmo-mgcp/mgcp_network.c</span><br><span>index 33738bc..ce9949f 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_network.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_network.c</span><br><span>@@ -34,6 +34,7 @@</span><br><span> #include <osmocom/core/socket.h></span><br><span> #include <osmocom/core/byteswap.h></span><br><span> #include <osmocom/netif/rtp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/netif/amr.h></span><br><span> #include <osmocom/mgcp/mgcp.h></span><br><span> #include <osmocom/mgcp/mgcp_common.h></span><br><span> #include <osmocom/mgcp/mgcp_internal.h></span><br><span>@@ -686,6 +687,40 @@</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* For AMR RTP two framing modes are defined RFC3267. There is a bandwith</span><br><span style="color: hsl(120, 100%, 40%);">+ * efficient encoding scheme where all fields are packed together one after</span><br><span style="color: hsl(120, 100%, 40%);">+ * another and an octet aligned mode where all fields are aligned to octet</span><br><span style="color: hsl(120, 100%, 40%);">+ * boundaries. This function is used to convert between the two modes */</span><br><span style="color: hsl(120, 100%, 40%);">+static void amr_oa_bwe_convert(struct mgcp_endpoint *endp, char *data, int *len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* NOTE: *data has an overall length of RTP_BUF_SIZE, so there is</span><br><span style="color: hsl(120, 100%, 40%);">+      * plenty of space available to store the slightly larger, converted</span><br><span style="color: hsl(120, 100%, 40%);">+   * data */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  struct rtp_hdr *rtp_hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int payload_len;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(*len >= sizeof(struct rtp_hdr));</span><br><span style="color: hsl(120, 100%, 40%);">+       rtp_hdr = (struct rtp_hdr *)data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   payload_len = *len - sizeof(struct rtp_hdr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (osmo_amr_is_oa(rtp_hdr->data, payload_len))</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = osmo_amr_oa_to_bwe(rtp_hdr->data, payload_len);</span><br><span style="color: hsl(120, 100%, 40%);">+       else</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = osmo_amr_bwe_to_oa(rtp_hdr->data, payload_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DRTP, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "endpoint:0x%x AMR RTP packet conversion failed\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 ENDPOINT_NUMBER(endp));</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   *len = rc + sizeof(struct rtp_hdr);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Forward data to a debug tap. This is debug function that is intended for</span><br><span>  * debugging the voice traffic with tools like gstreamer */</span><br><span> static void forward_data(int fd, struct mgcp_rtp_tap *tap, const char *buf,</span><br><span>@@ -799,6 +834,11 @@</span><br><span>                                       "GSM-HR-08") == 0)</span><br><span>                           rfc5993_hr_convert(endp, buf, &buflen);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                       else if (rtp_end->amr_oa_bwe_convert</span><br><span style="color: hsl(120, 100%, 40%);">+                           && strcmp(conn_src->end.codec->subtype_name,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "AMR") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                          amr_oa_bwe_convert(endp, buf, &buflen);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                        LOGP(DRTP, LOGL_DEBUG,</span><br><span>                            "endpoint:0x%x process/send to %s %s "</span><br><span>                             "rtp_port:%u rtcp_port:%u\n",</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>index 82db02f..77f75de 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>@@ -653,6 +653,7 @@</span><br><span>      rtp->force_aligned_timing = tcfg->force_aligned_timing;</span><br><span>        rtp->force_constant_ssrc = patch_ssrc ? 1 : 0;</span><br><span>    rtp->rfc5993_hr_convert = tcfg->rfc5993_hr_convert;</span><br><span style="color: hsl(120, 100%, 40%);">+     rtp->amr_oa_bwe_convert = tcfg->amr_oa_bwe_convert;</span><br><span> </span><br><span>        LOGP(DLMGCP, LOGL_DEBUG,</span><br><span>          "Configuring RTP endpoint: local port %d%s%s\n",</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_vty.c b/src/libosmo-mgcp/mgcp_vty.c</span><br><span>index a47376b..803853e 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_vty.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_vty.c</span><br><span>@@ -38,6 +38,7 @@</span><br><span> #define RTP_PATCH_STR "Modify RTP packet header in both directions\n"</span><br><span> #define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"</span><br><span> #define RTP_TS101318_RFC5993_CONV_STR "Convert GSM-HR from TS101318 to RFC5993 and vice versa\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define RTP_AMR_OA_BWE_CONV_STR "Convert AMR from octet-aligned to bandwith-efficient mode and vice versa\n"</span><br><span> </span><br><span> </span><br><span> static struct mgcp_config *g_cfg = NULL;</span><br><span>@@ -744,6 +745,22 @@</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_mgcp_patch_rtp_amr_oa_bwe,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_mgcp_patch_rtp_amr_oa_bwe_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "rtp-patch amr-oa-bwe", RTP_PATCH_STR RTP_AMR_OA_BWE_CONV_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       g_cfg->trunk.amr_oa_bwe_convert = true;</span><br><span style="color: hsl(120, 100%, 40%);">+    return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_mgcp_no_patch_rtp_amr_oa_bwe,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_mgcp_no_patch_rtp_amr_oa_bwe_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "no rtp-patch amr-oa-bwe", NO_STR RTP_PATCH_STR RTP_AMR_OA_BWE_CONV_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   g_cfg->trunk.amr_oa_bwe_convert = false;</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_mgcp_no_patch_rtp,</span><br><span>       cfg_mgcp_no_patch_rtp_cmd, "no rtp-patch", NO_STR RTP_PATCH_STR)</span><br><span> {</span><br><span>@@ -1040,6 +1057,24 @@</span><br><span>   return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_trunk_patch_rtp_amr_oa_bwe,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_trunk_patch_rtp_amr_oa_bwe_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "rtp-patch amr-oa-bwe", RTP_PATCH_STR RTP_AMR_OA_BWE_CONV_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct mgcp_trunk_config *trunk = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->amr_oa_bwe_convert = true;</span><br><span style="color: hsl(120, 100%, 40%);">+  return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_trunk_no_patch_rtp_amr_oa_bwe,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_trunk_no_patch_rtp_amr_oa_bwe_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "no rtp-patch amr-oa-bwe", NO_STR RTP_PATCH_STR RTP_AMR_OA_BWE_CONV_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_trunk_config *trunk = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->amr_oa_bwe_convert = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_trunk_no_patch_rtp,</span><br><span>       cfg_trunk_no_patch_rtp_cmd, "no rtp-patch", NO_STR RTP_PATCH_STR)</span><br><span> {</span><br><span>@@ -1448,6 +1483,8 @@</span><br><span>  install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);</span><br><span>  install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_rfc5993hr_cmd);</span><br><span>   install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_rfc5993hr_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_amr_oa_bwe_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_amr_oa_bwe_cmd);</span><br><span>       install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);</span><br><span>        install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);</span><br><span>        install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);</span><br><span>@@ -1481,6 +1518,8 @@</span><br><span>     install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);</span><br><span>        install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_rfc5993hr_cmd);</span><br><span>         install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_rfc5993hr_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_amr_oa_bwe_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_amr_oa_bwe_cmd);</span><br><span>     install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);</span><br><span>     install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);</span><br><span>        install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13082">change 13082</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13082"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-mgw </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Id46a3622a6b1995d5fce4bc611d409bcb4aef13b </div>
<div style="display:none"> Gerrit-Change-Number: 13082 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>