blob: f1b650889e54d7522890ef2ae8ab65e5d142becd [file] [log] [blame]
Ivan Kluchnikov487a1412011-12-21 13:17:53 +03001/* RLCMACTest.cpp
2 *
3 * Copyright (C) 2011 Ivan Klyuchnikov
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20
21
22//#include <BitVector.h>
23#include <iostream>
24#include <cstdlib>
Ivan Kluchnikov835f91e2012-04-30 18:00:36 +040025#include <cstring>
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +010026#include <assert.h>
Max7426c5f2019-02-18 20:42:42 +010027#include "gprs_rlcmac.h"
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +010028#include "decoding.h"
Max7426c5f2019-02-18 20:42:42 +010029
Andreas Eversberg138f4e62013-01-14 12:31:11 +010030extern "C" {
31extern const struct log_info gprs_log_info;
32#include "pcu_vty.h"
33#include <osmocom/vty/telnet_interface.h>
34#include <osmocom/vty/logging.h>
Aravind Sirsikar9f5f0082016-08-30 13:20:23 +053035#include <osmocom/core/utils.h>
Maxd3a0d912019-03-05 16:15:01 +010036#include <osmocom/core/msgb.h>
Andreas Eversberg138f4e62013-01-14 12:31:11 +010037#include <osmocom/core/application.h>
Vadim Yanitskiy39a65052020-01-25 01:24:59 +070038
39#include "csn1.h"
Pau Espin Pedrolb2653fe2020-03-26 15:14:01 +010040#include "gsm_rlcmac.h"
Andreas Eversberg138f4e62013-01-14 12:31:11 +010041}
Ivan Kluchnikov487a1412011-12-21 13:17:53 +030042using namespace std;
43
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +010044void *tall_pcu_ctx;
45
Ivan Kluchnikov487a1412011-12-21 13:17:53 +030046void printSizeofRLCMAC()
47{
Pau Espin Pedrol54681c32020-01-23 21:59:23 +010048 printf("*** %s ***\n", __func__);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +030049 cout << "sizeof RlcMacUplink_t " << sizeof(RlcMacUplink_t) << endl;
50 cout << "sizeof Packet_Cell_Change_Failure_t " << sizeof(Packet_Cell_Change_Failure_t) << endl;
51 cout << "sizeof Packet_Control_Acknowledgement_t " << sizeof(Packet_Control_Acknowledgement_t) << endl;
52 cout << "sizeof Packet_Downlink_Ack_Nack_t " << sizeof(Packet_Downlink_Ack_Nack_t) << endl;
53 cout << "sizeof EGPRS_PD_AckNack_t " << sizeof(EGPRS_PD_AckNack_t) << endl;
54 cout << "sizeof Packet_Uplink_Dummy_Control_Block_t " << sizeof(Packet_Uplink_Dummy_Control_Block_t) << endl;
55 cout << "sizeof Packet_Measurement_Report_t " << sizeof(Packet_Measurement_Report_t) << endl;
56 cout << "sizeof Packet_Resource_Request_t " << sizeof(Packet_Resource_Request_t) << endl;
57 cout << "sizeof Packet_Mobile_TBF_Status_t " << sizeof(Packet_Mobile_TBF_Status_t) << endl;
58 cout << "sizeof Packet_PSI_Status_t " << sizeof(Packet_PSI_Status_t) << endl;
59 cout << "sizeof Packet_Enh_Measurement_Report_t " << sizeof(Packet_Enh_Measurement_Report_t) << endl;
60 cout << "sizeof Packet_Cell_Change_Notification_t " << sizeof(Packet_Cell_Change_Notification_t) << endl;
61 cout << "sizeof Packet_SI_Status_t " << sizeof(Packet_SI_Status_t) << endl;
62 cout << "sizeof Additional_MS_Rad_Access_Cap_t " << sizeof(Additional_MS_Rad_Access_Cap_t) << endl;
63 cout << "sizeof Packet_Pause_t " << sizeof(Packet_Pause_t) << endl;
64
65 cout << "sizeof RlcMacDownlink_t " << sizeof(RlcMacDownlink_t) << endl;
66 cout << "sizeof Packet_Access_Reject_t " << sizeof(Packet_Access_Reject_t) << endl;
Holger Hans Peter Freythere13298d2013-07-28 16:45:54 +020067 cout << "sizeof Packet_Cell_Change_Order_t " << sizeof(Packet_Cell_Change_Order_t) << endl;
68 cout << "sizeof Packet_Downlink_Assignment_t " << sizeof(Packet_Downlink_Assignment_t) << endl;
Ivan Kluchnikov487a1412011-12-21 13:17:53 +030069 cout << "sizeof Packet_Neighbour_Cell_Data_t " << sizeof(Packet_Neighbour_Cell_Data_t) << endl;
70 cout << "sizeof Packet_Serving_Cell_Data_t " << sizeof(Packet_Serving_Cell_Data_t) << endl;
71 cout << "sizeof Packet_Paging_Request_t " << sizeof(Packet_Paging_Request_t) << endl;
72 cout << "sizeof Packet_PDCH_Release_t " << sizeof(Packet_PDCH_Release_t) << endl;
73 cout << "sizeof Packet_Polling_Request_t " << sizeof(Packet_Polling_Request_t) << endl;
74 cout << "sizeof Packet_Power_Control_Timing_Advance_t " << sizeof(Packet_Power_Control_Timing_Advance_t) << endl;
75 cout << "sizeof Packet_PRACH_Parameters_t " << sizeof(Packet_PRACH_Parameters_t) << endl;
76 cout << "sizeof Packet_Queueing_Notification_t " << sizeof(Packet_Queueing_Notification_t) << endl;
77 cout << "sizeof Packet_Timeslot_Reconfigure_t " << sizeof(Packet_Timeslot_Reconfigure_t) << endl;
78 cout << "sizeof Packet_TBF_Release_t " << sizeof(Packet_TBF_Release_t) << endl;
79 cout << "sizeof Packet_Uplink_Ack_Nack_t " << sizeof(Packet_Uplink_Ack_Nack_t) << endl;
80 cout << "sizeof Packet_Uplink_Assignment_t " << sizeof(Packet_Uplink_Assignment_t) << endl;
81 cout << "sizeof Packet_Cell_Change_Continue_t " << sizeof(Packet_Cell_Change_Continue_t) << endl;
82 cout << "sizeof Packet_Handover_Command_t " << sizeof(Packet_Handover_Command_t) << endl;
83 cout << "sizeof Packet_PhysicalInformation_t " << sizeof(Packet_PhysicalInformation_t) << endl;
84 cout << "sizeof Packet_Downlink_Dummy_Control_Block_t " << sizeof(Packet_Downlink_Dummy_Control_Block_t) << endl;
85 cout << "sizeof PSI1_t " << sizeof(PSI1_t) << endl;
86 cout << "sizeof PSI2_t " << sizeof(PSI2_t) << endl;
87 cout << "sizeof PSI3_t " << sizeof(PSI3_t) << endl;
88 cout << "sizeof PSI3_BIS_t " << sizeof(PSI3_BIS_t) << endl;
89 cout << "sizeof PSI4_t " << sizeof(PSI4_t) << endl;
90 cout << "sizeof PSI13_t " << sizeof(PSI13_t) << endl;
91 cout << "sizeof PSI5_t " << sizeof(PSI5_t) << endl;
92}
93
Alexander Couzensccde5c92017-02-04 03:10:08 +010094void testRlcMacDownlink(void *test_ctx)
Ivan Kluchnikov487a1412011-12-21 13:17:53 +030095{
Pau Espin Pedrol54681c32020-01-23 21:59:23 +010096 printf("*** %s ***\n", __func__);
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +010097
98 int rc;
Alexander Couzensccde5c92017-02-04 03:10:08 +010099 struct bitvec *resultVector = bitvec_alloc(23, test_ctx);
Max7426c5f2019-02-18 20:42:42 +0100100 bitvec_unhex(resultVector, DUMMY_VEC);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300101
102 std::string testData[] = {
103 "4e082500e3f1a81d080820800b2b2b2b2b2b2b2b2b2b2b", // Packet Downlink Assignment
Saurabh Sharan656eed52016-03-10 14:15:29 +0530104 "48282407a6a07422720100032b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Assignment
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300105 "47240c00400000000000000079eb2ac9402b2b2b2b2b2b", // Packet Uplink Ack Nack
Saurabh Sharanbacb65b2016-03-10 17:24:49 +0530106 "47283c367513ba333004242b2b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Assignment
107 "400820001a3904df0680efb3300b2b2b2b2b2b2b2b2b2b", // Packet Downlink Assignment (EGPRS)
Saurabh Sharan2b09c392016-03-16 19:17:32 +0530108 "40284f0000001009810c826f4406809dcecb2b2b2b2b2b", // Packet Uplink Assignment (EGPRS)
Pau Espin Pedrol5cb002f2020-01-23 23:45:17 +0100109 "4024030f2f0000000087b0042b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Ack Nack (EGPRS)
Vadim Yanitskiy9b2f7c42020-02-11 21:45:19 +0700110 "4913e00850884013a8048b2b2b2b2b2b2b2b2b2b2b2b2b", // Polling Request (malformed)
Pau Espin Pedrol5cb002f2020-01-23 23:45:17 +0100111 "412430007fffffffffffffffefd19c7ba12b2b2b2b2b2b", // Packet Uplink Ack Nack?
112 "41942b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b", // System Info 13?
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300113 };
114
115 int testDataSize = sizeof(testData)/sizeof(testData[0]);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300116
117 cout << " DOWNLINK " << endl;
118 for (int i = 0; i < testDataSize; i++)
119 {
Pau Espin Pedrol87bfbe42020-01-23 23:51:34 +0100120 cout << "vector1 = " << testData[i] << endl;
Alexander Couzensccde5c92017-02-04 03:10:08 +0100121 bitvec *vector = bitvec_alloc(23, test_ctx);
Ivan Kluchnikov835f91e2012-04-30 18:00:36 +0400122 bitvec_unhex(vector, testData[i].c_str());
Pau Espin Pedrol87bfbe42020-01-23 23:51:34 +0100123
Pau Espin Pedrol99c437b2020-01-24 12:34:50 +0100124 RlcMacDownlink_t data;
125 memset(&data, 0, sizeof(data));
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300126 cout << "=========Start DECODE===========" << endl;
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +0100127 rc = decode_gsm_rlcmac_downlink(vector, &data);
128 cout << "+++++++++Finish DECODE ("<< rc <<")++++++++++" << endl;
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300129 cout << "=========Start ENCODE=============" << endl;
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +0100130 rc = encode_gsm_rlcmac_downlink(resultVector, &data);
131 cout << "+++++++++Finish ENCODE ("<< rc <<")+++++++++++" << endl;
Pau Espin Pedrol87bfbe42020-01-23 23:51:34 +0100132 cout << "vector1 = " << osmo_hexdump(vector->data, 23) << endl;
133 cout << "vector2 = " << osmo_hexdump(resultVector->data, 23) << endl;
Ivan Kluchnikov835f91e2012-04-30 18:00:36 +0400134 if (memcmp(vector->data, resultVector->data, 23) == 0)
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300135 cout << "vector1 == vector2 : TRUE" << endl;
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300136 else
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300137 cout << "vector1 == vector2 : FALSE" << endl;
Max7426c5f2019-02-18 20:42:42 +0100138 bitvec_unhex(resultVector, DUMMY_VEC);
Ivan Kluchnikov835f91e2012-04-30 18:00:36 +0400139 bitvec_free(vector);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300140 }
Andreas Eversberg273a2222013-01-16 08:56:33 +0100141
142 bitvec_free(resultVector);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300143}
144
145
Alexander Couzensccde5c92017-02-04 03:10:08 +0100146void testRlcMacUplink(void *test_ctx)
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300147{
Pau Espin Pedrol54681c32020-01-23 21:59:23 +0100148 printf("*** %s ***\n", __func__);
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +0100149
150 int rc;
Alexander Couzensccde5c92017-02-04 03:10:08 +0100151 struct bitvec *resultVector = bitvec_alloc(23, test_ctx);
Max7426c5f2019-02-18 20:42:42 +0100152 bitvec_unhex(resultVector, DUMMY_VEC);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300153
154 std::string testData[] = {
Saurabh Sharan656eed52016-03-10 14:15:29 +0530155 "400e1e61d11d2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Dummy Control Block
156 "400b8020000000000000002480e0032b2b2b2b2b2b2b2b", // Packet Downlink Ack/Nack
Saurabh Sharanbacb65b2016-03-10 17:24:49 +0530157 "4016713dc094270ca2ae57ef909006aa0fc0001f80222b", // Packet Resource Request
Vadim Yanitskiyf22163b2020-03-06 06:51:48 +0700158 "401673c87f24af2632b25964200600000091000b780080", // Packet Resource Request (from keith)
Saurabh Sharanbacb65b2016-03-10 17:24:49 +0530159 "40200ffc0021ec010b2b2b2b2b2b2b2b2b2b2b2b2b2b2b", // EPDAN
Pau Espin Pedrol5cb002f2020-01-23 23:45:17 +0100160 "400a9020000000000000003010012a0800132b2b2b2b2b", // Packet Downlink Ack/Nack ?
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300161 };
162
163 int testDataSize = sizeof(testData)/sizeof(testData[0]);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300164
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300165
166 cout << " UPLINK " << endl;
167 for (int i = 0; i < testDataSize; i++)
168 {
Pau Espin Pedrol87bfbe42020-01-23 23:51:34 +0100169 cout << "vector1 = " << testData[i] << endl;
Alexander Couzensccde5c92017-02-04 03:10:08 +0100170 bitvec *vector = bitvec_alloc(23, test_ctx);
Ivan Kluchnikov835f91e2012-04-30 18:00:36 +0400171 bitvec_unhex(vector, testData[i].c_str());
Pau Espin Pedrol87bfbe42020-01-23 23:51:34 +0100172
Pau Espin Pedrol99c437b2020-01-24 12:34:50 +0100173 RlcMacUplink_t data;
174 memset(&data, 0, sizeof(data));
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300175 cout << "=========Start DECODE===========" << endl;
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +0100176 rc = decode_gsm_rlcmac_uplink(vector, &data);
177 cout << "+++++++++Finish DECODE ("<< rc << ")++++++++++" << endl;
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300178 cout << "=========Start ENCODE=============" << endl;
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +0100179 rc = encode_gsm_rlcmac_uplink(resultVector, &data);
180 cout << "+++++++++Finish ENCODE ("<< rc <<")+++++++++++" << endl;
Pau Espin Pedrol87bfbe42020-01-23 23:51:34 +0100181 cout << "vector1 = " << osmo_hexdump(vector->data, 23) << endl;
182 cout << "vector2 = " << osmo_hexdump(resultVector->data, 23) << endl;
Ivan Kluchnikov835f91e2012-04-30 18:00:36 +0400183 if (memcmp(vector->data, resultVector->data, 23) == 0)
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300184 cout << "vector1 == vector2 : TRUE" << endl;
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300185 else
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300186 cout << "vector1 == vector2 : FALSE" << endl;
Max7426c5f2019-02-18 20:42:42 +0100187 bitvec_unhex(resultVector, DUMMY_VEC);
Ivan Kluchnikov835f91e2012-04-30 18:00:36 +0400188 bitvec_free(vector);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300189 }
Andreas Eversberg273a2222013-01-16 08:56:33 +0100190
191 bitvec_free(resultVector);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300192}
193
Alexander Couzensccde5c92017-02-04 03:10:08 +0100194void testCsnLeftAlignedVarBmpBounds(void *test_ctx)
Aravind Sirsikar9f5f0082016-08-30 13:20:23 +0530195{
Pau Espin Pedrol54681c32020-01-23 21:59:23 +0100196 printf("*** %s ***\n", __func__);
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +0100197
Maxd3a0d912019-03-05 16:15:01 +0100198 struct msgb *m = msgb_alloc(80, "test");
199 static uint8_t exp[] = { 0x7f, 0xff, 0xff, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Alexander Couzensccde5c92017-02-04 03:10:08 +0100200 bitvec *vector = bitvec_alloc(23, test_ctx);
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +0100201 int rc;
Aravind Sirsikar9f5f0082016-08-30 13:20:23 +0530202
203 bitvec_unhex(vector, "40200bffd161003e0e519ffffffb800000000000000000");
204 RlcMacUplink_t data;
Pau Espin Pedrol99c437b2020-01-24 12:34:50 +0100205 memset(&data, 0, sizeof(data));
Aravind Sirsikar9f5f0082016-08-30 13:20:23 +0530206
207 EGPRS_AckNack_Desc_t *urbb =
208 &data.u.Egprs_Packet_Downlink_Ack_Nack.EGPRS_AckNack.Desc;
Pau Espin Pedrol5e300ce2020-02-03 17:18:03 +0100209 rc = decode_gsm_rlcmac_uplink(vector, &data);
210 OSMO_ASSERT(rc == 0);
Aravind Sirsikar9f5f0082016-08-30 13:20:23 +0530211
Maxd3a0d912019-03-05 16:15:01 +0100212 memcpy(msgb_put(m, 13), urbb->URBB, 13);
213 if (!msgb_eq_data_print(m, exp, 13))
214 printf("%s failed!\n", __func__);
215 msgb_free(m);
Aravind Sirsikar9f5f0082016-08-30 13:20:23 +0530216}
217
Pau Espin Pedrolb2653fe2020-03-26 15:14:01 +0100218extern "C" {
Pau Espin Pedrol007056e2020-03-26 15:03:33 +0100219int encode_gsm_ra_cap(struct bitvec *vector, MS_Radio_Access_capability_t * data);
Pau Espin Pedrolb2653fe2020-03-26 15:14:01 +0100220}
Vadim Yanitskiyb47e53b2020-02-20 04:33:50 +0700221
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100222void testRAcap(void *test_ctx)
223{
Pau Espin Pedrol866bece2020-03-21 01:20:52 +0100224 printf("*** %s ***\n", __func__);
225 MS_Radio_Access_capability_t data;
226 memset(&data, 0, sizeof(data));
227 bitvec *bv_dec = bitvec_alloc(23, test_ctx);
228 bitvec *bv_enc = bitvec_alloc(23, test_ctx);
229 unsigned int len_dec, len_enc;
230 int rc;
231/*
232MS RA capability 1
233 0001 .... = Access Technology Type: GSM E --note that GSM E covers GSM P (1)
234 .... 0011 011. .... = Length in bits: 0x1b (27)
235 ...0 01.. RF Power Capability, GMSK Power Class: Not specified (1)
236 A5 Bits: Same values apply for parameters as in the immediately preceding Access capabilities field within this IE (0)
237 .... ...1 = Controlled early Classmark Sending: Implemented
238 0... .... = Pseudo Synchronisation: Not Present
239 .0.. .... = Voice Group Call Service: no VGCS capability or no notifications wanted
240 ..0. .... = Voice Broadcast Service: no VBS capability or no notifications wanted
241 ...1 .... = Multislot capability struct: Present
242 HSCSD multislot class: Bits are not available (0)
243 SMS_VALUE (Switch-Measure-Switch): Bits are not available (0)
244 ECSD multislot class: Bits are not available (0)
245 DTM GPRS Multi Slot Class: Bits are not available (0)
246 .... ..00 011. .... = GPRS multislot class: Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1 (3)
247 ...0 .... = GPRS Extended Dynamic Allocation Capability: Not Implemented
248 .... ...0 0011 .... = EGPRS multislot class: Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1 (3)
249 .... 0... = EGPRS Extended Dynamic Allocation Capability: Not Implemented
250*/
251 bitvec_unhex(bv_dec, "1365146230");
252
253 printf("=== Test decoding of MS RA Capability ===\n");
254 rc = decode_gsm_ra_cap(bv_dec, &data);
255 OSMO_ASSERT(rc == 0);
256
257 /* Make sure there's 1 value (currently fails due to failed decoding) */
258 OSMO_ASSERT(data.Count_MS_RA_capability_value == 1);
259
260 /* Make sure GPRS / EGPRS multislot class is parsed correctly */
261 printf("GPRS multislot class = %u\n", Decoding::get_ms_class_by_capability(&data));
262 printf("EGPRS multislot class = %u\n", Decoding::get_egprs_ms_class_by_capability(&data));
263
264 /* Test encoding of decoded MS RA Capability */
265 printf("=== Test encoding of MS RA Capability ===\n");
266 rc = encode_gsm_ra_cap(bv_enc, &data);
267 printf("encode_gsm_ra_cap() returns %d\n", rc);
268
269 bv_dec->cur_bit = 4;
270 len_dec = bitvec_get_uint(bv_dec, 7);
271 bv_enc->cur_bit = 4;
272 len_enc = bitvec_get_uint(bv_enc, 7);
273
274 /* NOTE: vector2 is expected to be different because there is actually no
275 * way to distinguish between NULL and 0 in MS_Radio_Access_capability_t.
276 * The difference is in length indicator: 27 bits vs 65 bits. */
277 printf("vector1 (len_ind=%u) = %s\n", len_dec, osmo_hexdump(bv_dec->data, bv_dec->data_len));
278 printf("vector2 (len_ind=%u) = %s\n", len_enc, osmo_hexdump(bv_enc->data, bv_enc->data_len));
279
280 /* Mangle the length indicator (set it to 21) */
281 unsigned int writeIndex = 4;
282 rc = bitvec_write_field(bv_dec, &writeIndex, 21, 7);
283 OSMO_ASSERT(rc == 0);
284
285 /* Make sure decoding attempt fails */
286 printf("=== Test decoding of a malformed vector (short length indicator) ===\n");
287 rc = decode_gsm_ra_cap(bv_dec, &data);
288 printf("decode_gsm_ra_cap() returns %d\n", rc);
289}
290
291void testMalformedRAcap(void *test_ctx)
292{
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100293 printf("*** %s ***\n", __func__);
294 MS_Radio_Access_capability_t data;
295 memset(&data, 0, sizeof(data));
Vadim Yanitskiyb47e53b2020-02-20 04:33:50 +0700296 bitvec *bv_dec = bitvec_alloc(23, test_ctx);
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100297 int rc;
298/*
299 MS RA capability 1
300 0001 .... = Access Technology Type: GSM E --note that GSM E covers GSM P (1)
Vadim Yanitskiy55f06c32020-02-18 05:45:15 +0700301 .... 0011 101. .... = Length in bits: 0x1d (29)
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100302 ...0 01.. RF Power Capability, GMSK Power Class: Not specified (1)
303 A5 Bits: Same values apply for parameters as in the immediately preceding Access capabilities field within this IE (0)
304 .... ...1 = Controlled early Classmark Sending: Implemented
305 0... .... = Pseudo Synchronisation: Not Present
306 .0.. .... = Voice Group Call Service: no VGCS capability or no notifications wanted
307 ..0. .... = Voice Broadcast Service: no VBS capability or no notifications wanted
308 ...1 .... = Multislot capability struct: Present
309 .... ..00 011. .... = GPRS multislot class: Max Rx-Slot/TDMA:2 Max Tx-Slot/TDMA:2 Max-Sum-Slot/TDMA:3 Tta:3 Ttb:2 Tra:3 Trb:1 Type:1 (3)
310 ...0 .... = GPRS Extended Dynamic Allocation Capability: Not Implemented
Pau Espin Pedrol866bece2020-03-21 01:20:52 +0100311
312 It doesn't show up in wireshark's tree above because specific parser is
313 used, but this RA Cap bitstream has Exist_EGPRS_multislot_class = 1 but
314 it provides no struct with the expected data (malformed, generated
315 erroneusly through TTCN3). The CSN.1 dceoder should ideally return an
316 error here, but it doesn't (it returns a >0 value which we convert to 0
317 in decode_gsm_ra_cap()).
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100318*/
Vadim Yanitskiyb47e53b2020-02-20 04:33:50 +0700319 bitvec_unhex(bv_dec, "13a5146200");
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100320
Vadim Yanitskiyb47e53b2020-02-20 04:33:50 +0700321 printf("=== Test decoding of MS RA Capability ===\n");
322 rc = decode_gsm_ra_cap(bv_dec, &data);
Pau Espin Pedrol866bece2020-03-21 01:20:52 +0100323 printf("decode_gsm_ra_cap() returns %d\n", rc);
Vadim Yanitskiy55f06c32020-02-18 05:45:15 +0700324 OSMO_ASSERT(rc == 0);
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100325
Pau Espin Pedrol866bece2020-03-21 01:20:52 +0100326 /* For sake of completeness, check if the decoder could find 1 value
327 before failing to decode it */
Vadim Yanitskiy55f06c32020-02-18 05:45:15 +0700328 OSMO_ASSERT(data.Count_MS_RA_capability_value == 1);
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100329
Pau Espin Pedrol2f169242020-03-20 23:59:44 +0100330 bitvec_free(bv_dec);
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100331}
332
Pau Espin Pedrolefad80b2020-03-23 14:35:26 +0100333/* Reproduce crash from ticket OS#4463 */
334void testRAcap2(void *test_ctx)
335{
336 printf("*** %s ***\n", __func__);
337 MS_Radio_Access_capability_t data;
338 memset(&data, 0, sizeof(data));
339 bitvec *bv_dec = bitvec_alloc(23, test_ctx);
340 int rc;
341/*
342MS Radio Access Capability
343 Element ID: 0x13
344 1... .... = ext: 1
345 Length: 23
346 ------------------------------------------- Hex bitstream starts here:
347 MS RA capability 1
348 0001 .... = Access Technology Type: GSM E --note that GSM E covers GSM P (1)
349 .... 1001 001. .... = Length in bits: 0x49 (73)
350 ...1 00.. RF Power Capability, GMSK Power Class: 2 W (33 dBm) (4)
351 A5 Bits: A5 bits follow (1)
352 A5/1: encryption algorithm available (1)
353 A5/2: encryption algorithm not available (0)
354 A5/3: encryption algorithm available (1)
355 A5/4: encryption algorithm not available (0)
356 A5/5: encryption algorithm not available (0)
357 A5/6: encryption algorithm not available (0)
358 A5/7: encryption algorithm not available (0)
359 .... ..1. = Controlled early Classmark Sending: Implemented
360 .... ...1 = Pseudo Synchronisation: Present
361 0... .... = Voice Group Call Service: no VGCS capability or no notifications wanted
362 .0.. .... = Voice Broadcast Service: no VBS capability or no notifications wanted
363 ..1. .... = Multislot capability struct: Present
364 HSCSD multislot class: Bits are not available (0)
365 .... 0111 = SMS_VALUE (Switch-Measure-Switch): 8/4 timeslot (~1154 microseconds) (7)
366 0001 .... = (SM_VALUE) Switch-Measure: 2/4 timeslot (~288 microseconds) (1)
367 ECSD multislot class: Bits are not available (0)
368 .... ...0 = Single Slot DTM: Not supported
369 1... .... = DTM EGPRS Multi Slot Class: Present
370 .... .011 00.. .... = GPRS multislot class: Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:5 Tta:2 Ttb:1 Tra:2 Trb:1 Type:1 (12)
371 ..1. .... = GPRS Extended Dynamic Allocation Capability: Implemented
372 .... ..01 100. .... = EGPRS multislot class: Max Rx-Slot/TDMA:4 Max Tx-Slot/TDMA:4 Max-Sum-Slot/TDMA:5 Tta:2 Ttb:1 Tra:2 Trb:1 Type:1 (12)
373 ...1 .... = EGPRS Extended Dynamic Allocation Capability: Implemented
374 .... .11. = DTM GPRS Multi Slot Class: Multislot class 11 supported (3)
375 .11. .... = DTM EGPRS Multi Slot Class: Multislot class 11 supported (3)
376 ...1 .... = 8PSK Power Capability Bits: Present
377 8PSK Power Capability: Power class E2 (2)
378 .... ..0. = COMPACT Interference Measurement Capability: Not Implemented
379 .... ...1 = Revision Level Indicator: The ME is Release '99 onwards
380 0... .... = UMTS FDD Radio Access Technology Capability: Not supported
381 .0.. .... = UMTS 3.84 Mcps TDD Radio Access Technology Capability: Not supported
382 ..0. .... = CDMA 2000 Radio Access Technology Capability: Not supported
383 ...0 .... = UMTS 1.28 Mcps TDD Radio Access Technology Capability: Not supported
384 .... 1... = GERAN Feature Package 1: Supported
385 Extended DTM EGPRS Multi Slot Class: Bits are not available (0)
386 .... ..0. = Modulation based multislot class support: Not supported
387 High Multislot Capability: Bits are not available (0)
388 0... .... = GERAN Iu mode: Not supported
389 GMSK Multislot Power Profile: GMSK_MULTISLOT_POWER_PROFILE 3 (3)
390 8-PSK Multislot Power Profile: 8-PSK_MULTISLOT_POWER_PROFILE 3 (3)
391 .... .0.. = Multiple TBF Capability: Not supported
392 .... ..01 = Downlink Advanced Receiver Performance: Downlink Advanced Receiver Performance - phase I supported (1)
393 1... .... = Extended RLC/MAC Control Message Segmentation Capability: Supported
394 .1.. .... = DTM Enhancements Capability: The mobile station supports enhanced DTM CS establishment and enhanced DTM CS release procedures
395 ...0 .... = PS Handover Capability: Not supported
396 MS RA capability 2
397 .... .011 1... .... = Access Technology Type: GSM 850 (7)
398 .010 0010 = Length in bits: 0x22 (34)
399 100. .... RF Power Capability, GMSK Power Class: 2 W (33 dBm) (4)
400 A5 Bits: Same values apply for parameters as in the immediately preceding Access capabilities field within this IE (0)
401 .... 1... = Controlled early Classmark Sending: Implemented
402 .... .1.. = Pseudo Synchronisation: Present
403 .... ..0. = Voice Group Call Service: no VGCS capability or no notifications wanted
404 .... ...0 = Voice Broadcast Service: no VBS capability or no notifications wanted
405 0... .... = Multislot capability struct: Not Present
406 .1.. .... = 8PSK Power Capability Bits: Present
407 8PSK Power Capability: Power class E2 (2)
408 .... 0... = COMPACT Interference Measurement Capability: Not Implemented
409 .... .1.. = Revision Level Indicator: The ME is Release '99 onwards
410 .... ..0. = UMTS FDD Radio Access Technology Capability: Not supported
411 .... ...0 = UMTS 3.84 Mcps TDD Radio Access Technology Capability: Not supported
412 0... .... = CDMA 2000 Radio Access Technology Capability: Not supported
413 .0.. .... = UMTS 1.28 Mcps TDD Radio Access Technology Capability: Not supported
414 ..1. .... = GERAN Feature Package 1: Supported
415 Extended DTM EGPRS Multi Slot Class: Bits are not available (0)
416 .... 0... = Modulation based multislot class support: Not supported
417 High Multislot Capability: Bits are not available (0)
418 .... ..0. = GERAN Iu mode: Not supported
419 GMSK Multislot Power Profile: GMSK_MULTISLOT_POWER_PROFILE 3 (3)
420 8-PSK Multislot Power Profile: 8-PSK_MULTISLOT_POWER_PROFILE 3 (3)
421 ...0 .... = Multiple TBF Capability: Not supported
422 .... 01.. = Downlink Advanced Receiver Performance: Downlink Advanced Receiver Performance - phase I supported (1)
423 .... ..1. = Extended RLC/MAC Control Message Segmentation Capability: Supported
424 .... ...1 = DTM Enhancements Capability: The mobile station supports enhanced DTM CS establishment and enhanced DTM CS release procedures
425 .0.. .... = PS Handover Capability: Not supported
426 MS RA capability 3
427 ...0 011. = Access Technology Type: GSM 1800 (3)
428 .... ...0 1000 10.. = Length in bits: 0x22 (34)
429 .... ..00 1... .... RF Power Capability, GMSK Power Class: 1 W (30 dBm) (1)
430 A5 Bits: Same values apply for parameters as in the immediately preceding Access capabilities field within this IE (0)
431 ..1. .... = Controlled early Classmark Sending: Implemented
432 ...1 .... = Pseudo Synchronisation: Present
433 .... 0... = Voice Group Call Service: no VGCS capability or no notifications wanted
434 .... .0.. = Voice Broadcast Service: no VBS capability or no notifications wanted
435 .... ..0. = Multislot capability struct: Not Present
436 .... ...1 = 8PSK Power Capability Bits: Present
437 8PSK Power Capability: Power class E2 (2)
438 ..0. .... = COMPACT Interference Measurement Capability: Not Implemented
439 ...1 .... = Revision Level Indicator: The ME is Release '99 onwards
440 .... 0... = UMTS FDD Radio Access Technology Capability: Not supported
441 .... .0.. = UMTS 3.84 Mcps TDD Radio Access Technology Capability: Not supported
442 .... ..0. = CDMA 2000 Radio Access Technology Capability: Not supported
443 .... ...0 = UMTS 1.28 Mcps TDD Radio Access Technology Capability: Not supported
444 1... .... = GERAN Feature Package 1: Supported
445 Extended DTM EGPRS Multi Slot Class: Bits are not available (0)
446 ..0. .... = Modulation based multislot class support: Not supported
447 High Multislot Capability: Bits are not available (0)
448 .... 0... = GERAN Iu mode: Not supported
449 GMSK Multislot Power Profile: GMSK_MULTISLOT_POWER_PROFILE 3 (3)
450 8-PSK Multislot Power Profile: 8-PSK_MULTISLOT_POWER_PROFILE 3 (3)
451 .0.. .... = Multiple TBF Capability: Not supported
452 ..01 .... = Downlink Advanced Receiver Performance: Downlink Advanced Receiver Performance - phase I supported (1)
453 .... 1... = Extended RLC/MAC Control Message Segmentation Capability: Supported
454 .... .1.. = DTM Enhancements Capability: The mobile station supports enhanced DTM CS establishment and enhanced DTM CS release procedures
455 .... ...0 = PS Handover Capability: Not supported
456*/
457 bitvec_unhex(bv_dec, "1933432b37159ef90879cba28c6421e72688b190879c00");
458
459 printf("=== Test decoding of multi-band MS RA Capability ===\n");
460 rc = decode_gsm_ra_cap(bv_dec, &data);
Pau Espin Pedrol7faa5da2020-03-21 00:13:33 +0100461 printf("decode_gsm_ra_cap() returns %d\n", rc);
462 OSMO_ASSERT(rc == 0);
463
464 /* Make sure there's 3 values */
Pau Espin Pedrolefad80b2020-03-23 14:35:26 +0100465 OSMO_ASSERT(data.Count_MS_RA_capability_value == 3);
466
467 /* Make sure GPRS / EGPRS multislot class is parsed correctly */
468 printf("GPRS multislot class = %u\n", Decoding::get_ms_class_by_capability(&data));
469 printf("EGPRS multislot class = %u\n", Decoding::get_egprs_ms_class_by_capability(&data));
Pau Espin Pedrol7faa5da2020-03-21 00:13:33 +0100470
Pau Espin Pedrolefad80b2020-03-23 14:35:26 +0100471 bitvec_free(bv_dec);
472}
473
Vadim Yanitskiya2d972a2020-04-04 03:44:35 +0700474void testEGPRSPktChReq(void *test_ctx)
475{
476 EGPRS_PacketChannelRequest_t req;
477 int rc;
478
479 printf("*** %s ***\n", __func__);
480
481 static const uint16_t EGPRSPktChReqs[] = {
482 /* < One Phase Access Request : '0'B
483 < MultislotClass : '10101'B >
484 < Priority : '10'B >
485 < RandomBits : '101'B > > */
486 0x2b5,
487 /* < One Phase Access Request : '0'B
488 < MultislotClass : '01010'B >
489 < Priority : '01'B >
490 < RandomBits : '010'B > > */
491 0x14a,
492 /* < Short Access Request : '100'B
493 < NumberOfBlocks : '001'B >
494 < Priority : '01'B >
495 < RandomBits : '000'B > > */
496 0x428,
497 /* < Two Phase Access Request : '110000'B
498 < Priority : '00'B >
499 < RandomBits : '000'B > > */
500 0x600,
501 /* < Two Phase Access Request : '110000'B
502 < Priority : '11'B >
503 < RandomBits : '111'B > > */
504 0x61f,
505 /* < Signalling : '110011'B
506 < RandomBits : '10101'B > > */
507 0x675,
508 /* < Signalling : '110011'B
509 < RandomBits : '10001'B > > */
510 0x671,
511 /* < Emergency call : '110111'B
512 < RandomBits : '11001'B > > */
513 0x6f9,
514 /* < Unknown (test) : '111111'B
515 < RandomBits : '01010'B > > */
516 0x7ea,
517 };
518
519 for (size_t i = 0; i < ARRAY_SIZE(EGPRSPktChReqs); i++) {
520 rc = decode_egprs_pkt_ch_req(EGPRSPktChReqs[i], &req);
521 printf("decode_egprs_pkt_ch_req(0x%03x) returns %d\n", EGPRSPktChReqs[i], rc);
522 if (rc == 0)
523 printf(" ==> %s\n", get_value_string(egprs_pkt_ch_req_type_names, req.Type));
524 }
525}
526
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300527int main(int argc, char *argv[])
528{
Alexander Couzensccde5c92017-02-04 03:10:08 +0100529 void *ctx = talloc_named_const(NULL, 1, "RLCMACTest");
Neels Hofmeyr42f2d612018-04-01 16:54:40 +0200530 osmo_init_logging2(ctx, &gprs_log_info);
Harald Welte570f9132020-03-19 15:03:01 +0100531 log_parse_category_mask(osmo_stderr_target, "DPCU,3:DLGLOBAL,1:DRLCMACDATA,2:DCSN1,1:");
Vadim Yanitskiy8a87f912020-02-17 01:19:10 +0700532
533 log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
534 log_set_print_category_hex(osmo_stderr_target, 0);
535 log_set_print_category(osmo_stderr_target, 1);
536 log_set_print_level(osmo_stderr_target, 1);
537 log_set_use_color(osmo_stderr_target, 0);
Andreas Eversberg138f4e62013-01-14 12:31:11 +0100538
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300539 //printSizeofRLCMAC();
Alexander Couzensccde5c92017-02-04 03:10:08 +0100540 testRlcMacDownlink(ctx);
541 testRlcMacUplink(ctx);
542 testCsnLeftAlignedVarBmpBounds(ctx);
Pau Espin Pedrolcdbc5db2020-01-23 21:00:19 +0100543 testRAcap(ctx);
Pau Espin Pedrol866bece2020-03-21 01:20:52 +0100544 testMalformedRAcap(ctx);
Pau Espin Pedrolefad80b2020-03-23 14:35:26 +0100545 testRAcap2(ctx);
Vadim Yanitskiya2d972a2020-04-04 03:44:35 +0700546
547 testEGPRSPktChReq(ctx);
548
Alexander Couzensccde5c92017-02-04 03:10:08 +0100549 talloc_free(ctx);
Ivan Kluchnikov487a1412011-12-21 13:17:53 +0300550}