<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/17718">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">RLC/MAC: implement decoding of EGPRS Packet Channel Request<br><br>According to 3GPP TS 44.004, section 7.4a, two alternative RACH block<br>formats are specified: 8 bit (1 octet) and 11 bit. This change adds<br>CSN.1 definitions for 11 bit EGPRS Packet Channel Request as per<br>3GPP TS 44.060, table 11.2.5a.2.<br><br>Change-Id: I96df3352856933c9140177b2801a2c71f4134183<br>Related: OS#1548<br>---<br>M src/gsm_rlcmac.c<br>M src/gsm_rlcmac.h<br>M tests/rlcmac/RLCMACTest.cpp<br>M tests/rlcmac/RLCMACTest.err<br>M tests/rlcmac/RLCMACTest.ok<br>5 files changed, 222 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gsm_rlcmac.c b/src/gsm_rlcmac.c</span><br><span>index 9b5ecfe..c4ac4b1 100644</span><br><span>--- a/src/gsm_rlcmac.c</span><br><span>+++ b/src/gsm_rlcmac.c</span><br><span>@@ -5249,6 +5249,59 @@</span><br><span> CSN_DESCR_END    (SI6_RestOctet_t)</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* EGPRS Packet Channel Request (see 3GPP TS 44.060, table 11.2.5a.2) */</span><br><span style="color: hsl(120, 100%, 40%);">+static const</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_BEGIN(PacketChannelRequest_MC5P2RB3_t)</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_MC5P2RB3_t,  MultislotClass,  5),</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_MC5P2RB3_t,  Priority,  2),</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_MC5P2RB3_t,  RandomBits,  3),</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_END  (PacketChannelRequest_MC5P2RB3_t)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_BEGIN(PacketChannelRequest_MCG3P2RB3_t)</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_MCG3P2RB3_t,  MultislotClassGroup,  3),</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_MCG3P2RB3_t,  Priority,  2),</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_MCG3P2RB3_t,  RandomBits,  3),</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_END  (PacketChannelRequest_MCG3P2RB3_t)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_BEGIN(PacketChannelRequest_NOB3P2RB3_t)</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_NOB3P2RB3_t,  NumberOfBlocks,  3),</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_NOB3P2RB3_t,  Priority,  2),</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_NOB3P2RB3_t,  RandomBits,  3),</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_END  (PacketChannelRequest_NOB3P2RB3_t)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_BEGIN(PacketChannelRequest_P2RB3_t)</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_P2RB3_t,  Priority,  2),</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_P2RB3_t,  RandomBits,  3),</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_END  (PacketChannelRequest_P2RB3_t)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_BEGIN(PacketChannelRequest_RB5_t)</span><br><span style="color: hsl(120, 100%, 40%);">+  M_UINT       (PacketChannelRequest_RB5_t,  RandomBits,  5),</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_END  (PacketChannelRequest_RB5_t)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_ChoiceElement_t EGPRS_PacketChannelRequest_Choice[] =</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  {1, 0x00, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_MC5P2RB3_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {3, 0x04, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_NOB3P2RB3_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {3, 0x05, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_MCG3P2RB3_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {6, 0x30, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_P2RB3_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {6, 0x33, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_RB5_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {6, 0x35, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_RB5_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {6, 0x36, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_RB5_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {6, 0x37, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_RB5_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {6, 0x38, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_P2RB3_t)},</span><br><span style="color: hsl(120, 100%, 40%);">+  {6, 0x39, 0, M_TYPE(EGPRS_PacketChannelRequest_t, Content, PacketChannelRequest_RB5_t)},</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%);">+CSN_DESCR_BEGIN  (EGPRS_PacketChannelRequest_t)</span><br><span style="color: hsl(120, 100%, 40%);">+  M_CHOICE       (EGPRS_PacketChannelRequest_t, Type,</span><br><span style="color: hsl(120, 100%, 40%);">+                  EGPRS_PacketChannelRequest_Choice, ElementsOf(EGPRS_PacketChannelRequest_Choice)),</span><br><span style="color: hsl(120, 100%, 40%);">+CSN_DESCR_END    (EGPRS_PacketChannelRequest_t)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> // ----------------------------------------------------------------------------</span><br><span> // osmo-pcu RLCMAC APIs</span><br><span> // ----------------------------------------------------------------------------</span><br><span>@@ -6153,3 +6206,46 @@</span><br><span> </span><br><span>   return ret;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct value_string egprs_pkt_ch_req_type_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_ONE_PHASE,               "One Phase Access" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_SHORT,                   "Short Access" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_ONE_PHASE_RED_LATENCY,   "One Phase Access (Reduced Latency MS)" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_TWO_PHASE,               "Two Phase Access" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_SIGNALLING,              "Signalling" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_ONE_PHASE_UNACK,         "One Phase Access (RLC unack mode)" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_DEDICATED_CHANNEL,       "Dedicated Channel Request" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_EMERGENCY_CALL,          "Emergency call" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_TWO_PHASE_IPA,           "Two Phase Access (by IPA capable MS)" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { EGPRS_PKT_CHAN_REQ_SIGNALLING_IPA,          "Signalling (by IPA capable MS)" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { 0, NULL }</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%);">+int decode_egprs_pkt_ch_req(guint16 ra, EGPRS_PacketChannelRequest_t *req)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned readIndex = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8 bv_data[2];</span><br><span style="color: hsl(120, 100%, 40%);">+  csnStream_t ar;</span><br><span style="color: hsl(120, 100%, 40%);">+  int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Allocate a bitvector on stack */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct bitvec bv = {</span><br><span style="color: hsl(120, 100%, 40%);">+    .cur_bit = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+    .data_len = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+    .data = bv_data,</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%);">+  /* Unpack the bits: xxxxxxxx xxx..... */</span><br><span style="color: hsl(120, 100%, 40%);">+  bv_data[0] = (guint8) (ra >> 3);</span><br><span style="color: hsl(120, 100%, 40%);">+  bv_data[1] = (guint8) ((ra & 0x07) << 5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  csnStreamInit(&ar, 0, 11);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Recursive csnStreamDecoder call uses LOGPC everywhere, so we need to start the log somewhere... */</span><br><span style="color: hsl(120, 100%, 40%);">+  LOGP(DCSN1, LOGL_DEBUG, "csnStreamDecoder (EGPRS Packet Channel Request): ");</span><br><span style="color: hsl(120, 100%, 40%);">+  ret = csnStreamDecoder(&ar, CSNDESCR(EGPRS_PacketChannelRequest_t),</span><br><span style="color: hsl(120, 100%, 40%);">+                         &bv, &readIndex, (void *) req);</span><br><span style="color: hsl(120, 100%, 40%);">+  LOGPC(DCSN1, LOGL_DEBUG, "\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/gsm_rlcmac.h b/src/gsm_rlcmac.h</span><br><span>index 9d859f3..642530f 100644</span><br><span>--- a/src/gsm_rlcmac.h</span><br><span>+++ b/src/gsm_rlcmac.h</span><br><span>@@ -5330,6 +5330,47 @@</span><br><span> </span><br><span> } EnhancedMeasurementReport_t;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* EGPRS Packet Channel Request (see 3GPP TS 44.060, table 11.2.5a.2) */</span><br><span style="color: hsl(120, 100%, 40%);">+typedef struct</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8 MultislotClassGroup;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8 MultislotClass;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8 NumberOfBlocks;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8 Priority;</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8 RandomBits;</span><br><span style="color: hsl(120, 100%, 40%);">+} EGPRS_PacketChannelRequestContent_t;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* HACK: we don't really want separate structures for each sub-type, because</span><br><span style="color: hsl(120, 100%, 40%);">+ * they all have a similar set of fields, so here we basically create a few</span><br><span style="color: hsl(120, 100%, 40%);">+ * aliases to EGPRS_PacketChannelRequestContent_t. This makes the API simpler. */</span><br><span style="color: hsl(120, 100%, 40%);">+typedef EGPRS_PacketChannelRequestContent_t PacketChannelRequest_MC5P2RB3_t;</span><br><span style="color: hsl(120, 100%, 40%);">+typedef EGPRS_PacketChannelRequestContent_t PacketChannelRequest_MCG3P2RB3_t;</span><br><span style="color: hsl(120, 100%, 40%);">+typedef EGPRS_PacketChannelRequestContent_t PacketChannelRequest_NOB3P2RB3_t;</span><br><span style="color: hsl(120, 100%, 40%);">+typedef EGPRS_PacketChannelRequestContent_t PacketChannelRequest_P2RB3_t;</span><br><span style="color: hsl(120, 100%, 40%);">+typedef EGPRS_PacketChannelRequestContent_t PacketChannelRequest_RB5_t;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+typedef struct</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  /* NOTE: some fields may be uninitialized (always check Type) */</span><br><span style="color: hsl(120, 100%, 40%);">+  guint8                                Type;</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PacketChannelRequestContent_t     Content;</span><br><span style="color: hsl(120, 100%, 40%);">+} EGPRS_PacketChannelRequest_t;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+typedef enum {</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_ONE_PHASE = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_SHORT,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_ONE_PHASE_RED_LATENCY,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_TWO_PHASE,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_SIGNALLING,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_ONE_PHASE_UNACK,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_DEDICATED_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_EMERGENCY_CALL,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_TWO_PHASE_IPA,</span><br><span style="color: hsl(120, 100%, 40%);">+  EGPRS_PKT_CHAN_REQ_SIGNALLING_IPA,</span><br><span style="color: hsl(120, 100%, 40%);">+} EGPRS_PacketChannelRequestType_t;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct value_string egprs_pkt_ch_req_type_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  int decode_gsm_rlcmac_uplink(struct bitvec *vector, RlcMacUplink_t *data);</span><br><span>  int decode_gsm_rlcmac_downlink(struct bitvec *vector, RlcMacDownlink_t *data);</span><br><span>  int encode_gsm_rlcmac_downlink(struct bitvec *vector, RlcMacDownlink_t *data);</span><br><span>@@ -5337,4 +5378,6 @@</span><br><span>  void decode_gsm_rlcmac_uplink_data(struct bitvec *vector, RlcMacUplinkDataBlock_t * data);</span><br><span>  void encode_gsm_rlcmac_downlink_data(struct bitvec *vector, RlcMacDownlinkDataBlock_t * data);</span><br><span>  int decode_gsm_ra_cap(struct bitvec *vector, MS_Radio_Access_capability_t * data);</span><br><span style="color: hsl(120, 100%, 40%);">+ int decode_egprs_pkt_ch_req(guint16 ra, EGPRS_PacketChannelRequest_t *data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* __PACKET_GSM_RLCMAC_H__ */</span><br><span>diff --git a/tests/rlcmac/RLCMACTest.cpp b/tests/rlcmac/RLCMACTest.cpp</span><br><span>index 0215cc8..f1b6508 100644</span><br><span>--- a/tests/rlcmac/RLCMACTest.cpp</span><br><span>+++ b/tests/rlcmac/RLCMACTest.cpp</span><br><span>@@ -471,6 +471,59 @@</span><br><span>  bitvec_free(bv_dec);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void testEGPRSPktChReq(void *test_ctx)</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%);">+     printf("*** %s ***\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ static const uint16_t EGPRSPktChReqs[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* < One Phase Access Request : '0'B</span><br><span style="color: hsl(120, 100%, 40%);">+                    < MultislotClass : '10101'B ></span><br><span style="color: hsl(120, 100%, 40%);">+                   < Priority : '10'B ></span><br><span style="color: hsl(120, 100%, 40%);">+                    < RandomBits : '101'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+            0x2b5,</span><br><span style="color: hsl(120, 100%, 40%);">+                /* < One Phase Access Request : '0'B</span><br><span style="color: hsl(120, 100%, 40%);">+                    < MultislotClass : '01010'B ></span><br><span style="color: hsl(120, 100%, 40%);">+                   < Priority : '01'B ></span><br><span style="color: hsl(120, 100%, 40%);">+                    < RandomBits : '010'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+            0x14a,</span><br><span style="color: hsl(120, 100%, 40%);">+                /* < Short Access Request : '100'B</span><br><span style="color: hsl(120, 100%, 40%);">+              < NumberOfBlocks : '001'B ></span><br><span style="color: hsl(120, 100%, 40%);">+                     < Priority : '01'B ></span><br><span style="color: hsl(120, 100%, 40%);">+                    < RandomBits : '000'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+            0x428,</span><br><span style="color: hsl(120, 100%, 40%);">+                /* < Two Phase Access Request : '110000'B</span><br><span style="color: hsl(120, 100%, 40%);">+               < Priority : '00'B ></span><br><span style="color: hsl(120, 100%, 40%);">+                    < RandomBits : '000'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+            0x600,</span><br><span style="color: hsl(120, 100%, 40%);">+                /* < Two Phase Access Request : '110000'B</span><br><span style="color: hsl(120, 100%, 40%);">+               < Priority : '11'B ></span><br><span style="color: hsl(120, 100%, 40%);">+                    < RandomBits : '111'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+            0x61f,</span><br><span style="color: hsl(120, 100%, 40%);">+                /* < Signalling : '110011'B</span><br><span style="color: hsl(120, 100%, 40%);">+                     < RandomBits : '10101'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+          0x675,</span><br><span style="color: hsl(120, 100%, 40%);">+                /* < Signalling : '110011'B</span><br><span style="color: hsl(120, 100%, 40%);">+                     < RandomBits : '10001'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+          0x671,</span><br><span style="color: hsl(120, 100%, 40%);">+                /* < Emergency call : '110111'B</span><br><span style="color: hsl(120, 100%, 40%);">+                 < RandomBits : '11001'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+          0x6f9,</span><br><span style="color: hsl(120, 100%, 40%);">+                /* < Unknown (test) : '111111'B</span><br><span style="color: hsl(120, 100%, 40%);">+                 < RandomBits : '01010'B > > */</span><br><span style="color: hsl(120, 100%, 40%);">+          0x7ea,</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%);">+  for (size_t i = 0; i < ARRAY_SIZE(EGPRSPktChReqs); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = decode_egprs_pkt_ch_req(EGPRSPktChReqs[i], &req);</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("decode_egprs_pkt_ch_req(0x%03x) returns %d\n", EGPRSPktChReqs[i], rc);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (rc == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf(" ==> %s\n", 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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char *argv[])</span><br><span> {</span><br><span>      void *ctx = talloc_named_const(NULL, 1, "RLCMACTest");</span><br><span>@@ -490,5 +543,8 @@</span><br><span>       testRAcap(ctx);</span><br><span>      testMalformedRAcap(ctx);</span><br><span>     testRAcap2(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    testEGPRSPktChReq(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    talloc_free(ctx);</span><br><span> }</span><br><span>diff --git a/tests/rlcmac/RLCMACTest.err b/tests/rlcmac/RLCMACTest.err</span><br><span>index 83d416c..3a2b370 100644</span><br><span>--- a/tests/rlcmac/RLCMACTest.err</span><br><span>+++ b/tests/rlcmac/RLCMACTest.err</span><br><span>@@ -37,3 +37,12 @@</span><br><span> DCSN1 INFO csnStreamDecoder (RAcap): MS_RA_capability_value { | Choice MS_RA_capability_value_Choice = 1 | u.Content length = 21 | offset = 1 | RF_Power_Capability = 1 | Exist_A5_bits = 0 | ES_IND = 1 | PS = 0 | VGCS = 0 | VBS = 0 | Exist_Multislot_capability = 1 |  : Multislot_capability | Exist_HSCSD_multislot_class = 0 | Exist_GPRS_multislot_class = 1 | GPRS_multislot_class = 3 | GPRS_Extended_Dynamic_Allocation_Capability = 0 | Exist_SM = 0 | Exist_ECSD_multislot_class = 0 | Exist_EGPRS_multislot_class = 1 | DCSN1 ERROR csnStreamDecoder: error NEED_MORE BITS TO UNPACK (-5) at EGPRS_multislot_class (idx 31): End Multislot_capability | </span><br><span> DCSN1 INFO csnStreamDecoder (RAcap): MS_RA_capability_value { | Choice MS_RA_capability_value_Choice = 1 | u.Content length = 29 | offset = 1 | RF_Power_Capability = 1 | Exist_A5_bits = 0 | ES_IND = 1 | PS = 0 | VGCS = 0 | VBS = 0 | Exist_Multislot_capability = 1 |  : Multislot_capability | Exist_HSCSD_multislot_class = 0 | Exist_GPRS_multislot_class = 1 | GPRS_multislot_class = 3 | GPRS_Extended_Dynamic_Allocation_Capability = 0 | Exist_SM = 0 | Exist_ECSD_multislot_class = 0 | Exist_EGPRS_multislot_class = 1 | EGPRS_multislot_class = 0 | EGPRS_Extended_Dynamic_Allocation_Capability = 0 | Exist_DTM_GPRS_multislot_class = 0 | : End Multislot_capability | Exist_Eight_PSK_Power_Capability = 0 | COMPACT_Interference_Measurement_Capability = 0 | Revision_Level_Indicator = NULL | UMTS_FDD_Radio_Access_Technology_Capability = NULL | UMTS_384_TDD_Radio_Access_Technology_Capability = NULL | CDMA2000_Radio_Access_Technology_Capability = NULL | UMTS_128_TDD_Radio_Access_Technology_Capability = NULL | GERAN_Feature_Package_1 = NULL | Modulation_based_multislot_class_support = NULL | GMSK_MultislotPowerProfile = NULL | EightPSK_MultislotProfile = NULL | MultipleTBF_Capability = NULL | DownlinkAdvancedReceiverPerformance = NULL | ExtendedRLC_MAC_ControlMessageSegmentionsCapability = NULL | DTM_EnhancementsCapability = NULL | PS_HandoverCapability = NULL | DTM_Handover_Capability = NULL | FlexibleTimeslotAssignment = NULL | GAN_PS_HandoverCapability = NULL | RLC_Non_persistentMode = NULL | ReducedLatencyCapability = NULL | UplinkEGPRS2 = NULL | DownlinkEGPRS2 = NULL | EUTRA_FDD_Support = NULL | EUTRA_TDD_Support = NULL | GERAN_To_EUTRAN_supportInGERAN_PTM = NULL | PriorityBasedReselectionSupport = NULL | MS_RA_capability_value } | Padding = 0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|</span><br><span> DCSN1 INFO csnStreamDecoder (RAcap): MS_RA_capability_value { | Choice MS_RA_capability_value_Choice = 1 | u.Content length = 73 | offset = 1 | RF_Power_Capability = 4 | Exist_A5_bits = 1 | A5_bits = 80 | ES_IND = 1 | PS = 1 | VGCS = 0 | VBS = 0 | Exist_Multislot_capability = 1 |  : Multislot_capability | Exist_HSCSD_multislot_class = 0 | Exist_GPRS_multislot_class = 1 | GPRS_multislot_class = 12 | GPRS_Extended_Dynamic_Allocation_Capability = 1 | Exist_SM = 1 | SMS_VALUE = 7 | SM_VALUE = 1 | Exist_ECSD_multislot_class = 0 | Exist_EGPRS_multislot_class = 1 | EGPRS_multislot_class = 12 | EGPRS_Extended_Dynamic_Allocation_Capability = 1 | Exist_DTM_GPRS_multislot_class = 1 | DTM_GPRS_multislot_class = 3 | Single_Slot_DTM = 0 |  : DTM_EGPRS_Params | Exist_DTM_EGPRS_multislot_class = 1 | DTM_EGPRS_multislot_class = 3 | : End DTM_EGPRS_Params | : End Multislot_capability | Exist_Eight_PSK_Power_Capability = 1 | Eight_PSK_Power_Capability = 2 | COMPACT_Interference_Measurement_Capability = 0 | Revision_Level_Indicator = 1 | UMTS_FDD_Radio_Access_Technology_Capability = 0 | UMTS_384_TDD_Radio_Access_Technology_Capability = 0 | CDMA2000_Radio_Access_Technology_Capability = 0 | UMTS_128_TDD_Radio_Access_Technology_Capability = 0 | GERAN_Feature_Package_1 = 1 | Exist_Extended_DTM_multislot_class = 0 | Modulation_based_multislot_class_support = 0 | Exist_HighMultislotCapability = 0 | Exist_GERAN_lu_ModeCapability = 0 | GMSK_MultislotPowerProfile = 3 | EightPSK_MultislotProfile = 3 | MultipleTBF_Capability = 0 | DownlinkAdvancedReceiverPerformance = 1 | ExtendedRLC_MAC_ControlMessageSegmentionsCapability = 1 | DTM_EnhancementsCapability = 1 | Exist_DTM_GPRS_HighMultislotClass = 0 | PS_HandoverCapability = 0 | DTM_Handover_Capability = NULL | FlexibleTimeslotAssignment = NULL | GAN_PS_HandoverCapability = NULL | RLC_Non_persistentMode = NULL | ReducedLatencyCapability = NULL | UplinkEGPRS2 = NULL | DownlinkEGPRS2 = NULL | EUTRA_FDD_Support = NULL | EUTRA_TDD_Support = NULL | GERAN_To_EUTRAN_supportInGERAN_PTM = NULL | PriorityBasedReselectionSupport = NULL | MS_RA_capability_value } | MS_RA_capability_value { | Choice MS_RA_capability_value_Choice = 7 | u.Content length = 34 | offset = 1 | RF_Power_Capability = 4 | Exist_A5_bits = 0 | ES_IND = 1 | PS = 1 | VGCS = 0 | VBS = 0 | Exist_Multislot_capability = 0 | Exist_Eight_PSK_Power_Capability = 1 | Eight_PSK_Power_Capability = 2 | COMPACT_Interference_Measurement_Capability = 0 | Revision_Level_Indicator = 1 | UMTS_FDD_Radio_Access_Technology_Capability = 0 | UMTS_384_TDD_Radio_Access_Technology_Capability = 0 | CDMA2000_Radio_Access_Technology_Capability = 0 | UMTS_128_TDD_Radio_Access_Technology_Capability = 0 | GERAN_Feature_Package_1 = 1 | Exist_Extended_DTM_multislot_class = 0 | Modulation_based_multislot_class_support = 0 | Exist_HighMultislotCapability = 0 | Exist_GERAN_lu_ModeCapability = 0 | GMSK_MultislotPowerProfile = 3 | EightPSK_MultislotProfile = 3 | MultipleTBF_Capability = 0 | DownlinkAdvancedReceiverPerformance = 1 | ExtendedRLC_MAC_ControlMessageSegmentionsCapability = 1 | DTM_EnhancementsCapability = 1 | Exist_DTM_GPRS_HighMultislotClass = 0 | PS_HandoverCapability = 0 | DTM_Handover_Capability = NULL | FlexibleTimeslotAssignment = NULL | GAN_PS_HandoverCapability = NULL | RLC_Non_persistentMode = NULL | ReducedLatencyCapability = NULL | UplinkEGPRS2 = NULL | DownlinkEGPRS2 = NULL | EUTRA_FDD_Support = NULL | EUTRA_TDD_Support = NULL | GERAN_To_EUTRAN_supportInGERAN_PTM = NULL | PriorityBasedReselectionSupport = NULL | MS_RA_capability_value } | MS_RA_capability_value { | Choice MS_RA_capability_value_Choice = 3 | u.Content length = 34 | offset = 1 | RF_Power_Capability = 1 | Exist_A5_bits = 0 | ES_IND = 1 | PS = 1 | VGCS = 0 | VBS = 0 | Exist_Multislot_capability = 0 | Exist_Eight_PSK_Power_Capability = 1 | Eight_PSK_Power_Capability = 2 | COMPACT_Interference_Measurement_Capability = 0 | Revision_Level_Indicator = 1 | UMTS_FDD_Radio_Access_Technology_Capability = 0 | UMTS_384_TDD_Radio_Access_Technology_Capability = 0 | CDMA2000_Radio_Access_Technology_Capability = 0 | UMTS_128_TDD_Radio_Access_Technology_Capability = 0 | GERAN_Feature_Package_1 = 1 | Exist_Extended_DTM_multislot_class = 0 | Modulation_based_multislot_class_support = 0 | Exist_HighMultislotCapability = 0 | Exist_GERAN_lu_ModeCapability = 0 | GMSK_MultislotPowerProfile = 3 | EightPSK_MultislotProfile = 3 | MultipleTBF_Capability = 0 | DownlinkAdvancedReceiverPerformance = 1 | ExtendedRLC_MAC_ControlMessageSegmentionsCapability = 1 | DTM_EnhancementsCapability = 1 | Exist_DTM_GPRS_HighMultislotClass = 0 | PS_HandoverCapability = 0 | DTM_Handover_Capability = NULL | FlexibleTimeslotAssignment = NULL | GAN_PS_HandoverCapability = NULL | RLC_Non_persistentMode = NULL | ReducedLatencyCapability = NULL | UplinkEGPRS2 = NULL | DownlinkEGPRS2 = NULL | EUTRA_FDD_Support = NULL | EUTRA_TDD_Support = NULL | GERAN_To_EUTRAN_supportInGERAN_PTM = NULL | PriorityBasedReselectionSupport = NULL | MS_RA_capability_value } | Padding = 0|</span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): Choice EGPRS_PacketChannelRequest_Choice = 0 |  : Content | MultislotClass = 21 | Priority = 2 | RandomBits = 5 | : End Content | </span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): Choice EGPRS_PacketChannelRequest_Choice = 0 |  : Content | MultislotClass = 10 | Priority = 1 | RandomBits = 2 | : End Content | </span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): Choice EGPRS_PacketChannelRequest_Choice = 4 |  : Content | NumberOfBlocks = 1 | Priority = 1 | RandomBits = 0 | : End Content | </span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): Choice EGPRS_PacketChannelRequest_Choice = 48 |  : Content | Priority = 0 | RandomBits = 0 | : End Content | </span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): Choice EGPRS_PacketChannelRequest_Choice = 48 |  : Content | Priority = 3 | RandomBits = 7 | : End Content | </span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): Choice EGPRS_PacketChannelRequest_Choice = 51 |  : Content | RandomBits = 21 | : End Content | </span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): Choice EGPRS_PacketChannelRequest_Choice = 51 |  : Content | RandomBits = 17 | : End Content | </span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): Choice EGPRS_PacketChannelRequest_Choice = 55 |  : Content | RandomBits = 25 | : End Content | </span><br><span style="color: hsl(120, 100%, 40%);">+DCSN1 DEBUG csnStreamDecoder (EGPRS Packet Channel Request): DCSN1 ERROR csnStreamDecoder: error STREAM_NOT_SUPPORTED (-8) at EGPRS_PacketChannelRequest_Choice (idx 0)</span><br><span>diff --git a/tests/rlcmac/RLCMACTest.ok b/tests/rlcmac/RLCMACTest.ok</span><br><span>index 4e4967b..861b1b9 100644</span><br><span>--- a/tests/rlcmac/RLCMACTest.ok</span><br><span>+++ b/tests/rlcmac/RLCMACTest.ok</span><br><span>@@ -149,3 +149,21 @@</span><br><span> decode_gsm_ra_cap() returns 0</span><br><span> GPRS multislot class = 12</span><br><span> EGPRS multislot class = 12</span><br><span style="color: hsl(120, 100%, 40%);">+*** testEGPRSPktChReq ***</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x2b5) returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+ ==> One Phase Access</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x14a) returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+ ==> One Phase Access</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x428) returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+ ==> Short Access</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x600) returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+ ==> Two Phase Access</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x61f) returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+ ==> Two Phase Access</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x675) returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+ ==> Signalling</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x671) returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+ ==> Signalling</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x6f9) returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+ ==> Emergency call</span><br><span style="color: hsl(120, 100%, 40%);">+decode_egprs_pkt_ch_req(0x7ea) returns -8</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/17718">change 17718</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/+/17718"/><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: I96df3352856933c9140177b2801a2c71f4134183 </div>
<div style="display:none"> Gerrit-Change-Number: 17718 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>