view libutil/open_ts.c @ 37:26c9535df39e

rm abis subdir: moved to e1-fake-trau repository The present code repository is meant to contain code for talking to a TRAU DUT, hence the name ice1-trau-tester. The different and separate function of talking to an E1 BTS (Abis instead of Ater, and in the opposite role) was never in scope for this project, but that code got added here in a haste when the InSite BTS arrived while the TRAU bring-up was still blocked. Now that we have our Nokia TCSM2 system working and are doing TRAU experiments, let's keep the code clean.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 29 Aug 2024 19:02:02 +0000
parents 570252e22630
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;
}