fixeria has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmocom-bb/+/31571 )


Change subject: layer23: implement Rx/Tx API for GPRS related messages
......................................................................

layer23: implement Rx/Tx API for GPRS related messages

Change-Id: I87950e893ef96ff8328f43f1548111aa9f66439b
Related: OS#5500
---
M src/host/layer23/include/osmocom/bb/common/l1ctl.h
M src/host/layer23/include/osmocom/bb/common/ms.h
M src/host/layer23/src/common/l1ctl.c
3 files changed, 128 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/71/31571/1

diff --git a/src/host/layer23/include/osmocom/bb/common/l1ctl.h 
b/src/host/layer23/include/osmocom/bb/common/l1ctl.h
index 5b20506..a151a98 100644
--- a/src/host/layer23/include/osmocom/bb/common/l1ctl.h
+++ b/src/host/layer23/include/osmocom/bb/common/l1ctl.h
@@ -75,4 +75,16 @@
 /* Transmit L1CTL_NEIGH_PM_REQ */
 int l1ctl_tx_neigh_pm_req(struct osmocom_ms *ms, int num, uint16_t *arfcn);

+/* Transmit L1CTL_GPRS_UL_BLOCK_REQ */
+int l1ctl_tx_gprs_ul_block_req(struct osmocom_ms *ms, uint32_t fn, uint8_t tn,
+                              const uint8_t *data, size_t data_len);
+
+/* Transmit L1CTL_GPRS_UL_TBF_CFG_REQ */
+int l1ctl_tx_gprs_ul_tbf_cfg_req(struct osmocom_ms *ms, uint8_t tbf_nr,
+                                uint8_t slotmask);
+
+/* Transmit L1CTL_GPRS_DL_TBF_CFG_REQ */
+int l1ctl_tx_gprs_dl_tbf_cfg_req(struct osmocom_ms *ms, uint8_t tbf_nr,
+                                uint8_t slotmask, uint8_t dl_tfi);
+
 #endif
diff --git a/src/host/layer23/include/osmocom/bb/common/ms.h 
b/src/host/layer23/include/osmocom/bb/common/ms.h
index 30bb514..e4888a7 100644
--- a/src/host/layer23/include/osmocom/bb/common/ms.h
+++ b/src/host/layer23/include/osmocom/bb/common/ms.h
@@ -36,6 +36,7 @@

 struct osmol1_entity {
        int (*l1_traffic_ind)(struct osmocom_ms *ms, struct msgb *msg);
+       int (*l1_gprs_dl_block_ind)(struct osmocom_ms *ms, struct msgb *msg);
 };

 struct osmomncc_entity {
diff --git a/src/host/layer23/src/common/l1ctl.c 
b/src/host/layer23/src/common/l1ctl.c
index 34051fd..0d85625 100644
--- a/src/host/layer23/src/common/l1ctl.c
+++ b/src/host/layer23/src/common/l1ctl.c
@@ -978,6 +978,108 @@
        return 0;
 }

