diff options
author | Harald Welte <laforge@osmocom.org> | 2022-04-19 19:11:20 +0200 |
---|---|---|
committer | Harald Welte <laforge@osmocom.org> | 2022-04-19 19:20:48 +0200 |
commit | 99161f1423234e3a253e59d9b99650306596c9bd (patch) | |
tree | c69d950c5979cd1b2002a58a217bbeb3ea601ce3 /src/octoi | |
parent | accfded5477eb58edccedc15f4d925eb5e5efb9d (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.c | 17 | ||||
-rw-r--r-- | src/octoi/e1oip.h | 1 | ||||
-rw-r--r-- | src/octoi/octoi_clnt_fsm.c | 3 | ||||
-rw-r--r-- | src/octoi/octoi_srv_fsm.c | 3 |
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); } |