<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-e1d/+/16741">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">e1-prbs-test: Add initial code for checking ICE40-E1 traces<br><br>The idea of this code is to check captures made by ICE40 against<br>the known transmitted per-timeslots PRBS sequences.<br><br>Change-Id: I084a9737c9e051dcadf971e39e32f10f89aecfbd<br>---<br>M contrib/e1-prbs-test/Makefile<br>A contrib/e1-prbs-test/ice40-rx.c<br>M contrib/e1-prbs-test/internal.h<br>3 files changed, 239 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-e1d refs/changes/41/16741/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/contrib/e1-prbs-test/Makefile b/contrib/e1-prbs-test/Makefile</span><br><span>index 726befc..172847f 100644</span><br><span>--- a/contrib/e1-prbs-test/Makefile</span><br><span>+++ b/contrib/e1-prbs-test/Makefile</span><br><span>@@ -4,13 +4,16 @@</span><br><span> CFLAGS=-O2 -g -Wall -Werror $(LIBOSMO_CFLAGS)</span><br><span> LIBS=$(LIBOSMO_LIBS)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-all: e1-prbs-test</span><br><span style="color: hsl(120, 100%, 40%);">+all: e1-prbs-test ice40-e1-prbs-check</span><br><span> </span><br><span> e1-prbs-test: main.o rx.o tx.o prbs.o utils.o</span><br><span>       $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ice40-e1-prbs-check: ice40-rx.o rx.o prbs.o utils.o</span><br><span style="color: hsl(120, 100%, 40%);">+    $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> %.o: %.c</span><br><span>      $(CC) $(CFLAGS) -o $@ -c $^</span><br><span> </span><br><span> clean:</span><br><span style="color: hsl(0, 100%, 40%);">-       @rm -f e1-prbs-test e1-prbs-test *.o</span><br><span style="color: hsl(120, 100%, 40%);">+  @rm -f e1-prbs-test ice40-e1-prbs-check *.o</span><br><span>diff --git a/contrib/e1-prbs-test/ice40-rx.c b/contrib/e1-prbs-test/ice40-rx.c</span><br><span>new file mode 100644</span><br><span>index 0000000..de0e4f1</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/e1-prbs-test/ice40-rx.c</span><br><span>@@ -0,0 +1,233 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2019 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published</span><br><span style="color: hsl(120, 100%, 40%);">+ * by the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+#define _GNU_SOURCE</span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/types.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/stat.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/ioctl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <dirent.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <fcntl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <getopt.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <dahdi/user.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/select.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/bits.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/prbs.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct test_state g_tst;</span><br><span style="color: hsl(120, 100%, 40%);">+static int g_prbs_offs_rx;</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t g_usb_endpoint = 0x81;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define E1_CHUNK_HDR_MAGIC  0xe115600d /* E1 is good */</span><br><span style="color: hsl(120, 100%, 40%);">+struct e1_chunk_hdr {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t magic;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint64_t sec;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint64_t usec;</span><br><span style="color: hsl(120, 100%, 40%);">+        } time;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t len;           /* length of following payload */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t ep;             /* USB endpoint */</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ts_buf {</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t bytes[1024];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+struct line_ts_buf {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ts_buf ts_buf[32];</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int next_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static struct line_ts_buf g_line_ts_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int demux_in(struct test_state *tst, const uint8_t *data, size_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (len % 32)</span><br><span style="color: hsl(120, 100%, 40%);">+         fprintf(stderr, "Length %zu is not multiple of 32\n", len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                uint32_t ts_nr = i % 32;</span><br><span style="color: hsl(120, 100%, 40%);">+              g_line_ts_buf.ts_buf[ts_nr].bytes[g_line_ts_buf.next_offset] = data[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             /* go to next offset in all per-timeslot buffers */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (ts_nr == 31)</span><br><span style="color: hsl(120, 100%, 40%);">+                      g_line_ts_buf.next_offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* if per-ts buffers are full, hand them to decoder */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (g_line_ts_buf.next_offset >= sizeof(g_line_ts_buf.ts_buf[0].bytes)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  uint8_t j;</span><br><span style="color: hsl(120, 100%, 40%);">+                    for (j = 0; j < 32; j++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         struct timeslot_state *ts = &tst->ts[j];</span><br><span style="color: hsl(120, 100%, 40%);">+                               //printf("process_rx(%u, %s)\n", j, osmo_hexdump(g_line_ts_buf.ts_buf[j].bytes, g_line_ts_buf.next_offset));</span><br><span style="color: hsl(120, 100%, 40%);">+                                process_rx(&ts->rx, j, g_line_ts_buf.ts_buf[j].bytes, g_line_ts_buf.next_offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     memset(&g_line_ts_buf, 0, sizeof(g_line_ts_buf));</span><br><span style="color: hsl(120, 100%, 40%);">+                 g_line_ts_buf.next_offset = 0;</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%);">+     return 0;</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%);">+static int process_file(struct test_state *tst, int fd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct e1_chunk_hdr hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned long offset = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t buf[65535];</span><br><span style="color: hsl(120, 100%, 40%);">+   int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* first read header */</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = read(fd, &hdr, sizeof(hdr));</span><br><span style="color: hsl(120, 100%, 40%);">+         if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            if (rc != sizeof(hdr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, "%d is less than header size (%zd)\n", rc, sizeof(hdr));</span><br><span style="color: hsl(120, 100%, 40%);">+                    return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             offset += rc;</span><br><span style="color: hsl(120, 100%, 40%);">+         if (hdr.magic != E1_CHUNK_HDR_MAGIC) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        fprintf(stderr, "offset %lu: Wrong magic 0x%08x\n", offset, hdr.magic);</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -1;</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%);">+           /* then read payload */</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = read(fd, buf, hdr.len);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            offset += rc;</span><br><span style="color: hsl(120, 100%, 40%);">+         if (rc != hdr.len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  fprintf(stderr, "%d is less than payload size (%d)\n", rc, hdr.len);</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -1;</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%);">+           /* filter on the endpoint (direction) specified by the user */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (hdr.ep != g_usb_endpoint)</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (hdr.len <= 4)</span><br><span style="color: hsl(120, 100%, 40%);">+                  continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           //printf("> %s\n", osmo_hexdump(buf, hdr.len));</span><br><span style="color: hsl(120, 100%, 40%);">+          demux_in(tst, buf+4, hdr.len-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%);">+static int open_file(struct test_state *tst, const char *fname)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < 32; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         struct timeslot_state *ts = &tst->ts[i];</span><br><span style="color: hsl(120, 100%, 40%);">+               ts->ofd.priv_nr = i;</span><br><span style="color: hsl(120, 100%, 40%);">+               ts_init_prbs_rx(ts, g_prbs_offs_rx);</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%);">+   return open(fname, O_RDONLY);</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%);">+static void print_report(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct timespec ts_now;</span><br><span style="color: hsl(120, 100%, 40%);">+       int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      clock_gettime(CLOCK_MONOTONIC, &ts_now);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < ARRAY_SIZE(g_tst.ts); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               const struct timeslot_state *ts = &g_tst.ts[i];</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("E1TS(%02u) STATS: sync_losses=%u, bit_errs=%u in %lu seconds\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    ts->ofd.priv_nr, ts->rx.sync_state.num_sync_loss, ts->rx.sync_state.num_bit_err,</span><br><span style="color: hsl(120, 100%, 40%);">+                     ts_now.tv_sec - ts->rx.sync_state.ts_sync.tv_sec);</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%);">+static void sig_handler(int signal)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (signal) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case SIGINT:</span><br><span style="color: hsl(120, 100%, 40%);">+          print_report();</span><br><span style="color: hsl(120, 100%, 40%);">+               exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIGHUP:</span><br><span style="color: hsl(120, 100%, 40%);">+          print_report();</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</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%);">+static void handle_options(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int c;</span><br><span style="color: hsl(120, 100%, 40%);">+                static const struct option long_opts[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                    { "rx-prbs-offset", 1, 0, 'r' },</span><br><span style="color: hsl(120, 100%, 40%);">+                    { "endpoint", 1, 0, 'e' },</span><br><span style="color: hsl(120, 100%, 40%);">+                  { 0, 0, 0, 0 }</span><br><span style="color: hsl(120, 100%, 40%);">+                };</span><br><span style="color: hsl(120, 100%, 40%);">+            c = getopt_long(argc, argv, "r:e:", long_opts, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (c == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case 'r':</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_prbs_offs_rx = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'e':</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_usb_endpoint = strtoul(optarg, NULL, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      exit(1);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    char *fname;</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     handle_options(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (argc <= optind) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "You must specify the file name of the ICE40-E1 capture\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fname = argv[optind];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       signal(SIGINT, sig_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGHUP, sig_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = open_file(&g_tst, fname);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Error opening %s: %s\n", fname, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     process_file(&g_tst, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ print_report();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/contrib/e1-prbs-test/internal.h b/contrib/e1-prbs-test/internal.h</span><br><span>index 681648a..a2c4ef5 100644</span><br><span>--- a/contrib/e1-prbs-test/internal.h</span><br><span>+++ b/contrib/e1-prbs-test/internal.h</span><br><span>@@ -4,7 +4,7 @@</span><br><span> #include <osmocom/core/prbs.h></span><br><span> #include <osmocom/core/select.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define MAX_NR_TS    31</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_NR_TS   32</span><br><span> #define PRBS_LEN  2048</span><br><span> </span><br><span> /* prbs.c */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-e1d/+/16741">change 16741</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-e1d/+/16741"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-e1d </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I084a9737c9e051dcadf971e39e32f10f89aecfbd </div>
<div style="display:none"> Gerrit-Change-Number: 16741 </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>