Add support for sending and receiving Sa bits, as well as some line signals
The Sa bits are required for osmo-v5. V5.2 interface must alter and detect Sa7 bit on time slot 0. 'Fastlink' multiplexers do not allow to disable link check with Sa7, so that it must be supported by osmo-v5. Requires: osmo-e1d Change-Id I2608af7bbb8092fddd68d4f3bb36b10a1100ce0f Change-Id: Ie7643693c2daac99f5747591decd60e982b8052a
This commit is contained in:
parent
c4ea374e4a
commit
9410cc5b8c
|
@ -30,6 +30,7 @@
|
||||||
#include <osmocom/core/bits.h>
|
#include <osmocom/core/bits.h>
|
||||||
#include <osmocom/core/logging.h>
|
#include <osmocom/core/logging.h>
|
||||||
#include <osmocom/core/fsm.h>
|
#include <osmocom/core/fsm.h>
|
||||||
|
#include <osmocom/core/signal.h>
|
||||||
|
|
||||||
#include <osmocom/vty/vty.h>
|
#include <osmocom/vty/vty.h>
|
||||||
|
|
||||||
|
@ -75,6 +76,66 @@ static const struct value_string fsm_e1d_client_evt_names[] = {
|
||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct e1inp_line *e1inp_port_find(uint8_t port_nr)
|
||||||
|
{
|
||||||
|
struct e1inp_line *e1i_line;
|
||||||
|
|
||||||
|
/* iterate over global list of e1 lines */
|
||||||
|
llist_for_each_entry(e1i_line, &e1inp_line_list, list) {
|
||||||
|
if (e1i_line->port_nr == port_nr)
|
||||||
|
return e1i_line;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void e1d_client_event_cb(enum osmo_e1dp_msg_type event, uint8_t intf, uint8_t line, uint8_t ts, uint8_t *data, int len)
|
||||||
|
{
|
||||||
|
struct e1inp_line *e1_line;
|
||||||
|
struct input_signal_data isd;
|
||||||
|
int signal;
|
||||||
|
|
||||||
|
memset(&isd, 0, sizeof(isd));
|
||||||
|
|
||||||
|
/* we use higher 4 bits for interface, lower 4 bits for line,
|
||||||
|
* resulting in max. 16 interfaces with 16 lines each */
|
||||||
|
e1_line = e1inp_port_find((intf << 4) | line);
|
||||||
|
if (!e1_line)
|
||||||
|
return;
|
||||||
|
isd.line = e1_line;
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case E1DP_EVT_LOS_ON:
|
||||||
|
signal = S_L_INP_LINE_LOS;
|
||||||
|
break;
|
||||||
|
case E1DP_EVT_LOS_OFF:
|
||||||
|
signal = S_L_INP_LINE_NOLOS;
|
||||||
|
break;
|
||||||
|
case E1DP_EVT_AIS_ON:
|
||||||
|
signal = S_L_INP_LINE_AIS;
|
||||||
|
break;
|
||||||
|
case E1DP_EVT_AIS_OFF:
|
||||||
|
signal = S_L_INP_LINE_NOAIS;
|
||||||
|
break;
|
||||||
|
case E1DP_EVT_RAI_ON:
|
||||||
|
signal = S_L_INP_LINE_RAI;
|
||||||
|
break;
|
||||||
|
case E1DP_EVT_RAI_OFF:
|
||||||
|
signal = S_L_INP_LINE_NORAI;
|
||||||
|
break;
|
||||||
|
case E1DP_EVT_SABITS:
|
||||||
|
signal = S_L_INP_LINE_SA_BITS;
|
||||||
|
if (len < 1)
|
||||||
|
return;
|
||||||
|
isd.sa_bits = *data;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Ignore all other events. */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
osmo_signal_dispatch(SS_L_INPUT, signal, &isd);
|
||||||
|
}
|
||||||
|
|
||||||
static int fsm_e1_client_timer_cb(struct osmo_fsm_inst *fi)
|
static int fsm_e1_client_timer_cb(struct osmo_fsm_inst *fi)
|
||||||
{
|
{
|
||||||
osmo_fsm_inst_dispatch(g_e1d_fsm_inst, EV_CONNECT, NULL);
|
osmo_fsm_inst_dispatch(g_e1d_fsm_inst, EV_CONNECT, NULL);
|
||||||
|
@ -92,6 +153,7 @@ static void fsm_e1d_client_disconnected_cb(struct osmo_fsm_inst *fi, uint32_t ev
|
||||||
osmo_fsm_inst_state_chg(g_e1d_fsm_inst, ST_DISCONNECTED, 1, 0);
|
osmo_fsm_inst_state_chg(g_e1d_fsm_inst, ST_DISCONNECTED, 1, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
osmo_e1dp_client_event_register(g_e1d, e1d_client_event_cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGPFSML(fi, LOGL_NOTICE, "Successfully (re)connected to osmo-e1d daemon!\n");
|
LOGPFSML(fi, LOGL_NOTICE, "Successfully (re)connected to osmo-e1d daemon!\n");
|
||||||
|
@ -766,9 +828,20 @@ static int e1d_line_create(struct e1inp_line *line)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int set_sa_bits(struct e1inp_line *line, uint8_t sa_bits)
|
||||||
|
{
|
||||||
|
/* we use higher 4 bits for interface, lower 4 bits for line,
|
||||||
|
* resulting in max. 16 interfaces with 16 lines each */
|
||||||
|
uint8_t e1d_intf = (line->port_nr >> 4) & 0xF;
|
||||||
|
uint8_t e1d_line = line->port_nr & 0xF;
|
||||||
|
|
||||||
|
return osmo_e1dp_client_set_sa_bits(g_e1d, e1d_intf, e1d_line, sa_bits);
|
||||||
|
}
|
||||||
|
|
||||||
struct e1inp_driver e1d_driver = {
|
struct e1inp_driver e1d_driver = {
|
||||||
.name = "e1d",
|
.name = "e1d",
|
||||||
.want_write = e1d_want_write,
|
.want_write = e1d_want_write,
|
||||||
|
.set_sa_bits = set_sa_bits,
|
||||||
.line_update = e1d_line_update,
|
.line_update = e1d_line_update,
|
||||||
.line_create = e1d_line_create,
|
.line_create = e1d_line_create,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue