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