Review at  https://gerrit.osmocom.org/6734

host/trxcon/l1ctl.c: handle L1CTL_DATA_REQ

Change-Id: Ia72fd3d55c86697ff144446bbae94f76839eb5a1
---
M src/host/trxcon/l1ctl.c
1 file changed, 68 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/34/6734/1

diff --git a/src/host/trxcon/l1ctl.c b/src/host/trxcon/l1ctl.c
index 34e4b3c..64e9d65 100644
--- a/src/host/trxcon/l1ctl.c
+++ b/src/host/trxcon/l1ctl.c
@@ -558,6 +558,72 @@
        return 0;
 }
 
+static int l1ctl_rx_data_req(struct l1ctl_link *l1l, struct msgb *msg)
+{
+       struct trx_ts *ts;
+       struct trx_ts_prim *prim;
+       struct l1ctl_info_ul *ul;
+       struct l1ctl_data_ind *data_ind;
+       enum trx_lchan_type lchan_type;
+       uint8_t chan_nr, tn;
+       size_t len;
+       int rc = 0;
+
+       ul = (struct l1ctl_info_ul *) msg->l1h;
+       data_ind = (struct l1ctl_data_ind *) ul->payload;
+       chan_nr = ul->chan_nr;
+
+       LOGP(DL1C, LOGL_DEBUG, "Recv Data Req (chan_nr=0x%02x)\n", chan_nr);
+
+       /* Determine TS index */
+       tn = chan_nr & 0x7;
+       if (tn > 7) {
+               LOGP(DL1C, LOGL_ERROR, "Incorrect TS index %u\n", tn);
+               rc = -EINVAL;
+               goto exit;
+       }
+
+       /* Determine lchan type */
+       lchan_type = sched_trx_chan_nr2lchan_type(chan_nr);
+       if (!lchan_type) {
+               LOGP(DL1C, LOGL_ERROR, "Couldn't determine lchan type\n");
+               rc = -EINVAL;
+               goto exit;
+       }
+
+       /* Attempt to find required TS */
+       ts = sched_trx_find_ts(l1l->trx, tn);
+       if (ts == NULL) {
+               LOGP(DL1C, LOGL_DEBUG, "Couldn't find required TS\n");
+               rc = -EINVAL;
+               goto exit;
+       }
+
+       /* Allocate a new primitive */
+       len = sizeof(struct trx_ts_prim) + sizeof(struct l1ctl_info_ul) + 23;
+       prim = talloc_zero_size(ts, len);
+       if (prim == NULL) {
+               LOGP(DL1C, LOGL_ERROR, "Failed to allocate memory\n");
+               rc = -ENOMEM;
+               goto exit;
+       }
+
+       /* Set logical channel of primitive */
+       prim->chan = lchan_type;
+
+       /* Fill in both UL info and payload */
+       len = sizeof(struct l1ctl_info_ul);
+       memcpy(prim->payload, ul, len);
+       memcpy(prim->payload + len, data_ind, 23);
+
+       /* Add to TS queue */
+       llist_add_tail(&prim->list, &ts->tx_prims);
+
+exit:
+       msgb_free(msg);
+       return rc;
+}
+
 int l1ctl_rx_cb(struct l1ctl_link *l1l, struct msgb *msg)
 {
        struct l1ctl_hdr *l1h;
@@ -582,6 +648,8 @@
                return l1ctl_rx_dm_est_req(l1l, msg);
        case L1CTL_DM_REL_REQ:
                return l1ctl_rx_dm_rel_req(l1l, msg);
+       case L1CTL_DATA_REQ:
+               return l1ctl_rx_data_req(l1l, msg);
        default:
                LOGP(DL1C, LOGL_ERROR, "Unknown MSG: %u\n", l1h->msg_type);
                msgb_free(msg);

-- 
To view, visit https://gerrit.osmocom.org/6734
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia72fd3d55c86697ff144446bbae94f76839eb5a1
Gerrit-PatchSet: 1
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>

Reply via email to