aboutsummaryrefslogtreecommitdiffstats
path: root/src/gsm_04_08.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-02-06 12:02:13 +0000
committerHarald Welte <laforge@gnumonks.org>2009-02-06 12:02:13 +0000
commit2d35ae6d3bab5d44197907849ba189f53fc693b1 (patch)
treeeab189b05e2389e2d89001a939790bccee46f4df /src/gsm_04_08.c
parent1cbfaf508a25b615171cec73c8bbd2f41fc9b764 (diff)
implement parsing of PAGING RESPONSE
Diffstat (limited to 'src/gsm_04_08.c')
-rw-r--r--src/gsm_04_08.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c
index 9159f9e17..6f75d839c 100644
--- a/src/gsm_04_08.c
+++ b/src/gsm_04_08.c
@@ -649,10 +649,45 @@ static int gsm0408_rcv_mm(struct msgb *msg)
return rc;
}
+/* Receive a PAGING RESPONSE message from the MS */
+static int gsm48_rr_rx_pag_resp(struct msgb *msg)
+{
+ struct gsm48_hdr *gh = msgb_l3(msg);
+ struct gsm48_paging_response *pr =
+ (struct gsm48_paging_response *) gh->data;
+ u_int8_t mi_type = pr->mi[0] & GSM_MI_TYPE_MASK;
+ char mi_string[MI_SIZE];
+ struct gsm_subscriber *subscr;
+ int rc = 0;
+
+ mi_to_string(mi_string, sizeof(mi_string), &pr->mi[0], pr->mi_len);
+ DEBUGP(DRR, "PAGING RESPONSE: mi_type=0x%02x MI(%s)\n",
+ mi_type, mi_string);
+ subscr = subscr_get_by_tmsi(mi_string);
+
+ if (!subscr) {
+ DEBUGP(DRR, "<- Can't find any subscriber for this ID\n");
+ /* FIXME: close channel? */
+ return -EINVAL;
+ }
+ DEBUGP(DRR, "<- Channel was requested by %s\n",
+ subscr->name ? subscr->name : subscr->imsi);
+
+ if (!msg->lchan->subscr)
+ msg->lchan->subscr = subscr;
+ else if (msg->lchan->subscr != subscr) {
+ DEBUGP(DRR, "<- Channel already owned by someone else?\n");
+ subscr_put(subscr);
+ }
+
+ return rc;
+}
+
/* Receive a GSM 04.08 Radio Resource (RR) message */
static int gsm0408_rcv_rr(struct msgb *msg)
{
struct gsm48_hdr *gh = msgb_l3(msg);
+ int rc = 0;
switch (gh->msg_type) {
case GSM48_MT_RR_CLSM_CHG:
@@ -663,13 +698,15 @@ static int gsm0408_rcv_rr(struct msgb *msg)
DEBUGP(DRR, "GRPS SUSPEND REQUEST\n");
break;
case GSM48_MT_RR_PAG_RESP:
+ rc = gsm48_rr_rx_pag_resp(msg);
+ break;
default:
- fprintf(stderr, "Unimplemented GSM 04.08 msg type 0x%02x\n",
+ fprintf(stderr, "Unimplemented GSM 04.08 RR msg type 0x%02x\n",
gh->msg_type);
break;
}
- return 0;
+ return rc;
}
/* Call Control */
@@ -816,7 +853,7 @@ static int gsm0408_rcv_cc(struct msgb *msg)
/* FIXME: continue with CALL_PROCEEDING, ALERTING, CONNECT, RELEASE_COMPLETE */
break;
default:
- fprintf(stderr, "Unimplemented GSM 04.08 msg type 0x%02x\n",
+ fprintf(stderr, "Unimplemented GSM 04.08 CC msg type 0x%02x\n",
msg_type);
break;
}