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/logging.h>
|
||||
#include <osmocom/core/fsm.h>
|
||||
#include <osmocom/core/signal.h>
|
||||
|
||||
#include <osmocom/vty/vty.h>
|
||||
|
||||
|
@ -75,6 +76,66 @@ static const struct value_string fsm_e1d_client_evt_names[] = {
|
|||
{ 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)
|
||||
{
|
||||
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);
|
||||
return;
|
||||
}
|
||||
osmo_e1dp_client_event_register(g_e1d, e1d_client_event_cb);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 = {
|
||||
.name = "e1d",
|
||||
.want_write = e1d_want_write,
|
||||
.set_sa_bits = set_sa_bits,
|
||||
.line_update = e1d_line_update,
|
||||
.line_create = e1d_line_create,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue