pespin has submitted this change. ( https://gerrit.osmocom.org/c/libosmo-gprs/+/31351 )
Change subject: rlcmac: Handle SI13 from L1CTL ......................................................................
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(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved
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; }