aboutsummaryrefslogtreecommitdiffstats
path: root/src/gsm/gsm0808_utils.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2019-08-31 21:25:05 +0200
committerHarald Welte <laforge@gnumonks.org>2019-08-31 21:27:57 +0200
commitf2210030440d71a56940e02822532977609a1d05 (patch)
tree21ddd946f75a23733970cb37914186708065d3ce /src/gsm/gsm0808_utils.c
parentf89cbd0019393ed8aeefa8b633e330982c8ab126 (diff)
cbsp: Fix endless loop iteration when decoding cell list IEs
The CBSP code assumed that gsm0808_decode_cell_id_u() would return the number of bytes it has consumed/parsed. But it actually always returns '0', whcih makes us run in an endless loop :( Change-Id: I5758af4ec11a827d4b888a3a16c4ec22de90a7d6
Diffstat (limited to 'src/gsm/gsm0808_utils.c')
-rw-r--r--src/gsm/gsm0808_utils.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c
index 364a04fe..7416d8f5 100644
--- a/src/gsm/gsm0808_utils.c
+++ b/src/gsm/gsm0808_utils.c
@@ -767,6 +767,27 @@ int gsm0808_dec_encrypt_info(struct gsm0808_encrypt_info *ei,
return (int)(elem - old_elem);
}
+/* Return the size of the value part of a cell identifier of given type */
+int gsm0808_cell_id_size(enum CELL_IDENT discr)
+{
+ switch (discr) {
+ case CELL_IDENT_WHOLE_GLOBAL:
+ return 7;
+ case CELL_IDENT_LAC_AND_CI:
+ return 4;
+ case CELL_IDENT_CI:
+ return 2;
+ case CELL_IDENT_LAI_AND_LAC:
+ return 5;
+ case CELL_IDENT_LAC:
+ return 2;
+ case CELL_IDENT_BSS:
+ case CELL_IDENT_NO_CELL:
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
/*! Decode a single GSM 08.08 Cell ID list element payload
* \param[out] out caller-provided output union
* \param[in] discr Cell ID discriminator describing type to be decoded