Hello community, here is the log from the commit of package libosmo-netif for openSUSE:Factory checked in at 2020-09-17 14:43:02 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libosmo-netif (Old) and /work/SRC/openSUSE:Factory/.libosmo-netif.new.4249 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libosmo-netif" Thu Sep 17 14:43:02 2020 rev:9 rq:832610 version:1.0.0 Changes: -------- --- /work/SRC/openSUSE:Factory/libosmo-netif/libosmo-netif.changes 2020-01-08 17:55:27.605669549 +0100 +++ /work/SRC/openSUSE:Factory/.libosmo-netif.new.4249/libosmo-netif.changes 2020-09-17 14:45:40.407614520 +0200 @@ -1,0 +2,6 @@ +Sun Sep 6 12:19:43 UTC 2020 - Jan Engelhardt <[email protected]> + +- Update to release 1.0.0 + * stream: Add new WAIT_RECONNECT cli state + +------------------------------------------------------------------- Old: ---- libosmo-netif-0.7.0.tar.xz New: ---- libosmo-netif-1.0.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libosmo-netif.spec ++++++ --- /var/tmp/diff_new_pack.odTs4a/_old 2020-09-17 14:45:43.219617203 +0200 +++ /var/tmp/diff_new_pack.odTs4a/_new 2020-09-17 14:45:43.227617211 +0200 @@ -1,7 +1,7 @@ # # spec file for package libosmo-netif # -# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,19 +16,18 @@ # -%define version_unconverted 0.7.0 +%define version_unconverted 1.0.0 Name: libosmo-netif Summary: Osmocom library for muxed audio License: GPL-2.0-or-later Group: Productivity/Telephony/Utilities -Version: 0.7.0 +Version: 1.0.0 Release: 0 -Url: https://osmocom.org/projects/libosmo-netif +URL: https://osmocom.org/projects/libosmo-netif Source: %name-%version.tar.xz Patch1: osmo-talloc.diff -BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: automake BuildRequires: libtool >= 2 BuildRequires: lksctp-tools-devel @@ -63,21 +62,22 @@ applications that want to make use of libosmo-netif. %prep -%setup -q -%patch -P 1 -p1 +%autosetup -p1 %build echo "%version" >.tarball-version autoreconf -fiv -%configure --enable-shared --disable-static --includedir="%_includedir/%name" -make %{?_smp_mflags} +# bugzilla.opensuse.org/795968 for rationale +%configure --includedir="%_includedir/%name" \ + --enable-shared --disable-static +%make_build %install %make_install find "%buildroot/%_libdir" -type f -name "*.la" -delete %check -if ! make %{?_smp_mflags} check; then +if ! %make_build check; then rv=$? cat tests/testsuite.log echo "Suppressing exit $rv" @@ -88,14 +88,12 @@ %postun -n libosmonetif8 -p /sbin/ldconfig %files -n libosmonetif8 -%defattr(-,root,root) %_libdir/libosmonetif.so.8* %files -n libosmonetif-devel -%defattr(-,root,root) -%doc COPYING -%dir %_includedir/%name -%dir %_includedir/%name/osmocom +%license COPYING +%dir %_includedir/%name/ +%dir %_includedir/%name/osmocom/ %_includedir/%name/osmocom/netif/ %_libdir/libosmonetif.so %_libdir/pkgconfig/libosmo-netif.pc ++++++ _service ++++++ --- /var/tmp/diff_new_pack.odTs4a/_old 2020-09-17 14:45:43.271617253 +0200 +++ /var/tmp/diff_new_pack.odTs4a/_new 2020-09-17 14:45:43.271617253 +0200 @@ -1,9 +1,9 @@ <services> <service name="tar_scm" mode="disabled"> <param name="scm">git</param> - <param name="url">git://git.osmocom.org/libosmo-netif</param> - <param name="revision">0.7.0</param> - <param name="versionformat">0.7.0</param> + <param name="url">https://git.osmocom.org/libosmo-netif</param> + <param name="revision">1.0.0</param> + <param name="versionformat">1.0.0</param> </service> <service name="recompress" mode="disabled"> <param name="file">*.tar</param> ++++++ libosmo-netif-0.7.0.tar.xz -> libosmo-netif-1.0.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/Makefile.am new/libosmo-netif-1.0.0/Makefile.am --- old/libosmo-netif-0.7.0/Makefile.am 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/Makefile.am 2020-08-13 11:21:03.000000000 +0200 @@ -6,7 +6,12 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libosmo-netif.pc -EXTRA_DIST = .version README.md +EXTRA_DIST = \ + .version \ + README.md \ + contrib/libosmo-netif.spec.in \ + debian \ + $(NULL) @RELMAKE@ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/configure.ac new/libosmo-netif-1.0.0/configure.ac --- old/libosmo-netif-0.7.0/configure.ac 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/configure.ac 2020-08-13 11:21:03.000000000 +0200 @@ -22,6 +22,11 @@ LT_INIT AC_PROG_LIBTOOL +dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang +AS_CASE(["$LD"],[*clang*], + [AS_CASE(["${host_os}"], + [*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])]) + dnl check for pkg-config (explained in detail in libosmocore/configure.ac) AC_PATH_PROG(PKG_CONFIG_INSTALLED, pkg-config, no) if test "x$PKG_CONFIG_INSTALLED" = "xno"; then @@ -87,18 +92,24 @@ dnl FIXME: We depend on libosmoabis by now until we can move LAPD code here PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 0.6.0) -old_LIBS=$LIBS -AC_SEARCH_LIBS([sctp_send], [sctp], [ - AC_DEFINE(HAVE_LIBSCTP, 1, [Define 1 to enable SCTP support]) - AC_SUBST(HAVE_LIBSCTP, [1]) - if test -n "$ac_lib"; then - AC_SUBST(LIBSCTP_LIBS, [-l$ac_lib]) - fi - ], [ - AC_MSG_ERROR([sctp_send not found in searched libs])]) -LIBS=$old_LIBS - -AC_CHECK_HEADERS(dahdi/user.h,,AC_MSG_WARN(DAHDI input driver will not be built)) +AC_ARG_ENABLE([libsctp], [AS_HELP_STRING([--disable-libsctp], [Do not enable socket multiaddr APIs requiring libsctp])], + [ENABLE_LIBSCTP=$enableval], [ENABLE_LIBSCTP="yes"]) +AM_CONDITIONAL(ENABLE_LIBSCTP, test x"$ENABLE_LIBSCTP" = x"yes") +AS_IF([test "x$ENABLE_LIBSCTP" = "xyes"], [ + AC_CHECK_HEADERS(netinet/sctp.h,,AC_MSG_ERROR(netinet/sctp.h not found)) + old_LIBS=$LIBS + AC_CHECK_LIB(osmocore, osmo_sock_init2_multiaddr,, AC_MSG_ERROR(libosmocore built without libsctp support), $LIBOSMOCORE_LIBS) + LIBS=$old_LIBS + AC_SEARCH_LIBS([sctp_send], [sctp], [ + AC_DEFINE(HAVE_LIBSCTP, 1, [Define 1 to enable SCTP support]) + AC_SUBST(HAVE_LIBSCTP, [1]) + if test -n "$ac_lib"; then + AC_SUBST(LIBSCTP_LIBS, [-l$ac_lib]) + fi + ], [ + AC_MSG_ERROR([sctp_send not found in searched libs])]) + LIBS=$old_LIBS +]) found_pcap=yes AC_CHECK_HEADERS(pcap.h,,found_pcap=no) @@ -122,4 +133,5 @@ examples/Makefile tests/Makefile Doxyfile - Makefile) + Makefile + contrib/libosmo-netif.spec) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/contrib/libosmo-netif.spec.in new/libosmo-netif-1.0.0/contrib/libosmo-netif.spec.in --- old/libosmo-netif-0.7.0/contrib/libosmo-netif.spec.in 1970-01-01 01:00:00.000000000 +0100 +++ new/libosmo-netif-1.0.0/contrib/libosmo-netif.spec.in 2020-08-13 11:21:03.000000000 +0200 @@ -0,0 +1,84 @@ +# +# spec file for package libosmo-netif +# +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +Name: libosmo-netif +Version: @VERSION@ +Release: 0 +Summary: Osmocom library for muxed audio +License: GPL-2.0-or-later +Group: Productivity/Telephony/Utilities +URL: https://osmocom.org/projects/libosmo-netif +Source: %{name}-%{version}.tar.xz +BuildRequires: automake +BuildRequires: libtool >= 2 +BuildRequires: lksctp-tools-devel +BuildRequires: pkgconfig >= 0.20 +BuildRequires: pkgconfig(libosmoabis) >= 0.6.0 +BuildRequires: pkgconfig(libosmocore) >= 1.0.0 +BuildRequires: pkgconfig(libosmogsm) >= 1.0.0 + +%description +Network interface demuxer library for OsmoCom projects. + +%package -n libosmonetif8 +Summary: Osmocom library for muxed audio +License: AGPL-3.0-or-later +Group: System/Libraries + +%description -n libosmonetif8 +Network interface demuxer library for OsmoCom projects. + +%package -n libosmonetif-devel +Summary: Development files for the Osmocom muxed audio library +License: AGPL-3.0-or-later +Group: Development/Libraries/C and C++ +Requires: libosmonetif8 = %{version} + +%description -n libosmonetif-devel +Network interface demuxer library for OsmoCom projects. + +This subpackage contains libraries and header files for developing +applications that want to make use of libosmo-netif. + +%prep +%setup -q + +%build +echo "%{version}" >.tarball-version +autoreconf -fiv +%configure --enable-shared --disable-static --includedir="%{_includedir}/%{name}" +make %{?_smp_mflags} + +%install +%make_install +find %{buildroot} -type f -name "*.la" -delete -print + +%check +make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +) + +%post -n libosmonetif8 -p /sbin/ldconfig +%postun -n libosmonetif8 -p /sbin/ldconfig + +%files -n libosmonetif8 +%{_libdir}/libosmonetif.so.8* + +%files -n libosmonetif-devel +%license COPYING +%dir %{_includedir}/%{name} +%dir %{_includedir}/%{name}/osmocom +%{_includedir}/%{name}/osmocom/netif/ +%{_libdir}/libosmonetif.so +%{_libdir}/pkgconfig/libosmo-netif.pc + +%changelog diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/debian/changelog new/libosmo-netif-1.0.0/debian/changelog --- old/libosmo-netif-0.7.0/debian/changelog 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/debian/changelog 2020-08-13 11:21:03.000000000 +0200 @@ -1,3 +1,49 @@ +libosmo-netif (1.0.0) unstable; urgency=medium + + [ Neels Hofmeyr ] + * struct amr_header: copy comments to little endian part + * add/clean big-endian packed structs (struct_endianess.py) + + [ Pau Espin Pedrol ] + * configure.ac: Introduce --{enable,disable}-libsctp configure flag + * configure.ac: Drop unneeded check for dahdi + * stream.c: Improve logging during sock send() + * stream: Drop data during write() while in state NONE + * stream: Re-arrange cli states to fix 100% cpu usage bug + * stream: Add new WAIT_RECONNECT cli state + * stream: Rename cli state NONE to CLOSED + * debian/control: Drop incorrect libortp-dev dependency + * Use OSMO_FD_* instead of deprecated BSC_FD_* + * stream: Fix some SCTP code not disabled if --disable-libsctp is used + + [ Eric ] + * configure.ac: fix libtool issue with clang and sanitizer + + [ Sylvain Munaut ] + * stream: Attempt to workaround kernel ABI breakage + + [ Alexander Chemeris ] + * amr: Fix OA<->BWE conversion. + * amr: Fix OA<->BWE conversion. + * amr: Whitespace fix + + [ neels ] + * Revert "amr: Fix OA<->BWE conversion." + + [ Oliver Smith ] + * contrib: import RPM spec + * contrib: integrate RPM spec + * Makefile.am: EXTRA_DIST: debian, contrib/*.spec.in + + [ Philipp Maier ] + * amr: fix off-by-one in osmo_amr_bwe_to_oa() + + [ Harald Welte ] + * src/stream: Work around more Linux kernel ABI breakage + * src/stream.c: Don't leak socket during SCTP_EVENTS getsockopt + + -- Harald Welte <[email protected]> Thu, 13 Aug 2020 11:21:02 +0200 + libosmo-netif (0.7.0) unstable; urgency=medium [ Pau Espin Pedrol ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/debian/control new/libosmo-netif-1.0.0/debian/control --- old/libosmo-netif-0.7.0/debian/control 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/debian/control 2020-08-13 11:21:03.000000000 +0200 @@ -15,8 +15,7 @@ libosmo-abis-dev (>= 0.6.0), pkg-config, libpcap0.8-dev, - libsctp-dev, - libortp-dev + libsctp-dev Standards-Version: 3.9.6 Vcs-Browser: http://git.osmocom.org/libosmo-netif/ Vcs-Git: git://git.osmocom.org/libosmo-netif.git diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/examples/rs232-write.c new/libosmo-netif-1.0.0/examples/rs232-write.c --- old/libosmo-netif-0.7.0/examples/rs232-write.c 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/examples/rs232-write.c 2020-08-13 11:21:03.000000000 +0200 @@ -377,7 +377,7 @@ exit(EXIT_FAILURE); } kbd_ofd->fd = STDIN_FILENO; - kbd_ofd->when = BSC_FD_READ; + kbd_ofd->when = OSMO_FD_READ; kbd_ofd->data = NULL; kbd_ofd->cb = kbd_cb; rc = osmo_fd_register(kbd_ofd); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/examples/stream-client.c new/libosmo-netif-1.0.0/examples/stream-client.c --- old/libosmo-netif-0.7.0/examples/stream-client.c 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/examples/stream-client.c 2020-08-13 11:21:03.000000000 +0200 @@ -142,7 +142,7 @@ exit(EXIT_FAILURE); } kbd_ofd->fd = STDIN_FILENO; - kbd_ofd->when = BSC_FD_READ; + kbd_ofd->when = OSMO_FD_READ; kbd_ofd->data = conn; kbd_ofd->cb = kbd_cb; rc = osmo_fd_register(kbd_ofd); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/examples/stream-server.c new/libosmo-netif-1.0.0/examples/stream-server.c --- old/libosmo-netif-0.7.0/examples/stream-server.c 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/examples/stream-server.c 2020-08-13 11:21:03.000000000 +0200 @@ -166,7 +166,7 @@ exit(EXIT_FAILURE); } kbd_ofd->fd = STDIN_FILENO; - kbd_ofd->when = BSC_FD_READ; + kbd_ofd->when = OSMO_FD_READ; kbd_ofd->data = srv; kbd_ofd->cb = kbd_cb; osmo_fd_register(kbd_ofd); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/include/osmocom/netif/amr.h new/libosmo-netif-1.0.0/include/osmocom/netif/amr.h --- old/libosmo-netif-0.7.0/include/osmocom/netif/amr.h 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/include/osmocom/netif/amr.h 2020-08-13 11:21:03.000000000 +0200 @@ -43,24 +43,19 @@ */ struct amr_hdr { -#if OSMO_IS_BIG_ENDIAN - /* Payload Header */ - uint8_t cmr:4, /* Codec Mode Request */ - pad1:4; - /* Table of Contents */ - uint8_t f:1, /* followed by another speech frame? */ - ft:4, /* coding mode */ - q:1, /* OK (not damaged) at origin? */ - pad2:2; -#elif OSMO_IS_LITTLE_ENDIAN +#if OSMO_IS_LITTLE_ENDIAN /* Payload Header */ uint8_t pad1:4, - cmr:4; + cmr:4; /* Codec Mode Request */ /* Table of Contents */ uint8_t pad2:2, - q:1, - ft:4, - f:1; + q:1, /* OK (not damaged) at origin? */ + ft:4, /* coding mode */ + f:1; /* followed by another speech frame? */ +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ + uint8_t cmr:4, pad1:4; + uint8_t f:1, ft:4, q:1, pad2:2; #endif } __attribute__((packed)); @@ -83,20 +78,34 @@ #define AMR_FT_SID 8 /* SID */ #define AMR_FT_MAX 9 -/* AMR voice frame length (in bytes, rounded), - * See also RFC 3267, chapter 3.6 */ -#define AMR_FT_0_LEN 12 /* 4.75 */ -#define AMR_FT_1_LEN 13 /* 5.15 */ -#define AMR_FT_2_LEN 15 /* 5.90 */ -#define AMR_FT_3_LEN 17 /* 6.70 */ -#define AMR_FT_4_LEN 19 /* 7.40 */ -#define AMR_FT_5_LEN 20 /* 7.95 */ -#define AMR_FT_6_LEN 26 /* 10.2 */ -#define AMR_FT_7_LEN 31 /* 12.2 */ -#define AMR_FT_SID_LEN 5 /* SID */ - -/* NOTE: the above constant refers to the length of one AMR speech frame-block, +/* AMR voice frame length (in bits). + * See also RFC 3267, chapter 3.6. + * + * NOTE: These constants refer to the length of one AMR speech frame-block, + * not counting CMR, TOC. */ +#define AMR_FT_0_LEN_BITS 95 /* 4.75 */ +#define AMR_FT_1_LEN_BITS 103 /* 5.15 */ +#define AMR_FT_2_LEN_BITS 118 /* 5.90 */ +#define AMR_FT_3_LEN_BITS 134 /* 6.70 */ +#define AMR_FT_4_LEN_BITS 148 /* 7.40 */ +#define AMR_FT_5_LEN_BITS 159 /* 7.95 */ +#define AMR_FT_6_LEN_BITS 204 /* 10.2 */ +#define AMR_FT_7_LEN_BITS 244 /* 12.2 */ +#define AMR_FT_SID_LEN_BITS 39 /* SID */ + +/* AMR voice frame length (in bytes, rounded). + * + * NOTE: These constants refer to the length of one AMR speech frame-block, * not counting CMR, TOC. */ +#define AMR_FT_0_LEN ((AMR_FT_0_LEN_BITS+7)/8) /* 4.75 */ +#define AMR_FT_1_LEN ((AMR_FT_1_LEN_BITS+7)/8) /* 5.15 */ +#define AMR_FT_2_LEN ((AMR_FT_2_LEN_BITS+7)/8) /* 5.90 */ +#define AMR_FT_3_LEN ((AMR_FT_3_LEN_BITS+7)/8) /* 6.70 */ +#define AMR_FT_4_LEN ((AMR_FT_4_LEN_BITS+7)/8) /* 7.40 */ +#define AMR_FT_5_LEN ((AMR_FT_5_LEN_BITS+7)/8) /* 7.95 */ +#define AMR_FT_6_LEN ((AMR_FT_6_LEN_BITS+7)/8) /* 10.2 */ +#define AMR_FT_7_LEN ((AMR_FT_7_LEN_BITS+7)/8) /* 12.2 */ +#define AMR_FT_SID_LEN ((AMR_FT_SID_LEN_BITS+7)/8) /* SID */ int osmo_amr_ft_valid(uint8_t amr_ft); size_t osmo_amr_bytes(uint8_t amr_cmr); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/include/osmocom/netif/osmux.h new/libosmo-netif-1.0.0/include/osmocom/netif/osmux.h --- old/libosmo-netif-0.7.0/include/osmocom/netif/osmux.h 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/include/osmocom/netif/osmux.h 2020-08-13 11:21:03.000000000 +0200 @@ -30,28 +30,25 @@ #define OSMUX_FT_DUMMY 2 struct osmux_hdr { -#if OSMO_IS_BIG_ENDIAN - uint8_t rtp_m:1, - ft:2, - ctr:3, - amr_f:1, - amr_q:1; -#elif OSMO_IS_LITTLE_ENDIAN +#if OSMO_IS_LITTLE_ENDIAN uint8_t amr_q:1, amr_f:1, ctr:3, ft:2, rtp_m:1; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ + uint8_t rtp_m:1, ft:2, ctr:3, amr_f:1, amr_q:1; #endif uint8_t seq; #define OSMUX_CID_MAX 255 /* determined by circuit_id */ uint8_t circuit_id; -#if OSMO_IS_BIG_ENDIAN - uint8_t amr_ft:4, - amr_cmr:4; -#elif OSMO_IS_LITTLE_ENDIAN +#if OSMO_IS_LITTLE_ENDIAN uint8_t amr_cmr:4, amr_ft:4; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ + uint8_t amr_ft:4, amr_cmr:4; #endif } __attribute__((packed)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/include/osmocom/netif/rtp.h new/libosmo-netif-1.0.0/include/osmocom/netif/rtp.h --- old/libosmo-netif-0.7.0/include/osmocom/netif/rtp.h 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/include/osmocom/netif/rtp.h 2020-08-13 11:21:03.000000000 +0200 @@ -13,12 +13,9 @@ uint8_t payload_type:7, marker:1; #elif OSMO_IS_BIG_ENDIAN - uint8_t version:2, - padding:1, - extension:1, - csrc_count:4; - uint8_t marker:1, - payload_type:7; +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */ + uint8_t version:2, padding:1, extension:1, csrc_count:4; + uint8_t marker:1, payload_type:7; #endif uint16_t sequence; uint32_t timestamp; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/src/amr.c new/libosmo-netif-1.0.0/src/amr.c --- old/libosmo-netif-0.7.0/src/amr.c 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/src/amr.c 2020-08-13 11:21:03.000000000 +0200 @@ -29,6 +29,18 @@ * 7 12.20 244 31 */ +static size_t amr_ft_to_bits[AMR_FT_MAX] = { + [AMR_FT_0] = AMR_FT_0_LEN_BITS, + [AMR_FT_1] = AMR_FT_1_LEN_BITS, + [AMR_FT_2] = AMR_FT_2_LEN_BITS, + [AMR_FT_3] = AMR_FT_3_LEN_BITS, + [AMR_FT_4] = AMR_FT_4_LEN_BITS, + [AMR_FT_5] = AMR_FT_5_LEN_BITS, + [AMR_FT_6] = AMR_FT_6_LEN_BITS, + [AMR_FT_7] = AMR_FT_7_LEN_BITS, + [AMR_FT_SID] = AMR_FT_SID_LEN_BITS, +}; + static size_t amr_ft_to_bytes[AMR_FT_MAX] = { [AMR_FT_0] = AMR_FT_0_LEN, [AMR_FT_1] = AMR_FT_1_LEN, @@ -41,6 +53,11 @@ [AMR_FT_SID] = AMR_FT_SID_LEN, }; +size_t osmo_amr_bits(uint8_t amr_ft) +{ + return amr_ft_to_bits[amr_ft]; +} + size_t osmo_amr_bytes(uint8_t amr_ft) { return amr_ft_to_bytes[amr_ft]; @@ -103,7 +120,7 @@ /* Match the length of the received payload against the expected frame * length that is defined by the frame type. */ - if(!osmo_amr_ft_valid(oa_hdr->ft)) + if (!osmo_amr_ft_valid(oa_hdr->ft)) return false; frame_len = osmo_amr_bytes(oa_hdr->ft); if (frame_len != payload_len - sizeof(struct amr_hdr)) @@ -119,8 +136,10 @@ int osmo_amr_oa_to_bwe(uint8_t *payload, unsigned int payload_len) { struct amr_hdr *oa_hdr = (struct amr_hdr *)payload; + unsigned int ft = oa_hdr->ft; unsigned int frame_len = payload_len - sizeof(struct amr_hdr); unsigned int i; + int bwe_payload_len; /* This implementation is not capable to handle multi-frame * packets, so we need to make sure that the frame we operate on @@ -128,6 +147,10 @@ if (oa_hdr->f != 0) return -1; + /* Check for valid FT (AMR mode) value */ + if (!osmo_amr_ft_valid(oa_hdr->ft)) + return -1; + /* Move TOC close to CMR */ payload[0] |= (payload[1] >> 4) & 0x0f; payload[1] = (payload[1] << 4) & 0xf0; @@ -137,8 +160,10 @@ payload[i + 2] = payload[i + 2] << 6; } - /* The overall saving is one byte! */ - return payload_len - 1; + /* Calculate new payload length */ + bwe_payload_len = (10 + osmo_amr_bits(ft) + 7) / 8; + + return bwe_payload_len; } /*! Convert an AMR frame from bandwith-efficient mode to octet-aligned mode. @@ -150,8 +175,10 @@ unsigned int payload_maxlen) { uint8_t buf[256]; - unsigned int frame_len = payload_len - 1; + /* The header is only valid after shifting first two bytes to OA mode */ + struct amr_hdr *oa_hdr; unsigned int i; + int oa_payload_len; memset(buf, 0, sizeof(buf)); @@ -165,12 +192,18 @@ buf[1] = payload[0] << 4; buf[1] |= (payload[1] >> 4) & 0x0c; - for (i = 0; i < frame_len - 1; i++) { + /* Calculate new payload length */ + oa_hdr = (struct amr_hdr *)buf; + if (!osmo_amr_ft_valid(oa_hdr->ft)) + return -1; + oa_payload_len = 2 + osmo_amr_bytes(oa_hdr->ft); + + for (i = 0; i < oa_payload_len - 3; i++) { buf[i + 2] = payload[i + 1] << 2; buf[i + 2] |= payload[i + 2] >> 6; } buf[i + 2] = payload[i + 1] << 2; - memcpy(payload, buf, payload_len + 1); - return payload_len + 1; + memcpy(payload, buf, oa_payload_len); + return oa_payload_len; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/src/datagram.c new/libosmo-netif-1.0.0/src/datagram.c --- old/libosmo-netif-0.7.0/src/datagram.c 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/src/datagram.c 2020-08-13 11:21:03.000000000 +0200 @@ -95,7 +95,7 @@ LOGP(DLINP, LOGL_DEBUG, "sending data\n"); if (llist_empty(&conn->tx_queue)) { - conn->ofd.when &= ~BSC_FD_WRITE; + conn->ofd.when &= ~OSMO_FD_WRITE; return 0; } lh = conn->tx_queue.next; @@ -115,7 +115,7 @@ { struct osmo_dgram_tx *conn = ofd->data; - if (what & BSC_FD_WRITE) { + if (what & OSMO_FD_WRITE) { LOGP(DLINP, LOGL_DEBUG, "write\n"); osmo_dgram_tx_write(conn); } @@ -136,7 +136,7 @@ return NULL; conn->ofd.fd = -1; - conn->ofd.when |= BSC_FD_READ; + conn->ofd.when |= OSMO_FD_READ; conn->ofd.priv_nr = 0; /* XXX */ conn->ofd.cb = osmo_dgram_tx_fd_cb; conn->ofd.data = conn; @@ -240,7 +240,7 @@ struct msgb *msg) { msgb_enqueue(&conn->tx_queue, msg); - conn->ofd.when |= BSC_FD_WRITE; + conn->ofd.when |= OSMO_FD_WRITE; } /* @@ -290,7 +290,7 @@ struct osmo_dgram_rx *conn = ofd->data; LOGP(DLINP, LOGL_DEBUG, "read\n"); - if (what & BSC_FD_READ) + if (what & OSMO_FD_READ) osmo_dgram_rx_read(conn); return 0; @@ -310,7 +310,7 @@ return NULL; conn->ofd.fd = -1; - conn->ofd.when |= BSC_FD_READ; + conn->ofd.when |= OSMO_FD_READ; conn->ofd.cb = osmo_dgram_rx_cb; conn->ofd.data = conn; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/src/rs232.c new/libosmo-netif-1.0.0/src/rs232.c --- old/libosmo-netif-0.7.0/src/rs232.c 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/src/rs232.c 2020-08-13 11:21:03.000000000 +0200 @@ -62,7 +62,7 @@ struct osmo_rs232 *r = ptr; /* we're again ready to transmit. */ - r->ofd.when |= BSC_FD_WRITE; + r->ofd.when |= OSMO_FD_WRITE; } static int handle_ser_write(struct osmo_fd *bfd) @@ -75,7 +75,7 @@ LOGP(DLINP, LOGL_DEBUG, "writing data to rs232\n"); if (llist_empty(&r->tx_queue)) { - r->ofd.when &= ~BSC_FD_WRITE; + r->ofd.when &= ~OSMO_FD_WRITE; return 0; } lh = r->tx_queue.next; @@ -92,7 +92,7 @@ /* We've got more data to write, but we have to wait to make it. */ if (!llist_empty(&r->tx_queue) && r->cfg.delay_us) { - r->ofd.when &= ~BSC_FD_WRITE; + r->ofd.when &= ~OSMO_FD_WRITE; osmo_timer_schedule(&r->tx_timer, 0, r->cfg.delay_us); } return 0; @@ -114,13 +114,13 @@ { int rc = 0; - if (what & BSC_FD_READ) + if (what & OSMO_FD_READ) rc = handle_ser_read(bfd); if (rc < 0) return rc; - if (what & BSC_FD_WRITE) + if (what & OSMO_FD_WRITE) rc = handle_ser_write(bfd); return rc; @@ -223,7 +223,7 @@ return rc; } - bfd->when = BSC_FD_READ; + bfd->when = OSMO_FD_READ; bfd->cb = serial_fd_cb; bfd->data = r; @@ -257,7 +257,7 @@ void osmo_rs232_write(struct osmo_rs232 *r, struct msgb *msg) { msgb_enqueue(&r->tx_queue, msg); - r->ofd.when |= BSC_FD_WRITE; + r->ofd.when |= OSMO_FD_WRITE; } void osmo_rs232_close(struct osmo_rs232 *r) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/src/stream.c new/libosmo-netif-1.0.0/src/stream.c --- old/libosmo-netif-0.7.0/src/stream.c 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/src/stream.c 2020-08-13 11:21:03.000000000 +0200 @@ -65,6 +65,7 @@ * \brief Osmocom stream socket helpers */ +#ifdef HAVE_LIBSCTP /* * Platforms that don't have MSG_NOSIGNAL (which disables SIGPIPE) * usually have SO_NOSIGPIPE (set via setsockopt). @@ -73,6 +74,99 @@ #define MSG_NOSIGNAL 0 #endif +/* is any of the bytes from offset .. u8_size in 'u8' non-zero? return offset or -1 if all zero */ +static int byte_nonzero(const uint8_t *u8, unsigned int offset, unsigned int u8_size) +{ + int j; + + for (j = offset; j < u8_size; j++) { + if (u8[j] != 0) + return j; + } + + return -1; +} + +static int sctp_sockopt_event_subscribe_size = 0; + +static int determine_sctp_sockopt_event_subscribe_size(void) +{ + uint8_t buf[256]; + socklen_t buf_len = sizeof(buf); + int sd, rc; + + /* only do this once */ + if (sctp_sockopt_event_subscribe_size != 0) + return 0; + + sd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); + if (sd < 0) + return sd; + + rc = getsockopt(sd, IPPROTO_SCTP, SCTP_EVENTS, buf, &buf_len); + close(sd); + if (rc < 0) + return rc; + + sctp_sockopt_event_subscribe_size = buf_len; + + LOGP(DLINP, LOGL_INFO, "sizes of 'struct sctp_event_subscribe': compile-time %zu, kernel: %u\n", + sizeof(struct sctp_event_subscribe), sctp_sockopt_event_subscribe_size); + return 0; +} + +/* Attempt to work around Linux kernel ABI breakage + * + * The Linux kernel ABI for the SCTP_EVENTS socket option has been broken repeatedly. + * - until commit 35ea82d611da59f8bea44a37996b3b11bb1d3fd7 ( kernel < 4.11), the size is 10 bytes + * - in 4.11 it is 11 bytes + * - in 4.12 .. 5.4 it is 13 bytes + * - in kernels >= 5.5 it is 14 bytes + * + * This wouldn't be a problem if the kernel didn't have a "stupid" assumption that the structure + * size passed by userspace will match 1:1 the length of the structure at kernel compile time. In + * an ideal world, it would just use the known first bytes and assume the remainder is all zero. + * But as it doesn't do that, let's try to work around this */ +static int sctp_setsockopt_events_linux_workaround(int fd, const struct sctp_event_subscribe *event) +{ + + const unsigned int compiletime_size = sizeof(*event); + int rc; + + if (determine_sctp_sockopt_event_subscribe_size() < 0) { + LOGP(DLINP, LOGL_ERROR, "Cannot determine SCTP_EVENTS socket option size\n"); + return -1; + } + + if (compiletime_size == sctp_sockopt_event_subscribe_size) { + /* no kernel workaround needed */ + return setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, event, compiletime_size); + } else if (compiletime_size < sctp_sockopt_event_subscribe_size) { + /* we are using an older userspace with a more modern kernel and hence need + * to pad the data */ + uint8_t buf[sctp_sockopt_event_subscribe_size]; + + memcpy(buf, event, compiletime_size); + memset(buf + sizeof(*event), 0, sctp_sockopt_event_subscribe_size - compiletime_size); + return setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, buf, sctp_sockopt_event_subscribe_size); + } else /* if (compiletime_size > sctp_sockopt_event_subscribe_size) */ { + /* we are using a newer userspace with an older kernel and hence need to truncate + * the data - but only if the caller didn't try to enable any of the events of the + * truncated portion */ + rc = byte_nonzero((const uint8_t *)event, sctp_sockopt_event_subscribe_size, + compiletime_size); + if (rc >= 0) { + LOGP(DLINP, LOGL_ERROR, "Kernel only supports sctp_event_subscribe of %u bytes, " + "but caller tried to enable more modern event at offset %u\n", + sctp_sockopt_event_subscribe_size, rc); + return -1; + } + + return setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, event, sctp_sockopt_event_subscribe_size); + } +} +#endif // HAVE_LIBSCTP + static int sctp_sock_activate_events(int fd) { #ifdef HAVE_LIBSCTP @@ -89,12 +183,10 @@ event.sctp_shutdown_event = 1; /* IMPORTANT: Do NOT enable sender_dry_event here, see * https://bugzilla.redhat.com/show_bug.cgi?id=1442784 */ - rc = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, - &event, sizeof(event)); + rc = sctp_setsockopt_events_linux_workaround(fd, &event); if (rc < 0) - LOGP(DLINP, LOGL_ERROR, "couldn't activate SCTP events " - "on FD %u\n", fd); + LOGP(DLINP, LOGL_ERROR, "couldn't activate SCTP events on FD %u\n", fd); return rc; #else return -1; @@ -106,9 +198,11 @@ int rc; switch (proto) { +#ifdef HAVE_LIBSCTP case IPPROTO_SCTP: rc = setsockopt(fd, IPPROTO_SCTP, SCTP_NODELAY, &on, sizeof(on)); break; +#endif case IPPROTO_TCP: rc = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); break; @@ -127,31 +221,39 @@ */ enum osmo_stream_cli_state { - STREAM_CLI_STATE_NONE = 0, - STREAM_CLI_STATE_CONNECTING = 1, - STREAM_CLI_STATE_CONNECTED = 2, + STREAM_CLI_STATE_CLOSED, /* No fd associated, no timer active */ + STREAM_CLI_STATE_WAIT_RECONNECT, /* No fd associated, has timer active to try to connect again */ + STREAM_CLI_STATE_CONNECTING, /* Fd associated, but connection not yet confirmed by peer or lower layers */ + STREAM_CLI_STATE_CONNECTED, /* Fd associated and connection is established */ STREAM_CLI_STATE_MAX }; static const struct value_string stream_cli_state_names[] = { - { STREAM_CLI_STATE_NONE, " NONE" }, - { STREAM_CLI_STATE_CONNECTING, "CONNECTING" }, - { STREAM_CLI_STATE_CONNECTED, " CONNECTED" }, + { STREAM_CLI_STATE_CLOSED, "CLOSED" }, + { STREAM_CLI_STATE_WAIT_RECONNECT, "WAIT_RECONNECT" }, + { STREAM_CLI_STATE_CONNECTING, "CONNECTING" }, + { STREAM_CLI_STATE_CONNECTED, "CONNECTED" }, { 0, NULL } }; #define OSMO_STREAM_CLI_F_RECONF (1 << 0) #define OSMO_STREAM_CLI_F_NODELAY (1 << 1) +#ifdef HAVE_LIBSCTP +#define OSMO_STREAM_MAX_ADDRS OSMO_SOCK_MAX_ADDRS +#else +#define OSMO_STREAM_MAX_ADDRS 1 +#endif + struct osmo_stream_cli { struct osmo_fd ofd; struct llist_head tx_queue; struct osmo_timer_list timer; enum osmo_stream_cli_state state; - char *addr[OSMO_SOCK_MAX_ADDRS]; + char *addr[OSMO_STREAM_MAX_ADDRS]; uint8_t addrcnt; uint16_t port; - char *local_addr[OSMO_SOCK_MAX_ADDRS]; + char *local_addr[OSMO_STREAM_MAX_ADDRS]; uint8_t local_addrcnt; uint16_t local_port; uint16_t proto; @@ -179,10 +281,10 @@ return; } + cli->state = STREAM_CLI_STATE_WAIT_RECONNECT; LOGSCLI(cli, LOGL_INFO, "retrying in %d seconds...\n", cli->reconnect_timeout); osmo_timer_schedule(&cli->timer, cli->reconnect_timeout, 0); - cli->state = STREAM_CLI_STATE_CONNECTING; } /*! \brief Check if Osmocom Stream Client is in connected state @@ -211,7 +313,7 @@ cli->disconnect_cb(cli); } - cli->state = STREAM_CLI_STATE_NONE; + cli->state = STREAM_CLI_STATE_CLOSED; } static void osmo_stream_cli_read(struct osmo_stream_cli *cli) @@ -231,21 +333,21 @@ struct llist_head *lh; int ret; - LOGSCLI(cli, LOGL_DEBUG, "sending data\n"); - if (llist_empty(&cli->tx_queue)) { - cli->ofd.when &= ~BSC_FD_WRITE; + cli->ofd.when &= ~OSMO_FD_WRITE; return 0; } lh = cli->tx_queue.next; llist_del(lh); msg = llist_entry(lh, struct msgb, list); - if (cli->state == STREAM_CLI_STATE_CONNECTING) { + if (!osmo_stream_cli_is_connected(cli)) { LOGSCLI(cli, LOGL_ERROR, "not connected, dropping data!\n"); return 0; } + LOGSCLI(cli, LOGL_DEBUG, "sending %u bytes of data\n", msgb_length(msg)); + switch (cli->proto) { #ifdef HAVE_LIBSCTP case IPPROTO_SCTP: @@ -258,14 +360,14 @@ #endif case IPPROTO_TCP: default: - ret = send(cli->ofd.fd, msg->data, msg->len, 0); + ret = send(cli->ofd.fd, msg->data, msgb_length(msg), 0); break; } if (ret < 0) { if (errno == EPIPE || errno == ENOTCONN) { osmo_stream_cli_reconnect(cli); } - LOGSCLI(cli, LOGL_ERROR, "error to send\n"); + LOGSCLI(cli, LOGL_ERROR, "error %d to send\n", ret); } msgb_free(msg); return 0; @@ -288,7 +390,7 @@ /* If messages got enqueued while 'connecting', keep WRITE flag up to dispatch them upon next main loop step */ if (llist_empty(&cli->tx_queue)) - cli->ofd.when &= ~BSC_FD_WRITE; + cli->ofd.when &= ~OSMO_FD_WRITE; LOGSCLI(cli, LOGL_DEBUG, "connection done.\n"); cli->state = STREAM_CLI_STATE_CONNECTED; @@ -306,17 +408,18 @@ cli->connect_cb(cli); break; case STREAM_CLI_STATE_CONNECTED: - if (what & BSC_FD_READ) { + if (what & OSMO_FD_READ) { LOGSCLI(cli, LOGL_DEBUG, "connected read\n"); osmo_stream_cli_read(cli); } - if (what & BSC_FD_WRITE) { + if (what & OSMO_FD_WRITE) { LOGSCLI(cli, LOGL_DEBUG, "connected write\n"); osmo_stream_cli_write(cli); } break; default: - break; + /* Only CONNECTING and CONNECTED states are expected, since they are the only states where FD exists: */ + osmo_panic("osmo_stream_cli_fd_cb called with unexpected state %d\n", cli->state); } return 0; } @@ -337,11 +440,10 @@ cli->proto = IPPROTO_TCP; cli->ofd.fd = -1; - cli->ofd.when |= BSC_FD_READ | BSC_FD_WRITE; cli->ofd.priv_nr = 0; /* XXX */ cli->ofd.cb = osmo_stream_cli_fd_cb; cli->ofd.data = cli; - cli->state = STREAM_CLI_STATE_CONNECTING; + cli->state = STREAM_CLI_STATE_CLOSED; osmo_timer_setup(&cli->timer, cli_timer_cb, cli); cli->reconnect_timeout = 5; /* default is 5 seconds. */ INIT_LLIST_HEAD(&cli->tx_queue); @@ -369,7 +471,7 @@ { int i = 0; - if (addrcnt > OSMO_SOCK_MAX_ADDRS) + if (addrcnt > OSMO_STREAM_MAX_ADDRS) return -EINVAL; for (; i < addrcnt; i++) @@ -426,7 +528,7 @@ { int i = 0; - if (addrcnt > OSMO_SOCK_MAX_ADDRS) + if (addrcnt > OSMO_STREAM_MAX_ADDRS) return -EINVAL; for (; i < addrcnt; i++) @@ -554,12 +656,14 @@ cli->flags &= ~OSMO_STREAM_CLI_F_RECONF; switch (cli->proto) { +#ifdef HAVE_LIBSCTP case IPPROTO_SCTP: ret = osmo_sock_init2_multiaddr(AF_INET, SOCK_STREAM, cli->proto, (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port, (const char **)cli->addr, cli->addrcnt, cli->port, OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK); break; +#endif default: ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto, cli->local_addr[0], cli->local_port, @@ -573,6 +677,7 @@ return ret; } cli->ofd.fd = ret; + cli->ofd.when = OSMO_FD_READ | OSMO_FD_WRITE; if (cli->flags & OSMO_STREAM_CLI_F_NODELAY) { ret = setsockopt_nodelay(cli->ofd.fd, cli->proto, 1); @@ -583,6 +688,7 @@ if (osmo_fd_register(&cli->ofd) < 0) goto error_close_socket; + cli->state = STREAM_CLI_STATE_CONNECTING; return 0; error_close_socket: @@ -623,12 +729,14 @@ switch (cli->proto) { +#ifdef HAVE_LIBSCTP case IPPROTO_SCTP: ret = osmo_sock_init2_multiaddr(AF_INET, SOCK_STREAM, cli->proto, (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port, (const char **)cli->addr, cli->addrcnt, cli->port, OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK); break; +#endif default: ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto, cli->local_addr[0], cli->local_port, @@ -641,6 +749,7 @@ return ret; } cli->ofd.fd = ret; + cli->ofd.when = OSMO_FD_READ | OSMO_FD_WRITE; if (cli->flags & OSMO_STREAM_CLI_F_NODELAY) { ret = setsockopt_nodelay(cli->ofd.fd, cli->proto, 1); @@ -651,9 +760,11 @@ if (osmo_fd_register(&cli->ofd) < 0) goto error_close_socket; + cli->state = STREAM_CLI_STATE_CONNECTING; return 0; error_close_socket: + cli->state = STREAM_CLI_STATE_CLOSED; close(cli->ofd.fd); cli->ofd.fd = -1; return -EIO; @@ -664,15 +775,7 @@ struct osmo_stream_cli *cli = data; LOGSCLI(cli, LOGL_DEBUG, "reconnecting.\n"); - - switch(cli->state) { - case STREAM_CLI_STATE_CONNECTING: - cli->ofd.when |= BSC_FD_READ | BSC_FD_WRITE; - osmo_stream_cli_open(cli); - break; - default: - break; - } + osmo_stream_cli_open(cli); } /*! \brief Enqueue data to be sent via an Osmocom stream client @@ -681,7 +784,7 @@ void osmo_stream_cli_send(struct osmo_stream_cli *cli, struct msgb *msg) { msgb_enqueue(&cli->tx_queue, msg); - cli->ofd.when |= BSC_FD_WRITE; + cli->ofd.when |= OSMO_FD_WRITE; } /*! \brief Receive data via an Osmocom stream client @@ -718,7 +821,7 @@ struct osmo_stream_srv_link { struct osmo_fd ofd; - char *addr[OSMO_SOCK_MAX_ADDRS]; + char *addr[OSMO_STREAM_MAX_ADDRS]; uint8_t addrcnt; uint16_t port; uint16_t proto; @@ -788,7 +891,7 @@ link->proto = IPPROTO_TCP; link->ofd.fd = -1; - link->ofd.when |= BSC_FD_READ | BSC_FD_WRITE; + link->ofd.when |= OSMO_FD_READ | OSMO_FD_WRITE; link->ofd.cb = osmo_stream_srv_fd_cb; link->ofd.data = link; @@ -830,7 +933,7 @@ { int i = 0; - if (addrcnt > OSMO_SOCK_MAX_ADDRS) + if (addrcnt > OSMO_STREAM_MAX_ADDRS) return -EINVAL; for (; i < addrcnt; i++) @@ -950,11 +1053,13 @@ link->flags &= ~OSMO_STREAM_SRV_F_RECONF; switch (link->proto) { +#ifdef HAVE_LIBSCTP case IPPROTO_SCTP: ret = osmo_sock_init2_multiaddr(AF_INET, SOCK_STREAM, link->proto, (const char **)link->addr, link->addrcnt, link->port, NULL, 0, 0, OSMO_SOCK_F_BIND); break; +#endif default: ret = osmo_sock_init(AF_INET, SOCK_STREAM, link->proto, link->addr[0], link->port, OSMO_SOCK_F_BIND); @@ -1024,7 +1129,7 @@ LOGP(DLINP, LOGL_DEBUG, "sending data\n"); if (llist_empty(&conn->tx_queue)) { - conn->ofd.when &= ~BSC_FD_WRITE; + conn->ofd.when &= ~OSMO_FD_WRITE; return; } lh = conn->tx_queue.next; @@ -1061,9 +1166,9 @@ int rc = 0; LOGP(DLINP, LOGL_DEBUG, "connected read/write\n"); - if (what & BSC_FD_READ) + if (what & OSMO_FD_READ) rc = osmo_stream_srv_read(conn); - if (rc != -EBADF && (what & BSC_FD_WRITE)) + if (rc != -EBADF && (what & OSMO_FD_WRITE)) osmo_stream_srv_write(conn); return rc; @@ -1091,7 +1196,7 @@ conn->ofd.fd = fd; conn->ofd.data = conn; conn->ofd.cb = osmo_stream_srv_cb; - conn->ofd.when = BSC_FD_READ; + conn->ofd.when = OSMO_FD_READ; conn->cb = cb; conn->closed_cb = closed_cb; conn->data = data; @@ -1177,7 +1282,7 @@ } msgb_enqueue(&conn->tx_queue, msg); - conn->ofd.when |= BSC_FD_WRITE; + conn->ofd.when |= OSMO_FD_WRITE; } /*! \brief Receive data via Osmocom stream server diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/tests/amr/amr_test.c new/libosmo-netif-1.0.0/tests/amr/amr_test.c --- old/libosmo-netif-0.7.0/tests/amr/amr_test.c 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/tests/amr/amr_test.c 2020-08-13 11:21:03.000000000 +0200 @@ -44,7 +44,10 @@ "100c4e9ba850e30d5d53d04de41e7c", "100c6c18e7b7fff53aeb055e7d1c54", "100c1fb967f7f1fdf547bf2e61c060", - "a038ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc", /* test pattern */ + "0004f89d67f1160935bde1996840", + "0004633cc7f0630439ffe0000000", + "0004eb81fc0758973b9edc782550", + "a078ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc", /* sample with invalid FT */ "END", }; @@ -56,7 +59,7 @@ "f3d39a49a09e7a802852e297e8c9246aadf5a45928bfc27177fed8404d97d3b8", "f3c2155b65131c68682079fab4810911200003b360ae0446000025f11e539dd0", "f3c381bc7061c9f8507f6029de6115c16e5fa470c243b21b6e35dbb48bd84c00", - "a7bfc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03f", /* test pattern */ + "a7bfc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03f", /* sample with invalid FT */ "END", }; @@ -87,7 +90,6 @@ return; printf("\n"); printf("Sample No.: %i\n", i); - len = strlen(oa_amr_samples[i]); len = osmo_hexparse(oa_amr_samples[i], buf, sizeof(buf)); OSMO_ASSERT(len > 0); @@ -102,11 +104,6 @@ dump_bits(buf, rc); printf("\n"); printf(" rc: %i\n", rc); - - if (rc > 0) { - OSMO_ASSERT(rc == len - 1); - OSMO_ASSERT(buf[len - 1] == 0x00); - } i++; } } @@ -126,7 +123,6 @@ return; printf("\n"); printf("Sample No.: %i\n", i); - len = strlen(bwe_amr_samples[i]); len = osmo_hexparse(bwe_amr_samples[i], buf, sizeof(buf)); OSMO_ASSERT(len > 0); @@ -142,7 +138,6 @@ printf("\n"); printf(" rc: %i\n", rc); - OSMO_ASSERT(rc == len + 1); i++; } } @@ -151,6 +146,8 @@ { uint8_t buf[256]; uint8_t buf_chk[256]; + struct amr_hdr *oa_hd = (struct amr_hdr *)buf; + unsigned int ft; unsigned int i = 0; int len; @@ -163,18 +160,28 @@ while (1) { if (strcmp(oa_amr_samples[i], "END") == 0) return; - printf("Sample No.: %i...\n", i); - len = strlen(oa_amr_samples[i]); + printf("Sample No.: %i...", i); len = osmo_hexparse(oa_amr_samples[i], buf, sizeof(buf)); OSMO_ASSERT(len > 0); + i++; + + ft = oa_hd->ft; + if (!osmo_amr_ft_valid(ft)) { + printf(" skipping a sample with a wrong FT\n"); + continue; + } + OSMO_ASSERT(osmo_amr_bytes(ft) + 2 == len); + printf(" AMR mode: %d, OA: %d bytes,", ft, len); memcpy(buf_chk, buf, sizeof(buf)); rc = osmo_amr_oa_to_bwe(buf, len); OSMO_ASSERT(rc > 0); + printf(" BE: %d bytes,", rc); rc = osmo_amr_bwe_to_oa(buf, rc, sizeof(buf)); + printf(" OA: %d bytes\n", rc); + OSMO_ASSERT(len == rc); OSMO_ASSERT(memcmp(buf, buf_chk, len) == 0); - i++; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/tests/amr/amr_test.ok new/libosmo-netif-1.0.0/tests/amr/amr_test.ok --- old/libosmo-netif-0.7.0/tests/amr/amr_test.ok 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/tests/amr/amr_test.ok 2020-08-13 11:21:03.000000000 +0200 @@ -47,23 +47,23 @@ Sample No.: 6 octet aligned: 502c98ab841e491ff7a1a555016a32a3c7f913210630 01010000001011001001100010101011100001000001111001001001000111111111011110100001101001010101010100000001011010100011001010100011110001111111100100010011001000010000011000110000 - bw-efficient: 52e62ae1079247fde86955405a8ca8f1fe44c8418c - 010100101110011000101010111000010000011110010010010001111111110111101000011010010101010101000000010110101000110010101000111100011111111001000100110010000100000110001100 - rc: 21 + bw-efficient: 52e62ae1079247fde86955405a8ca8f1fe44c8418c00 + 01010010111001100010101011100001000001111001001001000111111111011110100001101001010101010100000001011010100011001010100011110001111111100100010011001000010000011000110000000000 + rc: 22 Sample No.: 7 octet aligned: 502cc5459a0d200e7097c4dfe86ec8d27f1756d776f0 01010000001011001100010101000101100110100000110100100000000011100111000010010111110001001101111111101000011011101100100011010010011111110001011101010110110101110111011011110000 - bw-efficient: 52f151668348039c25f137fa1bb2349fc5d5b5ddbc - 010100101111000101010001011001101000001101001000000000111001110000100101111100010011011111111010000110111011001000110100100111111100010111010101101101011101110110111100 - rc: 21 + bw-efficient: 52f151668348039c25f137fa1bb2349fc5d5b5ddbc00 + 01010010111100010101000101100110100000110100100000000011100111000010010111110001001101111111101000011011101100100011010010011111110001011101010110110101110111011011110000000000 + rc: 22 Sample No.: 8 octet aligned: 502c42b332081813d7e916e7aa5e80d7fde812b8c080 01010000001011000100001010110011001100100000100000011000000100111101011111101001000101101110011110101010010111101000000011010111111111011110100000010010101110001100000010000000 - bw-efficient: 52d0accc820604f5fa45b9ea97a035ff7a04ae3020 - 010100101101000010101100110011001000001000000110000001001111010111111010010001011011100111101010100101111010000000110101111111110111101000000100101011100011000000100000 - rc: 21 + bw-efficient: 52d0accc820604f5fa45b9ea97a035ff7a04ae302000 + 01010010110100001010110011001100100000100000011000000100111101011111101001000101101110011110101010010111101000000011010111111111011110100000010010101110001100000010000000000000 + rc: 22 Sample No.: 9 octet aligned: 40240343e959c79bacd20c77501054880a718db200 @@ -110,30 +110,51 @@ Sample No.: 15 octet aligned: 100c4e9ba850e30d5d53d04de41e7c 000100000000110001001110100110111010100001010000111000110000110101011101010100111101000001001101111001000001111001111100 - bw-efficient: 10d3a6ea1438c35754f41379079f - 0001000011010011101001101110101000010100001110001100001101010111010101001111010000010011011110010000011110011111 - rc: 14 + bw-efficient: 10d3a6ea1438c35754f41379079f00 + 000100001101001110100110111010100001010000111000110000110101011101010100111101000001001101111001000001111001111100000000 + rc: 15 Sample No.: 16 octet aligned: 100c6c18e7b7fff53aeb055e7d1c54 000100000000110001101100000110001110011110110111111111111111010100111010111010110000010101011110011111010001110001010100 - bw-efficient: 10db0639edfffd4ebac1579f4715 - 0001000011011011000001100011100111101101111111111111110101001110101110101100000101010111100111110100011100010101 - rc: 14 + bw-efficient: 10db0639edfffd4ebac1579f471500 + 000100001101101100000110001110011110110111111111111111010100111010111010110000010101011110011111010001110001010100000000 + rc: 15 Sample No.: 17 octet aligned: 100c1fb967f7f1fdf547bf2e61c060 000100000000110000011111101110010110011111110111111100011111110111110101010001111011111100101110011000011100000001100000 - bw-efficient: 10c7ee59fdfc7f7d51efcb987018 - 0001000011000111111011100101100111111101111111000111111101111101010100011110111111001011100110000111000000011000 - rc: 14 + bw-efficient: 10c7ee59fdfc7f7d51efcb98701800 + 000100001100011111101110010110011111110111111100011111110111110101010001111011111100101110011000011100000001100000000000 + rc: 15 Sample No.: 18 - octet aligned: a038ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc - 101000000011100011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111100 - bw-efficient: a3bfc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03f - 1010001110111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111 - rc: 32 + octet aligned: 0004f89d67f1160935bde1996840 + 0000000000000100111110001001110101100111111100010001011000001001001101011011110111100001100110010110100001000000 + bw-efficient: 007e2759fc45824d6f78665a1000 + 0000000001111110001001110101100111111100010001011000001001001101011011110111100001100110010110100001000000000000 + rc: 14 + +Sample No.: 19 + octet aligned: 0004633cc7f0630439ffe0000000 + 0000000000000100011000110011110011000111111100000110001100000100001110011111111111100000000000000000000000000000 + bw-efficient: 0058cf31fc18c10e7ff800000000 + 0000000001011000110011110011000111111100000110001100000100001110011111111111100000000000000000000000000000000000 + rc: 14 + +Sample No.: 20 + octet aligned: 0004eb81fc0758973b9edc782550 + 0000000000000100111010111000000111111100000001110101100010010111001110111001111011011100011110000010010101010000 + bw-efficient: 007ae07f01d625cee7b71e095400 + 0000000001111010111000000111111100000001110101100010010111001110111001111011011100011110000010010101010000000000 + rc: 14 + +Sample No.: 21 + octet aligned: a078ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc + 101000000111100011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111100 + bw-efficient: + (no data) + rc: -1 Testing conversion from bw-efficient to octet-aligned: @@ -141,16 +162,16 @@ Sample No.: 0 bw-efficient: f4495c7cda8f80 11110100010010010101110001111100110110101000111110000000 - octet aligned: f0442571f36a3e00 - 1111000001000100001001010111000111110011011010100011111000000000 - rc: 8 + octet aligned: f0442571f36a3c + 11110000010001000010010101110001111100110110101000111100 + rc: 7 Sample No.: 1 bw-efficient: f44aaa6c969780 11110100010010101010101001101100100101101001011110000000 - octet aligned: f0442aa9b25a5e00 - 1111000001000100001010101010100110110010010110100101111000000000 - rc: 8 + octet aligned: f0442aa9b25a5c + 11110000010001000010101010101001101100100101101001011100 + rc: 7 Sample No.: 2 bw-efficient: f3d09c20e32da600c025a72e0a9b360386e40f87e19282094adc1a11e397d1d4 @@ -183,31 +204,34 @@ Sample No.: 6 bw-efficient: a7bfc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03f 1010011110111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111 - octet aligned: a078ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc - 101000000111100011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111100 - rc: 33 + octet aligned: + (no data) + rc: -1 Testing conversion from octet-aligned to bw-efficient and inverse: -Sample No.: 0... -Sample No.: 1... -Sample No.: 2... -Sample No.: 3... -Sample No.: 4... -Sample No.: 5... -Sample No.: 6... -Sample No.: 7... -Sample No.: 8... -Sample No.: 9... -Sample No.: 10... -Sample No.: 11... -Sample No.: 12... -Sample No.: 13... -Sample No.: 14... -Sample No.: 15... -Sample No.: 16... -Sample No.: 17... -Sample No.: 18... +Sample No.: 0... AMR mode: 7, OA: 33 bytes, BE: 32 bytes, OA: 33 bytes +Sample No.: 1... AMR mode: 7, OA: 33 bytes, BE: 32 bytes, OA: 33 bytes +Sample No.: 2... AMR mode: 7, OA: 33 bytes, BE: 32 bytes, OA: 33 bytes +Sample No.: 3... AMR mode: 6, OA: 28 bytes, BE: 27 bytes, OA: 28 bytes +Sample No.: 4... AMR mode: 6, OA: 28 bytes, BE: 27 bytes, OA: 28 bytes +Sample No.: 5... AMR mode: 6, OA: 28 bytes, BE: 27 bytes, OA: 28 bytes +Sample No.: 6... AMR mode: 5, OA: 22 bytes, BE: 22 bytes, OA: 22 bytes +Sample No.: 7... AMR mode: 5, OA: 22 bytes, BE: 22 bytes, OA: 22 bytes +Sample No.: 8... AMR mode: 5, OA: 22 bytes, BE: 22 bytes, OA: 22 bytes +Sample No.: 9... AMR mode: 4, OA: 21 bytes, BE: 20 bytes, OA: 21 bytes +Sample No.: 10... AMR mode: 4, OA: 21 bytes, BE: 20 bytes, OA: 21 bytes +Sample No.: 11... AMR mode: 4, OA: 21 bytes, BE: 20 bytes, OA: 21 bytes +Sample No.: 12... AMR mode: 2, OA: 17 bytes, BE: 16 bytes, OA: 17 bytes +Sample No.: 13... AMR mode: 2, OA: 17 bytes, BE: 16 bytes, OA: 17 bytes +Sample No.: 14... AMR mode: 2, OA: 17 bytes, BE: 16 bytes, OA: 17 bytes +Sample No.: 15... AMR mode: 1, OA: 15 bytes, BE: 15 bytes, OA: 15 bytes +Sample No.: 16... AMR mode: 1, OA: 15 bytes, BE: 15 bytes, OA: 15 bytes +Sample No.: 17... AMR mode: 1, OA: 15 bytes, BE: 15 bytes, OA: 15 bytes +Sample No.: 18... AMR mode: 0, OA: 14 bytes, BE: 14 bytes, OA: 14 bytes +Sample No.: 19... AMR mode: 0, OA: 14 bytes, BE: 14 bytes, OA: 14 bytes +Sample No.: 20... AMR mode: 0, OA: 14 bytes, BE: 14 bytes, OA: 14 bytes +Sample No.: 21... skipping a sample with a wrong FT Testing detection of octet-aligned mode payloads: @@ -230,6 +254,9 @@ Sample No.: 16 ==>octet aligned Sample No.: 17 ==>octet aligned Sample No.: 18 ==>octet aligned +Sample No.: 19 ==>octet aligned +Sample No.: 20 ==>octet aligned +Sample No.: 21 ==>bandwith efficient Sample No.: 0 ==>bandwith efficient Sample No.: 1 ==>bandwith efficient Sample No.: 2 ==>bandwith efficient diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libosmo-netif-0.7.0/tests/stream/stream_test.err new/libosmo-netif-1.0.0/tests/stream/stream_test.err --- old/libosmo-netif-0.7.0/tests/stream/stream_test.err 2020-01-02 21:01:22.000000000 +0100 +++ new/libosmo-netif-1.0.0/tests/stream/stream_test.err 2020-08-13 11:21:03.000000000 +0200 @@ -12,8 +12,8 @@ {2.000006} autoreconnecting test step 6 [client OK, server OK], FD reg 1 {2.000007} autoreconnecting test step 5 [client OK, server OK], FD reg 1 -[ CONNECTED] osmo_stream_cli_recv(): connection closed with srv -[ NONE] osmo_stream_cli_reconnect(): retrying in 9 seconds... +[CONNECTED] osmo_stream_cli_recv(): connection closed with srv +[WAIT_RECONNECT] osmo_stream_cli_reconnect(): retrying in 9 seconds... {11.000008} autoreconnecting test step 4 [client OK, server OK], FD reg 0 @@ -37,7 +37,7 @@ {11.000017} non-reconnecting test step 2 [client OK, server OK], FD reg 1 {11.000018} non-reconnecting test step 1 [client OK, server OK], FD reg 1 -[ CONNECTED] osmo_stream_cli_recv(): connection closed with srv -[ NONE] osmo_stream_cli_reconnect(): not reconnecting, disabled. +[CONNECTED] osmo_stream_cli_recv(): connection closed with srv +[CLOSED] osmo_stream_cli_reconnect(): not reconnecting, disabled. {20.000019} non-reconnecting test step 0 [client OK, server OK], FD reg 0 ++++++ osmo-talloc.diff ++++++ --- /var/tmp/diff_new_pack.odTs4a/_old 2020-09-17 14:45:43.463617436 +0200 +++ /var/tmp/diff_new_pack.odTs4a/_new 2020-09-17 14:45:43.463617436 +0200 @@ -1,19 +1,25 @@ -diff --git a/configure.ac b/configure.ac -index 7af10ec..619f4ad 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -98,6 +98,7 @@ AC_SEARCH_LIBS([sctp_send], [sctp], [ - AC_MSG_ERROR([sctp_send not found in searched libs])]) - LIBS=$old_LIBS +--- + configure.ac | 1 + + examples/Makefile.am | 30 +++++++++++++++--------------- + src/Makefile.am | 2 +- + 3 files changed, 17 insertions(+), 16 deletions(-) + +Index: libosmo-netif-1.0.0/configure.ac +=================================================================== +--- libosmo-netif-1.0.0.orig/configure.ac ++++ libosmo-netif-1.0.0/configure.ac +@@ -111,6 +111,7 @@ AS_IF([test "x$ENABLE_LIBSCTP" = "xyes"] + LIBS=$old_LIBS + ]) +PKG_CHECK_MODULES([TALLOC], [talloc]) - AC_CHECK_HEADERS(dahdi/user.h,,AC_MSG_WARN(DAHDI input driver will not be built)) - found_pcap=yes -diff --git a/examples/Makefile.am b/examples/Makefile.am -index 4125243..8780fba 100644 ---- a/examples/Makefile.am -+++ b/examples/Makefile.am + AC_CHECK_HEADERS(pcap.h,,found_pcap=no) + AM_CONDITIONAL(HAVE_PCAP, test "$found_pcap" = yes) +Index: libosmo-netif-1.0.0/examples/Makefile.am +=================================================================== +--- libosmo-netif-1.0.0.orig/examples/Makefile.am ++++ libosmo-netif-1.0.0/examples/Makefile.am @@ -1,5 +1,5 @@ AM_CPPFLAGS = -I$(top_srcdir)/include -AM_CFLAGS=-Wall -g $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(COVERAGE_CFLAGS) @@ -90,10 +96,10 @@ osmux_test_output_LDADD = $(top_builddir)/src/libosmonetif.la \ - $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) + $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(TALLOC_LIBS) -diff --git a/src/Makefile.am b/src/Makefile.am -index 64fd1d4..3da783f 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am +Index: libosmo-netif-1.0.0/src/Makefile.am +=================================================================== +--- libosmo-netif-1.0.0.orig/src/Makefile.am ++++ libosmo-netif-1.0.0/src/Makefile.am @@ -3,7 +3,7 @@ LIBVERSION=9:0:1
