<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/14036">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmux: Redo read/write osmux glue code to have data routed correctly<br><br>Remove old BTS/NET no longer in use and meaningless. Use new osmo-mgw<br>APIs to inject payload RTP<->Osmux on the correct socket and conn.<br><br>Change-Id: I60b6ba3ffdc74efff945ba13a0b736798bdf5d8c<br>---<br>M src/libosmo-mgcp/mgcp_osmux.c<br>1 file changed, 78 insertions(+), 208 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/36/14036/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libosmo-mgcp/mgcp_osmux.c b/src/libosmo-mgcp/mgcp_osmux.c</span><br><span>index 536b65b..7a817f8 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_osmux.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_osmux.c</span><br><span>@@ -178,6 +178,12 @@</span><br><span> memcpy(msg->data, buf, buf_len);</span><br><span> msgb_put(msg, buf_len);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (conn->osmux.state != OSMUX_STATE_ENABLED) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPCONN(conn->conn, DLMGCP, LOGL_INFO, "forwarding RTP to Osmux conn not yet enabled, dropping (cid=%d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ conn->osmux.cid);</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> while ((ret = osmux_xfrm_input(conn->osmux.in, msg, conn->osmux.cid)) > 0) {</span><br><span> /* batch full, build and deliver it */</span><br><span> osmux_xfrm_input_deliver(conn->osmux.in);</span><br><span>@@ -186,111 +192,54 @@</span><br><span> }</span><br><span> </span><br><span> /* Lookup the endpoint that corresponds to the specified address (port) */</span><br><span style="color: hsl(0, 100%, 40%);">-static struct mgcp_endpoint *</span><br><span style="color: hsl(0, 100%, 40%);">-endpoint_lookup(struct mgcp_config *cfg, int cid,</span><br><span style="color: hsl(0, 100%, 40%);">- struct in_addr *from_addr, int type)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct mgcp_conn_rtp*</span><br><span style="color: hsl(120, 100%, 40%);">+osmux_conn_lookup(struct mgcp_config *cfg, uint8_t cid,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct in_addr *from_addr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_endpoint *endp = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_endpoint *endp;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_conn *conn = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_conn_rtp * conn_rtp;</span><br><span> int i;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn_net = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn_bts = NULL;</span><br><span> </span><br><span> for (i=0; i<cfg->trunk.number_endpoints; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct in_addr *this;</span><br><span> </span><br><span> endp = &cfg->trunk.endpoints[i];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if 0</span><br><span style="color: hsl(0, 100%, 40%);">- if (!tmp->allocated)</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(conn, &endp->conns, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (conn->type != MGCP_CONN_TYPE_RTP)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- switch(type) {</span><br><span style="color: hsl(0, 100%, 40%);">- case MGCP_DEST_NET:</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of CONN_ID_XXX! */</span><br><span style="color: hsl(0, 100%, 40%);">- conn_net = mgcp_conn_get_rtp(endp, CONN_ID_NET);</span><br><span style="color: hsl(0, 100%, 40%);">- if (conn_net)</span><br><span style="color: hsl(0, 100%, 40%);">- this = &conn_net->end.addr;</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- this = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case MGCP_DEST_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of CONN_ID_XXX! */</span><br><span style="color: hsl(0, 100%, 40%);">- conn_bts = mgcp_conn_get_rtp(endp, CONN_ID_BTS);</span><br><span style="color: hsl(0, 100%, 40%);">- if (conn_bts)</span><br><span style="color: hsl(0, 100%, 40%);">- this = &conn_bts->end.addr;</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- this = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- /* Should not ever happen */</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLMGCP, LOGL_ERROR, "Bad type %d. Fix your code.\n", type);</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_rtp = &conn->u.rtp;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!mgcp_conn_rtp_is_osmux(conn_rtp))</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (conn_rtp->osmux.cid == cid)</span><br><span style="color: hsl(120, 100%, 40%);">+ return conn_rtp;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of CONN_ID_XXX! */</span><br><span style="color: hsl(0, 100%, 40%);">- conn_net = mgcp_conn_get_rtp(endp, CONN_ID_NET);</span><br><span style="color: hsl(0, 100%, 40%);">- if (conn_net && this && conn_net->osmux.cid == cid</span><br><span style="color: hsl(0, 100%, 40%);">- && this->s_addr == from_addr->s_addr)</span><br><span style="color: hsl(0, 100%, 40%);">- return endp;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLMGCP, LOGL_ERROR, "Cannot find endpoint with cid=%d\n", cid);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DLMGCP, LOGL_ERROR, "Cannot find osmux conn with cid=%d\n", cid);</span><br><span> </span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void scheduled_tx_net_cb(struct msgb *msg, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: this is declared and used in mgcp_network.c, but documentation of mgcp_dispatch_rtp_bridge_cb() states another enum is to be used */</span><br><span style="color: hsl(120, 100%, 40%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP_PROTO_RTP,</span><br><span style="color: hsl(120, 100%, 40%);">+ MGCP_PROTO_RTCP,</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%);">+static void scheduled_from_osmux_tx_rtp_cb(struct msgb *msg, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_endpoint *endp = data;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn_net = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn_bts = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of CONN_ID_XXX! */</span><br><span style="color: hsl(0, 100%, 40%);">- conn_bts = mgcp_conn_get_rtp(endp, CONN_ID_BTS);</span><br><span style="color: hsl(0, 100%, 40%);">- conn_net = mgcp_conn_get_rtp(endp, CONN_ID_NET);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!conn_bts || !conn_net)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_conn_rtp *conn = data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_endpoint *endp = conn->conn->endp;</span><br><span> struct sockaddr_in addr = {</span><br><span style="color: hsl(0, 100%, 40%);">- .sin_addr = conn_net->end.addr,</span><br><span style="color: hsl(0, 100%, 40%);">- .sin_port = conn_net->end.rtp_port,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(120, 100%, 40%);">+ .sin_addr = conn->end.addr,</span><br><span style="color: hsl(120, 100%, 40%);">+ .sin_port = conn->end.rtp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+ }; /* FIXME: not set/used in cb */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_inc(&conn_bts->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR]);</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_add(&conn_bts->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR], msg->len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Send RTP data to NET */</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of conn_bts and conn_net! */</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_send(endp, 1, &addr, (char *)msg->data, msg->len,</span><br><span style="color: hsl(0, 100%, 40%);">- conn_bts, conn_net);</span><br><span style="color: hsl(0, 100%, 40%);">- msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void scheduled_tx_bts_cb(struct msgb *msg, void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_endpoint *endp = data;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn_net = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn_bts = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of CONN_ID_XXX! */</span><br><span style="color: hsl(0, 100%, 40%);">- conn_bts = mgcp_conn_get_rtp(endp, CONN_ID_BTS);</span><br><span style="color: hsl(0, 100%, 40%);">- conn_net = mgcp_conn_get_rtp(endp, CONN_ID_NET);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!conn_bts || !conn_net)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct sockaddr_in addr = {</span><br><span style="color: hsl(0, 100%, 40%);">- .sin_addr = conn_bts->end.addr,</span><br><span style="color: hsl(0, 100%, 40%);">- .sin_port = conn_bts->end.rtp_port,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_inc(&conn_net->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR]);</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_add(&conn_net->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR], msg->len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Send RTP data to BTS */</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of conn_bts and conn_net! */</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_send(endp, 1, &addr, (char *)msg->data, msg->len,</span><br><span style="color: hsl(0, 100%, 40%);">- conn_net, conn_bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ endp->type->dispatch_rtp_cb(MGCP_PROTO_RTP, &addr, (char *)msg->data, msg->len, conn->conn);</span><br><span> msgb_free(msg);</span><br><span> }</span><br><span> </span><br><span>@@ -361,16 +310,40 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* This is called from the bsc-nat */</span><br><span style="color: hsl(120, 100%, 40%);">+static int osmux_handle_dummy(struct mgcp_config *cfg, struct sockaddr_in *addr,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t osmux_cid;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_conn_rtp *conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (osmux_legacy_dummy_parse_cid(addr, msg, &osmux_cid) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ goto out;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ conn = osmux_conn_lookup(cfg, osmux_cid, &addr->sin_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!conn) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Cannot find conn for Osmux CID %d\n", osmux_cid);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto out;</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%);">+ endp_osmux_state_check(conn->conn->endp, conn, false);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Only needed to punch hole in firewall, it can be dropped */</span><br><span style="color: hsl(120, 100%, 40%);">+out:</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define osmux_chunk_length(msg, rem) (rem - msg->len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int osmux_read_from_bsc_nat_cb(struct osmo_fd *ofd, unsigned int what)</span><br><span style="color: hsl(120, 100%, 40%);">+static int osmux_read_fd_cb(struct osmo_fd *ofd, unsigned int what)</span><br><span> {</span><br><span> struct msgb *msg;</span><br><span> struct osmux_hdr *osmuxh;</span><br><span> struct sockaddr_in addr;</span><br><span> struct mgcp_config *cfg = ofd->data;</span><br><span> uint32_t rem;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn_bts = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_conn_rtp *conn_src;</span><br><span> </span><br><span> msg = osmux_recv(ofd, &addr);</span><br><span> if (!msg)</span><br><span>@@ -384,115 +357,32 @@</span><br><span> </span><br><span> /* not any further processing dummy messages */</span><br><span> if (msg->data[0] == MGCP_DUMMY_LOAD)</span><br><span style="color: hsl(0, 100%, 40%);">- goto out;</span><br><span style="color: hsl(120, 100%, 40%);">+ return osmux_handle_dummy(cfg, &addr, msg);</span><br><span> </span><br><span> rem = msg->len;</span><br><span> while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_endpoint *endp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Yes, we use MGCP_DEST_NET to locate the origin */</span><br><span style="color: hsl(0, 100%, 40%);">- endp = endpoint_lookup(cfg, osmuxh->circuit_id,</span><br><span style="color: hsl(0, 100%, 40%);">- &addr.sin_addr, MGCP_DEST_NET);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of CONN_ID_XXX! */</span><br><span style="color: hsl(0, 100%, 40%);">- conn_bts = mgcp_conn_get_rtp(endp, CONN_ID_BTS);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!conn_bts)</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!endp) {</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_src = osmux_conn_lookup(cfg, osmuxh->circuit_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ &addr.sin_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!conn_src) {</span><br><span> LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "Cannot find an endpoint for circuit_id=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Cannot find a src conn for circuit_id=%d\n",</span><br><span> osmuxh->circuit_id);</span><br><span> goto out;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- if (endp_osmux_state_check(endp, conn_bts, false) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- conn_bts->osmux.stats.octets += osmux_chunk_length(msg, rem);</span><br><span style="color: hsl(0, 100%, 40%);">- conn_bts->osmux.stats.chunks++;</span><br><span style="color: hsl(0, 100%, 40%);">- osmux_xfrm_output_sched(&conn_bts->osmux.out, osmuxh);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- rem = msg->len;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-out:</span><br><span style="color: hsl(0, 100%, 40%);">- msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* This is called from the bsc-nat */</span><br><span style="color: hsl(0, 100%, 40%);">-static int osmux_handle_dummy(struct mgcp_config *cfg, struct sockaddr_in *addr,</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg, int endp_type)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_endpoint *endp;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t osmux_cid;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (osmux_legacy_dummy_parse_cid(addr, msg, &osmux_cid) < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- goto out;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- endp = endpoint_lookup(cfg, osmux_cid, &addr->sin_addr, endp_type);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!endp) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "Cannot find endpoint for Osmux CID %d\n", osmux_cid);</span><br><span style="color: hsl(0, 100%, 40%);">- goto out;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of CONN_ID_XXX! */</span><br><span style="color: hsl(0, 100%, 40%);">- conn = mgcp_conn_get_rtp(endp, endp_type == MGCP_DEST_BTS ? CONN_ID_NET : CONN_ID_BTS);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!conn)</span><br><span style="color: hsl(0, 100%, 40%);">- goto out;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- endp_osmux_state_check(endp, conn, false);</span><br><span style="color: hsl(0, 100%, 40%);">- /* Only needed to punch hole in firewall, it can be dropped */</span><br><span style="color: hsl(0, 100%, 40%);">-out:</span><br><span style="color: hsl(0, 100%, 40%);">- msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int osmux_read_from_bsc_cb(struct osmo_fd *ofd, unsigned int what)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmux_hdr *osmuxh;</span><br><span style="color: hsl(0, 100%, 40%);">- struct sockaddr_in addr;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_config *cfg = ofd->data;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t rem;</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_conn_rtp *conn_net = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- msg = osmux_recv(ofd, &addr);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!msg)</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!cfg->osmux) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "bsc wants to use Osmux but bsc-nat did not request it\n");</span><br><span style="color: hsl(0, 100%, 40%);">- goto out;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* not any further processing dummy messages */</span><br><span style="color: hsl(0, 100%, 40%);">- if (msg->data[0] == MGCP_DUMMY_LOAD)</span><br><span style="color: hsl(0, 100%, 40%);">- return osmux_handle_dummy(cfg, &addr, msg, MGCP_DEST_BTS);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rem = msg->len;</span><br><span style="color: hsl(0, 100%, 40%);">- while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_endpoint *endp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Yes, we use MGCP_DEST_BTS to locate the origin */</span><br><span style="color: hsl(0, 100%, 40%);">- endp = endpoint_lookup(cfg, osmuxh->circuit_id,</span><br><span style="color: hsl(0, 100%, 40%);">- &addr.sin_addr, MGCP_DEST_BTS);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: Get rid of CONN_ID_XXX! */</span><br><span style="color: hsl(0, 100%, 40%);">- conn_net = mgcp_conn_get_rtp(endp, CONN_ID_NET);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!conn_net)</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!endp) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /*conn_dst = mgcp_find_dst_conn(conn_src->conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!conn_dst) {</span><br><span> LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- "Cannot find an endpoint for circuit_id=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Cannot find a dst conn for circuit_id=%d\n",</span><br><span> osmuxh->circuit_id);</span><br><span> goto out;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (endp_osmux_state_check(endp, conn_net, false) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- conn_net->osmux.stats.octets += osmux_chunk_length(msg, rem);</span><br><span style="color: hsl(0, 100%, 40%);">- conn_net->osmux.stats.chunks++;</span><br><span style="color: hsl(0, 100%, 40%);">- osmux_xfrm_output_sched(&conn_net->osmux.out, osmuxh);</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%);">+ if (endp_osmux_state_check(conn_src->conn->endp, conn_src, false) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_src->osmux.stats.octets += osmux_chunk_length(msg, rem);</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_src->osmux.stats.chunks++;</span><br><span style="color: hsl(120, 100%, 40%);">+ osmux_xfrm_output_sched(&conn_src->osmux.out, osmuxh);</span><br><span> }</span><br><span> rem = msg->len;</span><br><span> }</span><br><span>@@ -505,17 +395,7 @@</span><br><span> {</span><br><span> int ret;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- switch(role) {</span><br><span style="color: hsl(0, 100%, 40%);">- case OSMUX_ROLE_BSC:</span><br><span style="color: hsl(0, 100%, 40%);">- osmux_fd.cb = osmux_read_from_bsc_nat_cb;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case OSMUX_ROLE_BSC_NAT:</span><br><span style="color: hsl(0, 100%, 40%);">- osmux_fd.cb = osmux_read_from_bsc_cb;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLMGCP, LOGL_ERROR, "wrong role for OSMUX\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ osmux_fd.cb = osmux_read_fd_cb;</span><br><span> osmux_fd.data = cfg;</span><br><span> </span><br><span> ret = mgcp_create_bind(cfg->osmux_addr, &osmux_fd, cfg->osmux_port);</span><br><span>@@ -596,18 +476,8 @@</span><br><span> (conn->osmux.cid * rtp_ssrc_winlen) +</span><br><span> (random() % rtp_ssrc_winlen));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- switch (endp->cfg->role) {</span><br><span style="color: hsl(0, 100%, 40%);">- case MGCP_BSC_NAT:</span><br><span style="color: hsl(0, 100%, 40%);">- conn->type = MGCP_OSMUX_BSC_NAT;</span><br><span style="color: hsl(0, 100%, 40%);">- osmux_xfrm_output_set_tx_cb(&conn->osmux.out,</span><br><span style="color: hsl(0, 100%, 40%);">- scheduled_tx_net_cb, endp);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case MGCP_BSC:</span><br><span style="color: hsl(0, 100%, 40%);">- conn->type = MGCP_OSMUX_BSC;</span><br><span style="color: hsl(0, 100%, 40%);">- osmux_xfrm_output_set_tx_cb(&conn->osmux.out,</span><br><span style="color: hsl(0, 100%, 40%);">- scheduled_tx_bts_cb, endp);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ osmux_xfrm_output_set_tx_cb(&conn->osmux.out,</span><br><span style="color: hsl(120, 100%, 40%);">+ scheduled_from_osmux_tx_rtp_cb, conn);</span><br><span> </span><br><span> conn->osmux.state = OSMUX_STATE_ENABLED;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14036">change 14036</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/14036"/><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: I60b6ba3ffdc74efff945ba13a0b736798bdf5d8c </div>
<div style="display:none"> Gerrit-Change-Number: 14036 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>