Move FINISHED tbf_state transition to tbf_fsm
Related: OS#2709 Change-Id: I81f507e3a2821254f03364a58ead02333e63099f
This commit is contained in:
parent
65bba93afa
commit
c32c4a3648
|
@ -711,7 +711,7 @@ int gprs_rlcmac_dl_tbf::create_new_bsn(const uint32_t fn, enum CodingScheme cs)
|
||||||
is_final = llc_queue_size(llc_queue()) == 0 && !keep_open(fn);
|
is_final = llc_queue_size(llc_queue()) == 0 && !keep_open(fn);
|
||||||
if (is_final) {
|
if (is_final) {
|
||||||
rdbi->cv = 0;
|
rdbi->cv = 0;
|
||||||
TBF_SET_STATE(this, TBF_ST_FINISHED);
|
osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_LAST_DL_DATA_SENT, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mcs_is_edge(cs)) {
|
if (mcs_is_edge(cs)) {
|
||||||
|
@ -756,7 +756,7 @@ int gprs_rlcmac_dl_tbf::create_new_bsn(const uint32_t fn, enum CodingScheme cs)
|
||||||
|
|
||||||
if (is_final) {
|
if (is_final) {
|
||||||
request_dl_ack();
|
request_dl_ack();
|
||||||
TBF_SET_STATE(this, TBF_ST_FINISHED);
|
osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_LAST_DL_DATA_SENT, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dequeue next LLC frame, if any */
|
/* dequeue next LLC frame, if any */
|
||||||
|
|
|
@ -46,6 +46,8 @@ const struct value_string tbf_fsm_event_names[] = {
|
||||||
{ TBF_EV_ASSIGN_DEL_CCCH, "ASSIGN_DEL_CCCH" },
|
{ TBF_EV_ASSIGN_DEL_CCCH, "ASSIGN_DEL_CCCH" },
|
||||||
{ TBF_EV_ASSIGN_ACK_PACCH, "ASSIGN_ACK_PACCH" },
|
{ TBF_EV_ASSIGN_ACK_PACCH, "ASSIGN_ACK_PACCH" },
|
||||||
{ TBF_EV_ASSIGN_READY_CCCH, "ASSIGN_READY_CCCH" },
|
{ TBF_EV_ASSIGN_READY_CCCH, "ASSIGN_READY_CCCH" },
|
||||||
|
{ TBF_EV_LAST_DL_DATA_SENT, "LAST_DL_DATA_SENT" },
|
||||||
|
{ TBF_EV_LAST_UL_DATA_RECVD, "LAST_UL_DATA_RECVD" },
|
||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -137,6 +139,19 @@ static void st_assign(struct osmo_fsm_inst *fi, uint32_t event, void *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void st_flow(struct osmo_fsm_inst *fi, uint32_t event, void *data)
|
||||||
|
{
|
||||||
|
switch (event) {
|
||||||
|
case TBF_EV_LAST_DL_DATA_SENT:
|
||||||
|
case TBF_EV_LAST_UL_DATA_RECVD:
|
||||||
|
/* All data has been sent or received, change state to FINISHED */
|
||||||
|
tbf_fsm_state_chg(fi, TBF_ST_FINISHED);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
OSMO_ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void tbf_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)
|
static void tbf_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)
|
||||||
{
|
{
|
||||||
/* TODO: needed ?
|
/* TODO: needed ?
|
||||||
|
@ -180,12 +195,14 @@ static struct osmo_fsm_state tbf_fsm_states[] = {
|
||||||
},
|
},
|
||||||
[TBF_ST_FLOW] = {
|
[TBF_ST_FLOW] = {
|
||||||
.in_event_mask =
|
.in_event_mask =
|
||||||
0,
|
X(TBF_EV_LAST_DL_DATA_SENT) |
|
||||||
|
X(TBF_EV_LAST_UL_DATA_RECVD),
|
||||||
.out_state_mask =
|
.out_state_mask =
|
||||||
X(TBF_ST_FINISHED) |
|
X(TBF_ST_FINISHED) |
|
||||||
X(TBF_ST_WAIT_RELEASE) |
|
X(TBF_ST_WAIT_RELEASE) |
|
||||||
X(TBF_ST_RELEASING),
|
X(TBF_ST_RELEASING),
|
||||||
.name = "FLOW",
|
.name = "FLOW",
|
||||||
|
.action = st_flow,
|
||||||
},
|
},
|
||||||
[TBF_ST_FINISHED] = {
|
[TBF_ST_FINISHED] = {
|
||||||
.in_event_mask =
|
.in_event_mask =
|
||||||
|
|
|
@ -32,6 +32,8 @@ enum tbf_fsm_event {
|
||||||
TBF_EV_ASSIGN_DEL_CCCH, /* An assignment previously sent over CCCH has been confirmed by MS */
|
TBF_EV_ASSIGN_DEL_CCCH, /* An assignment previously sent over CCCH has been confirmed by MS */
|
||||||
TBF_EV_ASSIGN_ACK_PACCH, /* We received a CTRL ACK confirming assignment started on PACCH */
|
TBF_EV_ASSIGN_ACK_PACCH, /* We received a CTRL ACK confirming assignment started on PACCH */
|
||||||
TBF_EV_ASSIGN_READY_CCCH, /* TBF Start Time timer triggered */
|
TBF_EV_ASSIGN_READY_CCCH, /* TBF Start Time timer triggered */
|
||||||
|
TBF_EV_LAST_DL_DATA_SENT, /* DL TBF sends RLCMAC block containing last DL avilable data buffered */
|
||||||
|
TBF_EV_LAST_UL_DATA_RECVD, /* UL TBF sends RLCMAC block containing last UL data (cv=0) */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum tbf_fsm_states {
|
enum tbf_fsm_states {
|
||||||
|
|
|
@ -536,7 +536,7 @@ int gprs_rlcmac_ul_tbf::rcv_data_block_acknowledged(
|
||||||
rdbi->bsn, rdbi->cv);
|
rdbi->bsn, rdbi->cv);
|
||||||
if (rdbi->cv == 0) {
|
if (rdbi->cv == 0) {
|
||||||
LOGPTBFUL(this, LOGL_DEBUG, "Finished with UL TBF\n");
|
LOGPTBFUL(this, LOGL_DEBUG, "Finished with UL TBF\n");
|
||||||
TBF_SET_STATE(this, TBF_ST_FINISHED);
|
osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_LAST_UL_DATA_RECVD, NULL);
|
||||||
/* Reset N3103 counter. */
|
/* Reset N3103 counter. */
|
||||||
this->n_reset(N3103);
|
this->n_reset(N3103);
|
||||||
}
|
}
|
||||||
|
|
|
@ -483,6 +483,7 @@ TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Sending new dummy block at BSN 21,
|
||||||
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Empty chunk, added LLC dummy command of size 19, drained_since=112
|
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Empty chunk, added LLC dummy command of size 19, drained_since=112
|
||||||
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Keep idle TBF open: 112/43 -> no
|
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Keep idle TBF open: 112/43 -> no
|
||||||
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Complete DL frame, len=19
|
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW) Complete DL frame, len=19
|
||||||
|
TBF(DL-TFI_0){FLOW}: Received Event LAST_DL_DATA_SENT
|
||||||
TBF(DL-TFI_0){FLOW}: state_chg to FINISHED
|
TBF(DL-TFI_0){FLOW}: state_chg to FINISHED
|
||||||
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) data block (BSN 21, CS-1): 4d 43 c0 01 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
|
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) data block (BSN 21, CS-1): 4d 43 c0 01 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
|
||||||
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 21 BSN2 -1)
|
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 21 BSN2 -1)
|
||||||
|
@ -1597,6 +1598,7 @@ MSG = 07 00 02 4d 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
|
||||||
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FLOW) downlink (V(A)==0 .. V(S)==2) mcs_mode_restrict=EGPRS
|
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FLOW) downlink (V(A)==0 .. V(S)==2) mcs_mode_restrict=EGPRS
|
||||||
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FLOW) Sending new block at BSN 2, CS=CS-1
|
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FLOW) Sending new block at BSN 2, CS=CS-1
|
||||||
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FLOW) Complete DL frame, len=19
|
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FLOW) Complete DL frame, len=19
|
||||||
|
TBF(DL-TFI_0){FLOW}: Received Event LAST_DL_DATA_SENT
|
||||||
TBF(DL-TFI_0){FLOW}: state_chg to FINISHED
|
TBF(DL-TFI_0){FLOW}: state_chg to FINISHED
|
||||||
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FINISHED) data block (BSN 2, CS-1): 4d 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
|
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FINISHED) data block (BSN 2, CS-1): 4d 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
|
||||||
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 2 BSN2 -1)
|
TBF(TFI=0 TLLI=0xc0123456 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 2 BSN2 -1)
|
||||||
|
@ -1649,6 +1651,7 @@ LLC [PCU -> SGSN] TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) len=16
|
||||||
No bctx
|
No bctx
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) No gaps in received block, last block: BSN=0 CV=0
|
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) No gaps in received block, last block: BSN=0 CV=0
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) Finished with UL TBF
|
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) Finished with UL TBF
|
||||||
|
TBF(UL-TFI_0){FLOW}: Received Event LAST_UL_DATA_RECVD
|
||||||
TBF(UL-TFI_0){FLOW}: state_chg to FINISHED
|
TBF(UL-TFI_0){FLOW}: state_chg to FINISHED
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED) Scheduling Ack/Nack, because TLLI is included.
|
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED) Scheduling Ack/Nack, because TLLI is included.
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED) Scheduling final Ack/Nack, because all data was received and last block has CV==0.
|
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED) Scheduling final Ack/Nack, because all data was received and last block has CV==0.
|
||||||
|
@ -1889,6 +1892,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) downlink (V(A)==0 .. V(S)==0) mcs_m
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Sending new block at BSN 0, CS=CS-4
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Sending new block at BSN 0, CS=CS-4
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Dequeue next LLC (len=10)
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Dequeue next LLC (len=10)
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Complete DL frame, len=10
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Complete DL frame, len=10
|
||||||
|
TBF(DL-TFI_0){FLOW}: Received Event LAST_DL_DATA_SENT
|
||||||
TBF(DL-TFI_0){FLOW}: state_chg to FINISHED
|
TBF(DL-TFI_0){FLOW}: state_chg to FINISHED
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) data block (BSN 0, CS-4): 29 52 41 55 5f 41 43 43 45 50 54 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) data block (BSN 0, CS-4): 29 52 41 55 5f 41 43 43 45 50 54 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 0 BSN2 -1)
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 0 BSN2 -1)
|
||||||
|
@ -2308,6 +2312,7 @@ LLC [PCU -> SGSN] TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) len=16
|
||||||
No bctx
|
No bctx
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) No gaps in received block, last block: BSN=0 CV=0
|
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) No gaps in received block, last block: BSN=0 CV=0
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) Finished with UL TBF
|
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) Finished with UL TBF
|
||||||
|
TBF(UL-TFI_0){FLOW}: Received Event LAST_UL_DATA_RECVD
|
||||||
TBF(UL-TFI_0){FLOW}: state_chg to FINISHED
|
TBF(UL-TFI_0){FLOW}: state_chg to FINISHED
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED) Scheduling Ack/Nack, because TLLI is included.
|
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED) Scheduling Ack/Nack, because TLLI is included.
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED) Scheduling final Ack/Nack, because all data was received and last block has CV==0.
|
TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FINISHED) Scheduling final Ack/Nack, because all data was received and last block has CV==0.
|
||||||
|
@ -2988,6 +2993,7 @@ TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Sending new block at BSN 27, CS=CS-
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Complete DL frame, len=13
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Complete DL frame, len=13
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Dequeue next LLC (len=13)
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Dequeue next LLC (len=13)
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Complete DL frame, len=13
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FLOW) Complete DL frame, len=13
|
||||||
|
TBF(DL-TFI_0){FLOW}: Received Event LAST_DL_DATA_SENT
|
||||||
TBF(DL-TFI_0){FLOW}: state_chg to FINISHED
|
TBF(DL-TFI_0){FLOW}: state_chg to FINISHED
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) data block (BSN 27, CS-1): 16 35 45 54 20 33 38 4c 4c 43 20 50 41 43 4b 45 54 20 33 39
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) data block (BSN 27, CS-1): 16 35 45 54 20 33 38 4c 4c 43 20 50 41 43 4b 45 54 20 33 39
|
||||||
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 27 BSN2 -1)
|
TBF(TFI=0 TLLI=0xf1223344 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 27 BSN2 -1)
|
||||||
|
@ -3332,6 +3338,7 @@ PDCH(bts=0,trx=0,ts=7) FN=2654448 Scheduling data message at RTS for DL TFI=1 pr
|
||||||
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FLOW) downlink (V(A)==0 .. V(S)==10) mcs_mode_restrict=EGPRS
|
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FLOW) downlink (V(A)==0 .. V(S)==10) mcs_mode_restrict=EGPRS
|
||||||
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FLOW) Sending new block at BSN 10, CS=CS-1
|
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FLOW) Sending new block at BSN 10, CS=CS-1
|
||||||
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FLOW) Complete DL frame, len=21
|
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FLOW) Complete DL frame, len=21
|
||||||
|
TBF(DL-TFI_1){FLOW}: Received Event LAST_DL_DATA_SENT
|
||||||
TBF(DL-TFI_1){FLOW}: state_chg to FINISHED
|
TBF(DL-TFI_1){FLOW}: state_chg to FINISHED
|
||||||
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FINISHED) data block (BSN 10, CS-1): 4d 43 20 50 41 43 4b 45 54 20 30 39 20 28 54 42 46 20 32 29
|
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FINISHED) data block (BSN 10, CS-1): 4d 43 20 50 41 43 4b 45 54 20 30 39 20 28 54 42 46 20 32 29
|
||||||
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 10 BSN2 -1)
|
TBF(TFI=1 TLLI=0xf1223344 DIR=DL STATE=FINISHED) need_padding 0 spb_status 0 spb 0 (BSN1 10 BSN2 -1)
|
||||||
|
|
Loading…
Reference in New Issue