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