pespin submitted this change.
rlcmac: Handle SI13 from L1CTL
Change-Id: Ifaddf0e6e5cad7ea25672804c83c254579874813
---
M include/osmocom/gprs/rlcmac/rlcmac_private.h
M src/rlcmac/rlcmac.c
M src/rlcmac/rlcmac_prim.c
3 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/include/osmocom/gprs/rlcmac/rlcmac_private.h b/include/osmocom/gprs/rlcmac/rlcmac_private.h
index 80461da..e2d2494 100644
--- a/include/osmocom/gprs/rlcmac/rlcmac_private.h
+++ b/include/osmocom/gprs/rlcmac/rlcmac_private.h
@@ -7,10 +7,12 @@
#include <osmocom/core/msgb.h>
#include <osmocom/core/tdef.h>
+#include <osmocom/gsm/gsm48_rest_octets.h>
#include <osmocom/gprs/rlcmac/rlcmac_prim.h>
#include <osmocom/gprs/rlcmac/rlcmac.h>
#include <osmocom/gprs/rlcmac/coding_scheme.h>
+#include <osmocom/gprs/rlcmac/csn1_defs.h>
/* 3GPP TS 44.064 ยง 8.3 TLLI assignment procedures */
#define GPRS_RLCMAC_TLLI_UNASSIGNED (0xffffffff)
@@ -73,6 +75,11 @@
struct {
struct gprs_rlcmac_pdch_ulc *ulc[8];
} sched;
+
+ /* Last SI13 received from BCCH: */
+ bool si13_available;
+ uint8_t si13[GSM_MACBLOCK_LEN];
+ SI13_RestOctets_t si13ro;
};
extern struct gprs_rlcmac_ctx *g_ctx;
@@ -82,6 +89,7 @@
struct gprs_rlcmac_dl_tbf *gprs_rlcmac_find_dl_tbf_by_tfi(uint8_t dl_tfi);
struct gprs_rlcmac_ul_tbf *gprs_rlcmac_find_ul_tbf_by_tfi(uint8_t ul_tfi);
int gprs_rlcmac_handle_ccch_imm_ass(const struct gsm48_imm_ass *ia);
+int gprs_rlcmac_handle_bcch_si13(const struct gsm48_system_information_type_13 *si13);
int gprs_rlcmac_handle_gprs_dl_block(const struct osmo_gprs_rlcmac_prim *rlcmac_prim,
enum gprs_rlcmac_coding_scheme cs);
diff --git a/src/rlcmac/rlcmac.c b/src/rlcmac/rlcmac.c
index cff7c79..39e5c9e 100644
--- a/src/rlcmac/rlcmac.c
+++ b/src/rlcmac/rlcmac.c
@@ -299,6 +299,25 @@
return rc;
}
+int gprs_rlcmac_handle_bcch_si13(const struct gsm48_system_information_type_13 *si13)
+{
+ int rc;
+
+ LOGRLCMAC(LOGL_DEBUG, "Rx SI13 from lower layers\n");
+ memcpy(g_ctx->si13, si13, GSM_MACBLOCK_LEN);
+
+ rc = osmo_gprs_rlcmac_decode_si13ro(&g_ctx->si13ro, si13->rest_octets,
+ GSM_MACBLOCK_LEN - offsetof(struct gsm48_system_information_type_13, rest_octets));
+ if (rc < 0) {
+ LOGRLCMAC(LOGL_ERROR, "Error decoding SI13: %s\n",
+ osmo_hexdump((uint8_t *)si13, GSM_MACBLOCK_LEN));
+ return rc;
+ }
+
+ g_ctx->si13_available = true;
+ return rc;
+}
+
static int gprs_rlcmac_handle_pkt_ul_ack_nack(const struct osmo_gprs_rlcmac_prim *rlcmac_prim, const RlcMacDownlink_t *dl_block)
{
const Packet_Uplink_Ack_Nack_t *ack = &dl_block->u.Packet_Uplink_Ack_Nack;
diff --git a/src/rlcmac/rlcmac_prim.c b/src/rlcmac/rlcmac_prim.c
index 1707578..dcf4424 100644
--- a/src/rlcmac/rlcmac_prim.c
+++ b/src/rlcmac/rlcmac_prim.c
@@ -495,10 +495,16 @@
/* TODO: check if it's IMM_ASS: */
int rc;
- if (rlcmac_prim->l1ctl.ccch_data_ind.data[2] == GSM48_MT_RR_IMM_ASS)
+ switch (rlcmac_prim->l1ctl.ccch_data_ind.data[2]) {
+ case GSM48_MT_RR_IMM_ASS:
rc = gprs_rlcmac_handle_ccch_imm_ass((struct gsm48_imm_ass *)rlcmac_prim->l1ctl.ccch_data_ind.data);
- else
+ break;
+ case GSM48_MT_RR_SYSINFO_13:
+ rc = gprs_rlcmac_handle_bcch_si13((struct gsm48_system_information_type_13 *)rlcmac_prim->l1ctl.ccch_data_ind.data);
+ break;
+ default:
rc = -ENOTSUP;
+ }
return rc;
}
To view, visit change 31351. To unsubscribe, or for help writing mail filters, visit settings.