jolly has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmocom-bb/+/34603?usp=email )
Change subject: Cleaning gsm48_mm_data_ind()
......................................................................
Cleaning gsm48_mm_data_ind()
Get rid of goto and double switch/case by putting connection handling
code into a separate function.
Change-Id: I12454cab06c105ccd9e2495e3a6f0640f2884885
---
M src/host/layer23/src/mobile/gsm48_mm.c
1 file changed, 59 insertions(+), 55 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/03/34603/1
diff --git a/src/host/layer23/src/mobile/gsm48_mm.c
b/src/host/layer23/src/mobile/gsm48_mm.c
index 092a984..cec798b 100644
--- a/src/host/layer23/src/mobile/gsm48_mm.c
+++ b/src/host/layer23/src/mobile/gsm48_mm.c
@@ -4628,61 +4628,16 @@
#define MMDATASLLEN \
(sizeof(mmdatastatelist) / sizeof(struct mmdatastate))
-static int gsm48_mm_data_ind(struct osmocom_ms *ms, struct msgb *msg)
+static int create_conn_and_push_mm_hdr(struct gsm48_mmlayer *mm, struct msgb *msg, int
rr_est, int rr_prim)
{
- struct gsm48_mmlayer *mm = &ms->mmlayer;
struct gsm48_rr_hdr *rrh = (struct gsm48_rr_hdr *)msg->data;
uint8_t sapi = rrh->sapi;
struct gsm48_hdr *gh = msgb_l3(msg);
uint8_t pdisc = gh->proto_discr & 0x0f;
- uint8_t msg_type = gh->msg_type & 0xbf;
uint8_t transaction_id;
uint32_t callref;
struct gsm48_mm_conn *conn;
struct gsm48_mmxx_hdr *mmh;
- int msg_supported = 0; /* determine, if message is supported at all */
- int rr_prim, rr_est = -1; /* no prim set */
- uint8_t skip_ind;
- int i, rc;
-
- /* 9.2.19 */
- if (msg_type == GSM48_MT_MM_NULL) {
- msgb_free(msg);
- return 0;
- }
-
- if (mm->state == GSM48_MM_ST_IMSI_DETACH_INIT) {
- LOGP(DMM, LOGL_NOTICE, "DATA IND ignored during IMSI "
- "detach.\n");
- msgb_free(msg);
- return 0;
- }
- /* pull the RR header */
- msgb_pull(msg, sizeof(struct gsm48_rr_hdr));
-
- /* create transaction (if not exists) and push message */
- switch (pdisc) {
- case GSM48_PDISC_CC:
- rr_prim = GSM48_MMCC_DATA_IND;
- rr_est = GSM48_MMCC_EST_IND;
- break;
- case GSM48_PDISC_NC_SS:
- rr_prim = GSM48_MMSS_DATA_IND;
- rr_est = GSM48_MMSS_EST_IND;
- break;
- case GSM48_PDISC_SMS:
- rr_prim = GSM48_MMSMS_DATA_IND;
- rr_est = GSM48_MMSMS_EST_IND;
- break;
- case GSM48_PDISC_GROUP_CC:
- rr_prim = GSM48_MMGCC_DATA_IND;
- break;
- case GSM48_PDISC_BCAST_CC:
- rr_prim = GSM48_MMBCC_DATA_IND;
- break;
- default:
- goto forward_msg;
- }
transaction_id = ((gh->proto_discr & 0xf0) ^ 0x80) >> 4; /* flip */
@@ -4699,16 +4654,13 @@
if (rr_est == -1) {
LOGP(DMM, LOGL_ERROR, "No MO connection for pdisc=%d,
transaction_id=%d\n",
pdisc, transaction_id);
- msgb_free(msg);
return -EINVAL;
}
conn = mm_conn_new(mm, pdisc, transaction_id, sapi, mm_conn_new_ref++);
rr_prim = rr_est;
}
- if (!conn) {
- msgb_free(msg);
+ if (!conn)
return -ENOMEM;
- }
callref = conn->ref;
}
@@ -4732,8 +4684,35 @@
new_mm_state(mm, GSM48_MM_ST_MM_CONN_ACTIVE, 0);
}
+ return 0;
+}
+
+static int gsm48_mm_data_ind(struct osmocom_ms *ms, struct msgb *msg)
+{
+ struct gsm48_mmlayer *mm = &ms->mmlayer;
+ struct gsm48_hdr *gh = msgb_l3(msg);
+ uint8_t pdisc = gh->proto_discr & 0x0f;
+ uint8_t msg_type = gh->msg_type & 0xbf;
+ int msg_supported = 0; /* determine, if message is supported at all */
+ uint8_t skip_ind;
+ int i, rc;
+
+ /* 9.2.19 */
+ if (msg_type == GSM48_MT_MM_NULL) {
+ msgb_free(msg);
+ return 0;
+ }
+
+ if (mm->state == GSM48_MM_ST_IMSI_DETACH_INIT) {
+ LOGP(DMM, LOGL_NOTICE, "DATA IND ignored during IMSI "
+ "detach.\n");
+ msgb_free(msg);
+ return 0;
+ }
+ /* pull the RR header */
+ msgb_pull(msg, sizeof(struct gsm48_rr_hdr));
+
/* forward message */
-forward_msg:
switch (pdisc) {
case GSM48_PDISC_MM:
skip_ind = (gh->proto_discr & 0xf0) >> 4;
@@ -4746,23 +4725,36 @@
break; /* follow the selection procedure below */
case GSM48_PDISC_CC:
- rc = gsm48_rcv_cc(ms, msg);
+ rc = create_conn_and_push_mm_hdr(mm, msg, GSM48_MMCC_EST_IND, GSM48_MMCC_DATA_IND);
+ if (rc == 0)
+ rc = gsm48_rcv_cc(ms, msg);
msgb_free(msg);
return rc;
case GSM48_PDISC_NC_SS:
- rc = gsm480_rcv_ss(ms, msg);
+ rc = create_conn_and_push_mm_hdr(mm, msg, GSM48_MMSS_EST_IND, GSM48_MMSS_DATA_IND);
+ if (rc == 0)
+ rc = gsm480_rcv_ss(ms, msg);
msgb_free(msg);
return rc;
case GSM48_PDISC_SMS:
- rc = gsm411_rcv_sms(ms, msg);
+ rc = create_conn_and_push_mm_hdr(mm, msg, GSM48_MMSMS_EST_IND, GSM48_MMSMS_DATA_IND);
+ if (rc == 0)
+ rc = gsm411_rcv_sms(ms, msg);
msgb_free(msg);
return rc;
case GSM48_PDISC_GROUP_CC:
+ rc = create_conn_and_push_mm_hdr(mm, msg, -1, GSM48_MMGCC_DATA_IND);
+ if (rc == 0)
+ rc = gsm44068_rcv_gcc_bcc(ms, msg);
+ msgb_free(msg);
+ return rc;
case GSM48_PDISC_BCAST_CC:
- rc = gsm44068_rcv_gcc_bcc(ms, msg);
+ rc = create_conn_and_push_mm_hdr(mm, msg, -1, GSM48_MMBCC_DATA_IND);
+ if (rc == 0)
+ rc = gsm44068_rcv_gcc_bcc(ms, msg);
msgb_free(msg);
return rc;
--
To view, visit
https://gerrit.osmocom.org/c/osmocom-bb/+/34603?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I12454cab06c105ccd9e2495e3a6f0640f2884885
Gerrit-Change-Number: 34603
Gerrit-PatchSet: 1
Gerrit-Owner: jolly <andreas(a)eversberg.eu>
Gerrit-MessageType: newchange