This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
laforge gerrit-no-reply at lists.osmocom.orglaforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-e1d/+/21808 ) Change subject: Evaluate received E and A bits in TS0 ...................................................................... Evaluate received E and A bits in TS0 Related: OS#4917 Change-Id: I7e1c919518b3418e973b7ae5bedd5a6dd1c2adec --- M src/e1d.h M src/intf_line.c M src/mux_demux.c M src/usb.c M src/vpair.c M src/vty.c 6 files changed, 85 insertions(+), 7 deletions(-) Approvals: Jenkins Builder: Verified tnt: Looks good to me, but someone else must approve laforge: Looks good to me, approved diff --git a/src/e1d.h b/src/e1d.h index 9848df4..7cb5335 100644 --- a/src/e1d.h +++ b/src/e1d.h @@ -27,6 +27,7 @@ #include <osmocom/core/isdnhdlc.h> #include <osmocom/core/linuxlist.h> #include <osmocom/core/rate_ctr.h> +#include <osmocom/core/timer.h> #include <osmocom/vty/command.h> enum e1d_vty_node { @@ -42,6 +43,8 @@ LINE_CTR_CRC_ERR, LINE_CTR_RX_OVFL, LINE_CTR_TX_UNFL, + LINE_CTR_RX_REMOTE_E, + LINE_CTR_RX_REMOTE_A, }; enum e1_ts_mode { @@ -88,6 +91,9 @@ E1_LINE_MODE_SUPERCHANNEL, }; +#define E1L_TS0_RX_CRC4_ERR 0x01 +#define E1L_TS0_RX_ALARM 0x02 + struct e1_line { struct llist_head list; @@ -103,6 +109,17 @@ struct e1_ts ts[32]; /* superchannel */ struct e1_ts superchan; + + struct { + /*! buffer where we aggregate the E bits each multi-frame */ + uint8_t e_bits; + /*! did we receive CRC4 / ALARM error reports this second (timer tick) */ + uint8_t cur_errmask; + /*! did we receive CRC4 / ALARM error reports previous second (timer tick) */ + uint8_t prev_errmask; + /*! timer to re-set the rx_crc4_err and rx_alarm above */ + struct osmo_timer_list timer; + } ts0; }; enum e1_driver { @@ -160,7 +177,7 @@ e1_line_mux_out(struct e1_line *line, uint8_t *buf, int fts); int -e1_line_demux_in(struct e1_line *line, const uint8_t *buf, int size); +e1_line_demux_in(struct e1_line *line, const uint8_t *buf, int size, int frame_base); void e1_ts_stop(struct e1_ts *ts); diff --git a/src/intf_line.c b/src/intf_line.c index ccd7645..5143e45 100644 --- a/src/intf_line.c +++ b/src/intf_line.c @@ -52,6 +52,8 @@ [LINE_CTR_CRC_ERR] = { "rx:crc_errors", "E1 Rx CRC Errors" }, [LINE_CTR_RX_OVFL] = { "rx:overflow", "E1 Rx Overflow" }, [LINE_CTR_TX_UNFL] = { "tx:underflow", "E1 Tx Underflow" }, + [LINE_CTR_RX_REMOTE_E] ={ "rx:remote_crc_errors", "Rx Frames Reporting Remote CRC Error"}, + [LINE_CTR_RX_REMOTE_A] ={ "rx:remote_alarm", "Rx Frames Reporting Remote Alarm"}, }; static const struct rate_ctr_group_desc line_ctrg_desc = { @@ -134,6 +136,28 @@ } static void +_ts0_tmr_cb(void *_line) +{ + struct e1_line *line = (struct e1_line *) _line; + + if ((line->ts0.cur_errmask & E1L_TS0_RX_CRC4_ERR) != + (line->ts0.prev_errmask & E1L_TS0_RX_CRC4_ERR)) { + LOGPLI(line, DE1D, LOGL_NOTICE, "Remote CRC4 Error report %s\n", + line->ts0.cur_errmask & E1L_TS0_RX_CRC4_ERR ? "STARTED" : "CEASED"); + } + + if ((line->ts0.cur_errmask & E1L_TS0_RX_ALARM) != + (line->ts0.prev_errmask & E1L_TS0_RX_ALARM)) { + LOGPLI(line, DE1D, LOGL_NOTICE, "Remote ALARM condition %s\n", + line->ts0.cur_errmask & E1L_TS0_RX_ALARM ? "STARTED" : "CEASED"); + } + + line->ts0.prev_errmask = line->ts0.cur_errmask; + line->ts0.cur_errmask = 0; + osmo_timer_schedule(&line->ts0.timer, 1, 0); +} + +static void _ts_init(struct e1_ts *ts, struct e1_line *line, int id) { ts->line = line; @@ -167,6 +191,9 @@ line->ctrs = rate_ctr_group_alloc(line, &line_ctrg_desc, line->id); OSMO_ASSERT(line->ctrs); + osmo_timer_setup(&line->ts0.timer, _ts0_tmr_cb, line); + osmo_timer_schedule(&line->ts0.timer, 1, 0); + llist_add_tail(&line->list, &intf->lines); LOGPLI(line, DE1D, LOGL_NOTICE, "Created\n"); diff --git a/src/mux_demux.c b/src/mux_demux.c index ed7bf3b..dffc798 100644 --- a/src/mux_demux.c +++ b/src/mux_demux.c @@ -348,13 +348,41 @@ return 0; } +static void +_e1_line_demux_in_ts0(struct e1_line *line, const uint8_t *buf, int ftr, uint8_t frame_base) +{ + int i; + + for (i = 0; i < ftr; i++) { + const uint8_t *frame = buf + i*32; + uint8_t frame_nr = (frame_base + i) & 0xf; + + /* A bit is present in each odd frame */ + if (frame_nr % 2) { + if (frame[0] & 0x20) + line->ts0.cur_errmask |= E1L_TS0_RX_ALARM; + } + + /* E bits are present in frame 13 + 15 */ + if (frame_nr == 13) + line->ts0.e_bits = frame[0] & 0x80 ? 2 : 0; + if (frame_nr == 15) { + line->ts0.e_bits |= frame[0] & 0x80 ? 1 : 0; + if (line->ts0.e_bits != 3) + line->ts0.cur_errmask |= E1L_TS0_RX_CRC4_ERR; + } + /* cur_errmask is being cleared once per second via line->ts0.timer */ + } +} + /*! de-multiplex E1 line data to the individual timeslots. * \param[in] line E1 line on which we operate. * \param[in] buf buffer containing multiplexed frame-aligned E1 data. * \param[in] size size of 'buf' in octets; assumed to be multiple of E1 frame size (32). + * \param[in] frame_base frame number (in multiframe) of first frame in 'buf'. -1 to disable TS0. * \returns 0 on success; negative on error */ int -e1_line_demux_in(struct e1_line *line, const uint8_t *buf, int size) +e1_line_demux_in(struct e1_line *line, const uint8_t *buf, int size, int frame_base) { int ftr; @@ -366,6 +394,9 @@ ftr = size / 32; OSMO_ASSERT(size % 32 == 0); + if (frame_base >= 0) + _e1_line_demux_in_ts0(line, buf, ftr, frame_base); + switch (line->mode) { case E1_LINE_MODE_CHANNELIZED: return _e1_line_demux_in_channelized(line, buf, ftr); diff --git a/src/usb.c b/src/usb.c index 326a2b2..3ec793f 100644 --- a/src/usb.c +++ b/src/usb.c @@ -118,7 +118,7 @@ { if (size == 0) return 0; - return e1_line_demux_in(flow->line, buf + 4, size - 4); + return e1_line_demux_in(flow->line, buf + 4, size - 4, buf[3] & 0xf); } static int diff --git a/src/vpair.c b/src/vpair.c index df14026..8484be0 100644 --- a/src/vpair.c +++ b/src/vpair.c @@ -132,14 +132,14 @@ rc = e1_line_mux_out(line, buf, frames_expired); OSMO_ASSERT(rc >= 0); /* write data to peer */ - rc = e1_line_demux_in(peer, buf, rc); + rc = e1_line_demux_in(peer, buf, rc, 0); OSMO_ASSERT(rc >= 0); /* generate data on peer line */ rc = e1_line_mux_out(peer, buf, frames_expired); OSMO_ASSERT(rc >= 0); /* write data to current line */ - rc = e1_line_demux_in(line, buf, rc); + rc = e1_line_demux_in(line, buf, rc, 0); OSMO_ASSERT(rc >= 0); } diff --git a/src/vty.c b/src/vty.c index da3d005..0d8ab2b 100644 --- a/src/vty.c +++ b/src/vty.c @@ -109,8 +109,11 @@ { int tn; - vty_out(vty, "Interface #%u, Line #%u, Mode %s:%s", line->intf->id, line->id, - get_value_string(e1_line_mode_names, line->mode), VTY_NEWLINE); + vty_out(vty, "Interface #%u, Line #%u, Mode %s%s%s:%s", line->intf->id, line->id, + get_value_string(e1_line_mode_names, line->mode), + line->ts0.cur_errmask & E1L_TS0_RX_ALARM ? " [REMOTE-ALARM]" : "", + line->ts0.cur_errmask & E1L_TS0_RX_CRC4_ERR ? " [REMOTE-CRC-ERROR]" : "", + VTY_NEWLINE); for (tn = 0; tn < ARRAY_SIZE(line->ts); tn++) { const struct e1_ts *ts = &line->ts[tn]; -- To view, visit https://gerrit.osmocom.org/c/osmo-e1d/+/21808 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-e1d Gerrit-Branch: master Gerrit-Change-Id: I7e1c919518b3418e973b7ae5bedd5a6dd1c2adec Gerrit-Change-Number: 21808 Gerrit-PatchSet: 4 Gerrit-Owner: laforge <laforge at osmocom.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge at osmocom.org> Gerrit-Reviewer: tnt <tnt at 246tNt.com> Gerrit-MessageType: merged -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210106/eaefe017/attachment.htm>