<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/15568">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">host/trxcon: add optional GSMTAP frame logging support<br><br>Change-Id: Iab4128fee5f18d816830fdca6c5ebebaf7451902<br>---<br>M src/host/trxcon/sched_lchan_common.c<br>M src/host/trxcon/sched_lchan_desc.c<br>M src/host/trxcon/sched_lchan_rach.c<br>M src/host/trxcon/sched_lchan_xcch.c<br>M src/host/trxcon/sched_trx.h<br>M src/host/trxcon/trxcon.c<br>M src/host/trxcon/trxcon.h<br>7 files changed, 149 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/68/15568/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/trxcon/sched_lchan_common.c b/src/host/trxcon/sched_lchan_common.c</span><br><span>index 615d81c..d8d9ee1 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_common.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_common.c</span><br><span>@@ -2,7 +2,7 @@</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  * TDMA scheduler: common routines for lchan handlers</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2017 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017-2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -32,15 +32,19 @@</span><br><span> </span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/bits.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/gsmtap_util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/gsmtap.h></span><br><span> </span><br><span> #include <osmocom/codec/codec.h></span><br><span> </span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_08_58.h></span><br><span> </span><br><span> #include "l1ctl_proto.h"</span><br><span> #include "scheduler.h"</span><br><span> #include "sched_trx.h"</span><br><span> #include "logging.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "trxcon.h"</span><br><span> #include "trx_if.h"</span><br><span> #include "l1ctl.h"</span><br><span> </span><br><span>@@ -80,13 +84,32 @@</span><br><span>   },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int sched_gsmtap_send(enum trx_lchan_type lchan_type, uint32_t fn, uint8_t tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                uint16_t band_arfcn, int8_t signal_dbm, uint8_t snr,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const uint8_t *data, size_t data_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        const struct trx_lchan_desc *lchan_desc = &trx_lchan_desc[lchan_type];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* GSMTAP logging may not be enabled */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (gsmtap == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+           return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Omit frames with unknown channel type */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (lchan_desc->gsmtap_chan_type == GSMTAP_CHANNEL_UNKNOWN)</span><br><span style="color: hsl(120, 100%, 40%);">+                return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* TODO: distinguish GSMTAP_CHANNEL_PCH and GSMTAP_CHANNEL_AGCH */</span><br><span style="color: hsl(120, 100%, 40%);">+    return gsmtap_send(gsmtap, band_arfcn, tn, lchan_desc->gsmtap_chan_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                      lchan_desc->ss_nr, fn, signal_dbm, snr, data, data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int sched_send_dt_ind(struct trx_instance *trx, struct trx_ts *ts,</span><br><span>    struct trx_lchan_state *lchan, uint8_t *l2, size_t l2_len,</span><br><span>   int bit_error_count, bool dec_failed, bool traffic)</span><br><span> {</span><br><span>     const struct trx_lchan_desc *lchan_desc;</span><br><span>     struct l1ctl_info_dl dl_hdr;</span><br><span style="color: hsl(0, 100%, 40%);">-    int dbm_avg;</span><br><span style="color: hsl(120, 100%, 40%);">+  int dbm_avg = 0;</span><br><span> </span><br><span>         /* Set up pointers */</span><br><span>        lchan_desc = &trx_lchan_desc[lchan->type];</span><br><span>@@ -117,6 +140,12 @@</span><br><span>     /* Put a packet to higher layers */</span><br><span>  l1ctl_tx_dt_ind(trx->l1l, &dl_hdr, l2, l2_len, traffic);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Optional GSMTAP logging */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (l2_len > 0 && (!traffic || lchan_desc->chan_nr == RSL_CHAN_OSMO_PDCH)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            sched_gsmtap_send(lchan->type, lchan->rx_first_fn, ts->index,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  trx->band_arfcn, dbm_avg, 0, l2, l2_len);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -140,6 +169,14 @@</span><br><span> </span><br><span>        l1ctl_tx_dt_conf(trx->l1l, &dl_hdr, traffic);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /* Optional GSMTAP logging */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!traffic || lchan_desc->chan_nr == RSL_CHAN_OSMO_PDCH) {</span><br><span style="color: hsl(120, 100%, 40%);">+               sched_gsmtap_send(lchan->type, fn, ts->index,</span><br><span style="color: hsl(120, 100%, 40%);">+                             trx->band_arfcn | ARFCN_UPLINK,</span><br><span style="color: hsl(120, 100%, 40%);">+                            0, 0, lchan->prim->payload,</span><br><span style="color: hsl(120, 100%, 40%);">+                             lchan->prim->payload_len);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/host/trxcon/sched_lchan_desc.c b/src/host/trxcon/sched_lchan_desc.c</span><br><span>index 667a88d..a9d89ea 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_desc.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_desc.c</span><br><span>@@ -24,6 +24,8 @@</span><br><span>  */</span><br><span> </span><br><span> #include <osmocom/gsm/protocol/gsm_08_58.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/gsmtap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include "sched_trx.h"</span><br><span> </span><br><span> /* Forward declaration of handlers */</span><br><span>@@ -86,6 +88,7 @@</span><br><span>   [TRXC_BCCH] = {</span><br><span>              .name = "BCCH", /* 3GPP TS 05.02, section 3.3.2.3 */</span><br><span>               .desc = "Broadcast control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+                .gsmtap_chan_type = GSMTAP_CHANNEL_BCCH,</span><br><span>             .chan_nr = RSL_CHAN_BCCH,</span><br><span> </span><br><span>                /* Rx only, xCCH convolutional coding (3GPP TS 05.03, section 4.4),</span><br><span>@@ -98,6 +101,7 @@</span><br><span>     [TRXC_RACH] = {</span><br><span>              .name = "RACH", /* 3GPP TS 05.02, section 3.3.3.1 */</span><br><span>               .desc = "Random access channel",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_RACH,</span><br><span>             .chan_nr = RSL_CHAN_RACH,</span><br><span> </span><br><span>                /* Tx only, RACH convolutional coding (3GPP TS 05.03, section 4.6). */</span><br><span>@@ -107,6 +111,7 @@</span><br><span>         [TRXC_CCCH] = {</span><br><span>              .name = "CCCH", /* 3GPP TS 05.02, section 3.3.3.1 */</span><br><span>               .desc = "Common control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+           .gsmtap_chan_type = GSMTAP_CHANNEL_CCCH,</span><br><span>             .chan_nr = RSL_CHAN_PCH_AGCH,</span><br><span> </span><br><span>            /* Rx only, xCCH convolutional coding (3GPP TS 05.03, section 4.4),</span><br><span>@@ -119,6 +124,7 @@</span><br><span>    [TRXC_TCHF] = {</span><br><span>              .name = "TCH/F", /* 3GPP TS 05.02, section 3.2 */</span><br><span>          .desc = "Full Rate traffic channel",</span><br><span style="color: hsl(120, 100%, 40%);">+                .gsmtap_chan_type = GSMTAP_CHANNEL_TCH_F,</span><br><span>            .chan_nr = RSL_CHAN_Bm_ACCHs,</span><br><span>                .link_id = TRX_CH_LID_DEDIC,</span><br><span> </span><br><span>@@ -141,8 +147,10 @@</span><br><span>      [TRXC_TCHH_0] = {</span><br><span>            .name = "TCH/H(0)", /* 3GPP TS 05.02, section 3.2 */</span><br><span>               .desc = "Half Rate traffic channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+                .gsmtap_chan_type = GSMTAP_CHANNEL_TCH_H,</span><br><span>            .chan_nr = RSL_CHAN_Lm_ACCHs + (0 << 3),</span><br><span>               .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 0,</span><br><span> </span><br><span>              /* Rx and Tx, multiple convolutional coding types (3GPP TS 05.03,</span><br><span>             * chapter 3), block diagonal interleaving (3GPP TS 05.02, clause 7):</span><br><span>@@ -165,8 +173,10 @@</span><br><span>         [TRXC_TCHH_1] = {</span><br><span>            .name = "TCH/H(1)", /* 3GPP TS 05.02, section 3.2 */</span><br><span>               .desc = "Half Rate traffic channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+                .gsmtap_chan_type = GSMTAP_CHANNEL_TCH_H,</span><br><span>            .chan_nr = RSL_CHAN_Lm_ACCHs + (1 << 3),</span><br><span>               .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 1,</span><br><span> </span><br><span>              /* Same as for TRXC_TCHH_0, see above. */</span><br><span>            .burst_buf_size = 6 * GSM_BURST_PL_LEN,</span><br><span>@@ -177,8 +187,10 @@</span><br><span>       [TRXC_SDCCH4_0] = {</span><br><span>          .name = "SDCCH/4(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH4,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH4_ACCH + (0 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 0,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span>               .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -189,8 +201,10 @@</span><br><span>       [TRXC_SDCCH4_1] = {</span><br><span>          .name = "SDCCH/4(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH4,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH4_ACCH + (1 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 1,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span>               .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -201,8 +215,10 @@</span><br><span>       [TRXC_SDCCH4_2] = {</span><br><span>          .name = "SDCCH/4(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 2)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH4,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH4_ACCH + (2 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 2,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span>               .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -213,8 +229,10 @@</span><br><span>       [TRXC_SDCCH4_3] = {</span><br><span>          .name = "SDCCH/4(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 3)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH4,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH4_ACCH + (3 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 3,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span>               .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -225,8 +243,10 @@</span><br><span>       [TRXC_SDCCH8_0] = {</span><br><span>          .name = "SDCCH/8(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH8_ACCH + (0 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 0,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -237,8 +257,10 @@</span><br><span>       [TRXC_SDCCH8_1] = {</span><br><span>          .name = "SDCCH/8(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH8_ACCH + (1 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 1,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -249,8 +271,10 @@</span><br><span>       [TRXC_SDCCH8_2] = {</span><br><span>          .name = "SDCCH/8(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 2)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH8_ACCH + (2 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 2,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -261,8 +285,10 @@</span><br><span>       [TRXC_SDCCH8_3] = {</span><br><span>          .name = "SDCCH/8(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 3)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH8_ACCH + (3 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 3,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -273,8 +299,10 @@</span><br><span>       [TRXC_SDCCH8_4] = {</span><br><span>          .name = "SDCCH/8(4)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 4)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH8_ACCH + (4 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 4,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -285,8 +313,10 @@</span><br><span>       [TRXC_SDCCH8_5] = {</span><br><span>          .name = "SDCCH/8(5)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 5)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH8_ACCH + (5 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 5,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -297,8 +327,10 @@</span><br><span>       [TRXC_SDCCH8_6] = {</span><br><span>          .name = "SDCCH/8(6)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 6)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH8_ACCH + (6 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 6,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -309,8 +341,10 @@</span><br><span>       [TRXC_SDCCH8_7] = {</span><br><span>          .name = "SDCCH/8(7)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Stand-alone dedicated control channel (sub-channel 7)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8,</span><br><span>           .chan_nr = RSL_CHAN_SDCCH8_ACCH + (7 << 3),</span><br><span>            .link_id = TRX_CH_LID_DEDIC,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 7,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -321,6 +355,7 @@</span><br><span>        [TRXC_SACCHTF] = {</span><br><span>           .name = "SACCH/TF", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>           .desc = "Slow TCH/F associated control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_TCH_F | GSMTAP_CHANNEL_ACCH,</span><br><span>              .chan_nr = RSL_CHAN_Bm_ACCHs,</span><br><span>                .link_id = TRX_CH_LID_SACCH,</span><br><span> </span><br><span>@@ -333,8 +368,10 @@</span><br><span>      [TRXC_SACCHTH_0] = {</span><br><span>                 .name = "SACCH/TH(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                .desc = "Slow TCH/H associated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_TCH_H | GSMTAP_CHANNEL_ACCH,</span><br><span>              .chan_nr = RSL_CHAN_Lm_ACCHs + (0 << 3),</span><br><span>               .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 0,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span>               .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -345,8 +382,10 @@</span><br><span>       [TRXC_SACCHTH_1] = {</span><br><span>                 .name = "SACCH/TH(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                .desc = "Slow TCH/H associated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_TCH_H | GSMTAP_CHANNEL_ACCH,</span><br><span>              .chan_nr = RSL_CHAN_Lm_ACCHs + (1 << 3),</span><br><span>               .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 1,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span>               .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -357,8 +396,10 @@</span><br><span>       [TRXC_SACCH4_0] = {</span><br><span>          .name = "SACCH/4(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/4 associated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH4 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH4_ACCH + (0 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 0,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -369,8 +410,10 @@</span><br><span>       [TRXC_SACCH4_1] = {</span><br><span>          .name = "SACCH/4(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/4 associated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH4 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH4_ACCH + (1 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 1,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -381,8 +424,10 @@</span><br><span>       [TRXC_SACCH4_2] = {</span><br><span>          .name = "SACCH/4(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/4 associated control channel (sub-channel 2)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH4 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH4_ACCH + (2 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 2,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -393,8 +438,10 @@</span><br><span>       [TRXC_SACCH4_3] = {</span><br><span>          .name = "SACCH/4(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/4 associated control channel (sub-channel 3)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH4 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH4_ACCH + (3 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 3,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH4_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -405,8 +452,10 @@</span><br><span>       [TRXC_SACCH8_0] = {</span><br><span>          .name = "SACCH/8(0)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/8 associated control channel (sub-channel 0)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH8_ACCH + (0 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 0,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -417,8 +466,10 @@</span><br><span>       [TRXC_SACCH8_1] = {</span><br><span>          .name = "SACCH/8(1)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/8 associated control channel (sub-channel 1)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH8_ACCH + (1 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 1,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -429,8 +480,10 @@</span><br><span>       [TRXC_SACCH8_2] = {</span><br><span>          .name = "SACCH/8(2)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/8 associated control channel (sub-channel 2)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH8_ACCH + (2 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 2,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -441,8 +494,10 @@</span><br><span>       [TRXC_SACCH8_3] = {</span><br><span>          .name = "SACCH/8(3)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/8 associated control channel (sub-channel 3)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH8_ACCH + (3 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 3,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -455,6 +510,7 @@</span><br><span>                .desc = "Slow SDCCH/8 associated control channel (sub-channel 4)",</span><br><span>                 .chan_nr = RSL_CHAN_SDCCH8_ACCH + (4 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 4,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -465,8 +521,10 @@</span><br><span>       [TRXC_SACCH8_5] = {</span><br><span>          .name = "SACCH/8(5)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/8 associated control channel (sub-channel 5)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH8_ACCH + (5 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 5,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -477,8 +535,10 @@</span><br><span>       [TRXC_SACCH8_6] = {</span><br><span>          .name = "SACCH/8(6)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/8 associated control channel (sub-channel 6)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH8_ACCH + (6 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 6,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -489,8 +549,10 @@</span><br><span>       [TRXC_SACCH8_7] = {</span><br><span>          .name = "SACCH/8(7)", /* 3GPP TS 05.02, section 3.3.4.1 */</span><br><span>                 .desc = "Slow SDCCH/8 associated control channel (sub-channel 7)",</span><br><span style="color: hsl(120, 100%, 40%);">+          .gsmtap_chan_type = GSMTAP_CHANNEL_SDCCH8 | GSMTAP_CHANNEL_ACCH,</span><br><span>             .chan_nr = RSL_CHAN_SDCCH8_ACCH + (7 << 3),</span><br><span>            .link_id = TRX_CH_LID_SACCH,</span><br><span style="color: hsl(120, 100%, 40%);">+          .ss_nr = 7,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH and TRXC_SDCCH8_* (xCCH), see above. */</span><br><span>             .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -501,6 +563,7 @@</span><br><span>        [TRXC_PDTCH] = {</span><br><span>             .name = "PDTCH", /* 3GPP TS 05.02, sections 3.2.4, 3.3.2.4 */</span><br><span>              .desc = "Packet data traffic & control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+                .gsmtap_chan_type = GSMTAP_CHANNEL_PDTCH,</span><br><span>            .chan_nr = RSL_CHAN_OSMO_PDCH,</span><br><span> </span><br><span>           /* Rx and Tx, multiple coding schemes: CS-2..4 and MCS-1..9 (3GPP TS</span><br><span>@@ -515,6 +578,7 @@</span><br><span>   [TRXC_PTCCH] = {</span><br><span>             .name = "PTCCH", /* 3GPP TS 05.02, section 3.3.4.2 */</span><br><span>              .desc = "Packet Timing advance control channel",</span><br><span style="color: hsl(120, 100%, 40%);">+            .gsmtap_chan_type = GSMTAP_CHANNEL_PTCCH,</span><br><span>            .chan_nr = RSL_CHAN_OSMO_PDCH,</span><br><span> </span><br><span>           /* Same as for TRXC_BCCH (xCCH), see above. */</span><br><span>@@ -526,7 +590,9 @@</span><br><span>         [TRXC_SDCCH4_CBCH] = {</span><br><span>               .name = "SDCCH/4(CBCH)", /* 3GPP TS 05.02, section 3.3.5 */</span><br><span>                .desc = "Cell Broadcast channel on SDCCH/4",</span><br><span style="color: hsl(120, 100%, 40%);">+                .gsmtap_chan_type = GSMTAP_CHANNEL_CBCH51,</span><br><span>           .chan_nr = RSL_CHAN_OSMO_CBCH4,</span><br><span style="color: hsl(120, 100%, 40%);">+               .ss_nr = 2,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH (xCCH), but Rx only. See above. */</span><br><span>          .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>@@ -536,7 +602,9 @@</span><br><span>        [TRXC_SDCCH8_CBCH] = {</span><br><span>               .name = "SDCCH/8(CBCH)", /* 3GPP TS 05.02, section 3.3.5 */</span><br><span>                .desc = "Cell Broadcast channel on SDCCH/8",</span><br><span style="color: hsl(120, 100%, 40%);">+                .gsmtap_chan_type = GSMTAP_CHANNEL_CBCH52,</span><br><span>           .chan_nr = RSL_CHAN_OSMO_CBCH8,</span><br><span style="color: hsl(120, 100%, 40%);">+               .ss_nr = 2,</span><br><span> </span><br><span>              /* Same as for TRXC_BCCH (xCCH), but Rx only. See above. */</span><br><span>          .burst_buf_size = 4 * GSM_BURST_PL_LEN,</span><br><span>diff --git a/src/host/trxcon/sched_lchan_rach.c b/src/host/trxcon/sched_lchan_rach.c</span><br><span>index 5d1f3ab..fe5821b 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_rach.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_rach.c</span><br><span>@@ -2,7 +2,7 @@</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  * TDMA scheduler: handlers for DL / UL bursts on logical channels</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2017 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2017-2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -174,6 +174,12 @@</span><br><span>         /* Confirm RACH request */</span><br><span>   l1ctl_tx_rach_conf(trx->l1l, trx->band_arfcn, fn);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* Optional GSMTAP logging */</span><br><span style="color: hsl(120, 100%, 40%);">+ sched_gsmtap_send(lchan->type, fn, ts->index,</span><br><span style="color: hsl(120, 100%, 40%);">+                     trx->band_arfcn | ARFCN_UPLINK, 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                      PRIM_IS_RACH11(lchan->prim) ? (uint8_t *) &ext_req->ra11 : &req->ra,</span><br><span style="color: hsl(120, 100%, 40%);">+                         PRIM_IS_RACH11(lchan->prim) ? 2 : 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* Forget processed primitive */</span><br><span>     sched_prim_drop(lchan);</span><br><span> </span><br><span>diff --git a/src/host/trxcon/sched_lchan_xcch.c b/src/host/trxcon/sched_lchan_xcch.c</span><br><span>index 196f949..d341646 100644</span><br><span>--- a/src/host/trxcon/sched_lchan_xcch.c</span><br><span>+++ b/src/host/trxcon/sched_lchan_xcch.c</span><br><span>@@ -199,14 +199,14 @@</span><br><span> </span><br><span>         /* If we have sent the last (4/4) burst */</span><br><span>   if ((*mask & 0x0f) == 0x0f) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Confirm data sending */</span><br><span style="color: hsl(120, 100%, 40%);">+            sched_send_dt_conf(trx, ts, lchan, fn, false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>             /* Forget processed primitive */</span><br><span>             sched_prim_drop(lchan);</span><br><span> </span><br><span>          /* Reset mask */</span><br><span>             *mask = 0x00;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           /* Confirm data sending */</span><br><span style="color: hsl(0, 100%, 40%);">-              sched_send_dt_conf(trx, ts, lchan, fn, false);</span><br><span>       }</span><br><span> </span><br><span>        return 0;</span><br><span>diff --git a/src/host/trxcon/sched_trx.h b/src/host/trxcon/sched_trx.h</span><br><span>index 6ef9ce4..311a67c 100644</span><br><span>--- a/src/host/trxcon/sched_trx.h</span><br><span>+++ b/src/host/trxcon/sched_trx.h</span><br><span>@@ -110,6 +110,10 @@</span><br><span>    uint8_t chan_nr;</span><br><span>     /*! \brief Link ID (like in RSL) */</span><br><span>  uint8_t link_id;</span><br><span style="color: hsl(120, 100%, 40%);">+      /*! \brief Sub-slot number (for SDCCH and TCH/H) */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t ss_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+        /*! \brief GSMTAP channel type (see GSMTAP_CHANNEL_*) */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t gsmtap_chan_type;</span><br><span> </span><br><span>        /*! \brief How much memory do we need to store bursts */</span><br><span>     size_t burst_buf_size;</span><br><span>@@ -347,6 +351,9 @@</span><br><span>         int bit_error_count, bool dec_failed, bool traffic);</span><br><span> int sched_send_dt_conf(struct trx_instance *trx, struct trx_ts *ts,</span><br><span>  struct trx_lchan_state *lchan, uint32_t fn, bool traffic);</span><br><span style="color: hsl(120, 100%, 40%);">+int sched_gsmtap_send(enum trx_lchan_type lchan_type, uint32_t fn, uint8_t tn,</span><br><span style="color: hsl(120, 100%, 40%);">+                  uint16_t band_arfcn, int8_t signal_dbm, uint8_t snr,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const uint8_t *data, size_t data_len);</span><br><span> </span><br><span> /* Interleaved TCH/H block TDMA frame mapping */</span><br><span> uint32_t sched_tchh_block_dl_first_fn(enum trx_lchan_type chan,</span><br><span>diff --git a/src/host/trxcon/trxcon.c b/src/host/trxcon/trxcon.c</span><br><span>index 8e371df..d49b71f 100644</span><br><span>--- a/src/host/trxcon/trxcon.c</span><br><span>+++ b/src/host/trxcon/trxcon.c</span><br><span>@@ -1,7 +1,7 @@</span><br><span> /*</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2016-2017 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2016-2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -38,6 +38,8 @@</span><br><span> #include <osmocom/core/signal.h></span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/gsmtap_util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/gsmtap.h></span><br><span> </span><br><span> #include <osmocom/gsm/gsm_utils.h></span><br><span> </span><br><span>@@ -51,7 +53,7 @@</span><br><span> #include "sched_trx.h"</span><br><span> </span><br><span> #define COPYRIGHT \</span><br><span style="color: hsl(0, 100%, 40%);">-   "Copyright (C) 2016-2017 by Vadim Yanitskiy <axilirator@gmail.com>\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+       "Copyright (C) 2016-2019 by Vadim Yanitskiy <axilirator@gmail.com>\n" \</span><br><span>      "License GPLv2+: GNU GPL version 2 or later " \</span><br><span>    "<http://gnu.org/licenses/gpl.html>\n" \</span><br><span>     "This is free software: you are free to change and redistribute it.\n" \</span><br><span>@@ -72,9 +74,11 @@</span><br><span>      const char *trx_remote_ip;</span><br><span>   uint16_t trx_base_port;</span><br><span>      uint32_t trx_fn_advance;</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *gsmtap_ip;</span><br><span> } app_data;</span><br><span> </span><br><span> static void *tall_trxcon_ctx = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsmtap_inst *gsmtap = NULL;</span><br><span> struct osmo_fsm_inst *trxcon_fsm;</span><br><span> </span><br><span> static void trxcon_fsm_idle_action(struct osmo_fsm_inst *fi,</span><br><span>@@ -158,6 +162,7 @@</span><br><span>         printf("  -p --trx-port     Base port of TRX instance (default 6700)\n");</span><br><span>  printf("  -f --trx-advance  Scheduler clock advance (default 20)\n");</span><br><span>      printf("  -s --socket       Listening socket for layer23 (default /tmp/osmocom_l2)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("  -g --gsmtap-ip    The destination IP used for GSMTAP (disabled by default)\n");</span><br><span>  printf("  -D --daemonize    Run as daemon\n");</span><br><span> }</span><br><span> </span><br><span>@@ -176,11 +181,12 @@</span><br><span>                    {"trx-remote", 1, 0, 'i'},</span><br><span>                         {"trx-port", 1, 0, 'p'},</span><br><span>                   {"trx-advance", 1, 0, 'f'},</span><br><span style="color: hsl(120, 100%, 40%);">+                 {"gsmtap-ip", 1, 0, 'g'},</span><br><span>                  {"daemonize", 0, 0, 'D'},</span><br><span>                  {0, 0, 0, 0}</span><br><span>                 };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-          c = getopt_long(argc, argv, "d:b:i:p:f:s:Dh",</span><br><span style="color: hsl(120, 100%, 40%);">+               c = getopt_long(argc, argv, "d:b:i:p:f:s:g:Dh",</span><br><span>                            long_options, &option_index);</span><br><span>            if (c == -1)</span><br><span>                         break;</span><br><span>@@ -209,6 +215,9 @@</span><br><span>                 case 's':</span><br><span>                    app_data.bind_socket = optarg;</span><br><span>                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'g':</span><br><span style="color: hsl(120, 100%, 40%);">+                     app_data.gsmtap_ip = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span>               case 'D':</span><br><span>                    app_data.daemonize = 1;</span><br><span>                      break;</span><br><span>@@ -227,6 +236,7 @@</span><br><span>         app_data.trx_fn_advance = 20;</span><br><span> </span><br><span>    app_data.debug_mask = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+   app_data.gsmtap_ip = NULL;</span><br><span>   app_data.daemonize = 0;</span><br><span>      app_data.quit = 0;</span><br><span> }</span><br><span>@@ -273,6 +283,17 @@</span><br><span>       /* Init logging system */</span><br><span>    trx_log_init(tall_trxcon_ctx, app_data.debug_mask);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       /* Optional GSMTAP  */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (app_data.gsmtap_ip != NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+             gsmtap = gsmtap_source_init(app_data.gsmtap_ip, GSMTAP_UDP_PORT, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!gsmtap) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGP(DAPP, LOGL_ERROR, "Failed to init GSMTAP\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                  goto exit;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Suppress ICMP "destination unreachable" errors */</span><br><span style="color: hsl(120, 100%, 40%);">+                gsmtap_source_add_sink(gsmtap);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Allocate the application state machine */</span><br><span>         osmo_fsm_register(&trxcon_fsm_def);</span><br><span>      trxcon_fsm = osmo_fsm_inst_alloc(&trxcon_fsm_def, tall_trxcon_ctx,</span><br><span>diff --git a/src/host/trxcon/trxcon.h b/src/host/trxcon/trxcon.h</span><br><span>index f66a628..9a0792b 100644</span><br><span>--- a/src/host/trxcon/trxcon.h</span><br><span>+++ b/src/host/trxcon/trxcon.h</span><br><span>@@ -3,6 +3,7 @@</span><br><span> #define GEN_MASK(state) (0x01 << state)</span><br><span> </span><br><span> extern struct osmo_fsm_inst *trxcon_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct gsmtap_inst *gsmtap;</span><br><span> </span><br><span> enum trxcon_fsm_states {</span><br><span>   TRXCON_STATE_IDLE = 0,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/15568">change 15568</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/osmocom-bb/+/15568"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iab4128fee5f18d816830fdca6c5ebebaf7451902 </div>
<div style="display:none"> Gerrit-Change-Number: 15568 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>