+/* Receive L1CTL_GPRS_DL_BLOCK_IND */
+static int rx_l1_gprs_dl_block_ind(struct osmocom_ms *ms, struct msgb *msg)
+{
+       struct l1ctl_gprs_dl_block_ind *ind = (void *)msg->l1h;
+
+       if (msgb_l1len(msg) < sizeof(*ind)) {
+               LOGP(DL1C, LOGL_ERROR,
+                    "Rx malformed L1CTL_GPRS_DL_BLOCK_IND (len=%u < %zu)\n",
+                    msgb_l1len(msg), sizeof(*ind));
+               return -EINVAL;
+       }
+       if (OSMO_UNLIKELY(ind->hdr.tn >= 8)) {
+               LOGP(DL1C, LOGL_ERROR,
+                    "Rx malformed L1CTL_GPRS_DL_BLOCK_IND (TDMA Tn=%u)\n",
+                    ind->hdr.tn);
+               return -EINVAL;
+       }
+
+       msg->l2h = (void *)&ind->data[0];
+
+       DEBUGP(DL1C, "Rx GPRS DL block (flags=0x%02x, fn=%u, tn=%u, len=%u): 
%s\n",
+              ind->hdr.flags, osmo_load32be(&ind->hdr.fn), ind->hdr.tn,
+              msgb_l2len(msg), msgb_hexdump_l2(msg));
+
+       /* distribute or drop */
+       if (ms->l1_entity.l1_gprs_dl_block_ind)
+               return ms->l1_entity.l1_gprs_dl_block_ind(ms, msg);
+
+       msgb_free(msg);
+       return 0;
+}
+
+/* Transmit L1CTL_GPRS_UL_BLOCK_REQ */
+int l1ctl_tx_gprs_ul_block_req(struct osmocom_ms *ms, uint32_t fn, uint8_t tn,
+                              const uint8_t *data, size_t data_len)
+{
+       struct l1ctl_gprs_ul_block_req *req;
+       struct msgb *msg;
+
+       msg = osmo_l1_alloc(L1CTL_GPRS_UL_BLOCK_REQ);
+       if (!msg)
+               return -ENOMEM;
+
+       req = (void *)msgb_put(msg, sizeof(*req));
+       req->hdr.fn = fn;
+       req->hdr.tn = tn;
+       if (data_len > 0)
+               memcpy(msgb_put(msg, data_len), data, data_len);
+
+       DEBUGP(DL1C, "Tx GPRS UL block (flags=0x%02x, fn=%u, tn=%u, len=%zu): 
%s\n",
+              req->hdr.flags, fn, tn, data_len, osmo_hexdump(data, data_len));
+
+       return osmo_send_l1(ms, msg);
+}
+
+/* Transmit L1CTL_GPRS_UL_TBF_CFG_REQ */
+int l1ctl_tx_gprs_ul_tbf_cfg_req(struct osmocom_ms *ms, uint8_t tbf_nr,
+                                uint8_t slotmask)
+{
+       struct l1ctl_gprs_ul_tbf_cfg_req *req;
+       struct msgb *msg;
+
+       msg = osmo_l1_alloc(L1CTL_GPRS_UL_TBF_CFG_REQ);
+       if (!msg)
+               return -ENOMEM;
+
+       req = (void *)msgb_put(msg, sizeof(*req));
+       *req = (struct l1ctl_gprs_ul_tbf_cfg_req) {
+               .tbf_nr = tbf_nr,
+               .slotmask = slotmask,
+       };
+
+       DEBUGP(DL1C, "Tx GPRS UL TBF CFG (tbf_nr=%u, slotmask=0x%02x)\n",
+              tbf_nr, slotmask);
+
+       return osmo_send_l1(ms, msg);
+}
+
+/* Transmit L1CTL_GPRS_DL_TBF_CFG_REQ */
+int l1ctl_tx_gprs_dl_tbf_cfg_req(struct osmocom_ms *ms, uint8_t tbf_nr,
+                                uint8_t slotmask, uint8_t dl_tfi)
+{
+       struct l1ctl_gprs_dl_tbf_cfg_req *req;
+       struct msgb *msg;
+
+       msg = osmo_l1_alloc(L1CTL_GPRS_DL_TBF_CFG_REQ);
+       if (!msg)
+               return -ENOMEM;
+
+       req = (void *)msgb_put(msg, sizeof(*req));
+       *req = (struct l1ctl_gprs_dl_tbf_cfg_req) {
+               .tbf_nr = tbf_nr,
+               .slotmask = slotmask,
+               .dl_tfi = dl_tfi,
+       };
+
+       DEBUGP(DL1C, "Tx GPRS DL TBF CFG (tbf_nr=%u, slotmask=0x%02x, 
dl_tfi=%u)\n",
+              tbf_nr, slotmask, dl_tfi);
+
+       return osmo_send_l1(ms, msg);
+}
+
 /* Receive incoming data from L1 using L1CTL format */
 int l1ctl_recv(struct osmocom_ms *ms, struct msgb *msg)
 {
@@ -1046,6 +1148,9 @@
        case L1CTL_TRAFFIC_CONF:
                msgb_free(msg);
                break;
+       case L1CTL_GPRS_DL_BLOCK_IND:
+               rc = rx_l1_gprs_dl_block_ind(ms, msg);
+               break;
        default:
                LOGP(DL1C, LOGL_ERROR, "Unknown MSG: %u\n", hdr->msg_type);
                msgb_free(msg);

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

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I87950e893ef96ff8328f43f1548111aa9f66439b
Gerrit-Change-Number: 31571
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanits...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to