<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/19787">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">encoding: use CSN.1 codec to generate Packet Uplink Assignment<br><br>It's quite odd to see that in write_packet_downlink_assignment()<br>we initialize an 'RlcMacDownlink_t', so then the caller can use<br>the power of CSN.1 codec to generate the final sequence of bytes<br>to be transmitted, while in write_packet_uplink_assignment() we<br>already compose the final RLC/MAC message straight away using<br>the low-level bitvec API (like bitvec_write_field()).<br><br>I guess the reason is that at the time of writing this code, the<br>CSN.1 codec was not stable enough, so it was safer to generate<br>the message 'by hand'.  This would also explain why we *decode*<br>the final RLC/MAC message in create_ul_ass() right after encoding.<br><br>Rewrite write_packet_uplink_assignment(), so now it initializes<br>a caller-provided 'RlcMacDownlink_t' structure.  Given that it's<br>allocated on heap using talloc_zero(), do not initialize presence<br>indicators of fields that are not present in the message.<br><br>This would facilitate handling of frequency hopping parameters<br>in the upcoming changes, in particular we can now introduce a<br>function that would compose Frequency Parameters IE for both<br>write_packet_{downlink,uplink}_assignment().<br><br>Tested manually by running a GPRS-enabled network, as well as by<br>running test cases from ttcn3-pcu-test => no regressions observed.<br><br>Change-Id: I2850b91e0043cdca8ae7498a5fc727eeedd029b6<br>Related: SYS#4868, OS#4547<br>---<br>M src/encoding.cpp<br>M src/encoding.h<br>M src/tbf.cpp<br>3 files changed, 106 insertions(+), 77 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/19787/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 660fea6..33fe196 100644</span><br><span>--- a/src/encoding.cpp</span><br><span>+++ b/src/encoding.cpp</span><br><span>@@ -537,93 +537,122 @@</span><br><span> </span><br><span> /* generate uplink assignment */</span><br><span> void Encoding::write_packet_uplink_assignment(</span><br><span style="color: hsl(0, 100%, 40%);">-  bitvec * dest, uint8_t old_tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+       RlcMacDownlink_t * block, uint8_t old_tfi,</span><br><span>   uint8_t old_downlink, uint32_t tlli, uint8_t use_tlli,</span><br><span>       const struct gprs_rlcmac_ul_tbf *tbf, uint8_t poll, uint8_t rrbp, uint8_t alpha,</span><br><span>     uint8_t gamma, int8_t ta_idx, bool use_egprs)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      // TODO We should use our implementation of encode RLC/MAC Control messages.</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned wp = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t ts;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* timeslot assigned for the Continuous Timing Advance procedure */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t ta_ts = 0; /* FIXME: supply it as parameter from caller */</span><br><span style="color: hsl(120, 100%, 40%);">+    Packet_Uplink_Assignment_t *pua;</span><br><span style="color: hsl(120, 100%, 40%);">+      Packet_Timing_Advance_t *pta;</span><br><span style="color: hsl(120, 100%, 40%);">+ Frequency_Parameters_t *fp;</span><br><span style="color: hsl(120, 100%, 40%);">+   Dynamic_Allocation_t *da;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   bitvec_write_field(dest, &wp,0x1,2);  // Payload Type</span><br><span style="color: hsl(0, 100%, 40%);">-       bitvec_write_field(dest, &wp,rrbp,2);  // Uplink block with TDMA framenumber (N+13)</span><br><span style="color: hsl(0, 100%, 40%);">- bitvec_write_field(dest, &wp,poll,1);  // Suppl/Polling Bit</span><br><span style="color: hsl(0, 100%, 40%);">- bitvec_write_field(dest, &wp,0x0,3);  // Uplink state flag</span><br><span style="color: hsl(0, 100%, 40%);">-  bitvec_write_field(dest, &wp,0xa,6);  // MESSAGE TYPE</span><br><span style="color: hsl(120, 100%, 40%);">+     /* RLC/MAC control block without the optional RLC/MAC control header */</span><br><span style="color: hsl(120, 100%, 40%);">+       block->PAYLOAD_TYPE = 0x01;  // Payload Type</span><br><span style="color: hsl(120, 100%, 40%);">+       block->RRBP         = rrbp;  // RRBP (e.g. N+13)</span><br><span style="color: hsl(120, 100%, 40%);">+   block->SP           = poll;  // RRBP field is valid</span><br><span style="color: hsl(120, 100%, 40%);">+        block->USF          = 0x00;  // Uplink state flag</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        bitvec_write_field(dest, &wp,0x0,2);  // Page Mode</span><br><span style="color: hsl(120, 100%, 40%);">+        /* See 3GPP TS 44.060, section 11.2.29 */</span><br><span style="color: hsl(120, 100%, 40%);">+     pua = &block->u.Packet_Uplink_Assignment;</span><br><span style="color: hsl(120, 100%, 40%);">+      pua->MESSAGE_TYPE = 0x0a;  // Packet Uplink Assignment</span><br><span style="color: hsl(120, 100%, 40%);">+     pua->PAGE_MODE    = 0x00;  // Normal Paging</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(dest, &wp,0x0,1); // switch PERSIST_LEVEL: off</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TLLI or Global (UL/DL) TFI */</span><br><span>     if (use_tlli) {</span><br><span style="color: hsl(0, 100%, 40%);">-         bitvec_write_field(dest, &wp,0x2,2); // switch TLLI   : on</span><br><span style="color: hsl(0, 100%, 40%);">-          bitvec_write_field(dest, &wp,tlli,32); // TLLI</span><br><span style="color: hsl(120, 100%, 40%);">+            pua->ID.UnionType = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+          pua->ID.u.TLLI = tlli;</span><br><span>    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                bitvec_write_field(dest, &wp,0x0,1); // switch TFI : on</span><br><span style="color: hsl(0, 100%, 40%);">-             bitvec_write_field(dest, &wp,old_downlink,1); // 0=UPLINK TFI, 1=DL TFI</span><br><span style="color: hsl(0, 100%, 40%);">-             bitvec_write_field(dest, &wp,old_tfi,5); // TFI</span><br><span style="color: hsl(120, 100%, 40%);">+           pua->ID.UnionType = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+          pua->ID.u.Global_TFI.UnionType = old_downlink;</span><br><span style="color: hsl(120, 100%, 40%);">+             pua->ID.u.Global_TFI.u.UPLINK_TFI = old_tfi;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* GPRS/EGPRS specific parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+  pua->UnionType = use_egprs ? 0x01 : 0x00;</span><br><span>         if (!use_egprs) {</span><br><span style="color: hsl(0, 100%, 40%);">-               bitvec_write_field(dest, &wp,0x0,1); // Message escape</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_write_field(dest, &wp, mcs_chan_code(tbf->current_cs()), 2); // CHANNEL_CODING_COMMAND</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(dest, &wp,0x1,1); // TLLI_BLOCK_CHANNEL_CODING</span><br><span style="color: hsl(0, 100%, 40%);">-           write_ta_ie(dest, wp, tbf->ta(), ta_idx, ta_ts);</span><br><span style="color: hsl(0, 100%, 40%);">-     } else { /* EPGRS */</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(dest, &wp,0x1,1); // Message escape</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_write_field(dest, &wp,0x0,2); // EGPRS message contents</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_write_field(dest, &wp,0x0,1); // No CONTENTION_RESOLUTION_TLLI</span><br><span style="color: hsl(0, 100%, 40%);">-               bitvec_write_field(dest, &wp,0x0,1); // No COMPACT reduced MA</span><br><span style="color: hsl(0, 100%, 40%);">-               bitvec_write_field(dest, &wp, mcs_chan_code(tbf->current_cs()), 4); // EGPRS Modulation and Coding IE</span><br><span style="color: hsl(0, 100%, 40%);">-            /* 0: no RESEGMENT, 1: Segmentation*/</span><br><span style="color: hsl(0, 100%, 40%);">-           bitvec_write_field(dest, &wp, 0x1, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-              write_ws(dest, &wp, tbf->window_size()); // EGPRS Window Size</span><br><span style="color: hsl(0, 100%, 40%);">-            bitvec_write_field(dest, &wp,0x0,1); // No Access Technologies Request</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_write_field(dest, &wp,0x0,1); // No ARAC RETRANSMISSION REQUEST</span><br><span style="color: hsl(0, 100%, 40%);">-              bitvec_write_field(dest, &wp,0x1,1); // TLLI_BLOCK_CHANNEL_CODING</span><br><span style="color: hsl(0, 100%, 40%);">-           bitvec_write_field(dest, &wp,0x0,1); // No BEP_PERIOD2</span><br><span style="color: hsl(0, 100%, 40%);">-              write_ta_ie(dest, wp, tbf->ta(), ta_idx, ta_ts);</span><br><span style="color: hsl(0, 100%, 40%);">-             bitvec_write_field(dest, &wp,0x0,1); // No Packet Extended Timing Advance</span><br><span style="color: hsl(120, 100%, 40%);">+         PUA_GPRS_t *gprs = &pua->u.PUA_GPRS_Struct;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Use the commanded CS/MSC value during the content resolution */</span><br><span style="color: hsl(120, 100%, 40%);">+            gprs->CHANNEL_CODING_COMMAND    = mcs_chan_code(tbf->current_cs());</span><br><span style="color: hsl(120, 100%, 40%);">+             gprs->TLLI_BLOCK_CHANNEL_CODING = 0x01;  // ^^^</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Dynamic allocation */</span><br><span style="color: hsl(120, 100%, 40%);">+              gprs->UnionType = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Frequency Parameters IE is present */</span><br><span style="color: hsl(120, 100%, 40%);">+              gprs->Exist_Frequency_Parameters = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Common parameters to be set below */</span><br><span style="color: hsl(120, 100%, 40%);">+               pta = &gprs->Packet_Timing_Advance;</span><br><span style="color: hsl(120, 100%, 40%);">+            fp = &gprs->Frequency_Parameters;</span><br><span style="color: hsl(120, 100%, 40%);">+              da = &gprs->u.Dynamic_Allocation;</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              PUA_EGPRS_00_t *egprs = &pua->u.PUA_EGPRS_Struct.u.PUA_EGPRS_00;</span><br><span style="color: hsl(120, 100%, 40%);">+               pua->u.PUA_EGPRS_Struct.UnionType = 0x00;  // 'Normal' EGPRS, not EGPRS2</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Use the commanded CS/MSC value during the content resolution */</span><br><span style="color: hsl(120, 100%, 40%);">+            egprs->EGPRS_CHANNEL_CODING_COMMAND = mcs_chan_code(tbf->current_cs());</span><br><span style="color: hsl(120, 100%, 40%);">+         egprs->TLLI_BLOCK_CHANNEL_CODING    = 0x01;  // ^^^</span><br><span style="color: hsl(120, 100%, 40%);">+                egprs->RESEGMENT                    = 0x01;  // Enable segmentation</span><br><span style="color: hsl(120, 100%, 40%);">+                egprs->EGPRS_WindowSize             = tbf->window_size();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Dynamic allocation */</span><br><span style="color: hsl(120, 100%, 40%);">+              egprs->UnionType = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Frequency Parameters IE is present */</span><br><span style="color: hsl(120, 100%, 40%);">+              egprs->Exist_Frequency_Parameters = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Common parameters to be set below */</span><br><span style="color: hsl(120, 100%, 40%);">+               pta = &egprs->Packet_Timing_Advance;</span><br><span style="color: hsl(120, 100%, 40%);">+           fp = &egprs->Frequency_Parameters;</span><br><span style="color: hsl(120, 100%, 40%);">+             da = &egprs->u.Dynamic_Allocation;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#if 1</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(dest, &wp,0x1,1); // Frequency Parameters information elements = present</span><br><span style="color: hsl(0, 100%, 40%);">- bitvec_write_field(dest, &wp,tbf->tsc(),3); // Training Sequence Code (TSC)</span><br><span style="color: hsl(0, 100%, 40%);">-      bitvec_write_field(dest, &wp,0x0,2); // ARFCN = present</span><br><span style="color: hsl(0, 100%, 40%);">-     bitvec_write_field(dest, &wp,tbf->trx->arfcn,10); // ARFCN</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); // Frequency Parameters = off</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    bitvec_write_field(dest, &wp,0x1,2); // Dynamic Allocation</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  bitvec_write_field(dest, &wp,0x0,1); // Extended Dynamic Allocation = off</span><br><span style="color: hsl(0, 100%, 40%);">-   bitvec_write_field(dest, &wp,0x0,1); // P0 = off</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    bitvec_write_field(dest, &wp,0x0,1); // USF_GRANULARITY</span><br><span style="color: hsl(0, 100%, 40%);">-     bitvec_write_field(dest, &wp,0x1,1); // switch TFI   : on</span><br><span style="color: hsl(0, 100%, 40%);">-   bitvec_write_field(dest, &wp,tbf->tfi(),5);// TFI</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        bitvec_write_field(dest, &wp,0x0,1); //</span><br><span style="color: hsl(0, 100%, 40%);">-     bitvec_write_field(dest, &wp,0x0,1); // TBF Starting Time = off</span><br><span style="color: hsl(0, 100%, 40%);">-     if (alpha || gamma) {</span><br><span style="color: hsl(0, 100%, 40%);">-           bitvec_write_field(dest, &wp,0x1,1); // Timeslot Allocation with Power Control</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); // Timeslot Allocation</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (ts = 0; ts < 8; ts++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (tbf->pdch[ts]) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 bitvec_write_field(dest, &wp,0x1,1); // USF_TN(i): on</span><br><span style="color: hsl(0, 100%, 40%);">-                       bitvec_write_field(dest, &wp,tbf->m_usf[ts],3); // USF_TN(i)</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (alpha || gamma)</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%);">-           } else</span><br><span style="color: hsl(0, 100%, 40%);">-                  bitvec_write_field(dest, &wp,0x0,1); // USF_TN(i): off</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Packet Timing Advance (if known) */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (tbf->ta() <= 63) { /* { 0 | 1  < TIMING_ADVANCE_VALUE : bit (6) > } */</span><br><span style="color: hsl(120, 100%, 40%);">+                pta->Exist_TIMING_ADVANCE_VALUE = 0x01;  // Present</span><br><span style="color: hsl(120, 100%, 40%);">+                pta->TIMING_ADVANCE_VALUE       = tbf->ta();</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       //      bitvec_write_field(dest, &wp,0x0,1); // Measurement Mapping struct not present</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Continuous Timing Advance Control */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ta_idx >= 0 && ta_idx < 16) {</span><br><span style="color: hsl(120, 100%, 40%);">+               pta->Exist_IndexAndtimeSlot         = 0x01;  // Present</span><br><span style="color: hsl(120, 100%, 40%);">+            pta->TIMING_ADVANCE_TIMESLOT_NUMBER = 0;  // FIXME!</span><br><span style="color: hsl(120, 100%, 40%);">+                pta->TIMING_ADVANCE_INDEX           = ta_idx;</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%);">+   /* Frequency Parameters IE */</span><br><span style="color: hsl(120, 100%, 40%);">+ fp->TSC       = tbf->tsc();  // Training Sequence Code (TSC)</span><br><span style="color: hsl(120, 100%, 40%);">+    fp->UnionType = 0x00;        // Single ARFCN</span><br><span style="color: hsl(120, 100%, 40%);">+       fp->u.ARFCN   = tbf->trx->arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Dynamic allocation parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+   da->USF_GRANULARITY = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Assign an Uplink TFI */</span><br><span style="color: hsl(120, 100%, 40%);">+    da->Exist_UPLINK_TFI_ASSIGNMENT = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+    da->UPLINK_TFI_ASSIGNMENT = tbf->tfi();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Timeslot Allocation with or without Power Control */</span><br><span style="color: hsl(120, 100%, 40%);">+       da->UnionType = (alpha || gamma) ? 0x01 : 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (da->UnionType == 0x01)</span><br><span style="color: hsl(120, 100%, 40%);">+         da->u.Timeslot_Allocation_Power_Ctrl_Param.ALPHA = alpha;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (unsigned int tn = 0; tn < 8; tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (tbf->pdch[tn] == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (da->UnionType == 0x01) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       Timeslot_Allocation_Power_Ctrl_Param_t *params = \</span><br><span style="color: hsl(120, 100%, 40%);">+                            &da->u.Timeslot_Allocation_Power_Ctrl_Param;</span><br><span style="color: hsl(120, 100%, 40%);">+                   params->Slot[tn].Exist    = 0x01;  // Enable this timeslot</span><br><span style="color: hsl(120, 100%, 40%);">+                 params->Slot[tn].USF_TN   = tbf->m_usf[tn];  // USF_TN(i)</span><br><span style="color: hsl(120, 100%, 40%);">+                       params->Slot[tn].GAMMA_TN = gamma;</span><br><span style="color: hsl(120, 100%, 40%);">+         } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      Timeslot_Allocation_t *slot = &da->u.Timeslot_Allocation[tn];</span><br><span style="color: hsl(120, 100%, 40%);">+                  slot->Exist  = 0x01;  // Enable this timeslot</span><br><span style="color: hsl(120, 100%, 40%);">+                      slot->USF_TN = tbf->m_usf[tn];  // USF_TN(i)</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/src/encoding.h b/src/encoding.h</span><br><span>index 859b944..b65ef06 100644</span><br><span>--- a/src/encoding.h</span><br><span>+++ b/src/encoding.h</span><br><span>@@ -58,7 +58,7 @@</span><br><span>              );</span><br><span> </span><br><span>       static void write_packet_uplink_assignment(</span><br><span style="color: hsl(0, 100%, 40%);">-                     bitvec * dest, uint8_t old_tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+                       RlcMacDownlink_t * block, uint8_t old_tfi,</span><br><span>                   uint8_t old_downlink, uint32_t tlli, uint8_t use_tlli,</span><br><span>                       const struct gprs_rlcmac_ul_tbf *tbf, uint8_t poll, uint8_t rrbp,</span><br><span>                    uint8_t alpha, uint8_t gamma, int8_t ta_idx,</span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index c1ec729..0447edc 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -1368,16 +1368,16 @@</span><br><span>      bitvec_unhex(&bv, DUMMY_VEC);</span><br><span> </span><br><span>        LOGPTBF(new_tbf, LOGL_INFO, "start Packet Uplink Assignment (PACCH)\n");</span><br><span style="color: hsl(0, 100%, 40%);">-      Encoding::write_packet_uplink_assignment(&bv, m_tfi,</span><br><span style="color: hsl(120, 100%, 40%);">+      mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t);</span><br><span style="color: hsl(120, 100%, 40%);">+  Encoding::write_packet_uplink_assignment(mac_control_block, m_tfi,</span><br><span>           (direction == GPRS_RLCMAC_DL_TBF), tlli(),</span><br><span>           is_tlli_valid(), new_tbf, 1, rrbp, bts_data()->alpha,</span><br><span>             bts_data()->gamma, -1, is_egprs_enabled());</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t);</span><br><span>         LOGP(DTBF, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Uplink Assignment +++++++++++++++++++++++++\n");</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = decode_gsm_rlcmac_downlink(&bv, mac_control_block);</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = encode_gsm_rlcmac_downlink(&bv, mac_control_block);</span><br><span>         if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DTBF, LOGL_ERROR, "Decoding of Packet Uplink Ass failed (%d)\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DTBF, LOGL_ERROR, "Encoding of Packet Uplink Ass failed (%d)\n", rc);</span><br><span>                 goto free_ret;</span><br><span>       }</span><br><span>    LOGP(DTBF, LOGL_DEBUG, "------------------------- TX : Packet Uplink Assignment -------------------------\n");</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/19787">change 19787</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/+/19787"/><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: I2850b91e0043cdca8ae7498a5fc727eeedd029b6 </div>
<div style="display:none"> Gerrit-Change-Number: 19787 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>