<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-abis/+/18181">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trau_frame: Add 16k HR + OAM encoding/decoding; add AMR encoding<br><br>Change-Id: I589a0e97e48e7f89d9166793b9887462756e8f09<br>---<br>M include/osmocom/abis/trau_frame.h<br>M src/trau_frame.c<br>2 files changed, 157 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/81/18181/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/abis/trau_frame.h b/include/osmocom/abis/trau_frame.h</span><br><span>index afcaaa4..0f3d1d2 100644</span><br><span>--- a/include/osmocom/abis/trau_frame.h</span><br><span>+++ b/include/osmocom/abis/trau_frame.h</span><br><span>@@ -52,13 +52,17 @@</span><br><span> };</span><br><span> </span><br><span> #define TRAU_FT_FR_UP          0x02    /* 0 0 0 1 0 - 3.5.1.1.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRAU_FT_HR_UP              0x03    /* 0 0 0 1 1 - TS 08.61 5.1.4.1.1 */</span><br><span> #define TRAU_FT_FR_DOWN         0x1c    /* 1 1 1 0 0 - 3.5.1.1.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRAU_FT_HR_DOWN            0x1d    /* 1 1 1 0 1 - TS 08.61 5.1.4.1.1 */</span><br><span> #define TRAU_FT_EFR             0x1a    /* 1 1 0 1 0 - 3.5.1.1.1 */</span><br><span> #define TRAU_FT_AMR              0x06    /* 0 0 1 1 0 - 3.5.1.2 */</span><br><span> #define TRAU_FT_OM_UP              0x05    /* 0 0 1 0 1 - 3.5.2 */</span><br><span> #define TRAU_FT_OM_DOWN              0x1b    /* 1 1 0 1 1 - 3.5.2 */</span><br><span> #define TRAU_FT_DATA_UP              0x08    /* 0 1 0 0 0 - 3.5.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRAU_FT_DATA_UP_HR     0x09    /* 0 1 0 0 1 - TS 08.61 5.1.4.2 */</span><br><span> #define TRAU_FT_DATA_DOWN 0x16    /* 1 0 1 1 0 - 3.5.3 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TRAU_FT_DATA_DOWN_HR   0x17    /* 0 1 0 0 1 - TS 08.61 5.1.4.2 */</span><br><span> #define TRAU_FT_D145_SYNC 0x14    /* 1 0 1 0 0 - 3.5.3 */</span><br><span> #define TRAU_FT_EDATA                0x1f    /* 1 1 1 1 1 - 3.5.4 */</span><br><span> #define TRAU_FT_IDLE_UP              0x10    /* 1 0 0 0 0 - 3.5.5 */</span><br><span>diff --git a/src/trau_frame.c b/src/trau_frame.c</span><br><span>index 981c2cf..2f0e9da 100644</span><br><span>--- a/src/trau_frame.c</span><br><span>+++ b/src/trau_frame.c</span><br><span>@@ -1,6 +1,6 @@</span><br><span> /* TRAU frame handling according to GSM TS 08.60 */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2009 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2009,2020 by Harald Welte <laforge@gnumonks.org></span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>  * SPDX-License-Identifier: AGPL-3.0+</span><br><span>@@ -94,6 +94,25 @@</span><br><span>       memcpy(fr->d_bits + d_idx, trau_bits + 305, 11);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Decode according to 3.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+static void decode_oam(struct decoded_trau_frame *fr, const ubit_t *trau_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int i, d_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* C1 .. C15 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(fr->c_bits+0, trau_bits+17, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* D1 .. D255 */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 33, d_idx = 0; i < 312; i += 16, d_idx += 15)</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(fr->d_bits + d_idx, trau_bits+i+1, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* D256 .. D264 */</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(fr->d_bits+d_idx, trau_bits+305, 9);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* S1 .. S6 */</span><br><span style="color: hsl(120, 100%, 40%);">+        memcpy(fr->s_bits, trau_bits+314, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Decode according to 3.3.2 */</span><br><span> static void decode_data(struct decoded_trau_frame *fr, const ubit_t *trau_bits)</span><br><span> {</span><br><span>       /* C1 .. C15 */</span><br><span>@@ -102,6 +121,39 @@</span><br><span>       memcpy(fr->d_bits, trau_bits+32, 288);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Decode according to TS 08.61 section 5.1.1.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+static void decode_hr(struct decoded_trau_frame *fr, const ubit_t *trau_bits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int  d_idx = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* C1 .. C15 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(fr->c_bits+0, trau_bits+17, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* C16 .. C21 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(fr->c_bits+15, trau_bits+310, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* T1 .. T4 */</span><br><span style="color: hsl(120, 100%, 40%);">+        memcpy(fr->t_bits+0, trau_bits+316, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* D1 .. D14 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(fr->d_bits+d_idx, trau_bits+34, 14); d_idx += 14;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* D15 .. D29 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(fr->d_bits+d_idx, trau_bits+49, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* D30 .. D44 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(fr->d_bits+d_idx, trau_bits+65, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* D45 .. D56 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(fr->d_bits+d_idx, trau_bits+84, 12); d_idx += 12;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* D57 .. D71 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(fr->d_bits+d_idx, trau_bits+97, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* D72 .. D86 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(fr->d_bits+d_idx, trau_bits+113, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* D87 .. D101 */</span><br><span style="color: hsl(120, 100%, 40%);">+     memcpy(fr->d_bits+d_idx, trau_bits+129, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* D102 .. D112 */</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(fr->d_bits+d_idx, trau_bits+145, 11); d_idx += 11;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: UFI */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: CRC */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int decode_trau_frame(struct decoded_trau_frame *fr, const ubit_t *trau_bits)</span><br><span> {</span><br><span>  ubit_t cbits5 = get_bits(trau_bits, 17, 5);</span><br><span>@@ -123,6 +175,12 @@</span><br><span>           break;</span><br><span>       case TRAU_FT_OM_UP:</span><br><span>  case TRAU_FT_OM_DOWN:</span><br><span style="color: hsl(120, 100%, 40%);">+         decode_oam(fr, trau_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TRAU_FT_HR_UP:</span><br><span style="color: hsl(120, 100%, 40%);">+   case TRAU_FT_HR_DOWN:</span><br><span style="color: hsl(120, 100%, 40%);">+         decode_hr(fr, trau_bits);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span>       case TRAU_FT_D145_SYNC:</span><br><span>      case TRAU_FT_EDATA:</span><br><span>          LOGP(DLMUX, LOGL_NOTICE, "can't decode unimplemented TRAU "</span><br><span>@@ -235,6 +293,92 @@</span><br><span>     memcpy(trau_bits+316, fr->t_bits+0, 4);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* TS 08.60 Section 3.1.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+static void encode_amr(ubit_t *trau_bits, const struct decoded_trau_frame *fr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int i, d_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       trau_bits[16] = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* C1 .. C15 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(trau_bits+17, fr->c_bits+0, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  trau_bits[32] = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* C16 .. C25 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(trau_bits+33, fr->c_bits+15, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* D1 .. D5 */</span><br><span style="color: hsl(120, 100%, 40%);">+        memcpy(trau_bits+43, fr->d_bits+0, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* D6 .. D256 */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 48, d_idx = 5; i <= 315; i += 16, d_idx += 15) {</span><br><span style="color: hsl(120, 100%, 40%);">+          trau_bits[i] = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(trau_bits+i+1, fr->d_bits + d_idx, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* FIXME: handle timing adjustment */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* T1 .. T4 */</span><br><span style="color: hsl(120, 100%, 40%);">+        memcpy(trau_bits+316, fr->t_bits+0, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* TS 08.60 Section 3.2 */</span><br><span style="color: hsl(120, 100%, 40%);">+static void encode_oam(ubit_t *trau_bits, const struct decoded_trau_frame *fr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int i, d_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       trau_bits[16] = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* C1 .. C15 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(trau_bits+17, fr->c_bits+0, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* D1 .. D255 */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 32, d_idx = 0; i < 304; i+= 16, d_idx += 15) {</span><br><span style="color: hsl(120, 100%, 40%);">+            trau_bits[i] = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(trau_bits+i+1, fr->d_bits + d_idx, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* D256 .. D264 */</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(trau_bits+305, fr->d_bits+256, 9);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* S1 .. S6 */</span><br><span style="color: hsl(120, 100%, 40%);">+        memcpy(trau_bits+314, fr->s_bits, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* TS 08.61 Section 5.1.1.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+static void encode_hr(ubit_t *trau_bits, const struct decoded_trau_frame *fr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int d_idx = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      trau_bits[16] = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* C1 .. C15 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(trau_bits+17, fr->c_bits+0, 15);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: UFI */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* D1 .. D14 */</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(trau_bits+4*8+2, fr->d_bits+d_idx, 14); d_idx += 14;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* D15 .. D29 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(trau_bits+6*8+1, fr->d_bits+d_idx, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* D30 .. D44 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(trau_bits+8*8+1, fr->d_bits+d_idx, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: CRC */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* D45 .. D56 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(trau_bits+10*8+4, fr->d_bits+d_idx, 12); d_idx += 12;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* D57 .. D71 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(trau_bits+12*8+1, fr->d_bits+d_idx, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* D72 .. D86 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(trau_bits+14*8+1, fr->d_bits+d_idx, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* D87 .. D101 */</span><br><span style="color: hsl(120, 100%, 40%);">+     memcpy(trau_bits+16*8+1, fr->d_bits+d_idx, 15); d_idx += 15;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* D102 .. D112 */</span><br><span style="color: hsl(120, 100%, 40%);">+    memcpy(trau_bits+18*8+1, fr->d_bits+d_idx, 11); d_idx += 11;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     memset(trau_bits+19*8+4, 0x01, 4+18*8+6);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* C16 .. C21 */</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(trau_bits+38*8+6, fr->c_bits+15, 6);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* T1 .. T4 */</span><br><span style="color: hsl(120, 100%, 40%);">+        memcpy(trau_bits+39*8+4, fr->t_bits+0, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void encode_data(ubit_t *trau_bits, const struct decoded_trau_frame *fr)</span><br><span> {</span><br><span>   trau_bits[16] = 1;</span><br><span>@@ -269,8 +413,16 @@</span><br><span>            encode_data(trau_bits, fr);</span><br><span>          break;</span><br><span>       case TRAU_FT_AMR:</span><br><span style="color: hsl(120, 100%, 40%);">+             encode_amr(trau_bits, fr);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       case TRAU_FT_OM_UP:</span><br><span>  case TRAU_FT_OM_DOWN:</span><br><span style="color: hsl(120, 100%, 40%);">+         encode_oam(trau_bits, fr);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TRAU_FT_HR_UP:</span><br><span style="color: hsl(120, 100%, 40%);">+   case TRAU_FT_HR_DOWN:</span><br><span style="color: hsl(120, 100%, 40%);">+         encode_hr(trau_bits, fr);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span>       case TRAU_FT_D145_SYNC:</span><br><span>      case TRAU_FT_EDATA:</span><br><span>          LOGP(DLMUX, LOGL_NOTICE, "unimplemented TRAU Frame Type "</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-abis/+/18181">change 18181</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/libosmo-abis/+/18181"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-abis </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I589a0e97e48e7f89d9166793b9887462756e8f09 </div>
<div style="display:none"> Gerrit-Change-Number: 18181 </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>