view libutil/open_ts.c @ 1:e5527fc2050b

libutil: copy from ice1-trau-tester
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 29 Aug 2024 12:58:56 +0000
parents
children
line wrap: on
line source

/*
 * 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;
}