pespin has uploaded this change for review. ( 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, 32 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/51/31351/1
diff --git a/include/osmocom/gprs/rlcmac/rlcmac_private.h b/include/osmocom/gprs/rlcmac/rlcmac_private.h index 80461da..ffa6b8a 100644 --- a/include/osmocom/gprs/rlcmac/rlcmac_private.h +++ b/include/osmocom/gprs/rlcmac/rlcmac_private.h @@ -7,6 +7,7 @@
#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> @@ -73,6 +74,11 @@ struct { struct gprs_rlcmac_pdch_ulc *ulc[8]; } sched; + + /* Last SI13 received from BCCH: */ + bool si13_available; + uint8_t si13[GSM_MACBLOCK_LEN]; + struct osmo_gsm48_si13_info si13_ro_decoded; };
extern struct gprs_rlcmac_ctx *g_ctx; @@ -82,6 +88,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..7d92279 100644 --- a/src/rlcmac/rlcmac.c +++ b/src/rlcmac/rlcmac.c @@ -299,6 +299,23 @@ return rc; }
+int gprs_rlcmac_handle_bcch_si13(const struct gsm48_system_information_type_13 *si13) +{ + int rc; + + memcpy(g_ctx->si13, si13, GSM_MACBLOCK_LEN); + + rc = osmo_gsm48_rest_octets_si13_decode(&g_ctx->si13_ro_decoded, si13->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; }