view ater/main.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 1e375472d5a5
children
line wrap: on
line source

/*
 * This C module is the main for itt-ater-16, a program in the icE1 TRAU tester
 * suite that operates on a single E1 timeslot on the Ater interface.
 *
 * This code is based on osmo-e1d-pipe,
 * (C) 2020-2022 by Harald Welte <laforge@osmocom.org>,
 * SPDX-License-Identifier: GPL-2.0+
 */

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <osmocom/core/talloc.h>
#include <osmocom/core/select.h>
#include <osmocom/core/application.h>
#include <osmocom/e1d/proto_clnt.h>
#include <osmocom/isdn/i460_mux.h>

#include "../libutil/open_ts.h"
#include "../libutil/stdin_handler.h"
#include "globals.h"
#include "submux.h"

void *g_ctx;
struct osmo_e1dp_client *g_client;
int ts_fd;
struct osmo_i460_timeslot i460_ts;
struct ater_subslot subslots[ATER_SUBSLOTS];

static const char *e1d_socket_path = E1DP_DEFAULT_SOCKET;
static const char *timeslot_spec;
static struct osmo_fd ts_ofd, stdin_ofd;

static void process_cmdline(int argc, char **argv)
{
	extern int optind;
	extern char *optarg;
	int c;

	while ((c = getopt(argc, argv, "p:")) != EOF) {
		switch (c) {
		case 'p':
			e1d_socket_path = optarg;
			continue;
		default:
		usage:
			fprintf(stderr, "usage: %s [-p socket] intf:line:ts\n",
				argv[0]);
			exit(1);
		}
	}
	if (argc != optind + 1)
		goto usage;
	timeslot_spec = argv[optind];
}

static void register_subslots(void)
{
	int nr;
	struct osmo_i460_schan_desc chd;

	memset(&chd, 0, sizeof chd);
	chd.rate = OSMO_I460_RATE_16k;
	chd.demux.num_bits = 320;
	chd.demux.out_cb_bits = i460_rx_func;

	for (nr = 0; nr < ATER_SUBSLOTS; nr++) {
		subslots[nr].nr = nr;
		chd.demux.user_data = subslots + nr;
		chd.mux.user_data = subslots + nr;
		subslots[nr].schan =
				osmo_i460_subchan_add(g_ctx, &i460_ts, &chd);
		OSMO_ASSERT(subslots[nr].schan);
		chd.bit_offset += 2;
	}
}

int main(int argc, char **argv)
{
	process_cmdline(argc, argv);
	g_ctx = talloc_named_const(NULL, 0, "g_ctx");
	OSMO_ASSERT(g_ctx);
	osmo_init_logging2(g_ctx, NULL);

	g_client = osmo_e1dp_client_create(g_ctx, e1d_socket_path);
	if (!g_client) {
		fprintf(stderr, "error: cannot connect to osmo-e1d at %s\n",
			e1d_socket_path);
		exit(1);
	}
	ts_fd = open_e1d_ts(g_client, timeslot_spec);

	osmo_i460_ts_init(&i460_ts);
	register_subslots();

	osmo_fd_setup(&ts_ofd, ts_fd, OSMO_FD_READ, ts_fd_cb, NULL, 0);
	OSMO_ASSERT(osmo_fd_register(&ts_ofd) == 0);

	osmo_fd_setup(&stdin_ofd, 0, OSMO_FD_READ, stdin_select_cb,
			handle_user_cmd, 0);
	OSMO_ASSERT(osmo_fd_register(&stdin_ofd) == 0);

	while (1) {
		osmo_select_main(0);
	}
}