fixeria has submitted this change. ( 
https://gerrit.osmocom.org/c/osmocom-bb/+/30332 )

Change subject: mobile: properly handle RR CHANNEL MODE MODIFY message
......................................................................

mobile: properly handle RR CHANNEL MODE MODIFY message

According to 3GPP TS 04.08, section 3.4.6.1.3 "Abnormal cases"
of "channel mode modify procedure", if the MS doesn't support
the indicated channel mode, it shall retain the old mode and
return the associated channel mode information in the
ACKNOWLEDGE message.

Previously, if an indicated mode is not supported, we used to
indicate the 'CHAN_MODE_UNACCT' RR case without sending the
ACKNOWLEDGE message. Also, the result of gsm48_rr_set_mode()
was ignored. Let's fix this!

Change-Id: I952436ec796273e56341f9d3492b4a3b3a5dc410
Related: OS#5599
---
M src/host/layer23/src/mobile/gsm48_rr.c
1 file changed, 24 insertions(+), 8 deletions(-)

Approvals:
  Jenkins Builder: Verified
  fixeria: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve
  msuraev: Looks good to me, but someone else must approve



diff --git a/src/host/layer23/src/mobile/gsm48_rr.c 
b/src/host/layer23/src/mobile/gsm48_rr.c
index 236dbbe..9f159d8 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -3604,7 +3604,7 @@
        int payload_len = msgb_l3len(msg) - sizeof(*gh) - sizeof(*cm);
        struct gsm48_rr_cd *cd = &rr->cd_now;
        uint8_t ch_type, ch_subch, ch_ts;
-       uint8_t cause;
+       int rc;

        LOGP(DRR, LOGL_INFO, "CHANNEL MODE MODIFY\n");

@@ -3641,14 +3641,30 @@
                        gsm_print_arfcn(cd->arfcn), ch_ts, ch_subch, cd->tsc,
                        cm->mode);
        }
-       /* mode */
-       cause = gsm48_rr_check_mode(ms, cd->chan_nr, cm->mode);
-       if (cause)
-               return gsm48_rr_tx_rr_status(ms, cause);
-       cd->mode = cm->mode;
-       gsm48_rr_set_mode(ms, cd->chan_nr, cd->mode);

-       return gsm48_rr_tx_chan_modify_ack(ms, &cm->chan_desc, cm->mode);
+       /**
+        * According to 3GPP TS 04.08, section 3.4.6.1.3
+        * "Abnormal cases" of "channel mode modify procedure",
+        * if the MS doesn't support the indicated channel mode,
+        * it shall retain the old mode and return the associated
+        * channel mode information in the ACKNOWLEDGE message.
+        */
+
+       /* Check if we support this channel mode */
+       rc = gsm48_rr_check_mode(ms, cd->chan_nr, cm->mode);
+       if (rc)
+               goto ack;
+
+       /* Attempt to apply this mode */
+       rc = gsm48_rr_set_mode(ms, cd->chan_nr, cm->mode);
+       if (rc)
+               goto ack;
+
+       /* Finally set (a new) mode */
+       cd->mode = cm->mode;
+
+ack:
+       return gsm48_rr_tx_chan_modify_ack(ms, &cm->chan_desc, cd->mode);
 }

 /* 9.1.3 sending ASSIGNMENT COMPLETE */

--
To view, visit https://gerrit.osmocom.org/c/osmocom-bb/+/30332
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I952436ec796273e56341f9d3492b4a3b3a5dc410
Gerrit-Change-Number: 30332
Gerrit-PatchSet: 3
Gerrit-Owner: fixeria <vyanits...@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanits...@sysmocom.de>
Gerrit-Reviewer: laforge <lafo...@osmocom.org>
Gerrit-Reviewer: msuraev <msur...@sysmocom.de>
Gerrit-CC: fixeria <axilira...@gmail.com>
Gerrit-MessageType: merged

Reply via email to