fixeria has uploaded this change for review.

View Change

[WIP] l1gprs: implement TBF starting time support

Change-Id: I174e3c43d2f4c828a528710b284e62c9bb794122
Related: OS#5500
---
M include/l1gprs.h
M src/shared/l1gprs.c
2 files changed, 65 insertions(+), 12 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/23/33223/1
diff --git a/include/l1gprs.h b/include/l1gprs.h
index bbd654d..82c05d0 100644
--- a/include/l1gprs.h
+++ b/include/l1gprs.h
@@ -17,6 +17,8 @@
uint8_t tbf_ref;
/*! PDCH timeslots used by this TBF */
uint8_t slotmask;
+ /*! TBF starting time (absolute TDMA Fn) */
+ uint8_t start_fn;
/*! (Downlink only) DL TFI (Temporary Flow Indentity): 0..31 */
uint8_t dl_tfi;
};
@@ -37,8 +39,10 @@
struct l1gprs_state {
/*! PDCH state for each timeslot */
struct l1gprs_pdch pdch[8];
- /*! Uplink and Downlink TBFs */
+ /*! Uplink and Downlink TBFs (active) */
struct llist_head tbf_list;
+ /*! Uplink and Downlink TBFs (pending) */
+ struct llist_head tbf_list_pending;
/*! Logging context (used as prefix for messages) */
char *log_prefix;
/*! Some private data for API user */
diff --git a/src/shared/l1gprs.c b/src/shared/l1gprs.c
index fd18e4e..15d16ca 100644
--- a/src/shared/l1gprs.c
+++ b/src/shared/l1gprs.c
@@ -43,6 +43,10 @@
LOGP_GPRS((pdch)->gprs, level, "(PDCH-%u) " fmt, \
(pdch)->tn, ## args)

+#define LOG_TBF_CFG_REQ_FMT "tbf_ref=%u, slotmask=0x%02x, start_fn=%u"
+#define LOG_TBF_CFG_REQ_ARGS(req) \
+ (req)->tbf_ref, (req)->slotmask, ntohl((req)->start_fn)
+
#define LOG_TBF_FMT "%cL-TBF#%03d"
#define LOG_TBF_ARGS(tbf) \
(tbf)->uplink ? 'U' : 'D', tbf->tbf_ref
@@ -58,7 +62,7 @@

static struct l1gprs_tbf *l1gprs_tbf_alloc(struct l1gprs_state *gprs,
bool uplink, uint8_t tbf_ref,
- uint8_t slotmask)
+ uint8_t slotmask, uint32_t start_fn)
{
struct l1gprs_tbf *tbf;

@@ -68,6 +72,7 @@
tbf->uplink = uplink;
tbf->tbf_ref = tbf_ref;
tbf->slotmask = slotmask;
+ tbf->start_fn = start_fn;

return tbf;
}
@@ -80,12 +85,12 @@
talloc_free(tbf);
}

