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