FreeCalypso > hg > ice1-trau-tester
changeset 1:570252e22630
libutil: timeslot opening function
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 23 Jun 2024 07:28:51 +0000 |
parents | 76b593a6265c |
children | c03ec046471f |
files | libutil/Makefile libutil/open_ts.c libutil/open_ts.h |
diffstat | 3 files changed, 78 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/Makefile Sun Jun 23 07:28:51 2024 +0000 @@ -0,0 +1,15 @@ +OBJS= open_ts.o +LIB= libutil.a + +include ../config.defs + +CPPFLAGS=${OSMO_INCLUDE} + +all: ${LIB} + +${LIB}: ${OBJS} + ar rcu $@ ${OBJS} + ranlib $@ + +clean: + rm -f *.[oa] errs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libutil/open_ts.c Sun Jun 23 07:28:51 2024 +0000 @@ -0,0 +1,60 @@ +/* + * The function in this common module is responsible for parsing the + * user-supplied E1 timeslot specification and then opening that ts + * in osmo-e1d. + * + * This code is based on osmo-e1d-pipe, + * (C) 2020-2022 by Harald Welte <laforge@osmocom.org>, + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <ctype.h> +#include <stdint.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> + +#include <osmocom/e1d/proto_clnt.h> + +#include "open_ts.h" + +static int parse_component(const char *str, const char **outp, uint8_t *var) +{ + if (!isdigit(*str)) + return -1; + *var = atoi(str); + while (isdigit(*str)) + str++; + *outp = str; + return 0; +} + +int open_e1d_ts(struct osmo_e1dp_client *e1_client, const char *ts_spec) +{ + uint8_t intf_nr, line_nr, ts_nr; + const char *cp; + int fd; + + if (parse_component(ts_spec, &cp, &intf_nr) < 0) { +inv_syntax: fprintf(stderr, "error: invalid timeslot spec \"%s\"\n", + ts_spec); + exit(1); + } + if (*cp++ != ':') + goto inv_syntax; + if (parse_component(cp, &cp, &line_nr) < 0) + goto inv_syntax; + if (*cp++ != ':') + goto inv_syntax; + if (parse_component(cp, &cp, &ts_nr) < 0) + goto inv_syntax; + if (*cp) + goto inv_syntax; + fd = osmo_e1dp_client_ts_open(e1_client, intf_nr, line_nr, ts_nr, + E1DP_TSMODE_RAW, 160); + if (fd < 0) { + fprintf(stderr, "error: failed to open E1 ts %s\n", ts_spec); + exit(1); + } + return fd; +}