Review at  https://gerrit.osmocom.org/6977

Revert "Rewrite Packet Uplink Assignment"

This reverts commit 93d947f5e8a30acc9250c124bf9d5bb6a8863526,
I44db2eeea7448ff67e688ae716487bc6dbfc96a3.

Commit I52ec9b07413daabba8cd5f1fba5c7b3af6a33389 /
896574e92bea09ed8d39688b6fdf504e84521746 was found (empirically) to be a
regression, rendering GPRS service fatally unreliable.

This reverted commit seems to follow after the regression and is reverted along
with it.

Related: OS#3013
Change-Id: If7038127e9a663c93006475b3add961adc0b1922
---
M src/encoding.cpp
1 file changed, 47 insertions(+), 47 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/77/6977/1

diff --git a/src/encoding.cpp b/src/encoding.cpp
index e96894f..279bbfe 100644
--- a/src/encoding.cpp
+++ b/src/encoding.cpp
@@ -230,51 +230,50 @@
        return 0;
 }
 
-/* 3GPP TS 44.018 ยง10.5.2.16 IA Rest Octets ::= Packet Uplink Assignment */
-static inline int write_ia_rest_uplink(const gprs_rlcmac_ul_tbf *tbf, bitvec * 
dest,
-                                      uint8_t usf, uint32_t fn, uint8_t alpha, 
uint8_t gamma, int8_t ta_idx)
+static int write_ia_rest_uplink(
+       gprs_rlcmac_ul_tbf *tbf,
+       bitvec * dest, unsigned& wp,
+       uint8_t usf, uint32_t fn,
+       uint8_t alpha, uint8_t gamma, int8_t ta_idx)
 {
-       int rc;
+       OSMO_ASSERT(!tbf || !tbf->is_egprs_enabled());
 
-       set_H(dest); set_H(dest);
-       set_0(dest); set_0(dest); /* 00 Packet Uplink Assignment */
-
-       if (tbf) {
-               set_1(dest); /* Multi Block Allocation */
-
-               rc = write_tfi_usf(dest, tbf, usf);
-               check(rc);
-
-               /* 3GPP TS 44.060 Table 11.2.28.2 Channel Coding Indicator */
-               rc = bitvec_set_u64(dest, tbf->current_cs().to_num() - 1, 2, 
false); /* CHANNEL_CODING_COMMAND */
-               check(rc);
-
-               rc = bitvec_set_bit(dest, (bit_value)tbf->tlli());              
     /* TLLI_BLOCK_CHANNEL_CODING */
-               check(rc);
-
-               rc = write_alpha_gamma(dest, alpha, gamma);
-               check(rc);
-
-               set_0(dest); /* No TIMING_ADVANCE_INDEX */
-               set_0(dest); /* No TBF_STARTING_TIME */
+       // GMS 04.08 10.5.2.37b 10.5.2.16
+       bitvec_write_field(dest, &wp, 3, 2);    // "HH"
+       bitvec_write_field(dest, &wp, 0, 2);    // "0" Packet Uplink Assignment
+       if (tbf == NULL) {
+               bitvec_write_field(dest, &wp, 0, 1);    // Block Allocation : 
Single Block Allocation
+               if (alpha) {
+                       bitvec_write_field(dest, &wp,0x1,1);   // ALPHA = 
present
+                       bitvec_write_field(dest, &wp,alpha,4);   // ALPHA = 
present
+               } else
+                       bitvec_write_field(dest, &wp,0x0,1);   // ALPHA = not 
present
+               bitvec_write_field(dest, &wp,gamma,5);   // GAMMA power control 
parameter
+               write_tai(dest, wp, ta_idx);
+               bitvec_write_field(dest, &wp, 1, 1);    // 
TBF_STARTING_TIME_FLAG
+               bitvec_write_field(dest, &wp,(fn / (26 * 51)) % 32,5); // T1'
+               bitvec_write_field(dest, &wp,fn % 51,6);               // T3
+               bitvec_write_field(dest, &wp,fn % 26,5);               // T2
        } else {
-               set_0(dest); /* Single Block Allocation */
-               rc = write_alpha_gamma(dest, alpha, gamma);
-               check(rc);
-
-               /* A 'Timing Advance index' shall not be allocated at a Single 
Block allocation.
-                  A 'TBF Starting Time' shall be allocated at a Single Block 
allocation. */
-               set_0(dest);
-               set_1(dest);
-
-               rc = write_tbf_start_time(dest, fn);    /* TBF_STARTING_TIME */
-               check(rc);
-
-               set_L(dest); /* No P0 nor PR_MODE */
-               set_L(dest); /* No Additions for R99 */
-               set_L(dest); /* No Additions for Rel-6 */
+               bitvec_write_field(dest, &wp, 1, 1);    // Block Allocation : 
Not Single Block Allocation
+               bitvec_write_field(dest, &wp, tbf->tfi(), 5);  // 
TFI_ASSIGNMENT Temporary Flow Identity
+               bitvec_write_field(dest, &wp, 0, 1);    // POLLING
+               bitvec_write_field(dest, &wp, 0, 1);    // ALLOCATION_TYPE: 
dynamic
+               bitvec_write_field(dest, &wp, usf, 3);    // USF
+               bitvec_write_field(dest, &wp, 0, 1);    // USF_GRANULARITY
+               bitvec_write_field(dest, &wp, 0, 1);   // "0" power control: 
Not Present
+               bitvec_write_field(dest, &wp, tbf->current_cs().to_num()-1, 2); 
   // CHANNEL_CODING_COMMAND
+               bitvec_write_field(dest, &wp, 1, 1);    // 
TLLI_BLOCK_CHANNEL_CODING
+               if (alpha) {
+                       bitvec_write_field(dest, &wp,0x1,1);   // ALPHA = 
present
+                       bitvec_write_field(dest, &wp,alpha,4);   // ALPHA
+               } else
+                       bitvec_write_field(dest, &wp,0x0,1);   // ALPHA = not 
present
+               bitvec_write_field(dest, &wp,gamma,5);   // GAMMA power control 
parameter
+               /* note: there is no choise for TAI and no starting time */
+               bitvec_write_field(dest, &wp, 0, 1);   // switch 
TIMING_ADVANCE_INDEX = off
+               bitvec_write_field(dest, &wp, 0, 1);    // 
TBF_STARTING_TIME_FLAG
        }
-
        return 0;
 }
 
@@ -482,21 +481,22 @@
 
        plen = wp / 8;
 
-       dest->cur_bit = wp;
        if (downlink) {
                if (!as_dl_tbf(tbf)) {
                        LOGP(DRLCMACDL, LOGL_ERROR, "Cannot encode DL IMMEDIATE 
ASSIGNMENT without TBF\n");
                        return -EINVAL;
                }
+               dest->cur_bit = wp;
                rc = write_ia_rest_downlink(as_dl_tbf(tbf), dest, polling, 
gsm48_ta_is_valid(ta), fn,
                                            alpha, gamma, ta_idx);
        } else if (((burst_type == GSM_L1_BURST_TYPE_ACCESS_1) ||
-                   (burst_type == GSM_L1_BURST_TYPE_ACCESS_2)))
+                 (burst_type == GSM_L1_BURST_TYPE_ACCESS_2))) {
+               dest->cur_bit = wp;
                rc = write_ia_rest_egprs_uplink(as_ul_tbf(tbf), dest, usf, fn, 
alpha, gamma, ta_idx, burst_type, ra);
-       else {
-               OSMO_ASSERT(!as_ul_tbf(tbf) || 
!as_ul_tbf(tbf)->is_egprs_enabled());
-               rc = write_ia_rest_uplink(as_ul_tbf(tbf), dest, usf, fn, alpha, 
gamma, ta_idx);
-       }
+       } else
+               rc = write_ia_rest_uplink(as_ul_tbf(tbf), dest, wp,
+                       usf, fn,
+                       alpha, gamma, ta_idx);
 
        if (rc < 0) {
                LOGP(DRLCMAC, LOGL_ERROR,

-- 
To view, visit https://gerrit.osmocom.org/6977
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If7038127e9a663c93006475b3add961adc0b1922
Gerrit-PatchSet: 1
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofm...@sysmocom.de>

Reply via email to