e1-prbs-test: Add support for osmo-e1d

This allows e1-prbs-test to not only use DAHDI devices, but also
osmo-e1d supported devices

Change-Id: I0e88f2b056db931b0e442567efa9a8d270abb9f2
This commit is contained in:
Harald Welte 2020-08-31 22:21:40 +02:00
parent d5ea3eb9c1
commit ead2e020f0
2 changed files with 68 additions and 14 deletions

View File

@ -1,5 +1,5 @@
LIBOSMO_CFLAGS:=$(shell pkg-config --cflags libosmocore)
LIBOSMO_LIBS:=$(shell pkg-config --libs libosmocore)
LIBOSMO_CFLAGS:=$(shell pkg-config --cflags libosmocore libosmo-e1d)
LIBOSMO_LIBS:=$(shell pkg-config --libs libosmocore libosmo-e1d)
CFLAGS=-O2 -g -Wall -Werror $(LIBOSMO_CFLAGS)
LIBS=$(LIBOSMO_LIBS)

View File

@ -40,6 +40,8 @@
#include <osmocom/core/bits.h>
#include <osmocom/core/prbs.h>
#include <osmocom/e1d/proto_clnt.h>
#include "internal.h"
static struct test_state g_tst;
@ -69,12 +71,69 @@ static int e1_fd_cb(struct osmo_fd *ofd, unsigned int what)
return 0;
}
static int open_slots(struct test_state *tst, const char *basedir)
static void init_timeslot(struct timeslot_state *ts)
{
DIR *dir = opendir(basedir);
osmo_fd_register(&ts->ofd);
printf("E1TS(%02u) opened\n", ts->ofd.priv_nr);
ts_init_prbs_tx(ts, g_prbs_offs_tx);
ts_init_prbs_rx(ts, g_prbs_offs_rx);
/* start to put something into the transmit queue, before we get read-triggered
* later on */
process_tx(ts, 1024);
}
static int open_slots_e1d(struct test_state *tst, int intf_nr, int line_nr)
{
struct osmo_e1dp_client *clnt = osmo_e1dp_client_create(NULL, E1DP_DEFAULT_SOCKET);
int i, rc, num_slots = 0;
if (!clnt) {
fprintf(stderr, "Unable to connect to osmo-e1d\n");
return -1;
}
for (i = 1; i < 32; i++) {
struct timeslot_state *ts;
rc = osmo_e1dp_client_ts_open(clnt, intf_nr, line_nr, i, E1DP_TSMODE_RAW, 1024);
if (rc < 0) {
fprintf(stderr, "Error opening %d: %d (%s)\n", i, rc, strerror(errno));
return -1;
}
ts = &tst->ts[tst->next_unused_ts++];
/* open the respective file descriptor */
osmo_fd_setup(&ts->ofd, rc, BSC_FD_READ, e1_fd_cb, ts, i);
init_timeslot(ts);
num_slots++;
}
return num_slots;
}
static int open_slots(struct test_state *tst, char *basedir)
{
DIR *dir;
struct dirent *ent;
int rc, num_slots = 0;
if (!strncmp(basedir, "e1d", 3)) {
int intf = 0, line = 0;
char *intf_str, *line_str;
strtok(basedir, ":");
intf_str = strtok(NULL, ":");
if (intf_str) {
intf = atoi(intf_str);
line_str = strtok(NULL, ":");
if (line_str)
line = atoi(line_str);
}
return open_slots_e1d(tst, intf, line);
}
dir = opendir(basedir);
if (!dir)
return -ENOENT;
@ -99,15 +158,6 @@ static int open_slots(struct test_state *tst, const char *basedir)
/* open the respective file descriptor */
osmo_fd_setup(&ts->ofd, rc, BSC_FD_READ, e1_fd_cb, ts, atoi(ent->d_name));
osmo_fd_register(&ts->ofd);
printf("E1TS(%02u) opened\n", ts->ofd.priv_nr);
ts_init_prbs_tx(ts, g_prbs_offs_tx);
ts_init_prbs_rx(ts, g_prbs_offs_rx);
/* start to put something into the transmit queue, before we get read-triggered
* later on */
process_tx(ts, 1024);
cfg_dahdi_buffer(ts->ofd.fd);
struct dahdi_bufferinfo bi;
@ -115,6 +165,8 @@ static int open_slots(struct test_state *tst, const char *basedir)
OSMO_ASSERT(rc == 0);
printf("tx_pol=%d, rx_pol=%d, num=%d, size=%d, nread=%d, nwrite=%d\n",
bi.txbufpolicy, bi.rxbufpolicy, bi.numbufs, bi.bufsize, bi.readbufs, bi.writebufs);
init_timeslot(ts);
num_slots++;
}
closedir(dir);
@ -191,13 +243,15 @@ int main(int argc, char **argv)
if (argc <= optind) {
fprintf(stderr, "You must specify the base-path of your DAHDI span "
"like /dev/dahdi/chan/001\n");
"like /dev/dahdi/chan/001 or e1d:0:0\n");
exit(1);
}
basedir = argv[optind];
set_realtime(10);
rc = open_slots(&g_tst, basedir);
if (rc < 0)
exit(1);
printf("==> opened a total of %d slots\n", rc);
signal(SIGINT, sig_handler);