falconia has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/33069 )
Change subject: trx TCH DL: transmit invalid speech blocks instead of dummy FACCH ......................................................................
trx TCH DL: transmit invalid speech blocks instead of dummy FACCH
In speech TCH operation, there will always be times when a speech frame needs to be transmitted on the downlink, but there is no frame available to transmit (gap in the incoming RTP stream), or the logic of DTXd says that no frame shall be transmitted at this FN, but we are not doing physical DTXd. Previous osmo-bts-trx code sent dummy FACCH during such conditions, but this approach is bad for TCH/HS where we would like to transmit good speech frames or speech frame gaps one 20 ms frame at a time, rather than take out pairs of frames for dummy FACCH/H. Other BTS models (sysmoBTS PHY) send out invalid speech blocks with inverted CRC3 under the conditions in question - do the same in osmo-bts-trx.
The present change modifies osmo-bts-trx TCH DL frame gap behavior only for TCH/FS, TCH/HS and TCH/EFS; for all other channel modes, including AMR speech, the previous behavior of sending dummy FACCH is left unchanged.
Depends: Iade3310e16b906efb6892d28f474a0d15204e861 (libosmocore) Change-Id: I78106802a0aa4af39859c75d29fe0e77037899fe --- M src/osmo-bts-trx/sched_lchan_tchf.c M src/osmo-bts-trx/sched_lchan_tchh.c 2 files changed, 62 insertions(+), 2 deletions(-)
Approvals: Jenkins Builder: Verified pespin: Looks good to me, but someone else must approve fixeria: Looks good to me, approved
diff --git a/src/osmo-bts-trx/sched_lchan_tchf.c b/src/osmo-bts-trx/sched_lchan_tchf.c index f065803..0188d85 100644 --- a/src/osmo-bts-trx/sched_lchan_tchf.c +++ b/src/osmo-bts-trx/sched_lchan_tchf.c @@ -472,10 +472,29 @@ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, }; + int rc;
LOGL1SB(DL1P, LOGL_DEBUG, l1ts, br, "No TCH or FACCH prim for transmit.\n"); - gsm0503_tch_fr_encode(bursts_p, dummy, sizeof(dummy), 1); - chan_state->dl_facch_bursts = 8; + /* If the channel mode is TCH/FS or TCH/EFS, transmit a dummy + * speech block with inverted CRC3, designed to induce a BFI + * condition in the MS receiver. In all other channel modes, + * transmit dummy FACCH like we always did before. + * + * FIXME: someone who knows AMR needs to look at this problem + * and decide what is the correct BTS Tx behavior for frame + * gaps in TCH/AFS. See OS#6049. + */ + switch (tch_mode) { + case GSM48_CMODE_SPEECH_V1: + case GSM48_CMODE_SPEECH_EFR: + rc = gsm0503_tch_fr_encode(bursts_p, NULL, 0, 1); + if (rc == 0) + break; + /* fall-through */ + default: + gsm0503_tch_fr_encode(bursts_p, dummy, sizeof(dummy), 1); + chan_state->dl_facch_bursts = 8; + } goto send_burst; }
diff --git a/src/osmo-bts-trx/sched_lchan_tchh.c b/src/osmo-bts-trx/sched_lchan_tchh.c index 5772e9f..2f1194a 100644 --- a/src/osmo-bts-trx/sched_lchan_tchh.c +++ b/src/osmo-bts-trx/sched_lchan_tchh.c @@ -385,8 +385,23 @@ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, }; + int rc;
LOGL1SB(DL1P, LOGL_INFO, l1ts, br, "No TCH or FACCH prim for transmit.\n"); + /* If the channel mode is TCH/HS, transmit a dummy speech block + * with inverted CRC3, designed to induce a BFI condition in + * the MS receiver. In all other channel modes, transmit + * dummy FACCH like we always did before. + * + * FIXME: someone who knows AMR needs to look at this problem + * and decide what is the correct BTS Tx behavior for frame + * gaps in TCH/AHS. See OS#6049. + */ + if (tch_mode == GSM48_CMODE_SPEECH_V1) { + rc = gsm0503_tch_hr_encode(bursts_p, NULL, 0); + if (rc == 0) + goto send_burst; + }
/* FACCH/H can only be scheduled at specific TDMA offset */ if (!sched_tchh_dl_facch_map[br->fn % 26]) {