aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-05-16 01:13:28 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-06-15 20:24:20 +0800
commit66e1ef73c83844a26159befbcfb920d74c8741d5 (patch)
tree85182d97ca37332705ade09bd59bbf004e069457 /openbsc
parent1f38747cf12ffcf361aef163fe098bd1a6c5357d (diff)
[nat] Use the new gsm48 method to parse the MI followed by a classmark.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/src/nat/bsc_nat_utils.c31
1 files changed, 9 insertions, 22 deletions
diff --git a/openbsc/src/nat/bsc_nat_utils.c b/openbsc/src/nat/bsc_nat_utils.c
index ca7a4c642..18fac0cca 100644
--- a/openbsc/src/nat/bsc_nat_utils.c
+++ b/openbsc/src/nat/bsc_nat_utils.c
@@ -259,15 +259,15 @@ static int _cr_check_loc_upd(struct bsc_connection *bsc, uint8_t *data, unsigned
static int _cr_check_cm_serv_req(struct bsc_connection *bsc, uint8_t *data, unsigned int length)
{
+ static const uint32_t classmark_offset =
+ offsetof(struct gsm48_service_request, classmark);
+
char mi_string[GSM48_MI_SIZE];
+ uint8_t mi_type;
+ int rc;
struct gsm48_service_request *req;
/* unfortunately in Phase1 the classmark2 length is variable */
- uint8_t classmark2_len;
- uint8_t *classmark2;
- uint8_t mi_len;
- uint8_t *mi;
- uint8_t mi_type;
if (length < sizeof(*req)) {
LOGP(DNAT, LOGL_ERROR,
@@ -276,30 +276,17 @@ static int _cr_check_cm_serv_req(struct bsc_connection *bsc, uint8_t *data, unsi
}
req = (struct gsm48_service_request *) data;
- classmark2_len = ((uint8_t *) &req->classmark)[0];
- if (length < 2 + classmark2_len) {
- LOGP(DNAT, LOGL_ERROR,
- "Classmark2 does not fit. cml: %d\n", classmark2_len);
+ rc = gsm48_extract_mi((uint8_t *) &req->classmark,
+ length - classmark_offset, mi_string, &mi_type);
+ if (rc < 0) {
+ LOGP(DNAT, LOGL_ERROR, "Failed to parse the classmark2/mi. error: %d\n", rc);
return -1;
}
- classmark2 = ((uint8_t *) &req->classmark) + 1;
- mi_len = *(classmark2 + classmark2_len);
- if (length < 3 + classmark2_len + mi_len) {
- LOGP(DNAT, LOGL_ERROR,
- "MI does not fit length: %d vs. %d\n",
- length, 3 + classmark2_len + mi_len);
- return -1;
- }
-
- mi = (classmark2 + classmark2_len + 1);
- mi_type = mi[0] & GSM_MI_TYPE_MASK;
-
/* we have to let the TMSI or such pass */
if (mi_type != GSM_MI_TYPE_IMSI)
return 0;
- gsm48_mi_to_string(mi_string, sizeof(mi_string), mi, mi_len);
return auth_imsi(bsc, mi_string);
}