This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgHarald Welte has submitted this change and it was merged. ( https://gerrit.osmocom.org/10455 ) Change subject: trxcon/sched_prim.c: properly handle both TCH/H and FACCH/H prims ...................................................................... trxcon/sched_prim.c: properly handle both TCH/H and FACCH/H prims Initially it was assumed that FACCH prioritization should be done in the same way for both TCH/F and TCH/H. Moreover, it was not possible to confirm this, because TCH/H was (and still) not implemented yet. But according to the specs: - unlike FACCH/F, FACCH/H transmissions shall be aligned within a multiframe, i.e. can only be initiated on particular frame numbers (see GSM 05.02, clause 7); - unlike FACCH/F, a FACCH/H frame steals two TCH/F frames; so the TCH/H (including FACCH/H) primitives should be handled separately from the TCH/F (including FACCH/F) primitives. Change-Id: I9b59f60e1cbac8fb8fd557b6c67b5e376c0a6bbb --- M src/host/trxcon/sched_prim.c M src/host/trxcon/sched_trx.c M src/host/trxcon/sched_trx.h 3 files changed, 86 insertions(+), 6 deletions(-) Approvals: Jenkins Builder: Verified Harald Welte: Looks good to me, approved diff --git a/src/host/trxcon/sched_prim.c b/src/host/trxcon/sched_prim.c index 4987379..acd08bf 100644 --- a/src/host/trxcon/sched_prim.c +++ b/src/host/trxcon/sched_prim.c @@ -223,25 +223,105 @@ } /** + * Dequeues either a TCH/H, or a FACCH/H prim (preferred). + * If a FACCH/H prim is found, two TCH/H prims are being + * dropped (i.e. replaced). + * + * According to GSM 05.02, the following blocks can be used + * to carry FACCH/H data (see clause 7, table 1 of 9): + * + * UL FACCH/H0: + * B0(0,2,4,6,8,10), B1(8,10,13,15,17,19), B2(17,19,21,23,0,2) + * + * UL FACCH/H1: + * B0(1,3,5,7,9,11), B1(9,11,14,16,18,20), B2(18,20,22,24,1,3) + * + * where the numbers within brackets are fn % 26. + * + * @param queue transmit queue to take a prim from + * @param fn the current frame number + * @param lchan_type required channel type of a primitive, + * @return either a FACCH/H, or a TCH/H primitive, + * otherwise NULL + */ +static struct trx_ts_prim *prim_dequeue_tch_h(struct llist_head *queue, + uint32_t fn, enum trx_lchan_type lchan_type) +{ + struct trx_ts_prim *facch; + struct trx_ts_prim *tch; + bool facch_now = false; + uint32_t fn_mf; + + /* Traffic multiframe period */ + fn_mf = fn % 26; + + /* FACCH/H0 frame alignment */ + if (lchan_type == TRXC_TCHH_0) + if (fn_mf == 0 || fn_mf == 8 || fn_mf == 17) + facch_now = true; + + /* FACCH/H1 frame alignment */ + if (lchan_type == TRXC_TCHH_1) + if (fn_mf == 1 || fn_mf == 9 || fn_mf == 18) + facch_now = true; + + /* If FACCH/H is not allowed for a given frame number */ + if (!facch_now) /* Just dequeue a TCH/H prim */ + goto no_facch; + + /* If there are no FACCH/H prims in the queue */ + facch = prim_dequeue_tch(queue, lchan_type, true); + if (!facch) /* Just dequeue a TCH/H prim */ + goto no_facch; + + /* FACCH/H prim replaces two TCH/F prims */ + tch = prim_dequeue_tch(queue, lchan_type, false); + if (tch) { + /* At least one TCH/H prim is dropped */ + talloc_free(tch); + + /* Attempt to find another */ + tch = prim_dequeue_tch(queue, lchan_type, false); + if (tch) /* Drop the second TCH/H prim */ + talloc_free(tch); + } + + return facch; + +no_facch: + return prim_dequeue_tch(queue, lchan_type, false); +} + +/** * Dequeues a single primitive of required type * from a specified transmit queue. * * @param queue a transmit queue to take a prim from + * @param fn the current frame number (used for FACCH/H) * @param lchan_type required primitive type * @return a primitive or NULL if not found */ struct trx_ts_prim *sched_prim_dequeue(struct llist_head *queue, - enum trx_lchan_type lchan_type) + uint32_t fn, enum trx_lchan_type lchan_type) { /* There is nothing to dequeue */ if (llist_empty(queue)) return NULL; - /* TCH requires FACCH prioritization, so handle it separately */ - if (CHAN_IS_TCH(lchan_type)) + switch (lchan_type) { + /* TCH/F requires FACCH/F prioritization */ + case TRXC_TCHF: return prim_dequeue_tch_f(queue); - return prim_dequeue_one(queue, lchan_type); + /* FACCH/H prioritization is a bit more complex */ + case TRXC_TCHH_0: + case TRXC_TCHH_1: + return prim_dequeue_tch_h(queue, fn, lchan_type); + + /* Other kinds of logical channels */ + default: + return prim_dequeue_one(queue, lchan_type); + } } /** diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c index c263ce7..fd43a56 100644 --- a/src/host/trxcon/sched_trx.c +++ b/src/host/trxcon/sched_trx.c @@ -95,7 +95,7 @@ * attempt to obtain a new one from queue */ if (lchan->prim == NULL) - lchan->prim = sched_prim_dequeue(&ts->tx_prims, chan); + lchan->prim = sched_prim_dequeue(&ts->tx_prims, fn, chan); /* TODO: report TX buffers health to the higher layers */ diff --git a/src/host/trxcon/sched_trx.h b/src/host/trxcon/sched_trx.h index cd9c0e4..f3fa9df 100644 --- a/src/host/trxcon/sched_trx.h +++ b/src/host/trxcon/sched_trx.h @@ -302,7 +302,7 @@ (CHAN_IS_TCH(prim->chan) && prim->payload_len == GSM_MACBLOCK_LEN) struct trx_ts_prim *sched_prim_dequeue(struct llist_head *queue, - enum trx_lchan_type lchan_type); + uint32_t fn, enum trx_lchan_type lchan_type); int sched_prim_dummy(struct trx_lchan_state *lchan); void sched_prim_drop(struct trx_lchan_state *lchan); void sched_prim_flush_queue(struct llist_head *list); -- To view, visit https://gerrit.osmocom.org/10455 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmocom-bb Gerrit-Branch: master Gerrit-MessageType: merged Gerrit-Change-Id: I9b59f60e1cbac8fb8fd557b6c67b5e376c0a6bbb Gerrit-Change-Number: 10455 Gerrit-PatchSet: 1 Gerrit-Owner: Vadim Yanitskiy <axilirator at gmail.com> Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Jenkins Builder -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180815/5ee70f5b/attachment.htm>