aboutsummaryrefslogtreecommitdiffstats
path: root/src/octoi
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2022-04-19 19:11:20 +0200
committerHarald Welte <laforge@osmocom.org>2022-04-19 19:20:48 +0200
commit99161f1423234e3a253e59d9b99650306596c9bd (patch)
treec69d950c5979cd1b2002a58a217bbeb3ea601ce3 /src/octoi
parentaccfded5477eb58edccedc15f4d925eb5e5efb9d (diff)
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
Diffstat (limited to 'src/octoi')
-rw-r--r--src/octoi/e1oip.c17
-rw-r--r--src/octoi/e1oip.h1
-rw-r--r--src/octoi/octoi_clnt_fsm.c3
-rw-r--r--src/octoi/octoi_srv_fsm.c3
4 files changed, 19 insertions, 5 deletions
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 @@ struct e1oip_line *e1oip_line_alloc(struct octoi_peer *peer)
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 @@ struct e1oip_line *e1oip_line_alloc(struct octoi_peer *peer)
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 {
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 @@ static void clnt_st_accepted_onenter(struct osmo_fsm_inst *fi, uint32_t prev_sta
{
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 @@ static void srv_st_accepted_onenter(struct osmo_fsm_inst *fi, uint32_t prev_stat
{
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);
}