<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/18387">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">BTS::parse_rach_ind(): properly handle EGPRS Packet Channel Request<br><br>Change-Id: Ia15761c33c8048d35c7f7bc93dbea781dd0894b7<br>---<br>M src/bts.cpp<br>1 file changed, 67 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/87/18387/1</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 934bdef..c305e22 100644</span><br><span>--- a/src/bts.cpp</span><br><span>+++ b/src/bts.cpp</span><br><span>@@ -671,9 +671,68 @@</span><br><span>  * deprecated, no PACKET CHANNEL REQUEST exists, which means for GPRS we will</span><br><span>  * receive CCCH RACH which doesn't contain any mslot class. Hence in the end we</span><br><span>  * can only receive EGPRS mslot class through 11-bit EGPRS PACKET CHANNEL REQUEST. */</span><br><span style="color: hsl(120, 100%, 40%);">+static int parse_egprs_pkt_ch_req(uint16_t ra11, struct chan_req_params *chan_req)</span><br><span style="color: hsl(120, 100%, 40%);">+{</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", 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%);">+</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%);">+               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%);">+    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%);">+       case EGPRS_PKT_CHAN_REQ_DEDICATED_CHANNEL:</span><br><span style="color: hsl(120, 100%, 40%);">+            /* TODO: IIUC, signalling needs only one block */</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%);">+      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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int parse_rach_ind(const struct rach_ind_params *rip,</span><br><span>                         struct chan_req_params *chan_req)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    switch (rip->burst_type) {</span><br><span>        case GSM_L1_BURST_TYPE_NONE:</span><br><span>                 LOGP(DRLCMAC, LOGL_ERROR, "RACH.ind contains no burst type, assuming TS0\n");</span><br><span>@@ -697,10 +756,9 @@</span><br><span>                       return -ENOTSUP;</span><br><span>             }</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%);">-         /* FIXME: properly parse EGPRS Packet Channel Request */</span><br><span style="color: hsl(0, 100%, 40%);">-                if ((rip->ra >> 10) == 0x00) /* .0xx xxx. .... */</span><br><span style="color: hsl(0, 100%, 40%);">-                      chan_req->egprs_mslot_class = ((rip->ra & 0x3e0) >> 5) + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = parse_egprs_pkt_ch_req(rip->ra, chan_req);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return rc;</span><br><span>           break;</span><br><span>       default:</span><br><span>             LOGP(DRLCMAC, LOGL_ERROR, "RACH.ind contains unknown burst type 0x%02x "</span><br><span>@@ -766,6 +824,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: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>