aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TODO-RELEASE5
-rw-r--r--configure.ac7
-rw-r--r--contrib/libosmo-abis.spec.in15
-rw-r--r--contrib/trau2rtp/trau2rtp.c32
-rw-r--r--debian/changelog77
-rw-r--r--debian/control16
-rw-r--r--debian/libosmoabis9.install (renamed from debian/libosmoabis6.install)0
-rw-r--r--include/osmocom/abis/unixsocket_proto.h2
-rw-r--r--include/osmocom/trau/trau_rtp.h5
-rw-r--r--include/osmocom/trau/trau_sync.h1
-rw-r--r--src/Makefile.am8
-rw-r--r--src/input/unixsocket.c68
-rw-r--r--src/trau/trau_frame.c3
-rw-r--r--src/trau/trau_rtp_conv.c296
-rw-r--r--src/trau/trau_sync.c11
-rw-r--r--tests/trau_sync/trau_sync_test.c1
-rw-r--r--tests/trau_sync/trau_sync_test.err27
17 files changed, 435 insertions, 139 deletions
diff --git a/TODO-RELEASE b/TODO-RELEASE
index bf3ef84..d0852fc 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -7,8 +7,3 @@
# If any interfaces have been added since the last public release: c:r:a + 1.
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
-libosmo-abis API change major: add parameter to struct e1inp_line
-libosmo-trau API change add new function osmo_rtp_socket_set_dscp()
-libosmo-abis API change major: add parameter to struct lapd_instance
-libosmo-abis Field added struct e1inp_line "use_count". REMINDER: Upon LIBVERSION c bump, take the chance to drop struct e1inp_line "refcnt" field.
-libosmo-abis libosmogsm dep Use of lapd_dl_init2() requires libosmocore > 1.3.0 (not yet released, 00b2faf8217338d4d7d1f4d27331af3151447350)
diff --git a/configure.ac b/configure.ac
index 04ffca6..a7dde2f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -64,9 +64,10 @@ AC_SUBST(SYMBOL_VISIBILITY)
dnl Generate the output
AM_CONFIG_HEADER(config.h)
-PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.1.0)
-PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.1.0)
-PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.1.0)
+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.4.0)
+PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 1.4.0)
+PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.4.0)
+PKG_CHECK_MODULES(LIBOSMOCODEC, libosmocodec >= 1.4.0)
PKG_CHECK_MODULES(ORTP, ortp >= 0.22.0)
AC_ARG_ENABLE([dahdi],
diff --git a/contrib/libosmo-abis.spec.in b/contrib/libosmo-abis.spec.in
index da0c2d8..d010099 100644
--- a/contrib/libosmo-abis.spec.in
+++ b/contrib/libosmo-abis.spec.in
@@ -30,6 +30,7 @@ BuildRequires: xz
BuildRequires: pkgconfig(libosmocore) >= 1.1.0
BuildRequires: pkgconfig(libosmogsm) >= 1.1.0
BuildRequires: pkgconfig(libosmovty) >= 1.1.0
+BuildRequires: pkgconfig(libosmocodec) >= 1.1.0
BuildRequires: pkgconfig(ortp) >= 0.22
BuildRequires: pkgconfig(talloc)
@@ -38,12 +39,12 @@ In GSM, A-bis is a BSS-internal interface link between the BTS and
BSC. This interface allows control of the radio equipment and radio
frequency allocation in the BTS.
-%package -n libosmoabis6
+%package -n libosmoabis9
Summary: Osmocom GSM A-bis interface library
License: AGPL-3.0-or-later
Group: System/Libraries
-%description -n libosmoabis6
+%description -n libosmoabis9
In the GSM system architecture, A-bis is a Base Station
System-internal interface linking the Base Transceiver Stations (BTS)
and Base Station Controller (BSC). This interface allows control of
@@ -57,7 +58,7 @@ cards, as well as some A-bis/IP dialects.
Summary: Development files for the Osmocom GSM A-bis library
License: AGPL-3.0-or-later
Group: Development/Libraries/C and C++
-Requires: libosmoabis6 = %version
+Requires: libosmoabis9 = %version
Requires: libosmocore-devel >= 0.3.0
Requires: libosmogsm-devel >= 0.3.10
@@ -119,14 +120,14 @@ find "$b/%_libdir" -type f -name "*.la" -delete
%check
make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +)
-%post -n libosmoabis6 -p /sbin/ldconfig
-%postun -n libosmoabis6 -p /sbin/ldconfig
+%post -n libosmoabis9 -p /sbin/ldconfig
+%postun -n libosmoabis9 -p /sbin/ldconfig
%post -n libosmotrau2 -p /sbin/ldconfig
%postun -n libosmotrau2 -p /sbin/ldconfig
-%files -n libosmoabis6
+%files -n libosmoabis9
%defattr(-,root,root)
-%_libdir/libosmoabis.so.6*
+%_libdir/libosmoabis.so.9*
%files -n libosmoabis-devel
%defattr(-,root,root)
diff --git a/contrib/trau2rtp/trau2rtp.c b/contrib/trau2rtp/trau2rtp.c
index fc9462d..7a29f4c 100644
--- a/contrib/trau2rtp/trau2rtp.c
+++ b/contrib/trau2rtp/trau2rtp.c
@@ -35,7 +35,7 @@ const int g_remote_port = 9000;
const int g_local_port = 8000;
/* codec; can be OSMO_TRAU16_FT_FR or OSMO_TRAU16_FT_EFR */
-const enum osmo_trau_frame_type g_ftype = OSMO_TRAU16_FT_EFR;
+const enum osmo_trau_frame_type g_ftype = OSMO_TRAU16_FT_AMR;
/***********************************************************************
* END CONFIGURATION
@@ -114,21 +114,35 @@ static void sync_frame_out_cb(void *user_data, const ubit_t *bits, unsigned int
if (g_local_loop) {
/* Mirror back to other sub-slot */
struct sc_state *peer = opposite_schan(sc);
- if (peer) {
- struct msgb *msg = msgb_alloc(2*40*8, "mirror");
+ if (!peer)
+ return;
+
+ struct msgb *msg = msgb_alloc(2*40*8, "mirror");
+
+ if (fr.type == OSMO_TRAU16_FT_AMR) {
+ //fr.c_bits[12-1] = FIXME; /* Req/Ind flag; use from UL */
+ fr.c_bits[13-1] = 1; /* UFT: no errors */
+ memset(&fr.c_bits[14-1], 0, 3); /* Config_Prot: no TFO */
+ memset(&fr.c_bits[17-1], 0, 2); /* Message_No: no TFO */
+ fr.c_bits[19-1] = 1; /* Reserved */
+ fr.c_bits[20-1] = 1; /* Reserved */
+
+ } else {
fr.c_bits[12-1] = 1; /* C12 = good u-link frame */
memset(&fr.c_bits[13-1], 1, 3); /* C13..C15: spare */
fr.c_bits[16-1] = 1; /* C16 = SP[eech]; no DTX */
memset(&fr.c_bits[6-1], 0, 6); /* C6..C11: tie alignment */
- fr.dir = OSMO_TRAU_DIR_DL;
- rc = osmo_trau_frame_encode(msgb_data(msg), 2*40*8, &fr);
- OSMO_ASSERT(rc >= 0);
- msgb_put(msg, rc);
- osmo_i460_mux_enqueue(peer->i460_sc, msg);
}
+ fr.dir = OSMO_TRAU_DIR_DL;
+ rc = osmo_trau_frame_encode(msgb_data(msg), 2*40*8, &fr);
+ OSMO_ASSERT(rc >= 0);
+ msgb_put(msg, rc);
+ osmo_i460_mux_enqueue(peer->i460_sc, msg);
} else {
/* Convert to RTP */
- if (fr.type != OSMO_TRAU16_FT_FR && fr.type != OSMO_TRAU16_FT_EFR)
+ if (fr.type != OSMO_TRAU16_FT_FR &&
+ fr.type != OSMO_TRAU16_FT_EFR &&
+ fr.type != OSMO_TRAU16_FT_AMR)
goto skip;
uint8_t rtpbuf[35];
diff --git a/debian/changelog b/debian/changelog
index 68064ca..b839ed9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,80 @@
+libosmo-abis (1.0.0) unstable; urgency=medium
+
+ [ Neels Hofmeyr ]
+ * add/clean big-endian packed structs (struct_endianess.py)
+
+ [ Harald Welte ]
+ * dahdi: Don't use perror() directly, use osmocom logging instead
+ * introduce and use logging macros with context on E1 line / timeslot
+ * e1d: Use HAVE_E1D in C source, not ENABLE_E1D
+ * e1d: add missing forward-declaration of e1inp_e1d_init()
+ * e1d: Don't use perror() directly, use osmocom logging instead
+ * e1d: Remove EXCEPTFD handling
+ * e1d: Remove bogus vty_show function.
+ * e1d: Use line->port_nr to specify e1d interface/line
+ * e1d: Use LOGPIL/LOGPITS logging macros to give context
+ * e1d: Don't connect to e1d at program start time
+ * e1d: Implement varions non-LAPD timeslot modes
+ * Add rtp_test to show the double-bind bug of OS#4444
+ * ortp: disable SO_REUSEADDR + SO_REUSEPORT
+ * subchan_demux: Use 'ubit_t' for unpacked bit buffer; use const
+ * trau_frame: use 'ubit_t' for unpacked bits
+ * subchan_demux: Use ubit_t where appropriate
+ * trau_frame.h: Fix definition of TRAU_FT_OM_UP
+ * Fix subchan_demux_test compiler warning on some gcc versions
+ * trau_frame: Fix AMR frame decoding
+ * lapd: Always print context information when logging
+ * fix compilation with --enable-e1d
+ * lapd: Replace magic numbers with #defines
+ * input/lapd.c: Enlarge message buffers for DL-SAP primitives
+ * input/dahdi.c: Don't simply read beyond end of msgb
+ * subchan_demux: Fix out-of-bounds write
+ * e1d: Add new osmo_e1dp_client_ts_open() argument
+ * e1d: Fix compilation after I4a088f91f23aaad05c5ab84a4783c1915d85aca6
+ * contrib/jenkins.sh: Test builds with --enable-e1d
+ * dahdi: Use osmo_revbytebits_buf() instead of local flip table
+ * input/e1d: Fix support for TRAU slots
+ * input/e1d: Add missing "RAW" timeslot support
+ * e1_input_vty: Fix VTY help strings
+
+ [ Sylvain Munaut ]
+ * e1d: Initial osmo-e1d support
+ * e1_input: Allow to change the pcap fd and/or unset it
+ * e1_input: Add VTY command to enable PCAP debug output
+
+ [ Oliver Smith ]
+ * ipaccess.c: line_already_initialized: int -> bool
+ * osmo_ortp: add osmo_rtp_socket_set_dscp()
+ * contrib: import RPM spec
+ * contrib: integrate RPM spec
+ * Makefile.am: EXTRA_DIST: debian, contrib/*.spec.in
+ * src/input/ipaccess.c: set TCP_NODELAY
+
+ [ Eric Wild ]
+ * add ipa ping/pong keepalive for OML/RSL links between bts and bsc
+
+ [ Eric ]
+ * configure.ac: fix libtool issue with clang and sanitizer
+
+ [ Pau Espin Pedrol ]
+ * e1_input: refcount inc line during e1_sign_link_create, not during line update
+ * ipaccess.c: Drop repeated ipaccess_keepalive_fsm_cleanup in write error path
+ * ipaccess: Fix log formatting of RESP_ID IPA attributes
+ * cosmetic: e1_input.h: Fix trailing whitespace
+ * e1_input: Use osmo_use_count in e1inp_line
+ * ipaccess: Drop e1inp_line reference in ipacess_drop()
+ * ipacces: Fix e1inp_line reference put in ipaccess_close
+ * ipaccess: Set bfd->data to NULL before releasing its reference
+ * ipaccess_recvmsg: Clean up release steps upon error condition
+ * ipaccess_recvmsg: Assert the new bfd from new line differs from the old one
+ * ipaccess_recvmsg: Untangle code updating line
+ * cosmetic: lapd: Fix trailing whitespace
+ * lapd: Use lapd_dl_init2 instead of deprecated lapd_dl_init
+ * tests: Use API e1inp_line_put2 instead of deprecated e1inp_line_put
+ * ipaccess: Fix use-after-free in ipaccess_drop()
+
+ -- Harald Welte <laforge@osmocom.org> Thu, 13 Aug 2020 12:09:39 +0200
+
libosmo-abis (0.8.0) unstable; urgency=medium
[ Alexander Couzens ]
diff --git a/debian/control b/debian/control
index 7039bfe..c304139 100644
--- a/debian/control
+++ b/debian/control
@@ -1,5 +1,5 @@
Source: libosmo-abis
-Maintainer: Harald Welte <laforge@gnumonks.org>
+Maintainer: Osmocom team <openbsc@lists.osmocom.org>
Section: libs
Priority: optional
Build-Depends: debhelper (>= 9),
@@ -11,7 +11,7 @@ Build-Depends: debhelper (>= 9),
dh-autoreconf,
libdpkg-perl,
git,
- libosmocore-dev (>= 1.1.0),
+ libosmocore-dev (>= 1.4.0),
pkg-config,
libortp-dev
Standards-Version: 3.9.7
@@ -22,20 +22,16 @@ Homepage: https://projects.osmocom.org/projects/libosmo-abis
Package: libosmo-abis
Section: oldlibs
Architecture: any
-Depends: libosmoabis6 (= ${binary:Version}), libosmotrau2 (= ${binary:Version}), ${misc:Depends}
+Depends: libosmoabis9 (= ${binary:Version}), libosmotrau2 (= ${binary:Version}), ${misc:Depends}
Multi-Arch: same
Description: Legacy package for libosmo-abis
libosmo-abis is an empty package helping in the transition to one
package per DSO.
-Package: libosmoabis6
+Package: libosmoabis9
Section: libs
Architecture: any
Multi-Arch: same
-# Due to previous release issues, libosmoabis5 actually installed same libosmoabis.so.6 file.
-# Once major is increased to 7, following two lines below can be dropped:
-Conflicts: libosmoabis5
-Replaces: libosmoabis5
Depends: ${shlibs:Depends},
${misc:Depends}
Description: GSM A-bis handling
@@ -64,7 +60,7 @@ Multi-Arch: same
Section: libdevel
Depends: ${misc:Depends},
libosmotrau2 (= ${binary:Version}),
- libosmoabis6 (= ${binary:Version})
+ libosmoabis9 (= ${binary:Version})
Description: Development headers for A-bis interface
The libosmo-abis library contains common/shared code regarding the A-bis
interface between GSM BTS and BSC. This package in particular contains the
@@ -76,7 +72,7 @@ Architecture: any
Multi-Arch: same
Section: debug
Priority: extra
-Depends: libosmoabis6 (= ${binary:Version}),
+Depends: libosmoabis9 (= ${binary:Version}),
libosmotrau2 (= ${binary:Version}),
${misc:Depends}
Description: Debug symbols for A-bis interface
diff --git a/debian/libosmoabis6.install b/debian/libosmoabis9.install
index 79c51a9..79c51a9 100644
--- a/debian/libosmoabis6.install
+++ b/debian/libosmoabis9.install
diff --git a/include/osmocom/abis/unixsocket_proto.h b/include/osmocom/abis/unixsocket_proto.h
index 25718ff..08e511e 100644
--- a/include/osmocom/abis/unixsocket_proto.h
+++ b/include/osmocom/abis/unixsocket_proto.h
@@ -11,6 +11,7 @@
*
* data: | 0x1 | 0x0 | lapd ..|
* control: | 0x1 | 0x1 | control payload |
+ * traffic: | 0x1 | 0x2 | timeslot | rae E1 bitstream data |
*
* Atm there is only one control packet:
* - set_altc (superchannel or timeslot)
@@ -26,6 +27,7 @@
enum {
UNIXSOCKET_PROTO_DATA = 0x0,
UNIXSOCKET_PROTO_CONTROL = 0x1,
+ UNIXSOCKET_PROTO_TRAFFIC = 0x2,
};
#endif /* UNIXSOCKET_PROTO_H */
diff --git a/include/osmocom/trau/trau_rtp.h b/include/osmocom/trau/trau_rtp.h
index f02d43e..33a6705 100644
--- a/include/osmocom/trau/trau_rtp.h
+++ b/include/osmocom/trau/trau_rtp.h
@@ -24,6 +24,11 @@
struct osmo_trau2rtp_state {
enum osmo_trau_frame_type type;
+ struct {
+ enum osmo_amr_type last_cmi;
+ enum osmo_amr_type last_cmr;
+ bool cmi_cmr_phase;
+ } amr;
};
diff --git a/include/osmocom/trau/trau_sync.h b/include/osmocom/trau/trau_sync.h
index 46595be..bd99586 100644
--- a/include/osmocom/trau/trau_sync.h
+++ b/include/osmocom/trau/trau_sync.h
@@ -17,3 +17,4 @@ osmo_trau_sync_alloc(void *ctx, const char *name, frame_out_cb_t frame_out_cb,
enum osmo_tray_sync_pat_id pat_id, void *user_data);
void osmo_trau_sync_rx_ubits(struct osmo_fsm_inst *fi, const ubit_t *bits, size_t n_bits);
+void osmo_trau_sync_set_pat(struct osmo_fsm_inst *fi, enum osmo_tray_sync_pat_id pat_id);
diff --git a/src/Makefile.am b/src/Makefile.am
index 4254428..24a7c26 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,13 +1,13 @@
# This is _NOT_ the library release version, it's an API version.
# Please read chapter "Library interface versions" of the libtool documentation
# before making any modifications: https://www.gnu.org/software/libtool/manual/html_node/Versioning.html
-ABIS_LIBVERSION=8:0:2
-TRAU_LIBVERSION=4:0:2
+ABIS_LIBVERSION=9:0:0
+TRAU_LIBVERSION=5:0:3
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
-AM_CFLAGS= -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOE1D_CFLAGS) $(COVERAGE_CFLAGS)
+AM_CFLAGS= -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOE1D_CFLAGS) $(LIBOSMOCODEC_CFLAGS) $(COVERAGE_CFLAGS)
AM_LDFLAGS = $(COVERAGE_LDFLAGS)
-COMMONLIBS = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOE1D_LIBS)
+COMMONLIBS = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOE1D_LIBS) # libosmocodec not [yet] needed here
lib_LTLIBRARIES = libosmoabis.la libosmotrau.la
diff --git a/src/input/unixsocket.c b/src/input/unixsocket.c
index cfb4979..c99b801 100644
--- a/src/input/unixsocket.c
+++ b/src/input/unixsocket.c
@@ -80,6 +80,7 @@ static int unixsocket_read_cb(struct osmo_fd *bfd)
{
struct e1inp_line *line = bfd->data;
struct msgb *msg = msgb_alloc(UNIXSOCKET_ALLOC_SIZE, "UNIXSOCKET TS");
+ uint8_t ts_nr;
uint8_t version;
uint8_t controldata;
int ret;
@@ -117,11 +118,19 @@ static int unixsocket_read_cb(struct osmo_fd *bfd)
switch (controldata) {
case UNIXSOCKET_PROTO_DATA:
+ /* FIXME: don't blindly assume TS0 is the signaling slot */
return e1inp_rx_ts_lapd(&line->ts[0], msg);
case UNIXSOCKET_PROTO_CONTROL:
LOGPIL(line, DLMI, LOGL_ERROR, "received (invalid) control message.");
ret = -1;
break;
+ case UNIXSOCKET_PROTO_TRAFFIC:
+ ts_nr = msgb_pull_u8(msg);
+ if (ts_nr >= line->num_ts) {
+ ret = -1;
+ } else
+ return e1inp_rx_ts(&line->ts[ts_nr], msg, 0, 0);
+ break;
default:
LOGPIL(line, DLMI, LOGL_ERROR, "received invalid message.");
ret = -1;
@@ -143,28 +152,51 @@ static void timeout_ts1_write(void *data)
static int unixsocket_write_cb(struct osmo_fd *bfd)
{
struct e1inp_line *line = bfd->data;
- struct e1inp_ts *e1i_ts = &line->ts[0];
- struct msgb *msg;
- struct e1inp_sign_link *sign_link;
+ int i;
bfd->when &= ~BSC_FD_WRITE;
- /* get the next msg for this timeslot */
- msg = e1inp_tx_ts(e1i_ts, &sign_link);
- if (!msg) {
- /* no message after tx delay timer */
- LOGPITS(e1i_ts, DLINP, LOGL_INFO, "no message available (line=%p)\n", line);
- return 0;
- }
-
- /* set tx delay timer for next event */
- osmo_timer_setup(&e1i_ts->sign.tx_timer, timeout_ts1_write, e1i_ts);
-
- osmo_timer_schedule(&e1i_ts->sign.tx_timer, 0, e1i_ts->sign.delay);
+ for (i = 0; i < line->num_ts; i++) {
+ struct e1inp_ts *e1i_ts = &line->ts[i];
+ struct e1inp_sign_link *sign_link;
+ struct msgb *msg;
+ int rc;
+
+ /* get the next msg for this timeslot */
+ msg = e1inp_tx_ts(e1i_ts, &sign_link);
+ if (!msg) {
+ /* no message after tx delay timer */
+ LOGPITS(e1i_ts, DLINP, LOGL_INFO, "no message available (line=%p)\n", line);
+ continue;
+ }
- LOGPITS(e1i_ts, DLINP, LOGL_DEBUG, "sending: %s (line=%p)\n", msgb_hexdump(msg), line);
- lapd_transmit(e1i_ts->lapd, sign_link->tei,
- sign_link->sapi, msg);
+ LOGPITS(e1i_ts, DLINP, LOGL_DEBUG, "sending: %s (line=%p)\n", msgb_hexdump(msg), line);
+ switch (e1i_ts->type) {
+ case E1INP_TS_TYPE_SIGN:
+ lapd_transmit(e1i_ts->lapd, sign_link->tei, sign_link->sapi, msg);
+ /* set tx delay timer for next event */
+ osmo_timer_setup(&e1i_ts->sign.tx_timer, timeout_ts1_write, e1i_ts);
+ osmo_timer_schedule(&e1i_ts->sign.tx_timer, 0, e1i_ts->sign.delay);
+ break;
+ case E1INP_TS_TYPE_RAW:
+ msgb_push_u8(msg, i); /* timeslot number */
+ msgb_push_u8(msg, UNIXSOCKET_PROTO_TRAFFIC);
+ msgb_push_u8(msg, UNIXSOCKET_PROTO_VERSION);
+ rc = write(bfd->fd, msg->data, msg->len);
+ if (rc < msg->len) {
+ LOGPITS(e1i_ts, DLINP, LOGL_ERROR, "write returne d%d instead of %d\n",
+ rc, msg->len);
+ msgb_free(msg);
+ return 0;
+ }
+ msgb_free(msg);
+ break;
+ default:
+ LOGPITS(e1i_ts, DLINP, LOGL_ERROR, "unsupported timeslot type %s\n",
+ e1inp_tstype_name(e1i_ts->type));
+ break;
+ }
+ }
return 0;
}
diff --git a/src/trau/trau_frame.c b/src/trau/trau_frame.c
index 0a8faf9..9c9baa7 100644
--- a/src/trau/trau_frame.c
+++ b/src/trau/trau_frame.c
@@ -817,7 +817,7 @@ static ubit_t compute_odd_parity(const ubit_t *in, unsigned int num_bits)
sum++;
}
- if (sum % 1)
+ if (sum & 1)
return 0;
else
return 1;
@@ -1249,6 +1249,7 @@ int osmo_trau_frame_encode(ubit_t *bits, size_t n_bits, const struct osmo_trau_f
/* timing alignment may happen: increased space requirement */
if (n_bits < 2 * 20 * 8 - 1)
return -ENOSPC;
+ break;
case OSMO_TRAU8_DATA:
case OSMO_TRAU8_OAM:
if (n_bits < 1 * 20 * 8)
diff --git a/src/trau/trau_rtp_conv.c b/src/trau/trau_rtp_conv.c
index ebbdbef..84b1cad 100644
--- a/src/trau/trau_rtp_conv.c
+++ b/src/trau/trau_rtp_conv.c
@@ -26,6 +26,7 @@
#include <osmocom/core/crc8gen.h>
#include <osmocom/codec/codec.h>
+#include <osmocom/netif/amr.h>
#include <osmocom/trau/trau_frame.h>
#include <osmocom/trau/trau_rtp.h>
@@ -489,103 +490,199 @@ static int rtp2trau_efr(struct osmo_trau_frame *tf, const uint8_t *data, size_t
return 0;
}
-#if 0
-static inline memcpy_inc(uint8_t *out, const uint8_t *in, size_t len, unsigned int *idx)
+/* memcpy + increment index */
+static inline void memcpy_inc(uint8_t *out, const uint8_t *in, size_t len, unsigned int *idx)
{
- memcpy_inc(out, in, len);
+ memcpy(out, in, len);
*idx += len;
}
+#define S_FROM_D(sbits, dbits, d_from, d_to, idx) \
+ memcpy_inc(sbits + idx, dbits + (d_from-1), d_to - (d_from-1), &idx)
+
+/* extract the AMR s-bits (codec parameters) from the TRAU frame D-bits */
static int amr_speech_extract_sbits(ubit_t *s_bits, const struct osmo_trau_frame *tf,
- enum osmo_amr_mode mode)
+ enum osmo_amr_type mode)
{
unsigned int s_idx = 0;
switch (mode) {
case AMR_4_75:
- memcpy_inc(s_bits + s_idx, tf->d_bits + 44, 67 - 44, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 67, 92 - 67, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 95, 108 - 95, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 111, 132 - 111, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 135, 148 - 135, &s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 45, 67, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 68, 92, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 96, 108, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 112, 132, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 136, 148, s_idx);
break;
case AMR_5_15:
- memcpy_inc(s_bits + s_idx, tf->d_bits + 46, 96 - 46, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 69, 92 - 69, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 95, 114 - 95, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 117, 136 - 117, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 139, 158 - 139, &s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 47, 69, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 70, 92, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 96, 114, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 118, 136, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 140, 158, s_idx);
break;
case AMR_5_90:
- memcpy_inc(s_bits + s_idx, tf->d_bits + 41, 67 - 41, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 67, 92 - 67, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 95, 116 - 95, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 119, 144 - 119, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 147, 168 - 147, &s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 42, 67, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 68, 92, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 96, 116, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 120, 144, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 148, 168, s_idx);
break;
case AMR_6_70:
- memcpy_inc(s_bits + s_idx, tf->d_bits + 37, 63 - 37, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 63, 92 - 63, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 95, 120 - 95, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 123, 152 - 123, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 155, 180 - 155, &s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 38, 63, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 64, 92, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 96, 120, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 124, 152, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 156, 180, s_idx);
break;
case AMR_7_40:
- memcpy_inc(s_bits + s_idx, tf->d_bits + 34, 60 - 34, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 60, 92 - 60, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 95, 124 - 95, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 127, 159 - 127, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 162, 191 - 162, &s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 35, 60, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 61, 92, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 96, 124, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 128, 159, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 163, 191, s_idx);
break;
case AMR_7_95:
- memcpy_inc(s_bits + s_idx, tf->d_bits + 31, 58 - 31, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 58, 92 - 58, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 95, 127 - 95, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 130, 164 - 130, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 167, 199 - 167, &s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 32, 58, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 59, 92, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 96, 127, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 131, 164, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 168, 199, s_idx);
break;
case AMR_10_2:
- memcpy_inc(s_bits + s_idx, tf->d_bits + 20, 46 - 20, &s_idx); /* D21..D46 */
- memcpy_inc(s_bits + s_idx, tf->d_bits + 46, 92 - 46, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 95, 138 - 95, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 141, 187 - 141, &s_idx);
- memcpy_inc(s_bits + s_idx, tf->d_bits + 190, 233 - 190, &s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 21, 46, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 47, 92, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 96, 138, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 142, 187, s_idx);
+ S_FROM_D(s_bits, tf->d_bits, 191, 233, s_idx);
break;
case AMR_12_2:
- memcpy_inc(s_bits + s_idx, tf->d_bits + 0, 38 - 0, &s_idx); /* D1..D38 */
- memcpy_inc(s_bits + s_idx, tf->d_bits + 38, 91 - 38, &s_idx); /* D39..D91 */
- memcpy_inc(s_bits + s_idx, tf->d_bits + 94, 144 - 94, &s_idx); /* D95..D144 */
- memcpy_inc(s_bits + s_idx, tf->d_bits + 147, 200 - 147, &s_idx);/* D148..D200 */
- memcpy_inc(s_bits + s_idx, tf->d_bits + 203, 253 - 203, &s_idx);/* D204..D253 */
+ S_FROM_D(s_bits, tf->d_bits, 1, 38, s_idx); /* D1..D38 */
+ S_FROM_D(s_bits, tf->d_bits, 39, 91, s_idx); /* D39..D91 */
+ S_FROM_D(s_bits, tf->d_bits, 95, 144, s_idx); /* D95..D144 */
+ S_FROM_D(s_bits, tf->d_bits, 148, 200, s_idx); /* D148..D200 */
+ S_FROM_D(s_bits, tf->d_bits, 204, 253, s_idx); /* D204..D253 */
+ break;
+ default:
+ osmo_panic("unknown AMR speech mode: %u", mode);
break;
}
return s_idx;
}
+#define D_FROM_S(dbits, sbits, d_from, d_to, idx) \
+ memcpy_inc(dbits + (d_from-1), sbits + idx, d_to - (d_from-1), &idx)
+
+/* encode the AMR TRAU frame D-bits from the s-bits (codec parameters) */
+static int amr_speech_encode_sbits(struct osmo_trau_frame *tf, const ubit_t *s_bits, enum osmo_amr_type mode)
+{
+ unsigned int s_idx = 0;
+
+ switch (mode) {
+ case AMR_4_75:
+ D_FROM_S(tf->d_bits, s_bits, 45, 67, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 68, 92, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 96, 108, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 112, 132, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 136, 148, s_idx);
+ break;
+ case AMR_5_15:
+ D_FROM_S(tf->d_bits, s_bits, 47, 69, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 70, 92, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 96, 114, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 118, 136, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 140, 158, s_idx);
+ break;
+ case AMR_5_90:
+ D_FROM_S(tf->d_bits, s_bits, 42, 67, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 68, 92, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 96, 116, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 124, 152, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 156, 180, s_idx);
+ break;
+ case AMR_6_70:
+ D_FROM_S(tf->d_bits, s_bits, 38, 63, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 64, 92, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 96, 120, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 124, 152, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 156, 180, s_idx);
+ break;
+ case AMR_7_40:
+ D_FROM_S(tf->d_bits, s_bits, 35, 60, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 61, 92, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 96, 124, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 128, 159, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 163, 191, s_idx);
+ break;
+ case AMR_7_95:
+ D_FROM_S(tf->d_bits, s_bits, 32, 58, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 59, 92, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 96, 127, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 131, 164, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 168, 199, s_idx);
+ break;
+ case AMR_10_2:
+ D_FROM_S(tf->d_bits, s_bits, 21, 46, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 47, 92, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 96, 138, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 142, 187, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 191, 233, s_idx);
+ break;
+ case AMR_12_2:
+ D_FROM_S(tf->d_bits, s_bits, 1, 38, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 39, 91, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 95, 144, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 148, 200, s_idx);
+ D_FROM_S(tf->d_bits, s_bits, 204, 253, s_idx);
+ default:
+ osmo_panic("unknown AMR speech mode: %u", mode);
+ break;
+ }
+}
+
+/* Frame_Classification as per TS 48.060 Section 5.5.1.2.1 */
+enum amr_frame_class {
+ AMR_FCLS_SPEECH_GOOD = 3,
+ AMR_FCLS_SPEECH_DEGRADED = 2,
+ AMR_FCLS_SPEECH_BAD = 1,
+ AMR_FCLS_NO_SPEECH = 0,
+};
+
/* TS 48.060 Section 5.5.1.2.2 */
-static int trau2rtp_16(uint8_t *out, const struct osmo_trau_frame *tf, enum osmo_amr_mode last_cmi)
+static int trau2rtp_16(uint8_t *out, const struct osmo_trau_frame *tf, struct osmo_trau2rtp_state *st)
{
- enum osmo_amr_mode mode = last_cmi;
- uint8_t frame_class = tf->c_bits[21] << 1 | tf->c_bits[20];
- uint8_t cmr_cmi = tf->c_bits[23] << 2 | tf->c_bits[24] << 1 | tf->cb_bits[25];
+ uint8_t frame_class = (tf->c_bits[21-1] << 1) | tf->c_bits[20-1];
+ uint8_t cmr_cmi = (tf->c_bits[23-1] << 2) | (tf->c_bits[24-1] << 1) | tf->c_bits[25-1];
+ ubit_t rif = tf->c_bits[12-1]; /* Request (1) or Indication (0) Flag */
+ uint8_t tac_pac = (tf->c_bits[6-1] << 5) | (tf->c_bits[7-1] << 4) | (tf->c_bits[8-1] << 3) |
+ (tf->c_bits[9-1] << 2) | (tf->c_bits[10-1] << 1) | tf->c_bits[11-1];
uint8_t no_speech_cls;
- uint8_t s_bits[242];
- uint8_t d_bits[242];
- unsigned int s_idx = 0;
- ubit_t rif = FIXME;
+ uint8_t s_bits[244];
+ uint8_t d_bits[244];
+ bool bad_frame = false;
+ int n_sbits = 0;
if (tf->type != OSMO_TRAU16_FT_AMR)
return -EINVAL;
- if (rif == 0)
- mode = cmr_cmi;
+ if (rif == 0) {
+ /* peer (BTS) tells us CMI */
+ st->amr.last_cmi = cmr_cmi;
+ } else {
+ /* peer (BTS) tells us CMR */
+ st->amr.last_cmr = cmr_cmi;
+ }
+
+ if (tac_pac == 0x3d) {
+ /* FIXME: BTS requests us to invert CMI/CMR phase in downlink */
+ }
switch (frame_class) {
- case 0: // no speech
- no_speech_cls = tf->d_bits[32] << 2 | tf->d_bits[33] << 1 | tf->d_bits[34];
- cmi_abs = tf->d_bits[35] << 2 | tf->d_bits[36] < 1 || tf->d_bits[37];
- cmr_abs = tf->d_bits[38] << 2 | tf->d_bits[39] < 1 || tf->d_bits[40];
+ case AMR_FCLS_NO_SPEECH:
+ no_speech_cls = (tf->d_bits[32-1] << 2) | (tf->d_bits[33-1] << 1) | tf->d_bits[34-1];
+ st->amr.last_cmi = (tf->d_bits[35-1] << 2) | (tf->d_bits[36-1] < 1) || tf->d_bits[37-1];
+ st->amr.last_cmr = (tf->d_bits[38-1] << 2) | (tf->d_bits[39-1] < 1) || tf->d_bits[40-1];
switch (no_speech_cls) {
case 7: // sid first
break;
@@ -597,25 +694,89 @@ static int trau2rtp_16(uint8_t *out, const struct osmo_trau_frame *tf, enum osmo
break;
case 0: // no_data
break;
+ /* TOOD: PAB to be treated as PAC */
+ /* TODO: Time Alignment Extension (TAE) */
}
break;
- case 1: // speech bad
+ case AMR_FCLS_SPEECH_BAD:
+ bad_frame = true;
break;
- case 2:
- case 3:
+ case AMR_FCLS_SPEECH_GOOD:
+ case AMR_FCLS_SPEECH_DEGRADED:
/* Extract the s-bits from the TRAU frame */
- amr_speech_extract_sbits(s_bits, tf, mode);
+ n_sbits = amr_speech_extract_sbits(s_bits, tf, st->amr.last_cmi);
/* Convert the s-bits to d-bits */
- osmo_amr_s_to_d(d_bits, s_bits, mode);
+ osmo_amr_s_to_d(d_bits, s_bits, n_sbits, st->amr.last_cmi);
break;
}
+
+ /* generate octet-aligned RTP AMR header / RFC4867 */
+ struct amr_hdr *amrh = (struct amr_hdr *) out;
+ amrh->pad1 = 0;
+ amrh->cmr = st->amr.last_cmr;
+ amrh->pad2 = 0;
+ amrh->q = !bad_frame;
+ amrh->ft = st->amr.last_cmi;
+ amrh->f = 0;
+
+ /* return number of bytes generated */
+ return osmo_ubit2pbit(out + sizeof(*amrh), d_bits, n_sbits) + sizeof(*amrh);
+}
+
+static int rtp2trau_amr(struct osmo_trau_frame *tf, const uint8_t *data, size_t data_len,
+ struct osmo_trau2rtp_state *st)
+{
+ struct amr_hdr *amrh = (struct amr_hdr *) data;
+ ubit_t s_bits[244];
+
+ if (data_len < sizeof(*amrh))
+ return -EIO;
+
+ if (data_len > FIXME)
+ data_len = FIXM;
+
+ /* C1..C5: AMR */
+ tf->c_bits[1-1] = 0;
+ tf->c_bits[2-1] = 0;
+ tf->c_bits[3-1] = 1;
+ tf->c_bits[4-1] = 1;
+ tf->c_bits[5-1] = 0;
+
+ /* C6..C11: TAF: TAC / PAC */
+ memset(&tf->c_bits[6-1], 0, 6);
+
+
+ //tf->c_bits[12-1] = ; /* RIF */
+ tf->c_bits[13-1] = 1; /* UFE */
+ memset(&tf->c_bits[14-1], 0, 3); /* Config_Prot */
+ memset(&tf->c_bits[17-1], 0, 3); /* Message_No */
+ tf->c_bits[19-1] = 1; /* spare */
+ tf->c_bits[20-1] = 1; /* spare */
+
+#if 0
+ tf->c_bits[21-1]
+ tf->c_bits[22-1]
+
+ /* CMI (RIF=0) or CMR (RIF=1) */
+ tf->c_bits[23-1]
+ tf->c_bits[24-1]
+ tf->c_bits[25-1]
+#endif
+
+ /* TODO: convert s-bits to d-bits */
+ osmo_pbit2ubit(s_bits, data + sizeof(*amrh), data_len-sizeof(*amrh));
+ amr_speech_encode_sbits(tf, s_bits, mode)
+
+ /* TODO: compute CRC */
+
+ return 0;
}
-int trau2rtp_amr(uint8_t *out, const struct osmo_trau_frame *tf, enum osmo_amr_mode last_cmi))
+int trau2rtp_amr(uint8_t *out, size_t out_len, const struct osmo_trau_frame *tf, struct osmo_trau2rtp_state *st)
{
switch (tf->type) {
case OSMO_TRAU16_FT_AMR:
- return trau2rtp_16(out, tf, last_cmi);
+ return trau2rtp_16(out, tf, st);
case OSMO_TRAU8_AMR_LOW:
case OSMO_TRAU8_AMR_6k7:
case OSMO_TRAU8_AMR_7k4:
@@ -623,7 +784,6 @@ int trau2rtp_amr(uint8_t *out, const struct osmo_trau_frame *tf, enum osmo_amr_m
return -EINVAL;
}
}
-#endif
int osmo_trau2rtp(uint8_t *out, size_t out_len, const struct osmo_trau_frame *tf,
struct osmo_trau2rtp_state *st)
@@ -635,6 +795,8 @@ int osmo_trau2rtp(uint8_t *out, size_t out_len, const struct osmo_trau_frame *tf
return trau2rtp_efr(out, out_len, tf);
case OSMO_TRAU16_FT_HR:
return trau2rtp_hr16(out, out_len, tf);
+ case OSMO_TRAU16_FT_AMR:
+ return trau2rtp_amr(out, out_len, tf, st);
default:
return -EINVAL;
}
@@ -650,6 +812,8 @@ int osmo_rtp2trau(struct osmo_trau_frame *tf, const uint8_t *rtp, size_t rtp_len
return rtp2trau_efr(tf, rtp, rtp_len);
case OSMO_TRAU16_FT_HR:
return rtp2trau_hr16(tf, rtp, rtp_len);
+ case OSMO_TRAU16_FT_AMR:
+ //return rtp2trau_amr(tf, rtp, rtp_len, st);
default:
return -EINVAL;
}
diff --git a/src/trau/trau_sync.c b/src/trau/trau_sync.c
index dfd7ce4..89c5558 100644
--- a/src/trau/trau_sync.c
+++ b/src/trau/trau_sync.c
@@ -499,7 +499,6 @@ osmo_trau_sync_alloc(void *ctx, const char *name, frame_out_cb_t frame_out_cb,
tss->out_cb = frame_out_cb;
tss->user_data = user_data;
- /* FIXME: this must be configurable */
tss->pattern = &sync_patterns[pat_id];
/* An unusued E1 timeslot normally would send an idle signal that
@@ -511,6 +510,14 @@ osmo_trau_sync_alloc(void *ctx, const char *name, frame_out_cb_t frame_out_cb,
return fi;
}
+void osmo_trau_sync_set_pat(struct osmo_fsm_inst *fi, enum osmo_tray_sync_pat_id pat_id)
+{
+ struct trau_rx_sync_state *tss = fi->priv;
+
+ tss->pattern = &sync_patterns[pat_id];
+ osmo_fsm_inst_state_chg(fi, FRAME_ALIGNMENT_LOST, 0, 0);
+}
+
void osmo_trau_sync_rx_ubits(struct osmo_fsm_inst *fi, const ubit_t *bits, size_t n_bits)
{
struct ubit_buf ubb;
@@ -524,5 +531,5 @@ static void __attribute__((constructor)) on_dso_load_sync(void)
for (i = 0; i < ARRAY_SIZE(sync_patterns); i++)
sync_pattern_register(&sync_patterns[i]);
- osmo_fsm_register(&trau_sync_fsm);
+ OSMO_ASSERT(osmo_fsm_register(&trau_sync_fsm) == 0);
}
diff --git a/tests/trau_sync/trau_sync_test.c b/tests/trau_sync/trau_sync_test.c
index 392a236..d804b3e 100644
--- a/tests/trau_sync/trau_sync_test.c
+++ b/tests/trau_sync/trau_sync_test.c
@@ -79,6 +79,7 @@ const struct log_info log_info = {
int main(int argc, char **argv)
{
osmo_init_logging2(NULL, NULL);
+ log_set_use_color(osmo_stderr_target, 0);
osmo_fsm_log_addr(false);
log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
test_body();
diff --git a/tests/trau_sync/trau_sync_test.err b/tests/trau_sync/trau_sync_test.err
index f3eac3c..7e4a24a 100644
--- a/tests/trau_sync/trau_sync_test.err
+++ b/tests/trau_sync/trau_sync_test.err
@@ -1,15 +1,14 @@
<0000> trau_sync(test){WAIT_FRAME_ALIGN}: Allocated
-<0000> trau_sync(test){WAIT_FRAME_ALIGN}: Received Event RX_BITS
-<0000> trau_sync(test){WAIT_FRAME_ALIGN}: Received Event RX_BITS
-<0000> trau_sync(test){WAIT_FRAME_ALIGN}: Received Event RX_BITS
-<0000> trau_sync(test){WAIT_FRAME_ALIGN}: state_chg to FRAME_ALIGNED
-<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
-<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
-<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
-<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
-<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
-<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
-<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
-<0000> trau_sync(test){FRAME_ALIGNED}: state_chg to FRAME_ALIGNMENT_LOST
-<0000> trau_sync(test){FRAME_ALIGNMENT_LOST}: Received Event RX_BITS
- \ No newline at end of file
+<0000> trau_sync(test){WAIT_FRAME_ALIGN}: Received Event RX_BITS
+<0000> trau_sync(test){WAIT_FRAME_ALIGN}: Received Event RX_BITS
+<0000> trau_sync(test){WAIT_FRAME_ALIGN}: Received Event RX_BITS
+<0000> trau_sync(test){WAIT_FRAME_ALIGN}: state_chg to FRAME_ALIGNED
+<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
+<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
+<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
+<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
+<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
+<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
+<0000> trau_sync(test){FRAME_ALIGNED}: Received Event RX_BITS
+<0000> trau_sync(test){FRAME_ALIGNED}: state_chg to FRAME_ALIGNMENT_LOST
+<0000> trau_sync(test){FRAME_ALIGNMENT_LOST}: Received Event RX_BITS