pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-abis/+/38842?usp=email )
Change subject: libosmo-abis depends on libosmo-netif ......................................................................
libosmo-abis depends on libosmo-netif
Move the lapd-over-datagram-*.c examples from libosmo-netif to libosmo-abis, since those examples requrie code provided by libosmo-abis.
libosmo-abis will be soon making use of libosmo-netif APIs such as those available in stream.h
Depends: libosmo-netif.git Change-Id I13d6e88158f6d9ce017986283183ee9c2cc68cae Change-Id: I079dc3999de508301dd37ed03e399356a58d3cab --- M Makefile.am M TODO-RELEASE M configure.ac M contrib/jenkins.sh A doc/Makefile.am A doc/examples/Makefile.am A doc/examples/lapd-over-datagram/lapd-over-datagram-network.c A doc/examples/lapd-over-datagram/lapd-over-datagram-user.c 8 files changed, 456 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/42/38842/1
diff --git a/Makefile.am b/Makefile.am index 5cab5d5..790d055 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,12 @@ ACLOCAL_AMFLAGS = -I m4
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -SUBDIRS = include src tests +SUBDIRS = \ + include \ + src \ + tests \ + doc \ + $(NULL)
pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libosmoabis.pc libosmotrau.pc diff --git a/TODO-RELEASE b/TODO-RELEASE index 6160b28..06f605a 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -8,3 +8,4 @@ # If any interfaces have been removed or changed since the last public release: c:r:0. #library what description / commit summary line libosmotrau struct osmo_trau2rtp_state extended (ABI break) +libosmo-netif >1.5.0 New dependency diff --git a/configure.ac b/configure.ac index d6b5e63..ae570f2 100644 --- a/configure.ac +++ b/configure.ac @@ -71,6 +71,8 @@ PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.10.0) PKG_CHECK_MODULES(LIBOSMOCODEC, libosmocodec >= 1.10.0)
+PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 1.5.0) + AC_ARG_ENABLE([ortp], [AS_HELP_STRING([--disable-ortp], [Build without ortp support])], [ ENABLE_ORTP=$enableval @@ -198,6 +200,8 @@ AC_OUTPUT( libosmoabis.pc libosmotrau.pc + doc/Makefile + doc/examples/Makefile include/Makefile src/Makefile tests/Makefile diff --git a/contrib/jenkins.sh b/contrib/jenkins.sh index b902cc6..91f0c5f 100755 --- a/contrib/jenkins.sh +++ b/contrib/jenkins.sh @@ -20,6 +20,7 @@ verify_value_string_arrays_are_terminated.py $(find . -name "*.[hc]")
osmo-build-dep.sh libosmocore "" --disable-doxygen +osmo-build-dep.sh libosmo-netif "" --disable-doxygen
export PKG_CONFIG_PATH="$inst/lib/pkgconfig:$PKG_CONFIG_PATH" export LD_LIBRARY_PATH="$inst/lib" diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..f36084c --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = \ + examples \ + $(NULL) + diff --git a/doc/examples/Makefile.am b/doc/examples/Makefile.am new file mode 100644 index 0000000..b1296fa --- /dev/null +++ b/doc/examples/Makefile.am @@ -0,0 +1,24 @@ +AM_CPPFLAGS = -I$(top_srcdir)/include +AM_CFLAGS=-Wall -g $(LIBOSMONETIF_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOCORE_CFLAGS) $(COVERAGE_CFLAGS) +AM_LDFLAGS = $(COVERAGE_LDFLAGS) + +noinst_PROGRAMS = \ + lapd-over-datagram-user \ + lapd-over-datagram-network \ + $(NULL) + +lapd_over_datagram_user_SOURCES = lapd-over-datagram/lapd-over-datagram-user.c +lapd_over_datagram_user_LDADD = \ + $(top_builddir)/src/libosmoabis.la \ + $(LIBOSMONETIF_LIBS) \ + $(LIBOSMOCORE_LIBS) \ + $(LIBOSMOGSM_LIBS) \ + $(NULL) + +lapd_over_datagram_network_SOURCES = lapd-over-datagram/lapd-over-datagram-network.c +lapd_over_datagram_network_LDADD = \ + $(top_builddir)/src/libosmoabis.la \ + $(LIBOSMONETIF_LIBS) \ + $(LIBOSMOCORE_LIBS) \ + $(LIBOSMOGSM_LIBS) \ + $(NULL) \ No newline at end of file diff --git a/doc/examples/lapd-over-datagram/lapd-over-datagram-network.c b/doc/examples/lapd-over-datagram/lapd-over-datagram-network.c new file mode 100644 index 0000000..8915e81 --- /dev/null +++ b/doc/examples/lapd-over-datagram/lapd-over-datagram-network.c @@ -0,0 +1,176 @@ +/* LAPD over datagram network-mode example. */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <osmocom/core/talloc.h> +#include <osmocom/core/msgb.h> +#include <osmocom/core/logging.h> +#include <osmocom/core/application.h> +#include <osmocom/core/select.h> + +#include <osmocom/abis/lapd.h> + +#include <osmocom/netif/datagram.h> + +static void *tall_test; + +#define DLAPDTEST 0 + +struct log_info_cat lapd_test_cat[] = { + [DLAPDTEST] = { + .name = "DLAPDTEST", + .description = "LAPD-mode test", + .color = "\033[1;35m", + .enabled = 1, .loglevel = LOGL_DEBUG, + }, +}; + +const struct log_info lapd_test_log_info = { + .filter_fn = NULL, + .cat = lapd_test_cat, + .num_cat = ARRAY_SIZE(lapd_test_cat), +}; + +static struct osmo_dgram *conn; +static struct lapd_instance *lapd; +static int tei = 0; + +void sighandler(int foo) +{ + lapd_instance_free(lapd); + LOGP(DLAPDTEST, LOGL_NOTICE, "closing LAPD.\n"); + exit(EXIT_SUCCESS); +} + +int read_cb(struct osmo_dgram *conn) +{ + int error; + struct msgb *msg; + + LOGP(DLAPDTEST, LOGL_DEBUG, "received message from datagram\n"); + + msg = msgb_alloc(1200, "LAPD/test"); + if (msg == NULL) { + LOGP(DLAPDTEST, LOGL_ERROR, "cannot allocate message\n"); + return -1; + } + if (osmo_dgram_recv(conn, msg) < 0) { + LOGP(DLAPDTEST, LOGL_ERROR, "cannot receive message\n"); + return -1; + } + if (lapd_receive(lapd, msg, &error) < 0) { + LOGP(DLAPDTEST, LOGL_ERROR, "lapd_receive returned error!\n"); + return -1; + } + + return 0; +} + +void lapd_tx_cb(struct msgb *msg, void *cbdata) +{ + struct osmo_dgram *conn = cbdata; + + LOGP(DLAPDTEST, LOGL_DEBUG, "sending message over datagram\n"); + osmo_dgram_send(conn, msg); +} + +void lapd_rx_cb(struct osmo_dlsap_prim *dp, uint8_t tei, uint8_t sapi, + void *rx_cbdata) +{ + struct msgb *msg = dp->oph.msg; + + switch (dp->oph.primitive) { + case PRIM_DL_EST: + DEBUGP(DLAPDTEST, "DL_EST: sapi(%d) tei(%d)\n", sapi, tei); + break; + case PRIM_DL_REL: + DEBUGP(DLAPDTEST, "DL_REL: sapi(%d) tei(%d)\n", sapi, tei); + break; + case PRIM_DL_DATA: + case PRIM_DL_UNIT_DATA: + if (dp->oph.operation == PRIM_OP_INDICATION) { + struct msgb *nmsg; + char *ptr; + int x; + + msg->l2h = msg->l3h; + + DEBUGP(DLAPDTEST, "RX: %s sapi=%d tei=%d\n", + osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)), + sapi, tei); + + LOGP(DLAPDTEST, LOGL_DEBUG, "forwarding message\n"); + + nmsg = msgb_alloc(1024, "LAPD/test"); + if (nmsg == NULL) { + LOGP(DLAPDTEST, LOGL_ERROR, "cannot alloc msg\n"); + return; + } + ptr = (char *)msgb_put(nmsg, sizeof(int)); + + x = *((int *)msg->data); + memcpy(ptr, &x, sizeof(int)); + + /* send the message back to client over LAPD */ + lapd_transmit(lapd, tei, sapi, msg); + return; + } + break; + case PRIM_MDL_ERROR: + DEBUGP(DLMI, "MDL_EERROR: cause(%d)\n", dp->u.error_ind.cause); + break; + default: + printf("ERROR: unknown prim\n"); + break; + } +} + +int main(int argc, char *argv[]) +{ + struct lapd_tei *teip; + + tall_test = talloc_named_const(NULL, 1, "lapd_test"); + msgb_talloc_ctx_init(tall_test, 0); + osmo_init_logging2(tall_test, &lapd_test_log_info); + log_set_log_level(osmo_stderr_target, LOGL_NOTICE); + + /* + * initialize datagram server. + */ + + conn = osmo_dgram_create(tall_test); + if (conn == NULL) { + fprintf(stderr, "cannot create client\n"); + exit(EXIT_FAILURE); + } + osmo_dgram_set_local_addr(conn, "127.0.0.1"); + osmo_dgram_set_local_port(conn, 10001); + osmo_dgram_set_remote_addr(conn, "127.0.0.1"); + osmo_dgram_set_remote_port(conn, 10000); + osmo_dgram_set_read_cb(conn, read_cb); + + lapd = lapd_instance_alloc(1, lapd_tx_cb, conn, lapd_rx_cb, conn, + &lapd_profile_sat); + if (lapd == NULL) { + LOGP(DLAPDTEST, LOGL_ERROR, "cannot allocate instance\n"); + exit(EXIT_FAILURE); + } + + teip = lapd_tei_alloc(lapd, tei); + if (teip == NULL) { + LOGP(DLAPDTEST, LOGL_ERROR, "cannot assign TEI\n"); + exit(EXIT_FAILURE); + } + + if (osmo_dgram_open(conn) < 0) { + fprintf(stderr, "cannot open client\n"); + exit(EXIT_FAILURE); + } + + LOGP(DLAPDTEST, LOGL_NOTICE, "Entering main loop\n"); + + while (1) + osmo_select_main(0); +} diff --git a/doc/examples/lapd-over-datagram/lapd-over-datagram-user.c b/doc/examples/lapd-over-datagram/lapd-over-datagram-user.c new file mode 100644 index 0000000..c988b22 --- /dev/null +++ b/doc/examples/lapd-over-datagram/lapd-over-datagram-user.c @@ -0,0 +1,240 @@ +/* LAPD over datagram user-mode example. */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <signal.h> +#include <unistd.h> +#include <arpa/inet.h> + +#include <osmocom/core/linuxlist.h> +#include <osmocom/core/talloc.h> +#include <osmocom/core/msgb.h> +#include <osmocom/core/logging.h> +#include <osmocom/core/application.h> +#include <osmocom/core/select.h> + +#include <osmocom/abis/lapd.h> + +#include <osmocom/netif/datagram.h> + +static LLIST_HEAD(msg_sent_list); + +struct msg_sent { + struct llist_head head; + struct msgb *msg; + int num; + struct timeval tv; +}; + +#define DLAPDTEST 0 + +struct log_info_cat lapd_test_cat[] = { + [DLAPDTEST] = { + .name = "DLAPDTEST", + .description = "LAPD-mode test", + .color = "\033[1;35m", + .enabled = 1, .loglevel = LOGL_DEBUG, + }, +}; + +const struct log_info lapd_test_log_info = { + .filter_fn = NULL, + .cat = lapd_test_cat, + .num_cat = ARRAY_SIZE(lapd_test_cat), +}; + +static struct osmo_dgram *conn; +static struct lapd_instance *lapd; +static int sapi = 63, tei = 0; + +void sighandler(int foo) +{ + lapd_sap_stop(lapd, tei, sapi); + lapd_instance_free(lapd); + LOGP(DLINP, LOGL_NOTICE, "closing LAPD.\n"); + exit(EXIT_SUCCESS); +} + +static int read_cb(struct osmo_dgram *conn) +{ + int error; + struct msgb *msg; + + msg = msgb_alloc(1200, "LAPD/test"); + if (msg == NULL) { + LOGP(DLAPDTEST, LOGL_ERROR, "cannot allocate message\n"); + return -1; + } + if (osmo_dgram_recv(conn, msg) < 0) { + msgb_free(msg); + LOGP(DLAPDTEST, LOGL_ERROR, "cannot receive message\n"); + return -1; + } + if (lapd_receive(lapd, msg, &error) < 0) { + msgb_free(msg); + LOGP(DLINP, LOGL_ERROR, "lapd_receive returned error!\n"); + return -1; + } + return 0; +} + +static void *tall_test; + +void lapd_tx_cb(struct msgb *msg, void *cbdata) +{ + LOGP(DLINP, LOGL_DEBUG, "sending message over datagram\n"); + osmo_dgram_send(conn, msg); +} + +void lapd_rx_cb(struct osmo_dlsap_prim *dp, uint8_t tei, uint8_t sapi, + void *rx_cbdata) +{ + struct msgb *msg = dp->oph.msg; + int *__msgs = rx_cbdata; + int num_msgs = *__msgs; + + switch (dp->oph.primitive) { + case PRIM_DL_EST: + DEBUGP(DLAPDTEST, "DL_EST: sapi(%d) tei(%d)\n", sapi, tei); + + int i; + for (i = 0; i < num_msgs; i++) { + struct msgb *msg; + struct msg_sent *msg_sent; + char *ptr; + int x; + + msg = msgb_alloc(1024, "LAPD/test"); + if (msg == NULL) { + LOGP(DLINP, LOGL_ERROR, "cannot alloc msg\n"); + return; + } + ptr = (char *)msgb_put(msg, sizeof(int)); + + x = htonl(i); + memcpy(ptr, &x, sizeof(int)); + + msg_sent = talloc_zero(NULL, struct msg_sent); + if (msg_sent == NULL) { + LOGP(DLINP, LOGL_ERROR, "can't alloc struct\n"); + return; + } + msg_sent->msg = msg; + gettimeofday(&msg_sent->tv, NULL); + msg_sent->num = i; + llist_add(&msg_sent->head, &msg_sent_list); + + lapd_transmit(lapd, tei, sapi, msg); + + LOGP(DLAPDTEST, LOGL_DEBUG, "enqueueing msg %d of " + "%d bytes to be sent over LAPD\n", i, msg->len); + } + break; + case PRIM_DL_REL: + DEBUGP(DLAPDTEST, "DL_REL: sapi(%d) tei(%d)\n", sapi, tei); + break; + case PRIM_DL_DATA: + case PRIM_DL_UNIT_DATA: + if (dp->oph.operation == PRIM_OP_INDICATION) { + msg->l2h = msg->l3h; + DEBUGP(DLAPDTEST, "RX: %s sapi=%d tei=%d\n", + osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)), + sapi, tei); + + int num; + struct msg_sent *cur, *tmp, *found = NULL; + + num = ntohl(*((int *)msg->data)); + LOGP(DLINP, LOGL_DEBUG, + "received msg number %d\n", num); + + llist_for_each_entry_safe(cur, tmp, + &msg_sent_list, head) { + if (cur->num == num) { + llist_del(&cur->head); + found = cur; + break; + } + } + if (found) { + struct timeval tv, diff; + + gettimeofday(&tv, NULL); + timersub(&tv, &found->tv, &diff); + + LOGP(DLINP, LOGL_NOTICE, "message %d replied " + "in %lu.%.6lu\n", + num, diff.tv_sec, diff.tv_usec); + talloc_free(found); + } else { + LOGP(DLINP, LOGL_ERROR, + "message %d not found!\n", num); + } + } + break; + case PRIM_MDL_ERROR: + DEBUGP(DLMI, "MDL_EERROR: cause(%d)\n", dp->u.error_ind.cause); + break; + default: + printf("ERROR: unknown prim\n"); + break; + } +} + +int main(int argc, char *argv[]) +{ + int num_msgs; + + signal(SIGINT, sighandler); + + if (argc != 2) { + printf("Usage: %s [num_msgs]\n", argv[0]); + exit(EXIT_FAILURE); + } + num_msgs = atoi(argv[1]); + + tall_test = talloc_named_const(NULL, 1, "lapd_test"); + msgb_talloc_ctx_init(tall_test, 0); + osmo_init_logging2(tall_test, &lapd_test_log_info); + log_set_log_level(osmo_stderr_target, LOGL_NOTICE); + /* + * initialize LAPD stuff. + */ + + lapd = lapd_instance_alloc(0, lapd_tx_cb, NULL, lapd_rx_cb, &num_msgs, + &lapd_profile_sat); + if (lapd == NULL) { + LOGP(DLINP, LOGL_ERROR, "cannot allocate instance\n"); + exit(EXIT_FAILURE); + } + + /* + * initialize datagram socket. + */ + + conn = osmo_dgram_create(tall_test); + if (conn == NULL) { + fprintf(stderr, "cannot create client\n"); + exit(EXIT_FAILURE); + } + osmo_dgram_set_local_addr(conn, "127.0.0.1"); + osmo_dgram_set_local_port(conn, 10000); + osmo_dgram_set_remote_addr(conn, "127.0.0.1"); + osmo_dgram_set_remote_port(conn, 10001); + osmo_dgram_set_read_cb(conn, read_cb); + + if (osmo_dgram_open(conn) < 0) { + fprintf(stderr, "cannot open client\n"); + exit(EXIT_FAILURE); + } + + if (lapd_sap_start(lapd, tei, sapi) < 0) { + LOGP(DLINP, LOGL_ERROR, "cannot start user-side LAPD\n"); + exit(EXIT_FAILURE); + } + + LOGP(DLINP, LOGL_NOTICE, "Entering main loop\n"); + + while (1) + osmo_select_main(0); +}