<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-mgw/+/18590">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved
  neels: Looks good to me, but someone else must approve

</div><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_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>7 files changed, 155 insertions(+), 105 deletions(-)<br><br></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 989d138..33bfe71 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp.h</span><br><span>@@ -152,11 +152,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 c230e9f..78d65e4 100644</span><br><span>--- a/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>+++ b/include/osmocom/mgcp/mgcp_trunk.h</span><br><span>@@ -45,3 +45,8 @@</span><br><span> int mgcp_trunk_alloc_endpts(struct mgcp_trunk *tcfg);</span><br><span> struct mgcp_trunk *mgcp_trunk_by_num(const struct mgcp_config *cfg, int index);</span><br><span> struct mgcp_trunk *mgcp_trunk_by_name(const struct mgcp_config *cfg, const char *epname);</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_osmux.c b/src/libosmo-mgcp/mgcp_osmux.c</span><br><span>index ca8b5f0..9715e70 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, MGCP_VIRT_TRUNK_ID);</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 1d25c45..1e393e2 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_protocol.c</span><br><span>@@ -1498,16 +1498,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)) {</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_global_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 024db03..208604a 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_trunk.c</span><br><span>@@ -52,11 +52,7 @@</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(120, 100%, 40%);">+    llist_add_tail(&trunk->entry, &cfg->trunks);</span><br><span> </span><br><span>         mgcp_ratectr_trunk_alloc(cfg, &trunk->ratectr);</span><br><span> </span><br><span>@@ -152,7 +148,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, MGCP_VIRT_TRUNK_ID);</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>@@ -175,7 +171,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, MGCP_VIRT_TRUNK_ID);</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 4cfe3b5..938eef5 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,8 @@</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 style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -328,8 +317,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>@@ -388,7 +375,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>@@ -578,11 +565,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%);">+        struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -591,7 +580,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%);">+    struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -599,7 +590,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%);">+    struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -635,7 +628,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%);">+        struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -644,7 +639,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%);">+        struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -653,7 +650,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%);">+ struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -662,7 +661,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%);">+ struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -671,11 +672,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%);">+ struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -685,7 +688,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%);">+       struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -695,7 +700,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%);">+      struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -704,21 +711,26 @@</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%);">+      struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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%);">+       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%);">+       struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -726,7 +738,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%);">+     struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -734,7 +748,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%);">+     struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -742,7 +758,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%);">+    struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -750,7 +768,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%);">+    struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -758,7 +778,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%);">+   struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -766,16 +788,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%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -784,7 +810,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%);">+        struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -793,7 +821,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%);">+  struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -801,7 +831,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%);">+ struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -826,6 +858,11 @@</span><br><span>  struct mgcp_trunk *trunk;</span><br><span>    int index = atoi(argv[0]);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* Due to historical reasons, the trunk id number 0 is reserved for the</span><br><span style="color: hsl(120, 100%, 40%);">+        * virtual trunk. This trunk is configured with separate VTY</span><br><span style="color: hsl(120, 100%, 40%);">+   * parameters, so we restrict the access to trunks with id numbers</span><br><span style="color: hsl(120, 100%, 40%);">+     * greater than 0. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      trunk = mgcp_trunk_by_num(g_cfg, index);</span><br><span>     if (!trunk) {</span><br><span>                trunk = mgcp_trunk_alloc(g_cfg, MGCP_TRUNK_E1, index);</span><br><span>@@ -846,6 +883,15 @@</span><br><span>        struct mgcp_trunk *trunk;</span><br><span> </span><br><span>        llist_for_each_entry(trunk, &g_cfg->trunks, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Due to historical reasons, the virtual trunk is configured</span><br><span style="color: hsl(120, 100%, 40%);">+            using separate VTY parameters, so we omit writing the trunk</span><br><span style="color: hsl(120, 100%, 40%);">+                   config of trunk 0 here. The configuration for the virtual</span><br><span style="color: hsl(120, 100%, 40%);">+             trunk is written by config_write_mgcp(). */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (trunk->trunk_nr == MGCP_VIRT_TRUNK_ID)</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);</span><br><span>              vty_out(vty, "  %ssdp audio-payload send-ptime%s",</span><br><span>                         trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);</span><br><span>@@ -869,7 +915,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>@@ -1123,7 +1169,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>@@ -1182,7 +1228,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>@@ -1235,7 +1281,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>@@ -1268,7 +1314,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>@@ -1317,6 +1363,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%);">+   struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_VIRT_TRUNK_ID);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(trunk);</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>@@ -1325,7 +1374,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>@@ -1526,13 +1575,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..56a17b1 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,9 +768,10 @@</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>@@ -788,7 +790,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 +823,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 +879,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,22 +896,24 @@</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>@@ -955,7 +959,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,15 +973,17 @@</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>    trunk2 = mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span>         mgcp_trunk_alloc_endpts(trunk2);</span><br><span>@@ -1010,7 +1016,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 +1382,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,8 +1393,9 @@</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>         trunk2 = mgcp_trunk_alloc(cfg, MGCP_TRUNK_E1, 1);</span><br><span>@@ -1403,7 +1411,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 +1426,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 +1446,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 +1461,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 +1469,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 +1477,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 +1488,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 +1510,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 +1518,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 +1534,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,22 +1575,24 @@</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>@@ -1599,7 +1611,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: 13 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>