Hello Neels Hofmeyr, Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/7960

to look at the new patch set (#2).

lapdm: Implement SABM related constraints

* MO SAPI0 establishment *must always* have L3 payload for contention
  resolution
* SAPI3 establishment *must never* use contention resolution
* MT establish must never use contention resolution

Change-Id: I8c2c103cdc7f9a45d7b2080c572f559fc3db58e4
Closes: OS#2370
---
M src/gsm/lapdm.c
1 file changed, 45 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/60/7960/2

diff --git a/src/gsm/lapdm.c b/src/gsm/lapdm.c
index ae21ccd..1e81bff 100644
--- a/src/gsm/lapdm.c
+++ b/src/gsm/lapdm.c
@@ -48,6 +48,8 @@
 #include <osmocom/gsm/protocol/gsm_04_08.h>
 #include <osmocom/gsm/protocol/gsm_08_58.h>
 
+#define LAPD_U_SABM 0x7
+
 /* TS 04.06 Figure 4 / Section 3.2 */
 #define LAPDm_LPD_NORMAL  0
 #define LAPDm_LPD_SMSCB          1
@@ -537,6 +539,42 @@
        return rc;
 }
 
+/* determine if receiving a given LAPDm message is not permitted */
+static int lapdm_rx_not_permitted(const struct lapdm_entity *le,
+                                 const struct lapd_msg_ctx *lctx)
+{
+       /* we currently only implement SABM related checks here */
+       if (lctx->format != LAPD_FORM_U || lctx->s_u != LAPD_U_SABM)
+               return 0;
+
+       if (le->mode == LAPDM_MODE_BTS) {
+               if (le == &le->lapdm_ch->lapdm_acch) {
+                       /* no contention resolution on SACCH */
+                       if (lctx->length > 0)
+                               return RLL_CAUSE_SABM_INFO_NOTALL;
+               } else {
+                       switch (lctx->sapi) {
+                       case 0:
+                               /* SAPI0 must use contention resolution, i.e. 
L3 payload must exist */
+                               if (lctx->length == 0)
+                                       return RLL_CAUSE_UFRM_INC_PARAM;
+                               break;
+                       case 3:
+                               /* SAPI3 doesn't support contention resolution 
*/
+                               if (lctx->length > 0)
+                                       return RLL_CAUSE_SABM_INFO_NOTALL;
+                               break;
+                       }
+               }
+       } else if (le->mode == LAPDM_MODE_MS) {
+               /* contention resolution (L3 present) is only sent by MS, but
+                * never received by it */
+               if (lctx->length > 0)
+                       return RLL_CAUSE_SABM_INFO_NOTALL;
+       }
+       return 0;
+}
+
 /* input into layer2 (from layer 1) */
 static int l2_ph_data_ind(struct msgb *msg, struct lapdm_entity *le,
        uint8_t chan_nr, uint8_t link_id)
@@ -674,6 +712,13 @@
                }
                /* store context for messages from lapd */
                memcpy(&mctx.dl->mctx, &mctx, sizeof(mctx.dl->mctx));
+               rc =lapdm_rx_not_permitted(le, &lctx);
+               if (rc > 0) {
+                       LOGP(DLLAPD, LOGL_NOTICE, "received message not 
permitted");
+                       msgb_free(msg);
+                       rsl_rll_error(rc, &mctx);
+                       return -EINVAL;
+               }
                /* send to LAPD */
                rc = lapd_ph_data_ind(msg, &lctx);
                break;

-- 
To view, visit https://gerrit.osmocom.org/7960
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I8c2c103cdc7f9a45d7b2080c572f559fc3db58e4
Gerrit-PatchSet: 2
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Neels Hofmeyr <nhofm...@sysmocom.de>
Gerrit-Reviewer: Vadim Yanitskiy <axilira...@gmail.com>

Reply via email to