aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2020-10-11 20:04:04 +0200
committerHarald Welte <laforge@osmocom.org>2020-10-15 08:01:43 +0200
commit5e1cd5e4115b9af5973da900e82a8aa913a26d1e (patch)
tree6745c0e7106d0e1042720e3f27b88e63b0e2fc86
parentb85c87aec602c83a728742182e5b62222278215c (diff)
gsm48_rest_octets: Add parser for SI4 rest octets
Introduces osmo_gsm48_rest_octets_si4_decode() Change-Id: I9d6ed06731ae15fdcef1a1f397d6ac2b7b1ca980 Related: OS#3075
-rw-r--r--include/osmocom/gsm/gsm48_rest_octets.h3
-rw-r--r--src/gsm/gsm48_rest_octets.c43
-rw-r--r--src/gsm/libosmogsm.map1
3 files changed, 47 insertions, 0 deletions
diff --git a/include/osmocom/gsm/gsm48_rest_octets.h b/include/osmocom/gsm/gsm48_rest_octets.h
index d3bb878e..8f143be7 100644
--- a/include/osmocom/gsm/gsm48_rest_octets.h
+++ b/include/osmocom/gsm/gsm48_rest_octets.h
@@ -125,3 +125,6 @@ int osmo_gsm48_rest_octets_si13_encode(uint8_t *data, const struct osmo_gsm48_si
/* Parse SI3 Rest Octets */
void osmo_gsm48_rest_octets_si3_decode(struct osmo_gsm48_si_ro_info *si3, const uint8_t *data);
+
+/* Parse SI4 Rest Octets */
+void osmo_gsm48_rest_octets_si4_decode(struct osmo_gsm48_si_ro_info *si4, const uint8_t *data, int len);
diff --git a/src/gsm/gsm48_rest_octets.c b/src/gsm/gsm48_rest_octets.c
index 3c1b22af..86f18b7b 100644
--- a/src/gsm/gsm48_rest_octets.c
+++ b/src/gsm/gsm48_rest_octets.c
@@ -1022,3 +1022,46 @@ void osmo_gsm48_rest_octets_si3_decode(struct osmo_gsm48_si_ro_info *si3, const
else
si3->si2quater_indicator = 0;
}
+
+
+void osmo_gsm48_rest_octets_si4_decode(struct osmo_gsm48_si_ro_info *si4, const uint8_t *data, int len)
+{
+ struct osmo_gsm48_si_selection_params *sp = &si4->selection_params;
+ struct osmo_gsm48_si_power_offset *po = &si4->power_offset;
+ struct osmo_gsm48_si3_gprs_ind *gi = &si4->gprs_ind;
+ struct bitvec bv;
+
+ memset(&bv, 0, sizeof(bv));
+ bv.data = (uint8_t *) data;
+ bv.data_len = len;
+
+ memset(si4, 0, sizeof(*si4));
+
+ /* Optional Selection Parameters */
+ if (bitvec_get_bit_high(&bv) == H) {
+ sp->present = 1;
+ sp->cbq = bitvec_get_uint(&bv, 1);
+ sp->cell_resel_off = bitvec_get_uint(&bv, 6);
+ sp->temp_offs = bitvec_get_uint(&bv, 3);
+ sp->penalty_time = bitvec_get_uint(&bv, 5);
+ } else {
+ sp->present = 0;
+ }
+
+ /* Optional Power Offset */
+ if (bitvec_get_bit_high(&bv) == H) {
+ po->present = 1;
+ po->power_offset = bitvec_get_uint(&bv, 2);
+ } else {
+ po->present = 0;
+ }
+
+ /* GPRS Indicator */
+ if (bitvec_get_bit_high(&bv) == H) {
+ gi->present = 1;
+ gi->ra_colour = bitvec_get_uint(&bv, 3);
+ gi->si13_position = bitvec_get_uint(&bv, 1);
+ } else {
+ gi->present = 0;
+ }
+}
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index dd28a158..031cc200 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -322,6 +322,7 @@ osmo_gsm48_rest_octets_si3_encode;
osmo_gsm48_rest_octets_si4_encode;
osmo_gsm48_rest_octets_si13_encode;
osmo_gsm48_rest_octets_si3_decode;
+osmo_gsm48_rest_octets_si4_decode;
gsm48_rr_msg_name;
gsm48_cc_state_name;
gsm48_construct_ra;