<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/18387">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  pespin: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">BTS::parse_rach_ind(): properly handle EGPRS Packet Channel Request<br><br>Let's finally use the API we introduced in [1].<br><br>[1] I96df3352856933c9140177b2801a2c71f4134183<br><br>Change-Id: Ia15761c33c8048d35c7f7bc93dbea781dd0894b7<br>Related: OS#1548<br>---<br>M src/bts.cpp<br>1 file changed, 56 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/bts.cpp b/src/bts.cpp</span><br><span>index 2a74978..26cb258 100644</span><br><span>--- a/src/bts.cpp</span><br><span>+++ b/src/bts.cpp</span><br><span>@@ -685,9 +685,57 @@</span><br><span>  * can only receive EGPRS mslot class through 11-bit EGPRS PACKET CHANNEL REQUEST. */</span><br><span> static int parse_egprs_pkt_ch_req(uint16_t ra11, struct chan_req_params *chan_req)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        /* EGPRS multislot class is only present in One Phase Access Request */</span><br><span style="color: hsl(0, 100%, 40%);">- if ((ra11 >> 10) == 0x00) /* .0xx xxx. .... */</span><br><span style="color: hsl(0, 100%, 40%);">-            chan_req->egprs_mslot_class = ((ra11 & 0x3e0) >> 5) + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ EGPRS_PacketChannelRequest_t req;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = decode_egprs_pkt_ch_req(ra11, &req);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DRLCMAC, LOGL_NOTICE, "Failed to decode "</span><br><span style="color: hsl(120, 100%, 40%);">+                   "EGPRS Packet Channel Request: rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+          return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DRLCMAC, LOGL_INFO, "Rx EGPRS Packet Channel Request: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+        get_value_string(egprs_pkt_ch_req_type_names, req.Type));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (req.Type) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case EGPRS_PKT_CHAN_REQ_ONE_PHASE:</span><br><span style="color: hsl(120, 100%, 40%);">+            chan_req->egprs_mslot_class = req.Content.MultislotClass + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+              chan_req->priority = req.Content.Priority + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case EGPRS_PKT_CHAN_REQ_SHORT:</span><br><span style="color: hsl(120, 100%, 40%);">+                chan_req->priority = req.Content.Priority + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (req.Content.NumberOfBlocks == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  chan_req->single_block = true;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case EGPRS_PKT_CHAN_REQ_ONE_PHASE_RED_LATENCY:</span><br><span style="color: hsl(120, 100%, 40%);">+                chan_req->priority = req.Content.Priority + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Two phase access => single block is needed */</span><br><span style="color: hsl(120, 100%, 40%);">+   case EGPRS_PKT_CHAN_REQ_TWO_PHASE:</span><br><span style="color: hsl(120, 100%, 40%);">+    case EGPRS_PKT_CHAN_REQ_TWO_PHASE_IPA:</span><br><span style="color: hsl(120, 100%, 40%);">+                chan_req->priority = req.Content.Priority + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             chan_req->single_block = true;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Signalling => single block is needed */</span><br><span style="color: hsl(120, 100%, 40%);">+ case EGPRS_PKT_CHAN_REQ_SIGNALLING:</span><br><span style="color: hsl(120, 100%, 40%);">+   case EGPRS_PKT_CHAN_REQ_SIGNALLING_IPA:</span><br><span style="color: hsl(120, 100%, 40%);">+               chan_req->single_block = true;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Neither unacknowledged RLC mode, nor emergency calls are supported */</span><br><span style="color: hsl(120, 100%, 40%);">+      case EGPRS_PKT_CHAN_REQ_ONE_PHASE_UNACK:</span><br><span style="color: hsl(120, 100%, 40%);">+      case EGPRS_PKT_CHAN_REQ_EMERGENCY_CALL:</span><br><span style="color: hsl(120, 100%, 40%);">+       case EGPRS_PKT_CHAN_REQ_DEDICATED_CHANNEL:</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DRLCMAC, LOGL_NOTICE, "%s is not supported, rejecting\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   get_value_string(egprs_pkt_ch_req_type_names, req.Type));</span><br><span style="color: hsl(120, 100%, 40%);">+                return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DRLCMAC, LOGL_ERROR, "Unknown EGPRS Packet Channel Request "</span><br><span style="color: hsl(120, 100%, 40%);">+                "type=0x%02x, probably a bug in CSN.1 codec\n", req.Type);</span><br><span style="color: hsl(120, 100%, 40%);">+             return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        return 0;</span><br><span> }</span><br><span>@@ -774,6 +822,11 @@</span><br><span>                chan_req.single_block = true;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: handle Radio Priority (see 3GPP TS 44.060, table 11.2.5a.5) */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (chan_req.priority > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DRLCMAC, LOGL_NOTICE, "EGPRS Packet Channel Request indicates "</span><br><span style="color: hsl(120, 100%, 40%);">+                     "Radio Priority %u, however we ignore it\n", chan_req.priority);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* Should we allocate a single block or an Uplink TBF? */</span><br><span>    if (chan_req.single_block) {</span><br><span>                 rc = sba()->alloc(&trx_no, &ts_no, &sb_fn, ta);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/18387">change 18387</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-pcu/+/18387"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia15761c33c8048d35c7f7bc93dbea781dd0894b7 </div>
<div style="display:none"> Gerrit-Change-Number: 18387 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>