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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">rlcmac: Return error code from csn1 encoder/decoder<br><br>Change-Id: I0c5e1b870608b0622b239791effd5c5878e230bc<br>---<br>M src/gsm_rlcmac.cpp<br>M src/gsm_rlcmac.h<br>2 files changed, 143 insertions(+), 98 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gsm_rlcmac.cpp b/src/gsm_rlcmac.cpp</span><br><span>index 4550c47..ae2b7e4 100644</span><br><span>--- a/src/gsm_rlcmac.cpp</span><br><span>+++ b/src/gsm_rlcmac.cpp</span><br><span>@@ -4807,21 +4807,23 @@</span><br><span>   M_UINT_LH      (SI6_RestOctet_t,  BandIndicator,  1),</span><br><span> CSN_DESCR_END    (SI6_RestOctet_t)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void decode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Returns 0 on success, negative on error. */</span><br><span style="color: hsl(120, 100%, 40%);">+int decode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data)</span><br><span> {</span><br><span>   csnStream_t      ar;</span><br><span style="color: hsl(120, 100%, 40%);">+  int ret;</span><br><span>   unsigned readIndex = 0;</span><br><span>   guint8 payload_type = bitvec_read_field(vector, &readIndex, 2);</span><br><span> </span><br><span>   if (payload_type == PAYLOAD_TYPE_DATA)</span><br><span>   {</span><br><span>     LOGPC(DRLCMACDATA, LOGL_NOTICE, "Payload Type: DATA (0), not implemented");</span><br><span style="color: hsl(0, 100%, 40%);">-    return;</span><br><span style="color: hsl(120, 100%, 40%);">+    return CSN_ERROR_GENERAL;</span><br><span>   }</span><br><span>   else if (payload_type == PAYLOAD_TYPE_RESERVED)</span><br><span>   {</span><br><span>     LOGPC(DRLCMACDATA, LOGL_NOTICE, "Payload Type: RESERVED (3)");</span><br><span style="color: hsl(0, 100%, 40%);">-    return;</span><br><span style="color: hsl(120, 100%, 40%);">+    return CSN_ERROR_GENERAL;</span><br><span>   }</span><br><span>   data->NrOfBits = 23 * 8;</span><br><span>   csnStreamInit(&ar, 0, data->NrOfBits);</span><br><span>@@ -4837,88 +4839,98 @@</span><br><span>        * CSNDESCR is an array that holds the different element types</span><br><span>        * ar is the csn context holding the bitcount, offset and output</span><br><span>        */</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Cell_Change_Failure_t), vector, readIndex, &data->u.Packet_Cell_Change_Failure);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Cell_Change_Failure_t), vector, readIndex, &data->u.Packet_Cell_Change_Failure);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_CONTROL_ACK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Control_Acknowledgement_t), vector, readIndex, &data->u.Packet_Control_Acknowledgement);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Control_Acknowledgement_t), vector, readIndex, &data->u.Packet_Control_Acknowledgement);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_DOWNLINK_ACK_NACK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Downlink_Ack_Nack_t), vector, readIndex, &data->u.Packet_Downlink_Ack_Nack);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Downlink_Ack_Nack_t), vector, readIndex, &data->u.Packet_Downlink_Ack_Nack);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_UPLINK_DUMMY_CONTROL_BLOCK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Uplink_Dummy_Control_Block_t), vector, readIndex, &data->u.Packet_Uplink_Dummy_Control_Block);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Uplink_Dummy_Control_Block_t), vector, readIndex, &data->u.Packet_Uplink_Dummy_Control_Block);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_MEASUREMENT_REPORT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Measurement_Report_t), vector, readIndex, &data->u.Packet_Measurement_Report);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Measurement_Report_t), vector, readIndex, &data->u.Packet_Measurement_Report);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_RESOURCE_REQUEST:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Resource_Request_t), vector, readIndex, &data->u.Packet_Resource_Request);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Resource_Request_t), vector, readIndex, &data->u.Packet_Resource_Request);</span><br><span>       break;</span><br><span>     }</span><br><span> </span><br><span>     case MT_PACKET_MOBILE_TBF_STATUS:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Mobile_TBF_Status_t), vector, readIndex, &data->u.Packet_Mobile_TBF_Status);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Mobile_TBF_Status_t), vector, readIndex, &data->u.Packet_Mobile_TBF_Status);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PSI_STATUS:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_PSI_Status_t), vector, readIndex, &data->u.Packet_PSI_Status);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_PSI_Status_t), vector, readIndex, &data->u.Packet_PSI_Status);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_EGPRS_PACKET_DOWNLINK_ACK_NACK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(EGPRS_PD_AckNack_t), vector, readIndex, &data->u.Egprs_Packet_Downlink_Ack_Nack);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(EGPRS_PD_AckNack_t), vector, readIndex, &data->u.Egprs_Packet_Downlink_Ack_Nack);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PAUSE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Pause_t), vector, readIndex, &data->u.Packet_Pause);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Pause_t), vector, readIndex, &data->u.Packet_Pause);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_ENHANCED_MEASUREMENT_REPORT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Enh_Measurement_Report_t), vector, readIndex, &data->u.Packet_Enh_Measurement_Report);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Enh_Measurement_Report_t), vector, readIndex, &data->u.Packet_Enh_Measurement_Report);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_ADDITIONAL_MS_RAC:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Additional_MS_Rad_Access_Cap_t), vector, readIndex, &data->u.Additional_MS_Rad_Access_Cap);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Additional_MS_Rad_Access_Cap_t), vector, readIndex, &data->u.Additional_MS_Rad_Access_Cap);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_CELL_CHANGE_NOTIFICATION:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Cell_Change_Notification_t), vector, readIndex, &data->u.Packet_Cell_Change_Notification);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Cell_Change_Notification_t), vector, readIndex, &data->u.Packet_Cell_Change_Notification);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SI_STATUS:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_SI_Status_t), vector, readIndex, &data->u.Packet_SI_Status);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_SI_Status_t), vector, readIndex, &data->u.Packet_SI_Status);</span><br><span>       break;</span><br><span>     }</span><br><span>     default:</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret = -1;*/</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = -1;</span><br><span>       break;</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ret > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DRLCMACDATA, LOGL_NOTICE, "Got %d remaining bits unhandled by decoder at the end of bitvec\n", ret);</span><br><span style="color: hsl(120, 100%, 40%);">+    ret = 0;</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 ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void decode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Returns 0 on success, negative on error. */</span><br><span style="color: hsl(120, 100%, 40%);">+int decode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data)</span><br><span> {</span><br><span>   csnStream_t  ar;</span><br><span>   /* See RLC/MAC downlink control block structure in TS 44.060 / 10.3.1 */</span><br><span>   gint bit_offset = 0;</span><br><span>   gint bit_length;</span><br><span>   unsigned readIndex = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   data->PAYLOAD_TYPE = bitvec_read_field(vector, &readIndex, 2);</span><br><span>   data->RRBP = bitvec_read_field(vector, &readIndex, 2);</span><br><span>   data->SP = bitvec_read_field(vector, &readIndex, 1);</span><br><span>@@ -4927,12 +4939,12 @@</span><br><span>   if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA)</span><br><span>   {</span><br><span>     LOGPC(DRLCMACDATA, LOGL_NOTICE, "Payload Type: DATA (0), not implemented");</span><br><span style="color: hsl(0, 100%, 40%);">-    return;</span><br><span style="color: hsl(120, 100%, 40%);">+    return CSN_ERROR_GENERAL;</span><br><span>   }</span><br><span>   else if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_RESERVED)</span><br><span>   {</span><br><span>     LOGPC(DRLCMACDATA, LOGL_NOTICE, "Payload Type: RESERVED (3)");</span><br><span style="color: hsl(0, 100%, 40%);">-    return;</span><br><span style="color: hsl(120, 100%, 40%);">+    return CSN_ERROR_GENERAL;</span><br><span>   }</span><br><span>   /* We can decode the message */</span><br><span>   else</span><br><span>@@ -4975,139 +4987,149 @@</span><br><span>   {</span><br><span>     case MT_PACKET_ACCESS_REJECT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Access_Reject_t), vector, readIndex, &data->u.Packet_Access_Reject);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Access_Reject_t), vector, readIndex, &data->u.Packet_Access_Reject);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_CELL_CHANGE_ORDER:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Cell_Change_Order_t), vector, readIndex, &data->u.Packet_Cell_Change_Order);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Cell_Change_Order_t), vector, readIndex, &data->u.Packet_Cell_Change_Order);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_CELL_CHANGE_CONTINUE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Cell_Change_Continue_t), vector, readIndex, &data->u.Packet_Cell_Change_Continue);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Cell_Change_Continue_t), vector, readIndex, &data->u.Packet_Cell_Change_Continue);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_DOWNLINK_ASSIGNMENT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Downlink_Assignment_t), vector, readIndex, &data->u.Packet_Downlink_Assignment);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Downlink_Assignment_t), vector, readIndex, &data->u.Packet_Downlink_Assignment);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_MEASUREMENT_ORDER:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Measurement_Order_t), vector, readIndex, &data->u.Packet_Measurement_Order);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Measurement_Order_t), vector, readIndex, &data->u.Packet_Measurement_Order);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_NEIGHBOUR_CELL_DATA:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Neighbour_Cell_Data_t), vector, readIndex, &data->u.Packet_Neighbour_Cell_Data);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Neighbour_Cell_Data_t), vector, readIndex, &data->u.Packet_Neighbour_Cell_Data);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SERVING_CELL_DATA:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Serving_Cell_Data_t), vector, readIndex, &data->u.Packet_Serving_Cell_Data);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Serving_Cell_Data_t), vector, readIndex, &data->u.Packet_Serving_Cell_Data);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PAGING_REQUEST:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Paging_Request_t), vector, readIndex, &data->u.Packet_Paging_Request);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Paging_Request_t), vector, readIndex, &data->u.Packet_Paging_Request);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PDCH_RELEASE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_PDCH_Release_t), vector, readIndex, &data->u.Packet_PDCH_Release);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_PDCH_Release_t), vector, readIndex, &data->u.Packet_PDCH_Release);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_POLLING_REQ:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Polling_Request_t), vector, readIndex, &data->u.Packet_Polling_Request);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Polling_Request_t), vector, readIndex, &data->u.Packet_Polling_Request);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_POWER_CONTROL_TIMING_ADVANCE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Power_Control_Timing_Advance_t), vector, readIndex, &data->u.Packet_Power_Control_Timing_Advance);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Power_Control_Timing_Advance_t), vector, readIndex, &data->u.Packet_Power_Control_Timing_Advance);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PRACH_PARAMETERS:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_PRACH_Parameters_t), vector, readIndex, &data->u.Packet_PRACH_Parameters);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_PRACH_Parameters_t), vector, readIndex, &data->u.Packet_PRACH_Parameters);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_QUEUEING_NOTIFICATION:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Queueing_Notification_t), vector, readIndex, &data->u.Packet_Queueing_Notification);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Queueing_Notification_t), vector, readIndex, &data->u.Packet_Queueing_Notification);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_TIMESLOT_RECONFIGURE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Timeslot_Reconfigure_t), vector, readIndex, &data->u.Packet_Timeslot_Reconfigure);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Timeslot_Reconfigure_t), vector, readIndex, &data->u.Packet_Timeslot_Reconfigure);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_TBF_RELEASE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_TBF_Release_t), vector, readIndex, &data->u.Packet_TBF_Release);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_TBF_Release_t), vector, readIndex, &data->u.Packet_TBF_Release);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_UPLINK_ACK_NACK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Uplink_Ack_Nack_t), vector, readIndex, &data->u.Packet_Uplink_Ack_Nack);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Uplink_Ack_Nack_t), vector, readIndex, &data->u.Packet_Uplink_Ack_Nack);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_UPLINK_ASSIGNMENT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Uplink_Assignment_t), vector, readIndex, &data->u.Packet_Uplink_Assignment);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Uplink_Assignment_t), vector, readIndex, &data->u.Packet_Uplink_Assignment);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_HANDOVER_COMMAND:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Handover_Command_t), vector, readIndex, &data->u.Packet_Handover_Command);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Handover_Command_t), vector, readIndex, &data->u.Packet_Handover_Command);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PHYSICAL_INFORMATION:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_PhysicalInformation_t), vector, readIndex, &data->u.Packet_Handover_Command);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_PhysicalInformation_t), vector, readIndex, &data->u.Packet_Handover_Command);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_DOWNLINK_DUMMY_CONTROL_BLOCK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(Packet_Downlink_Dummy_Control_Block_t), vector, readIndex, &data->u.Packet_Downlink_Dummy_Control_Block);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(Packet_Downlink_Dummy_Control_Block_t), vector, readIndex, &data->u.Packet_Downlink_Dummy_Control_Block);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_1:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(PSI1_t), vector, readIndex, &data->u.PSI1);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(PSI1_t), vector, readIndex, &data->u.PSI1);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_2:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(PSI2_t), vector, readIndex, &data->u.PSI2);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(PSI2_t), vector, readIndex, &data->u.PSI2);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_3:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(PSI3_t), vector, readIndex, &data->u.PSI3);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(PSI3_t), vector, readIndex, &data->u.PSI3);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_5:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(PSI5_t), vector, readIndex, &data->u.PSI5);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(PSI5_t), vector, readIndex, &data->u.PSI5);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_13:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamDecoder(&ar, CSNDESCR(PSI13_t), vector, readIndex, &data->u.PSI13);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamDecoder(&ar, CSNDESCR(PSI13_t), vector, readIndex, &data->u.PSI13);</span><br><span>       break;</span><br><span>     }</span><br><span>     default:</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret = -1;*/</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = CSN_ERROR_GENERAL;</span><br><span>       break;</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ret > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DRLCMACDATA, LOGL_NOTICE, "Got %d remaining bits unhandled by decoder at the end of bitvec\n", ret);</span><br><span style="color: hsl(120, 100%, 40%);">+    ret = 0;</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 ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void encode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Returns 0 on success, negative on error. */</span><br><span style="color: hsl(120, 100%, 40%);">+int encode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data)</span><br><span> {</span><br><span>   csnStream_t      ar;</span><br><span>   unsigned writeIndex = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   data->NrOfBits = 23 * 8;</span><br><span>   csnStreamInit(&ar, 0, data->NrOfBits);</span><br><span>   writeIndex = 0;</span><br><span>@@ -5120,85 +5142,93 @@</span><br><span>        * CSNDESCR is an array that holds the different element types</span><br><span>        * ar is the csn context holding the bitcount, offset and output</span><br><span>        */</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Cell_Change_Failure_t), vector, writeIndex, &data->u.Packet_Cell_Change_Failure);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Cell_Change_Failure_t), vector, writeIndex, &data->u.Packet_Cell_Change_Failure);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_CONTROL_ACK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Control_Acknowledgement_t), vector, writeIndex, &data->u.Packet_Control_Acknowledgement);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Control_Acknowledgement_t), vector, writeIndex, &data->u.Packet_Control_Acknowledgement);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_DOWNLINK_ACK_NACK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Downlink_Ack_Nack_t), vector, writeIndex, &data->u.Packet_Downlink_Ack_Nack);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Downlink_Ack_Nack_t), vector, writeIndex, &data->u.Packet_Downlink_Ack_Nack);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_UPLINK_DUMMY_CONTROL_BLOCK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Uplink_Dummy_Control_Block_t), vector, writeIndex, &data->u.Packet_Uplink_Dummy_Control_Block);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Uplink_Dummy_Control_Block_t), vector, writeIndex, &data->u.Packet_Uplink_Dummy_Control_Block);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_MEASUREMENT_REPORT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Measurement_Report_t), vector, writeIndex, &data->u.Packet_Measurement_Report);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Measurement_Report_t), vector, writeIndex, &data->u.Packet_Measurement_Report);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_RESOURCE_REQUEST:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Resource_Request_t), vector, writeIndex, &data->u.Packet_Resource_Request);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Resource_Request_t), vector, writeIndex, &data->u.Packet_Resource_Request);</span><br><span>       break;</span><br><span>     }</span><br><span> </span><br><span>     case MT_PACKET_MOBILE_TBF_STATUS:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Mobile_TBF_Status_t), vector, writeIndex, &data->u.Packet_Mobile_TBF_Status);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Mobile_TBF_Status_t), vector, writeIndex, &data->u.Packet_Mobile_TBF_Status);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PSI_STATUS:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_PSI_Status_t), vector, writeIndex, &data->u.Packet_PSI_Status);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_PSI_Status_t), vector, writeIndex, &data->u.Packet_PSI_Status);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_EGPRS_PACKET_DOWNLINK_ACK_NACK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(EGPRS_PD_AckNack_t), vector, writeIndex, &data->u.Egprs_Packet_Downlink_Ack_Nack);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(EGPRS_PD_AckNack_t), vector, writeIndex, &data->u.Egprs_Packet_Downlink_Ack_Nack);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PAUSE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Pause_t), vector, writeIndex, &data->u.Packet_Pause);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Pause_t), vector, writeIndex, &data->u.Packet_Pause);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_ENHANCED_MEASUREMENT_REPORT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Enh_Measurement_Report_t), vector, writeIndex, &data->u.Packet_Enh_Measurement_Report);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Enh_Measurement_Report_t), vector, writeIndex, &data->u.Packet_Enh_Measurement_Report);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_ADDITIONAL_MS_RAC:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Additional_MS_Rad_Access_Cap_t), vector, writeIndex, &data->u.Additional_MS_Rad_Access_Cap);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Additional_MS_Rad_Access_Cap_t), vector, writeIndex, &data->u.Additional_MS_Rad_Access_Cap);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_CELL_CHANGE_NOTIFICATION:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Cell_Change_Notification_t), vector, writeIndex, &data->u.Packet_Cell_Change_Notification);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Cell_Change_Notification_t), vector, writeIndex, &data->u.Packet_Cell_Change_Notification);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SI_STATUS:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_SI_Status_t), vector, writeIndex, &data->u.Packet_SI_Status);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_SI_Status_t), vector, writeIndex, &data->u.Packet_SI_Status);</span><br><span>       break;</span><br><span>     }</span><br><span>     default:</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret = -1;*/</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = CSN_ERROR_GENERAL;</span><br><span>       break;</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ret > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DRLCMACDATA, LOGL_NOTICE, "Got %d remaining bits unhandled by encoder at the end of bitvec\n", ret);</span><br><span style="color: hsl(120, 100%, 40%);">+    ret = 0;</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 ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void encode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Returns 0 on success, negative on error. */</span><br><span style="color: hsl(120, 100%, 40%);">+int encode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data)</span><br><span> {</span><br><span>   csnStream_t  ar;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+  int ret;</span><br><span>   /* See RLC/MAC downlink control block structure in TS 44.060 / 10.3.1 */</span><br><span>   gint bit_offset = 0;</span><br><span>   gint bit_length;</span><br><span>@@ -5207,12 +5237,12 @@</span><br><span>   if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA)</span><br><span>   {</span><br><span>     LOGPC(DRLCMACDATA, LOGL_NOTICE, "Payload Type: DATA (0), not implemented");</span><br><span style="color: hsl(0, 100%, 40%);">-    return;</span><br><span style="color: hsl(120, 100%, 40%);">+    return CSN_ERROR_GENERAL;</span><br><span>   }</span><br><span>   else if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_RESERVED)</span><br><span>   {</span><br><span>     LOGPC(DRLCMACDATA, LOGL_NOTICE, "Payload Type: RESERVED (3)");</span><br><span style="color: hsl(0, 100%, 40%);">-    return;</span><br><span style="color: hsl(120, 100%, 40%);">+    return CSN_ERROR_GENERAL;</span><br><span>   }</span><br><span>   /* We can decode the message */</span><br><span>   else</span><br><span>@@ -5257,133 +5287,140 @@</span><br><span>   {</span><br><span>     case MT_PACKET_ACCESS_REJECT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Access_Reject_t), vector, writeIndex, &data->u.Packet_Access_Reject);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Access_Reject_t), vector, writeIndex, &data->u.Packet_Access_Reject);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_CELL_CHANGE_ORDER:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Cell_Change_Order_t), vector, writeIndex, &data->u.Packet_Cell_Change_Order);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Cell_Change_Order_t), vector, writeIndex, &data->u.Packet_Cell_Change_Order);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_CELL_CHANGE_CONTINUE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Cell_Change_Continue_t), vector, writeIndex, &data->u.Packet_Cell_Change_Continue);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Cell_Change_Continue_t), vector, writeIndex, &data->u.Packet_Cell_Change_Continue);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_DOWNLINK_ASSIGNMENT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Downlink_Assignment_t), vector, writeIndex, &data->u.Packet_Downlink_Assignment);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Downlink_Assignment_t), vector, writeIndex, &data->u.Packet_Downlink_Assignment);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_MEASUREMENT_ORDER:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Measurement_Order_t), vector, writeIndex, &data->u.Packet_Measurement_Order);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Measurement_Order_t), vector, writeIndex, &data->u.Packet_Measurement_Order);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_NEIGHBOUR_CELL_DATA:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Neighbour_Cell_Data_t), vector, writeIndex, &data->u.Packet_Neighbour_Cell_Data);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Neighbour_Cell_Data_t), vector, writeIndex, &data->u.Packet_Neighbour_Cell_Data);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SERVING_CELL_DATA:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Serving_Cell_Data_t), vector, writeIndex, &data->u.Packet_Serving_Cell_Data);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Serving_Cell_Data_t), vector, writeIndex, &data->u.Packet_Serving_Cell_Data);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PAGING_REQUEST:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Paging_Request_t), vector, writeIndex, &data->u.Packet_Paging_Request);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Paging_Request_t), vector, writeIndex, &data->u.Packet_Paging_Request);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PDCH_RELEASE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_PDCH_Release_t), vector, writeIndex, &data->u.Packet_PDCH_Release);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_PDCH_Release_t), vector, writeIndex, &data->u.Packet_PDCH_Release);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_POLLING_REQ:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Polling_Request_t), vector, writeIndex, &data->u.Packet_Polling_Request);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Polling_Request_t), vector, writeIndex, &data->u.Packet_Polling_Request);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_POWER_CONTROL_TIMING_ADVANCE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Power_Control_Timing_Advance_t), vector, writeIndex, &data->u.Packet_Power_Control_Timing_Advance);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Power_Control_Timing_Advance_t), vector, writeIndex, &data->u.Packet_Power_Control_Timing_Advance);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PRACH_PARAMETERS:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_PRACH_Parameters_t), vector, writeIndex, &data->u.Packet_PRACH_Parameters);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_PRACH_Parameters_t), vector, writeIndex, &data->u.Packet_PRACH_Parameters);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_QUEUEING_NOTIFICATION:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Queueing_Notification_t), vector, writeIndex, &data->u.Packet_Queueing_Notification);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Queueing_Notification_t), vector, writeIndex, &data->u.Packet_Queueing_Notification);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_TIMESLOT_RECONFIGURE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Timeslot_Reconfigure_t), vector, writeIndex, &data->u.Packet_Timeslot_Reconfigure);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Timeslot_Reconfigure_t), vector, writeIndex, &data->u.Packet_Timeslot_Reconfigure);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_TBF_RELEASE:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_TBF_Release_t), vector, writeIndex, &data->u.Packet_TBF_Release);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_TBF_Release_t), vector, writeIndex, &data->u.Packet_TBF_Release);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_UPLINK_ACK_NACK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Uplink_Ack_Nack_t), vector, writeIndex, &data->u.Packet_Uplink_Ack_Nack);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Uplink_Ack_Nack_t), vector, writeIndex, &data->u.Packet_Uplink_Ack_Nack);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_UPLINK_ASSIGNMENT:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Uplink_Assignment_t), vector, writeIndex, &data->u.Packet_Uplink_Assignment);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Uplink_Assignment_t), vector, writeIndex, &data->u.Packet_Uplink_Assignment);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_HANDOVER_COMMAND:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Handover_Command_t), vector, writeIndex, &data->u.Packet_Handover_Command);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Handover_Command_t), vector, writeIndex, &data->u.Packet_Handover_Command);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_PHYSICAL_INFORMATION:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_PhysicalInformation_t), vector, writeIndex, &data->u.Packet_Handover_Command);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_PhysicalInformation_t), vector, writeIndex, &data->u.Packet_Handover_Command);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_DOWNLINK_DUMMY_CONTROL_BLOCK:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(Packet_Downlink_Dummy_Control_Block_t), vector, writeIndex, &data->u.Packet_Downlink_Dummy_Control_Block);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(Packet_Downlink_Dummy_Control_Block_t), vector, writeIndex, &data->u.Packet_Downlink_Dummy_Control_Block);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_1:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(PSI1_t), vector, writeIndex, &data->u.PSI1);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(PSI1_t), vector, writeIndex, &data->u.PSI1);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_2:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(PSI2_t), vector, writeIndex, &data->u.PSI2);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(PSI2_t), vector, writeIndex, &data->u.PSI2);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_3:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(PSI3_t), vector, writeIndex, &data->u.PSI3);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(PSI3_t), vector, writeIndex, &data->u.PSI3);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_5:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(PSI5_t), vector, writeIndex, &data->u.PSI5);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(PSI5_t), vector, writeIndex, &data->u.PSI5);</span><br><span>       break;</span><br><span>     }</span><br><span>     case MT_PACKET_SYSTEM_INFO_13:</span><br><span>     {</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret =*/ csnStreamEncoder(&ar, CSNDESCR(PSI13_t), vector, writeIndex, &data->u.PSI13);</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = csnStreamEncoder(&ar, CSNDESCR(PSI13_t), vector, writeIndex, &data->u.PSI13);</span><br><span>       break;</span><br><span>     }</span><br><span>     default:</span><br><span style="color: hsl(0, 100%, 40%);">-      /*ret = -1;*/</span><br><span style="color: hsl(120, 100%, 40%);">+      ret = -1;</span><br><span>       break;</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ret > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DRLCMACDATA, LOGL_NOTICE, "Got %d remaining bits unhandled by encoder at the end of bitvec\n", ret);</span><br><span style="color: hsl(120, 100%, 40%);">+    ret = 0;</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 ret;</span><br><span> }</span><br><span> </span><br><span> void decode_gsm_rlcmac_uplink_data(bitvec * vector, RlcMacUplinkDataBlock_t * data)</span><br><span>@@ -5525,7 +5562,15 @@</span><br><span> int decode_gsm_ra_cap(bitvec * vector, MS_Radio_Access_capability_t *data)</span><br><span> {</span><br><span>   csnStream_t      ar;</span><br><span style="color: hsl(120, 100%, 40%);">+  int ret;</span><br><span>   unsigned readIndex = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   csnStreamInit(&ar, 0, 8 * vector->data_len);</span><br><span style="color: hsl(0, 100%, 40%);">-  return csnStreamDecoder(&ar, CSNDESCR(MS_Radio_Access_capability_t), vector, readIndex, data);</span><br><span style="color: hsl(120, 100%, 40%);">+  ret = csnStreamDecoder(&ar, CSNDESCR(MS_Radio_Access_capability_t), vector, readIndex, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ret > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DRLCMACDATA, LOGL_NOTICE, "Got %d remaining bits unhandled by decoder at the end of bitvec\n", ret);</span><br><span style="color: hsl(120, 100%, 40%);">+    ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  return ret;</span><br><span> }</span><br><span>diff --git a/src/gsm_rlcmac.h b/src/gsm_rlcmac.h</span><br><span>index 461fda3..e9b355d 100644</span><br><span>--- a/src/gsm_rlcmac.h</span><br><span>+++ b/src/gsm_rlcmac.h</span><br><span>@@ -5154,10 +5154,10 @@</span><br><span> </span><br><span> } EnhancedMeasurementReport_t;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- void decode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data);</span><br><span style="color: hsl(0, 100%, 40%);">- void decode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data);</span><br><span style="color: hsl(0, 100%, 40%);">- void encode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data);</span><br><span style="color: hsl(0, 100%, 40%);">- void encode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data);</span><br><span style="color: hsl(120, 100%, 40%);">+ int decode_gsm_rlcmac_uplink(bitvec *vector, RlcMacUplink_t *data);</span><br><span style="color: hsl(120, 100%, 40%);">+ int decode_gsm_rlcmac_downlink(bitvec *vector, RlcMacDownlink_t *data);</span><br><span style="color: hsl(120, 100%, 40%);">+ int encode_gsm_rlcmac_downlink(bitvec *vector, RlcMacDownlink_t *data);</span><br><span style="color: hsl(120, 100%, 40%);">+ int encode_gsm_rlcmac_uplink(bitvec *vector, RlcMacUplink_t *data);</span><br><span>  void decode_gsm_rlcmac_uplink_data(bitvec * vector, RlcMacUplinkDataBlock_t * data);</span><br><span>  void encode_gsm_rlcmac_downlink_data(bitvec * vector, RlcMacDownlinkDataBlock_t * data);</span><br><span>  int decode_gsm_ra_cap(bitvec * vector, MS_Radio_Access_capability_t * data);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/17085">change 17085</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/+/17085"/><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: I0c5e1b870608b0622b239791effd5c5878e230bc </div>
<div style="display:none"> Gerrit-Change-Number: 17085 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </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: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>