aboutsummaryrefslogtreecommitdiffstats
path: root/tests
AgeCommit message (Collapse)AuthorFilesLines
2024-06-05libosmosim: class_tables: Fix GlobalPlatform CLA=8x INS=CA/CB GET DATAHarald Welte2-0/+6
in their infinite wisdom, GlobalPlatform made GET DATA a command that can be either APDU case 2 or case 4. As the specify Le must be 0x00, we can conclude that P3 == 0x00 must be Le, while P3 != 0x00 must be Lc and hence case 4 */ Change-Id: Ic8a17921f5a42d227791f1de39f90b4967c2e1b6 Related: SYS#6865
2024-06-05libosmosim: class_tables: Resolve conflicting CLA=8x INS=F2 definitionsHarald Welte2-0/+6
In their infinite wisdom, GlobalPlatform re-defined the CLA 8x / INS F2 command alreay specified by ETSI TS 102 221. This wouldn't be as bads if they had the same "Case". However, ETSI has case 2 while GP has case 4. Lucikly, the P1 coding of ETSI [so far] states all the four upper bits must be 0, while GP always has one of those bits set. Before this patch, it is possible that a Modem/Phone will send an 8xF2 command and intends it as a GlobalPlatform command (with Lc > 0 and command data portion), while this code assumes it is an ETSI UICC command with Lc=0 and hence no command data portion. This will make communication break when using simtrace2 'cardem'. Change-Id: I8dd317ef8f942542e412b18c834a0467c51291c3 Related: SYS#6865 Related: https://lists.osmocom.org/hyperkitty/list/simtrace@lists.osmocom.org/thread/HPRTPGPZITHHASCJISCBAKHGBFZCFANP/
2024-06-04add jhash.h, copied from linux/jhash.hNeels Hofmeyr4-2/+93
Allow using arbitrary length data as hashtable key: Copy jhash.h implementation from the linux kernel. Apply osmo_ prefix to all global symbols. Add jhash_test to ensure the code import works as intended. First application will be a hashtable keyed by umts_cell_id in osmo-hnbgw.git. Related: SYS#6773 Change-Id: I0c9652bbc9e2a18b1200e7d63bb6f64ded7d75fa
2024-05-23fix update_exp: s/soft_uart.ok/soft_uart_test.okNeels Hofmeyr1-1/+1
Change-Id: I2fb70b684978fa8a591d1d9e3cace919d590d1ef
2024-04-22tests: rename logging_test_gsmtap -> logging_gsmtap_testVadim Yanitskiy4-7/+7
This way the naming is consistent with existing tests and matches the 'tests/*/*_test' pattern in .gitignore. Change-Id: I280fc0cc1bda9ba445af71f00bc8f1ccfd2b2091
2024-04-22tests: do not copy *.cfg files to the build directoryVadim Yanitskiy4-11/+18
When running 'make check' in-tree ($builddir == $srcdir), those *.cfg files end up in tests/ and show up as git-add candidates. Instead of copying them, just let the test binaries know where to find those files via the cmdline parameters. Change-Id: I74e428f0548418fdecada3d25049d6e110e790fe
2024-03-20osmo_io_uring: Run check of tests/osmo_io with io_uring alsoAndreas Eversberg2-2/+10
Related: OS#5751 Change-Id: I82db9a15bc483a5447d86352512afaafa2bcfbb6
2024-02-12cosmetic: tests/gsup/gsup_test: Move send_e_send_end_signal_res to correct placePau Espin Pedrol1-10/+10
All the different procedures are placed in order, except this one. Change-Id: If0877deca2bcbf40229c9c61f471112f1e8cdb0e
2024-01-31coding: fix wrong n_bits_total reported for PDTCH CS2 and CS3Vadim Yanitskiy1-4/+4
In gsm0503_pdtch_decode(), we decode CS2 and CS3 as if no puncturing was employed, reordering the coded bits and setting punctured ones to 0 manually. Because of that, osmo_conv_decode_ber_punctured() reports n_bits_total higher than we actually receive over the air. Change-Id: I6b20cc450f25c48175a61da02644d66c08e22ece Related: OS#6342, OS#6200
2024-01-31coding: fix artificial bit errors for PDTCH CS2 and CS3Vadim Yanitskiy1-4/+4
GPRS coding schemes CS2 and CS3 (defined in 3GPP TS 45.003 sections 5.1.2 and 5.1.3, respectively) employ so-called puncturing, which can be described as intentional removal of coded bits. The goal of puncturing is to reduce the number of coded bits, so that they fit into 4 bursts. The receiving side recovers punctured bits, as if they were received corrupted. The puncturing is also used for other channel types like TCH/F9.6, TCH/F14.4, TCH/AFS and TCH/AHS, but only for CS2 and CS3 we're doing puncturing/depuncturing *manually*. This explains why we're seeing artificial bit errors only for CS2 and CS3. gsm0503_pdtch_decode() should not be reporting punctured bits as bit errors, fix this by using osmo_conv_decode_ber_punctured(). Change-Id: I024276d167e769396187998d881f8e7626461249 Related: OS#6342, OS#6200
2024-01-29tests/Makefile.am: do not add files to EXTRA_DIST conditionallyVadim Yanitskiy1-1/+1
These files must be present in the release tarballs regardless of the configure options (ENABLE_LIBSCTP, ENABLE_SCTP_TESTS). Change-Id: I8f530d6157b00907dd1b438100bb0fb300dfcd22 Related: OS#6349
2024-01-26tests/sockaddr_str: rc_name(): also handle -EAFNOSUPPORTVadim Yanitskiy2-39/+41
Change-Id: I489378705e19c6b09f2fa894ddea4b8a0dc0c7e4
2024-01-26tests/sockaddr_str: fix dead code, print some errno valuesVadim Yanitskiy2-87/+82
This fixes a -Wunused-function warning thrown by clang. Change-Id: I45e9044f80e1f634c811e729f4314ec9bcf6a9ad
2024-01-25tests/a5: fix bit-wise vs logical and in test_a5[34]()Vadim Yanitskiy1-2/+2
This fixes a -Wbitwise-instead-of-logical warning thrown by clang. Change-Id: I6ae0d13882ab7a6b1ca35ccd7f9a5e1d9cac911d
2024-01-25tests/iuup: fix duplicate assignment in def_configure_reqVadim Yanitskiy1-1/+0
This fixes a -Winitializer-overrides warning thrown by clang. Change-Id: Id29237d212a05dec1c57bbfd53d9cb7e71ca0991
2024-01-25isdn/v110_ta: avoid redundant .status_update_cb() callsVadim Yanitskiy1-14/+0
Let's be smarter and call the status update callback iff the V.24 flagmask was actually changed. Change-Id: I9626d3e737d4e072fa163115c4cdf9ee6ee0968e Related: OS#4396
2024-01-22tests/gsm0408: add two more samples to bcap_tests[]Vadim Yanitskiy3-0/+53
The mismatch for bcap_csd_2400_v22bis is expected, because octet 4 is not represented in 'struct gsm_mncc_bearer_cap' and the encoder unconditionally hard-codes it to 0x88. Change-Id: I4fc519c02b4fad8b0f40fa649d9de14b1183d10d Related: OS#4396, OS#4394
2024-01-22tests/gsm0408: cosmetic: adjust coding style (make linter happy)Vadim Yanitskiy1-23/+23
Change-Id: I203033e2b3c27cb8b258faf1ff3c5ec4c0083458
2024-01-20gsup: Convert PDP-Type IE to PDP-Address IEPau Espin Pedrol2-3/+7
The previous PDP-Type IE should have been a PDP-Address from the start, since having only PDP-Type with no address is only a specific case (dynamic addressing). This becomes clear by looking at other similar protocols like: * MAP: APN-Configuration IE has servedPartyIP-IP{v4,v6}-Address IEs * Diameter S6b, 3GPP TS 29.272 7.3.35 APN-Configuration contains Served-Party-IP-Address AVPs * Diameter SWx, 3GPP TS 29.273 APN-Configuration. * GTPv1C Ts 29.060 7.7.29 PDP Context containing PDP Address. Since PDP-Type on its own really makes no sense, being it a special case of PDP-Address, let's keep the IE by renaming it (keeping old name too for API backward compat) and extend it to support lengths > 2 bytes. Old implementation of libosmogsm gsup actually ignored lengths > 2 bytes, so we are safe acting against older implementations here, both on the sending and receiving side on the wire. The big drawback of this commit is that it breaks ABI compatibility due to adding "struct osmo_sockaddr pdp_address[2];" to struct osmo_gsup_pdp_info, which in turn affects shift of fields in struct osmo_gsup_message. Unfortunately, there's not much that can be done to improve the situation when adding the missing field, due to existing API having the same struct for all messages. Ideally we'd have 1 union with structs per message type inside, this way the ABI break would be far less pronounced. The GSUP test output change is becaue we now accept some of the len>2 cases for PDP-Type/Address IE which were being rejected since a couple commits ago. libosmogsm gsup code is now disabled in EMBEDDED mode, since it nows depends on core/socket.h (struct osmo_sockaddr) which is not available in EMBEDDED, and hence fails during build: """ In file included from /build/include/osmocom/gsm/gsup.h:45, from /build/src/gsm/gsup_sms.c:28: /build/include/osmocom/core/socket.h:15:10: fatal error: arpa/inet.h: No such file or directory 15 | #include <arpa/inet.h> | ^~~~~~~~~~~~~ """ Related: OS#6091 Change-Id: I775ff9c3be165d9f30d6ab55d03f99b6104eadd6
2024-01-20gsup: Fail decoding if len of PDP Type IE is less than 2 bytesPau Espin Pedrol1-1/+1
As documented in gsup.adoc, this field is expected to be 2 bytes. This is only a intermediate step to showcase the related test scenarios submitting IE with len > 2. The logic will be changed in a follow-up patch when changing the IE to also encode/decode the missing Address part. Change-Id: I0d024a9a4fb10beeff39ac33a9d2ed02f88f4580
2024-01-09Revert "logging: add log level cache"Hoernchen1-1/+1
This reverts commit 7dc6d4a629a37bb081d62f6ce61f4e5ee0237247. Reason for revert: other tests are failing Change-Id: Ife4c49d1bb933e983ac68c57970c9c49b40e08be
2024-01-09logging: add log level cacheEric1-1/+1
This ensures multithreaded logging attempts, in particular ones that do nothing, do not hold the lock just for checking the level, which interferes with other logging attempts. Closes: OS#5818 Change-Id: I35f8dd9127dd6e7feae392094fd6b3ce2d32558d
2024-01-09isdn: initial implementation of the V.110 TAVadim Yanitskiy4-0/+756
ITU-T recommendation V.110 defines Terminal Adaptor (TA) functions for the connection of Terminal Equipment (TE) having standard V-series interfaces to the ISDN. This patch brings "software" implementation of the TA to libosmoisdn. The primary user for this soft-TA is the mobile-side implementation of CSD (Circuit Switched Data) in osmocom-bb. CSD is heavily based on V.110, which is not surprising given that GSM is a "wireless ISDN". Nevertheless, this code will likely also be useful in the context of retro-networking. Similarly to the existing V.110 code in libosmoisdn, the present implementation aims to be functional and correct, rather than efficient in any way. It also has several limitations, which are not critical for the CSD use case, but eventually may be a problem for other use cases in the context of retro-networking. Therefore, the V.110 TA API should be considered _unstable_, and may be subject to change in the future. +-------+ +------+ B-channel +------+ +-------+ | TE1 |------| TA |~~~~~~~~~~~~~~~| TA |------| TE2 | +-------+ +------+ +------+ +-------+ TE (also known as DTE) is basically a computer, having a V-series (usually RS-232) connection to TA (also known as DCE). The TA acts like a regular analog modem, except that it is not performing any kind of modulation or demodulation itself. The TE-TA interface is implemented by the user supplied callback functions, configured during the allocation of a TA instance: * .rx_cb() - receive call-back of the application, * .tx_cb() - transmit call-back of the application, * .status_update_cb() - status line update call-back. In addition to that, the application (TE) can interact with the V.24 status lines (circuits) using the following API: * osmo_v110_ta_{get,set}_status(), * osmo_v110_ta_{get,set}_circuit(). The Rx and Tx between TE and TA is always driven by the TA itself, as a result of an interaction with the lower layer implementing the B-channel interface. There is currently no buffering and thus no way for TE to initiate transmission or pull data on its own. The TA-TA (B-channel) interface is implemented by the following functions, which are meant to be called by the lower layer transmitting and receiving V.110 frames over certain medium: * osmo_v110_ta_frame_in() - indicate a received V.110 frame, * osmo_v110_ta_frame_out() - pull a V.110 frame for transmission, * osmo_v110_ta_[de]sync_ind() - indicate a synchronization event. The lower layer is responsible for finding the synchronization pattern (if needed), aligning to the frame boundaries, and doing the V.110 frame coding. The D-channel signalling is behind the scope of this module. Initial (Work-in-Progress) implementation by Harald Welte, completed and co-authored by Vadim Yanitskiy. Change-Id: I5716bd6fd0201ee7a7a29e72f775972cd374082f Related: OS#4396
2024-01-09tests/tdef: improve test output (use OSMO_T_FMT[_ARGS])Vadim Yanitskiy2-15/+16
Change-Id: Ie216bcf93b96610c46c6e616835a6793772e2baa Related: e30d22a0 "tests/tdef: also test OSMO_TDEF_US and negative T values"
2024-01-09core: osmo_tdef_fsm_inst_state_chg(): allow millisecond precisionVadim Yanitskiy2-6/+6
This API predates commit 7b74551b9, which added support for millisecond granularity to osmo_fsm. Let's do the same for the tdef FSM wrapper API, allowing the millisecond precision without rounding-up to seconds. Of course, this patch changes behavior of the existing API, but having more precise state timeouts is not going to make the API user experience worse. The old behavior of using seconds is for kept for: * OSMO_TDEF_CUSTOM -- still treated as if it was OSMO_TDEF_S. * \param[in] default_timeout -- still expected to be in seconds. Change-Id: I4c4ee89e7e32e86f74cd215f5cbfa44ace5426c1 Related: 7b74551b9 "fsm: Allow millisecond granularity in osmo_fsm built-in timer"
2024-01-03tests/tdef: tune logging, also match stderrVadim Yanitskiy4-2/+37
Change-Id: I7f346dfbec9e724e905d26990a978495d3a9b030
2024-01-03tests/tdef: also test OSMO_TDEF_US and negative T valuesVadim Yanitskiy2-20/+28
Basically improving testing coverage... Change-Id: I09945d277a5ec94985900a3f39f1cbb54c8ed6ff
2024-01-03tests/{gb,iuup}: also match stderrVadim Yanitskiy5-7/+358
Change-Id: Icc2b372563f9ca142d256f2b8e9700220c37fddf
2024-01-03tests/utils: do not test strbuf_example2() with buf=NULLVadim Yanitskiy2-4/+0
The following can be seen when building with CC=clang: utils/utils_test.c:1239:2: runtime error: applying non-zero offset 99 to null pointer SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior utils/utils_test.c:1239:2 in utils/utils_test.c:1241:3: runtime error: applying non-zero offset 99 to null pointer SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior utils/utils_test.c:1241:3 in utils/utils_test.c:1242:2: runtime error: applying non-zero offset 99 to null pointer SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior utils/utils_test.c:1242:2 in 44. testsuite.at:274: 44. utils (testsuite.at:274): FAILED (testsuite.at:278) This makes utils_test fail due to unexpected UBSan's output. Even though passing NULL to the strbuf API is relatively safe, it makes no sense and the API user should ensure that this never happens. And so we should not be testing this case. Change-Id: Icd2323e93ec64afc1822d48e5e1d090083edf539
2023-12-30utils: fix OSMO_STRBUF_REMAIN to handle sb.pos == NULL correctlyVadim Yanitskiy2-0/+25
Currently, OSMO_STRBUF_REMAIN would return a huge number if the given strbuf has its .pos pointer set to NULL. This macro is safe against the .buf pointer being NULL, but not against .pos being NULL. Fix this by adding a static inline function (for the sake of code readability) and handle .pos being NULL properly by returning length of the buffer. Add a unit test. Change-Id: I294a74a99c40995cf7fb5520d61f697d967be5a4
2023-12-29tests: fix update-exp: soft_uart_test overwrites rlp_test.okVadim Yanitskiy1-1/+1
Change-Id: I41ea2c3d5b1e2e0349740acd63c39413472e0dad Fixes: 9ef304dd2 "soft_uart: add unit tests for the receiver and transmitter"
2023-12-27tests/fsm: also test .onenter and .onleave callbacksVadim Yanitskiy2-0/+42
Extend the existing testing coverage to check per-state enter/leave callbacks. An interesting behavior can be seen from the test output: when allocating an FSM instance, the .onenter callback is not being called for the initial FSM state (ST_NULL). Likewise, the .onleave callback is not being called when free()ing an FSM instance. Change-Id: I22edcf91375a09854f0dab1e2e02e034629310f7
2023-12-18tests: Test gsmtap logging if write queue fills upDaniel Willmann4-0/+276
Change-Id: Id5ae0c4c3820a9ed59eaf4003d2c57b6bdfe3468
2023-12-12tests/iuup: fix assert()s in test_decode_passive_init_2_rfci_no_iptis()Vadim Yanitskiy1-2/+6
We should not be doing the actual logic inside the assert statements. Change-Id: I3bbf4e602c25c5aaced609e9834d6b053688194d Fixes: CID#274664, CID#274679
2023-12-12tests/gsm0808: fix assert()s in test_gsm0808_dec_cell_id_list_srvcc()Vadim Yanitskiy1-2/+2
Change-Id: I6aa901fd706c74fe86b65a474c1d82803f28eeb4 Fixes: CID#274663
2023-12-12tests/lapd: fix wrong size passed in test_lapdm_contention_resolution()Vadim Yanitskiy1-1/+1
We should be passing size of the cm[] array, not size of a pointer! Change-Id: I0a878570e3a3d4e57ff44a7bc460ddb0a1b08558 Fixes: CID#274662
2023-12-11soft_uart: demonstrate a problem with inefficient pollingVadim Yanitskiy2-0/+39
As outlined in the test case, we pull a total of 50 bits from the transmitter in two rounds, pulling 25 bits at a time. In the default 8-N-1 configuration, 50 bits should ideally comprise 5 characters. However, as observed, only a total of 4 characters are retrieved from the application, leaving the remaining 10 bits (5 + 5) unused. Change-Id: Ic2539681a4adf6c1822e0bc256e4c829813d0e21
2023-12-11soft_uart: demonstrate a problem with manual flush()ingVadim Yanitskiy2-0/+24
This problem can only happen if the user is flush()ing the Rx buffer manually by calling osmo_soft_uart_flush_rx(). Let's demonstrate it in the unit test, so that we don't forget about it (add FIXME). Change-Id: Iad932a505d6fd98360f90510651501f8708ff5d2
2023-12-11soft_uart: fix the Rx flushing logic, add a unit testVadim Yanitskiy2-2/+27
Coverity tells us that with the current logic it's possible (in theory) that we may dereference NULL pointer in osmo_soft_uart_flush_rx(). This is highly unlikely, because the Rx buffer gets allocated once when the Rx is enabled and remains even after the Rx gets disabled. The Rx flags cannot be anything than 0x00 before the Rx gets enabled. Even though this NULL pointer dereference is unlikely, the Rx flushing logic is still not entirely correct. As can be seen from the unit test output, the Rx callback of the application may be called with an empty msgb if the following conditions are both met: a) the osmo_soft_uart_flush_rx() is invoked manually, and b) a parity and/or a framing error has occurred previously. We should not be checking suart->rx.flags in osmo_soft_uart_flush_rx(), since this is already done in suart_rx_ch(), which is calling it. Removing this check also eliminates a theoretical possibility of the NULL pointer dereference, so we're killing two birds with one stone. - Do not check suart->rx.flags in osmo_soft_uart_flush_rx(). - Add a unit test for various flush()ing scenarios. Change-Id: I5179f5fd2361e4e96ac9bf48e80b99e53a7e4712 Fixes: CID#336545
2023-12-10tests/soft_uart: cosmetic: improve readability of the test outputVadim Yanitskiy2-61/+93
Change-Id: Icf5410f0b292d41532e0cbd17e6ca0509c76cbd5
2023-12-10tests/soft_uart: assert that osmo_soft_uart_rx_ubits() returns 0Vadim Yanitskiy1-1/+3
According to Coverity, we check return value of this function in all other cases except this one (9 out of 10 times), so let's add the missing assert(), just to be sure. Change-Id: I675f4089cc990be5fcda792276b6808742f6f0d7 Fixes: CID#336557
2023-12-09core: fix wrong logic in _osmo_it_q_dequeue()Vadim Yanitskiy2-4/+2
If the given queue is empty, queue->list.next points to &queue->list. Current implementation would call llist_del() on the queue's llist_head, decrement queue->current_length (which will be 0), and return a pointer to &queue->list to the caller. This is completely wrong. - Use the existing item_dequeue(), which does exactly what we need. - Do not decrement the current_length if nothing was dequeued. - Uncomment code in the unit test, we should not crash anymore. Change-Id: I63094df73b166b549616c869ad908e9f4f7d46d1 Fixes: CID#336557
2023-12-09tests/it_q: add tc_enqueue/dequeue testcaseVadim Yanitskiy2-0/+48
This patch is adding a simple testcase, which does the following: * enqueue up to the limit (12 items), * dequeue up to the limit (12 items). Everything works as expected, unless you attempt to dequeue from an empty queue: the test binary segfaults. The problem is explained and fixed in a subsequent patch. Change-Id: Ie0edbf00e656fbe231952bdbccfd37d143e8b2b1 Related: CID#336557
2023-12-08tests/coding: fix -Wmaybe-uninitialized in test_pdtch()Vadim Yanitskiy1-2/+2
I am seeing this when building with gcc v13.2.1: tests/coding/coding_test.c: In function ‘test_pdtch’: tests/coding/coding_test.c:444:23: warning: ‘*result[<unknown>]’ may be used uninitialized 444 | result[len - 1] &= 0x7f; | ~~~~~~^~~~~~~~~ tests/coding/coding_test.c:448:23: warning: ‘*result[39]’ may be used uninitialized 448 | result[len - 1] &= 0x07; | ~~~~~~^~~~~~~~~ The idea here is to pre-clear some bits in the resulting buffer, because they're not going to be set during decoding of the burst bits. The problem is that result[] holds uninitialized data, so we're basically taking a 'garbage' octet and clear some of its bits. The remaining 'garbage' bits of that octet are overwritten by the decoder, so in the end we still get deterministic results. Let's make GCC happy by clearing all bits in the last octet. Change-Id: I24d79de8b3a5f4184b71414504657e5857498e0e
2023-12-07util: add osmo_strbuf macros to manipulate the strbuf tailNeels Hofmeyr2-0/+100
Upcoming patch adopts osmo_strbuf in logging.c, which sometimes needs to steal and re-add trailing newline characters, and also needs to let ctime_r() write to the buffer before updating the osmo_strbuf state. Related: OS#6284 Related: Ib577a5e0d7450ce93ff21f37ba3262704cbf4752 Change-Id: I997707c328eab3ffa00a78fdb9a0a2cbe18404b4
2023-12-05tests/socket: Avoid keeping unneeded sockets open during next test casesPau Espin Pedrol1-0/+3
Change-Id: I59cde0843545428e2bc490cc9470b76cbd7f8393
2023-12-04soft_uart: implement modem status lines and flow controlVadim Yanitskiy2-0/+253
Change-Id: I26b93ce76f2f6b6fbf017f2684312007db3c6d48 Related: OS#4396
2023-12-04soft_uart: osmo_soft_uart_tx_ubits(): return number of bits pulledVadim Yanitskiy1-2/+2
This is a partial revert of 0887188c6b133b69142965d65e1be8a0696a6272. We actually want to return number of bits pulled, because in the upcoming commit implementing the flow control we want to be able to signal to the caller that the buffer was not completely filled, but only partly. Change-Id: I47a56f0fc36f2bc8f5a797d7fec64dfb56842388 Related: OS#4396
2023-12-03soft_uart: check Rx/Tx state once in osmo_soft_uart_{rx,tx}_ubits()Vadim Yanitskiy1-0/+9
Check it once rather than doing this in a loop. Return -EAGAIN if Rx or Tx is not enabled when calling osmo_soft_uart_{rx,tx}_ubits(). This [theoretically] improves performance by reducing the number of conditional statements in loops. In the Tx path, this also prevents calling the .tx_cb() when the transmitter is disabled, so that we don't loose the application data. Change-Id: I70f93b3655eb21c2323e451052c40cd305c016c8 Related: OS#4396
2023-11-29Add a GSM RLP decoder and encoderHarald Welte4-1/+267
This code implements a decoder and encoder for the RLP (Radio Link Protocol) as used in the bearer channel of GSM CSD (Circuit Switched Data). Change-Id: I2d9bd8eb4f0cd0f72c436996767b199429596917