laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-bts/+/32100 )

Change subject: sysmo: emit empty RTP ticks during FACCH stealing on TCH/F
......................................................................

sysmo: emit empty RTP ticks during FACCH stealing on TCH/F

When FACCH stealing occurs and sysmoBTS L1 delivers GsmL1_Sapi_FacchF
instead of GsmL1_Sapi_TchF, that 20 ms unit still needs to be
accounted for in the RTP timestamp cadence, and if we run with
rtp continuous-streaming enabled, then an actual BFI packet needs
to be emitted.  The original code failed to do either; the present
change implements correct behavior for TCH/F.

The present patch only covers the case of TCH/F; handling of TCH/H
is left as a FIXME for other/later developers.

Related: OS#5974
Change-Id: I39d15faade28fb7d670493a99a0e0bdb654e2a4a
---
M src/osmo-bts-sysmo/l1_if.c
M src/osmo-bts-sysmo/l1_if.h
M src/osmo-bts-sysmo/tch.c
3 files changed, 64 insertions(+), 0 deletions(-)

Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified




diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index 19f0c5a..24a3d1e 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -980,6 +980,25 @@
                return rc;
        }

+       /* If we got FACCH, the RTP clock needs to account for it,
+        * and if we have rtp continuous-streaming enabled,
+        * an actual BFI packet will be emitted.
+        *
+        * Only the case of TCH/F is currently handled; the task of
+        * supporting TCH/H is left as a FIXME for other/later
+        * developers.  The difficulty with supporting FACCH/H is that
+        * only one GsmL1_Sapi_FacchH message will be received,
+        * covering 40 ms of time, but two RTP "tick" output calls
+        * will need to be made, with appropriately adjusted frame
+        * numbers.  As a further consideration for rtp continuous-streaming
+        * mode, having the two RTP BFI packets sent directly back to back,
+        * as opposed to proper 20 ms timing, may be so undesirable
+        * that some deployments may rather disable TCH/H (use only TCH/F)
+        * than deal with the extra pain, or use TCH/H only on SDR-based
+        * BTS with osmo-bts-trx where correct timing is easily achieved. */
+       if (data_ind->sapi == GsmL1_Sapi_FacchF)
+               l1if_tch_rx_facch(trx, chan_nr, l1p_msg);
+
        /* fill L1SAP header */
        sap_msg = l1sap_msgb_alloc(data_ind->msgUnitParam.u8Size);
        l1sap = msgb_l1sap_prim(sap_msg);
diff --git a/src/osmo-bts-sysmo/l1_if.h b/src/osmo-bts-sysmo/l1_if.h
index 8691eef..5b2da04 100644
--- a/src/osmo-bts-sysmo/l1_if.h
+++ b/src/osmo-bts-sysmo/l1_if.h
@@ -129,6 +129,8 @@
                    const uint8_t *rtp_pl, unsigned int rtp_pl_len, uint32_t fn,
                    bool use_cache, bool marker);
 int l1if_tch_rx(struct gsm_bts_trx *trx, uint8_t chan_nr, struct msgb 
*l1p_msg);
+int l1if_tch_rx_facch(struct gsm_bts_trx *trx, uint8_t chan_nr,
+                     struct msgb *l1p_msg);
 int l1if_tch_fill(struct gsm_lchan *lchan, uint8_t *l1_buffer);
 struct msgb *gen_empty_tch_msg(struct gsm_lchan *lchan, uint32_t fn);

diff --git a/src/osmo-bts-sysmo/tch.c b/src/osmo-bts-sysmo/tch.c
index 832991f..3e7a1a1 100644
--- a/src/osmo-bts-sysmo/tch.c
+++ b/src/osmo-bts-sysmo/tch.c
@@ -623,6 +623,29 @@
        return -EINVAL;
 }

+/*! \brief provide an RTP empty payload "tick" to upper layers upon FACCH */
+int l1if_tch_rx_facch(struct gsm_bts_trx *trx, uint8_t chan_nr,
+                     struct msgb *l1p_msg)
+{
+       GsmL1_Prim_t *l1p = msgb_l1prim(l1p_msg);
+       GsmL1_PhDataInd_t *data_ind = &l1p->u.phDataInd;
+       struct msgb *rmsg = NULL;
+       struct gsm_lchan *lchan = 
&trx->ts[L1SAP_CHAN2TS(chan_nr)].lchan[l1sap_chan2ss(chan_nr)];
+
+       if (is_recv_only(lchan->abis_ip.speech_mode))
+               return -EAGAIN;
+
+       LOGPLCFN(lchan, DL1P, LOGL_DEBUG, data_ind->u32Fn, "chan_nr %d Rx 
FACCH\n", chan_nr);
+       /* Push empty payload to upper layers */
+       rmsg = msgb_alloc_headroom(256, 128, "L1P-to-RTP");
+       return add_l1sap_header(trx, rmsg, lchan, chan_nr, data_ind->u32Fn,
+                               data_ind->measParam.fBer * 10000,
+                               data_ind->measParam.fLinkQuality * 10,
+                               0,      /* suppress RSSI like in osmo-bts-trx */
+                               data_ind->measParam.i16BurstTiming * 64,
+                               0);
+}
+
 struct msgb *gen_empty_tch_msg(struct gsm_lchan *lchan, uint32_t fn)
 {
        struct msgb *msg;

--
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/32100
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I39d15faade28fb7d670493a99a0e0bdb654e2a4a
Gerrit-Change-Number: 32100
Gerrit-PatchSet: 6
Gerrit-Owner: falconia <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to