pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-mgw/+/29867 )


Change subject: osmux: Make sure RTP AMR feed to osmux is in octet-aligned mode
......................................................................

osmux: Make sure RTP AMR feed to osmux is in octet-aligned mode

The Osmux implementation in libosmo-netif expects to work with RTP AMR
in octet-aligned mode. Therefore, if the peer connection received RTP
AMR in bandwidth-efficient mode, we need to convert it to octet-aligned
before feeding the packets to the osmux layer.

Related: SYS#6161
Change-Id: Ifeec44241079f7a31da12745c92bfdc4fb222f3a
---
M include/osmocom/mgcp/mgcp_network.h
M include/osmocom/mgcp/osmux.h
M src/libosmo-mgcp/mgcp_network.c
M src/libosmo-mgcp/mgcp_osmux.c
4 files changed, 20 insertions(+), 11 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/67/29867/1

diff --git a/include/osmocom/mgcp/mgcp_network.h 
b/include/osmocom/mgcp/mgcp_network.h
index a3d57f0..e95907d 100644
--- a/include/osmocom/mgcp/mgcp_network.h
+++ b/include/osmocom/mgcp/mgcp_network.h
@@ -183,3 +183,5 @@
                                 int id);
 void forward_data_tap(int fd, struct mgcp_rtp_tap *tap, struct msgb *msg);
 uint32_t mgcp_get_current_ts(unsigned codec_rate);
+
+int amr_oa_bwe_convert(struct mgcp_endpoint *endp, struct msgb *msg, bool 
target_is_oa);
diff --git a/include/osmocom/mgcp/osmux.h b/include/osmocom/mgcp/osmux.h
index 044a33f..4ea6da7 100644
--- a/include/osmocom/mgcp/osmux.h
+++ b/include/osmocom/mgcp/osmux.h
@@ -15,7 +15,7 @@
 int conn_osmux_enable(struct mgcp_conn_rtp *conn);
 void conn_osmux_disable(struct mgcp_conn_rtp *conn);
 int conn_osmux_event_rx_crcx_mdcx(struct mgcp_conn_rtp *conn);
-int osmux_xfrm_to_osmux(char *buf, int buf_len, struct mgcp_conn_rtp *conn);
+int conn_osmux_send_rtp(struct mgcp_conn_rtp *conn, struct msgb *msg);
 int osmux_send_dummy(struct mgcp_conn_rtp *conn);

 void osmux_cid_pool_get(uint8_t osmux_cid);
diff --git a/src/libosmo-mgcp/mgcp_network.c b/src/libosmo-mgcp/mgcp_network.c
index 960b496..b4599f2 100644
--- a/src/libosmo-mgcp/mgcp_network.c
+++ b/src/libosmo-mgcp/mgcp_network.c
@@ -721,7 +721,7 @@
  * efficient encoding scheme where all fields are packed together one after
  * another and an octet aligned mode where all fields are aligned to octet
  * boundaries. This function is used to convert between the two modes */
-static int amr_oa_bwe_convert(struct mgcp_endpoint *endp, struct msgb *msg,
+int amr_oa_bwe_convert(struct mgcp_endpoint *endp, struct msgb *msg,
                              bool target_is_oa)
 {
        /* NOTE: the msgb has an allocated length of RTP_BUF_SIZE, so there is
@@ -1013,7 +1013,7 @@
                LOGPENDP(endp, DRTP, LOGL_DEBUG,
                         "endpoint type is MGCP_RTP_OSMUX, "
                         "using osmux_xfrm_to_osmux() to forward data through 
OSMUX\n");
-               return osmux_xfrm_to_osmux((char*)msgb_data(msg), 
msgb_length(msg), conn_dst);
+               return conn_osmux_send_rtp(conn_dst, msg);
        case MGCP_RTP_IUUP:
                if (proto == MGCP_PROTO_RTP) {
                        LOGPENDP(endp, DRTP, LOGL_DEBUG,
diff --git a/src/libosmo-mgcp/mgcp_osmux.c b/src/libosmo-mgcp/mgcp_osmux.c
index 0fd1ba7..4e58452 100644
--- a/src/libosmo-mgcp/mgcp_osmux.c
+++ b/src/libosmo-mgcp/mgcp_osmux.c
@@ -205,10 +205,10 @@
  *  \param[in] buf_len length of rtp data
  *  \param[in] conn associated RTP connection
  *  \returns 0 on success, -1 on ERROR */
-int osmux_xfrm_to_osmux(char *buf, int buf_len, struct mgcp_conn_rtp *conn)
+int conn_osmux_send_rtp(struct mgcp_conn_rtp *conn, struct msgb *msg)
 {
        int ret;
-       struct msgb *msg;
+       struct msgb *msg2;

        if (!conn->end.output_enabled) {
                rtpconn_osmux_rate_ctr_inc(conn, 
OSMUX_RTP_PACKETS_TX_DROPPED_CTR);
@@ -222,14 +222,21 @@
                return -1;
        }

-       msg = msgb_alloc(4096, "RTP");
-       if (!msg)
+       /* msg is not owned by us and will be freed by the caller stack upon 
return: */
+       msg2 = msgb_alloc(4096, "RTP");
+       if (!msg2)
                return -1;
+       memcpy(msg2->data, (char*)msgb_data(msg), msgb_length(msg));
+       msgb_put(msg2, msgb_length(msg));

-       memcpy(msg->data, buf, buf_len);
-       msgb_put(msg, buf_len);
+       /* Osmux implementation works with AMR OA only, make sure we convert to 
it if needed: */
+       if (amr_oa_bwe_convert(conn->conn->endp, msg2, true) < 0) {
+               LOGPCONN(conn->conn, DOSMUX, LOGL_ERROR,
+                        "Error converting to AMR octet-aligned mode\n");
+               return -1;
+       }

-       while ((ret = osmux_xfrm_input(conn->osmux.in, msg, 
conn->osmux.remote_cid)) > 0) {
+       while ((ret = osmux_xfrm_input(conn->osmux.in, msg2, 
conn->osmux.remote_cid)) > 0) {
                /* batch full, build and deliver it */
                osmux_xfrm_input_deliver(conn->osmux.in);
        }
@@ -237,7 +244,7 @@
                rtpconn_osmux_rate_ctr_inc(conn, 
OSMUX_RTP_PACKETS_TX_DROPPED_CTR);
        } else {
                rtpconn_osmux_rate_ctr_inc(conn, OSMUX_RTP_PACKETS_TX_CTR);
-               rtpconn_osmux_rate_ctr_add(conn, OSMUX_AMR_OCTETS_TX_CTR, 
buf_len - sizeof(struct rtp_hdr));
+               rtpconn_osmux_rate_ctr_add(conn, OSMUX_AMR_OCTETS_TX_CTR, 
msgb_length(msg2) - sizeof(struct rtp_hdr));
        }
        return 0;
 }

--
To view, visit https://gerrit.osmocom.org/c/osmo-mgw/+/29867
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-mgw
Gerrit-Branch: master
Gerrit-Change-Id: Ifeec44241079f7a31da12745c92bfdc4fb222f3a
Gerrit-Change-Number: 29867
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pes...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to