aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2017-03-21 12:25:14 +0100
committerDaniel Willmann <dwillmann@sysmocom.de>2018-01-30 18:58:27 +0100
commitd7e05cedb6f0809f48bea1ae99edb804473464ad (patch)
treea2157f5965e1b3fc92faa490e859efcaeb1c8505 /openbsc/src
parente87b5a913e833d10afd1ee7775531d74d767740d (diff)
libfilter: Also handle detach indications
Change-Id: Iad4e2861f42d5275e2b3057ab2bc43ef43b61cfe Ticket: SYS#3208 Sponsored-by: On-Waves ehf.
Diffstat (limited to 'openbsc/src')
-rw-r--r--openbsc/src/libfilter/bsc_msg_filter.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/openbsc/src/libfilter/bsc_msg_filter.c b/openbsc/src/libfilter/bsc_msg_filter.c
index 115d376cb..ce346a4f1 100644
--- a/openbsc/src/libfilter/bsc_msg_filter.c
+++ b/openbsc/src/libfilter/bsc_msg_filter.c
@@ -295,6 +295,30 @@ static int _cr_check_pag_resp(void *ctx,
return 1;
}
+static int _cr_check_detach_ind(void *ctx,
+ uint8_t *data, unsigned int length, char **imsi)
+{
+ struct gsm48_imsi_detach_ind *ind;
+ char mi_string[GSM48_MI_SIZE];
+ uint8_t mi_type;
+
+ if (length < sizeof(*ind)) {
+ LOGP(DFILTER, LOGL_ERROR, "IMSI DETACH IND does not fit. Length was %d.\n", length);
+ return -1;
+ }
+
+ ind = (struct gsm48_imsi_detach_ind *) data;
+ mi_type = ind->mi[0] & GSM_MI_TYPE_MASK;
+
+ /* we need to let it pass for now */
+ if (mi_type != GSM_MI_TYPE_IMSI)
+ return 0;
+
+ gsm48_mi_to_string(mi_string, sizeof(mi_string), ind->mi, ind->mi_len);
+ *imsi = talloc_strdup(ctx, mi_string);
+ return 1;
+}
+
static int _dt_check_id_resp(struct bsc_filter_request *req,
uint8_t *data, unsigned int length,
struct bsc_filter_state *state,
@@ -357,6 +381,11 @@ int bsc_msg_filter_initial(struct gsm48_hdr *hdr48, size_t hdr48_len,
*con_type = FLT_CON_TYPE_PAG_RESP;
ret = _cr_check_pag_resp(req->ctx, &hdr48->data[0],
hdr48_len - sizeof(*hdr48), imsi);
+ } else if (proto == GSM48_PDISC_MM &&
+ msg_type == GSM48_MT_MM_IMSI_DETACH_IND) {
+ *con_type = FLT_CON_TYPE_OTHER;
+ ret = _cr_check_detach_ind(req->ctx, &hdr48->data[0],
+ hdr48_len - sizeof(*hdr48), imsi);
} else {
/* We only want to filter the above, let other things pass */
*con_type = FLT_CON_TYPE_OTHER;