<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/17426">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gsmtap: Solve TCH / FACCH confusion once and for all<br><br>* What we used to call TCH/F and TCH/H in gsmtap are actually only<br>  FACCH/F and FACCH/H, i.e. the signaling part of Bm/Lm channels<br><br>* Give them proper names with backwards compatibility #define<br><br>* Split VOICE into VOICE_F and VOICE_H.  If we don't differentiate this,<br>  a receiver is not able to determine the RSL channel ID of a frame<br>  without looking at external state/context.  That in turn has been a<br>  design feature of GSMTAP Um format so far, and programs like<br>  osmo-bts-virtual rely on it.<br><br>Change-Id: I952044a17334f35712e087dc41781805000aebc1<br>Related: OS#2557<br>---<br>M include/osmocom/core/gsmtap.h<br>M include/osmocom/core/gsmtap_util.h<br>M src/gsmtap_util.c<br>3 files changed, 40 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/26/17426/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/gsmtap.h b/include/osmocom/core/gsmtap.h</span><br><span>index 87c18e3..82e9525 100644</span><br><span>--- a/include/osmocom/core/gsmtap.h</span><br><span>+++ b/include/osmocom/core/gsmtap.h</span><br><span>@@ -82,8 +82,8 @@</span><br><span> #define GSMTAP_CHANNEL_SDCCH  0x06</span><br><span> #define GSMTAP_CHANNEL_SDCCH4   0x07</span><br><span> #define GSMTAP_CHANNEL_SDCCH8   0x08</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_CHANNEL_TCH_F        0x09    /* Actually, it's FACCH/F (signaling) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_CHANNEL_TCH_H        0x0a    /* Actually, it's FACCH/H (signaling) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSMTAP_CHANNEL_FACCH_F    0x09    /* Actually, it's FACCH/F (signaling) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSMTAP_CHANNEL_FACCH_H    0x0a    /* Actually, it's FACCH/H (signaling) */</span><br><span> #define GSMTAP_CHANNEL_PACCH    0x0b</span><br><span> #define GSMTAP_CHANNEL_CBCH52   0x0c</span><br><span> #define GSMTAP_CHANNEL_PDTCH    0x0d</span><br><span>@@ -91,7 +91,10 @@</span><br><span> #define GSMTAP_CHANNEL_PDCH        GSMTAP_CHANNEL_PDTCH</span><br><span> #define GSMTAP_CHANNEL_PTCCH    0x0e</span><br><span> #define GSMTAP_CHANNEL_CBCH51   0x0f</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSMTAP_CHANNEL_VOICE        0x10    /* voice codec payload (HR/FR/EFR/AMR) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSMTAP_CHANNEL_VOICE_F       0x10    /* voice codec payload (FR/EFR/AMR) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSMTAP_CHANNEL_VOICE_H  0x11    /* voice codec payload (HR/AMR) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSMTAP_CHANNEL_TCH_F        GSMTAP_CHANNEL_FACCH_F  /* We used the wrong naming in 2008 when we were young */</span><br><span style="color: hsl(120, 100%, 40%);">+#define GSMTAP_CHANNEL_TCH_H GSMTAP_CHANNEL_FACCH_H  /* We used the wrong naming in 2008 when we were young */</span><br><span> </span><br><span> /* GPRS Coding Scheme CS1..4 */</span><br><span> #define GSMTAP_GPRS_CS_BASE 0x20</span><br><span>diff --git a/include/osmocom/core/gsmtap_util.h b/include/osmocom/core/gsmtap_util.h</span><br><span>index f8a12a6..d583401 100644</span><br><span>--- a/include/osmocom/core/gsmtap_util.h</span><br><span>+++ b/include/osmocom/core/gsmtap_util.h</span><br><span>@@ -8,7 +8,11 @@</span><br><span>  *  @{</span><br><span>  * \file gsmtap_util.h */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t chantype_rsl2gsmtap2(uint8_t rsl_chantype, uint8_t rsl_link_id, bool user_plane);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> uint8_t chantype_rsl2gsmtap(uint8_t rsl_chantype, uint8_t rsl_link_id);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_DEPRECATED("Use chantype_rsl2gsmtap2() instead")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void chantype_gsmtap2rsl(uint8_t gsmtap_chantype, uint8_t *rsl_chantype, uint8_t *link_id);</span><br><span> </span><br><span> struct msgb *gsmtap_makemsg_ex(uint8_t type, uint16_t arfcn, uint8_t ts, uint8_t chan_type,</span><br><span>diff --git a/src/gsmtap_util.c b/src/gsmtap_util.c</span><br><span>index 40ec4b8..9a0ac02 100644</span><br><span>--- a/src/gsmtap_util.c</span><br><span>+++ b/src/gsmtap_util.c</span><br><span>@@ -54,18 +54,25 @@</span><br><span> /*! convert RSL channel number to GSMTAP channel type</span><br><span>  *  \param[in] rsl_chantype RSL channel type</span><br><span>  *  \param[in] link_id RSL link identifier</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] user_plane Is this voice/csd user plane (1) or signaling (0)</span><br><span>  *  \returns GSMTAP channel type</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t chantype_rsl2gsmtap(uint8_t rsl_chantype, uint8_t link_id)</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t chantype_rsl2gsmtap2(uint8_t rsl_chantype, uint8_t link_id, bool user_plane)</span><br><span> {</span><br><span>       uint8_t ret = GSMTAP_CHANNEL_UNKNOWN;</span><br><span> </span><br><span>    switch (rsl_chantype) {</span><br><span>      case RSL_CHAN_Bm_ACCHs:</span><br><span style="color: hsl(0, 100%, 40%);">-         ret = GSMTAP_CHANNEL_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (user_plane)</span><br><span style="color: hsl(120, 100%, 40%);">+                       ret = GSMTAP_CHANNEL_VOICE_F;</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+                  ret = GSMTAP_CHANNEL_FACCH_F;</span><br><span>                break;</span><br><span>       case RSL_CHAN_Lm_ACCHs:</span><br><span style="color: hsl(0, 100%, 40%);">-         ret = GSMTAP_CHANNEL_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (user_plane)</span><br><span style="color: hsl(120, 100%, 40%);">+                       ret = GSMTAP_CHANNEL_VOICE_H;</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+                  ret = GSMTAP_CHANNEL_FACCH_H;</span><br><span>                break;</span><br><span>       case RSL_CHAN_SDCCH4_ACCH:</span><br><span>           ret = GSMTAP_CHANNEL_SDCCH4;</span><br><span>@@ -100,6 +107,16 @@</span><br><span>  return ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! convert RSL channel number to GSMTAP channel type</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] rsl_chantype RSL channel type</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] link_id RSL link identifier</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns GSMTAP channel type</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t chantype_rsl2gsmtap(uint8_t rsl_chantype, uint8_t link_id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return chantype_rsl2gsmtap2(rsl_chantype, link_id, false);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! convert GSMTAP channel type to RSL channel number + Link ID</span><br><span>  *  \param[in] gsmtap_chantype GSMTAP channel type</span><br><span>  *  \param[out] rsl_chantype RSL channel mumber</span><br><span>@@ -109,10 +126,12 @@</span><br><span>                          uint8_t *link_id)</span><br><span> {</span><br><span>       switch (gsmtap_chantype & ~GSMTAP_CHANNEL_ACCH & 0xff) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case GSMTAP_CHANNEL_TCH_F: // TCH/F, FACCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+  case GSMTAP_CHANNEL_FACCH_F:</span><br><span style="color: hsl(120, 100%, 40%);">+  case GSMTAP_CHANNEL_VOICE_F: // TCH/F</span><br><span>                *rsl_chantype = RSL_CHAN_Bm_ACCHs;</span><br><span>           break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSMTAP_CHANNEL_TCH_H: // TCH/H, FACCH/H</span><br><span style="color: hsl(120, 100%, 40%);">+  case GSMTAP_CHANNEL_FACCH_H:</span><br><span style="color: hsl(120, 100%, 40%);">+  case GSMTAP_CHANNEL_VOICE_H: // TCH/H</span><br><span>                *rsl_chantype = RSL_CHAN_Lm_ACCHs;</span><br><span>           break;</span><br><span>       case GSMTAP_CHANNEL_SDCCH4: // SDCCH/4</span><br><span>@@ -467,8 +486,8 @@</span><br><span>         { GSMTAP_CHANNEL_SDCCH,         "SDCCH" },</span><br><span>         { GSMTAP_CHANNEL_SDCCH4,        "SDCCH/4" },</span><br><span>       { GSMTAP_CHANNEL_SDCCH8,        "SDCCH/8" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { GSMTAP_CHANNEL_TCH_F,         "TCH/F/FACCH/F" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSMTAP_CHANNEL_TCH_H,         "TCH/H/FACCH/H" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { GSMTAP_CHANNEL_FACCH_F,       "FACCH/F" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { GSMTAP_CHANNEL_FACCH_H,       "FACCH/H" },</span><br><span>       { GSMTAP_CHANNEL_PACCH,         "PACCH" },</span><br><span>         { GSMTAP_CHANNEL_CBCH52,        "CBCH" },</span><br><span>  { GSMTAP_CHANNEL_PDCH,          "PDCH" } ,</span><br><span>@@ -477,9 +496,10 @@</span><br><span>  { GSMTAP_CHANNEL_ACCH | GSMTAP_CHANNEL_SDCCH, "LSACCH" },</span><br><span>  { GSMTAP_CHANNEL_ACCH | GSMTAP_CHANNEL_SDCCH4, "SACCH/4" },</span><br><span>        { GSMTAP_CHANNEL_ACCH | GSMTAP_CHANNEL_SDCCH8, "SACCH/8" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { GSMTAP_CHANNEL_ACCH | GSMTAP_CHANNEL_TCH_F, "SACCH/F" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSMTAP_CHANNEL_ACCH | GSMTAP_CHANNEL_TCH_H, "SACCH/H" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { GSMTAP_CHANNEL_VOICE,         "VOICE" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { GSMTAP_CHANNEL_ACCH | GSMTAP_CHANNEL_FACCH_F, "SACCH/F" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { GSMTAP_CHANNEL_ACCH | GSMTAP_CHANNEL_FACCH_H, "SACCH/H" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { GSMTAP_CHANNEL_VOICE_F,       "TCH/F" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { GSMTAP_CHANNEL_VOICE_H,       "TCH/H" },</span><br><span>         { 0, NULL }</span><br><span> };</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/17426">change 17426</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/libosmocore/+/17426"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I952044a17334f35712e087dc41781805000aebc1 </div>
<div style="display:none"> Gerrit-Change-Number: 17426 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>