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 <andr...@eversberg.eu>
Gerrit-MessageType: newchange

Reply via email to