<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12955">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Rewrite Packet Uplink Assignment<br><br>Use bitvec_set_*() directly without external write pointer tracking to<br>simplify the code. This is part of IA Rest Octets (3GPP TS 44.018<br>§10.5.2.16) which is the last part of the message so it should not<br>interfere with the rest of encoding functions.<br><br>That's updated version of reverted commit.<br><br>Change-Id: I97d53c27c1ca9e032d431b3aa7f915027d63ddc0<br>Related: OS#3014<br>---<br>M src/encoding.cpp<br>1 file changed, 47 insertions(+), 47 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/55/12955/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/encoding.cpp b/src/encoding.cpp</span><br><span>index b9375ea..927defd 100644</span><br><span>--- a/src/encoding.cpp</span><br><span>+++ b/src/encoding.cpp</span><br><span>@@ -230,50 +230,51 @@</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int write_ia_rest_uplink(</span><br><span style="color: hsl(0, 100%, 40%);">-      gprs_rlcmac_ul_tbf *tbf,</span><br><span style="color: hsl(0, 100%, 40%);">-        bitvec * dest, unsigned& wp,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t usf, uint32_t fn,</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t alpha, uint8_t gamma, int8_t ta_idx)</span><br><span style="color: hsl(120, 100%, 40%);">+/* 3GPP TS 44.018 §10.5.2.16 IA Rest Octets ::= Packet Uplink Assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+static inline int write_ia_rest_uplink(const gprs_rlcmac_ul_tbf *tbf, bitvec * dest,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     uint8_t usf, uint32_t fn, uint8_t alpha, uint8_t gamma, int8_t ta_idx)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(!tbf || !tbf->is_egprs_enabled());</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     // GMS 04.08 10.5.2.37b 10.5.2.16</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_write_field(dest, &wp, 3, 2);    // "HH"</span><br><span style="color: hsl(0, 100%, 40%);">-   bitvec_write_field(dest, &wp, 0, 2);    // "0" Packet Uplink Assignment</span><br><span style="color: hsl(0, 100%, 40%);">-   if (tbf == NULL) {</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_write_field(dest, &wp, 0, 1);    // Block Allocation : Single Block Allocation</span><br><span style="color: hsl(0, 100%, 40%);">-               if (alpha) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    bitvec_write_field(dest, &wp,0x1,1);   // ALPHA = present</span><br><span style="color: hsl(0, 100%, 40%);">-                   bitvec_write_field(dest, &wp,alpha,4);   // ALPHA = present</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-                  bitvec_write_field(dest, &wp,0x0,1);   // ALPHA = not present</span><br><span style="color: hsl(0, 100%, 40%);">-               bitvec_write_field(dest, &wp,gamma,5);   // GAMMA power control parameter</span><br><span style="color: hsl(0, 100%, 40%);">-           write_tai(dest, wp, ta_idx);</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(dest, &wp, 1, 1);    // TBF_STARTING_TIME_FLAG</span><br><span style="color: hsl(0, 100%, 40%);">-           bitvec_write_field(dest, &wp,(fn / (26 * 51)) % 32,5); // T1'</span><br><span style="color: hsl(0, 100%, 40%);">-           bitvec_write_field(dest, &wp,fn % 51,6);               // T3</span><br><span style="color: hsl(0, 100%, 40%);">-                bitvec_write_field(dest, &wp,fn % 26,5);               // T2</span><br><span style="color: hsl(120, 100%, 40%);">+      set_H(dest); set_H(dest);</span><br><span style="color: hsl(120, 100%, 40%);">+     set_0(dest); set_0(dest); /* 00 Packet Uplink Assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (tbf) {</span><br><span style="color: hsl(120, 100%, 40%);">+            set_1(dest); /* Multi Block Allocation */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = write_tfi_usf(dest, tbf, usf);</span><br><span style="color: hsl(120, 100%, 40%);">+           check(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* 3GPP TS 44.060 Table 11.2.28.2 Channel Coding Indicator */</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = bitvec_set_u64(dest, tbf->current_cs().to_num() - 1, 2, false); /* CHANNEL_CODING_COMMAND */</span><br><span style="color: hsl(120, 100%, 40%);">+          check(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = bitvec_set_bit(dest, (bit_value)tbf->tlli());                   /* TLLI_BLOCK_CHANNEL_CODING */</span><br><span style="color: hsl(120, 100%, 40%);">+               check(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = write_alpha_gamma(dest, alpha, gamma);</span><br><span style="color: hsl(120, 100%, 40%);">+           check(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          set_0(dest); /* No TIMING_ADVANCE_INDEX */</span><br><span style="color: hsl(120, 100%, 40%);">+            set_0(dest); /* No TBF_STARTING_TIME */</span><br><span>      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                bitvec_write_field(dest, &wp, 1, 1);    // Block Allocation : Not Single Block Allocation</span><br><span style="color: hsl(0, 100%, 40%);">-           bitvec_write_field(dest, &wp, tbf->tfi(), 5);  // TFI_ASSIGNMENT Temporary Flow Identity</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(dest, &wp, 0, 1);    // POLLING</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(dest, &wp, 0, 1);    // ALLOCATION_TYPE: dynamic</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(dest, &wp, usf, 3);    // USF</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(dest, &wp, 0, 1);    // USF_GRANULARITY</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(dest, &wp, 0, 1);   // "0" power control: Not Present</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(dest, &wp, tbf->current_cs().to_num()-1, 2);    // CHANNEL_CODING_COMMAND</span><br><span style="color: hsl(0, 100%, 40%);">-             bitvec_write_field(dest, &wp, 1, 1);    // TLLI_BLOCK_CHANNEL_CODING</span><br><span style="color: hsl(0, 100%, 40%);">-                if (alpha) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    bitvec_write_field(dest, &wp,0x1,1);   // ALPHA = present</span><br><span style="color: hsl(0, 100%, 40%);">-                   bitvec_write_field(dest, &wp,alpha,4);   // ALPHA</span><br><span style="color: hsl(0, 100%, 40%);">-           } else</span><br><span style="color: hsl(0, 100%, 40%);">-                  bitvec_write_field(dest, &wp,0x0,1);   // ALPHA = not present</span><br><span style="color: hsl(0, 100%, 40%);">-               bitvec_write_field(dest, &wp,gamma,5);   // GAMMA power control parameter</span><br><span style="color: hsl(0, 100%, 40%);">-           /* note: there is no choise for TAI and no starting time */</span><br><span style="color: hsl(0, 100%, 40%);">-             bitvec_write_field(dest, &wp, 0, 1);   // switch TIMING_ADVANCE_INDEX = off</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(dest, &wp, 0, 1);    // TBF_STARTING_TIME_FLAG</span><br><span style="color: hsl(120, 100%, 40%);">+         set_0(dest); /* Single Block Allocation */</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = write_alpha_gamma(dest, alpha, gamma);</span><br><span style="color: hsl(120, 100%, 40%);">+           check(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* A 'Timing Advance index' shall not be allocated at a Single Block allocation.</span><br><span style="color: hsl(120, 100%, 40%);">+                 A 'TBF Starting Time' shall be allocated at a Single Block allocation. */</span><br><span style="color: hsl(120, 100%, 40%);">+          set_0(dest);</span><br><span style="color: hsl(120, 100%, 40%);">+          set_1(dest);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = write_tbf_start_time(dest, fn);    /* TBF_STARTING_TIME */</span><br><span style="color: hsl(120, 100%, 40%);">+               check(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          set_L(dest); /* No P0 nor PR_MODE */</span><br><span style="color: hsl(120, 100%, 40%);">+          set_L(dest); /* No Additions for R99 */</span><br><span style="color: hsl(120, 100%, 40%);">+               set_L(dest); /* No Additions for Rel-6 */</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -481,22 +482,21 @@</span><br><span> </span><br><span>       plen = wp / 8;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    dest->cur_bit = wp;</span><br><span>       if (downlink) {</span><br><span>              if (!as_dl_tbf(tbf)) {</span><br><span>                       LOGP(DRLCMACDL, LOGL_ERROR, "Cannot encode DL IMMEDIATE ASSIGNMENT without TBF\n");</span><br><span>                        return -EINVAL;</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-               dest->cur_bit = wp;</span><br><span>               rc = write_ia_rest_downlink(as_dl_tbf(tbf), dest, polling, gsm48_ta_is_valid(ta), fn,</span><br><span>                                            alpha, gamma, ta_idx);</span><br><span>   } else if (((burst_type == GSM_L1_BURST_TYPE_ACCESS_1) ||</span><br><span style="color: hsl(0, 100%, 40%);">-                 (burst_type == GSM_L1_BURST_TYPE_ACCESS_2))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                dest->cur_bit = wp;</span><br><span style="color: hsl(120, 100%, 40%);">+                    (burst_type == GSM_L1_BURST_TYPE_ACCESS_2)))</span><br><span>             rc = write_ia_rest_egprs_uplink(as_ul_tbf(tbf), dest, usf, fn, alpha, gamma, ta_idx, burst_type, ra);</span><br><span style="color: hsl(0, 100%, 40%);">-   } else</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = write_ia_rest_uplink(as_ul_tbf(tbf), dest, wp,</span><br><span style="color: hsl(0, 100%, 40%);">-                     usf, fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                        alpha, gamma, ta_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+        else {</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_ASSERT(!as_ul_tbf(tbf) || !as_ul_tbf(tbf)->is_egprs_enabled());</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = write_ia_rest_uplink(as_ul_tbf(tbf), dest, usf, fn, alpha, gamma, ta_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        if (rc < 0) {</span><br><span>             LOGP(DRLCMAC, LOGL_ERROR,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12955">change 12955</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/12955"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I97d53c27c1ca9e032d431b3aa7f915027d63ddc0 </div>
<div style="display:none"> Gerrit-Change-Number: 12955 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>