laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-e1d/+/27833 )
Change subject: octoi: Reset FIFO/RIFO when entering ACCEPTED state ......................................................................
octoi: Reset FIFO/RIFO when entering ACCEPTED state
For both OCTOI client + server FSM, whenever we enter the ACCEPTED state (we disconnect), let's reset the RIFO/FIFO state. This makes sure no left-over frames from some earlier connection are present, and also ensures our initial frame number expectations are correct.
Change-Id: I9e721b5dbf22728cb2361ed121d12def7016dcc2 --- M src/octoi/e1oip.c M src/octoi/e1oip.h M src/octoi/octoi_clnt_fsm.c M src/octoi/octoi_srv_fsm.c 4 files changed, 19 insertions(+), 5 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-e1d refs/changes/33/27833/1
diff --git a/src/octoi/e1oip.c b/src/octoi/e1oip.c index 9461818..5dd3bbf 100644 --- a/src/octoi/e1oip.c +++ b/src/octoi/e1oip.c @@ -288,11 +288,7 @@ iline->cfg.batching_factor = 32; iline->cfg.prefill_frame_count = 400; /* 50ms */
- frame_fifo_init(&iline->e1o.fifo, iline->cfg.batching_factor, fifo_threshold_cb, iline); - memset(&iline->e1o.last_frame, 0xff, sizeof(iline->e1o.last_frame)); - - frame_rifo_init(&iline->e1t.rifo); - memset(&iline->e1t.last_frame, 0xff, sizeof(iline->e1o.last_frame)); + e1oip_line_reset(iline);
iline->peer = peer; peer->iline = iline; @@ -300,6 +296,17 @@ return iline; }
+void e1oip_line_reset(struct e1oip_line *iline) +{ + frame_fifo_init(&iline->e1o.fifo, iline->cfg.batching_factor, fifo_threshold_cb, iline); + memset(&iline->e1o.last_frame, 0xff, sizeof(iline->e1o.last_frame)); + iline->e1o.next_seq = 0; + + frame_rifo_init(&iline->e1t.rifo); + memset(&iline->e1t.last_frame, 0xff, sizeof(iline->e1t.last_frame)); + iline->e1t.next_fn32 = 0; +} + void e1oip_line_destroy(struct e1oip_line *iline) { if (!iline) diff --git a/src/octoi/e1oip.h b/src/octoi/e1oip.h index 233e8ee..70e1bbb 100644 --- a/src/octoi/e1oip.h +++ b/src/octoi/e1oip.h @@ -60,6 +60,7 @@
struct e1oip_line *e1oip_line_alloc(struct octoi_peer *peer); void e1oip_line_set_name(struct e1oip_line *line, const char *name); +void e1oip_line_reset(struct e1oip_line *iline); void e1oip_line_destroy(struct e1oip_line *iline);
int e1oip_rcvmsg_tdm_data(struct e1oip_line *iline, struct msgb *msg); diff --git a/src/octoi/octoi_clnt_fsm.c b/src/octoi/octoi_clnt_fsm.c index 1c38bc8..f2fe989 100644 --- a/src/octoi/octoi_clnt_fsm.c +++ b/src/octoi/octoi_clnt_fsm.c @@ -115,6 +115,9 @@ { struct clnt_state *st = fi->priv;
+ /* reset RIFO/FIFO etc. */ + e1oip_line_reset(st->peer->iline); + st->peer->tdm_permitted = true; osmo_timer_schedule(&st->rx_alive_timer, 3, 0); } diff --git a/src/octoi/octoi_srv_fsm.c b/src/octoi/octoi_srv_fsm.c index 9f1019a..3990a16 100644 --- a/src/octoi/octoi_srv_fsm.c +++ b/src/octoi/octoi_srv_fsm.c @@ -169,6 +169,9 @@ { struct srv_state *st = fi->priv;
+ /* reset RIFO/FIFO etc. */ + e1oip_line_reset(st->peer->iline); + st->peer->tdm_permitted = true; osmo_timer_schedule(&st->rx_alive_timer, 3, 0); }