aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/gsm_04_08_utils.c
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-05-16 01:07:20 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-05-16 01:07:20 +0800
commit95defd542daa5bc3e012564e405d758860f427fe (patch)
tree63965dd7f8312d12d3c9369697146c267240d5ac /openbsc/src/gsm_04_08_utils.c
parent2d2a43f3d6c5880d6ff5eb22728f1f237af3ec6d (diff)
gsm48: Add a generic MI from classmark+mi extraction.
This is a generic MI extraction for the MI if it is followed after a classmark. For the Phase1 Phones the classmark2 is not four bytes but it might be different. This code can be used by the CM Service Request handling as well.
Diffstat (limited to 'openbsc/src/gsm_04_08_utils.c')
-rw-r--r--openbsc/src/gsm_04_08_utils.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/openbsc/src/gsm_04_08_utils.c b/openbsc/src/gsm_04_08_utils.c
index be26aa36c..c54bdd310 100644
--- a/openbsc/src/gsm_04_08_utils.c
+++ b/openbsc/src/gsm_04_08_utils.c
@@ -285,23 +285,30 @@ int send_siemens_mrpci(struct gsm_lchan *lchan,
return rsl_siemens_mrpci(lchan, &mrpci);
}
-int gsm48_paging_extract_mi(struct gsm48_pag_resp *resp, int length,
- char *mi_string, u_int8_t *mi_type)
+int gsm48_extract_mi(uint8_t *classmark2_lv, int length, char *mi_string, uint8_t *mi_type)
{
- u_int8_t *classmark2_lv = (uint8_t *) &resp->classmark2;
-
/* Check the size for the classmark */
- if (length < 2 + *classmark2_lv)
+ if (length < 1 + *classmark2_lv)
return -1;
u_int8_t *mi_lv = classmark2_lv + *classmark2_lv + 1;
- if (length < 3 + *classmark2_lv + mi_lv[0])
+ if (length < 2 + *classmark2_lv + mi_lv[0])
return -2;
*mi_type = mi_lv[1] & GSM_MI_TYPE_MASK;
return gsm48_mi_to_string(mi_string, GSM48_MI_SIZE, mi_lv+1, *mi_lv);
}
+int gsm48_paging_extract_mi(struct gsm48_pag_resp *resp, int length,
+ char *mi_string, u_int8_t *mi_type)
+{
+ static const uint32_t classmark_offset =
+ offsetof(struct gsm48_pag_resp, classmark2);
+ u_int8_t *classmark2_lv = (uint8_t *) &resp->classmark2;
+ return gsm48_extract_mi(classmark2_lv, length - classmark_offset,
+ mi_string, mi_type);
+}
+
int gsm48_handle_paging_resp(struct msgb *msg, struct gsm_subscriber *subscr)
{
struct gsm_bts *bts = msg->lchan->ts->trx->bts;