<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>