From ddb9bf65f497ac0c4879b5114e887383f47e5686 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 5 Oct 2011 12:28:21 +0200 Subject: add generic datagram socket infrastructure and examples This patch adds new datagram socket infrastructure and it reworks the previous examples (now it's LAPD over datagram). --- examples/Makefile.am | 20 ++-- examples/lapd-over-datagram-network.c | 183 +++++++++++++++++++++++++++++++ examples/lapd-over-datagram-user.c | 184 +++++++++++++++++++++++++++++++ examples/lapd-over-stream-client.c | 187 -------------------------------- examples/lapd-over-stream-server.c | 197 ---------------------------------- 5 files changed, 377 insertions(+), 394 deletions(-) create mode 100644 examples/lapd-over-datagram-network.c create mode 100644 examples/lapd-over-datagram-user.c delete mode 100644 examples/lapd-over-stream-client.c delete mode 100644 examples/lapd-over-stream-server.c (limited to 'examples') diff --git a/examples/Makefile.am b/examples/Makefile.am index 981128b..c1759e2 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -2,15 +2,15 @@ INCLUDES = $(all_includes) -I$(top_srcdir)/include AM_CFLAGS=-Wall -g $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(COVERAGE_CFLAGS) AM_LDFLAGS = $(COVERAGE_LDFLAGS) -noinst_PROGRAMS = lapd-over-stream-client \ - lapd-over-stream-server +noinst_PROGRAMS = lapd-over-datagram-user \ + lapd-over-datagram-network -lapd_over_stream_client_SOURCES = lapd-over-stream-client.c -lapd_over_stream_client_LDADD = $(top_builddir)/src/libosmonetif.la \ - $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) \ - $(LIBOSMOABIS_LIBS) +lapd_over_datagram_user_SOURCES = lapd-over-datagram-user.c +lapd_over_datagram_user_LDADD = $(top_builddir)/src/libosmonetif.la \ + $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) \ + $(LIBOSMOABIS_LIBS) -lapd_over_stream_server_SOURCES = lapd-over-stream-server.c -lapd_over_stream_server_LDADD = $(top_builddir)/src/libosmonetif.la \ - $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) \ - $(LIBOSMOABIS_LIBS) +lapd_over_datagram_network_SOURCES = lapd-over-datagram-network.c +lapd_over_datagram_network_LDADD = $(top_builddir)/src/libosmonetif.la \ + $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) \ + $(LIBOSMOABIS_LIBS) diff --git a/examples/lapd-over-datagram-network.c b/examples/lapd-over-datagram-network.c new file mode 100644 index 0000000..a0c8ac9 --- /dev/null +++ b/examples/lapd-over-datagram-network.c @@ -0,0 +1,183 @@ +/* LAPD over datagram network-mode example. */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +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 datagram_conn *conn; +static struct lapd_instance *lapd; +static int sapi = 63, tei = 0; + +void sighandler(int foo) +{ + lapd_instance_free(lapd); + LOGP(DLINP, LOGL_NOTICE, "closing LAPD.\n"); + exit(EXIT_SUCCESS); +} + +int read_cb(struct datagram_server_conn *conn, struct msgb *msg) +{ + int error; + + LOGP(DLINP, LOGL_NOTICE, "received message from datagram\n"); + + if (lapd_receive(lapd, msg, &error) < 0) { + LOGP(DLINP, LOGL_ERROR, "lapd_receive returned error!\n"); + return -1; + } + return 0; +} + +void lapd_tx_cb(struct msgb *msg, void *cbdata) +{ + struct datagram_conn *conn = cbdata; + + LOGP(DLINP, LOGL_NOTICE, "sending message over datagram\n"); + datagram_conn_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) { + msg->l2h = msg->l3h; + DEBUGP(DLAPDTEST, "RX: %s sapi=%d tei=%d\n", + osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)), + sapi, tei); + 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; + } +} + +static int kbd_cb(struct osmo_fd *fd, unsigned int what) +{ + char buf[1024]; + struct msgb *msg; + uint8_t *ptr; + int ret; + + ret = read(STDIN_FILENO, buf, sizeof(buf)); + + LOGP(DLAPDTEST, LOGL_NOTICE, "read %d byte from keyboard\n", ret); + + msg = msgb_alloc_headroom(1024, 128, "lapd_test"); + if (msg == NULL) { + LOGP(DLINP, LOGL_ERROR, "lapd: cannot allocate message\n"); + return 0; + } + ptr = msgb_put(msg, strlen(buf)); + memcpy(ptr, buf, strlen(buf)); + lapd_transmit(lapd, tei, sapi, msg); + + LOGP(DLAPDTEST, LOGL_NOTICE, "message of %d bytes sent\n", msg->len); + + return 0; +} + +int main(void) +{ + struct osmo_fd *kbd_ofd; + int teip; + + tall_test = talloc_named_const(NULL, 1, "lapd_test"); + + osmo_init_logging(&lapd_test_log_info); + log_set_log_level(osmo_stderr_target, 1); + + /* + * initialize datagram server. + */ + + conn = datagram_conn_create(tall_test); + if (conn == NULL) { + fprintf(stderr, "cannot create client\n"); + exit(EXIT_FAILURE); + } + datagram_conn_set_local_addr(conn, "127.0.0.1"); + datagram_conn_set_local_port(conn, 10001); + datagram_conn_set_remote_addr(conn, "127.0.0.1"); + datagram_conn_set_remote_port(conn, 10000); + datagram_conn_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(DLINP, LOGL_ERROR, "cannot allocate instance\n"); + exit(EXIT_FAILURE); + } + + teip = lapd_tei_alloc(lapd, tei); + if (teip == 0) { + LOGP(DLINP, LOGL_ERROR, "cannot assign TEI\n"); + exit(EXIT_FAILURE); + } + + if (datagram_conn_open(conn) < 0) { + fprintf(stderr, "cannot open client\n"); + exit(EXIT_FAILURE); + } + + kbd_ofd = talloc_zero(tall_test, struct osmo_fd); + if (!kbd_ofd) { + LOGP(DLAPDTEST, LOGL_ERROR, "OOM\n"); + exit(EXIT_FAILURE); + } + kbd_ofd->fd = STDIN_FILENO; + kbd_ofd->when = BSC_FD_READ; + kbd_ofd->data = conn; + kbd_ofd->cb = kbd_cb; + osmo_fd_register(kbd_ofd); + + LOGP(DLINP, LOGL_NOTICE, "Entering main loop\n"); + + while(1) { + osmo_select_main(0); + } +} diff --git a/examples/lapd-over-datagram-user.c b/examples/lapd-over-datagram-user.c new file mode 100644 index 0000000..2e6e02e --- /dev/null +++ b/examples/lapd-over-datagram-user.c @@ -0,0 +1,184 @@ +/* LAPD over datagram user-mode example. */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#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 datagram_conn *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 datagram_server_conn *conn, struct msgb *msg) +{ + int error; + + LOGP(DLINP, LOGL_NOTICE, "received message from datagram\n"); + + if (lapd_receive(lapd, msg, &error) < 0) { + 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_NOTICE, "sending message over datagram\n"); + datagram_conn_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) { + msg->l2h = msg->l3h; + DEBUGP(DLAPDTEST, "RX: %s sapi=%d tei=%d\n", + osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)), + sapi, tei); + 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; + } +} + +static int kbd_cb(struct osmo_fd *fd, unsigned int what) +{ + char buf[1024]; + struct msgb *msg; + uint8_t *ptr; + int ret; + + ret = read(STDIN_FILENO, buf, sizeof(buf)); + + LOGP(DLAPDTEST, LOGL_NOTICE, "read %d byte from keyboard\n", ret); + + msg = msgb_alloc(1024, "LAPD/test"); + if (msg == NULL) { + LOGP(DLINP, LOGL_ERROR, "lapd: cannot allocate message\n"); + return 0; + } + ptr = msgb_put(msg, strlen(buf)); + memcpy(ptr, buf, ret); + + lapd_transmit(lapd, tei, sapi, msg); + + LOGP(DLAPDTEST, LOGL_NOTICE, "message of %d bytes sent\n", msg->len); + + return 0; +} + +int main(void) +{ + struct osmo_fd *kbd_ofd; + + tall_test = talloc_named_const(NULL, 1, "lapd_test"); + + osmo_init_logging(&lapd_test_log_info); + log_set_log_level(osmo_stderr_target, 1); + /* + * initialize LAPD stuff. + */ + + lapd = lapd_instance_alloc(0, lapd_tx_cb, NULL, lapd_rx_cb, NULL, + &lapd_profile_sat); + if (lapd == NULL) { + LOGP(DLINP, LOGL_ERROR, "cannot allocate instance\n"); + exit(EXIT_FAILURE); + } + + /* + * initialize datagram socket. + */ + + conn = datagram_conn_create(tall_test); + if (conn == NULL) { + fprintf(stderr, "cannot create client\n"); + exit(EXIT_FAILURE); + } + datagram_conn_set_local_addr(conn, "127.0.0.1"); + datagram_conn_set_local_port(conn, 10000); + datagram_conn_set_remote_addr(conn, "127.0.0.1"); + datagram_conn_set_remote_port(conn, 10001); + datagram_conn_set_read_cb(conn, read_cb); + + if (datagram_conn_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); + } + + kbd_ofd = talloc_zero(tall_test, struct osmo_fd); + if (!kbd_ofd) { + LOGP(DLAPDTEST, LOGL_ERROR, "OOM\n"); + exit(EXIT_FAILURE); + } + kbd_ofd->fd = STDIN_FILENO; + kbd_ofd->when = BSC_FD_READ; + kbd_ofd->data = conn; + kbd_ofd->cb = kbd_cb; + osmo_fd_register(kbd_ofd); + + LOGP(DLINP, LOGL_NOTICE, "Entering main loop\n"); + + while(1) { + osmo_select_main(0); + } +} diff --git a/examples/lapd-over-stream-client.c b/examples/lapd-over-stream-client.c deleted file mode 100644 index 1525b7c..0000000 --- a/examples/lapd-over-stream-client.c +++ /dev/null @@ -1,187 +0,0 @@ -/* LAPD over stream (user-mode/client) example. */ -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include - -#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 stream_client_conn *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 connect_cb(struct stream_client_conn *conn) -{ - LOGP(DLINP, LOGL_NOTICE, "connected\n"); - if (lapd_sap_start(lapd, tei, sapi) < 0) { - LOGP(DLINP, LOGL_ERROR, "cannot start user-side LAPD\n"); - exit(EXIT_FAILURE); - } - return 0; -} - -static int read_cb(struct stream_client_conn *conn, struct msgb *msg) -{ - int error; - - LOGP(DLINP, LOGL_NOTICE, "received message from stream\n"); - - if (lapd_receive(lapd, msg, &error) < 0) { - 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_NOTICE, "sending message over stream\n"); - stream_client_conn_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) { - msg->l2h = msg->l3h; - DEBUGP(DLAPDTEST, "RX: %s sapi=%d tei=%d\n", - osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)), - sapi, tei); - 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; - } -} - -static int kbd_cb(struct osmo_fd *fd, unsigned int what) -{ - char buf[1024]; - struct msgb *msg; - uint8_t *ptr; - int ret; - - ret = read(STDIN_FILENO, buf, sizeof(buf)); - - LOGP(DLAPDTEST, LOGL_NOTICE, "read %d byte from keyboard\n", ret); - - msg = msgb_alloc(1024, "LAPD/test"); - if (msg == NULL) { - LOGP(DLINP, LOGL_ERROR, "lapd: cannot allocate message\n"); - return 0; - } - ptr = msgb_put(msg, strlen(buf)); - memcpy(ptr, buf, ret); - - lapd_transmit(lapd, tei, sapi, msg); - - LOGP(DLAPDTEST, LOGL_NOTICE, "message of %d bytes sent\n", msg->len); - - return 0; -} - -int main(void) -{ - struct osmo_fd *kbd_ofd; - - tall_test = talloc_named_const(NULL, 1, "lapd_test"); - - osmo_init_logging(&lapd_test_log_info); - log_set_log_level(osmo_stderr_target, 1); - /* - * initialize LAPD stuff. - */ - - lapd = lapd_instance_alloc(0, lapd_tx_cb, NULL, lapd_rx_cb, NULL, - &lapd_profile_sat); - if (lapd == NULL) { - LOGP(DLINP, LOGL_ERROR, "cannot allocate instance\n"); - exit(EXIT_FAILURE); - } - - /* - * initialize stream client. - */ - - conn = stream_client_conn_create(tall_test); - if (conn == NULL) { - fprintf(stderr, "cannot create client\n"); - exit(EXIT_FAILURE); - } - stream_client_conn_set_addr(conn, "127.0.0.1"); - stream_client_conn_set_port(conn, 10000); - stream_client_conn_set_connect_cb(conn, connect_cb); - stream_client_conn_set_read_cb(conn, read_cb); - - if (stream_client_conn_open(conn) < 0) { - fprintf(stderr, "cannot open client\n"); - exit(EXIT_FAILURE); - } - - kbd_ofd = talloc_zero(tall_test, struct osmo_fd); - if (!kbd_ofd) { - LOGP(DLAPDTEST, LOGL_ERROR, "OOM\n"); - exit(EXIT_FAILURE); - } - kbd_ofd->fd = STDIN_FILENO; - kbd_ofd->when = BSC_FD_READ; - kbd_ofd->data = conn; - kbd_ofd->cb = kbd_cb; - osmo_fd_register(kbd_ofd); - - LOGP(DLINP, LOGL_NOTICE, "Entering main loop\n"); - - while(1) { - osmo_select_main(0); - } -} diff --git a/examples/lapd-over-stream-server.c b/examples/lapd-over-stream-server.c deleted file mode 100644 index 8d06f62..0000000 --- a/examples/lapd-over-stream-server.c +++ /dev/null @@ -1,197 +0,0 @@ -/* LAPD over stream (network-mode/server) example. */ -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include - -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 stream_server_link *server; -static struct lapd_instance *lapd; -static int sapi = 63, tei = 0; - -void sighandler(int foo) -{ - lapd_instance_free(lapd); - LOGP(DLINP, LOGL_NOTICE, "closing LAPD.\n"); - exit(EXIT_SUCCESS); -} - -int read_cb(struct stream_server_conn *conn, struct msgb *msg) -{ - int error; - - LOGP(DLINP, LOGL_NOTICE, "received message from stream\n"); - - if (lapd_receive(lapd, msg, &error) < 0) { - LOGP(DLINP, LOGL_ERROR, "lapd_receive returned error!\n"); - return -1; - } - return 0; -} - -void lapd_tx_cb(struct msgb *msg, void *cbdata) -{ - struct stream_server_conn *conn = cbdata; - - LOGP(DLINP, LOGL_NOTICE, "sending message over stream\n"); - stream_server_conn_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) { - msg->l2h = msg->l3h; - DEBUGP(DLAPDTEST, "RX: %s sapi=%d tei=%d\n", - osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)), - sapi, tei); - 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; - } -} - -static int accept_cb(struct stream_server_link *server, int fd) -{ - struct stream_server_conn *conn; - int teip; - - conn = stream_server_conn_create(tall_test, server, fd, read_cb, - NULL, NULL); - if (conn == NULL) { - LOGP(DLINP, LOGL_ERROR, "error in lapd_receive\n"); - return -1; - } - - /* - * initialize LAPD stuff. - */ - - lapd = lapd_instance_alloc(1, lapd_tx_cb, conn, lapd_rx_cb, conn, - &lapd_profile_sat); - if (lapd == NULL) { - LOGP(DLINP, LOGL_ERROR, "cannot allocate instance\n"); - exit(EXIT_FAILURE); - } - - teip = lapd_tei_alloc(lapd, tei); - if (teip == 0) { - LOGP(DLINP, LOGL_ERROR, "cannot assign TEI\n"); - exit(EXIT_FAILURE); - } - return 0; -} - -static int kbd_cb(struct osmo_fd *fd, unsigned int what) -{ - char buf[1024]; - struct msgb *msg; - uint8_t *ptr; - int ret; - - ret = read(STDIN_FILENO, buf, sizeof(buf)); - - LOGP(DLAPDTEST, LOGL_NOTICE, "read %d byte from keyboard\n", ret); - - msg = msgb_alloc_headroom(1024, 128, "lapd_test"); - if (msg == NULL) { - LOGP(DLINP, LOGL_ERROR, "lapd: cannot allocate message\n"); - return 0; - } - ptr = msgb_put(msg, strlen(buf)); - memcpy(ptr, buf, strlen(buf)); - lapd_transmit(lapd, tei, sapi, msg); - - LOGP(DLAPDTEST, LOGL_NOTICE, "message of %d bytes sent\n", msg->len); - - return 0; -} - -int main(void) -{ - struct osmo_fd *kbd_ofd; - - tall_test = talloc_named_const(NULL, 1, "lapd_test"); - - osmo_init_logging(&lapd_test_log_info); - log_set_log_level(osmo_stderr_target, 1); - - /* - * initialize stream server. - */ - - server = stream_server_link_create(tall_test); - if (server == NULL) { - fprintf(stderr, "cannot create client\n"); - exit(EXIT_FAILURE); - } - stream_server_link_set_addr(server, "127.0.0.1"); - stream_server_link_set_port(server, 10000); - stream_server_link_set_accept_cb(server, accept_cb); - - if (stream_server_link_open(server) < 0) { - fprintf(stderr, "cannot open client\n"); - exit(EXIT_FAILURE); - } - - kbd_ofd = talloc_zero(tall_test, struct osmo_fd); - if (!kbd_ofd) { - LOGP(DLAPDTEST, LOGL_ERROR, "OOM\n"); - exit(EXIT_FAILURE); - } - kbd_ofd->fd = STDIN_FILENO; - kbd_ofd->when = BSC_FD_READ; - kbd_ofd->data = server; - kbd_ofd->cb = kbd_cb; - osmo_fd_register(kbd_ofd); - - LOGP(DLINP, LOGL_NOTICE, "Entering main loop\n"); - - while(1) { - osmo_select_main(0); - } -} -- cgit v1.2.3