<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/18590">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trunk: get rid of virt_trunk pointer<br><br>The virtual trunk is a pre-configured trunk that always exists. It is<br>kept separate from the trunk list using a separate pointer. This makes<br>thinks unecessarly complicated. Lets organize the trunk in the trunk<br>list like any other trunk, except that we automatically create it on<br>startup and assign it always the trunk id number 0.<br><br>Change-Id: I81934fbd211b225ab7920e78510729c8e22607b3<br>Related: OS#2659<br>---<br>M include/osmocom/mgcp/mgcp.h<br>M include/osmocom/mgcp/mgcp_trunk.h<br>M src/libosmo-mgcp/mgcp_endp.c<br>M src/libosmo-mgcp/mgcp_osmux.c<br>M src/libosmo-mgcp/mgcp_protocol.c<br>M src/libosmo-mgcp/mgcp_trunk.c<br>M src/libosmo-mgcp/mgcp_vty.c<br>M tests/mgcp/mgcp_test.c<br>8 files changed, 158 insertions(+), 122 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/90/18590/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 4c122e7..47c741f 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp.h</span><br><span>@@ -211,11 +211,7 @@</span><br><span> </span><br><span>         uint32_t last_call_id;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* trunk handling */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* virtual trunk for RTP - RTP endpoints */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct mgcp_trunk *virt_trunk;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* physical trunks with underlying E1 endpoints */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* list holding the trunks */</span><br><span>        struct llist_head trunks;</span><br><span> </span><br><span>        enum mgcp_role role;</span><br><span>diff --git a/include/osmocom/mgcp/mgcp_trunk.h b/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>index 51e9fb5..60fb840 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>@@ -38,7 +38,12 @@</span><br><span>   struct mgcp_endpoint **endpoints;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct mgcp_trunk *mgcp_trunk_alloc(struct mgcp_config *cfg, enum mgcp_trunk_type ttype, int nr);</span><br><span style="color: hsl(120, 100%, 40%);">+int mgcp_trunk_alloc(struct mgcp_config *cfg, enum mgcp_trunk_type ttype, int nr);</span><br><span> int mgcp_trunk_alloc_endpts(struct mgcp_trunk *tcfg);</span><br><span> struct mgcp_trunk *mgcp_trunk_by_num(struct mgcp_config *cfg, int index);</span><br><span> struct mgcp_trunk *mgcp_trunk_by_name(const char *epname, struct mgcp_config *cfg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* The virtual trunk is always created on trunk id 0 for historical reasons,</span><br><span style="color: hsl(120, 100%, 40%);">+ * use this define constant as ID when allocating a virtual trunk. Other</span><br><span style="color: hsl(120, 100%, 40%);">+ * trunks may be assigned with arbritrary id numbers */</span><br><span style="color: hsl(120, 100%, 40%);">+#define MGCP_VIRT_TRUNK_ID 0</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_endp.c b/src/libosmo-mgcp/mgcp_endp.c</span><br><span>index 5e42bcb..69e44e5 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_endp.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_endp.c</span><br><span>@@ -97,16 +97,12 @@</span><br><span>    switch (trunk->trunk_type) {</span><br><span>      case MGCP_TRUNK_VIRTUAL:</span><br><span>             prefix_len = sizeof(MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK) - 1;</span><br><span style="color: hsl(0, 100%, 40%);">-            if (strlen(epname) <= prefix_len)</span><br><span style="color: hsl(0, 100%, 40%);">-                    return epname;</span><br><span>               if (strncmp</span><br><span>              (epname, MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK,</span><br><span>                  prefix_len) == 0)</span><br><span>                       return epname + prefix_len;</span><br><span>  case MGCP_TRUNK_E1:</span><br><span>          prefix_len = sizeof(MGCP_ENDPOINT_PREFIX_E1_TRUNK) - 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         if (strlen(epname) <= prefix_len)</span><br><span style="color: hsl(0, 100%, 40%);">-                    return epname;</span><br><span>               if (strncmp</span><br><span>              (epname, MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK,</span><br><span>                  prefix_len) == 0)</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_osmux.c b/src/libosmo-mgcp/mgcp_osmux.c</span><br><span>index ca8b5f0..ba8e10f 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_osmux.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_osmux.c</span><br><span>@@ -198,14 +198,15 @@</span><br><span> osmux_conn_lookup(struct mgcp_config *cfg, uint8_t cid,</span><br><span>           struct in_addr *from_addr)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       struct mgcp_trunk *trunk = mgcp_trunk_by_num(cfg, 0);</span><br><span>        struct mgcp_endpoint *endp;</span><br><span>  struct mgcp_conn *conn = NULL;</span><br><span>       struct mgcp_conn_rtp * conn_rtp;</span><br><span>     int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      for (i=0; i<cfg->virt_trunk->number_endpoints; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i=0; i<trunk->number_endpoints; i++) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           endp = cfg->virt_trunk->endpoints[i];</span><br><span style="color: hsl(120, 100%, 40%);">+           endp = trunk->endpoints[i];</span><br><span> </span><br><span>           llist_for_each_entry(conn, &endp->conns, entry) {</span><br><span>                     if (conn->type != MGCP_CONN_TYPE_RTP)</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>index f62b581..13cf3b1 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>@@ -1501,16 +1501,14 @@</span><br><span> </span><br><span>  cfg->get_net_downlink_format_cb = &mgcp_get_net_downlink_format_default;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   INIT_LLIST_HEAD(&cfg->trunks);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      /* Allocate virtual trunk */</span><br><span style="color: hsl(0, 100%, 40%);">-    cfg->virt_trunk = mgcp_trunk_alloc(cfg, MGCP_TRUNK_VIRTUAL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!cfg->virt_trunk) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (mgcp_trunk_alloc(cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID) != 0) {</span><br><span>            talloc_free(cfg);</span><br><span>            return NULL;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Initalize list head for user configurable trunks */</span><br><span style="color: hsl(0, 100%, 40%);">-  INIT_LLIST_HEAD(&cfg->trunks);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        mgcp_ratectr_alloc(cfg, &cfg->ratectr);</span><br><span> </span><br><span>   return cfg;</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_trunk.c b/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>index 4424874..04789b8 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>@@ -30,15 +30,15 @@</span><br><span>  *  \param[in] cfg mgcp configuration</span><br><span>  *  \param[in] nr trunk number</span><br><span>  *  \param[in] ttype trunk type</span><br><span style="color: hsl(0, 100%, 40%);">- *  \returns pointer to allocated trunk, NULL on failure */</span><br><span style="color: hsl(0, 100%, 40%);">-struct mgcp_trunk *mgcp_trunk_alloc(struct mgcp_config *cfg, enum mgcp_trunk_type ttype, int nr)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns -EINVAL on failure, 0 on success. */</span><br><span style="color: hsl(120, 100%, 40%);">+int mgcp_trunk_alloc(struct mgcp_config *cfg, enum mgcp_trunk_type ttype, int nr)</span><br><span> {</span><br><span>       struct mgcp_trunk *trunk;</span><br><span> </span><br><span>        trunk = talloc_zero(cfg, struct mgcp_trunk);</span><br><span>         if (!trunk) {</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGP(DLMGCP, LOGL_ERROR, "Failed to allocate.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DLMGCP, LOGL_ERROR, "Failed to allocate trunk.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>        trunk->cfg = cfg;</span><br><span>@@ -52,13 +52,8 @@</span><br><span> </span><br><span>        mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* Note: Trunk Nr.0 is reserved as "virtual trunk",</span><br><span style="color: hsl(0, 100%, 40%);">-    * it is not stored using a separate pointer and</span><br><span style="color: hsl(0, 100%, 40%);">-         * not in the trunk list. */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (nr > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          llist_add_tail(&trunk->entry, &cfg->trunks);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_add_tail(&trunk->entry, &cfg->trunks);</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span> }</span><br><span> </span><br><span> /*! allocate endpoints and set default values.</span><br><span>@@ -140,7 +135,7 @@</span><br><span> </span><br><span>       prefix_len = sizeof(MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK) - 1;</span><br><span>         if (strncmp(epname, MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK, prefix_len) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             return cfg->virt_trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+            return  mgcp_trunk_by_num(cfg, 0);</span><br><span>   }</span><br><span> </span><br><span>        /* E1 trunks are not implemented yet, so we deny any request for an</span><br><span>@@ -163,7 +158,7 @@</span><br><span>    if ((epname[0] >= '0' && epname[0] <= '9') || (epname[0] >= 'a' && epname[0] <= 'f')) {</span><br><span>          LOGP(DLMGCP, LOGL_ERROR, "missing trunk prefix in endpoint name \"%s\", assuming trunk \"%s\"!\n", epname,</span><br><span>                  MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK);</span><br><span style="color: hsl(0, 100%, 40%);">-               return cfg->virt_trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+            return  mgcp_trunk_by_num(cfg, 0);</span><br><span>   }</span><br><span> </span><br><span>        LOGP(DLMGCP, LOGL_ERROR, "unable to find trunk for endpoint name \"%s\"!\n", epname);</span><br><span>diff --git a/src/libosmo-mgcp/mgcp_vty.c b/src/libosmo-mgcp/mgcp_vty.c</span><br><span>index d0bb602..71e5ead 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_vty.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_vty.c</span><br><span>@@ -43,18 +43,6 @@</span><br><span> </span><br><span> static struct mgcp_config *g_cfg = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct mgcp_trunk *find_trunk(struct mgcp_config *cfg, int nr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct mgcp_trunk *trunk;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (nr == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            trunk = cfg->virt_trunk;</span><br><span style="color: hsl(0, 100%, 40%);">-     else</span><br><span style="color: hsl(0, 100%, 40%);">-            trunk = mgcp_trunk_by_num(cfg, nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     return trunk;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct cmd_node mgcp_node = {</span><br><span>      MGCP_NODE,</span><br><span>   "%s(config-mgcp)# ",</span><br><span>@@ -69,7 +57,7 @@</span><br><span> </span><br><span> static int config_write_mgcp(struct vty *vty)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct mgcp_trunk *trunk = g_cfg->virt_trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span> </span><br><span>         vty_out(vty, "mgcp%s", VTY_NEWLINE);</span><br><span>       vty_out(vty, "  domain %s%s", g_cfg->domain, VTY_NEWLINE);</span><br><span>@@ -317,8 +305,6 @@</span><br><span>        struct mgcp_trunk *trunk;</span><br><span>    int show_stats = argc >= 1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      dump_trunk(vty, g_cfg->virt_trunk, show_stats);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   llist_for_each_entry(trunk, &g_cfg->trunks, entry)</span><br><span>            dump_trunk(vty, trunk, show_stats);</span><br><span> </span><br><span>@@ -377,7 +363,7 @@</span><br><span>        struct mgcp_trunk *trunk;</span><br><span>    int trunkidx = atoi(argv[0]);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       trunk = find_trunk(g_cfg, trunkidx);</span><br><span style="color: hsl(120, 100%, 40%);">+  trunk = mgcp_trunk_by_num(g_cfg, trunkidx);</span><br><span>  if (!trunk) {</span><br><span>                vty_out(vty, "trunk %d not found%s", trunkidx, VTY_NEWLINE);</span><br><span>               return CMD_WARNING;</span><br><span>@@ -567,11 +553,13 @@</span><br><span>       "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"</span><br><span>       "Extra Information\n")</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span>     char *txt = argv_concat(argv, argc, 0);</span><br><span>      if (!txt)</span><br><span>            return CMD_WARNING;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- osmo_talloc_replace_string(g_cfg, &g_cfg->virt_trunk->audio_fmtp_extra, txt);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);</span><br><span>     talloc_free(txt);</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -580,7 +568,9 @@</span><br><span>       cfg_mgcp_allow_transcoding_cmd,</span><br><span>       "allow-transcoding", "Allow transcoding\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   g_cfg->virt_trunk->no_audio_transcoding = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->no_audio_transcoding = 0;</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -588,7 +578,9 @@</span><br><span>       cfg_mgcp_no_allow_transcoding_cmd,</span><br><span>       "no allow-transcoding", NO_STR "Allow transcoding\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  g_cfg->virt_trunk->no_audio_transcoding = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->no_audio_transcoding = 1;</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -624,7 +616,9 @@</span><br><span>       "sdp audio-payload send-ptime",</span><br><span>       SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- g_cfg->virt_trunk->audio_send_ptime = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->audio_send_ptime = 1;</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -633,7 +627,9 @@</span><br><span>       "no sdp audio-payload send-ptime",</span><br><span>       NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       g_cfg->virt_trunk->audio_send_ptime = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->audio_send_ptime = 0;</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -642,7 +638,9 @@</span><br><span>       "sdp audio-payload send-name",</span><br><span>       SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- g_cfg->virt_trunk->audio_send_name = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->audio_send_name = 1;</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -651,7 +649,9 @@</span><br><span>       "no sdp audio-payload send-name",</span><br><span>       NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       g_cfg->virt_trunk->audio_send_name = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->audio_send_name = 0;</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -660,11 +660,13 @@</span><br><span>       "loop (0|1)",</span><br><span>       "Loop audio for all endpoints on main trunk\n" "Don't Loop\n" "Loop\n")</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span>     if (g_cfg->osmux) {</span><br><span>               vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);</span><br><span>            return CMD_WARNING;</span><br><span>  }</span><br><span style="color: hsl(0, 100%, 40%);">-       g_cfg->virt_trunk->audio_loop = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  trunk->audio_loop = atoi(argv[0]);</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -674,7 +676,9 @@</span><br><span>       "Force endpoint reallocation when the endpoint is still seized\n"</span><br><span>       "Don't force reallocation\n" "force reallocation\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      g_cfg->virt_trunk->force_realloc = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->force_realloc = atoi(argv[0]);</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -684,7 +688,9 @@</span><br><span>       "Accept all RTP packets, even when the originating IP/Port does not match\n"</span><br><span>       "enable filter\n" "disable filter\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      g_cfg->virt_trunk->rtp_accept_all = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->rtp_accept_all = atoi(argv[0]);</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -693,21 +699,27 @@</span><br><span>       "number endpoints <0-65534>",</span><br><span>       "Number options\n" "Endpoints available\n" "Number endpoints\n")</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span>     /* + 1 as we start counting at one */</span><br><span style="color: hsl(0, 100%, 40%);">-   g_cfg->virt_trunk->vty_number_endpoints = atoi(argv[0]) + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk->vty_number_endpoints = atoi(argv[0]) + 1;</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_mgcp_omit_rtcp, cfg_mgcp_omit_rtcp_cmd, "rtcp-omit", RTCP_OMIT_STR)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->virt_trunk->omit_rtcp = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       trunk->omit_rtcp = 1;</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_mgcp_no_omit_rtcp,</span><br><span>       cfg_mgcp_no_omit_rtcp_cmd, "no rtcp-omit", NO_STR RTCP_OMIT_STR)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   g_cfg->virt_trunk->omit_rtcp = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->omit_rtcp = 0;</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -715,7 +727,9 @@</span><br><span>       cfg_mgcp_patch_rtp_ssrc_cmd,</span><br><span>       "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      g_cfg->virt_trunk->force_constant_ssrc = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->force_constant_ssrc = 1;</span><br><span>   return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -723,7 +737,9 @@</span><br><span>       cfg_mgcp_no_patch_rtp_ssrc_cmd,</span><br><span>       "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- g_cfg->virt_trunk->force_constant_ssrc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->force_constant_ssrc = 0;</span><br><span>   return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -731,7 +747,9 @@</span><br><span>       cfg_mgcp_patch_rtp_ts_cmd,</span><br><span>       "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- g_cfg->virt_trunk->force_aligned_timing = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->force_aligned_timing = 1;</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -739,7 +757,9 @@</span><br><span>       cfg_mgcp_no_patch_rtp_ts_cmd,</span><br><span>       "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    g_cfg->virt_trunk->force_aligned_timing = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->force_aligned_timing = 0;</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -747,7 +767,9 @@</span><br><span>       cfg_mgcp_patch_rtp_rfc5993hr_cmd,</span><br><span>       "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       g_cfg->virt_trunk->rfc5993_hr_convert = true;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->rfc5993_hr_convert = true;</span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -755,16 +777,20 @@</span><br><span>       cfg_mgcp_no_patch_rtp_rfc5993hr_cmd,</span><br><span>       "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        g_cfg->virt_trunk->rfc5993_hr_convert = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->rfc5993_hr_convert = false;</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </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 style="color: hsl(0, 100%, 40%);">-   g_cfg->virt_trunk->force_constant_ssrc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       g_cfg->virt_trunk->force_aligned_timing = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      g_cfg->virt_trunk->rfc5993_hr_convert = false;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->force_constant_ssrc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk->force_aligned_timing = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk->rfc5993_hr_convert = false;</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -773,7 +799,9 @@</span><br><span>       "rtp keep-alive <1-120>",</span><br><span>       RTP_STR RTP_KEEPALIVE_STR "Keep alive interval in secs\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        mgcp_trunk_set_keepalive(g_cfg->virt_trunk, atoi(argv[0]));</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -782,7 +810,9 @@</span><br><span>       "rtp keep-alive once",</span><br><span>       RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_trunk_set_keepalive(g_cfg->virt_trunk, MGCP_KEEPALIVE_ONCE);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -790,7 +820,9 @@</span><br><span>       cfg_mgcp_no_rtp_keepalive_cmd,</span><br><span>       "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       mgcp_trunk_set_keepalive(g_cfg->virt_trunk, MGCP_KEEPALIVE_NEVER);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_NEVER);</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -817,7 +849,7 @@</span><br><span> </span><br><span>       trunk = mgcp_trunk_by_num(g_cfg, index);</span><br><span>     if (!trunk) {</span><br><span style="color: hsl(0, 100%, 40%);">-           trunk = mgcp_trunk_alloc(g_cfg, MGCP_TRUNK_E1, index);</span><br><span style="color: hsl(120, 100%, 40%);">+                if(mgcp_trunk_alloc(g_cfg, MGCP_TRUNK_E1, index) != 0);</span><br><span>              if (!trunk)</span><br><span>                  return CMD_WARNING;</span><br><span>  }</span><br><span>@@ -861,7 +893,7 @@</span><br><span>              else</span><br><span>                         vty_out(vty, "  no rtcp-omit%s", VTY_NEWLINE);</span><br><span>             if (trunk->force_constant_ssrc || trunk->force_aligned_timing</span><br><span style="color: hsl(0, 100%, 40%);">-                 || g_cfg->virt_trunk->rfc5993_hr_convert) {</span><br><span style="color: hsl(120, 100%, 40%);">+             || trunk->rfc5993_hr_convert) {</span><br><span>                       vty_out(vty, "  %srtp-patch ssrc%s",</span><br><span>                               trunk->force_constant_ssrc ? "" : "no ",</span><br><span>                              VTY_NEWLINE);</span><br><span>@@ -1115,7 +1147,7 @@</span><br><span>        struct mgcp_endpoint *endp;</span><br><span>  struct mgcp_conn *conn;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     trunk = find_trunk(g_cfg, atoi(argv[0]));</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk = mgcp_trunk_by_num(g_cfg, atoi(argv[0]));</span><br><span>     if (!trunk) {</span><br><span>                vty_out(vty, "%%Trunk %d not found in the config.%s",</span><br><span>                      atoi(argv[0]), VTY_NEWLINE);</span><br><span>@@ -1174,7 +1206,7 @@</span><br><span>         struct mgcp_conn_rtp *conn;</span><br><span>         const char *conn_id = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  trunk = find_trunk(g_cfg, atoi(argv[0]));</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk = mgcp_trunk_by_num(g_cfg, atoi(argv[0]));</span><br><span>     if (!trunk) {</span><br><span>                vty_out(vty, "%%Trunk %d not found in the config.%s",</span><br><span>                      atoi(argv[0]), VTY_NEWLINE);</span><br><span>@@ -1227,7 +1259,7 @@</span><br><span>         struct mgcp_trunk *trunk;</span><br><span>    struct mgcp_endpoint *endp;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- trunk = find_trunk(g_cfg, atoi(argv[0]));</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk = mgcp_trunk_by_num(g_cfg, atoi(argv[0]));</span><br><span>     if (!trunk) {</span><br><span>                vty_out(vty, "%%Trunk %d not found in the config.%s",</span><br><span>                      atoi(argv[0]), VTY_NEWLINE);</span><br><span>@@ -1260,7 +1292,7 @@</span><br><span>         struct mgcp_endpoint *endp;</span><br><span>  int endp_no, rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    trunk = find_trunk(g_cfg, atoi(argv[0]));</span><br><span style="color: hsl(120, 100%, 40%);">+     trunk = mgcp_trunk_by_num(g_cfg, atoi(argv[0]));</span><br><span>     if (!trunk) {</span><br><span>                vty_out(vty, "%%Trunk %d not found in the config.%s",</span><br><span>                      atoi(argv[0]), VTY_NEWLINE);</span><br><span>@@ -1309,6 +1341,9 @@</span><br><span>       "osmux (on|off|only)",</span><br><span>       OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* FIXME: This works only for the virtual trunk, what about other trunks? */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   if (strcmp(argv[0], "off") == 0) {</span><br><span>                 g_cfg->osmux = OSMUX_USAGE_OFF;</span><br><span>           return CMD_SUCCESS;</span><br><span>@@ -1317,7 +1352,7 @@</span><br><span>  else if (strcmp(argv[0], "only") == 0)</span><br><span>             g_cfg->osmux = OSMUX_USAGE_ONLY;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (g_cfg->virt_trunk->audio_loop) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (trunk->audio_loop) {</span><br><span>          vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);</span><br><span>            return CMD_WARNING;</span><br><span>  }</span><br><span>@@ -1518,13 +1553,6 @@</span><br><span>           return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (mgcp_trunk_alloc_endpts(g_cfg->virt_trunk) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               LOGP(DLMGCP, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                     "Failed to initialize the virtual trunk (%d endpoints)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    g_cfg->virt_trunk->number_endpoints);</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%);">-</span><br><span>    llist_for_each_entry(trunk, &g_cfg->trunks, entry) {</span><br><span>          if (mgcp_trunk_alloc_endpts(trunk) != 0) {</span><br><span>                   LOGP(DLMGCP, LOGL_ERROR,</span><br><span>diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c</span><br><span>index d0da18b..eff84bf 100644</span><br><span>--- a/tests/mgcp/mgcp_test.c</span><br><span>+++ b/tests/mgcp/mgcp_test.c</span><br><span>@@ -760,6 +760,7 @@</span><br><span> {</span><br><span>     struct mgcp_config *cfg;</span><br><span>     struct mgcp_endpoint *endp;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct mgcp_trunk *trunk;</span><br><span>    struct mgcp_trunk *trunk2;</span><br><span>   int i;</span><br><span>       struct mgcp_conn_rtp *conn = NULL;</span><br><span>@@ -767,14 +768,16 @@</span><br><span>   int rc;</span><br><span> </span><br><span>  cfg = mgcp_config_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk = mgcp_trunk_by_num(cfg, MGCP_VIRT_TRUNK_ID);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- cfg->virt_trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(0, 100%, 40%);">-        mgcp_trunk_alloc_endpts(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+ trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+        mgcp_trunk_alloc_endpts(trunk);</span><br><span>        cfg->policy_cb = mgcp_test_policy_cb;</span><br><span> </span><br><span>         memset(last_conn_id, 0, sizeof(last_conn_id));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      trunk2 = mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk2 = mgcp_trunk_by_num(cfg, 1);</span><br><span>         mgcp_trunk_alloc_endpts(trunk2);</span><br><span> </span><br><span>  for (i = 0; i < ARRAY_SIZE(tests); i++) {</span><br><span>@@ -788,7 +791,7 @@</span><br><span>           last_endpoint = -1;</span><br><span>          dummy_packets = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_talloc_replace_string(cfg, &cfg->virt_trunk->audio_fmtp_extra,</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_talloc_replace_string(cfg, &trunk->audio_fmtp_extra,</span><br><span>                                        t->extra_fmtp);</span><br><span> </span><br><span>            inp = create_msg(t->req, last_conn_id);</span><br><span>@@ -821,7 +824,7 @@</span><br><span>                     printf("Dummy packets: %d\n", dummy_packets);</span><br><span> </span><br><span>          if (last_endpoint != -1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+                       endp = trunk->endpoints[last_endpoint];</span><br><span> </span><br><span>                       conn = mgcp_conn_get_rtp(endp, "1");</span><br><span>                       if (conn) {</span><br><span>@@ -877,7 +880,7 @@</span><br><span>            /* Check detected payload type */</span><br><span>            if (conn && t->ptype != PTYPE_IGNORE) {</span><br><span>                   OSMO_ASSERT(last_endpoint != -1);</span><br><span style="color: hsl(0, 100%, 40%);">-                       endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+                       endp = trunk->endpoints[last_endpoint];</span><br><span> </span><br><span>                       fprintf(stderr, "endpoint 0x%x: "</span><br><span>                          "payload type %d (expected %d)\n",</span><br><span>@@ -894,26 +897,29 @@</span><br><span>         }</span><br><span> </span><br><span>        mgcp_endpoints_release(trunk2);</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_endpoints_release(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+   mgcp_endpoints_release(trunk);</span><br><span>       talloc_free(cfg);</span><br><span> }</span><br><span> </span><br><span> static void test_retransmission(void)</span><br><span> {</span><br><span>     struct mgcp_config *cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_trunk *trunk;</span><br><span>    struct mgcp_trunk *trunk2;</span><br><span>   int i;</span><br><span>       char last_conn_id[256];</span><br><span>      int rc;</span><br><span> </span><br><span>  cfg = mgcp_config_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk = mgcp_trunk_by_num(cfg, MGCP_VIRT_TRUNK_ID);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- cfg->virt_trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(0, 100%, 40%);">-        mgcp_trunk_alloc_endpts(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+ trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+        mgcp_trunk_alloc_endpts(trunk);</span><br><span> </span><br><span>    memset(last_conn_id, 0, sizeof(last_conn_id));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      trunk2 = mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk2 = mgcp_trunk_by_num(cfg, 1);</span><br><span>         mgcp_trunk_alloc_endpts(trunk2);</span><br><span> </span><br><span>  for (i = 0; i < ARRAY_SIZE(retransmit); i++) {</span><br><span>@@ -955,7 +961,7 @@</span><br><span>      }</span><br><span> </span><br><span>        mgcp_endpoints_release(trunk2);</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_endpoints_release(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+   mgcp_endpoints_release(trunk);</span><br><span>       talloc_free(cfg);</span><br><span> }</span><br><span> </span><br><span>@@ -969,17 +975,20 @@</span><br><span> static void test_rqnt_cb(void)</span><br><span> {</span><br><span>    struct mgcp_config *cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_trunk *trunk;</span><br><span>    struct mgcp_trunk *trunk2;</span><br><span>   struct msgb *inp, *msg;</span><br><span>      char conn_id[256];</span><br><span> </span><br><span>       cfg = mgcp_config_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk = mgcp_trunk_by_num(cfg, MGCP_VIRT_TRUNK_ID);</span><br><span>  cfg->rqnt_cb = rqnt_cb;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  cfg->virt_trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(0, 100%, 40%);">-        mgcp_trunk_alloc_endpts(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+ trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+        mgcp_trunk_alloc_endpts(trunk);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       trunk2 = mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk2 = mgcp_trunk_by_num(cfg, 1);</span><br><span>         mgcp_trunk_alloc_endpts(trunk2);</span><br><span> </span><br><span>  inp = create_msg(CRCX, NULL);</span><br><span>@@ -1010,7 +1019,7 @@</span><br><span>        msgb_free(mgcp_handle_message(cfg, inp));</span><br><span>    msgb_free(inp);</span><br><span>      mgcp_endpoints_release(trunk2);</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_endpoints_release(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+   mgcp_endpoints_release(trunk);</span><br><span>       talloc_free(cfg);</span><br><span> }</span><br><span> </span><br><span>@@ -1376,6 +1385,7 @@</span><br><span> static void test_multilple_codec(void)</span><br><span> {</span><br><span>    struct mgcp_config *cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_trunk *trunk;</span><br><span>    struct mgcp_trunk *trunk2;</span><br><span>   struct mgcp_endpoint *endp;</span><br><span>  struct msgb *inp, *resp;</span><br><span>@@ -1386,11 +1396,13 @@</span><br><span>   printf("Testing multiple payload types\n");</span><br><span> </span><br><span>    cfg = mgcp_config_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-      cfg->virt_trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(0, 100%, 40%);">-        mgcp_trunk_alloc_endpts(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+ trunk = mgcp_trunk_by_num(cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+        mgcp_trunk_alloc_endpts(trunk);</span><br><span>        cfg->policy_cb = mgcp_test_policy_cb;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    trunk2 = mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk2 = mgcp_trunk_by_num(cfg, 1);</span><br><span>         mgcp_trunk_alloc_endpts(trunk2);</span><br><span> </span><br><span>  /* Allocate endpoint 1@mgw with two codecs */</span><br><span>@@ -1403,7 +1415,7 @@</span><br><span>        msgb_free(resp);</span><br><span> </span><br><span>         OSMO_ASSERT(last_endpoint == 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+       endp = trunk->endpoints[last_endpoint];</span><br><span>   conn = mgcp_conn_get_rtp(endp, conn_id);</span><br><span>     OSMO_ASSERT(conn);</span><br><span>   OSMO_ASSERT(conn->end.codec->payload_type == 18);</span><br><span>@@ -1418,7 +1430,7 @@</span><br><span>      msgb_free(resp);</span><br><span> </span><br><span>         OSMO_ASSERT(last_endpoint == 2);</span><br><span style="color: hsl(0, 100%, 40%);">-        endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+       endp = trunk->endpoints[last_endpoint];</span><br><span>   conn = mgcp_conn_get_rtp(endp, conn_id);</span><br><span>     OSMO_ASSERT(conn);</span><br><span>   OSMO_ASSERT(conn->end.codec->payload_type == 18);</span><br><span>@@ -1438,7 +1450,7 @@</span><br><span>      msgb_free(resp);</span><br><span> </span><br><span>         OSMO_ASSERT(last_endpoint == 3);</span><br><span style="color: hsl(0, 100%, 40%);">-        endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+       endp = trunk->endpoints[last_endpoint];</span><br><span>   conn = mgcp_conn_get_rtp(endp, conn_id);</span><br><span>     OSMO_ASSERT(conn);</span><br><span>   OSMO_ASSERT(conn->end.codec->payload_type == 0);</span><br><span>@@ -1453,7 +1465,7 @@</span><br><span>       msgb_free(resp);</span><br><span> </span><br><span>         OSMO_ASSERT(last_endpoint == 4);</span><br><span style="color: hsl(0, 100%, 40%);">-        endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+       endp = trunk->endpoints[last_endpoint];</span><br><span>   conn = mgcp_conn_get_rtp(endp, conn_id);</span><br><span>     OSMO_ASSERT(conn);</span><br><span>   OSMO_ASSERT(conn->end.codec->payload_type == 18);</span><br><span>@@ -1461,7 +1473,7 @@</span><br><span>      /* Allocate 5@mgw and let osmo-mgw pick a codec from the list */</span><br><span>     last_endpoint = -1;</span><br><span>  inp = create_msg(CRCX_MULT_GSM_EXACT, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-    cfg->virt_trunk->no_audio_transcoding = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->no_audio_transcoding = 1;</span><br><span>  resp = mgcp_handle_message(cfg, inp);</span><br><span>        OSMO_ASSERT(get_conn_id_from_response(resp->data, conn_id,</span><br><span>                                              sizeof(conn_id)) == 0);</span><br><span>@@ -1469,7 +1481,7 @@</span><br><span>        msgb_free(resp);</span><br><span> </span><br><span>         OSMO_ASSERT(last_endpoint == 5);</span><br><span style="color: hsl(0, 100%, 40%);">-        endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+       endp = trunk->endpoints[last_endpoint];</span><br><span>   conn = mgcp_conn_get_rtp(endp, conn_id);</span><br><span>     OSMO_ASSERT(conn);</span><br><span>   OSMO_ASSERT(conn->end.codec->payload_type == 0);</span><br><span>@@ -1480,7 +1492,7 @@</span><br><span>       msgb_free(inp);</span><br><span>      msgb_free(resp);</span><br><span>     OSMO_ASSERT(last_endpoint == 5);</span><br><span style="color: hsl(0, 100%, 40%);">-        endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+       endp = trunk->endpoints[last_endpoint];</span><br><span>   conn = mgcp_conn_get_rtp(endp, conn_id);</span><br><span>     OSMO_ASSERT(conn);</span><br><span>   OSMO_ASSERT(conn->end.codec->payload_type == 3);</span><br><span>@@ -1502,7 +1514,7 @@</span><br><span> </span><br><span>   last_endpoint = -1;</span><br><span>  inp = create_msg(CRCX_MULT_GSM_EXACT, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-    cfg->virt_trunk->no_audio_transcoding = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk->no_audio_transcoding = 0;</span><br><span>  resp = mgcp_handle_message(cfg, inp);</span><br><span>        OSMO_ASSERT(get_conn_id_from_response(resp->data, conn_id,</span><br><span>                                              sizeof(conn_id)) == 0);</span><br><span>@@ -1510,13 +1522,13 @@</span><br><span>      msgb_free(resp);</span><br><span> </span><br><span>         OSMO_ASSERT(last_endpoint == 5);</span><br><span style="color: hsl(0, 100%, 40%);">-        endp = cfg->virt_trunk->endpoints[last_endpoint];</span><br><span style="color: hsl(120, 100%, 40%);">+       endp = trunk->endpoints[last_endpoint];</span><br><span>   conn = mgcp_conn_get_rtp(endp, conn_id);</span><br><span>     OSMO_ASSERT(conn);</span><br><span>   OSMO_ASSERT(conn->end.codec->payload_type == 0);</span><br><span> </span><br><span>   mgcp_endpoints_release(trunk2);</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_endpoints_release(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+   mgcp_endpoints_release(trunk);</span><br><span>       talloc_free(cfg);</span><br><span> }</span><br><span> </span><br><span>@@ -1526,14 +1538,16 @@</span><br><span>         struct mgcp_endpoint *endp;</span><br><span>  struct mgcp_conn_rtp *conn = NULL;</span><br><span>   struct mgcp_conn *_conn = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct mgcp_trunk *trunk;</span><br><span> </span><br><span>        printf("Testing no sequence flow on initial packet\n");</span><br><span> </span><br><span>        cfg = mgcp_config_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-      cfg->virt_trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(0, 100%, 40%);">-        mgcp_trunk_alloc_endpts(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+ trunk = mgcp_trunk_by_num(cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+   trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+        mgcp_trunk_alloc_endpts(trunk);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       endp = cfg->virt_trunk->endpoints[1];</span><br><span style="color: hsl(120, 100%, 40%);">+   endp = trunk->endpoints[1];</span><br><span> </span><br><span>   _conn = mgcp_conn_alloc(NULL, endp, MGCP_CONN_TYPE_RTP,</span><br><span>                              "test-connection");</span><br><span>@@ -1565,26 +1579,29 @@</span><br><span>      OSMO_ASSERT(conn->state.stats.cycles == UINT16_MAX + 1);</span><br><span>  OSMO_ASSERT(conn->state.stats.max_seq == 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     mgcp_endpoints_release(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+   mgcp_endpoints_release(trunk);</span><br><span>       talloc_free(cfg);</span><br><span> }</span><br><span> </span><br><span> static void test_no_name(void)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     struct mgcp_trunk *trunk;</span><br><span>    struct mgcp_trunk *trunk2;</span><br><span>   struct mgcp_config *cfg;</span><br><span>     struct msgb *inp, *msg;</span><br><span> </span><br><span>  printf("Testing no rtpmap name\n");</span><br><span>        cfg = mgcp_config_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+    trunk = mgcp_trunk_by_num(cfg, MGCP_VIRT_TRUNK_ID);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- cfg->virt_trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(0, 100%, 40%);">-       cfg->virt_trunk->audio_send_name = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        mgcp_trunk_alloc_endpts(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+       trunk->vty_number_endpoints = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+  trunk->audio_send_name = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        mgcp_trunk_alloc_endpts(trunk);</span><br><span> </span><br><span>  cfg->policy_cb = mgcp_test_policy_cb;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    trunk2 = mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      trunk2 = mgcp_trunk_by_num(cfg, 1);</span><br><span>         mgcp_trunk_alloc_endpts(trunk2);</span><br><span> </span><br><span>  inp = create_msg(CRCX, NULL);</span><br><span>@@ -1599,7 +1616,7 @@</span><br><span>        msgb_free(msg);</span><br><span> </span><br><span>  mgcp_endpoints_release(trunk2);</span><br><span style="color: hsl(0, 100%, 40%);">- mgcp_endpoints_release(cfg->virt_trunk);</span><br><span style="color: hsl(120, 100%, 40%);">+   mgcp_endpoints_release(trunk);</span><br><span>       talloc_free(cfg);</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-mgw/+/18590">change 18590</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/c/osmo-mgw/+/18590"/><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-Change-Id: I81934fbd211b225ab7920e78510729c8e22607b3 </div>
<div style="display:none"> Gerrit-Change-Number: 18590 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>