diff libutil/open_ts.c @ 1:570252e22630

libutil: timeslot opening function
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 23 Jun 2024 07:28:51 +0000
parents
children
line wrap: on
line diff
--- /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;
+}