-static struct l1gprs_tbf *l1gprs_find_tbf(struct l1gprs_state *gprs,
+static struct l1gprs_tbf *l1gprs_find_tbf(const struct llist_head *tbf_list,
bool uplink, uint8_t tbf_ref)
{
struct l1gprs_tbf *tbf;

- llist_for_each_entry(tbf, &gprs->tbf_list, list) {
+ llist_for_each_entry(tbf, tbf_list, list) {
if (tbf->uplink != uplink)
continue;
if (tbf->tbf_ref != tbf_ref)
@@ -101,6 +106,16 @@
{
OSMO_ASSERT(tbf->slotmask != 0x00);

+ /* TBFs with specific starting time go to pending list */
+ if (tbf->start_fn != 0xffffffff) {
+ llist_add_tail(&tbf->list, &gprs->tbf_list_pending);
+
+ LOGP_GPRS(gprs, LOGL_INFO,
+ LOG_TBF_FMT " is registered as pending (fn=%u)\n",
+ LOG_TBF_ARGS(tbf), tbf->start_fn);
+ return;
+ }
+
/* Update the PDCH states */
for (unsigned int tn = 0; tn < ARRAY_SIZE(gprs->pdch); tn++) {
struct l1gprs_pdch *pdch = &gprs->pdch[tn];
@@ -123,7 +138,7 @@
llist_add_tail(&tbf->list, &gprs->tbf_list);

LOGP_GPRS(gprs, LOGL_INFO,
- LOG_TBF_FMT " is registered\n",
+ LOG_TBF_FMT " is registered as active\n",
LOG_TBF_ARGS(tbf));
}

@@ -132,7 +147,9 @@
{
struct l1gprs_tbf *tbf;

- tbf = l1gprs_find_tbf(gprs, uplink, tbf_ref);
+ tbf = l1gprs_find_tbf(&gprs->tbf_list, uplink, tbf_ref);
+ if (tbf == NULL)
+ tbf = l1gprs_find_tbf(&gprs->tbf_list_pending, uplink, tbf_ref);
if (tbf == NULL) {
LOGP_GPRS(gprs, LOGL_ERROR,
"%s(): " LOG_TBF_FMT " not found\n",
@@ -168,6 +185,24 @@
l1gprs_tbf_free(tbf);
}

+/* Check the list of pending TBFs and move those with expired Fn to the active list */
+static void l1gprs_check_pending_tbfs(struct l1gprs_state *gprs, uint32_t fn)
+{
+ struct l1gprs_tbf *tbf, *tmp;
+
+ llist_for_each_entry_safe(tbf, tmp, &gprs->tbf_list_pending, list) {
+ if (tbf->start_fn < fn) /* XXX: see 3GPP TS 44.018 section 10.5.2.38 */
+ continue;
+
+ LOGP_GPRS(gprs, LOGL_INFO,
+ LOG_TBF_FMT " becomes active\n",
+ LOG_TBF_ARGS(tbf));
+
+ tbf->start_fn = fn;
+ l1gprs_register_tbf(gprs, tbf);
+ }
+}
+
#define L1GPRS_L1CTL_MSGB_SIZE 256
#define L1GPRS_L1CTL_MSGB_HEADROOM 32

@@ -286,11 +321,12 @@
}

LOGP_GPRS(gprs, LOGL_INFO,
- "Rx Uplink TBF config: tbf_ref=%u, slotmask=0x%02x\n",
- req->tbf_ref, req->slotmask);
+ "Rx UL TBF config: " LOG_TBF_CFG_REQ_FMT "\n",
+ LOG_TBF_CFG_REQ_ARGS(req));

if (req->slotmask != 0x00) {
- tbf = l1gprs_tbf_alloc(gprs, true, req->tbf_ref, req->slotmask);
+ tbf = l1gprs_tbf_alloc(gprs, true, req->tbf_ref,
+ req->slotmask, ntohl(req->start_fn));
l1gprs_register_tbf(gprs, tbf);
} else {
l1gprs_unregister_tbf(gprs, true, req->tbf_ref);
@@ -314,8 +350,8 @@
}

LOGP_GPRS(gprs, LOGL_INFO,
- "Rx Downlink TBF config: tbf_ref=%u, slotmask=0x%02x, dl_tfi=%u\n",
- req->tbf_ref, req->slotmask, req->dl_tfi);
+ "Rx DL TBF config: " LOG_TBF_CFG_REQ_FMT ", dl_tfi=%u\n",
+ LOG_TBF_CFG_REQ_ARGS(req), req->dl_tfi);

if (req->dl_tfi > 31) {
LOGP_GPRS(gprs, LOGL_ERROR,
@@ -325,7 +361,8 @@
}

if (req->slotmask != 0x00) {
- tbf = l1gprs_tbf_alloc(gprs, false, req->tbf_ref, req->slotmask);
+ tbf = l1gprs_tbf_alloc(gprs, false, req->tbf_ref,
+ req->slotmask, ntohl(req->start_fn));
tbf->dl_tfi = req->dl_tfi;
l1gprs_register_tbf(gprs, tbf);
} else {
@@ -409,6 +446,8 @@
BLOCK_IND_IS_PTCCH(ind) ? "PTCCH" : "PDTCH",
ind->hdr.fn, ind->data_len, osmo_hexdump(ind->data, ind->data_len));

+ l1gprs_check_pending_tbfs(gprs, ind->hdr.fn);
+
if ((pdch->ul_tbf_count == 0) && (pdch->dl_tbf_count == 0)) {
LOGP_PDCH(pdch, LOGL_ERROR,
"Rx DL BLOCK.ind, but this PDCH has no configured TBFs\n");

To view, visit change 33223. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I174e3c43d2f4c828a528710b284e62c9bb794122
Gerrit-Change-Number: 33223
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de>
Gerrit-MessageType: newchange